From 4b9c4a97c354ad74059e44a760963df672c871f1 Mon Sep 17 00:00:00 2001 From: MrMicky Date: Thu, 21 Feb 2019 16:52:13 +0100 Subject: [PATCH 1/2] Remove unnecessary contains before add and remove on HashSet --- commons/src/main/java/net/jitse/npclib/api/NPC.java | 12 +++--------- .../net/jitse/npclib/listeners/PlayerListener.java | 8 ++------ 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/commons/src/main/java/net/jitse/npclib/api/NPC.java b/commons/src/main/java/net/jitse/npclib/api/NPC.java index 5d3d59d..a37227a 100755 --- a/commons/src/main/java/net/jitse/npclib/api/NPC.java +++ b/commons/src/main/java/net/jitse/npclib/api/NPC.java @@ -132,9 +132,7 @@ public abstract class NPC implements PacketHandler, ActionHandler { shown.add(player.getUniqueId()); } - if (!autoHidden.contains(player.getUniqueId())) { - autoHidden.add(player.getUniqueId()); - } + autoHidden.add(player.getUniqueId()); return; } @@ -154,9 +152,7 @@ public abstract class NPC implements PacketHandler, ActionHandler { if (player.getLocation().distance(location) <= autoHideDistance) { sendShowPackets(player); } else { - if (!autoHidden.contains(player.getUniqueId())) { - autoHidden.add(player.getUniqueId()); - } + autoHidden.add(player.getUniqueId()); } } } @@ -189,9 +185,7 @@ public abstract class NPC implements PacketHandler, ActionHandler { if (player.getWorld().equals(location.getWorld()) && player.getLocation().distance(location) <= autoHideDistance) { sendHidePackets(player, scheduler); } else { - if (autoHidden.contains(player.getUniqueId())) { - autoHidden.remove(player.getUniqueId()); - } + autoHidden.remove(player.getUniqueId()); } } } diff --git a/commons/src/main/java/net/jitse/npclib/listeners/PlayerListener.java b/commons/src/main/java/net/jitse/npclib/listeners/PlayerListener.java index 18a5995..e613ad2 100755 --- a/commons/src/main/java/net/jitse/npclib/listeners/PlayerListener.java +++ b/commons/src/main/java/net/jitse/npclib/listeners/PlayerListener.java @@ -25,14 +25,10 @@ public class PlayerListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); for (NPC npc : NPCManager.getAllNPCs()) { - if (npc.getAutoHidden().contains(player.getUniqueId())) { - npc.getAutoHidden().remove(player.getUniqueId()); - } + npc.getAutoHidden().remove(player.getUniqueId()); // Don't need to use NPC#hide since the entity is not registered in the NMS server. - if (npc.getShown().contains(player.getUniqueId())) { - npc.getShown().remove(player.getUniqueId()); - } + npc.getShown().remove(player.getUniqueId()); } } From 09bf2d3a58e5e2365b4e08c34fa3568fce2986fc Mon Sep 17 00:00:00 2001 From: MrMicky Date: Thu, 21 Feb 2019 16:52:36 +0100 Subject: [PATCH 2/2] Use reflection based legacy detection (fix #12) --- commons/pom.xml | 28 ++--- .../main/java/net/jitse/npclib/NPCLib.java | 10 +- .../npclib/listeners/PacketListener.java | 103 ++++++++---------- 3 files changed, 64 insertions(+), 77 deletions(-) diff --git a/commons/pom.xml b/commons/pom.xml index 981a1a5..b05b704 100755 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -12,18 +12,20 @@ npclib-commons - - - - - - - - - - - - + @@ -36,7 +38,7 @@ io.netty netty-all - 4.1.33.Final + 4.0.23.Final provided diff --git a/commons/src/main/java/net/jitse/npclib/NPCLib.java b/commons/src/main/java/net/jitse/npclib/NPCLib.java index c3e5843..6df0fba 100755 --- a/commons/src/main/java/net/jitse/npclib/NPCLib.java +++ b/commons/src/main/java/net/jitse/npclib/NPCLib.java @@ -10,8 +10,6 @@ import net.jitse.npclib.listeners.PacketListener; import net.jitse.npclib.listeners.PlayerListener; import net.jitse.npclib.logging.NPCLibLogger; import net.jitse.npclib.skin.Skin; -import org.bukkit.Bukkit; -import org.bukkit.Server; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -24,7 +22,6 @@ import java.util.logging.Logger; */ public class NPCLib { - private final Server server; private final JavaPlugin plugin; private final Class npcClass; @@ -32,13 +29,12 @@ public class NPCLib { public NPCLib(JavaPlugin plugin) { this.plugin = plugin; - this.server = plugin.getServer(); this.logger = new NPCLibLogger(plugin); // TODO: Change this variable to a dynamic variable (maven file filtering?). // logger.info("Initiating NPCLib v1.4"); - String versionName = server.getClass().getPackage().getName().split("\\.")[3]; + String versionName = plugin.getServer().getClass().getPackage().getName().split("\\.")[3]; Class npcClass = null; @@ -62,13 +58,13 @@ public class NPCLib { } private void registerInternal() { - PluginManager pluginManager = server.getPluginManager(); + PluginManager pluginManager = plugin.getServer().getPluginManager(); pluginManager.registerEvents(new PlayerListener(), plugin); pluginManager.registerEvents(new ChunkListener(), plugin); // Boot the according packet listener. - new PacketListener().start(plugin, Bukkit.getBukkitVersion().contains("1.7")); + new PacketListener().start(plugin); } /** diff --git a/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java b/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java index 5e700d0..f79b004 100755 --- a/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java +++ b/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java @@ -13,7 +13,7 @@ import net.jitse.npclib.events.NPCInteractEvent; import net.jitse.npclib.events.click.ClickType; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.Plugin; import java.util.HashSet; import java.util.Set; @@ -34,40 +34,26 @@ public class PacketListener { // Prevent players from clicking at very high speeds. private final Set delay = new HashSet<>(); - public void start(JavaPlugin plugin, boolean is1_7) { - if (is1_7) { + private Plugin plugin; + + public void start(Plugin plugin) { + this.plugin = plugin; + + boolean legacyProtocol = false; + + try { + Class.forName("io.netty.channel.Channel"); + } catch (ClassNotFoundException e) { + legacyProtocol = true; + } + + if (legacyProtocol) { // 1.7 R4 packet interaction. new LegacyTinyProtocol(plugin) { @Override public Object onPacketInAsync(Player player, Object packet) { - - if (packetPlayInUseEntityClazz.isInstance(packet)) { - NPC npc = NPCManager.getAllNPCs().stream().filter( - check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet)) - .findFirst().orElse(null); - - if (npc == null) { - // Default player, not doing magic with the packet. - return super.onPacketInAsync(player, packet); - } - - if (delay.contains(player.getUniqueId())) { - return null; - } - - ClickType clickType = actionField.get(packet).toString() - .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK; - - Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc)); - - UUID uuid = player.getUniqueId(); - delay.add(uuid); - Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid)); - return null; - } - - return super.onPacketInAsync(player, packet); + return handleInteractPacket(player, packet) ? super.onPacketInAsync(player, packet) : null; } }; } else { @@ -76,35 +62,38 @@ public class PacketListener { @Override public Object onPacketInAsync(Player player, Object packet) { - - if (packetPlayInUseEntityClazz.isInstance(packet)) { - NPC npc = NPCManager.getAllNPCs().stream().filter( - check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet)) - .findFirst().orElse(null); - - if (npc == null) { - // Default player, not doing magic with the packet. - return super.onPacketInAsync(player, packet); - } - - if (delay.contains(player.getUniqueId())) { - return null; - } - - ClickType clickType = actionField.get(packet).toString() - .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK; - - Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc)); - - UUID uuid = player.getUniqueId(); - delay.add(uuid); - Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid)); - return null; - } - - return super.onPacketInAsync(player, packet); + return handleInteractPacket(player, packet) ? super.onPacketInAsync(player, packet) : null; } }; } } + + private boolean handleInteractPacket(Player player, Object packet) { + if (packetPlayInUseEntityClazz.isInstance(packet)) { + NPC npc = NPCManager.getAllNPCs().stream().filter( + check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet)) + .findFirst().orElse(null); + + if (npc == null) { + // Default player, not doing magic with the packet. + return true; + } + + if (delay.contains(player.getUniqueId())) { + return false; + } + + ClickType clickType = actionField.get(packet).toString() + .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK; + + Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc)); + + UUID uuid = player.getUniqueId(); + delay.add(uuid); + Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid)); + return false; + } + + return true; + } }