diff --git a/leaf-server/minecraft-patches/features/0013-Optimize-random-calls-in-chunk-ticking.patch b/leaf-server/minecraft-patches/features/0013-Optimize-random-calls-in-chunk-ticking.patch
index 20c339efb..f11ffd13e 100644
--- a/leaf-server/minecraft-patches/features/0013-Optimize-random-calls-in-chunk-ticking.patch
+++ b/leaf-server/minecraft-patches/features/0013-Optimize-random-calls-in-chunk-ticking.patch
@@ -51,41 +51,11 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
-diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index af67b07722bb0125acd081dab767d7e7b360623b..3cb58e799ad0ed0afdeac2d99af51b4981e6e788 100644
---- a/net/minecraft/server/level/ServerChunkCache.java
-+++ b/net/minecraft/server/level/ServerChunkCache.java
-@@ -502,6 +502,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
- if (!this.level.isDebug()) {
- ProfilerFiller profilerFiller = Profiler.get();
- profilerFiller.push("pollingChunks");
-+ this.level.resetIceAndSnowTick(); // Gale - Airplane - optimize random calls in chunk ticking - reset ice & snow tick random
- if (this.level.tickRateManager().runsNormally()) {
- profilerFiller.push("tickingChunks");
- this.tickChunks(profilerFiller, l);
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 54b37fe1ec2977b03cfbd3bd571ac5aec4617170..20009e9980405b883aa2f4dcf7a29c10aec71482 100644
+index 54b37fe1ec2977b03cfbd3bd571ac5aec4617170..13f2e956a479b551552974b34092221b24e2c1a6 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1011,6 +1011,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
- }
- // Paper end - optimise random ticking
-
-+ private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
-+
- public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
- final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = this.simpleRandom; // Paper - optimise random ticking
- ChunkPos pos = chunk.getPos();
-@@ -1019,7 +1021,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
- ProfilerFiller profilerFiller = Profiler.get();
- profilerFiller.push("iceandsnow");
-
-- if (!this.paperConfig().environment.disableIceAndSnow) { // Paper - Option to disable ice and snow
-+ if (!this.paperConfig().environment.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Option to disable ice and snow // Gale - Airplane - optimize random calls in chunk ticking - optimize further random ticking
- for (int i = 0; i < randomTickSpeed; i++) {
- if (simpleRandom.nextInt(48) == 0) { // Paper - optimise random ticking
- this.tickPrecipitation(this.getBlockRandomPos(minBlockX, 0, minBlockZ, 15));
-@@ -1042,7 +1044,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1042,7 +1042,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
int minBlockZ = pos.getMinBlockZ();
ProfilerFiller profilerFiller = Profiler.get();
profilerFiller.push("thunder");
diff --git a/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch b/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch
index 62fc57cc4..84022e1dd 100644
--- a/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch
+++ b/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch
@@ -153,10 +153,10 @@ index d0ca03ace2db83192d35850d29336990f01bc6fe..ca070adc64ac557b8393770bdfd6a396
if (!itemBySlot.isEmpty()) {
list.add(Pair.of(equipmentSlot, itemBySlot.copy()));
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 50f65c4b65d59c56a51459051c7f05673eeed0e1..e0cac20ffde626df53ac4773f02fac23efffced6 100644
+index 5b047f14d7dec11ee367034e9cd8962fd8abc13b..d60b197c5c0ef61b7614e07270c81d3d1cad7e7e 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1437,7 +1437,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1435,7 +1435,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public static List getCurrentlyTickingEntities() {
Entity ticking = currentlyTickingEntity.get();
@@ -179,7 +179,7 @@ index 9ba67227abb8420f72ecfd03f60feaa6433af3c3..6bfc4648e473ee11430e8f8c92f0d536
this.getInventory().equipment.set(value, net.minecraft.world.item.ItemStack.EMPTY);
}
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 34be258b6719d83156a04f51cb77b98dbc465daf..9448fcd3638d8a2356c3895fd315da8075daa945 100644
+index 40d9f5ee46af07ba5b8fcdb3ff2af276de700739..5dfd3607dfa0fef169231d21d45398086576ab4b 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2948,7 +2948,7 @@ public class ServerGamePacketListenerImpl
diff --git a/leaf-server/minecraft-patches/features/0064-Reduce-block-destruction-packet-allocations.patch b/leaf-server/minecraft-patches/features/0064-Reduce-block-destruction-packet-allocations.patch
index f24e09a34..5eb441e00 100644
--- a/leaf-server/minecraft-patches/features/0064-Reduce-block-destruction-packet-allocations.patch
+++ b/leaf-server/minecraft-patches/features/0064-Reduce-block-destruction-packet-allocations.patch
@@ -13,10 +13,10 @@ As part of: SportPaper (https://github.com/Electroid/SportPaper)
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index e0cac20ffde626df53ac4773f02fac23efffced6..ef5756a12cd26173244876b9b85880544865e1c5 100644
+index d60b197c5c0ef61b7614e07270c81d3d1cad7e7e..253685348250d3e8a51f0b48e3e376e08dc89a47 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1793,6 +1793,15 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1791,6 +1791,15 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@Override
public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) {
@@ -32,7 +32,7 @@ index e0cac20ffde626df53ac4773f02fac23efffced6..ef5756a12cd26173244876b9b8588054
// CraftBukkit start
Player breakerPlayer = null;
Entity entity = this.getEntity(breakerId);
-@@ -1809,7 +1818,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1807,7 +1816,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
.callEvent();
}
// Paper end - Add BlockBreakProgressUpdateEvent
@@ -41,7 +41,7 @@ index e0cac20ffde626df53ac4773f02fac23efffced6..ef5756a12cd26173244876b9b8588054
if (serverPlayer.level() == this && serverPlayer.getId() != breakerId) {
double d = pos.getX() - serverPlayer.getX();
double d1 = pos.getY() - serverPlayer.getY();
-@@ -1820,7 +1829,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1818,7 +1827,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
// CraftBukkit end
if (d * d + d1 * d1 + d2 * d2 < 1024.0) {
diff --git a/leaf-server/minecraft-patches/features/0087-Pufferfish-Optimize-mob-spawning.patch b/leaf-server/minecraft-patches/features/0087-Pufferfish-Optimize-mob-spawning.patch
index 54829a7e0..9b501d080 100644
--- a/leaf-server/minecraft-patches/features/0087-Pufferfish-Optimize-mob-spawning.patch
+++ b/leaf-server/minecraft-patches/features/0087-Pufferfish-Optimize-mob-spawning.patch
@@ -54,7 +54,7 @@ index 48e38240eb7fcc6394d44996ed5606b97e52712e..0d476e6e79807f5520d82c01806bd428
this.notificationManager().serverStarted();
return true;
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f75203634917d74 100644
+index af67b07722bb0125acd081dab767d7e7b360623b..98f27aa176fb72bf1ce165309d31b7b8b4bb3ca5 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
@@ -183,6 +183,8 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
@@ -66,7 +66,7 @@ index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f752036
public ServerChunkCache(
ServerLevel level,
-@@ -512,6 +514,54 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -511,6 +513,54 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
this.broadcastChangedChunks(profilerFiller);
profilerFiller.pop();
}
@@ -121,7 +121,7 @@ index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f752036
}
private void broadcastChangedChunks(ProfilerFiller profiler) {
-@@ -534,6 +584,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -533,6 +583,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
// Paper start - Optional per player mob spawns
NaturalSpawner.SpawnState spawnState;
if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled
@@ -129,7 +129,7 @@ index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f752036
// re-set mob counts
for (ServerPlayer player : this.level.players) {
// Paper start - per player mob spawning backoff
-@@ -548,12 +599,16 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -547,12 +598,16 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
// Paper end - per player mob spawning backoff
}
@@ -149,7 +149,7 @@ index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f752036
boolean flag = this.level.getGameRules().get(GameRules.SPAWN_MOBS) && !this.level.players().isEmpty(); // CraftBukkit
int i = this.level.getGameRules().get(GameRules.RANDOM_TICK_SPEED);
List filteredSpawningCategories;
-@@ -567,7 +622,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -566,7 +621,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
// Paper end - PlayerNaturallySpawnCreaturesEvent
boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
@@ -158,7 +158,7 @@ index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f752036
} else {
filteredSpawningCategories = List.of();
}
-@@ -585,7 +640,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -584,7 +639,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
profiler.popPush("tickSpawningChunks");
for (LevelChunk levelChunk : list) {
@@ -167,7 +167,7 @@ index 3cb58e799ad0ed0afdeac2d99af51b4981e6e788..7c00644bdb81884813c2c3954f752036
}
} finally {
list.clear();
-@@ -609,7 +664,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -608,7 +663,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
if (!spawnCategories.isEmpty()) {
diff --git a/leaf-server/minecraft-patches/features/0122-Matter-Secure-Seed.patch b/leaf-server/minecraft-patches/features/0122-Matter-Secure-Seed.patch
index f871516fb..5b7721e68 100644
--- a/leaf-server/minecraft-patches/features/0122-Matter-Secure-Seed.patch
+++ b/leaf-server/minecraft-patches/features/0122-Matter-Secure-Seed.patch
@@ -36,10 +36,10 @@ index 2a3b10c5e031ef44a2b53bc4fdc6e86c917f75d4..657b83a825080d1349043b6ef82624ae
this.get("generator-settings", property -> GsonHelper.parse(!property.isEmpty() ? property : "{}"), new JsonObject()),
this.get("level-type", property -> property.toLowerCase(Locale.ROOT), WorldPresets.NORMAL.identifier().toString())
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index 7c00644bdb81884813c2c3954f75203634917d74..3b753337e4ce101057931d320b4a1267d00e9432 100644
+index 98f27aa176fb72bf1ce165309d31b7b8b4bb3ca5..83e02e02aa3a95acdc2bc914307d7577fec87e8f 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
-@@ -691,6 +691,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -690,6 +690,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
public ChunkGenerator getGenerator() {
@@ -48,7 +48,7 @@ index 7c00644bdb81884813c2c3954f75203634917d74..3b753337e4ce101057931d320b4a1267
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 4cf3b7169370d82309d3a3fd04f078c52a1d535b..b8c3b268f910973ddcde2ea13b43b66002dc42e4 100644
+index 8a643f500e78ace5379fc077aba581e034a4606d..b14460685cb324336a03867fa78d390d5c7d1bf0 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -661,6 +661,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
diff --git a/leaf-server/minecraft-patches/features/0124-Faster-random-generator.patch b/leaf-server/minecraft-patches/features/0124-Faster-random-generator.patch
index c0e12b029..49b48be03 100644
--- a/leaf-server/minecraft-patches/features/0124-Faster-random-generator.patch
+++ b/leaf-server/minecraft-patches/features/0124-Faster-random-generator.patch
@@ -14,7 +14,7 @@ ThreadUnsafeRandom (Moonrise): 102,265,100 ns
SimpleThreadUnsafeRandom (Moonrise): 97,054,600 ns
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index 3b753337e4ce101057931d320b4a1267d00e9432..8ebc3aaa79526cc489885bc817d0c9880ab6ca55 100644
+index 83e02e02aa3a95acdc2bc914307d7577fec87e8f..551d189457c8a65763476edd84b50c156ac916cc 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
@@ -155,7 +155,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
@@ -27,7 +27,7 @@ index 3b753337e4ce101057931d320b4a1267d00e9432..8ebc3aaa79526cc489885bc817d0c988
final ServerLevel world = this.level;
final int randomTickSpeed = world.getGameRules().get(GameRules.RANDOM_TICK_SPEED);
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index b8c3b268f910973ddcde2ea13b43b66002dc42e4..f67ce1116e7676ec496b518b5ee82c11ff11758c 100644
+index b14460685cb324336a03867fa78d390d5c7d1bf0..3a93eb9819b2b9109762e21e28c3868f143867aa 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -979,7 +979,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -39,8 +39,8 @@ index b8c3b268f910973ddcde2ea13b43b66002dc42e4..f67ce1116e7676ec496b518b5ee82c11
final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294();
final ChunkPos cpos = chunk.getPos();
-@@ -1028,7 +1028,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
- private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
+@@ -1026,7 +1026,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+ // Paper end - optimise random ticking
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
- final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = this.simpleRandom; // Paper - optimise random ticking
diff --git a/leaf-server/minecraft-patches/features/0145-Remove-stream-in-CraftWorld-spawnParticle.patch b/leaf-server/minecraft-patches/features/0145-Remove-stream-in-CraftWorld-spawnParticle.patch
index 875bbff2c..a88481552 100644
--- a/leaf-server/minecraft-patches/features/0145-Remove-stream-in-CraftWorld-spawnParticle.patch
+++ b/leaf-server/minecraft-patches/features/0145-Remove-stream-in-CraftWorld-spawnParticle.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Remove stream in CraftWorld#spawnParticle
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index f67ce1116e7676ec496b518b5ee82c11ff11758c..7fc8e579ddef06513e84b9f84e29c87a28d1d80c 100644
+index 3a93eb9819b2b9109762e21e28c3868f143867aa..4cd9b541108fb0b82aed75077a7ae583458fe560 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -2216,7 +2216,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2214,7 +2214,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
for (int i1 = 0; i1 < receivers.size(); i1++) { // Paper - particle API
ServerPlayer serverPlayer = receivers.get(i1); // Paper - particle API
@@ -17,7 +17,7 @@ index f67ce1116e7676ec496b518b5ee82c11ff11758c..7fc8e579ddef06513e84b9f84e29c87a
if (this.sendParticles(serverPlayer, overrideLimiter, x, y, z, clientboundLevelParticlesPacket)) {
i++;
}
-@@ -2225,6 +2225,46 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2223,6 +2223,46 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
return i;
}
diff --git a/leaf-server/minecraft-patches/features/0175-Cache-chunk-key.patch b/leaf-server/minecraft-patches/features/0175-Cache-chunk-key.patch
index f4b278e51..8b0a612b8 100644
--- a/leaf-server/minecraft-patches/features/0175-Cache-chunk-key.patch
+++ b/leaf-server/minecraft-patches/features/0175-Cache-chunk-key.patch
@@ -119,7 +119,7 @@ index 8a5c37cf572abc6b9526648d3c8ec92b7af37e3d..9294a23f0d2ed50cb04315cdfabb3b8a
// Paper end - rewrite chunk system
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 7fc8e579ddef06513e84b9f84e29c87a28d1d80c..1cf83242729d8e0a92762127e6f0d840a2ed2f5c 100644
+index 4cd9b541108fb0b82aed75077a7ae583458fe560..07f54f4e83dc20ef4fc2e5f8c0422423955a437f 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -541,7 +541,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -131,7 +131,7 @@ index 7fc8e579ddef06513e84b9f84e29c87a28d1d80c..1cf83242729d8e0a92762127e6f0d840
return;
}
-@@ -2780,7 +2780,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2778,7 +2778,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public boolean areEntitiesActuallyLoadedAndTicking(ChunkPos chunkPos) {
// Paper start - rewrite chunk system
@@ -140,7 +140,7 @@ index 7fc8e579ddef06513e84b9f84e29c87a28d1d80c..1cf83242729d8e0a92762127e6f0d840
return chunkHolder != null && chunkHolder.isEntityTickingReady();
// Paper end - rewrite chunk system
}
-@@ -2800,7 +2800,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2798,7 +2798,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public boolean canSpawnEntitiesInChunk(ChunkPos chunkPos) {
// Paper start - rewrite chunk system
diff --git a/leaf-server/minecraft-patches/features/0186-optimize-mob-despawn.patch b/leaf-server/minecraft-patches/features/0186-optimize-mob-despawn.patch
index ff4cf1f28..279a9a7e2 100644
--- a/leaf-server/minecraft-patches/features/0186-optimize-mob-despawn.patch
+++ b/leaf-server/minecraft-patches/features/0186-optimize-mob-despawn.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] optimize mob despawn
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 1cf83242729d8e0a92762127e6f0d840a2ed2f5c..8f6cbc40c59800f2e1ee08c3ea0f12c9daa375c3 100644
+index 07f54f4e83dc20ef4fc2e5f8c0422423955a437f..80252baaf853099b0584beacac6bbcc9821e7079 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -854,6 +854,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -25,11 +25,12 @@ index 1cf83242729d8e0a92762127e6f0d840a2ed2f5c..8f6cbc40c59800f2e1ee08c3ea0f12c9
profilerFiller.pop();
if (true) { // Paper - rewrite chunk system
Entity vehicle = entity.getVehicle();
-@@ -1027,6 +1028,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
-
- private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
+@@ -1025,6 +1026,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+ }
+ // Paper end - optimise random ticking
+ public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
++
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
ChunkPos pos = chunk.getPos();
diff --git a/leaf-server/minecraft-patches/features/0194-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/minecraft-patches/features/0194-SparklyPaper-Parallel-world-ticking.patch
index 649f2326e..0ccc75dfb 100644
--- a/leaf-server/minecraft-patches/features/0194-SparklyPaper-Parallel-world-ticking.patch
+++ b/leaf-server/minecraft-patches/features/0194-SparklyPaper-Parallel-world-ticking.patch
@@ -380,7 +380,7 @@ index f24ce01762e865a4302af6eb4aa87ff7e0da564f..a8890cbe24479fd65c0de1688187fd25
// Gale start - Pufferfish - SIMD support
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index 8ebc3aaa79526cc489885bc817d0c9880ab6ca55..3849314a97b484af454aa8b9a3fe96389cf20e86 100644
+index 551d189457c8a65763476edd84b50c156ac916cc..b295a8b383a3d572e0c499fc0ea27ae1a95f9c06 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
@@ -176,6 +176,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
@@ -392,7 +392,7 @@ index 8ebc3aaa79526cc489885bc817d0c9880ab6ca55..3849314a97b484af454aa8b9a3fe9638
continue;
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 8f6cbc40c59800f2e1ee08c3ea0f12c9daa375c3..b7eea90601b6d546a80e3efa06014d19729183fd 100644
+index 80252baaf853099b0584beacac6bbcc9821e7079..883e0df1baad0df85b7980e057b2a6b588f96ba4 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -194,7 +194,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -591,7 +591,7 @@ index 8f6cbc40c59800f2e1ee08c3ea0f12c9daa375c3..b7eea90601b6d546a80e3efa06014d19
this.moonrise$midTickTasks(); // Paper - rewrite chunk system
// Gale end - Airplane - remove lambda from ticking guard - copied from guardEntityTick
profilerFiller.pop();
-@@ -1415,7 +1555,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1414,7 +1554,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
fluidState.tick(this, pos, blockState);
}
// Paper start - rewrite chunk system
@@ -603,7 +603,7 @@ index 8f6cbc40c59800f2e1ee08c3ea0f12c9daa375c3..b7eea90601b6d546a80e3efa06014d19
((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.server).moonrise$executeMidTickTasks();
}
// Paper end - rewrite chunk system
-@@ -1428,7 +1571,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1427,7 +1570,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
blockState.tick(this, pos, this.random);
}
// Paper start - rewrite chunk system
@@ -615,7 +615,7 @@ index 8f6cbc40c59800f2e1ee08c3ea0f12c9daa375c3..b7eea90601b6d546a80e3efa06014d19
((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.server).moonrise$executeMidTickTasks();
}
// Paper end - rewrite chunk system
-@@ -1699,6 +1845,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1698,6 +1844,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
private void addPlayer(ServerPlayer player) {
@@ -623,7 +623,7 @@ index 8f6cbc40c59800f2e1ee08c3ea0f12c9daa375c3..b7eea90601b6d546a80e3efa06014d19
Entity entity = this.getEntity(player.getUUID());
if (entity != null) {
LOGGER.warn("Force-added player with duplicate UUID {}", player.getUUID());
-@@ -1711,7 +1858,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1710,7 +1857,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
// CraftBukkit start
private boolean addEntity(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.@Nullable SpawnReason spawnReason) {
@@ -1128,7 +1128,7 @@ index ee113e10ae244f21744c6b3a64d157fe85ec9f74..bba028a852aa1552269a1942994cc8ad
serverLevel.capturedBlockStates.clear();
org.bukkit.event.world.StructureGrowEvent structureEvent = null;
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index e7360551860f611debb7e163d6f2a40fb08274a6..d7fa38ff4bff4fe7a8532aa2794ac2a880719121 100644
+index e7360551860f611debb7e163d6f2a40fb08274a6..9fd8210849bdc55ddbde00158c354beadea5549f 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -173,6 +173,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
diff --git a/leaf-server/minecraft-patches/features/0199-Use-BFS-on-getSlopeDistance.patch b/leaf-server/minecraft-patches/features/0199-Use-BFS-on-getSlopeDistance.patch
index 93a3a7a08..37c334976 100644
--- a/leaf-server/minecraft-patches/features/0199-Use-BFS-on-getSlopeDistance.patch
+++ b/leaf-server/minecraft-patches/features/0199-Use-BFS-on-getSlopeDistance.patch
@@ -9,10 +9,10 @@ Leaf: ~48ms (-36%)
This should help drastically on the farms that use actively changing fluids.
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index acb9a7f95ac23cc16807e28a1ea1d1ae35a08b55..966ce0a46bfa212c86d7b352dbc4a371ec37dbc1 100644
+index 18d2a33106742144ed0cbf201a5d47d88447201b..d1211d4d5b112e4848f86ad00c156d94439187f9 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1554,6 +1554,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1553,6 +1553,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
this.emptyTime = 0;
}
diff --git a/leaf-server/minecraft-patches/features/0231-optimize-mob-spawning.patch b/leaf-server/minecraft-patches/features/0231-optimize-mob-spawning.patch
index 7939c641c..812fb9c28 100644
--- a/leaf-server/minecraft-patches/features/0231-optimize-mob-spawning.patch
+++ b/leaf-server/minecraft-patches/features/0231-optimize-mob-spawning.patch
@@ -30,7 +30,7 @@ index 24342dcbc8f0f7e502d35c9c129c52faef6eb084..21340bd7fd7a90dfef705c3819a39176
}
// Paper end - Optional per player mob spawns
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc4185b3d99fb 100644
+index b295a8b383a3d572e0c499fc0ea27ae1a95f9c06..58452dd5ace7bea3e5fa6458be124dfd2ceee511 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
@@ -72,10 +72,10 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
@@ -70,7 +70,7 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
long gameTime = this.level.getGameTime();
long l = gameTime - this.lastInhabitedUpdate;
this.lastInhabitedUpdate = gameTime;
-@@ -517,8 +534,8 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -516,8 +533,8 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
// Pufferfish start - optimize mob spawning
@@ -81,7 +81,7 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
// Paper start - per player mob spawning backoff
for (int ii = 0; ii < ServerPlayer.MOBCATEGORY_TOTAL_ENUMS; ii++) {
player.mobCounts[ii] = 0;
-@@ -530,34 +547,21 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -529,34 +546,21 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
player.mobBackoffCounts[ii] = newBackoff;
}
// Paper end - per player mob spawning backoff
@@ -126,7 +126,7 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
_pufferfish_spawnCountsReady.set(true);
});
}
-@@ -620,6 +624,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -619,6 +623,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
chunkRange = Math.min(chunkRange, 8);
entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
entityPlayer.playerNaturallySpawnedEvent.callEvent();
@@ -134,7 +134,7 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
}
// Paper end - PlayerNaturallySpawnCreaturesEvent
boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
-@@ -632,7 +637,10 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -631,7 +636,10 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
try {
profiler.popPush("filteringSpawningChunks");
@@ -146,7 +146,7 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
profiler.popPush("shuffleSpawningChunks");
// Paper start - chunk tick iteration optimisation
this.shuffleRandom.setSeed(this.level.random.nextLong());
-@@ -640,10 +648,25 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -639,10 +647,25 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
// Paper end - chunk tick iteration optimisation
profiler.popPush("tickSpawningChunks");
@@ -174,7 +174,7 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
list.clear();
}
-@@ -665,7 +688,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -664,7 +687,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
if (!spawnCategories.isEmpty()) {
@@ -184,17 +184,17 @@ index 3849314a97b484af454aa8b9a3fe96389cf20e86..dcf6537cdc744ea45f0f9b08fcebc418
}
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 2a18278df5b05467883587cbdc98335fdc71461f..1e435862eceb2731c4eb58f4f60c6c6dfe5765df 100644
+index 2cca085764d0ad40cee1ff29638941234109652e..6d0af1843737f8c125522d551d8cf0fe0321936e 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1175,6 +1175,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
- private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
+@@ -1173,6 +1173,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+ // Paper end - optimise random ticking
public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
+ public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
+
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
- ChunkPos pos = chunk.getPos();
diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java
index 0cb3e9f4e51f30fc21c50eeb96ff1bb8a8894ca5..9182d8ca3391593b07580afa901526cef01cdd85 100644
--- a/net/minecraft/world/level/NaturalSpawner.java
diff --git a/leaf-server/minecraft-patches/features/0238-optimize-random-tick.patch b/leaf-server/minecraft-patches/features/0238-optimize-random-tick.patch
index 5e18fa9c5..f712c79a3 100644
--- a/leaf-server/minecraft-patches/features/0238-optimize-random-tick.patch
+++ b/leaf-server/minecraft-patches/features/0238-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 dcf6537cdc744ea45f0f9b08fcebc4185b3d99fb..8f1c33e3fed2937d599a5db3c1b559cf63d28902 100644
+index 58452dd5ace7bea3e5fa6458be124dfd2ceee511..2f00896126121520c71566360b49d698b265e256 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
-@@ -671,7 +671,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -670,7 +670,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
}
profiler.popPush("tickTickingChunks");
@@ -24,17 +24,17 @@ index dcf6537cdc744ea45f0f9b08fcebc4185b3d99fb..8f1c33e3fed2937d599a5db3c1b559cf
profiler.popPush("customSpawners");
this.level.tickCustomSpawners(this.spawnEnemies);
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 1e435862eceb2731c4eb58f4f60c6c6dfe5765df..7028fce7b114631d9361c8598d9fc0a47653d6f7 100644
+index 6d0af1843737f8c125522d551d8cf0fe0321936e..8d5de575fb1f6418ca5d8b2574e67fe5d58619d5 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1176,6 +1176,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1174,6 +1174,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
+ public final org.dreeam.leaf.world.RandomTickSystem randomTickSystem = new org.dreeam.leaf.world.RandomTickSystem(); // Leaf - optimize random tick
+
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
- ChunkPos pos = chunk.getPos();
diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java
index 1ae159c4dff71130bb66db101e5ef4e7aa0afcfc..6d22eead50e76c53cee73e2af87d95c2a4cad393 100644
--- a/net/minecraft/world/level/chunk/LevelChunk.java
diff --git a/leaf-server/minecraft-patches/features/0244-Paw-optimization.patch b/leaf-server/minecraft-patches/features/0244-Paw-optimization.patch
index 7e7a14d01..0a9fc07b7 100644
--- a/leaf-server/minecraft-patches/features/0244-Paw-optimization.patch
+++ b/leaf-server/minecraft-patches/features/0244-Paw-optimization.patch
@@ -64,10 +64,10 @@ index 5bfdb48ff7ef740a5a01d02e87f0264e17338de4..4e16552680f86cf1589f862cb38c0f43
}
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index 72926c0c0a1d0a123acc981b88dcb9c2c8962568..28c9076346332862ff8ddd034971aa9acf7499c4 100644
+index 2f00896126121520c71566360b49d698b265e256..29efabd65152a9e11441fd6601b1dc817a1c09d3 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
-@@ -643,8 +643,12 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
+@@ -642,8 +642,12 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
this.level.natureSpawnChunkMap.collectSpawningChunks(this.level.moonrise$getPlayerTickingChunks(), list);
profiler.popPush("shuffleSpawningChunks");
// Paper start - chunk tick iteration optimisation
@@ -83,10 +83,10 @@ index 72926c0c0a1d0a123acc981b88dcb9c2c8962568..28c9076346332862ff8ddd034971aa9a
profiler.popPush("tickSpawningChunks");
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 7028fce7b114631d9361c8598d9fc0a47653d6f7..2643dc54f899420b6847d1c537d0f1dd4a3c2e05 100644
+index 8d5de575fb1f6418ca5d8b2574e67fe5d58619d5..c1ebb5e40758e0f170f13a8796c4ec04c608d758 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1593,26 +1593,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1592,26 +1592,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
@@ -113,7 +113,7 @@ index 7028fce7b114631d9361c8598d9fc0a47653d6f7..2643dc54f899420b6847d1c537d0f1dd
entity.setOldPosAndRot();
ProfilerFiller profilerFiller = Profiler.get();
entity.tickCount++;
-@@ -1629,13 +1611,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1628,13 +1610,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
for (Entity entity1 : entity.getPassengers()) {
this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2
}
diff --git a/leaf-server/minecraft-patches/features/0256-Paper-PR-Optimise-temptation-lookups.patch b/leaf-server/minecraft-patches/features/0256-Paper-PR-Optimise-temptation-lookups.patch
index a044a48f3..2e12a4941 100644
--- a/leaf-server/minecraft-patches/features/0256-Paper-PR-Optimise-temptation-lookups.patch
+++ b/leaf-server/minecraft-patches/features/0256-Paper-PR-Optimise-temptation-lookups.patch
@@ -113,7 +113,7 @@ index 0000000000000000000000000000000000000000..1f206998a61af887e312953319e69fc7
+ }
+}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 2643dc54f899420b6847d1c537d0f1dd4a3c2e05..696354ce6e9c1df6d8b911773aa7033ce2bc8723 100644
+index c1ebb5e40758e0f170f13a8796c4ec04c608d758..3301cb8ea446debf81da13b5ab90204fd9c8f4d1 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -1000,6 +1000,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -124,7 +124,7 @@ index 2643dc54f899420b6847d1c537d0f1dd4a3c2e05..696354ce6e9c1df6d8b911773aa7033c
this.entityTickList
.forEach(
entity -> {
-@@ -3218,4 +3219,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -3217,4 +3218,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
this.lagCompensationTick = (System.nanoTime() - MinecraftServer.SERVER_INIT) / (java.util.concurrent.TimeUnit.MILLISECONDS.toNanos(50L));
}
// Paper end - lag compensation
diff --git a/leaf-server/minecraft-patches/features/0280-cache-collision-list.patch b/leaf-server/minecraft-patches/features/0280-cache-collision-list.patch
index d04118caa..685460641 100644
--- a/leaf-server/minecraft-patches/features/0280-cache-collision-list.patch
+++ b/leaf-server/minecraft-patches/features/0280-cache-collision-list.patch
@@ -5,17 +5,17 @@ Subject: [PATCH] cache collision list
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index b8b0415ca3ba428de0836498a4b32f443e747d8f..a5ba157792e5f35e1cd27e13969f2026a3d5152b 100644
+index e7c47be16b1089ef14602a75044f7a092af76b68..c7f3dd35b74e5bad21452c5f63db68c260b6ea09 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1178,6 +1178,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1176,6 +1176,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
public final org.dreeam.leaf.world.RandomTickSystem randomTickSystem = new org.dreeam.leaf.world.RandomTickSystem(); // Leaf - optimize random tick
+ public final org.dreeam.leaf.world.EntityCollisionCache entityCollisionCache = new org.dreeam.leaf.world.EntityCollisionCache(); // Leaf - cache collision list
+
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
- ChunkPos pos = chunk.getPos();
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
index e2dd89760c98e965b309469249a0b8c13ebf9dc8..f62b01cf438e108da64802644edff89931084ba5 100644
--- a/net/minecraft/world/entity/Entity.java
diff --git a/leaf-server/minecraft-patches/features/0281-fast-bit-radix-sort.patch b/leaf-server/minecraft-patches/features/0281-fast-bit-radix-sort.patch
index 078e589c6..1fd31e396 100644
--- a/leaf-server/minecraft-patches/features/0281-fast-bit-radix-sort.patch
+++ b/leaf-server/minecraft-patches/features/0281-fast-bit-radix-sort.patch
@@ -6,17 +6,17 @@ Subject: [PATCH] fast bit radix sort
Co-authored-by: Taiyou06
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index a5ba157792e5f35e1cd27e13969f2026a3d5152b..b7d85714a76df4cb9ef0dc797b9158a5fdddb50f 100644
+index c7f3dd35b74e5bad21452c5f63db68c260b6ea09..c81846b114be1405f0fca9aa52ee9fc63a927fc9 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1179,6 +1179,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1177,6 +1177,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
public final org.dreeam.leaf.world.RandomTickSystem randomTickSystem = new org.dreeam.leaf.world.RandomTickSystem(); // Leaf - optimize random tick
public final org.dreeam.leaf.world.EntityCollisionCache entityCollisionCache = new org.dreeam.leaf.world.EntityCollisionCache(); // Leaf - cache collision list
+ public final org.dreeam.leaf.util.FastBitRadixSort fastBitRadixSort = new org.dreeam.leaf.util.FastBitRadixSort(); // Leaf - fast bit radix sort
+
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
- ChunkPos pos = chunk.getPos();
diff --git a/net/minecraft/world/entity/ai/sensing/NearestItemSensor.java b/net/minecraft/world/entity/ai/sensing/NearestItemSensor.java
index 09fd13e2d958da8326276c4dadf25bf488aff5ac..063cab1fbd8dd3a483346242659fe273d3000cc6 100644
--- a/net/minecraft/world/entity/ai/sensing/NearestItemSensor.java
diff --git a/leaf-server/minecraft-patches/features/0283-Pluto-Expose-Direction-Plane-s-faces.patch b/leaf-server/minecraft-patches/features/0283-Pluto-Expose-Direction-Plane-s-faces.patch
index 58e467ac6..930930de9 100644
--- a/leaf-server/minecraft-patches/features/0283-Pluto-Expose-Direction-Plane-s-faces.patch
+++ b/leaf-server/minecraft-patches/features/0283-Pluto-Expose-Direction-Plane-s-faces.patch
@@ -35,10 +35,10 @@ index 45093451fb25ae3bb1e57d2e53c49a1ae666e31e..c228135032b5f74fd1ec96a2cf52aa3e
}
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index b7d85714a76df4cb9ef0dc797b9158a5fdddb50f..32b7ca2f264ac3b0fd1331b2174900b83318fce9 100644
+index c81846b114be1405f0fca9aa52ee9fc63a927fc9..375990f3cd6c4af7bdea700d8acbfcb8f06a763d 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1270,7 +1270,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1269,7 +1269,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
// We only need to check blocks that are taller than the minimum step height
if (org.purpurmc.purpur.PurpurConfig.smoothSnowAccumulationStep > 0 && layersValue >= org.purpurmc.purpur.PurpurConfig.smoothSnowAccumulationStep) {
int layersValueMin = layersValue - org.purpurmc.purpur.PurpurConfig.smoothSnowAccumulationStep;
@@ -100,7 +100,7 @@ index 9e4fc50053be66584612b97d3ef103e502195664..58d4c9fe5349d9bc43915d47e4eabc62
}
}
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index 7326a0a0fbeb4f8c9e7bd6f3946bb4beaa09a3a6..2780253a8f4885927f1aa8a638df9c90c7f86161 100644
+index 1b95edd586a819ca3b9de4ca044c1049c20f9c01..35e54403780ab96df2b30573822bc5562f1e8411 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -2043,7 +2043,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
diff --git a/leaf-server/minecraft-patches/features/0291-Rewrite-entity-despawn-time.patch b/leaf-server/minecraft-patches/features/0291-Rewrite-entity-despawn-time.patch
index 1bf2d3b0b..f012e062f 100644
--- a/leaf-server/minecraft-patches/features/0291-Rewrite-entity-despawn-time.patch
+++ b/leaf-server/minecraft-patches/features/0291-Rewrite-entity-despawn-time.patch
@@ -20,10 +20,10 @@ Brings the ability to despawn weak-loaded entities once they are ticked,
a solution for https://github.com/PaperMC/Paper/issues/12986
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 541c384187a0b20386ccc35200c7c4eb1ce62e9b..e41087a52c5c0521728357431afd182080ab1291 100644
+index 201faf0b00b4765dc6ef6d1d0230c4191efd20a4..7dbd98a27d7170cb857c0f26049ba70f14be20b0 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1613,6 +1613,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1612,6 +1612,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
} else {entity.inactiveTick();} // Paper - EAR 2
profilerFiller.pop();
@@ -32,7 +32,7 @@ index 541c384187a0b20386ccc35200c7c4eb1ce62e9b..e41087a52c5c0521728357431afd1820
for (Entity entity1 : entity.getPassengers()) {
this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2
}
-@@ -1641,6 +1643,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1640,6 +1642,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
// Paper end - EAR 2
profilerFiller.pop();
diff --git a/leaf-server/minecraft-patches/features/0293-Cache-world-border.patch b/leaf-server/minecraft-patches/features/0293-Cache-world-border.patch
index 1a018de90..c609e5748 100644
--- a/leaf-server/minecraft-patches/features/0293-Cache-world-border.patch
+++ b/leaf-server/minecraft-patches/features/0293-Cache-world-border.patch
@@ -7,7 +7,7 @@ The world border is only initialized once when the level is created.
Lookup from data storage map multiple time is quite unnecessary and expensive.
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index e41087a52c5c0521728357431afd182080ab1291..cf2a365bcbb1a278e5553c16ffef6d9ae81f4d41 100644
+index 7dbd98a27d7170cb857c0f26049ba70f14be20b0..d8201ab6396b75adf701ae552327ab747ba54461 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -237,6 +237,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -18,7 +18,7 @@ index e41087a52c5c0521728357431afd182080ab1291..cf2a365bcbb1a278e5553c16ffef6d9a
@Override
public @Nullable LevelChunk getChunkIfLoaded(int x, int z) {
-@@ -2517,8 +2518,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2516,8 +2517,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@Override
public WorldBorder getWorldBorder() {
diff --git a/leaf-server/minecraft-patches/features/0295-configurable-ice-and-snow-tick-chance.patch b/leaf-server/minecraft-patches/features/0295-configurable-ice-and-snow-tick-chance.patch
new file mode 100644
index 000000000..a7613e0aa
--- /dev/null
+++ b/leaf-server/minecraft-patches/features/0295-configurable-ice-and-snow-tick-chance.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: hayanesuru
+Date: Thu, 22 Jan 2026 01:21:43 +0900
+Subject: [PATCH] configurable ice and snow tick chance
+
+
+diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
+index d8201ab6396b75adf701ae552327ab747ba54461..912e9fa314fcfc6e5723bc55b8069ec9e3ba0d19 100644
+--- a/net/minecraft/server/level/ServerLevel.java
++++ b/net/minecraft/server/level/ServerLevel.java
+@@ -1192,7 +1192,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+
+ if (!this.paperConfig().environment.disableIceAndSnow) { // Paper - Option to disable ice and snow
+ for (int i = 0; i < randomTickSpeed; i++) {
+- if (simpleRandom.nextInt(48) == 0) { // Paper - optimise random ticking
++ if (simpleRandom.nextInt(org.dreeam.leaf.config.modules.gameplay.IceAndSnowChance.iceAndSnowChance) == 0) { // Paper - optimise random ticking // Leaf - configurable ice and snow tick chance
+ this.tickPrecipitation(this.getBlockRandomPos(minBlockX, 0, minBlockZ, 15));
+ }
+ }
diff --git a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/gameplay/IceAndSnowChance.java b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/gameplay/IceAndSnowChance.java
new file mode 100644
index 000000000..73410a9ce
--- /dev/null
+++ b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/gameplay/IceAndSnowChance.java
@@ -0,0 +1,21 @@
+package org.dreeam.leaf.config.modules.gameplay;
+
+import org.dreeam.leaf.config.ConfigModules;
+import org.dreeam.leaf.config.EnumConfigCategory;
+
+public class IceAndSnowChance extends ConfigModules {
+
+ public String getBasePath() {
+ return EnumConfigCategory.GAMEPLAY.getBaseKeyName() + ".ice-and-snow-chance";
+ }
+
+ public static int iceAndSnowChance = 48 * 8;
+
+ @Override
+ public void onLoaded() {
+ iceAndSnowChance = config.getInt(getBasePath(), 48 * 8);
+ if (iceAndSnowChance < 0) {
+ iceAndSnowChance = 48;
+ }
+ }
+}
diff --git a/leaf-server/src/main/java/org/dreeam/leaf/world/RandomTickSystem.java b/leaf-server/src/main/java/org/dreeam/leaf/world/RandomTickSystem.java
index 60768c22b..b4314aa1f 100644
--- a/leaf-server/src/main/java/org/dreeam/leaf/world/RandomTickSystem.java
+++ b/leaf-server/src/main/java/org/dreeam/leaf/world/RandomTickSystem.java
@@ -13,6 +13,7 @@
import net.minecraft.world.level.gamerules.GameRules;
import net.minecraft.world.level.levelgen.BitRandomSource;
import net.minecraft.world.level.material.FluidState;
+import org.dreeam.leaf.config.modules.gameplay.IceAndSnowChance;
public final class RandomTickSystem {
private static final long SCALE = 0x100000L;
@@ -35,17 +36,19 @@ public final class RandomTickSystem {
public void tick(ServerLevel world) {
queue.clear();
- final BitRandomSource random = world.simpleRandom;
final ReferenceList entityTickingChunks = world.moonrise$getEntityTickingChunks();
- final int randomTickSpeed = world.getGameRules().get(GameRules.RANDOM_TICK_SPEED);
final LevelChunk[] raw = entityTickingChunks.getRawDataUnchecked();
final int size = entityTickingChunks.size();
final boolean disableIceAndSnow = world.paperConfig().environment.disableIceAndSnow;
+ final int randomTickSpeed = world.getGameRules().get(GameRules.RANDOM_TICK_SPEED);
if (randomTickSpeed <= 0) {
return;
}
+
+ final BitRandomSource random = world.simpleRandom;
if (!disableIceAndSnow) {
- iceSnow(world, size, randomTickSpeed, random, raw);
+ int speed = IceAndSnowChance.iceAndSnowChance;
+ iceSnow(world, size, randomTickSpeed, Math.max(1, speed * 2), random, raw);
}
final long weightsSum = collectTickingChunks(size, random, raw, randomTickSpeed);
if (weightsSum != 0L) {
@@ -56,7 +59,8 @@ public void tick(ServerLevel world) {
for (int k = 0, len = queue.size(); k < len; ++k) {
final long packed = q[k];
final LevelChunk chunk = raw[(int) (packed >>> SECTION_BITS)];
- tickBlock(world, chunk, (int) (packed & SECTION_MASK), random, minY);
+ final int section = (int) (packed & SECTION_MASK);
+ tickBlock(world, chunk, section, random, minY);
}
}
@@ -72,7 +76,9 @@ private void sampling(BitRandomSource random, long weightsSum) {
final long[] s = samples;
long accumulated = w[0];
final long spoke = weightsSum / chosen;
- if (spoke == 0L) return;
+ if (spoke == 0L) {
+ return;
+ }
long current = boundedNextLong(random, spoke);
int i = 0;
@@ -209,12 +215,12 @@ private static void populateChunkTickingCount(LevelChunk chunk) {
}
}
- private static void iceSnow(ServerLevel world, int size, int randomTickSpeed, BitRandomSource random, LevelChunk[] raw) {
- int currentIceAndSnowTick = random.nextInt(48 * 16);
+ private static void iceSnow(ServerLevel world, int size, int randomTickSpeed, int speed, BitRandomSource random, LevelChunk[] raw) {
+ int currentIceAndSnowTick = boundedNextInt(random, speed);
for (int i = 0; i < size; i++) {
currentIceAndSnowTick -= randomTickSpeed;
if (currentIceAndSnowTick <= 0) {
- currentIceAndSnowTick = random.nextInt(48 * 16);
+ currentIceAndSnowTick = boundedNextInt(random, speed);
LevelChunk chunk = raw[i];
ChunkPos pos = chunk.getPos();
world.tickPrecipitation(world.getBlockRandomPos(pos.getMinBlockX(), 0, pos.getMinBlockZ(), 15));
@@ -241,6 +247,7 @@ private static void tickBlock(ServerLevel world, LevelChunk chunk, int sectionId
}
}
+ // bound > 0
private static long boundedNextLong(BitRandomSource rng, long bound) {
final long m = bound - 1L;
long r = rng.nextLong();
@@ -256,6 +263,7 @@ private static long boundedNextLong(BitRandomSource rng, long bound) {
return r;
}
+ // bound > 0
private static int boundedNextInt(BitRandomSource rng, int bound) {
final int m = bound - 1;
int r = rng.nextInt();