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 858d01b30..01f204ef5 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 @@ -31,7 +31,7 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { public void updateLastPlayer() { if (lastUpdatedPlayer == null) return; - Entity tracker = getTracker(this); + final Entity tracker = getTracker(this); final EntityPlayer entityplayer = lastUpdatedPlayer; NMS.sendTabListAdd(entityplayer.getBukkitEntity(), (Player) tracker.getBukkitEntity()); lastUpdatedPlayer = null; diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java index 5b199947e..bd5694d83 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java @@ -30,6 +30,7 @@ import net.citizensnpcs.nms.v1_8_R3.util.PlayerControllerJump; import net.citizensnpcs.nms.v1_8_R3.util.PlayerControllerLook; import net.citizensnpcs.nms.v1_8_R3.util.PlayerControllerMove; import net.citizensnpcs.nms.v1_8_R3.util.PlayerNavigation; +import net.citizensnpcs.nms.v1_8_R3.util.PlayerlistTrackerEntry; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.skin.SkinPacketTracker; @@ -42,6 +43,7 @@ import net.minecraft.server.v1_8_R3.AttributeInstance; import net.minecraft.server.v1_8_R3.Block; import net.minecraft.server.v1_8_R3.BlockPosition; import net.minecraft.server.v1_8_R3.DamageSource; +import net.minecraft.server.v1_8_R3.DataWatcher; import net.minecraft.server.v1_8_R3.Entity; import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.EnumProtocolDirection; @@ -59,12 +61,12 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable private PlayerControllerJump controllerJump; private PlayerControllerLook controllerLook; private PlayerControllerMove controllerMove; - private boolean isTracked = false; private int jumpTicks = 0; private PlayerNavigation navigation; private final CitizensNPC npc; private final Location packetLocationCache = new Location(null, 0, 0, 0); private final SkinPacketTracker skinTracker; + private PlayerlistTrackerEntry trackerEntry; private int updateCounter = 0; public EntityHumanNPC(MinecraftServer minecraftServer, WorldServer world, GameProfile gameProfile, @@ -90,7 +92,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable @Override public boolean a(EntityPlayer entityplayer) { - if (npc != null && !isTracked) { + if (npc != null && trackerEntry == null) { return false; } return super.a(entityplayer); @@ -211,6 +213,14 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable return controllerMove; } + @Override + public DataWatcher getDataWatcher() { + if (trackerEntry != null && trackerEntry.isUpdating()) { + trackerEntry.updateLastPlayer(); + } + return super.getDataWatcher(); + } + public NavigationAbstract getNavigation() { return navigation; } @@ -352,8 +362,8 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable controllerLook.a(target.getX(), target.getY(), target.getZ(), 10, 40); } - public void setTracked() { - isTracked = true; + public void setTracked(PlayerlistTrackerEntry trackerEntry) { + this.trackerEntry = trackerEntry; } @Override 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 ebdc8eb37..4ab7922b4 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 @@ -772,7 +772,7 @@ public class NMSImpl implements NMSBridge { } } if (getHandle(player) instanceof EntityHumanNPC) { - ((EntityHumanNPC) getHandle(player)).setTracked(); + ((EntityHumanNPC) getHandle(player)).setTracked(replace); } } 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 cfae19993..503ebf800 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 @@ -2,16 +2,20 @@ package net.citizensnpcs.nms.v1_8_R3.util; import java.lang.reflect.Field; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import net.citizensnpcs.Settings.Setting; +import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.nms.v1_8_R3.entity.EntityHumanNPC; -import net.citizensnpcs.npc.skin.SkinnableEntity; import net.citizensnpcs.util.NMS; import net.minecraft.server.v1_8_R3.Entity; import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.EntityTrackerEntry; public class PlayerlistTrackerEntry extends EntityTrackerEntry { + private EntityPlayer lastUpdatedPlayer; + public PlayerlistTrackerEntry(Entity entity, int i, int j, boolean flag) { super(entity, i, j, flag); } @@ -20,28 +24,35 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry { this(getTracker(entry), getB(entry), getC(entry), getU(entry)); } + public boolean isUpdating() { + return lastUpdatedPlayer != null; + } + + public void updateLastPlayer() { + if (lastUpdatedPlayer == null) + return; + final Entity tracker = getTracker(this); + final EntityPlayer entityplayer = lastUpdatedPlayer; + NMS.sendTabListAdd(entityplayer.getBukkitEntity(), (Player) tracker.getBukkitEntity()); + lastUpdatedPlayer = null; + if (!Setting.DISABLE_TABLIST.asBoolean()) + return; + Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() { + @Override + public void run() { + NMS.sendTabListRemove(entityplayer.getBukkitEntity(), (Player) tracker.getBukkitEntity()); + } + }); + } + @Override public void updatePlayer(final EntityPlayer entityplayer) { // prevent updates to NPC "viewers" if (entityplayer instanceof EntityHumanNPC) return; - Entity tracker = getTracker(this); - if (entityplayer != tracker && c(entityplayer)) { - if (!this.trackedPlayers.contains(entityplayer) - && ((entityplayer.u().getPlayerChunkMap().a(entityplayer, tracker.ae, tracker.ag)) - || (tracker.attachedToPlayer))) { - if ((tracker instanceof SkinnableEntity)) { - SkinnableEntity skinnable = (SkinnableEntity) tracker; - - Player player = skinnable.getBukkitEntity(); - if (!entityplayer.getBukkitEntity().canSee(player)) - return; - - skinnable.getSkinTracker().updateViewer(entityplayer.getBukkitEntity()); - } - } - } + lastUpdatedPlayer = entityplayer; super.updatePlayer(entityplayer); + lastUpdatedPlayer = null; } private static int getB(EntityTrackerEntry entry) {