ZNPCsPlus/plugin/src/main/java/lol/pyr/znpcsplus/util/Viewable.java

82 lines
2.0 KiB
Java
Raw Normal View History

2023-04-25 23:31:49 +00:00
package lol.pyr.znpcsplus.util;
import org.bukkit.entity.Player;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
2023-04-25 23:31:49 +00:00
import java.util.Collections;
import java.util.List;
2023-04-25 23:31:49 +00:00
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
2023-04-25 23:31:49 +00:00
public abstract class Viewable {
private final static List<WeakReference<Viewable>> all = new ArrayList<>();
public static List<Viewable> all() {
all.removeIf(reference -> reference.get() == null);
return all.stream()
.map(Reference::get)
.collect(Collectors.toList());
}
private final Set<Player> viewers = ConcurrentHashMap.newKeySet();
2023-04-25 23:31:49 +00:00
public Viewable() {
all.add(new WeakReference<>(this));
}
2023-04-25 23:31:49 +00:00
public void delete() {
UNSAFE_hideAll();
viewers.clear();
}
public void respawn() {
UNSAFE_hideAll();
UNSAFE_showAll();
}
public void respawn(Player player) {
if (!viewers.contains(player)) return;
2023-05-21 11:59:21 +00:00
UNSAFE_hide(player);
UNSAFE_show(player);
2023-04-25 23:31:49 +00:00
}
public void show(Player player) {
if (viewers.contains(player)) return;
viewers.add(player);
UNSAFE_show(player);
2023-04-25 23:31:49 +00:00
}
public void hide(Player player) {
if (!viewers.contains(player)) return;
viewers.remove(player);
UNSAFE_hide(player);
2023-04-25 23:31:49 +00:00
}
public void UNSAFE_removeViewer(Player player) {
viewers.remove(player);
}
2023-04-25 23:31:49 +00:00
protected void UNSAFE_hideAll() {
2023-05-21 11:59:21 +00:00
for (Player viewer : viewers) UNSAFE_hide(viewer);
2023-04-25 23:31:49 +00:00
}
protected void UNSAFE_showAll() {
2023-05-21 11:59:21 +00:00
for (Player viewer : viewers) UNSAFE_show(viewer);
2023-04-25 23:31:49 +00:00
}
public Set<Player> getViewers() {
return Collections.unmodifiableSet(viewers);
}
2023-05-11 04:40:33 +00:00
public boolean isVisibleTo(Player player) {
return viewers.contains(player);
}
2023-05-21 11:59:21 +00:00
protected abstract void UNSAFE_show(Player player);
2023-04-25 23:31:49 +00:00
2023-05-21 11:59:21 +00:00
protected abstract void UNSAFE_hide(Player player);
2023-04-25 23:31:49 +00:00
}