diff --git a/main/pom.xml b/main/pom.xml index 75791292e..9c66ef7e1 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -236,11 +236,7 @@ net.byteflux.libby clib.net.byteflux.libby - - - org.bstats - net.citizensnpcs.util.metrics - + diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java index 049275243..1cfef9223 100644 --- a/main/src/main/java/net/citizensnpcs/Citizens.java +++ b/main/src/main/java/net/citizensnpcs/Citizens.java @@ -486,7 +486,6 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { Skin.clearCache(); getServer().getPluginManager().callEvent(new CitizensPreReloadEvent()); - saves.reloadFromSource(); saves.loadInto(npcRegistry); diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java index fd26e988f..323b29008 100644 --- a/main/src/main/java/net/citizensnpcs/EventListen.java +++ b/main/src/main/java/net/citizensnpcs/EventListen.java @@ -85,6 +85,7 @@ import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCLeftClickEvent; import net.citizensnpcs.api.event.NPCRemoveEvent; import net.citizensnpcs.api.event.NPCRightClickEvent; +import net.citizensnpcs.api.event.NPCSeenByPlayerEvent; import net.citizensnpcs.api.event.NPCSpawnEvent; import net.citizensnpcs.api.event.NPCVehicleDamageEvent; import net.citizensnpcs.api.event.PlayerCreateNPCEvent; @@ -92,6 +93,7 @@ import net.citizensnpcs.api.event.SpawnReason; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCRegistry; import net.citizensnpcs.api.trait.trait.Owner; +import net.citizensnpcs.api.trait.trait.PlayerFilter; import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.editor.Editor; import net.citizensnpcs.npc.skin.SkinUpdateTracker; @@ -382,6 +384,13 @@ public class EventListen implements Listener { toRespawn.values().remove(event.getNPC()); } + @EventHandler(ignoreCancelled = true) + public void onNPCSeenByPlayer(NPCSeenByPlayerEvent event) { + if (event.getNPC().hasTrait(PlayerFilter.class)) { + event.setCancelled(event.getNPC().getOrAddTrait(PlayerFilter.class).onSeenByPlayer(event.getPlayer())); + } + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onNPCSpawn(NPCSpawnEvent event) { skinUpdateTracker.onNPCSpawn(event.getNPC()); diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java b/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java index 3a382ca1b..1577e4553 100644 --- a/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java +++ b/main/src/main/java/net/citizensnpcs/npc/CitizensTraitFactory.java @@ -64,6 +64,8 @@ import net.citizensnpcs.trait.WolfModifiers; import net.citizensnpcs.trait.WoolColor; import net.citizensnpcs.trait.text.Text; import net.citizensnpcs.trait.waypoint.Waypoints; +import net.citizensnpcs.util.EntityPacketTracker; +import net.citizensnpcs.util.NMS; public class CitizensTraitFactory implements TraitFactory { private final List defaultTraits = Lists.newArrayList(); @@ -98,7 +100,17 @@ public class CitizensTraitFactory implements TraitFactory { registerTrait(TraitInfo.create(Owner.class)); registerTrait(TraitInfo.create(PacketNPC.class)); registerTrait(TraitInfo.create(PausePathfindingTrait.class)); - registerTrait(TraitInfo.create(PlayerFilter.class)); + registerTrait(TraitInfo.create(PlayerFilter.class).withSupplier(() -> new PlayerFilter((p, e) -> { + EntityPacketTracker ept = NMS.getPacketTracker(e); + if (ept != null) { + ept.unlink(p); + } + }, (p, e) -> { + EntityPacketTracker ept = NMS.getPacketTracker(e); + if (ept != null) { + ept.link(p); + } + }))); registerTrait(TraitInfo.create(Poses.class)); registerTrait(TraitInfo.create(Powered.class)); registerTrait(TraitInfo.create(RabbitType.class)); diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java index 203ea2df1..fe6877d96 100644 --- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java @@ -335,7 +335,6 @@ public class HologramTrait extends Trait { continue; line.setText(text); - hologramNPC.data().set(NPC.Metadata.NAMEPLATE_VISIBLE, npc.getRawName().length() > 0); } } @@ -438,12 +437,15 @@ public class HologramTrait extends Trait { this.text = text; if (hologram != null) { - hologram.setName(Placeholders.replace(text, null, npc)); + String name = Placeholders.replace(text, null, npc); + hologram.setName(name); + hologram.data().set(NPC.Metadata.NAMEPLATE_VISIBLE, ChatColor.stripColor(name).length() > 0); } } public void spawnNPC(double height) { - this.hologram = createHologram(Placeholders.replace(text, null, npc), height); + String name = Placeholders.replace(text, null, npc); + this.hologram = createHologram(name, height); } } diff --git a/main/src/main/java/net/citizensnpcs/trait/PacketNPC.java b/main/src/main/java/net/citizensnpcs/trait/PacketNPC.java index 39c97366b..6cf2d99ed 100644 --- a/main/src/main/java/net/citizensnpcs/trait/PacketNPC.java +++ b/main/src/main/java/net/citizensnpcs/trait/PacketNPC.java @@ -26,6 +26,10 @@ public class PacketNPC extends Trait { super("packet"); } + public EntityPacketTracker getPacketTracker() { + return packetTracker; + } + @Override public void onRemove() { npc.despawn(DespawnReason.PENDING_RESPAWN); diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java index 68bcd8079..efc405d9c 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMS.java +++ b/main/src/main/java/net/citizensnpcs/util/NMS.java @@ -52,7 +52,9 @@ import net.citizensnpcs.api.util.EntityDim; import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.npc.ai.MCNavigationStrategy.MCNavigator; import net.citizensnpcs.npc.ai.MCTargetStrategy.TargetNavigator; +import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinnableEntity; +import net.citizensnpcs.trait.PacketNPC; import net.citizensnpcs.trait.versioned.CamelTrait.CamelPose; import net.citizensnpcs.trait.versioned.SnifferTrait.SnifferState; import net.citizensnpcs.util.EntityPacketTracker.PacketAggregator; @@ -441,6 +443,19 @@ public class NMS { return BRIDGE.getNPC(entity); } + public static EntityPacketTracker getPacketTracker(Entity entity) { + if (entity == null) + return null; + if (entity instanceof NPCHolder) { + NPC npc = ((NPCHolder) entity).getNPC(); + if (npc.hasTrait(PacketNPC.class)) + return npc.getOrAddTrait(PacketNPC.class).getPacketTracker(); + } + if (!entity.isValid()) + return null; + return BRIDGE.getPacketTracker(entity); + } + public static List getPassengers(org.bukkit.entity.Entity entity) { return BRIDGE.getPassengers(entity); } diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java index 1ce34c1e9..1f38c5781 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java +++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java @@ -59,7 +59,7 @@ public interface NMSBridge { return packets; } - public EntityPacketTracker createPacketTracker(Entity entity, PacketAggregator agg); + public EntityPacketTracker createPacketTracker(Entity entity, PacketAggregator agg);; public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) throws Throwable; @@ -87,6 +87,8 @@ public interface NMSBridge { public NPC getNPC(Entity entity); + public EntityPacketTracker getPacketTracker(Entity entity); + public List getPassengers(Entity entity); public GameProfile getProfile(Player player); @@ -146,9 +148,9 @@ public interface NMSBridge { public void remove(Entity entity); - public void removeFromServerPlayerList(Player player); + public void removeFromServerPlayerList(Player player);; - public void removeFromWorld(org.bukkit.entity.Entity entity);; + public void removeFromWorld(org.bukkit.entity.Entity entity); public void removeHookIfNecessary(NPCRegistry npcRegistry, FishHook entity); @@ -167,15 +169,15 @@ public interface NMSBridge { public void sendTeamPacket(Player recipient, Team team, int mode); default public void setAggressive(Entity entity, boolean aggro) { - } + }; public default void setAllayDancing(Entity entity, boolean dancing) { throw new UnsupportedOperationException(); - } + }; public void setBodyYaw(Entity entity, float yaw);; - public void setBoundingBox(Entity entity, BoundingBox box);; + public void setBoundingBox(Entity entity, BoundingBox box); public default void setCamelPose(Entity entity, CamelPose pose) { throw new UnsupportedOperationException(); @@ -183,7 +185,7 @@ public interface NMSBridge { public void setCustomName(Entity entity, Object component, String string); - public void setDestination(Entity entity, double x, double y, double z, float speed);; + public void setDestination(Entity entity, double x, double y, double z, float speed); public void setDimensions(Entity entity, EntityDim desired); diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java index 1ccaa7bc4..6cc07e02f 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java @@ -506,6 +506,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTrackerEntry entry = server.getTracker().trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 a7bf16d3f..4ba752ec6 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 @@ -2,9 +2,11 @@ package net.citizensnpcs.nms.v1_10_R1.util; import java.lang.reflect.Field; +import org.bukkit.Bukkit; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import net.citizensnpcs.api.event.NPCSeenByPlayerEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_10_R1.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -29,9 +31,14 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { if (entityplayer instanceof EntityHumanNPC) return; Entity tracker = getTracker(this); - if ((tracker instanceof NPCHolder - && ((NPCHolder) tracker).getNPC().isHiddenFrom(entityplayer.getBukkitEntity())) || tracker.dead - || tracker.getBukkitEntity().getType() != EntityType.PLAYER) + if (tracker instanceof NPCHolder) { + NPC npc = ((NPCHolder) tracker).getNPC(); + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return; + } + if (tracker.dead || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; if (entityplayer != tracker && c(entityplayer)) { if (!this.trackedPlayers.contains(entityplayer) diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java index 38750c620..6f20b0287 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java @@ -527,6 +527,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTrackerEntry entry = server.getTracker().trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 f372824e3..69af8b0e0 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 @@ -2,9 +2,11 @@ package net.citizensnpcs.nms.v1_11_R1.util; import java.lang.reflect.Field; +import org.bukkit.Bukkit; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +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; @@ -29,9 +31,14 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { if (entityplayer instanceof EntityHumanNPC) return; Entity tracker = getTracker(this); - if ((tracker instanceof NPCHolder - && ((NPCHolder) tracker).getNPC().isHiddenFrom(entityplayer.getBukkitEntity())) || tracker.dead - || tracker.getBukkitEntity().getType() != EntityType.PLAYER) + if (tracker instanceof NPCHolder) { + NPC npc = ((NPCHolder) tracker).getNPC(); + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return; + } + if (tracker.dead || tracker.getBukkitEntity().getType() != EntityType.PLAYER) return; if (entityplayer != tracker && c(entityplayer)) { if (!this.trackedPlayers.contains(entityplayer) diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java index 5f676b75e..5c08dbc03 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java @@ -532,6 +532,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTrackerEntry entry = server.getTracker().trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 f9743deab..374c1f1b7 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 @@ -9,6 +9,7 @@ import org.bukkit.entity.Player; 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_12_R1.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -56,7 +57,9 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { public void updatePlayer(final EntityPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java index 9beec21b9..97f7428f4 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java @@ -556,6 +556,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTrackerEntry entry = server.getTracker().trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 e60aea7d3..6b28ba846 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 @@ -9,6 +9,7 @@ import org.bukkit.entity.Player; 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_13_R2.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -55,7 +56,9 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { public void updatePlayer(final EntityPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java index a4cd20bd1..331d98e96 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java @@ -592,6 +592,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTracker entry = server.getChunkProvider().playerChunkMap.trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 c146ce029..f84b6d697 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 @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; 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_14_R1.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -50,7 +51,9 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { public void updatePlayer(final EntityPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java index 29800abcd..3b6296b3f 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java @@ -607,6 +607,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTracker entry = server.getChunkProvider().playerChunkMap.trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 4fc2937b5..5a22c326e 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 @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; 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_15_R1.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -50,7 +51,9 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { public void updatePlayer(final EntityPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java index a7eb88045..01ec2987d 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java @@ -623,6 +623,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTracker entry = server.getChunkProvider().playerChunkMap.trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 b35e932d4..24b3fe42c 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 @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; 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_16_R3.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -52,7 +53,9 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker { public void updatePlayer(final EntityPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java index 8ad2f93ad..e512f7c2c 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java @@ -633,6 +633,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + ServerLevel server = (ServerLevel) getHandle(entity).level; + TrackedEntity entry = server.getChunkProvider().chunkMap.G.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((ServerPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.removePlayer((ServerPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.broadcastRemoved(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); 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 75fed751d..ecfdef60d 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 @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; 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_17_R1.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -53,7 +54,9 @@ public class PlayerlistTracker extends ChunkMap.TrackedEntity { public void updatePlayer(final ServerPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java index 1c36a18b9..36d0e6a7f 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java @@ -639,6 +639,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + ServerLevel server = (ServerLevel) getHandle(entity).level; + TrackedEntity entry = server.getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((ServerPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.removePlayer((ServerPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.broadcastRemoved(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = NMSImpl.getHandle(entity); @@ -1241,11 +1269,9 @@ public class NMSImpl implements NMSBridge { float oldPitch = handle.getXRot(); handle.setYBodyRot(bodyYaw); handle.setXRot(pitch); - sendPacketsNearby(null, from.getLocation(), new ClientboundTeleportEntityPacket(handle), // new - // ClientboundMoveEntityPacket.Rot(handle.getId(), - // (byte) (bodyYaw * - // 256.0F / 360.0F), - // (byte) (pitch * 256.0F / 360.0F), handle.onGround), + sendPacketsNearby(null, from.getLocation(), new ClientboundTeleportEntityPacket(handle), + // newClientboundMoveEntityPacket.Rot(handle.getId(), (byte) (bodyYaw *256.0F / 360.0F), (byte) (pitch * + // 256.0F / 360.0F), handle.onGround), new ClientboundRotateHeadPacket(handle, (byte) (headYaw * 256.0F / 360.0F))); handle.setYBodyRot(oldBody); handle.setXRot(oldPitch); 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 8411b4ba4..7c2b257ba 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 @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; 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_18_R2.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -53,7 +54,9 @@ public class PlayerlistTracker extends ChunkMap.TrackedEntity { public void updatePlayer(final ServerPlayer entityplayer) { if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null 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 17e789f95..e7972454b 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 @@ -11,6 +11,7 @@ import com.google.common.collect.ForwardingSet; 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_19_R3.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -74,9 +75,14 @@ public class CitizensEntityTracker extends ChunkMap.TrackedEntity { @Override public void updatePlayer(final ServerPlayer entityplayer) { + if (entityplayer instanceof EntityHumanNPC) + return; + if (tracker instanceof NPCHolder) { NPC npc = ((NPCHolder) tracker).getNPC(); - if (npc.isHiddenFrom(entityplayer.getBukkitEntity())) + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; Integer trackingRange = npc.data(). get(NPC.Metadata.TRACKING_RANGE); if (TRACKING_RANGE_SETTER != null && trackingRange != null @@ -90,9 +96,6 @@ public class CitizensEntityTracker extends ChunkMap.TrackedEntity { } } - if (entityplayer instanceof EntityHumanNPC) - return; - super.updatePlayer(entityplayer); } diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java index bc0cce68b..45f0c1ec7 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java @@ -671,6 +671,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + ServerLevel server = (ServerLevel) getHandle(entity).level; + TrackedEntity entry = server.getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((ServerPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.removePlayer((ServerPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.broadcastRemoved(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); @@ -2476,7 +2504,6 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENTS_PLAYER_SETTER = NMS.getFirstFinalSetter(ServerPlayer.class, PlayerAdvancements.class); - private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getFirstGetter(AttributeSupplier.class, Map.class); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFirstFinalSetter(AttributeSupplier.class, Map.class); diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java index beb518c8e..aaf9be50a 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java @@ -460,6 +460,34 @@ public class NMSImpl implements NMSBridge { return handle instanceof NPCHolder ? ((NPCHolder) handle).getNPC() : null; } + @Override + public EntityPacketTracker getPacketTracker(org.bukkit.entity.Entity entity) { + WorldServer server = (WorldServer) NMSImpl.getHandle(entity).getWorld(); + EntityTrackerEntry entry = server.getTracker().trackedEntities.get(entity.getEntityId()); + if (entry == null) + return null; + return new EntityPacketTracker() { + @Override + public void link(Player player) { + entry.updatePlayer((EntityPlayer) getHandle(player)); + } + + @Override + public void run() { + } + + @Override + public void unlink(Player player) { + entry.clear((EntityPlayer) getHandle(player)); + } + + @Override + public void unlinkAll(Consumer callback) { + entry.a(); + } + }; + } + @Override public List getPassengers(org.bukkit.entity.Entity entity) { Entity passenger = NMSImpl.getHandle(entity).passenger; 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 ef567f09d..311872487 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 @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; 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_8_R3.entity.EntityHumanNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -52,9 +53,15 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { @Override public void updatePlayer(final EntityPlayer entityplayer) { // prevent updates to NPC "viewers" - if ((entityplayer instanceof EntityHumanNPC) || (tracker instanceof NPCHolder - && ((NPCHolder) tracker).getNPC().isHiddenFrom(entityplayer.getBukkitEntity()))) + if (entityplayer instanceof EntityHumanNPC) return; + if (tracker instanceof NPCHolder) { + NPC npc = ((NPCHolder) tracker).getNPC(); + NPCSeenByPlayerEvent event = new NPCSeenByPlayerEvent(npc, entityplayer.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return; + } lastUpdatedPlayer = entityplayer; super.updatePlayer(entityplayer); lastUpdatedPlayer = null;