From bd172a100aa9e2d12a0b8db616837809a26cd6f3 Mon Sep 17 00:00:00 2001 From: Kneesnap Date: Wed, 25 Sep 2019 15:02:37 -0700 Subject: [PATCH] Fully fix kick bug for all versions. The problem was that if a scoreboard team is sent while it's already registered, the player will disconnect. Since there does not appear to be any downside to never removing the team, we just won't remove the team, and send the team only once. If there are any problems with this in the future, we can implement a smart solution which will be able to handle the packet sending properly. --- .../jitse/npclib/internal/PacketHandler.java | 2 +- .../net/jitse/npclib/internal/SimpleNPC.java | 23 +++++++------- .../jitse/npclib/listeners/ChunkListener.java | 2 +- .../npclib/listeners/PlayerListener.java | 10 +++---- .../npclib/nms/v1_10_R1/NPC_v1_10_R1.java | 29 ++++++++---------- .../npclib/nms/v1_11_R1/NPC_v1_11_R1.java | 29 ++++++++---------- .../npclib/nms/v1_12_R1/NPC_v1_12_R1.java | 30 ++++++++----------- .../npclib/nms/v1_13_R1/NPC_v1_13_R1.java | 30 ++++++++----------- .../npclib/nms/v1_13_R2/NPC_v1_13_R2.java | 29 ++++++++---------- .../npclib/nms/v1_14_R1/NPC_v1_14_R1.java | 29 ++++++++---------- .../jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java | 28 ++++++++--------- .../jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java | 29 ++++++++---------- .../jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java | 29 ++++++++---------- .../jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java | 30 ++++++++----------- .../jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java | 29 ++++++++---------- 15 files changed, 160 insertions(+), 198 deletions(-) diff --git a/api/src/main/java/net/jitse/npclib/internal/PacketHandler.java b/api/src/main/java/net/jitse/npclib/internal/PacketHandler.java index 5257bd4..2c4ea29 100755 --- a/api/src/main/java/net/jitse/npclib/internal/PacketHandler.java +++ b/api/src/main/java/net/jitse/npclib/internal/PacketHandler.java @@ -15,5 +15,5 @@ interface PacketHandler { void sendShowPackets(Player player); - void sendHidePackets(Player player, boolean scheduler); + void sendHidePackets(Player player); } diff --git a/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java b/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java index 74d0a98..497dc2b 100644 --- a/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java +++ b/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java @@ -58,20 +58,14 @@ public abstract class SimpleNPC implements NPC, PacketHandler { this.skin = skin; gameProfile.getProperties().get("textures").clear(); - - if (skin != null) { + if (skin != null) gameProfile.getProperties().put("textures", new Property("textures", skin.getValue(), skin.getSignature())); - } return this; } @Override public void destroy() { - destroy(true); - } - - public void destroy(boolean scheduler) { NPCManager.remove(this); // Destroy NPC for every player that is still seeing it. @@ -80,7 +74,7 @@ public abstract class SimpleNPC implements NPC, PacketHandler { continue; } - hide(Bukkit.getPlayer(uuid), true, scheduler); + hide(Bukkit.getPlayer(uuid), true); } } @@ -131,6 +125,11 @@ public abstract class SimpleNPC implements NPC, PacketHandler { return this; } + public void onLogout(Player player) { + getAutoHidden().remove(player.getUniqueId()); + getShown().remove(player.getUniqueId()); // Don't need to use NPC#hide since the entity is not registered in the NMS server. + } + @Override public void show(Player player) { show(player, false); @@ -181,10 +180,10 @@ public abstract class SimpleNPC implements NPC, PacketHandler { @Override public void hide(Player player) { - hide(player, false, true); + hide(player, false); } - public void hide(Player player, boolean auto, boolean scheduler) { + public void hide(Player player, boolean auto) { NPCHideEvent event = new NPCHideEvent(this, player, auto); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -192,7 +191,7 @@ public abstract class SimpleNPC implements NPC, PacketHandler { } if (auto) { - sendHidePackets(player, scheduler); + sendHidePackets(player); } else { if (!shown.contains(player.getUniqueId())) { throw new RuntimeException("Cannot call hide method without calling NPC#show."); @@ -202,7 +201,7 @@ public abstract class SimpleNPC implements NPC, PacketHandler { if (player.getWorld().equals(location.getWorld()) && player.getLocation().distance(location) <= instance.getAutoHideDistance()) { - sendHidePackets(player, scheduler); + sendHidePackets(player); } else { autoHidden.remove(player.getUniqueId()); } diff --git a/api/src/main/java/net/jitse/npclib/listeners/ChunkListener.java b/api/src/main/java/net/jitse/npclib/listeners/ChunkListener.java index 29ce768..ab42b7d 100755 --- a/api/src/main/java/net/jitse/npclib/listeners/ChunkListener.java +++ b/api/src/main/java/net/jitse/npclib/listeners/ChunkListener.java @@ -46,7 +46,7 @@ public class ChunkListener implements Listener { continue; } - npc.hide(Bukkit.getPlayer(uuid), true, true); + npc.hide(Bukkit.getPlayer(uuid), true); } } } diff --git a/api/src/main/java/net/jitse/npclib/listeners/PlayerListener.java b/api/src/main/java/net/jitse/npclib/listeners/PlayerListener.java index 055c2f2..2393124 100755 --- a/api/src/main/java/net/jitse/npclib/listeners/PlayerListener.java +++ b/api/src/main/java/net/jitse/npclib/listeners/PlayerListener.java @@ -38,10 +38,8 @@ public class PlayerListener implements Listener { } private void onPlayerLeave(Player player) { - for (SimpleNPC npc : NPCManager.getAllNPCs()) { - npc.getAutoHidden().remove(player.getUniqueId()); - npc.getShown().remove(player.getUniqueId()); // Don't need to use NPC#hide since the entity is not registered in the NMS server. - } + for (SimpleNPC npc : NPCManager.getAllNPCs()) + npc.onLogout(player); } @EventHandler @@ -54,7 +52,7 @@ public class PlayerListener implements Listener { if (npc.getWorld().equals(from)) { if (!npc.getAutoHidden().contains(player.getUniqueId())) { npc.getAutoHidden().add(player.getUniqueId()); - npc.hide(player, true, false); + npc.hide(player, true); } } } @@ -103,7 +101,7 @@ public class PlayerListener implements Listener { // Check if the player and NPC are out of range to sendHidePackets it. if (!inRange) { npc.getAutoHidden().add(player.getUniqueId()); - npc.hide(player, true, true); + npc.hide(player, true); } } } diff --git a/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java index 3438a45..cc1b3df 100755 --- a/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java +++ b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_10_R1 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_10_R1(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_10_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -84,20 +90,11 @@ public class NPC_v1_10_R1 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java index 055de27..31b0472 100755 --- a/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java +++ b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_11_R1 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_11_R1(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_11_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -84,20 +90,11 @@ public class NPC_v1_11_R1 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java index 6754757..eebda05 100755 --- a/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java +++ b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java @@ -17,19 +17,22 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra */ public class NPC_v1_12_R1 extends SimpleNPC { - private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_12_R1(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +63,20 @@ public class NPC_v1_12_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -83,20 +88,11 @@ public class NPC_v1_12_R1 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTask(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister)); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java index db05c74..e54bccf 100755 --- a/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java +++ b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_13_R1 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_13_R1(NPCLib instance, List lines) { super(instance, lines); @@ -60,44 +64,36 @@ public class NPC_v1_13_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); hologram.spawn(player); - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java index 54ac946..ef456e5 100755 --- a/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java +++ b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_13_R2 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_13_R2(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_13_R2 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -84,20 +90,11 @@ public class NPC_v1_13_R2 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java index bb799d6..19125b5 100755 --- a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java +++ b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java @@ -13,7 +13,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -22,10 +25,11 @@ public class NPC_v1_14_R1 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_14_R1(NPCLib instance, List lines) { super(instance, lines); @@ -56,18 +60,20 @@ public class NPC_v1_14_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -80,20 +86,11 @@ public class NPC_v1_14_R1 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java b/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java index 5554652..b60bdd5 100755 --- a/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java +++ b/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_8_R1 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_8_R1(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_8_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -83,20 +89,12 @@ public class NPC_v1_8_R1 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java b/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java index 94e51ca..8357855 100755 --- a/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java +++ b/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_8_R2 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_8_R2(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_8_R2 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -83,20 +89,11 @@ public class NPC_v1_8_R2 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java b/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java index 0b4d990..b7742b6 100755 --- a/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java +++ b/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_8_R3 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_8_R3(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_8_R3 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -84,20 +90,11 @@ public class NPC_v1_8_R3 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java b/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java index 1bb2f2e..42ea977 100755 --- a/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java +++ b/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_9_R1 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_9_R1(NPCLib instance, List lines) { super(instance, lines); @@ -60,44 +64,36 @@ public class NPC_v1_9_R1 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); hologram.spawn(player); - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } } diff --git a/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java b/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java index 550af84..e5bd316 100755 --- a/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java +++ b/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java @@ -17,7 +17,10 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; import org.bukkit.entity.Player; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; /** * @author Jitse Boonstra @@ -26,10 +29,11 @@ public class NPC_v1_9_R2 extends SimpleNPC { private Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; - private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister, packetPlayOutScoreboardTeamUnregister; + private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation; private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy; + private Set hasTeamRegistered = new HashSet<>(); public NPC_v1_9_R2(NPCLib instance, List lines) { super(instance, lines); @@ -60,18 +64,20 @@ public class NPC_v1_9_R2 extends SimpleNPC { // Packet for destroying the NPC: this.packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(entityId); // First packet to send. + } - // Second packet to send is "packetPlayOutPlayerInfoRemove". - - this.packetPlayOutScoreboardTeamUnregister = new PacketPlayOutScoreboardTeamWrapper() - .createUnregisterTeam(name); // Third packet to send. + @Override + public void onLogout(Player player) { + super.onLogout(player); + hasTeamRegistered.remove(player.getUniqueId()); } @Override public void sendShowPackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; - playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); + if (hasTeamRegistered.add(player.getUniqueId())) + playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister); playerConnection.sendPacket(packetPlayOutPlayerInfoAdd); playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); @@ -84,20 +90,11 @@ public class NPC_v1_9_R2 extends SimpleNPC { } @Override - public void sendHidePackets(Player player, boolean scheduler) { + public void sendHidePackets(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); - - if (scheduler) { - // Sending this a bit later so the player doesn't see the name (for that split second). - Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister), 5); - } else { - playerConnection.sendPacket(packetPlayOutScoreboardTeamUnregister); - } } }