diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c02566 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Eclipse +.classpath +.project +.settings/ + +# Intellij +.idea/ +*.iml +*.iws +out + +# Mac +.DS_Store + +# Maven +log/ +target/ \ No newline at end of file diff --git a/src/net/jitse/npclib/api/NPC.java b/src/net/jitse/npclib/api/NPC.java index cdb08b8..e2ca5c6 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,35 @@ 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); + + // 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() { 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); } });