From 3571c05d9d1d9219dd7b00f15c7c733f8fc665e3 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 17 Jun 2023 22:00:26 +0800 Subject: [PATCH] Reduce NPCSeenByPlayerEvent allocations --- .../nms/v1_10_R1/util/PlayerlistTrackerEntry.java | 2 +- .../nms/v1_11_R1/util/PlayerlistTrackerEntry.java | 15 ++++++++++----- .../nms/v1_12_R1/util/PlayerlistTrackerEntry.java | 9 ++++++++- .../nms/v1_13_R2/util/PlayerlistTrackerEntry.java | 8 +++++++- .../nms/v1_14_R1/util/PlayerlistTracker.java | 8 +++++++- .../nms/v1_15_R1/util/PlayerlistTracker.java | 8 +++++++- .../nms/v1_16_R3/util/PlayerlistTracker.java | 8 +++++++- .../nms/v1_17_R1/util/PlayerlistTracker.java | 2 +- .../nms/v1_18_R2/util/PlayerlistTracker.java | 2 +- .../nms/v1_19_R3/util/CitizensEntityTracker.java | 2 +- .../nms/v1_20_R1/util/CitizensEntityTracker.java | 2 +- .../nms/v1_8_R3/util/PlayerlistTrackerEntry.java | 2 +- 12 files changed, 52 insertions(+), 16 deletions(-) diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/PlayerlistTrackerEntry.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/PlayerlistTrackerEntry.java index 4ba752ec6..03de1e058 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/PlayerlistTrackerEntry.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/PlayerlistTrackerEntry.java @@ -31,7 +31,7 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { if (entityplayer instanceof EntityHumanNPC) return; Entity tracker = getTracker(this); - if (tracker instanceof NPCHolder) { + if (!trackedPlayers.contains(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/PlayerlistTrackerEntry.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/PlayerlistTrackerEntry.java index 0621d6793..fcd5ff4ee 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/PlayerlistTrackerEntry.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/PlayerlistTrackerEntry.java @@ -16,7 +16,6 @@ import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.event.NPCSeenByPlayerEvent; import net.citizensnpcs.api.npc.NPC; -import net.citizensnpcs.nms.v1_11_R1.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.minecraft.server.v1_11_R1.Entity; @@ -26,12 +25,15 @@ import net.minecraft.server.v1_11_R1.EntityTrackerEntry; public class PlayerlistTrackerEntry extends EntityTrackerEntry { private Entity tracker; + private Map trackingMap; + public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) { super(entity, i, j, k, flag); tracker = getTracker(this); if (TRACKING_MAP_SETTER != null) { try { Map delegate = (Map) TRACKING_MAP_GETTER.invoke(this); + trackingMap = delegate; TRACKING_MAP_SETTER.invoke(this, new ForwardingMap() { @Override protected Map delegate() { @@ -78,6 +80,10 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { this(getTracker(entry), getE(entry), getF(entry), getG(entry), getU(entry)); } + private boolean isTracked(EntityPlayer player) { + return trackingMap != null ? trackingMap.containsKey(player) : trackedPlayers.contains(player); + } + public void updateLastPlayer(EntityPlayer lastUpdatedPlayer) { if (lastUpdatedPlayer == null || tracker.dead || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; @@ -93,16 +99,15 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { @Override public void updatePlayer(final EntityPlayer entityplayer) { - // prevent updates to NPC "viewers" - if (entityplayer instanceof EntityHumanNPC) - return; - if (tracker instanceof NPCHolder) { + if (!tracker.dead && !isTracked(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) return; } + if (entityplayer instanceof NPCHolder) + return; super.updatePlayer(entityplayer); } diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/PlayerlistTrackerEntry.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/PlayerlistTrackerEntry.java index 93b34da3c..34713ee49 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/PlayerlistTrackerEntry.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/PlayerlistTrackerEntry.java @@ -26,12 +26,15 @@ import net.minecraft.server.v1_12_R1.EntityTrackerEntry; public class PlayerlistTrackerEntry extends EntityTrackerEntry { private final Entity tracker; + private Map trackingMap; + public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) { super(entity, i, j, k, flag); this.tracker = getTracker(this); if (TRACKING_MAP_SETTER != null) { try { Map delegate = (Map) TRACKING_MAP_GETTER.invoke(this); + trackingMap = delegate; TRACKING_MAP_SETTER.invoke(this, new ForwardingMap() { @Override protected Map delegate() { @@ -78,6 +81,10 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { this(getTracker(entry), getE(entry), getF(entry), getG(entry), getU(entry)); } + private boolean isTracked(EntityPlayer player) { + return trackingMap != null ? trackingMap.containsKey(player) : trackedPlayers.contains(player); + } + public void updateLastPlayer(EntityPlayer lastUpdatedPlayer) { if (lastUpdatedPlayer == null || tracker.dead || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; @@ -93,7 +100,7 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { @Override public void updatePlayer(final EntityPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.dead && !isTracked(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/PlayerlistTrackerEntry.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/PlayerlistTrackerEntry.java index de1a038cd..6c3f86697 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/PlayerlistTrackerEntry.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/PlayerlistTrackerEntry.java @@ -26,6 +26,7 @@ import net.minecraft.server.v1_13_R2.PacketPlayOutAnimation; public class PlayerlistTrackerEntry extends EntityTrackerEntry { private final Entity tracker; + private Map trackingMap; public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) { super(entity, i, j, k, flag); @@ -33,6 +34,7 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { if (TRACKING_MAP_SETTER != null) { try { Map delegate = (Map) TRACKING_MAP_GETTER.invoke(this); + trackingMap = delegate; TRACKING_MAP_SETTER.invoke(this, new ForwardingMap() { @Override protected Map delegate() { @@ -79,6 +81,10 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { this(getTracker(entry), getE(entry), getF(entry), getG(entry), getU(entry)); } + private boolean isTracked(EntityPlayer player) { + return trackingMap != null ? trackingMap.containsKey(player) : trackedPlayers.contains(player); + } + public void updateLastPlayer(EntityPlayer lastUpdatedPlayer) { if (tracker.dead || lastUpdatedPlayer == null || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; @@ -97,7 +103,7 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { @Override public void updatePlayer(final EntityPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.dead && !isTracked(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/PlayerlistTracker.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/PlayerlistTracker.java index b2eaffa6e..9695cd356 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/PlayerlistTracker.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/PlayerlistTracker.java @@ -27,6 +27,7 @@ import net.minecraft.server.v1_14_R1.PlayerChunkMap.EntityTracker; public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { private final Entity tracker; + private Map trackingMap; public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) { map.super(entity, i, j, flag); @@ -34,6 +35,7 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { if (TRACKING_MAP_SETTER != null) { try { Map delegate = (Map) TRACKING_MAP_GETTER.invoke(this); + trackingMap = delegate; TRACKING_MAP_SETTER.invoke(this, new ForwardingMap() { @Override protected Map delegate() { @@ -80,6 +82,10 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { this(map, getTracker(entry), getTrackingDistance(entry), getD(entry), getE(entry)); } + private boolean isTracked(EntityPlayer player) { + return trackingMap != null ? trackingMap.containsKey(player) : trackedPlayers.contains(player); + } + public void updateLastPlayer(EntityPlayer lastUpdatedPlayer) { if (tracker.dead || lastUpdatedPlayer == null || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; @@ -97,7 +103,7 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { @Override public void updatePlayer(final EntityPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.dead && !isTracked(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/PlayerlistTracker.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/PlayerlistTracker.java index 2bf60fa93..5ac3fe71b 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/PlayerlistTracker.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/PlayerlistTracker.java @@ -27,6 +27,7 @@ import net.minecraft.server.v1_15_R1.PlayerChunkMap.EntityTracker; public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { private final Entity tracker; + private Map trackingMap; public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) { map.super(entity, i, j, flag); @@ -34,6 +35,7 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { if (TRACKING_MAP_SETTER != null) { try { Map delegate = (Map) TRACKING_MAP_GETTER.invoke(this); + trackingMap = delegate; TRACKING_MAP_SETTER.invoke(this, new ForwardingMap() { @Override protected Map delegate() { @@ -80,6 +82,10 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { this(map, getTracker(entry), getTrackingDistance(entry), getD(entry), getE(entry)); } + private boolean isTracked(EntityPlayer player) { + return trackingMap != null ? trackingMap.containsKey(player) : trackedPlayers.contains(player); + } + public void updateLastPlayer(EntityPlayer lastUpdatedPlayer) { if (tracker.dead || lastUpdatedPlayer == null || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; @@ -97,7 +103,7 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { @Override public void updatePlayer(final EntityPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.dead && !isTracked(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerlistTracker.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerlistTracker.java index 7f8687ea7..fd5c31560 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerlistTracker.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerlistTracker.java @@ -27,6 +27,7 @@ import net.minecraft.server.v1_16_R3.PlayerChunkMap.EntityTracker; public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { private final Entity tracker; + private Map trackingMap; public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) { map.super(entity, i, j, flag); @@ -34,6 +35,7 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { if (TRACKING_MAP_SETTER != null) { try { Map delegate = (Map) TRACKING_MAP_GETTER.invoke(this); + trackingMap = delegate; TRACKING_MAP_SETTER.invoke(this, new ForwardingMap() { @Override protected Map delegate() { @@ -80,6 +82,10 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { this(map, getTracker(entry), getTrackingDistance(entry), getD(entry), getE(entry)); } + private boolean isTracked(EntityPlayer player) { + return trackingMap != null ? trackingMap.containsKey(player) : trackedPlayers.contains(player); + } + public void updateLastPlayer(EntityPlayer lastUpdatedPlayer) { if (tracker.dead || lastUpdatedPlayer == null || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; @@ -97,7 +103,7 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { @Override public void updatePlayer(final EntityPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.dead && !isTracked(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerlistTracker.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerlistTracker.java index a2e6cd951..ce4d12287 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerlistTracker.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerlistTracker.java @@ -52,7 +52,7 @@ public class PlayerlistTracker extends ChunkMap.TrackedEntity { @Override public void updatePlayer(final ServerPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.isRemoved() && !seenBy.contains(entityplayer.connection) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); REQUIRES_SYNC = Util.callEventPossiblySync(event, REQUIRES_SYNC); diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerlistTracker.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerlistTracker.java index 04c52f381..de9e9b4be 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerlistTracker.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/PlayerlistTracker.java @@ -52,7 +52,7 @@ public class PlayerlistTracker extends ChunkMap.TrackedEntity { @Override public void updatePlayer(final ServerPlayer entityplayer) { - if (tracker instanceof NPCHolder) { + if (!tracker.isRemoved() && !seenBy.contains(entityplayer.connection) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); REQUIRES_SYNC = Util.callEventPossiblySync(event, REQUIRES_SYNC); diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java index 22c4207f7..52cff0717 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/CitizensEntityTracker.java @@ -79,7 +79,7 @@ public class CitizensEntityTracker extends ChunkMap.TrackedEntity { if (entityplayer instanceof EntityHumanNPC) return; - if (tracker instanceof NPCHolder) { + if (!tracker.isRemoved() && !seenBy.contains(entityplayer.connection) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); REQUIRES_SYNC = Util.callEventPossiblySync(event, REQUIRES_SYNC); diff --git a/v1_20_R1/src/main/java/net/citizensnpcs/nms/v1_20_R1/util/CitizensEntityTracker.java b/v1_20_R1/src/main/java/net/citizensnpcs/nms/v1_20_R1/util/CitizensEntityTracker.java index 661fbcb3f..b8add2943 100644 --- a/v1_20_R1/src/main/java/net/citizensnpcs/nms/v1_20_R1/util/CitizensEntityTracker.java +++ b/v1_20_R1/src/main/java/net/citizensnpcs/nms/v1_20_R1/util/CitizensEntityTracker.java @@ -79,7 +79,7 @@ public class CitizensEntityTracker extends ChunkMap.TrackedEntity { if (entityplayer instanceof EntityHumanNPC) return; - if (tracker instanceof NPCHolder) { + if (!tracker.isRemoved() && !seenBy.contains(entityplayer.connection) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); if (REQUIRES_SYNC == null) { REQUIRES_SYNC = !Bukkit.isPrimaryThread(); diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/PlayerlistTrackerEntry.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/PlayerlistTrackerEntry.java index 311872487..734eb3f98 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/PlayerlistTrackerEntry.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/PlayerlistTrackerEntry.java @@ -55,7 +55,7 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { // prevent updates to NPC "viewers" if (entityplayer instanceof EntityHumanNPC) return; - if (tracker instanceof NPCHolder) { + if (!trackedPlayers.contains(entityplayer) && tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); Bukkit.getPluginManager().callEvent(event);