From 290b140776749240486aa9c1ac8ebc1222f06f38 Mon Sep 17 00:00:00 2001 From: hayanesuru Date: Sat, 2 Aug 2025 02:39:44 +0900 Subject: [PATCH] fix npe in tickChunks --- .../features/0256-optimize-mob-spawning.patch | 24 ++++++++----------- .../features/0263-optimize-random-tick.patch | 4 ++-- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/leaf-server/minecraft-patches/features/0256-optimize-mob-spawning.patch b/leaf-server/minecraft-patches/features/0256-optimize-mob-spawning.patch index cf8475a3..5f35e4db 100644 --- a/leaf-server/minecraft-patches/features/0256-optimize-mob-spawning.patch +++ b/leaf-server/minecraft-patches/features/0256-optimize-mob-spawning.patch @@ -26,7 +26,7 @@ index 5c369b3d94e369c3f240821ad90b9d96223f24ca..9803c395fce103cb7bc746f43a017ff9 } // Paper end - Optional per player mob spawns diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 46e171ca454253c32e22c0c18587e9a7ba19f331..43156ecde8bb86c77f3b13c17b3330eae95efcc3 100644 +index 46e171ca454253c32e22c0c18587e9a7ba19f331..517c50639175276a9a040abf09f3ab9545627dd6 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java @@ -70,11 +70,11 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon @@ -136,7 +136,7 @@ index 46e171ca454253c32e22c0c18587e9a7ba19f331..43156ecde8bb86c77f3b13c17b3330ea } // Paper end - PlayerNaturallySpawnCreaturesEvent boolean flag = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit -@@ -621,16 +632,40 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -621,16 +632,36 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon List list = this.spawningChunks; try { @@ -144,11 +144,11 @@ index 46e171ca454253c32e22c0c18587e9a7ba19f331..43156ecde8bb86c77f3b13c17b3330ea + // Leaf start - optimize mob spawning + // this.chunkMap.collectSpawningChunks(list); + this.level.natureSpawnChunkMap.build(); ++ this.level.natureSpawnChunkMap.collectSpawningChunks(this.level.moonrise$getPlayerTickingChunks(), list); // Paper start - chunk tick iteration optimisation - this.shuffleRandom.setSeed(this.level.random.nextLong()); - if (!this.level.paperConfig().entities.spawning.perPlayerMobSpawns) Util.shuffle(list, this.shuffleRandom); // Paper - Optional per player mob spawns; do not need this when per-player is enabled + if (!this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { -+ this.level.natureSpawnChunkMap.collectSpawningChunks(this.level.moonrise$getPlayerTickingChunks(), list); + this.shuffleRandom.setSeed(this.level.random.nextLong()); // Leaf - paw optimization - Only set seed if is really used + Util.shuffle(list, this.shuffleRandom); // Paper - Optional per player mob spawns; do not need this when per-player is enabled + } @@ -160,18 +160,14 @@ index 46e171ca454253c32e22c0c18587e9a7ba19f331..43156ecde8bb86c77f3b13c17b3330ea + NaturalSpawner.SpawnState currentState = lastSpawnState; + if (currentState != null) { + currentState.applyPerPlayerMobCount(level); -+ if (!this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { -+ for (LevelChunk levelChunk : list) { -+ this.tickSpawningChunk(levelChunk, timeInhabited, filteredSpawningCategories, currentState); // Pufferfish ++ if (list instanceof it.unimi.dsi.fastutil.objects.ReferenceArrayList list1) { ++ LevelChunk[] raw = list1.elements(); ++ for (int i = 0, j = list1.size(); i < j; i++) { ++ this.tickSpawningChunk(raw[i], timeInhabited, filteredSpawningCategories, currentState); // Pufferfish + } + } else { -+ ca.spottedleaf.moonrise.common.list.ReferenceList chunks = this.level.moonrise$getPlayerTickingChunks(); -+ LevelChunk[] raw = chunks.getRawDataUnchecked(); -+ for (int i = 0, length = chunks.size(); i < length; i++) { -+ LevelChunk levelChunk = raw[i]; -+ if (level.natureSpawnChunkMap.contains(levelChunk.locX, levelChunk.locZ)) { -+ this.tickSpawningChunk(levelChunk, timeInhabited, filteredSpawningCategories, currentState); // Pufferfish -+ } ++ for (LevelChunk levelChunk : list) { ++ this.tickSpawningChunk(levelChunk, timeInhabited, filteredSpawningCategories, currentState); // Pufferfish + } + } + } @@ -182,7 +178,7 @@ index 46e171ca454253c32e22c0c18587e9a7ba19f331..43156ecde8bb86c77f3b13c17b3330ea list.clear(); } -@@ -648,7 +683,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -648,7 +679,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } if (!spawnCategories.isEmpty()) { diff --git a/leaf-server/minecraft-patches/features/0263-optimize-random-tick.patch b/leaf-server/minecraft-patches/features/0263-optimize-random-tick.patch index 77ee558d..0df33729 100644 --- a/leaf-server/minecraft-patches/features/0263-optimize-random-tick.patch +++ b/leaf-server/minecraft-patches/features/0263-optimize-random-tick.patch @@ -5,10 +5,10 @@ Subject: [PATCH] optimize random tick diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 43156ecde8bb86c77f3b13c17b3330eae95efcc3..ba0f66b5089e252e5d532cb4b94c6246a65d69d8 100644 +index 517c50639175276a9a040abf09f3ab9545627dd6..b2ded00d09bdab9889515b4829744eedaa0b0aa0 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -669,7 +669,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -665,7 +665,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon list.clear(); }