Don't store Entity/Player instances and slight improvements

This commit is contained in:
Phoenix616 2020-04-24 17:56:10 +01:00 committed by Simon Chuu
parent 48fc942222
commit 7aea506ed2
3 changed files with 39 additions and 43 deletions

View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.simonorj.mc.phantomsmp</groupId> <groupId>com.simonorj.mc.phantomsmp</groupId>
<artifactId>PhantomSMP</artifactId> <artifactId>PhantomSMP</artifactId>
<version>1.1.1</version> <version>1.1.2</version>
<url>https://github.com/SimonOrJ/PhantomSMP</url> <url>https://github.com/SimonOrJ/PhantomSMP</url>
<issueManagement> <issueManagement>
<url>https://github.com/SimonOrJ/PhantomSMP/issues</url> <url>https://github.com/SimonOrJ/PhantomSMP/issues</url>
@ -28,7 +28,7 @@
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId> <artifactId>bukkit</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version> <version>1.14.4-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -1,5 +1,8 @@
package com.simonorj.mc.phantomsmp; 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.Statistic;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -7,17 +10,16 @@ import org.bukkit.entity.Phantom;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.persistence.PersistentDataType;
import java.util.*; 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 DISALLOW_SPAWN_PERM = "phantomsmp.disallowspawn";
private static final String IGNORE_PERM = "phantomsmp.ignore"; private static final String IGNORE_PERM = "phantomsmp.ignore";
private final Map<Player, Set<Phantom>> playerPhantomMap = new HashMap<>(); private final NamespacedKey newlySpawnedKey;
private final Map<Phantom, Player> phantomPlayerMap = new HashMap<>();
private final Set<Phantom> newPhantom = new LinkedHashSet<>(); private final Multimap<UUID, UUID> playerPhantomMap = MultimapBuilder.hashKeys().hashSetValues().build();
private final Map<UUID, UUID> phantomPlayerMap = new HashMap<>();
private final PhantomSMP plugin; private final PhantomSMP plugin;
PhantomListener() { PhantomListener() {
this.plugin = PhantomSMP.getInstance(); this.plugin = PhantomSMP.getInstance();
for (Player p : plugin.getServer().getOnlinePlayers()) { newlySpawnedKey = new NamespacedKey(plugin, "newlyspawned");
this.playerPhantomMap.put(p, new LinkedHashSet<>());
}
// Initiate map // Initiate map
for (World w : plugin.getServer().getWorlds()) { for (World w : plugin.getServer().getWorlds()) {
@ -53,9 +54,9 @@ public class PhantomListener implements Listener {
private void targeting(Phantom phantom, Player newTarget, Cancellable e) { private void targeting(Phantom phantom, Player newTarget, Cancellable e) {
// Clean up old target // Clean up old target
Player old = phantomPlayerMap.remove(phantom); UUID old = phantomPlayerMap.remove(phantom.getUniqueId());
if (old != null) { if (old != null) {
playerPhantomMap.get(old).remove(phantom); playerPhantomMap.remove(old, phantom.getUniqueId());
} }
// get new target // get new target
@ -67,7 +68,10 @@ public class PhantomListener implements Listener {
else else
return; 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 (ignorePlayer(p, newlySpawned)) {
if (e != null) if (e != null)
e.setCancelled(true); e.setCancelled(true);
@ -79,8 +83,8 @@ public class PhantomListener implements Listener {
} }
// Phantom target is legal // Phantom target is legal
playerPhantomMap.computeIfAbsent(p, k -> new LinkedHashSet<>()).add(phantom); playerPhantomMap.put(p.getUniqueId(), phantom.getUniqueId());
phantomPlayerMap.put(phantom, p); phantomPlayerMap.put(phantom.getUniqueId(), p.getUniqueId());
} }
private boolean ignorePlayer(Player p, boolean newlySpawnedPhantom) { private boolean ignorePlayer(Player p, boolean newlySpawnedPhantom) {
@ -88,51 +92,43 @@ public class PhantomListener implements Listener {
} }
private void spawned(Phantom phantom) { private void spawned(Phantom phantom) {
newPhantom.add(phantom); phantom.getPersistentDataContainer().set(newlySpawnedKey, PersistentDataType.BYTE, (byte) 1);
} }
private void untarget(Player p, boolean sleeping) { private void untarget(Player p, boolean sleeping) {
Iterator<Phantom> i = playerPhantomMap.get(p).iterator(); Iterator<UUID> i = playerPhantomMap.get(p.getUniqueId()).iterator();
while(i.hasNext()) { while(i.hasNext()) {
Phantom phantom = i.next(); Entity entity = plugin.getServer().getEntity(i.next());
if (phantom.getTarget() == p) { if (entity instanceof Phantom) {
phantomPlayerMap.remove(phantom); Phantom phantom = (Phantom) entity;
phantom.setTarget(null); if (phantom.getTarget() == p) {
} phantomPlayerMap.remove(phantom.getUniqueId());
phantom.setTarget(null);
}
if (sleeping && plugin.removeWhenSleeping) if (sleeping && plugin.removeWhenSleeping)
phantom.remove(); phantom.remove();
}
i.remove(); i.remove();
} }
} }
private void removePhantom(Phantom phantom) { private void removePhantom(Phantom phantom) {
Player p = phantomPlayerMap.remove(phantom); UUID p = phantomPlayerMap.remove(phantom.getUniqueId());
if (p == null) if (p == null)
return; return;
playerPhantomMap.get(p).remove(phantom); playerPhantomMap.remove(p, phantom.getUniqueId());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent e) {
playerPhantomMap.put(e.getPlayer(), new LinkedHashSet<>());
} }
@EventHandler @EventHandler
public void onPlayerLeave(PlayerQuitEvent e) { public void onPlayerLeave(PlayerQuitEvent e) {
Player p = e.getPlayer(); Player p = e.getPlayer();
Set<Phantom> phantoms = playerPhantomMap.get(p); for (UUID phantomId : playerPhantomMap.removeAll(p.getUniqueId())) {
Entity entity = plugin.getServer().getEntity(phantomId);
if (phantoms == null) { if (entity instanceof Phantom && ((Phantom) entity).getTarget() == p) {
plugin.getLogger().warning("Phantom list for '" + p.getName() + "' was not initiated! Was there an error during login?"); ((Phantom) entity).setTarget(null);
return; phantomPlayerMap.remove(entity.getUniqueId(), p.getUniqueId());
}
for (Phantom phantom : phantoms) {
if (phantom.getTarget() == p) {
phantom.setTarget(null);
phantomPlayerMap.remove(phantom);
} }
} }
} }

View File

@ -4,7 +4,7 @@ author: Simon Chuu
description: Advanced phantom mechanics especially for SMP servers description: Advanced phantom mechanics especially for SMP servers
main: com.simonorj.mc.phantomsmp.PhantomSMP main: com.simonorj.mc.phantomsmp.PhantomSMP
website: https://github.com/SimonOrJ/PhantomSMP website: https://github.com/SimonOrJ/PhantomSMP
api-version: 1.13 api-version: 1.14
permissions: permissions:
phantomsmp.disallowspawn: phantomsmp.disallowspawn: