From 1fba0d9ff0af756048b51e70ff3a52a31762a67e Mon Sep 17 00:00:00 2001 From: MrMicky Date: Wed, 25 Apr 2018 14:17:52 +0200 Subject: [PATCH] Correct errors on world change --- .../jitse/npclib/listeners/ChunkListener.java | 6 ++++- .../npclib/listeners/PlayerListener.java | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/net/jitse/npclib/listeners/ChunkListener.java b/src/net/jitse/npclib/listeners/ChunkListener.java index 8b82b2d..06ace8f 100644 --- a/src/net/jitse/npclib/listeners/ChunkListener.java +++ b/src/net/jitse/npclib/listeners/ChunkListener.java @@ -51,7 +51,7 @@ public class ChunkListener implements Listener { for (NPC npc : NPCManager.getAllNPCs()) { Chunk npcChunk = npc.getLocation().getChunk(); - if (chunk.getX() == npcChunk.getX() && chunk.getZ() == npcChunk.getZ()) { + if (chunk == npcChunk) { // Loaded chunk with NPC in it. Showing it to the players again. for (UUID uuid : npc.getShown()) { @@ -62,6 +62,10 @@ public class ChunkListener implements Listener { Player player = Bukkit.getPlayer(uuid); + if (npcChunk.getWorld() != player.getWorld()) { + continue; // Player and NPC are not in the same world + } + double hideDistance = npc.getAutoHideDistance(); double distanceSquared = player.getLocation().distanceSquared(npc.getLocation()); boolean inRange = distanceSquared <= (hideDistance * hideDistance) || distanceSquared <= (Bukkit.getViewDistance() << 4); diff --git a/src/net/jitse/npclib/listeners/PlayerListener.java b/src/net/jitse/npclib/listeners/PlayerListener.java index 29e9f15..48da8e2 100644 --- a/src/net/jitse/npclib/listeners/PlayerListener.java +++ b/src/net/jitse/npclib/listeners/PlayerListener.java @@ -8,9 +8,11 @@ import net.jitse.npclib.NPCManager; import net.jitse.npclib.api.NPC; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -34,6 +36,22 @@ public class PlayerListener implements Listener { } } + @EventHandler + public void onPlayerChangedWorld(PlayerChangedWorldEvent event) { + Player player = event.getPlayer(); + World from = event.getFrom(); + + // The PlayerTeleportEvent is call, and will handle visiiblity in the new world + for (NPC npc : NPCManager.getAllNPCs()) { + if (npc.getLocation().getWorld() == from) { + if (!npc.getAutoHidden().contains(player.getUniqueId())) { + npc.getAutoHidden().add(player.getUniqueId()); + npc.hide(player, true); + } + } + } + } + @EventHandler public void onPlayerMove(PlayerMoveEvent event) { Location from = event.getFrom(); @@ -52,11 +70,16 @@ public class PlayerListener implements Listener { } private void handleMove(Player player) { + World world = player.getWorld(); for (NPC npc : NPCManager.getAllNPCs()) { if (!npc.getShown().contains(player.getUniqueId())) { continue; // NPC was never supposed to be shown to the player. } + if (npc.getLocation().getWorld() != world) { + continue; // NPC is not in the same world + } + // If Bukkit doesn't track the NPC entity anymore, bypass the hiding distance variable. // This will cause issues otherwise (e.g. custom skin disappearing). double hideDistance = npc.getAutoHideDistance();