9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-28 11:19:08 +00:00
Files
SakuraMC/patches/server/0047-Reduce-entity-tracker-player-updates.patch
2024-02-10 18:42:36 +00:00

54 lines
2.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <40902469+Samsuik@users.noreply.github.com>
Date: Thu, 30 Nov 2023 15:54:49 +0000
Subject: [PATCH] Reduce entity tracker player updates
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index e6d9ff38f2674e00b7e246015d2b3bda5eb7a445..270f6fbcb036e028d633b3b060fa1c26d344a9da 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -1257,6 +1257,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
try {
for (TrackedEntity tracker : this.entityMap.values()) {
// update tracker entry
+ if (!tracker.shouldLookForPlayers()) continue; // Sakura - delay entities looking for nearby players
tracker.updatePlayers(tracker.entity.getPlayersInTrackRange());
}
} finally {
@@ -1514,14 +1515,34 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
private final int range;
SectionPos lastSectionPos;
public final Set<ServerPlayerConnection> seenBy = new ReferenceOpenHashSet<>(); // Paper - optimise map impl
+ private final int playerSearchInterval; // Sakura
+ private Vec3 entityPosition; // Sakura
public TrackedEntity(Entity entity, int i, int j, boolean flag) {
this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit
this.entity = entity;
this.range = i;
this.lastSectionPos = SectionPos.of((EntityAccess) entity);
+ // Sakura start - delay entities looking for nearby players
+ // Use a maximum of 20 ticks because stationary entities use Integer.MAX_VALUE
+ // which causes them to turn invisible after untracking.
+ this.playerSearchInterval = Math.min(j, 20);
+ this.entityPosition = entity.position();
}
+ final boolean shouldLookForPlayers() {
+ // We have to always update players otherwise they can turn invisible on teleports (why?)
+ if (entity instanceof net.minecraft.world.entity.player.Player || entity.tickCount % playerSearchInterval == 0) {
+ return true;
+ }
+
+ Vec3 lastPosition = entityPosition;
+ entityPosition = entity.position();
+
+ return entity.position().distanceToSqr(lastPosition) >= (double) range / 2.0;
+ }
+ // Sakura end
+
// Paper start - use distance map to optimise tracker
com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> lastTrackerCandidates;