Improve DefaultVisibilityManager

This commit is contained in:
filoghost 2021-05-18 18:04:43 +02:00
parent c1cd5b200c
commit d67480749b

View File

@ -14,11 +14,9 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashSet; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class DefaultVisibilityManager implements VisibilityManager { public class DefaultVisibilityManager implements VisibilityManager {
@ -52,33 +50,16 @@ public class DefaultVisibilityManager implements VisibilityManager {
// Has a specific value set // Has a specific value set
continue; continue;
} }
if (visibleByDefault) { sendVisibilityChangePacket(hologram, player, visibleByDefault);
// Now it's visible, and it previously wasn't because the value has changed
sendCreatePacket(player, hologram);
} else {
// Opposite case: now it's not visible
sendDestroyPacket(player, hologram);
}
} }
} }
@Override @Override
public void showTo(@NotNull Player player) { public void showTo(@NotNull Player player) {
Preconditions.notNull(player, "player"); Preconditions.notNull(player, "player");
boolean wasVisible = isVisibleTo(player); setVisibleTo(player, true);
if (playersVisibilityMap == null) {
// Lazy initialization
playersVisibilityMap = new ConcurrentHashMap<>();
}
playersVisibilityMap.put(player.getUniqueId(), true);
if (!wasVisible) {
sendCreatePacket(player, hologram);
}
} }
@ -86,17 +67,20 @@ public class DefaultVisibilityManager implements VisibilityManager {
public void hideTo(@NotNull Player player) { public void hideTo(@NotNull Player player) {
Preconditions.notNull(player, "player"); Preconditions.notNull(player, "player");
setVisibleTo(player, false);
}
private void setVisibleTo(Player player, boolean visible) {
boolean wasVisible = isVisibleTo(player); boolean wasVisible = isVisibleTo(player);
// Lazy initialization
if (playersVisibilityMap == null) { if (playersVisibilityMap == null) {
// Lazy initialization playersVisibilityMap = new HashMap<>();
playersVisibilityMap = new ConcurrentHashMap<>();
} }
playersVisibilityMap.put(player.getUniqueId(), visible);
playersVisibilityMap.put(player.getUniqueId(), false);
if (wasVisible != visible) {
if (wasVisible) { sendVisibilityChangePacket(hologram, player, visible);
sendDestroyPacket(player, hologram);
} }
} }
@ -105,9 +89,9 @@ public class DefaultVisibilityManager implements VisibilityManager {
Preconditions.notNull(player, "player"); Preconditions.notNull(player, "player");
if (playersVisibilityMap != null) { if (playersVisibilityMap != null) {
Boolean value = playersVisibilityMap.get(player.getUniqueId()); Boolean visible = playersVisibilityMap.get(player.getUniqueId());
if (value != null) { if (visible != null) {
return value; return visible;
} }
} }
@ -122,45 +106,34 @@ public class DefaultVisibilityManager implements VisibilityManager {
return; return;
} }
boolean wasVisible = isVisibleTo(player); Boolean wasVisible = playersVisibilityMap.remove(player.getUniqueId());
if (wasVisible != null && visibleByDefault != wasVisible) {
playersVisibilityMap.remove(player.getUniqueId()); sendVisibilityChangePacket(hologram, player, visibleByDefault);
if (visibleByDefault && !wasVisible) {
sendCreatePacket(player, hologram);
} else if (!visibleByDefault && wasVisible) {
sendDestroyPacket(player, hologram);
} }
} }
@Override @Override
public void resetVisibilityAll() { public void resetVisibilityAll() {
if (playersVisibilityMap != null) { if (playersVisibilityMap == null) {
// We need to refresh all the players return;
Set<UUID> playerIDs = new HashSet<>(playersVisibilityMap.keySet()); }
for (UUID playerID : playerIDs) { for (Player player : Bukkit.getOnlinePlayers()) {
Player onlinePlayer = Bukkit.getPlayer(playerID); boolean wasVisible = isVisibleTo(player);
if (onlinePlayer != null) { if (visibleByDefault != wasVisible) {
resetVisibility(onlinePlayer); sendVisibilityChangePacket(hologram, player, visibleByDefault);
}
} }
playersVisibilityMap.clear();
playersVisibilityMap = null;
} }
playersVisibilityMap = null;
} }
private void sendCreatePacket(Player player, StandardHologram hologram) { private void sendVisibilityChangePacket(StandardHologram hologram, Player player, boolean visible) {
if (ProtocolLibHook.isEnabled()) { if (ProtocolLibHook.isEnabled()) {
ProtocolLibHook.sendCreateEntitiesPacket(player, hologram); if (visible) {
} ProtocolLibHook.sendCreateEntitiesPacket(player, hologram);
} } else {
ProtocolLibHook.sendDestroyEntitiesPacket(player, hologram);
private void sendDestroyPacket(Player player, StandardHologram hologram) { }
if (ProtocolLibHook.isEnabled()) {
ProtocolLibHook.sendDestroyEntitiesPacket(player, hologram);
} }
} }