mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-04 00:46:08 +00:00
commit
1a810d5d62
31
build.gradle
31
build.gradle
@ -1,3 +1,5 @@
|
|||||||
|
import xyz.jpenilla.runpaper.task.RunServer
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
* Iris is a World Generator for Minecraft Bukkit Servers
|
||||||
* Copyright (c) 2021 Arcane Arts (Volmit Software)
|
* Copyright (c) 2021 Arcane Arts (Volmit Software)
|
||||||
@ -30,6 +32,7 @@ plugins {
|
|||||||
id 'java-library'
|
id 'java-library'
|
||||||
id "io.github.goooler.shadow" version "8.1.7"
|
id "io.github.goooler.shadow" version "8.1.7"
|
||||||
id "de.undercouch.download" version "5.0.1"
|
id "de.undercouch.download" version "5.0.1"
|
||||||
|
id "xyz.jpenilla.run-paper" version "2.3.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -53,6 +56,11 @@ registerCustomOutputTaskUnix('PixelMac', '/Users/test/Desktop/mcserver/plugins')
|
|||||||
registerCustomOutputTaskUnix('CrazyDev22LT', '/home/julian/Desktop/server/plugins')
|
registerCustomOutputTaskUnix('CrazyDev22LT', '/home/julian/Desktop/server/plugins')
|
||||||
// ==============================================================
|
// ==============================================================
|
||||||
|
|
||||||
|
def MIN_HEAP_SIZE = "2G"
|
||||||
|
def MAX_HEAP_SIZE = "8G"
|
||||||
|
//Valid values are: none, truecolor, indexed256, indexed16, indexed8
|
||||||
|
def COLOR = "truecolor"
|
||||||
|
|
||||||
def NMS_BINDINGS = Map.of(
|
def NMS_BINDINGS = Map.of(
|
||||||
"v1_21_R3", "1.21.4-R0.1-SNAPSHOT",
|
"v1_21_R3", "1.21.4-R0.1-SNAPSHOT",
|
||||||
"v1_21_R2", "1.21.3-R0.1-SNAPSHOT",
|
"v1_21_R2", "1.21.3-R0.1-SNAPSHOT",
|
||||||
@ -62,21 +70,34 @@ def NMS_BINDINGS = Map.of(
|
|||||||
"v1_20_R2", "1.20.2-R0.1-SNAPSHOT",
|
"v1_20_R2", "1.20.2-R0.1-SNAPSHOT",
|
||||||
"v1_20_R1", "1.20.1-R0.1-SNAPSHOT",
|
"v1_20_R1", "1.20.1-R0.1-SNAPSHOT",
|
||||||
)
|
)
|
||||||
def JVM_VERSION = Map.of()
|
def JVM_VERSION = Map.<String, Integer>of()
|
||||||
NMS_BINDINGS.each { nms ->
|
NMS_BINDINGS.forEach { key, value ->
|
||||||
project(":nms:${nms.key}") {
|
project(":nms:$key") {
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
apply plugin: 'com.volmit.nmstools'
|
apply plugin: 'com.volmit.nmstools'
|
||||||
|
|
||||||
nmsTools {
|
nmsTools {
|
||||||
it.jvm = JVM_VERSION.getOrDefault(nms.key, 21)
|
it.jvm = JVM_VERSION.getOrDefault(key, 21)
|
||||||
it.version = nms.value
|
it.version = value
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.register("runServer-$key", RunServer) {
|
||||||
|
group("servers")
|
||||||
|
minecraftVersion(value.split("-")[0])
|
||||||
|
minHeapSize(MIN_HEAP_SIZE)
|
||||||
|
maxHeapSize(MAX_HEAP_SIZE)
|
||||||
|
pluginJars(tasks.shadowJar.archiveFile)
|
||||||
|
javaLauncher = javaToolchains.launcherFor { it.languageVersion = JavaLanguageVersion.of(JVM_VERSION.getOrDefault(key, 21))}
|
||||||
|
runDirectory.convention(layout.buildDirectory.dir("run/$key"))
|
||||||
|
systemProperty("disable.watchdog", "")
|
||||||
|
systemProperty("net.kyori.ansi.colorLevel", COLOR)
|
||||||
|
systemProperty("com.mojang.eula.agree", true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
|
@ -140,7 +140,7 @@ public class CommandDeveloper implements DecreeExecutor {
|
|||||||
public void packBenchmark(
|
public void packBenchmark(
|
||||||
@Param(description = "The pack to bench", aliases = {"pack"}, defaultValue = "overworld")
|
@Param(description = "The pack to bench", aliases = {"pack"}, defaultValue = "overworld")
|
||||||
IrisDimension dimension,
|
IrisDimension dimension,
|
||||||
@Param(description = "Radius in regions", defaultValue = "5")
|
@Param(description = "Radius in regions", defaultValue = "2048")
|
||||||
int radius,
|
int radius,
|
||||||
@Param(description = "Open GUI while benchmarking", defaultValue = "false")
|
@Param(description = "Open GUI while benchmarking", defaultValue = "false")
|
||||||
boolean gui
|
boolean gui
|
||||||
|
@ -19,9 +19,7 @@
|
|||||||
package com.volmit.iris.core.commands;
|
package com.volmit.iris.core.commands;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisSettings;
|
|
||||||
import com.volmit.iris.core.gui.PregeneratorJob;
|
import com.volmit.iris.core.gui.PregeneratorJob;
|
||||||
import com.volmit.iris.core.pregenerator.LazyPregenerator;
|
|
||||||
import com.volmit.iris.core.pregenerator.PregenTask;
|
import com.volmit.iris.core.pregenerator.PregenTask;
|
||||||
import com.volmit.iris.core.tools.IrisToolbelt;
|
import com.volmit.iris.core.tools.IrisToolbelt;
|
||||||
import com.volmit.iris.util.decree.DecreeExecutor;
|
import com.volmit.iris.util.decree.DecreeExecutor;
|
||||||
@ -29,12 +27,9 @@ import com.volmit.iris.util.decree.annotations.Decree;
|
|||||||
import com.volmit.iris.util.decree.annotations.Param;
|
import com.volmit.iris.util.decree.annotations.Param;
|
||||||
import com.volmit.iris.util.format.C;
|
import com.volmit.iris.util.format.C;
|
||||||
import com.volmit.iris.util.math.Position2;
|
import com.volmit.iris.util.math.Position2;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
@Decree(name = "pregen", aliases = "pregenerate", description = "Pregenerate your Iris worlds!")
|
@Decree(name = "pregen", aliases = "pregenerate", description = "Pregenerate your Iris worlds!")
|
||||||
public class CommandPregen implements DecreeExecutor {
|
public class CommandPregen implements DecreeExecutor {
|
||||||
@Decree(description = "Pregenerate a world")
|
@Decree(description = "Pregenerate a world")
|
||||||
@ -52,13 +47,12 @@ public class CommandPregen implements DecreeExecutor {
|
|||||||
sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example.");
|
sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example.");
|
||||||
}
|
}
|
||||||
radius = Math.max(radius, 1024);
|
radius = Math.max(radius, 1024);
|
||||||
int w = (radius >> 9 + 1) * 2;
|
|
||||||
IrisToolbelt.pregenerate(PregenTask
|
IrisToolbelt.pregenerate(PregenTask
|
||||||
.builder()
|
.builder()
|
||||||
.center(new Position2(center.getBlockX() >> 9, center.getBlockZ() >> 9))
|
.center(new Position2(center.getBlockX(), center.getBlockZ()))
|
||||||
.gui(true)
|
.gui(true)
|
||||||
.width(w)
|
.radiusX(radius)
|
||||||
.height(w)
|
.radiusZ(radius)
|
||||||
.build(), world);
|
.build(), world);
|
||||||
String msg = C.GREEN + "Pregen started in " + C.GOLD + world.getName() + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ();
|
String msg = C.GREEN + "Pregen started in " + C.GOLD + world.getName() + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ();
|
||||||
sender().sendMessage(msg);
|
sender().sendMessage(msg);
|
||||||
|
@ -24,7 +24,6 @@ import com.volmit.iris.core.pregenerator.IrisPregenerator;
|
|||||||
import com.volmit.iris.core.pregenerator.PregenListener;
|
import com.volmit.iris.core.pregenerator.PregenListener;
|
||||||
import com.volmit.iris.core.pregenerator.PregenTask;
|
import com.volmit.iris.core.pregenerator.PregenTask;
|
||||||
import com.volmit.iris.core.pregenerator.PregeneratorMethod;
|
import com.volmit.iris.core.pregenerator.PregeneratorMethod;
|
||||||
import com.volmit.iris.core.tools.IrisPackBenchmarking;
|
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.format.Form;
|
import com.volmit.iris.util.format.Form;
|
||||||
@ -45,8 +44,6 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmarkInProgress;
|
|
||||||
|
|
||||||
public class PregeneratorJob implements PregenListener {
|
public class PregeneratorJob implements PregenListener {
|
||||||
private static final Color COLOR_EXISTS = parseColor("#4d7d5b");
|
private static final Color COLOR_EXISTS = parseColor("#4d7d5b");
|
||||||
private static final Color COLOR_BLACK = parseColor("#4d7d5b");
|
private static final Color COLOR_BLACK = parseColor("#4d7d5b");
|
||||||
@ -81,12 +78,12 @@ public class PregeneratorJob implements PregenListener {
|
|||||||
this.task = task;
|
this.task = task;
|
||||||
this.pregenerator = new IrisPregenerator(task, method, this);
|
this.pregenerator = new IrisPregenerator(task, method, this);
|
||||||
max = new Position2(0, 0);
|
max = new Position2(0, 0);
|
||||||
min = new Position2(0, 0);
|
min = new Position2(Integer.MAX_VALUE, Integer.MAX_VALUE);
|
||||||
task.iterateRegions((xx, zz) -> {
|
task.iterateAllChunks((xx, zz) -> {
|
||||||
min.setX(Math.min(xx << 5, min.getX()));
|
min.setX(Math.min(xx, min.getX()));
|
||||||
min.setZ(Math.min(zz << 5, min.getZ()));
|
min.setZ(Math.min(zz, min.getZ()));
|
||||||
max.setX(Math.max((xx << 5) + 31, max.getX()));
|
max.setX(Math.max(xx, max.getX()));
|
||||||
max.setZ(Math.max((zz << 5) + 31, max.getZ()));
|
max.setZ(Math.max(zz, max.getZ()));
|
||||||
});
|
});
|
||||||
|
|
||||||
if (IrisSettings.get().getGui().isUseServerLaunchedGuis() && task.isGui()) {
|
if (IrisSettings.get().getGui().isUseServerLaunchedGuis() && task.isGui()) {
|
||||||
@ -162,7 +159,7 @@ public class PregeneratorJob implements PregenListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void drawRegion(int x, int z, Color color) {
|
public void drawRegion(int x, int z, Color color) {
|
||||||
J.a(() -> PregenTask.iterateRegion(x, z, (xx, zz) -> {
|
J.a(() -> task.iterateChunks(x, z, (xx, zz) -> {
|
||||||
draw(xx, zz, color);
|
draw(xx, zz, color);
|
||||||
J.sleep(3);
|
J.sleep(3);
|
||||||
}));
|
}));
|
||||||
|
@ -20,7 +20,6 @@ package com.volmit.iris.core.nms;
|
|||||||
|
|
||||||
import com.volmit.iris.core.nms.container.AutoClosing;
|
import com.volmit.iris.core.nms.container.AutoClosing;
|
||||||
import com.volmit.iris.core.nms.container.BiomeColor;
|
import com.volmit.iris.core.nms.container.BiomeColor;
|
||||||
import com.volmit.iris.core.nms.container.Pair;
|
|
||||||
import com.volmit.iris.core.nms.datapack.DataVersion;
|
import com.volmit.iris.core.nms.datapack.DataVersion;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
@ -94,6 +93,7 @@ public interface INMSBinding {
|
|||||||
throw new IllegalStateException("Missing dimenstion types to create world");
|
throw new IllegalStateException("Missing dimenstion types to create world");
|
||||||
|
|
||||||
try (var ignored = injectLevelStems()) {
|
try (var ignored = injectLevelStems()) {
|
||||||
|
ignored.storeContext();
|
||||||
return c.createWorld();
|
return c.createWorld();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,7 +132,11 @@ public interface INMSBinding {
|
|||||||
|
|
||||||
AutoClosing injectLevelStems();
|
AutoClosing injectLevelStems();
|
||||||
|
|
||||||
Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end);
|
default AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end);
|
boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end);
|
||||||
|
|
||||||
|
void removeCustomDimensions(World world);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.volmit.iris.core.nms.container;
|
package com.volmit.iris.core.nms.container;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.function.NastyRunnable;
|
import com.volmit.iris.util.function.NastyRunnable;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
@ -7,6 +8,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class AutoClosing implements AutoCloseable {
|
public class AutoClosing implements AutoCloseable {
|
||||||
|
private static final KMap<Thread, AutoClosing> CONTEXTS = new KMap<>();
|
||||||
private final AtomicBoolean closed = new AtomicBoolean();
|
private final AtomicBoolean closed = new AtomicBoolean();
|
||||||
private final NastyRunnable action;
|
private final NastyRunnable action;
|
||||||
|
|
||||||
@ -14,9 +16,24 @@ public class AutoClosing implements AutoCloseable {
|
|||||||
public void close() {
|
public void close() {
|
||||||
if (closed.getAndSet(true)) return;
|
if (closed.getAndSet(true)) return;
|
||||||
try {
|
try {
|
||||||
|
removeContext();
|
||||||
action.run();
|
action.run();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void storeContext() {
|
||||||
|
CONTEXTS.put(Thread.currentThread(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeContext() {
|
||||||
|
CONTEXTS.values().removeIf(c -> c == this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void closeContext() {
|
||||||
|
AutoClosing closing = CONTEXTS.remove(Thread.currentThread());
|
||||||
|
if (closing == null) return;
|
||||||
|
closing.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,8 +126,8 @@ public class NMSBinding1X implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
return new Pair<>(0, new AutoClosing(() -> {}));
|
return injectLevelStems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -135,6 +135,11 @@ public class NMSBinding1X implements INMSBinding {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeCustomDimensions(World world) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompoundTag serializeEntity(Entity location) {
|
public CompoundTag serializeEntity(Entity location) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -165,8 +165,11 @@ public class ChunkUpdater {
|
|||||||
if (rX < dimensions.min.getX() || rX > dimensions.max.getX() || rZ < dimensions.min.getZ() || rZ > dimensions.max.getZ()) {
|
if (rX < dimensions.min.getX() || rX > dimensions.max.getX() || rZ < dimensions.min.getZ() || rZ > dimensions.max.getZ()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!new File(world.getWorldFolder(), "region" + File.separator + rX + "." + rZ + ".mca").exists()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PregenTask.iterateRegion(rX, rZ, (x, z) -> {
|
task.iterateChunks(rX, rZ, (x, z) -> {
|
||||||
while (paused.get() && !cancelled.get()) {
|
while (paused.get() && !cancelled.get()) {
|
||||||
J.sleep(50);
|
J.sleep(50);
|
||||||
}
|
}
|
||||||
@ -348,8 +351,8 @@ public class ChunkUpdater {
|
|||||||
int width = maxZ - minZ + 1;
|
int width = maxZ - minZ + 1;
|
||||||
|
|
||||||
return new Dimensions(new Position2(minX, minZ), new Position2(maxX, maxZ), height * width, PregenTask.builder()
|
return new Dimensions(new Position2(minX, minZ), new Position2(maxX, maxZ), height * width, PregenTask.builder()
|
||||||
.width((int) Math.ceil(width / 2d))
|
.radiusZ((int) Math.ceil(width / 2d * 512))
|
||||||
.height((int) Math.ceil(height / 2d))
|
.radiusX((int) Math.ceil(height / 2d * 512))
|
||||||
.center(new Position2(oX, oZ))
|
.center(new Position2(oX, oZ))
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
package com.volmit.iris.core.pregenerator;
|
package com.volmit.iris.core.pregenerator;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.pack.IrisPack;
|
|
||||||
import com.volmit.iris.core.tools.IrisPackBenchmarking;
|
import com.volmit.iris.core.tools.IrisPackBenchmarking;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KSet;
|
import com.volmit.iris.util.collection.KSet;
|
||||||
@ -83,7 +82,7 @@ public class IrisPregenerator {
|
|||||||
generatedLast = new AtomicInteger(0);
|
generatedLast = new AtomicInteger(0);
|
||||||
generatedLastMinute = new AtomicInteger(0);
|
generatedLastMinute = new AtomicInteger(0);
|
||||||
totalChunks = new AtomicInteger(0);
|
totalChunks = new AtomicInteger(0);
|
||||||
task.iterateRegions((_a, _b) -> totalChunks.addAndGet(1024));
|
task.iterateAllChunks((_a, _b) -> totalChunks.incrementAndGet());
|
||||||
startTime = new AtomicLong(M.ms());
|
startTime = new AtomicLong(M.ms());
|
||||||
ticker = new Looper() {
|
ticker = new Looper() {
|
||||||
@Override
|
@Override
|
||||||
@ -194,7 +193,7 @@ public class IrisPregenerator {
|
|||||||
} else if (!regions) {
|
} else if (!regions) {
|
||||||
hit = true;
|
hit = true;
|
||||||
listener.onRegionGenerating(x, z);
|
listener.onRegionGenerating(x, z);
|
||||||
PregenTask.iterateRegion(x, z, (xx, zz) -> {
|
task.iterateChunks(x, z, (xx, zz) -> {
|
||||||
while (paused.get() && !shutdown.get()) {
|
while (paused.get() && !shutdown.get()) {
|
||||||
J.sleep(50);
|
J.sleep(50);
|
||||||
}
|
}
|
||||||
|
@ -32,17 +32,26 @@ import java.util.Comparator;
|
|||||||
@Data
|
@Data
|
||||||
public class PregenTask {
|
public class PregenTask {
|
||||||
private static final Position2 ZERO = new Position2(0, 0);
|
private static final Position2 ZERO = new Position2(0, 0);
|
||||||
private static final KList<Position2> ORDER_CENTER = computeChunkOrder();
|
|
||||||
private static final KMap<Position2, KList<Position2>> ORDERS = new KMap<>();
|
private static final KMap<Position2, KList<Position2>> ORDERS = new KMap<>();
|
||||||
|
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private boolean gui = false;
|
private final boolean gui = false;
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private Position2 center = new Position2(0, 0);
|
private final Position2 center = new Position2(0, 0);
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private int width = 1;
|
private final int radiusX = 1;
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private int height = 1;
|
private final int radiusZ = 1;
|
||||||
|
|
||||||
|
private final Bounds bounds = new Bounds();
|
||||||
|
|
||||||
|
protected PregenTask(boolean gui, Position2 center, int radiusX, int radiusZ) {
|
||||||
|
this.gui = gui;
|
||||||
|
this.center = new ProxiedPos(center);
|
||||||
|
this.radiusX = radiusX;
|
||||||
|
this.radiusZ = radiusZ;
|
||||||
|
bounds.update();
|
||||||
|
}
|
||||||
|
|
||||||
public static void iterateRegion(int xr, int zr, Spiraled s, Position2 pull) {
|
public static void iterateRegion(int xr, int zr, Spiraled s, Position2 pull) {
|
||||||
for (Position2 i : ORDERS.computeIfAbsent(pull, PregenTask::computeOrder)) {
|
for (Position2 i : ORDERS.computeIfAbsent(pull, PregenTask::computeOrder)) {
|
||||||
@ -70,29 +79,72 @@ public class PregenTask {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static KList<Position2> computeChunkOrder() {
|
public void iterateRegions(Spiraled s) {
|
||||||
Position2 center = new Position2(15, 15);
|
var bound = bounds.region();
|
||||||
KList<Position2> p = new KList<>();
|
new Spiraler(bound.sizeX, bound.sizeZ, ((x, z) -> {
|
||||||
new Spiraler(33, 33, (x, z) -> {
|
if (bound.check(x, z)) s.on(x, z);
|
||||||
int xx = x + 15;
|
})).setOffset(center.getX() >> 9, center.getZ() >> 9).drain();
|
||||||
int zz = z + 15;
|
|
||||||
if (xx < 0 || xx > 31 || zz < 0 || zz > 31) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p.add(new Position2(xx, zz));
|
|
||||||
}).drain();
|
|
||||||
p.sort(Comparator.comparing((i) -> i.distance(center)));
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void iterateRegions(Spiraled s) {
|
public void iterateChunks(int rX, int rZ, Spiraled s) {
|
||||||
new Spiraler(getWidth() * 2, getHeight() * 2, s)
|
var bound = bounds.chunk();
|
||||||
.setOffset(center.getX(), center.getZ()).drain();
|
iterateRegion(rX, rZ, ((x, z) -> {
|
||||||
|
if (bound.check(x, z)) s.on(x, z);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void iterateAllChunks(Spiraled s) {
|
public void iterateAllChunks(Spiraled s) {
|
||||||
new Spiraler(getWidth() * 2, getHeight() * 2, (x, z) -> iterateRegion(x, z, s))
|
iterateRegions(((rX, rZ) -> iterateChunks(rX, rZ, s)));
|
||||||
.setOffset(center.getX(), center.getZ()).drain();
|
}
|
||||||
|
|
||||||
|
private class Bounds {
|
||||||
|
private Bound chunk = null;
|
||||||
|
private Bound region = null;
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
int maxX = center.getX() + radiusX;
|
||||||
|
int maxZ = center.getZ() + radiusZ;
|
||||||
|
int minX = center.getX() - radiusX;
|
||||||
|
int minZ = center.getZ() - radiusZ;
|
||||||
|
|
||||||
|
chunk = new Bound(minX >> 4, minZ >> 4, Math.ceilDiv(maxX, 16), Math.ceilDiv(maxZ, 16));
|
||||||
|
region = new Bound(minX >> 9, minZ >> 9, Math.ceilDiv(maxX, 512), Math.ceilDiv(maxZ, 512));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bound chunk() {
|
||||||
|
if (chunk == null) update();
|
||||||
|
return chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bound region() {
|
||||||
|
if (region == null) update();
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private record Bound(int minX, int maxX, int minZ, int maxZ, int sizeX, int sizeZ) {
|
||||||
|
private Bound(int minX, int minZ, int maxX, int maxZ) {
|
||||||
|
this(minX, maxX, minZ, maxZ, maxZ - minZ + 1, maxZ - minZ + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean check(int x, int z) {
|
||||||
|
return x >= minX && x <= maxX && z >= minZ && z <= maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ProxiedPos extends Position2 {
|
||||||
|
public ProxiedPos(Position2 p) {
|
||||||
|
super(p.getX(), p.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setX(int x) {
|
||||||
|
throw new IllegalStateException("This Position2 may not be modified");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setZ(int z) {
|
||||||
|
throw new IllegalStateException("This Position2 may not be modified");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,8 +146,8 @@ public class IrisPackBenchmarking {
|
|||||||
IrisToolbelt.pregenerate(PregenTask
|
IrisToolbelt.pregenerate(PregenTask
|
||||||
.builder()
|
.builder()
|
||||||
.gui(gui)
|
.gui(gui)
|
||||||
.width(radius)
|
.radiusX(radius)
|
||||||
.height(radius)
|
.radiusZ(radius)
|
||||||
.build(), Bukkit.getWorld("benchmark")
|
.build(), Bukkit.getWorld("benchmark")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,15 @@ package com.volmit.iris.engine.object;
|
|||||||
|
|
||||||
import com.volmit.iris.core.nms.INMS;
|
import com.volmit.iris.core.nms.INMS;
|
||||||
import com.volmit.iris.core.nms.container.AutoClosing;
|
import com.volmit.iris.core.nms.container.AutoClosing;
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.misc.ServerProperties;
|
import com.volmit.iris.util.misc.ServerProperties;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.world.WorldInitEvent;
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
|
|
||||||
@ -19,14 +22,9 @@ public class IrisContextInjector implements Listener {
|
|||||||
@Getter
|
@Getter
|
||||||
private static boolean missingDimensionTypes = false;
|
private static boolean missingDimensionTypes = false;
|
||||||
private AutoClosing autoClosing = null;
|
private AutoClosing autoClosing = null;
|
||||||
private final int totalWorlds;
|
|
||||||
private int worldCounter = 0;
|
|
||||||
|
|
||||||
public IrisContextInjector() {
|
public IrisContextInjector() {
|
||||||
if (!Bukkit.getWorlds().isEmpty()) {
|
if (!Bukkit.getWorlds().isEmpty()) return;
|
||||||
totalWorlds = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String levelName = ServerProperties.LEVEL_NAME;
|
String levelName = ServerProperties.LEVEL_NAME;
|
||||||
List<String> irisWorlds = irisWorlds();
|
List<String> irisWorlds = irisWorlds();
|
||||||
@ -34,29 +32,20 @@ public class IrisContextInjector implements Listener {
|
|||||||
boolean nether = irisWorlds.contains(levelName + "_nether");
|
boolean nether = irisWorlds.contains(levelName + "_nether");
|
||||||
boolean end = irisWorlds.contains(levelName + "_end");
|
boolean end = irisWorlds.contains(levelName + "_end");
|
||||||
|
|
||||||
int i = 1;
|
|
||||||
if (Bukkit.getAllowNether()) i++;
|
|
||||||
if (Bukkit.getAllowEnd()) i++;
|
|
||||||
|
|
||||||
if (INMS.get().missingDimensionTypes(overworld, nether, end)) {
|
if (INMS.get().missingDimensionTypes(overworld, nether, end)) {
|
||||||
missingDimensionTypes = true;
|
missingDimensionTypes = true;
|
||||||
totalWorlds = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overworld || nether || end) {
|
if (overworld || nether || end) {
|
||||||
var pair = INMS.get().injectUncached(overworld, nether, end);
|
autoClosing = INMS.get().injectUncached(overworld, nether, end);
|
||||||
i += pair.getA() - 3;
|
|
||||||
autoClosing = pair.getB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
totalWorlds = i;
|
|
||||||
instance.registerListener(this);
|
instance.registerListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void on(WorldInitEvent event) {
|
public void on(WorldInitEvent event) {
|
||||||
if (++worldCounter < totalWorlds) return;
|
|
||||||
if (autoClosing != null) {
|
if (autoClosing != null) {
|
||||||
autoClosing.close();
|
autoClosing.close();
|
||||||
autoClosing = null;
|
autoClosing = null;
|
||||||
|
@ -21,6 +21,7 @@ package com.volmit.iris.engine.platform;
|
|||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.core.nms.INMS;
|
import com.volmit.iris.core.nms.INMS;
|
||||||
|
import com.volmit.iris.core.nms.container.AutoClosing;
|
||||||
import com.volmit.iris.core.service.StudioSVC;
|
import com.volmit.iris.core.service.StudioSVC;
|
||||||
import com.volmit.iris.engine.IrisEngine;
|
import com.volmit.iris.engine.IrisEngine;
|
||||||
import com.volmit.iris.engine.data.chunk.TerrainChunk;
|
import com.volmit.iris.engine.data.chunk.TerrainChunk;
|
||||||
@ -48,6 +49,7 @@ import org.bukkit.block.data.BlockData;
|
|||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.world.WorldInitEvent;
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
import org.bukkit.generator.BiomeProvider;
|
import org.bukkit.generator.BiomeProvider;
|
||||||
@ -122,11 +124,13 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void onWorldInit(WorldInitEvent event) {
|
public void onWorldInit(WorldInitEvent event) {
|
||||||
try {
|
try {
|
||||||
if (initialized || !world.name().equals(event.getWorld().getName()))
|
if (initialized || !world.name().equals(event.getWorld().getName()))
|
||||||
return;
|
return;
|
||||||
|
AutoClosing.closeContext();
|
||||||
|
INMS.get().removeCustomDimensions(event.getWorld());
|
||||||
world.setRawWorldSeed(event.getWorld().getSeed());
|
world.setRawWorldSeed(event.getWorld().getSeed());
|
||||||
Engine engine = getEngine(event.getWorld());
|
Engine engine = getEngine(event.getWorld());
|
||||||
if (engine == null) {
|
if (engine == null) {
|
||||||
|
@ -26,6 +26,8 @@ import com.volmit.iris.util.math.RNG;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.stream.Collector;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("ALL")
|
||||||
public class KList<T> extends ArrayList<T> implements List<T> {
|
public class KList<T> extends ArrayList<T> implements List<T> {
|
||||||
@ -65,6 +67,10 @@ public class KList<T> extends ArrayList<T> implements List<T> {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> Collector<T, ?, KList<T>> collector() {
|
||||||
|
return Collectors.toCollection(KList::new);
|
||||||
|
}
|
||||||
|
|
||||||
public static KList<String> asStringList(List<?> oo) {
|
public static KList<String> asStringList(List<?> oo) {
|
||||||
KList<String> s = new KList<String>();
|
KList<String> s = new KList<String>();
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public class Spiraler {
|
|||||||
|
|
||||||
public void next() {
|
public void next() {
|
||||||
if ((-sizeX / 2 <= x) && (x <= sizeX / 2) && (-sizeZ / 2 <= z) && (z <= sizeZ / 2)) {
|
if ((-sizeX / 2 <= x) && (x <= sizeX / 2) && (-sizeZ / 2 <= z) && (z <= sizeZ / 2)) {
|
||||||
spiraled.on(x + ox, z + ox);
|
spiraled.on(x + ox, z + oz);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((x == z) || ((x < 0) && (x == -z)) || ((x > 0) && (x == 1 - z))) {
|
if ((x == z) || ((x < 0) && (x == -z)) || ((x > 0) && (x == 1 - z))) {
|
||||||
|
@ -645,37 +645,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public com.volmit.iris.core.nms.container.Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.registryOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new com.volmit.iris.core.nms.container.Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -687,31 +694,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().K.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -735,7 +720,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
@ -646,37 +646,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public com.volmit.iris.core.nms.container.Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.registryOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new com.volmit.iris.core.nms.container.Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -688,31 +695,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().K.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -736,7 +721,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
@ -647,37 +647,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public com.volmit.iris.core.nms.container.Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.registryOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new com.volmit.iris.core.nms.container.Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -689,31 +696,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().K.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -737,7 +722,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
@ -672,37 +672,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public com.volmit.iris.core.nms.container.Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.registryOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new com.volmit.iris.core.nms.container.Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -714,31 +721,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().K.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -762,7 +747,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
@ -676,37 +676,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public com.volmit.iris.core.nms.container.Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.registryOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new com.volmit.iris.core.nms.container.Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -718,31 +725,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().K.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -766,7 +751,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
@ -666,37 +666,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.lookupOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().lookupOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -708,31 +715,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().L.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -756,7 +741,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.lookupOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.lookupOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
@ -665,37 +665,44 @@ public class NMSBinding implements INMSBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
public AutoClosing injectLevelStems() {
|
public AutoClosing injectLevelStems() {
|
||||||
return inject(this::supplier);
|
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
||||||
|
|
||||||
|
var server = ((CraftServer) Bukkit.getServer());
|
||||||
|
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
||||||
|
var nmsServer = server.getServer();
|
||||||
|
var old = nmsServer.worldLoader;
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(nmsServer, dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
||||||
|
old.resources(),
|
||||||
|
old.dataConfiguration(),
|
||||||
|
old.datapackWorldgen(),
|
||||||
|
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
||||||
|
)));
|
||||||
|
|
||||||
|
return new AutoClosing(() -> {
|
||||||
|
field.set(nmsServer, old);
|
||||||
|
dataContextLock.unlock();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public Pair<Integer, AutoClosing> injectUncached(boolean overworld, boolean nether, boolean end) {
|
public AutoClosing injectUncached(boolean overworld, boolean nether, boolean end) {
|
||||||
var reg = registry();
|
var reg = registry();
|
||||||
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
var field = getField(RegistryAccess.ImmutableRegistryAccess.class, Map.class);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
AutoClosing closing = inject(old -> new WorldLoader.DataLoadContext(
|
var access = createRegistryAccess(((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions(), true, overworld, nether, end);
|
||||||
old.resources(),
|
var injected = access.lookupOrThrow(Registries.LEVEL_STEM);
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), true, overworld, nether, end)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var injected = ((CraftServer) Bukkit.getServer()).getServer().worldLoader.datapackDimensions().lookupOrThrow(Registries.LEVEL_STEM);
|
|
||||||
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
var old = (Map<ResourceKey<? extends Registry<?>>, Registry<?>>) field.get(reg);
|
||||||
var fake = new HashMap<>(old);
|
var fake = new HashMap<>(old);
|
||||||
fake.put(Registries.LEVEL_STEM, injected);
|
fake.put(Registries.LEVEL_STEM, injected);
|
||||||
field.set(reg, fake);
|
field.set(reg, fake);
|
||||||
|
|
||||||
return new Pair<>(
|
return new AutoClosing(() -> field.set(reg, old));
|
||||||
injected.size(),
|
|
||||||
new AutoClosing(() -> {
|
|
||||||
closing.close();
|
|
||||||
field.set(reg, old);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -707,31 +714,9 @@ public class NMSBinding implements INMSBinding {
|
|||||||
return overworld || nether || end;
|
return overworld || nether || end;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) {
|
@Override
|
||||||
return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext(
|
public void removeCustomDimensions(World world) {
|
||||||
old.resources(),
|
((CraftWorld) world).getHandle().L.customDimensions = null;
|
||||||
old.dataConfiguration(),
|
|
||||||
old.datapackWorldgen(),
|
|
||||||
createRegistryAccess(old.datapackDimensions(), false, true, true, true)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private AutoClosing inject(Function<WorldLoader.DataLoadContext, WorldLoader.DataLoadContext> transformer) {
|
|
||||||
if (!dataContextLock.tryLock()) throw new IllegalStateException("Failed to inject data context!");
|
|
||||||
|
|
||||||
var server = ((CraftServer) Bukkit.getServer());
|
|
||||||
var field = getField(MinecraftServer.class, WorldLoader.DataLoadContext.class);
|
|
||||||
var nmsServer = server.getServer();
|
|
||||||
var old = nmsServer.worldLoader;
|
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(nmsServer, transformer.apply(old));
|
|
||||||
|
|
||||||
return new AutoClosing(() -> {
|
|
||||||
field.set(nmsServer, old);
|
|
||||||
dataContextLock.unlock();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
private RegistryAccess.Frozen createRegistryAccess(RegistryAccess.Frozen datapack, boolean copy, boolean overworld, boolean nether, boolean end) {
|
||||||
@ -755,7 +740,7 @@ public class NMSBinding implements INMSBinding {
|
|||||||
|
|
||||||
if (copy) copy(fake, access.lookupOrThrow(Registries.LEVEL_STEM));
|
if (copy) copy(fake, access.lookupOrThrow(Registries.LEVEL_STEM));
|
||||||
|
|
||||||
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
|
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake)).freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
private void register(MappedRegistry<LevelStem> target, Registry<DimensionType> dimensions, FlatLevelSource source, ResourceKey<LevelStem> key) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user