extend leave viewer remover to all viewables
This commit is contained in:
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.MojangSkinCache;
|
||||||
import lol.pyr.znpcsplus.skin.cache.SkinCacheCleanTask;
|
import lol.pyr.znpcsplus.skin.cache.SkinCacheCleanTask;
|
||||||
import lol.pyr.znpcsplus.tasks.HologramRefreshTask;
|
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.tasks.NpcProcessorTask;
|
||||||
import lol.pyr.znpcsplus.updater.UpdateChecker;
|
import lol.pyr.znpcsplus.updater.UpdateChecker;
|
||||||
import lol.pyr.znpcsplus.updater.UpdateNotificationListener;
|
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 NpcProcessorTask(npcRegistry, configManager, propertyRegistry), 60L, 3L);
|
||||||
scheduler.runDelayedTimerAsync(new HologramRefreshTask(npcRegistry), 60L, 20L);
|
scheduler.runDelayedTimerAsync(new HologramRefreshTask(npcRegistry), 60L, 20L);
|
||||||
scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200);
|
scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200);
|
||||||
pluginManager.registerEvents(new NpcHideListener(npcRegistry), this);
|
pluginManager.registerEvents(new ViewableHideOnLeaveListener(), this);
|
||||||
|
|
||||||
log(ChatColor.WHITE + " * Loading data...");
|
log(ChatColor.WHITE + " * Loading data...");
|
||||||
npcRegistry.reload();
|
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 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.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public abstract class Viewable {
|
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();
|
private final Set<Player> viewers = ConcurrentHashMap.newKeySet();
|
||||||
|
|
||||||
|
public Viewable() {
|
||||||
|
all.add(new WeakReference<>(this));
|
||||||
|
}
|
||||||
|
|
||||||
public void delete() {
|
public void delete() {
|
||||||
UNSAFE_hideAll();
|
UNSAFE_hideAll();
|
||||||
viewers.clear();
|
viewers.clear();
|
||||||
|
|
Loading…
Reference in a new issue