extend leave viewer remover to all viewables

This commit is contained in:
Pyrbu 2023-08-26 23:26:21 +02:00
parent 446761c52c
commit 868999fe2d
4 changed files with 35 additions and 23 deletions

@ -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();

@ -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());
});
}
}

@ -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());
});
}
}

@ -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<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();
public Viewable() {
all.add(new WeakReference<>(this));
}
public void delete() {
UNSAFE_hideAll();
viewers.clear();