From 1c9e032c885cd8a9bf20832015a32f0c1d89b65d Mon Sep 17 00:00:00 2001 From: hayanesuru Date: Thu, 1 Jan 2026 02:17:27 +0900 Subject: [PATCH] fix despawnInPeacefulOverride API and inline check despawn (#513) * fix despawnInPeacefulOverride API and inline check despawn * Revert "fix despawnInPeacefulOverride API and inline check despawn" This reverts commit 82e37493fd1281fe86e738b7ca4bb0037307f0db. * check despawn * fix frozen * rebuild patches --- build-data/leaf.at | 1 + ...0001-Purpur-Server-Minecraft-Changes.patch | 4 +- .../features/0196-optimize-mob-despawn.patch | 177 +----------------- ...-SparklyPaper-Parallel-world-ticking.patch | 18 +- .../0210-Use-BFS-on-getSlopeDistance.patch | 4 +- ...-Micro-optimizations-for-random-tick.patch | 6 +- .../features/0244-optimize-mob-spawning.patch | 6 +- .../features/0251-optimize-random-tick.patch | 6 +- .../features/0257-Paw-optimization.patch | 8 +- ...Paper-PR-Optimise-temptation-lookups.patch | 12 +- .../0272-fix-temptation-lookups.patch | 10 +- .../features/0294-cache-collision-list.patch | 9 +- .../features/0295-fast-bit-radix-sort.patch | 6 +- ...Pluto-Expose-Direction-Plane-s-faces.patch | 4 +- .../features/0303-Multithreaded-Tracker.patch | 6 +- .../0304-Rewrite-entity-despawn-time.patch | 10 +- .../org/dreeam/leaf/world/DespawnMap.java | 89 +++++---- 17 files changed, 113 insertions(+), 263 deletions(-) diff --git a/build-data/leaf.at b/build-data/leaf.at index aabeab3b..221a3030 100644 --- a/build-data/leaf.at +++ b/build-data/leaf.at @@ -12,6 +12,7 @@ public net.minecraft.world.entity.Entity markHurt()V public net.minecraft.world.entity.Entity position public net.minecraft.world.entity.Entity updateInWaterStateAndDoWaterCurrentPushing()V public net.minecraft.world.entity.LivingEntity canGlide()Z +public net.minecraft.world.entity.LivingEntity noActionTime public net.minecraft.world.entity.ai.attributes.AttributeMap attributes public net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities lineOfSightTest public net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities nearbyEntities diff --git a/leaf-server/minecraft-patches/features/0001-Purpur-Server-Minecraft-Changes.patch b/leaf-server/minecraft-patches/features/0001-Purpur-Server-Minecraft-Changes.patch index 61a7b16b..b6c4cb2a 100644 --- a/leaf-server/minecraft-patches/features/0001-Purpur-Server-Minecraft-Changes.patch +++ b/leaf-server/minecraft-patches/features/0001-Purpur-Server-Minecraft-Changes.patch @@ -2324,11 +2324,11 @@ index aab9adb8313c4b18279c7fd7500ef04bda09c6c1..86a694b94045b47f6e98c480645f7573 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index c3c3b7dfb01317c902687b7de192f8a5a910a565..a3b985cc454b2c62e7642f7eb05de590ecde9272 100644 +index fa9ee5532e5e7f4224f1a296c2ed8e303d3548a5..0f4f46d951ddc49760ddb71bd47718becc4164c1 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -238,9 +238,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - protected int noActionTime; + public int noActionTime; public float lastHurt; public boolean jumping; - public float xxa; diff --git a/leaf-server/minecraft-patches/features/0196-optimize-mob-despawn.patch b/leaf-server/minecraft-patches/features/0196-optimize-mob-despawn.patch index d76a696e..346f3505 100644 --- a/leaf-server/minecraft-patches/features/0196-optimize-mob-despawn.patch +++ b/leaf-server/minecraft-patches/features/0196-optimize-mob-despawn.patch @@ -5,15 +5,14 @@ Subject: [PATCH] optimize mob despawn diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 3a4c9f215354b5ce96e301a17dd2d9ca0d4d1e91..cf9231c8b266dcb11a5b31db99a3a98b42423a65 100644 +index 08a6a3c3eb6e270ec3d02e31b26d5fa547bb66b2..c82b751566c36eba9584e6da3c1f14e0c6ac3c1a 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -796,13 +796,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -796,13 +796,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR -+ -+ if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled && tickRateManager.runsNormally()) { despawnMap.tick(this, this.entityTickList); } // Leaf - optimize despawn ++ boolean didDespawn = tickRateManager.runsNormally() && despawnMap.tick(this, this.entityTickList); // Leaf - optimize despawn this.entityTickList .forEach( entity -> { @@ -21,179 +20,15 @@ index 3a4c9f215354b5ce96e301a17dd2d9ca0d4d1e91..cf9231c8b266dcb11a5b31db99a3a98b if (!entity.isRemoved()) { if (!tickRateManager.isEntityFrozen(entity)) { - entity.checkDespawn(); -+ // Leaf start - optimize despawn -+ if (!org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled) { -+ entity.checkDespawn(); -+ } -+ // Leaf end - optimize despawn ++ if (!didDespawn) { entity.checkDespawn(); } // Leaf - optimize despawn if (true) { // Paper - rewrite chunk system Entity vehicle = entity.getVehicle(); if (vehicle != null) { -@@ -943,6 +949,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -943,6 +944,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 -+ public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(paperConfig()); // Leaf - optimize despawn ++ 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/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 427b0b42ea1c6418a733824f4af0de1b1e901cb9..67556752551e1d30519e2533543de9b04342420b 100644 ---- a/net/minecraft/world/entity/Entity.java -+++ b/net/minecraft/world/entity/Entity.java -@@ -5099,6 +5099,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess - public void checkDespawn() { - } - -+ // Leaf start - optimize despawn -+ public void leaf$checkDespawn(org.dreeam.leaf.world.DespawnMap map) { -+ } -+ public void leaf$checkDespawnFallback(org.dreeam.leaf.world.DespawnMap map) { -+ } -+ // Leaf end - optimize despawn -+ - public Vec3[] getQuadLeashHolderOffsets() { - return Leashable.createQuadLeashOffsets(this, 0.0, 0.5, 0.5, 0.0); - } -diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index e96605d652ca7265352ace09fd5e1892b4bbcd65..29029c58637f5622cc542ed8826b807b15f20644 100644 ---- a/net/minecraft/world/entity/Mob.java -+++ b/net/minecraft/world/entity/Mob.java -@@ -763,6 +763,53 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - } - } - -+ // Leaf start - optimize despawn -+ @Override -+ public void leaf$checkDespawn(org.dreeam.leaf.world.DespawnMap map) { -+ if (isRemoved()) { -+ } else if (map.difficultyIsPeaceful && this.shouldDespawnInPeaceful()) { -+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } else if (this.isPersistenceRequired() || this.requiresCustomPersistence()) { -+ this.noActionTime = 0; -+ } else { -+ map.checkDespawn(this); -+ } -+ } -+ @Override -+ public void leaf$checkDespawnFallback(org.dreeam.leaf.world.DespawnMap map) { -+ if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldActuallyDespawnInPeaceful()) { //Paper - allow changing despawnInPeaceful -+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) { -+ Entity nearestPlayer = map.checkDespawnFallback(this); // Paper - Affects Spawning API -+ if (nearestPlayer != null) { -+ // Paper start - Configurable despawn distances -+ final io.papermc.paper.configuration.WorldConfiguration.Entities.Spawning.DespawnRangePair despawnRangePair = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()); -+ final io.papermc.paper.configuration.type.DespawnRange.Shape shape = this.level().paperConfig().entities.spawning.despawnRangeShape; -+ final double dy = Math.abs(nearestPlayer.getY() - this.getY()); -+ final double dySqr = Mth.square(dy); -+ final double dxSqr = Mth.square(nearestPlayer.getX() - this.getX()); -+ final double dzSqr = Mth.square(nearestPlayer.getZ() - this.getZ()); -+ final double distanceSquared = dxSqr + dzSqr + dySqr; -+ // Despawn if hard/soft limit is exceeded -+ if (despawnRangePair.hard().shouldDespawn(shape, dxSqr, dySqr, dzSqr, dy) && this.removeWhenFarAway(distanceSquared)) { -+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } -+ -+ if (despawnRangePair.soft().shouldDespawn(shape, dxSqr, dySqr, dzSqr, dy)) { -+ if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && this.removeWhenFarAway(distanceSquared)) { -+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } -+ } else { -+ // Paper end - Configurable despawn distances -+ this.noActionTime = 0; -+ } -+ } -+ } else { -+ this.noActionTime = 0; -+ } -+ } -+ // Leaf end - optimize despawn -+ - @Override - protected final void serverAiStep() { - this.noActionTime++; -diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index de09a91b89661118e460842453e33f383ea08a94..e3cdff55261b2ff2c3d1cb1cf46b633a340458c9 100644 ---- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -+++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -956,6 +956,15 @@ public class EnderDragon extends Mob implements Enemy { - public void checkDespawn() { - } - -+ // Leaf start - optimize despawn -+ @Override -+ public void leaf$checkDespawn(org.dreeam.leaf.world.DespawnMap map) { -+ } -+ @Override -+ public void leaf$checkDespawnFallback(org.dreeam.leaf.world.DespawnMap map) { -+ } -+ // Leaf end - optimize despawn -+ - public EnderDragonPart[] getSubEntities() { - return this.subEntities; - } -diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index e3c34d5f00ce64b3c08b10cfcb3dd14ebe8c1977..3171868523bc9b767cb9da5f58c43890fc8214da 100644 ---- a/net/minecraft/world/entity/boss/wither/WitherBoss.java -+++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -695,6 +695,32 @@ public class WitherBoss extends Monster implements RangedAttackMob { - } - } - -+ -+ // Leaf start - optimize despawn -+ @Override -+ public void leaf$checkDespawn(org.dreeam.leaf.world.DespawnMap map) { -+ if (isRemoved()) { -+ return; -+ } -+ if (map.difficultyIsPeaceful && this.shouldDespawnInPeaceful()) { -+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } else { -+ this.noActionTime = 0; -+ } -+ } -+ @Override -+ public void leaf$checkDespawnFallback(org.dreeam.leaf.world.DespawnMap map) { -+ if (isRemoved()) { -+ return; -+ } -+ if (map.difficultyIsPeaceful && this.shouldDespawnInPeaceful()) { -+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } else { -+ this.noActionTime = 0; -+ } -+ } -+ // Leaf end - optimize despawn -+ - @Override - public boolean addEffect(MobEffectInstance effectInstance, @Nullable Entity entity) { - return false; -diff --git a/net/minecraft/world/entity/projectile/ShulkerBullet.java b/net/minecraft/world/entity/projectile/ShulkerBullet.java -index 00154ba80175bcb07b3378f19514fec1700c94e9..ec0a30d76df2a20ceb895b2837b0f24bfe887aba 100644 ---- a/net/minecraft/world/entity/projectile/ShulkerBullet.java -+++ b/net/minecraft/world/entity/projectile/ShulkerBullet.java -@@ -197,6 +197,22 @@ public class ShulkerBullet extends Projectile { - } - } - -+ -+ // Leaf start - optimize despawn -+ @Override -+ public void leaf$checkDespawn(org.dreeam.leaf.world.DespawnMap map) { -+ if (!isRemoved() && map.difficultyIsPeaceful) { -+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } -+ } -+ @Override -+ public void leaf$checkDespawnFallback(org.dreeam.leaf.world.DespawnMap map) { -+ if (!isRemoved() && map.difficultyIsPeaceful) { -+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause -+ } -+ } -+ // Leaf end - optimize despawn -+ - @Override - protected double getDefaultGravity() { - return 0.04; diff --git a/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch index 029c3801..1b80d0ec 100644 --- a/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch +++ b/leaf-server/minecraft-patches/features/0205-SparklyPaper-Parallel-world-ticking.patch @@ -379,7 +379,7 @@ index eaaa66c4d86d4ebda0acf8f1dbe8ecb55aa28285..908cd08e33fed1c4cd4bd34c3e63cbbe continue; } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a6b03fd2f 100644 +index c82b751566c36eba9584e6da3c1f14e0c6ac3c1a..7577d7c852e0962161701a3e332a2fcf89531b46 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -180,7 +180,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -569,7 +569,7 @@ index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); if (this.purpurConfig.playersSkipNight && this.sleepStatus.areEnoughSleeping(_int) && this.sleepStatus.areEnoughDeepSleeping(_int, this.players)) { // Purpur - Config for skipping night // Paper start - create time skip event - move up calculations -@@ -830,6 +969,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -825,6 +964,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Paper end - Prevent block entity and entity crashes } @@ -577,7 +577,7 @@ index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a this.moonrise$midTickTasks(); // Paper - rewrite chunk system // Gale end - Airplane - remove lambda from ticking guard - copied from guardEntityTick } -@@ -1309,7 +1449,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1304,7 +1444,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe fluidState.tick(this, pos, blockState); } // Paper start - rewrite chunk system @@ -589,7 +589,7 @@ index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.server).moonrise$executeMidTickTasks(); } // Paper end - rewrite chunk system -@@ -1322,7 +1465,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1317,7 +1460,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe blockState.tick(this, pos, this.random); } // Paper start - rewrite chunk system @@ -601,7 +601,7 @@ index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.server).moonrise$executeMidTickTasks(); } // Paper end - rewrite chunk system -@@ -1589,6 +1735,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1584,6 +1730,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } private void addPlayer(ServerPlayer player) { @@ -609,7 +609,7 @@ index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a Entity entity = this.getEntity(player.getUUID()); if (entity != null) { LOGGER.warn("Force-added player with duplicate UUID {}", player.getUUID()); -@@ -1601,7 +1748,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1596,7 +1743,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // CraftBukkit start private boolean addEntity(Entity entity, @Nullable org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { @@ -625,7 +625,7 @@ index cf9231c8b266dcb11a5b31db99a3a98b42423a65..15976e209ac24abf7f9aac5009dfd85a // Paper start - extra debug info if (entity.valid) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index b507065ed1dded25bdc1293014854cab340f4cd6..63d0f915439f9fe22cf6e435a3578b96ce5b990c 100644 +index 4c769410080732acd73c9f7ce9284c744b88ddf3..1bc4b2989bb78d3ac91cbd397cd6f0d70bf0ddd7 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -463,6 +463,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -679,7 +679,7 @@ index b507065ed1dded25bdc1293014854cab340f4cd6..63d0f915439f9fe22cf6e435a3578b96 // Paper end - Inventory close reason this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId)); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 972a504905e573bc2c9a8f320f7c8aca86873d06..09da54b32e88b1476dfe80d7924a9847da360d55 100644 +index e630d487b76acc11367fd50af19f693ba8f320da..f5b37ca4b30a200c86b97874f0e7871649313092 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -258,6 +258,7 @@ public abstract class PlayerList { @@ -799,7 +799,7 @@ index f9e7532f86122a379692561a639a209a126e8bba..7716c491a053db8b18aa23a4c2c768bc if (isLocatorBarEnabledFor(player)) { if (!connection.isBroken()) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 67556752551e1d30519e2533543de9b04342420b..97f8e0e7fc18a465ed3b7ee933c8e83eb95d83ab 100644 +index 427b0b42ea1c6418a733824f4af0de1b1e901cb9..d67e7f39ec08f40508e3456318b652662a34afef 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3476,15 +3476,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess diff --git a/leaf-server/minecraft-patches/features/0210-Use-BFS-on-getSlopeDistance.patch b/leaf-server/minecraft-patches/features/0210-Use-BFS-on-getSlopeDistance.patch index 5f60ee4f..4e950868 100644 --- a/leaf-server/minecraft-patches/features/0210-Use-BFS-on-getSlopeDistance.patch +++ b/leaf-server/minecraft-patches/features/0210-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 229cd5a61ed3668e0991ae0c4657d7ea578fedef..c43cd28c0d0870f812d136cfeba884bea89b277f 100644 +index f6ed5ef4b27f79fb14d8fa3d1e01bdeee077c3c2..48c9333256a137aa85e39a5ab8ca2022bd75df7f 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1448,6 +1448,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1443,6 +1443,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.emptyTime = 0; } diff --git a/leaf-server/minecraft-patches/features/0215-Micro-optimizations-for-random-tick.patch b/leaf-server/minecraft-patches/features/0215-Micro-optimizations-for-random-tick.patch index 60680a65..c0e4fa8e 100644 --- a/leaf-server/minecraft-patches/features/0215-Micro-optimizations-for-random-tick.patch +++ b/leaf-server/minecraft-patches/features/0215-Micro-optimizations-for-random-tick.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Micro optimizations for random tick diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index c43cd28c0d0870f812d136cfeba884bea89b277f..bec2b39c1975da51302f6a395aa03269773e3007 100644 +index 48c9333256a137aa85e39a5ab8ca2022bd75df7f..641875899b839d4c0012bd49a3f058258a06d99a 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1046,7 +1046,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1041,7 +1041,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - optimise random ticking private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) { final LevelChunkSection[] sections = chunk.getSections(); @@ -17,7 +17,7 @@ index c43cd28c0d0870f812d136cfeba884bea89b277f..bec2b39c1975da51302f6a395aa03269 final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Leaf - Faster random generator - upcasting final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294(); -@@ -1055,41 +1055,41 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1050,41 +1050,41 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe final int offsetZ = cpos.z << 4; for (int sectionIndex = 0, sectionsLen = sections.length; sectionIndex < sectionsLen; sectionIndex++) { diff --git a/leaf-server/minecraft-patches/features/0244-optimize-mob-spawning.patch b/leaf-server/minecraft-patches/features/0244-optimize-mob-spawning.patch index ffbe0a31..95671b3c 100644 --- a/leaf-server/minecraft-patches/features/0244-optimize-mob-spawning.patch +++ b/leaf-server/minecraft-patches/features/0244-optimize-mob-spawning.patch @@ -188,13 +188,13 @@ index 908cd08e33fed1c4cd4bd34c3e63cbbe84ffead4..f5b58c181726536bedabd4b6f64769e3 } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index bec2b39c1975da51302f6a395aa03269773e3007..eac2b9eb713d8a0a0b1682986745ae722262547e 100644 +index 641875899b839d4c0012bd49a3f058258a06d99a..9b3863a7456d3d226a2d53eefdfc109bdaae9b6a 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1096,6 +1096,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1091,6 +1091,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 - public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(paperConfig()); // Leaf - optimize despawn + 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 diff --git a/leaf-server/minecraft-patches/features/0251-optimize-random-tick.patch b/leaf-server/minecraft-patches/features/0251-optimize-random-tick.patch index 32833200..22931ea0 100644 --- a/leaf-server/minecraft-patches/features/0251-optimize-random-tick.patch +++ b/leaf-server/minecraft-patches/features/0251-optimize-random-tick.patch @@ -24,12 +24,12 @@ index f5b58c181726536bedabd4b6f64769e312ef4257..2847aa24cca82b1c66b69600ddcb5dbd this.level.tickCustomSpawners(this.spawnEnemies, this.spawnFriendlies); } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index eac2b9eb713d8a0a0b1682986745ae722262547e..147ff83b0fd851f57a8ad4e79487b8eef0196970 100644 +index 9b3863a7456d3d226a2d53eefdfc109bdaae9b6a..b0a9e75c62caa9c2c21084b75396b0274519a09e 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1097,6 +1097,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1092,6 +1092,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(paperConfig()); // Leaf - optimize despawn + 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) { diff --git a/leaf-server/minecraft-patches/features/0257-Paw-optimization.patch b/leaf-server/minecraft-patches/features/0257-Paw-optimization.patch index fac3a49b..77c51704 100644 --- a/leaf-server/minecraft-patches/features/0257-Paw-optimization.patch +++ b/leaf-server/minecraft-patches/features/0257-Paw-optimization.patch @@ -117,10 +117,10 @@ index 2847aa24cca82b1c66b69600ddcb5dbdadec5b9d..bd4c98e9ec41a2bd608e2e2245c503be if (!org.dreeam.leaf.config.modules.async.AsyncMobSpawning.enabled || _pufferfish_spawnCountsReady.get()) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 147ff83b0fd851f57a8ad4e79487b8eef0196970..de61388b0bf8b1fcb33cec5564922be29224d075 100644 +index b0a9e75c62caa9c2c21084b75396b0274519a09e..b77fe1df5ebd335705576fd502a459a5be154c1d 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1500,13 +1500,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1495,13 +1495,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper end - log detailed entity tick information public void tickNonPassenger(Entity entity) { @@ -134,7 +134,7 @@ index 147ff83b0fd851f57a8ad4e79487b8eef0196970..de61388b0bf8b1fcb33cec5564922be2 entity.setOldPosAndRot(); entity.tickCount++; entity.totalEntityAge++; // Paper - age-like counter for all entities -@@ -1519,13 +1513,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1514,13 +1508,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe for (Entity entity1 : entity.getPassengers()) { this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2 } @@ -149,7 +149,7 @@ index 147ff83b0fd851f57a8ad4e79487b8eef0196970..de61388b0bf8b1fcb33cec5564922be2 private void tickPassenger(Entity ridingEntity, Entity passengerEntity, final boolean isActive) { // Paper - EAR 2 diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 984e1ba6adc13da1a9d8e901f008ded9b04e1224..d2a6f2bfa4370fee99b3f535724fc3ee18ce496f 100644 +index 166bcb574ed82172095785e39d3cff474cde0645..f07bd43b26c6f7512f67b1ff4434a02a9b50009a 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -1136,16 +1136,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess diff --git a/leaf-server/minecraft-patches/features/0270-Paper-PR-Optimise-temptation-lookups.patch b/leaf-server/minecraft-patches/features/0270-Paper-PR-Optimise-temptation-lookups.patch index 9635a628..70d51daa 100644 --- a/leaf-server/minecraft-patches/features/0270-Paper-PR-Optimise-temptation-lookups.patch +++ b/leaf-server/minecraft-patches/features/0270-Paper-PR-Optimise-temptation-lookups.patch @@ -117,18 +117,18 @@ index 0000000000000000000000000000000000000000..5f5cdfc538ba9aa6666c019df6706015 + } +} diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 907650b743d556d50c59004d2fd0b5f7f6576045..288ede03a3ae4c5c99250d4ef1a3cf6bdc0a354d 100644 +index b77fe1df5ebd335705576fd502a459a5be154c1d..6cdad6d24cf57a86954e29c6f25849ac43215848 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -941,6 +941,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - } +@@ -942,6 +942,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR + boolean didDespawn = tickRateManager.runsNormally() && despawnMap.tick(this, this.entityTickList); // Leaf - optimize despawn + this.globalTemptationLookup.reset(); // Paper - optimise temptation lookups - reset global cache prior to next entity tick - - if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled && tickRateManager.runsNormally()) { despawnMap.tick(this, this.entityTickList); } // Leaf - optimize despawn this.entityTickList -@@ -3083,4 +3084,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + .forEach( + entity -> { +@@ -3078,4 +3079,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/0272-fix-temptation-lookups.patch b/leaf-server/minecraft-patches/features/0272-fix-temptation-lookups.patch index 96611bbf..3ccc7237 100644 --- a/leaf-server/minecraft-patches/features/0272-fix-temptation-lookups.patch +++ b/leaf-server/minecraft-patches/features/0272-fix-temptation-lookups.patch @@ -70,18 +70,18 @@ index 5f5cdfc538ba9aa6666c019df6706015234d7bae..2dfec8f6d0fe833e5f06cf2165ae14bf } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 373ccb50eee5aa2985fd96f731e7f8b930ce0586..03986a9b496a0cd14b6d80ef58f8bfbe3440cd19 100644 +index 6cdad6d24cf57a86954e29c6f25849ac43215848..56a46a1b9bf7356d9c97d203b6ceff41df9ca7aa 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -941,7 +941,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - } +@@ -942,7 +942,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR + boolean didDespawn = tickRateManager.runsNormally() && despawnMap.tick(this, this.entityTickList); // Leaf - optimize despawn - this.globalTemptationLookup.reset(); // Paper - optimise temptation lookups - reset global cache prior to next entity tick + this.globalTemptationLookup.tick(this); // Paper - optimise temptation lookups - reset global cache prior to next entity tick - - if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled && tickRateManager.runsNormally()) { despawnMap.tick(this, this.entityTickList); } // Leaf - optimize despawn this.entityTickList + .forEach( + entity -> { diff --git a/net/minecraft/world/entity/ai/goal/TemptGoal.java b/net/minecraft/world/entity/ai/goal/TemptGoal.java index 0c9a355344463ea85a3b724d22d53638b1e42394..7cb94eb75a1de0cef02d4953ee5896bd5e3c7abd 100644 --- a/net/minecraft/world/entity/ai/goal/TemptGoal.java diff --git a/leaf-server/minecraft-patches/features/0294-cache-collision-list.patch b/leaf-server/minecraft-patches/features/0294-cache-collision-list.patch index b80fe128..9800b538 100644 --- a/leaf-server/minecraft-patches/features/0294-cache-collision-list.patch +++ b/leaf-server/minecraft-patches/features/0294-cache-collision-list.patch @@ -5,20 +5,19 @@ Subject: [PATCH] cache collision list diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 03986a9b496a0cd14b6d80ef58f8bfbe3440cd19..b0192fe9359ff61d9f29d65768b1af9eeee91bde 100644 +index 56a46a1b9bf7356d9c97d203b6ceff41df9ca7aa..e6266ba383a45acddf5d62abe803af9d5612dad2 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1099,6 +1099,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(paperConfig()); // Leaf - optimize despawn +@@ -1094,6 +1094,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 30813f3d9aeece3d8a63300b8dc73ebaed8e75cd..f6d619709d4e5b0e6d1b943226579d7388835cdb 100644 +index 3ddd1f684ebde316100859bdd93e0a89be83e638..fef583625899091b13439e0d459b7538c866d712 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -1552,8 +1552,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess diff --git a/leaf-server/minecraft-patches/features/0295-fast-bit-radix-sort.patch b/leaf-server/minecraft-patches/features/0295-fast-bit-radix-sort.patch index 3990b6cc..dd0b1a67 100644 --- a/leaf-server/minecraft-patches/features/0295-fast-bit-radix-sort.patch +++ b/leaf-server/minecraft-patches/features/0295-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 b0192fe9359ff61d9f29d65768b1af9eeee91bde..99f3589d5d051ca613c325ac566d52d30a813271 100644 +index e6266ba383a45acddf5d62abe803af9d5612dad2..e4f3d032b3c63ee8ea123d1ec2ce67aa0bc9378c 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1100,6 +1100,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1095,6 +1095,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/0297-Pluto-Expose-Direction-Plane-s-faces.patch b/leaf-server/minecraft-patches/features/0297-Pluto-Expose-Direction-Plane-s-faces.patch index d1ab1d3b..81df2a20 100644 --- a/leaf-server/minecraft-patches/features/0297-Pluto-Expose-Direction-Plane-s-faces.patch +++ b/leaf-server/minecraft-patches/features/0297-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 99f3589d5d051ca613c325ac566d52d30a813271..898c3b4522c306ba2c42d70a6281b130ce5d9678 100644 +index e4f3d032b3c63ee8ea123d1ec2ce67aa0bc9378c..f0aec0eb3cd192bc5e04150fe29699dee35972b9 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1183,7 +1183,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1177,7 +1177,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; diff --git a/leaf-server/minecraft-patches/features/0303-Multithreaded-Tracker.patch b/leaf-server/minecraft-patches/features/0303-Multithreaded-Tracker.patch index 46001643..f07c3e15 100644 --- a/leaf-server/minecraft-patches/features/0303-Multithreaded-Tracker.patch +++ b/leaf-server/minecraft-patches/features/0303-Multithreaded-Tracker.patch @@ -1127,7 +1127,7 @@ index 85c811666b5cc4a01ccb97cef0cf350570bc12c6..153e442bc8b459067be0909080d2aac8 if (this.entity instanceof ServerPlayer serverPlayer) { serverPlayer.getBukkitEntity().injectScaledMaxHealth(attributesToSync, false); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 3232c025b2412f293c266e5f9e643f16f8693ef3..f58b91b277ba85fa7c0e7ad10157ecbf10023065 100644 +index f0aec0eb3cd192bc5e04150fe29699dee35972b9..cb1be4947ea2d85c6dcdc7424a4b712dcce0a40e 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -221,6 +221,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -1138,7 +1138,7 @@ index 3232c025b2412f293c266e5f9e643f16f8693ef3..f58b91b277ba85fa7c0e7ad10157ecbf @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { -@@ -987,6 +988,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -982,6 +983,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.tickBlockEntities(); } // Paper - rewrite chunk system @@ -1168,7 +1168,7 @@ index 94c7ae9535a235abb8fddf0ca6578dfae2e675bb..6db2eaa613599e6af5fea0922d2876b8 return true; } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index a2102e3739b19b99da81cc7a99ed2c8f01c46927..77ddcb214003e1fd2c847aea033217e542bc15fb 100644 +index 7d837e8ae59134d41138fb6a2566f5a6551121ce..2f4f74dafaca83c8c3e6e3234565faceddc8c81a 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -2939,6 +2939,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin diff --git a/leaf-server/minecraft-patches/features/0304-Rewrite-entity-despawn-time.patch b/leaf-server/minecraft-patches/features/0304-Rewrite-entity-despawn-time.patch index 8cd37fac..d5b76921 100644 --- a/leaf-server/minecraft-patches/features/0304-Rewrite-entity-despawn-time.patch +++ b/leaf-server/minecraft-patches/features/0304-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 f58b91b277ba85fa7c0e7ad10157ecbf10023065..b7f9f22abf60c75bc09126d9168fda9a0ee2375f 100644 +index cb1be4947ea2d85c6dcdc7424a4b712dcce0a40e..01f7390f3fb2a423cec373a2bb5ccbee57278783 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -1515,6 +1515,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1509,6 +1509,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe entity.tick(); entity.postTick(); // CraftBukkit } else {entity.inactiveTick();} // Paper - EAR 2 @@ -31,7 +31,7 @@ index f58b91b277ba85fa7c0e7ad10157ecbf10023065..b7f9f22abf60c75bc09126d9168fda9a for (Entity entity1 : entity.getPassengers()) { this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2 -@@ -1539,6 +1540,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1533,6 +1534,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe ridingEntity.positionRider(passengerEntity); } // Paper end - EAR 2 @@ -40,7 +40,7 @@ index f58b91b277ba85fa7c0e7ad10157ecbf10023065..b7f9f22abf60c75bc09126d9168fda9a for (Entity entity : passengerEntity.getPassengers()) { this.tickPassenger(passengerEntity, entity, isActive); // Paper - EAR 2 diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index f6d619709d4e5b0e6d1b943226579d7388835cdb..0c35f5f5a9d9afad457e2ab723f90feeefe5413d 100644 +index fef583625899091b13439e0d459b7538c866d712..e84ff9d5a1b495170b503dece72f7766b347c2d0 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -373,6 +373,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -135,7 +135,7 @@ index f6d619709d4e5b0e6d1b943226579d7388835cdb..0c35f5f5a9d9afad457e2ab723f90fee this.totalEntityAge = input.getIntOr("Spigot.ticksLived", 0); // Paper } // Spigot end -@@ -5327,9 +5366,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5320,9 +5359,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @Override public boolean shouldBeSaved() { diff --git a/leaf-server/src/main/java/org/dreeam/leaf/world/DespawnMap.java b/leaf-server/src/main/java/org/dreeam/leaf/world/DespawnMap.java index fb91c9a9..413fd281 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/world/DespawnMap.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/world/DespawnMap.java @@ -8,6 +8,9 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import net.minecraft.world.entity.boss.wither.WitherBoss; +import net.minecraft.world.entity.projectile.ShulkerBullet; import net.minecraft.world.level.entity.EntityTickList; import net.minecraft.world.phys.Vec3; import org.bukkit.event.entity.EntityRemoveEvent; @@ -18,22 +21,25 @@ import java.util.OptionalInt; import java.util.function.Consumer; public final class DespawnMap implements Consumer { - private static final ServerPlayer[] EMPTY_PLAYERS = {}; - private final KDTree3D tree = new KDTree3D(); + private static final MobCategory[] CATEGORIES = MobCategory.values(); + private static final ServerPlayer[] EMPTY_PLAYERS = {}; + + private final KDTree3D tree = new KDTree3D(); private final double[] hard = new double[CATEGORIES.length]; private final double[] sort = new double[CATEGORIES.length]; - private final boolean fallback; - public boolean difficultyIsPeaceful = true; - private ServerPlayer[] players = EMPTY_PLAYERS; + private boolean difficultyIsPeaceful = true; - public DespawnMap(WorldConfiguration worldConfiguration) { + public boolean tick(final ServerLevel world, final EntityTickList entityTickList) { + if (!org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled) { + return false; + } for (int i = 0; i < CATEGORIES.length; i++) { sort[i] = CATEGORIES[i].getNoDespawnDistance(); hard[i] = CATEGORIES[i].getDespawnDistance(); } boolean fallback = false; - for (Map.Entry e : worldConfiguration.entities.spawning.despawnRanges.entrySet()) { + for (Map.Entry e : world.paperConfig().entities.spawning.despawnRanges.entrySet()) { OptionalInt softVertical = e.getValue().soft().verticalLimit.value(); OptionalInt softHorizontal = e.getValue().soft().horizontalLimit.value(); OptionalInt hardVertical = e.getValue().hard().verticalLimit.value(); @@ -56,17 +62,16 @@ public final class DespawnMap implements Consumer { if (hard[i] > 0.0) { hard[i] = hard[i] * hard[i]; } + if (sort[i] > hard[i]) { + sort[i] = hard[i]; + } } - this.fallback = fallback; - } - - public void tick(final ServerLevel world, final EntityTickList entityTickList) { - players = world.players().toArray(EMPTY_PLAYERS); + ServerPlayer[] players = world.players().toArray(EMPTY_PLAYERS); final double[] pxl = new double[players.length]; final double[] pyl = new double[players.length]; final double[] pzl = new double[players.length]; int i = 0; - for (final ServerPlayer p : players) { + for (ServerPlayer p : players) { if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(p)) { pxl[i] = p.getX(); pyl[i] = p.getY(); @@ -81,41 +86,51 @@ public final class DespawnMap implements Consumer { tree.build(new double[][]{pxl, pyl, pzl}, indices); this.difficultyIsPeaceful = world.getDifficulty() == Difficulty.PEACEFUL; if (fallback) { - entityTickList.forEach(entity -> entity.leaf$checkDespawnFallback(this)); + return false; } else { entityTickList.forEach(this); + return true; } - players = EMPTY_PLAYERS; } - public void checkDespawn(final Mob mob) { - final int i = mob.getType().getCategory().ordinal(); - final double hardDist = this.hard[i]; - final Vec3 vec3 = mob.position; - final double dist = this.tree.nearestSqr(vec3.x, vec3.y, vec3.z, hardDist); - if (dist == Double.POSITIVE_INFINITY) { - return; - } - - if (dist >= hardDist && mob.removeWhenFarAway(dist)) { - mob.discard(EntityRemoveEvent.Cause.DESPAWN); - } else if (dist > this.sort[i]) { - if (mob.getNoActionTime() > 600 && mob.random.nextInt(800) == 0 && mob.removeWhenFarAway(dist)) { - mob.discard(EntityRemoveEvent.Cause.DESPAWN); + private boolean checkDespawn(final Entity entity) { + if (entity instanceof Mob mob) { + if (!(mob instanceof EnderDragon)) { + if (difficultyIsPeaceful && mob.shouldActuallyDespawnInPeaceful()) { + return true; + } else if (mob instanceof WitherBoss || mob.isPersistenceRequired() || mob.requiresCustomPersistence()) { + mob.noActionTime = 0; + return false; + } else { + final int i = mob.getType().getCategory().ordinal(); + final double hardDist = this.hard[i]; + final Vec3 vec3 = mob.position; + final double dist = this.tree.nearestSqr(vec3.x, vec3.y, vec3.z, hardDist); + if (dist == Double.POSITIVE_INFINITY) { + return false; + } else if (dist >= hardDist) { + return mob.removeWhenFarAway(dist); + } else if (dist > this.sort[i]) { + return mob.noActionTime > 600 && mob.random.nextInt(800) == 0 && mob.removeWhenFarAway(dist); + } else { + mob.noActionTime = 0; + return false; + } + } + } else { + return false; } + } else if (!(entity instanceof ShulkerBullet)) { + return false; } else { - mob.setNoActionTime(0); + return difficultyIsPeaceful; } } - public ServerPlayer checkDespawnFallback(final Mob mob) { - final Vec3 vec3 = mob.position; - final int i = tree.nearestIdx(vec3.x, vec3.y, vec3.z, Double.POSITIVE_INFINITY); - return i == -1 ? null : this.players[i]; - } - @Override public void accept(final Entity entity) { - entity.leaf$checkDespawn(this); + if (!entity.isRemoved() && checkDespawn(entity)) { + entity.discard(EntityRemoveEvent.Cause.DESPAWN); + } } }