From 7aea506ed2cbdb5a41cfe90a9bf1b9c2314f5889 Mon Sep 17 00:00:00 2001 From: Phoenix616 Date: Fri, 24 Apr 2020 17:56:10 +0100 Subject: [PATCH] Don't store Entity/Player instances and slight improvements --- pom.xml | 4 +- .../mc/phantomsmp/PhantomListener.java | 76 +++++++++---------- src/main/resources/plugin.yml | 2 +- 3 files changed, 39 insertions(+), 43 deletions(-) diff --git a/pom.xml b/pom.xml index c00378a..0e1b608 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.simonorj.mc.phantomsmp PhantomSMP - 1.1.1 + 1.1.2 https://github.com/SimonOrJ/PhantomSMP https://github.com/SimonOrJ/PhantomSMP/issues @@ -28,7 +28,7 @@ org.bukkit bukkit - 1.13.2-R0.1-SNAPSHOT + 1.14.4-R0.1-SNAPSHOT provided diff --git a/src/main/java/com/simonorj/mc/phantomsmp/PhantomListener.java b/src/main/java/com/simonorj/mc/phantomsmp/PhantomListener.java index cab92d3..d69bf99 100644 --- a/src/main/java/com/simonorj/mc/phantomsmp/PhantomListener.java +++ b/src/main/java/com/simonorj/mc/phantomsmp/PhantomListener.java @@ -1,5 +1,8 @@ package com.simonorj.mc.phantomsmp; +import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; +import org.bukkit.NamespacedKey; import org.bukkit.Statistic; import org.bukkit.World; import org.bukkit.entity.Entity; @@ -7,17 +10,16 @@ import org.bukkit.entity.Phantom; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerBedEnterEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.persistence.PersistentDataType; import java.util.*; @@ -25,16 +27,15 @@ public class PhantomListener implements Listener { private static final String DISALLOW_SPAWN_PERM = "phantomsmp.disallowspawn"; private static final String IGNORE_PERM = "phantomsmp.ignore"; - private final Map> playerPhantomMap = new HashMap<>(); - private final Map phantomPlayerMap = new HashMap<>(); - private final Set newPhantom = new LinkedHashSet<>(); + private final NamespacedKey newlySpawnedKey; + + private final Multimap playerPhantomMap = MultimapBuilder.hashKeys().hashSetValues().build(); + private final Map phantomPlayerMap = new HashMap<>(); private final PhantomSMP plugin; PhantomListener() { this.plugin = PhantomSMP.getInstance(); - for (Player p : plugin.getServer().getOnlinePlayers()) { - this.playerPhantomMap.put(p, new LinkedHashSet<>()); - } + newlySpawnedKey = new NamespacedKey(plugin, "newlyspawned"); // Initiate map for (World w : plugin.getServer().getWorlds()) { @@ -53,9 +54,9 @@ public class PhantomListener implements Listener { private void targeting(Phantom phantom, Player newTarget, Cancellable e) { // Clean up old target - Player old = phantomPlayerMap.remove(phantom); + UUID old = phantomPlayerMap.remove(phantom.getUniqueId()); if (old != null) { - playerPhantomMap.get(old).remove(phantom); + playerPhantomMap.remove(old, phantom.getUniqueId()); } // get new target @@ -67,7 +68,10 @@ public class PhantomListener implements Listener { else return; - boolean newlySpawned = newPhantom.remove(phantom); + boolean newlySpawned = phantom.getPersistentDataContainer().has(newlySpawnedKey, PersistentDataType.BYTE); + if (newlySpawned) { + phantom.getPersistentDataContainer().remove(newlySpawnedKey); + } if (ignorePlayer(p, newlySpawned)) { if (e != null) e.setCancelled(true); @@ -79,8 +83,8 @@ public class PhantomListener implements Listener { } // Phantom target is legal - playerPhantomMap.computeIfAbsent(p, k -> new LinkedHashSet<>()).add(phantom); - phantomPlayerMap.put(phantom, p); + playerPhantomMap.put(p.getUniqueId(), phantom.getUniqueId()); + phantomPlayerMap.put(phantom.getUniqueId(), p.getUniqueId()); } private boolean ignorePlayer(Player p, boolean newlySpawnedPhantom) { @@ -88,51 +92,43 @@ public class PhantomListener implements Listener { } private void spawned(Phantom phantom) { - newPhantom.add(phantom); + phantom.getPersistentDataContainer().set(newlySpawnedKey, PersistentDataType.BYTE, (byte) 1); } private void untarget(Player p, boolean sleeping) { - Iterator i = playerPhantomMap.get(p).iterator(); + Iterator i = playerPhantomMap.get(p.getUniqueId()).iterator(); while(i.hasNext()) { - Phantom phantom = i.next(); - if (phantom.getTarget() == p) { - phantomPlayerMap.remove(phantom); - phantom.setTarget(null); - } + Entity entity = plugin.getServer().getEntity(i.next()); + if (entity instanceof Phantom) { + Phantom phantom = (Phantom) entity; + if (phantom.getTarget() == p) { + phantomPlayerMap.remove(phantom.getUniqueId()); + phantom.setTarget(null); + } - if (sleeping && plugin.removeWhenSleeping) - phantom.remove(); + if (sleeping && plugin.removeWhenSleeping) + phantom.remove(); + } i.remove(); } } private void removePhantom(Phantom phantom) { - Player p = phantomPlayerMap.remove(phantom); + UUID p = phantomPlayerMap.remove(phantom.getUniqueId()); if (p == null) return; - playerPhantomMap.get(p).remove(phantom); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerJoin(PlayerJoinEvent e) { - playerPhantomMap.put(e.getPlayer(), new LinkedHashSet<>()); + playerPhantomMap.remove(p, phantom.getUniqueId()); } @EventHandler public void onPlayerLeave(PlayerQuitEvent e) { Player p = e.getPlayer(); - Set phantoms = playerPhantomMap.get(p); - - if (phantoms == null) { - plugin.getLogger().warning("Phantom list for '" + p.getName() + "' was not initiated! Was there an error during login?"); - return; - } - - for (Phantom phantom : phantoms) { - if (phantom.getTarget() == p) { - phantom.setTarget(null); - phantomPlayerMap.remove(phantom); + for (UUID phantomId : playerPhantomMap.removeAll(p.getUniqueId())) { + Entity entity = plugin.getServer().getEntity(phantomId); + if (entity instanceof Phantom && ((Phantom) entity).getTarget() == p) { + ((Phantom) entity).setTarget(null); + phantomPlayerMap.remove(entity.getUniqueId(), p.getUniqueId()); } } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7bd983f..3753e62 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,7 +4,7 @@ author: Simon Chuu description: Advanced phantom mechanics especially for SMP servers main: com.simonorj.mc.phantomsmp.PhantomSMP website: https://github.com/SimonOrJ/PhantomSMP -api-version: 1.13 +api-version: 1.14 permissions: phantomsmp.disallowspawn: