From adb7188eb93bef35b3923fbc85c31b8513d2b5f1 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Mon, 2 Jun 2025 14:46:37 +0200 Subject: [PATCH] refactor mantle cleanup --- .../java/com/volmit/iris/core/IrisSettings.java | 1 + .../com/volmit/iris/engine/IrisWorldManager.java | 14 +++++++++++--- .../volmit/iris/engine/mantle/EngineMantle.java | 16 ++++++++++------ .../java/com/volmit/iris/util/mantle/Mantle.java | 9 +++------ 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java index 655967aad..89f1c1015 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -162,6 +162,7 @@ public class IrisSettings { public int objectLoaderCacheSize = 4_096; public int scriptLoaderCacheSize = 512; public int tectonicPlateSize = -1; + public int mantleCleanupDelay = 200; public int getTectonicPlateSize() { if (tectonicPlateSize > 0) diff --git a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index 28e48bd18..95ba698c9 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -55,6 +55,7 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import java.lang.ref.WeakReference; import java.util.List; import java.util.Map; import java.util.Set; @@ -422,9 +423,16 @@ public class IrisWorldManager extends EngineAssignedWorldManager { return; } - energy += 0.3; - fixEnergy(); - getEngine().cleanupMantleChunk(e.getX(), e.getZ()); + var ref = new WeakReference<>(e.getWorld()); + int x = e.getX(), z = e.getZ(); + J.s(() -> { + World world = ref.get(); + if (world == null || !world.isChunkLoaded(x, z)) + return; + energy += 0.3; + fixEnergy(); + getEngine().cleanupMantleChunk(x, z); + }, IrisSettings.get().getPerformance().mantleCleanupDelay); if (generated) { //INMS.get().injectBiomesFromMantle(e, getMantle()); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index d581fecaa..ba0759c83 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -289,13 +289,17 @@ public interface EngineMantle extends IObjectPlacer { } default void cleanupChunk(int x, int z) { - if (!getMantle().hasFlag(x, z, MantleFlag.CLEANED) && isCovered(x, z)) { - getMantle().raiseFlag(x, z, MantleFlag.CLEANED, () -> { - getMantle().deleteChunkSlice(x, z, BlockData.class); - getMantle().deleteChunkSlice(x, z, String.class); - getMantle().deleteChunkSlice(x, z, MatterCavern.class); - getMantle().deleteChunkSlice(x, z, MatterFluidBody.class); + if (!isCovered(x, z)) return; + MantleChunk chunk = getMantle().getChunk(x, z).use(); + try { + chunk.raiseFlag(MantleFlag.CLEANED, () -> { + chunk.deleteSlices(BlockData.class); + chunk.deleteSlices(String.class); + chunk.deleteSlices(MatterCavern.class); + chunk.deleteSlices(MatterFluidBody.class); }); + } finally { + chunk.release(); } } diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 03bd78fe1..77b849272 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -421,12 +421,9 @@ public class Mantle { } adjustedIdleDuration.set(baseIdleDuration); - - if (loadedRegions != null) { - if (loadedRegions.size() > tectonicLimit) { - // todo update this correctly and maybe do something when its above a 100% - adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimit) / (double) tectonicLimit) * 100) * 0.4), 4000)); - } + if (loadedRegions.size() > tectonicLimit) { + // todo update this correctly and maybe do something when its above a 100% + adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimit) / (double) tectonicLimit) * 100) * 0.4), 4000)); } ioTrim.set(true);