diff --git a/build-number.txt b/build-number.txt index 1bb8415d..60a48d99 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -2341 \ No newline at end of file +2343 \ No newline at end of file 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 e9866659..d5a9b371 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java @@ -15,10 +15,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundPlayerInfoRemovePacket; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundPlayerInfoUpdatePacket; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -29,6 +26,8 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { private final List listeners = new ArrayList<>(); + private final List pendingLeftPlayers = Collections.synchronizedList(new ArrayList<>()); + public PlayersPlugin (Bot bot) { this.bot = bot; @@ -256,6 +255,13 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { } private void check (PlayerEntry target) { + final PlayerEntry pending = pendingLeftPlayers.stream() + .filter(player -> player.equals(target)) + .findAny() + .orElse(null); + + if (pending != null) pendingLeftPlayers.remove(pending); + final CompletableFuture future = getLastKnownName(target.profile.getIdAsString()); future.thenApply(lastKnownName -> { @@ -296,6 +302,13 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { list.remove(target); for (Listener listener : listeners) listener.playerChangedUsername(newTarget); + } else if (pending != null) { + // we already passed all the left and username check, + // so the only one left is vanish + + target.listed = false; + + for (Listener listener : listeners) listener.playerVanished(target); } return null; @@ -303,8 +316,9 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { } private void onLastKnownNameTick () { + // hasNamespaces also means vanilla/non-bukkit if (!bot.loggedIn || !bot.core.ready || !bot.serverFeatures.hasNamespaces) - return; // hasNamespaces also means vanilla/non-bukkit + return; for (PlayerEntry target : new ArrayList<>(list)) { check(target); @@ -323,6 +337,8 @@ public class PlayersPlugin extends Bot.Listener implements TickPlugin.Listener { for (Listener listener : listeners) listener.playerLeft(target); } } else { + pendingLeftPlayers.add(target); + check(target); } }