From 7aef6811490957a475da7b7d78acfb42576e2c6f Mon Sep 17 00:00:00 2001 From: Logan <37521985+LoJoSho@users.noreply.github.com> Date: Sun, 7 Sep 2025 21:44:44 -0500 Subject: [PATCH] feat: refactor UserEntity refreshViewers --- .../hmccosmetics/user/manager/UserEntity.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java index a6be6803..6fb4beb7 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.UUID; @@ -41,36 +42,41 @@ public class UserEntity { public List refreshViewers(Location location) { if (System.currentTimeMillis() - viewerLastUpdate <= 1000) return List.of(); //Prevents mass refreshes - ArrayList newPlayers = new ArrayList<>(); - ArrayList removePlayers = new ArrayList<>(); - List players = HMCCPacketManager.getViewers(location); + Entity ownerPlayer = Bukkit.getEntity(owner); if (ownerPlayer == null) { MessagesUtil.sendDebugMessages("Owner is null (refreshViewers), returning empty list"); return List.of(); } + final HashSet players = new HashSet<>(HMCCPacketManager.getViewers(location)); + final ArrayList newPlayers = new ArrayList<>(); + final ArrayList removePlayers = new ArrayList<>(); + + // Go through all nearby players, check if they are new to the viewers list. for (Player player : players) { CosmeticUser user = CosmeticUsers.getUser(player); if (user != null && owner != user.getUniqueId() && user.isInWardrobe() && !player.canSee(ownerPlayer)) { // Fixes issue where players in wardrobe would see other players cosmetics if they were not in wardrobe removePlayers.add(player); - HMCCPacketManager.sendEntityDestroyPacket(ids, List.of(player)); continue; } if (!viewers.contains(player)) { viewers.add(player); newPlayers.add(player); - continue; - } - // bad loopdy loops - for (Player viewerPlayer : viewers) { - if (!players.contains(viewerPlayer)) { - removePlayers.add(viewerPlayer); - HMCCPacketManager.sendEntityDestroyPacket(ids, List.of(viewerPlayer)); - } } } - viewers.removeAll(removePlayers); + // Basically, if they are not nearby, they are still in the viewers and we need to kick em to the curb + for (Player viewerPlayer : viewers) { + if (!players.contains(viewerPlayer)) { + removePlayers.add(viewerPlayer); + } + } + + // If there are players for removal, send the packets to them + if (!removePlayers.isEmpty()) { + HMCCPacketManager.sendEntityDestroyPacket(ids, removePlayers); + viewers.removeAll(removePlayers); + } setViewerLastUpdate(System.currentTimeMillis()); return newPlayers; }