mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
88 lines
4.8 KiB
Diff
88 lines
4.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Taiyou06 <kaandindar21@gmail.com>
|
|
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<ServerPlayer> 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<Player.BedSleepingProblem, Unit> 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());
|