From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Taiyou06 Date: Fri, 14 Feb 2025 20:08:14 +0100 Subject: [PATCH] Cache eligible players for despawn checks diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java index ccd6f16e244745ee0702504dbea710485037a3e3..2ecb73fc7b6754ade93bf16b48c623e6b3a955a9 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -725,6 +725,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe return this.structureManager; } + public Player[] eligibleDespawnCheckingPlayerCache = new Player[0]; // Leaf - Cache eligible players for despawn checks + public void tick(BooleanSupplier hasTimeLeft) { this.handlingTick = true; TickRateManager tickRateManager = this.tickRateManager(); @@ -792,6 +794,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR + + // Leaf start - Cache eligible players for despawn checks + List serverPlayers = new ArrayList<>(players().size()); + for (int i = 0; i < players().size(); i++) { + ServerPlayer player = players().get(i); + if (net.minecraft.world.entity.EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) { + serverPlayers.add(player); + } + } + + eligibleDespawnCheckingPlayerCache = serverPlayers.toArray(new Player[0]); + // Leaf end - Cache eligible players for despawn checks + this.entityTickList .forEach( entity -> { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java index 18125ed336c3425f123232b405a8af9ee3a2ba7d..d507544efafe74ecaffd6a063eff152d349ec76a 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -1518,6 +1518,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.containerMenu.broadcastChanges(); } + // Leaf start - Cache eligible players for despawn checks + @Override + public boolean isAlive() { + return !this.isRemoved() && this.entityData.get(DATA_HEALTH_ID) > 0.0f && !this.dead; + } + // Leaf end - Cache eligible players for despawn checks + // CraftBukkit start - moved bed result checks from below into separate method private Either getBedResult(BlockPos at, Direction direction) { if (this.isSleeping() || !this.isAlive()) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java index c15b6e32bd00650366dc4ecba2abeb6bfb98d638..81bd431e641be474f7a43a78df083756de1798de 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -705,7 +705,24 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) { this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) { - Entity nearestPlayer = this.level().findNearbyPlayer(this, -1.0, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API + // Leaf start - Cache eligible players for despawn checks + Entity nearestPlayer = null; + + if (this.level() instanceof ServerLevel serverLevel) { + double minDist = Double.MAX_VALUE; + for (int i = 0; i < serverLevel.eligibleDespawnCheckingPlayerCache.length; i++) { + Player cachedPlayer = serverLevel.eligibleDespawnCheckingPlayerCache[i]; + double d1 = cachedPlayer.distanceToSqr(this); + if (d1 <= minDist) { + minDist = d1; + nearestPlayer = cachedPlayer; + } + } + } else { + nearestPlayer = this.level().findNearbyPlayer(this, -1.0, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API + } + // Leaf end - Cache eligible players for despawn checks + 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());