9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-27 18:59:06 +00:00

Fix stationary entities not tracking correctly

This commit is contained in:
Samsuik
2024-02-10 16:44:01 +00:00
parent b329e58a76
commit 4c83d74a18

View File

@@ -4,23 +4,8 @@ Date: Thu, 30 Nov 2023 15:54:49 +0000
Subject: [PATCH] Reduce entity tracker player updates
diff --git a/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java b/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java
index 4b6e0fe2fabcc55007fd8979e81f66df9c0278b7..ab6219ca5c38a1ba469c629a5ae00a4c1361c9b0 100644
--- a/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java
+++ b/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java
@@ -47,4 +47,10 @@ public class VecDeltaCodec {
public void setBase(Vec3 pos) {
this.base = pos;
}
+
+ // Sakura start
+ public Vec3 getBase() {
+ return base;
+ }
+ // Sakura end
}
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index e6d9ff38f2674e00b7e246015d2b3bda5eb7a445..4827be7d5665d3b0a1b06f702f71993aff2789ec 100644
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
@@ -31,44 +16,38 @@ index e6d9ff38f2674e00b7e246015d2b3bda5eb7a445..4827be7d5665d3b0a1b06f702f71993a
tracker.updatePlayers(tracker.entity.getPlayersInTrackRange());
}
} finally {
@@ -1522,6 +1523,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -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();
}
+ // Sakura start - delay entities looking for nearby players
+ boolean shouldLookForPlayers() {
+ return entity instanceof net.minecraft.world.entity.player.Player // always update players
+ || entity.tickCount % serverEntity.updateInterval == 0
+ || serverEntity.travelledDistanceSquared() > range * range;
+ 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;
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
index 18c5473923f8ce53be59b2496f347b31934ecc92..7bd08de82a5389b283d5cd96c5aea75419ca3b3f 100644
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
@@ -63,7 +63,7 @@ public class ServerEntity {
private static final int TOLERANCE_LEVEL_ROTATION = 1;
private final ServerLevel level;
private final Entity entity;
- private final int updateInterval;
+ final int updateInterval; // Sakura - private -> package
private final boolean trackDelta;
private final Consumer<Packet<?>> broadcast;
private final VecDeltaCodec positionCodec = new VecDeltaCodec();
@@ -81,6 +81,12 @@ public class ServerEntity {
// CraftBukkit start
final Set<ServerPlayerConnection> trackedPlayers; // Paper - private -> package
+ // Sakura start
+ double travelledDistanceSquared() {
+ return entity.position().distanceToSqr(positionCodec.getBase());
+ }
+ // Sakura end
+
public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer<Packet<?>> consumer, Set<ServerPlayerConnection> trackedPlayers) {
this.trackedPlayers = trackedPlayers;
// CraftBukkit end