diff --git a/src/main/java/com/ishland/vmp/common/playerwatching/NearbyEntityTracking.java b/src/main/java/com/ishland/vmp/common/playerwatching/NearbyEntityTracking.java index 347960d..df39743 100644 --- a/src/main/java/com/ishland/vmp/common/playerwatching/NearbyEntityTracking.java +++ b/src/main/java/com/ishland/vmp/common/playerwatching/NearbyEntityTracking.java @@ -73,6 +73,15 @@ public void removePlayer(ServerPlayerEntity player) { } } + private final ReferenceLinkedOpenHashSet trackerTickList = new ReferenceLinkedOpenHashSet<>() { + @Override + protected void rehash(int newN) { + if (this.n < newN) { + super.rehash(newN); + } + } + }; + public void tick() { for (Reference2LongMap.Entry entry : this.tracker2ChunkPos.reference2LongEntrySet()) { final ChunkPos pos = ((IThreadedAnvilChunkStorageEntityTracker) entry.getKey()).getEntity().getChunkPos(); @@ -82,7 +91,8 @@ public void tick() { } } - var trackerTickList = new ReferenceOpenHashSet<>(this.areaMap.uniqueObjects()); + trackerTickList.clear(); + for (var entry : this.playerTrackers.entrySet()) { final Set currentTrackers = this.areaMap.getObjectsInRange(entry.getKey().getChunkPos().toLong()); @@ -94,11 +104,10 @@ public void tick() { for (ObjectListIterator iterator = trackers.iterator(); iterator.hasNext(); ) { ThreadedAnvilChunkStorage.EntityTracker entityTracker = iterator.next(); if (currentTrackers.contains(entityTracker)) { - final boolean shouldUpdate = isPlayerPositionUpdated || ((EntityTrackerExtension) entityTracker).isPositionUpdated(); if (trackerTickList.add(entityTracker)) { tryTickTracker(entityTracker); } - if (shouldUpdate) { + if (isPlayerPositionUpdated || ((EntityTrackerExtension) entityTracker).isPositionUpdated()) { tryUpdateTracker(entityTracker, entry.getKey()); } } else { @@ -110,17 +119,19 @@ public void tick() { // update new trackers for (ThreadedAnvilChunkStorage.EntityTracker entityTracker : currentTrackers) { if (!trackers.contains(entityTracker)) { - final boolean shouldUpdate = isPlayerPositionUpdated || ((EntityTrackerExtension) entityTracker).isPositionUpdated(); if (trackerTickList.add(entityTracker)) { tryTickTracker(entityTracker); } - if (shouldUpdate) { + if (isPlayerPositionUpdated || ((EntityTrackerExtension) entityTracker).isPositionUpdated()) { tryUpdateTracker(entityTracker, entry.getKey()); } trackers.add(entityTracker); } } } + for (ThreadedAnvilChunkStorage.EntityTracker entityTracker : trackerTickList) { + ((EntityTrackerExtension) entityTracker).updatePosition(); + } } private static void tryUpdateTracker(ThreadedAnvilChunkStorage.EntityTracker entityTracker, ServerPlayerEntity player) { @@ -129,7 +140,6 @@ private static void tryUpdateTracker(ThreadedAnvilChunkStorage.EntityTracker ent private static void tryTickTracker(ThreadedAnvilChunkStorage.EntityTracker entityTracker) { ((EntityTrackerExtension) entityTracker).tryTick(); - ((EntityTrackerExtension) entityTracker).updatePosition(); } private int getChunkViewDistance(ThreadedAnvilChunkStorage.EntityTracker tracker) {