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 65991a686..212b1551f 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -244,6 +244,7 @@ public class IrisSettings { public boolean preventLeafDecay = true; public boolean useMulticore = false; public boolean offsetNoiseTypes = false; + public boolean earlyCustomBlocks = false; } @Data 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 e44ac8700..1edfee1f1 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -20,7 +20,9 @@ package com.volmit.iris.engine; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.link.Identifier; import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineAssignedWorldManager; import com.volmit.iris.engine.object.*; @@ -424,18 +426,35 @@ public class IrisWorldManager extends EngineAssignedWorldManager { } var ref = new WeakReference<>(e.getWorld()); - int x = e.getX(), z = e.getZ(); + int cX = e.getX(), cZ = e.getZ(); J.s(() -> { World world = ref.get(); - if (world == null || !world.isChunkLoaded(x, z)) + if (world == null || !world.isChunkLoaded(cX, cZ)) return; energy += 0.3; fixEnergy(); - getEngine().cleanupMantleChunk(x, z); + getEngine().cleanupMantleChunk(cX, cZ); }, IrisSettings.get().getPerformance().mantleCleanupDelay); if (generated) { //INMS.get().injectBiomesFromMantle(e, getMantle()); + + if (!IrisSettings.get().getGenerator().earlyCustomBlocks) return; + e.addPluginChunkTicket(Iris.instance); + J.s(() -> { + var chunk = getMantle().getChunk(e).use(); + int minY = getTarget().getWorld().minHeight(); + try { + chunk.raiseFlagUnchecked(MantleFlag.CUSTOM, () -> { + chunk.iterate(Identifier.class, (x, y, z, v) -> { + Iris.service(ExternalDataSVC.class).processUpdate(getEngine(), e.getBlock(x & 15, y + minY, z & 15), v); + }); + }); + } finally { + chunk.release(); + e.removePluginChunkTicket(Iris.instance); + } + }, RNG.r.i(20, 60)); } } diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 9026729e9..e6ac9f954 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -296,20 +296,20 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat try { Semaphore semaphore = new Semaphore(3); chunk.raiseFlag(MantleFlag.ETCHED, () -> { - chunk.raiseFlag(MantleFlag.TILE, run(semaphore, () -> { + chunk.raiseFlagUnchecked(MantleFlag.TILE, run(semaphore, () -> { chunk.iterate(TileWrapper.class, (x, y, z, v) -> { Block block = c.getBlock(x & 15, y + getWorld().minHeight(), z & 15); if (!TileData.setTileState(block, v.getData())) Iris.warn("Failed to set tile entity data at [%d %d %d | %s] for tile %s!", block.getX(), block.getY(), block.getZ(), block.getType().getKey(), v.getData().getMaterial().getKey()); }); }, 0)); - chunk.raiseFlag(MantleFlag.CUSTOM, run(semaphore, () -> { + chunk.raiseFlagUnchecked(MantleFlag.CUSTOM, run(semaphore, () -> { chunk.iterate(Identifier.class, (x, y, z, v) -> { Iris.service(ExternalDataSVC.class).processUpdate(this, c.getBlock(x & 15, y + getWorld().minHeight(), z & 15), v); }); }, 0)); - chunk.raiseFlag(MantleFlag.UPDATE, run(semaphore, () -> { + chunk.raiseFlagUnchecked(MantleFlag.UPDATE, run(semaphore, () -> { PrecisionStopwatch p = PrecisionStopwatch.start(); int[][] grid = new int[16][16]; for (int x = 0; x < 16; x++) { diff --git a/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java index 7208b6fb9..f7cf935cc 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java @@ -181,6 +181,11 @@ public class MantleChunk { } } + public void raiseFlagUnchecked(MantleFlag flag, Runnable r) { + if (closed.get()) throw new IllegalStateException("Chunk is closed!"); + if (flags.compareAndSet(flag.ordinal(), false, true)) r.run(); + } + public boolean isFlagged(MantleFlag flag) { return flags.get(flag.ordinal()); }