diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index ecf15ace6..1b881e6fe 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -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.BiomeColor; -import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; @@ -94,6 +93,7 @@ public interface INMSBinding { throw new IllegalStateException("Missing dimenstion types to create world"); try (var ignored = injectLevelStems()) { + ignored.storeContext(); return c.createWorld(); } } diff --git a/core/src/main/java/com/volmit/iris/core/nms/container/AutoClosing.java b/core/src/main/java/com/volmit/iris/core/nms/container/AutoClosing.java index afa2ba9dc..a4771ca84 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/container/AutoClosing.java +++ b/core/src/main/java/com/volmit/iris/core/nms/container/AutoClosing.java @@ -1,5 +1,6 @@ package com.volmit.iris.core.nms.container; +import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.function.NastyRunnable; import lombok.AllArgsConstructor; @@ -7,6 +8,7 @@ import java.util.concurrent.atomic.AtomicBoolean; @AllArgsConstructor public class AutoClosing implements AutoCloseable { + private static final KMap CONTEXTS = new KMap<>(); private final AtomicBoolean closed = new AtomicBoolean(); private final NastyRunnable action; @@ -14,9 +16,24 @@ public class AutoClosing implements AutoCloseable { public void close() { if (closed.getAndSet(true)) return; try { + removeContext(); action.run(); } catch (Throwable 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(); + } } diff --git a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java index 9b57072c2..90117a5a4 100644 --- a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java +++ b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java @@ -21,6 +21,7 @@ package com.volmit.iris.engine.platform; import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; 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.engine.IrisEngine; 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.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; import org.bukkit.generator.BiomeProvider; @@ -122,11 +124,12 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onWorldInit(WorldInitEvent event) { try { if (initialized || !world.name().equals(event.getWorld().getName())) return; + AutoClosing.closeContext(); INMS.get().removeCustomDimensions(event.getWorld()); world.setRawWorldSeed(event.getWorld().getSeed()); Engine engine = getEngine(event.getWorld());