From f4a80f131db8a4945e3dba9673a2b258005dc176 Mon Sep 17 00:00:00 2001 From: MrMicky Date: Mon, 16 Apr 2018 04:08:23 +0200 Subject: [PATCH 1/4] Add .gitignore --- .gitignore | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..108e0cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Eclipse +.classpath +.project +.settings/ + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# Maven +log/ +target/ \ No newline at end of file From 8d0b7b11c7d4efebc1aa1c9bd90df39261c9ecc5 Mon Sep 17 00:00:00 2001 From: MrMicky Date: Mon, 16 Apr 2018 04:10:30 +0200 Subject: [PATCH 2/4] Allow NPC without Skin + despawn on destroy + optimisations --- src/net/jitse/npclib/api/NPC.java | 15 ++++++++------- .../npclib/listeners/PlayerMoveListener.java | 17 +++++++++++++---- src/net/jitse/npclib/plugin/NPCLibPlugin.java | 9 ++++----- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/net/jitse/npclib/api/NPC.java b/src/net/jitse/npclib/api/NPC.java index cdb08b8..c68cb6a 100644 --- a/src/net/jitse/npclib/api/NPC.java +++ b/src/net/jitse/npclib/api/NPC.java @@ -11,6 +11,7 @@ import net.jitse.npclib.events.NPCDestroyEvent; import net.jitse.npclib.events.NPCSpawnEvent; import net.jitse.npclib.events.trigger.TriggerType; import net.jitse.npclib.skin.Skin; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -38,27 +39,27 @@ public abstract class NPC { protected Location location; public NPC(JavaPlugin plugin, Skin skin, double autoHideDistance, List lines) { - if (skin == null) { - throw new IllegalArgumentException("Skin cannot be null."); - } - this.plugin = plugin; this.skin = skin; this.autoHideDistance = autoHideDistance; - this.lines = (lines == null ? new ArrayList<>() : lines); + this.lines = (lines == null ? Collections.emptyList() : lines); NPCManager.add(this); } protected GameProfile generateGameProfile(UUID uuid, String name) { GameProfile gameProfile = new GameProfile(uuid, name); - gameProfile.getProperties().removeAll("textures"); - gameProfile.getProperties().put("textures", new Property("textures", skin.getValue(), skin.getSignature())); + + if (skin != null) { + gameProfile.getProperties().put("textures", new Property("textures", skin.getValue(), skin.getSignature())); + } + return gameProfile; } public void destroy() { NPCManager.remove(this); + shown.stream().filter(u -> !autoHidden.contains(u)).forEach(u -> hide(Bukkit.getPlayer(u), true)); } public Set getShown() { diff --git a/src/net/jitse/npclib/listeners/PlayerMoveListener.java b/src/net/jitse/npclib/listeners/PlayerMoveListener.java index b30aa88..430ead2 100644 --- a/src/net/jitse/npclib/listeners/PlayerMoveListener.java +++ b/src/net/jitse/npclib/listeners/PlayerMoveListener.java @@ -11,6 +11,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerTeleportEvent; /** * @author Jitse Boonstra @@ -26,23 +27,31 @@ public class PlayerMoveListener implements Listener { return; } - Player player = event.getPlayer(); + handleMove(event.getPlayer()); + } + @EventHandler + public void onPlayerTeleport(PlayerTeleportEvent event) { + handleMove(event.getPlayer()); + } + + private void handleMove(Player player) { for (NPC npc : NPCManager.getAllNPCs()) { if (!npc.getShown().contains(player.getUniqueId())) { continue; // NPC was never supposed to be shown to the player. } - double distance = player.getLocation().distance(npc.getLocation()); + double hideDistance = npc.getAutoHideDistance(); + boolean inRange = player.getLocation().distanceSquared(npc.getLocation()) <= (hideDistance * hideDistance); if (npc.getAutoHidden().contains(player.getUniqueId())) { // Check if the player and NPC are within the range to sendShowPackets it again. - if (distance <= npc.getAutoHideDistance()) { + if (inRange) { npc.show(player, true); npc.getAutoHidden().remove(player.getUniqueId()); } } else { // Check if the player and NPC are out of range to sendHidePackets it. - if (distance > npc.getAutoHideDistance()) { + if (!inRange) { npc.hide(player, true); npc.getAutoHidden().add(player.getUniqueId()); } diff --git a/src/net/jitse/npclib/plugin/NPCLibPlugin.java b/src/net/jitse/npclib/plugin/NPCLibPlugin.java index b2884dd..aa82a34 100644 --- a/src/net/jitse/npclib/plugin/NPCLibPlugin.java +++ b/src/net/jitse/npclib/plugin/NPCLibPlugin.java @@ -8,7 +8,6 @@ import net.jitse.npclib.NPCLib; import net.jitse.npclib.api.NPC; import net.jitse.npclib.plugin.listeners.NPCListener; import net.jitse.npclib.skin.MineSkinFetcher; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -28,8 +27,8 @@ public class NPCLibPlugin extends JavaPlugin implements Listener { @Override public void onEnable() { this.npcLib = new NPCLib(this); - Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "[NPCLib] " + ChatColor.WHITE + "plugin enabled."); - Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "[NPCLib] " + + getServer().getConsoleSender().sendMessage(ChatColor.BLUE + "[NPCLib] " + ChatColor.WHITE + "plugin enabled."); + getServer().getConsoleSender().sendMessage(ChatColor.BLUE + "[NPCLib] " + ChatColor.GRAY + "This is a test plugin usually used for development reasons. " + "You can spawn NPCs by pressing [shift] in game."); @@ -40,7 +39,7 @@ public class NPCLibPlugin extends JavaPlugin implements Listener { @Override public void onDisable() { - Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "[NPCLib] " + ChatColor.WHITE + "plugin disabled."); + getServer().getConsoleSender().sendMessage(ChatColor.BLUE + "[NPCLib] " + ChatColor.WHITE + "plugin disabled."); } @EventHandler @@ -57,7 +56,7 @@ public class NPCLibPlugin extends JavaPlugin implements Listener { )); npc.create(event.getPlayer().getLocation()); - for (Player player : Bukkit.getOnlinePlayers()) { + for (Player player : getServer().getOnlinePlayers()) { npc.show(player); } }); From 0387732482cf4b9e1daabc35285f7c5416df6a08 Mon Sep 17 00:00:00 2001 From: JitseB Date: Mon, 16 Apr 2018 07:45:36 +0200 Subject: [PATCH 3/4] Added /out dir to .gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 108e0cc..2c02566 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ .idea/ *.iml *.iws +out # Mac .DS_Store From 06b034c86e20a1891a1ba839dc31bc9f5e2abbf2 Mon Sep 17 00:00:00 2001 From: JitseB Date: Mon, 16 Apr 2018 07:49:57 +0200 Subject: [PATCH 4/4] Removed stream function. Stream functions generate new objects. Looping through the values is more efficient. --- src/net/jitse/npclib/api/NPC.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/net/jitse/npclib/api/NPC.java b/src/net/jitse/npclib/api/NPC.java index c68cb6a..e2ca5c6 100644 --- a/src/net/jitse/npclib/api/NPC.java +++ b/src/net/jitse/npclib/api/NPC.java @@ -59,7 +59,15 @@ public abstract class NPC { public void destroy() { NPCManager.remove(this); - shown.stream().filter(u -> !autoHidden.contains(u)).forEach(u -> hide(Bukkit.getPlayer(u), true)); + + // Destroy NPC for every player that is still seeing it. + for (UUID uuid : shown) { + if (autoHidden.contains(uuid)) { + continue; + } + + hide(Bukkit.getPlayer(uuid), true); + } } public Set getShown() {