From 1f2355aa77aa6007f7fe7269262aad2a2b7c03ce Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Sun, 30 Mar 2025 16:52:46 +0700 Subject: [PATCH] fix: player left event being called twice !! refactor: some refactors inside the player plugin too --- .../chomens_bot/plugins/PlayersPlugin.java | 45 +++++++------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java index f83ae1d5..4171a1d6 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java @@ -29,8 +29,6 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { private final List listeners = new ArrayList<>(); - private final List pendingLeftPlayers = new ArrayList<>(); - public PlayersPlugin (Bot bot) { this.bot = bot; @@ -47,18 +45,19 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { @Override public void packetReceived (Session session, Packet packet) { - if (packet instanceof ClientboundPlayerInfoUpdatePacket) packetReceived((ClientboundPlayerInfoUpdatePacket) packet); - else if (packet instanceof ClientboundPlayerInfoRemovePacket) packetReceived((ClientboundPlayerInfoRemovePacket) packet); + if (packet instanceof ClientboundPlayerInfoUpdatePacket t_packet) packetReceived(t_packet); + else if (packet instanceof ClientboundPlayerInfoRemovePacket t_packet) packetReceived(t_packet); } public void packetReceived (ClientboundPlayerInfoUpdatePacket packet) { - EnumSet actions = packet.getActions(); + final EnumSet actions = packet.getActions(); + for (PlayerListEntryAction action : actions) { for (PlayerListEntry entry : packet.getEntries()) { if (action == PlayerListEntryAction.ADD_PLAYER) addPlayer(entry); else if (action == PlayerListEntryAction.INITIALIZE_CHAT) initializeChat(entry); else if (action == PlayerListEntryAction.UPDATE_LISTED) updateListed(entry); - else if (action == PlayerListEntryAction.UPDATE_GAME_MODE) updateGamemode(entry); + else if (action == PlayerListEntryAction.UPDATE_GAME_MODE) updateGameMode(entry); else if (action == PlayerListEntryAction.UPDATE_LATENCY) updateLatency(entry); else if (action == PlayerListEntryAction.UPDATE_DISPLAY_NAME) updateDisplayName(entry); } @@ -68,9 +67,7 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { public void packetReceived (ClientboundPlayerInfoRemovePacket packet) { final List uuids = packet.getProfileIds(); - for (UUID uuid : uuids) { - removePlayer(uuid); - } + for (UUID uuid : uuids) removePlayer(uuid); } private void queryPlayersIP () { for (PlayerEntry target : list) queryPlayersIP(target); } @@ -219,7 +216,7 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { } } - private void updateGamemode (PlayerListEntry newEntry) { + private void updateGameMode (PlayerListEntry newEntry) { final PlayerEntry target = getEntry(newEntry); if (target == null) return; @@ -261,11 +258,13 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { future.thenApply(lastKnownName -> { if (lastKnownName == null) { - list.remove(target); + final boolean removed = list.remove(target); - pendingLeftPlayers.remove(target); - - for (Listener listener : listeners) listener.playerLeft(target); + // checking if removed prevents the event from being called twice + // this was a bug for quite a few weeks lol + if (removed) { + for (Listener listener : listeners) listener.playerLeft(target); + } } else if (!lastKnownName.equals(target.profile.getName())) { final PlayerEntry newTarget = new PlayerEntry( new GameProfile( @@ -291,16 +290,6 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { list.remove(target); for (Listener listener : listeners) listener.playerChangedUsername(newTarget); - } else { - for (PlayerEntry leftPlayers : new ArrayList<>(pendingLeftPlayers)) { - if (!target.equals(leftPlayers)) continue; - - target.listed = false; - - for (Listener listener : listeners) listener.playerVanished(target); - - pendingLeftPlayers.remove(leftPlayers); - } } return null; @@ -321,12 +310,12 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { if (target == null) return; if (!bot.serverFeatures.hasNamespaces) { - list.remove(target); + final boolean removed = list.remove(target); - for (Listener listener : listeners) listener.playerLeft(target); + if (removed) { + for (Listener listener : listeners) listener.playerLeft(target); + } } else { - pendingLeftPlayers.add(target); - check(target); } }