From fbfec233ce174cad6a7d4f3abfb1990bc58fb4b7 Mon Sep 17 00:00:00 2001 From: hayanesuru Date: Tue, 25 Nov 2025 05:32:16 +0900 Subject: [PATCH] don't load chunks to spread grass (#540) * Pluto: don't load chunks to spread grass * block pos --- ...to-don-t-load-chunks-to-spread-grass.patch | 56 +++++++++++++++++++ ...e-SpreadingSnowyDirtBlock-randomTick.patch | 19 ------- 2 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 leaf-server/minecraft-patches/features/0284-Pluto-don-t-load-chunks-to-spread-grass.patch delete mode 100644 leaf-server/minecraft-patches/features/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch diff --git a/leaf-server/minecraft-patches/features/0284-Pluto-don-t-load-chunks-to-spread-grass.patch b/leaf-server/minecraft-patches/features/0284-Pluto-don-t-load-chunks-to-spread-grass.patch new file mode 100644 index 00000000..e25b08b0 --- /dev/null +++ b/leaf-server/minecraft-patches/features/0284-Pluto-don-t-load-chunks-to-spread-grass.patch @@ -0,0 +1,56 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: hayanesuru +Date: Sat, 9 Aug 2025 15:39:09 +0900 +Subject: [PATCH] Pluto: don't load chunks to spread grass + +Original license: GPL-3.0 +Original project: https://github.com/Yive/Pluto + +diff --git a/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java b/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java +index f8cc3f870d88715386bb4de0da81a74fa04fd216..075b520b8dbdb5ef29d4acea9f027718aa578d35 100644 +--- a/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java ++++ b/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java +@@ -52,7 +52,7 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock { + protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (this instanceof GrassBlock && level.paperConfig().tickRates.grassSpread != 1 && (level.paperConfig().tickRates.grassSpread < 1 || (net.minecraft.server.MinecraftServer.currentTick + pos.hashCode()) % level.paperConfig().tickRates.grassSpread != 0)) { return; } // Paper - Configurable random tick rates for blocks + // Paper start - Perf: optimize dirt and snow spreading +- final net.minecraft.world.level.chunk.ChunkAccess cachedBlockChunk = level.getChunkIfLoaded(pos); ++ final net.minecraft.world.level.chunk.LevelChunk cachedBlockChunk = level.getChunkAtIfLoadedUnchecked(pos.getX() >> 4, pos.getZ() >> 4); // Leaf - optimize get chunk + if (cachedBlockChunk == null) { // Is this needed? + return; + } +@@ -71,21 +71,29 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock { + + for (int i = 0; i < 4; i++) { + BlockPos blockPos = pos.offset(random.nextInt(3) - 1, random.nextInt(5) - 3, random.nextInt(3) - 1); ++ // Pluto start - don't load chunks to spread grass + // Paper start - Perf: optimize dirt and snow spreading + if (pos.getX() == blockPos.getX() && pos.getY() == blockPos.getY() && pos.getZ() == blockPos.getZ()) { + continue; + } + +- final net.minecraft.world.level.chunk.ChunkAccess access; +- if (cachedBlockChunk.locX == blockPos.getX() >> 4 && cachedBlockChunk.locZ == blockPos.getZ() >> 4) { ++ int x = blockPos.getX(); ++ int y = blockPos.getY(); ++ int z = blockPos.getZ(); ++ final net.minecraft.world.level.chunk.LevelChunk access; ++ if (cachedBlockChunk.locX == x >> 4 && cachedBlockChunk.locZ == z >> 4) { + access = cachedBlockChunk; + } else { +- access = level.getChunkAt(blockPos); ++ access = level.getChunkAtIfLoadedUnchecked(x >> 4, z >> 4); ++ if (access == null) { ++ continue; ++ } + } +- if (access.getBlockState(blockPos).is(Blocks.DIRT) && SpreadingSnowyDirtBlock.canPropagate(access, blockState, level, blockPos)) { +- org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, blockState.setValue(SNOWY, isSnowySetting(access.getBlockState(blockPos.above()))), 3); // CraftBukkit ++ if (access.getBlockStateFinal(x, y, z).is(Blocks.DIRT) && SpreadingSnowyDirtBlock.canPropagate(access, blockState, level, blockPos)) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, blockState.setValue(SNOWY, isSnowySetting(access.getBlockStateFinal(x, y + 1, z))), 3); // CraftBukkit + // Paper end - Perf: optimize dirt and snow spreading + } ++ // Pluto end - don't load chunks to spread grass + } + } + } diff --git a/leaf-server/minecraft-patches/features/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch b/leaf-server/minecraft-patches/features/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch deleted file mode 100644 index 8b21fb25..00000000 --- a/leaf-server/minecraft-patches/features/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: hayanesuru -Date: Sat, 9 Aug 2025 15:39:09 +0900 -Subject: [PATCH] optimize SpreadingSnowyDirtBlock#randomTick - - -diff --git a/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java b/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java -index f8cc3f870d88715386bb4de0da81a74fa04fd216..07eb777ac9657318831b5bf00e4a4c9e8aca76db 100644 ---- a/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java -+++ b/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java -@@ -52,7 +52,7 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock { - protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { - if (this instanceof GrassBlock && level.paperConfig().tickRates.grassSpread != 1 && (level.paperConfig().tickRates.grassSpread < 1 || (net.minecraft.server.MinecraftServer.currentTick + pos.hashCode()) % level.paperConfig().tickRates.grassSpread != 0)) { return; } // Paper - Configurable random tick rates for blocks - // Paper start - Perf: optimize dirt and snow spreading -- final net.minecraft.world.level.chunk.ChunkAccess cachedBlockChunk = level.getChunkIfLoaded(pos); -+ final net.minecraft.world.level.chunk.ChunkAccess cachedBlockChunk = level.getChunkAtIfLoadedUnchecked(pos.getX() >> 4, pos.getZ() >> 4); // Leaf - optimize get chunk - if (cachedBlockChunk == null) { // Is this needed? - return; - }