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;