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(); } public void respawn() { UNSAFE_hideAll(); UNSAFE_showAll(); } public void respawn(Player player) { if (!viewers.contains(player)) return; UNSAFE_hide(player); UNSAFE_show(player); } public void show(Player player) { if (viewers.contains(player)) return; viewers.add(player); UNSAFE_show(player); } public void hide(Player player) { if (!viewers.contains(player)) return; viewers.remove(player); UNSAFE_hide(player); } public void UNSAFE_removeViewer(Player player) { viewers.remove(player); } protected void UNSAFE_hideAll() { for (Player viewer : viewers) UNSAFE_hide(viewer); } protected void UNSAFE_showAll() { for (Player viewer : viewers) UNSAFE_show(viewer); } public Set getViewers() { return Collections.unmodifiableSet(viewers); } public boolean isVisibleTo(Player player) { return viewers.contains(player); } protected abstract void UNSAFE_show(Player player); protected abstract void UNSAFE_hide(Player player); }