From 7b7fe5c62a2753ede750073d335b610db2b441c7 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Fri, 30 May 2025 19:57:23 +0800 Subject: [PATCH] Fully finish fix of chunk iteration self modification A fix in another way of https://github.com/PaperMC/Folia/issues/363 --- ...ix-chunk-iteration-self-modification.patch | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/luminol-server/minecraft-patches/features/0055-Fix-chunk-iteration-self-modification.patch b/luminol-server/minecraft-patches/features/0055-Fix-chunk-iteration-self-modification.patch index 01fe39b..95ca5ed 100644 --- a/luminol-server/minecraft-patches/features/0055-Fix-chunk-iteration-self-modification.patch +++ b/luminol-server/minecraft-patches/features/0055-Fix-chunk-iteration-self-modification.patch @@ -7,10 +7,10 @@ We use the old-like logics which is in 1.21.4. Might fixes: https://github.com/PaperMC/Folia/issues/363 diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 6dc5b1a8bdba998e11bcdf352bcc0fc7161a484c..753b36a7b1c2627540c62bea78565b880803a175 100644 +index f8322334fb6a0cea38c4d1981862ba673fd1b100..0e08512ce94435ca90a2344eefc761fa4fcdeb18 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -173,10 +173,14 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -173,14 +173,26 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon // 2. _removes_ are impossible at this stage in the tick final LevelChunk[] raw = entityTickingChunks.getRawDataUnchecked(); final int size = entityTickingChunks.size(); foliaProfiler.addCounter(ca.spottedleaf.leafprofiler.LProfilerRegistry.RANDOM_CHUNK_TICK_COUNT, (long)size); // Folia - profiler @@ -20,10 +20,23 @@ index 6dc5b1a8bdba998e11bcdf352bcc0fc7161a484c..753b36a7b1c2627540c62bea78565b88 + // Luminol end - java.util.Objects.checkFromToIndex(0, size, raw.length); ++ this.level.getServer().moonrise$executeMidTickTasks(); // Luminol - Fix chunk iteration self modification - try executing mid-tick tasks for once chunk system task parsing + java.util.Objects.checkFromToIndex(0, size, rawCopy.length); // Luminol - Fix chunk iteration self modification - use copy of raw array for (int i = 0; i < size; ++i) { - world.tickChunk(raw[i], randomTickSpeed); -+ world.tickChunk(rawCopy[i], randomTickSpeed); // Luminol - Fix chunk iteration self modification - use copy of raw array ++ // Luminol start - Fix chunk iteration self modification ++ final LevelChunk chunk = rawCopy[i]; ++ ++ if (!chunk.getFullStatus().isOrAfter(FullChunkStatus.ENTITY_TICKING)) { ++ continue; // skip chunks which are not entity ticking(probably downgraded from last iteration) ++ } ++ // Luminol end ++ world.tickChunk(chunk, randomTickSpeed); // Luminol - Fix chunk iteration self modification - use copy of raw array // call mid-tick tasks for chunk system if ((i & 7) == 0) { +- //((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.level.getServer()).moonrise$executeMidTickTasks(); // Folia - TODO restore this ++ ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.level.getServer()).moonrise$executeMidTickTasks(); // Folia - TODO restore this // Luminol - Fix chunk iteration self modification - restore mid tasks here + continue; + } + }