diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 09d7226..dc376a0 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -38,7 +38,7 @@ import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; import lol.pyr.znpcsplus.skin.cache.SkinCacheCleanTask; import lol.pyr.znpcsplus.tasks.HologramRefreshTask; -import lol.pyr.znpcsplus.tasks.NpcHideListener; +import lol.pyr.znpcsplus.tasks.ViewableHideOnLeaveListener; import lol.pyr.znpcsplus.tasks.NpcProcessorTask; import lol.pyr.znpcsplus.updater.UpdateChecker; import lol.pyr.znpcsplus.updater.UpdateNotificationListener; @@ -163,7 +163,7 @@ public class ZNpcsPlus extends JavaPlugin { scheduler.runDelayedTimerAsync(new NpcProcessorTask(npcRegistry, configManager, propertyRegistry), 60L, 3L); scheduler.runDelayedTimerAsync(new HologramRefreshTask(npcRegistry), 60L, 20L); scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200); - pluginManager.registerEvents(new NpcHideListener(npcRegistry), this); + pluginManager.registerEvents(new ViewableHideOnLeaveListener(), this); log(ChatColor.WHITE + " * Loading data..."); npcRegistry.reload(); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcHideListener.java b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcHideListener.java deleted file mode 100644 index c2ba431..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcHideListener.java +++ /dev/null @@ -1,21 +0,0 @@ -package lol.pyr.znpcsplus.tasks; - -import lol.pyr.znpcsplus.npc.NpcRegistryImpl; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; - -public class NpcHideListener implements Listener { - private final NpcRegistryImpl registry; - - public NpcHideListener(NpcRegistryImpl registry) { - this.registry = registry; - } - - @EventHandler - public void onQuit(PlayerQuitEvent event) { - registry.getProcessable().forEach(entry -> { - if (entry.getNpc().isVisibleTo(event.getPlayer())) entry.getNpc().UNSAFE_removeViewer(event.getPlayer()); - }); - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/ViewableHideOnLeaveListener.java b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/ViewableHideOnLeaveListener.java new file mode 100644 index 0000000..a411711 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/ViewableHideOnLeaveListener.java @@ -0,0 +1,15 @@ +package lol.pyr.znpcsplus.tasks; + +import lol.pyr.znpcsplus.util.Viewable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class ViewableHideOnLeaveListener implements Listener { + @EventHandler + public void onQuit(PlayerQuitEvent event) { + Viewable.all().forEach(viewable -> { + if (viewable.isVisibleTo(event.getPlayer())) viewable.UNSAFE_removeViewer(event.getPlayer()); + }); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/util/Viewable.java b/plugin/src/main/java/lol/pyr/znpcsplus/util/Viewable.java index cbe229f..27e4bad 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/util/Viewable.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/util/Viewable.java @@ -2,13 +2,31 @@ package lol.pyr.znpcsplus.util; import org.bukkit.entity.Player; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; public abstract class Viewable { + private final static List> all = new ArrayList<>(); + + public static List all() { + all.removeIf(reference -> reference.get() == null); + return all.stream() + .map(Reference::get) + .collect(Collectors.toList()); + } + private final Set viewers = ConcurrentHashMap.newKeySet(); + public Viewable() { + all.add(new WeakReference<>(this)); + } + public void delete() { UNSAFE_hideAll(); viewers.clear();