From bcbe601ad0dc36864d7aad48467f46a1308d28cf Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Sun, 12 Apr 2026 13:30:37 -0700 Subject: [PATCH] Fix VanishStatusChangeEvent NPE and document parameter inversion The affected/controller parameters are swapped in Commandvanish (#2604) but cannot be fixed without breaking the public API. Fix BukkitListener to use getController() (the actual vanished player) instead of getAffected() (the sender, null for console), and add inversion warning javadoc matching the NickChangeEvent pattern. Fixes #6388 --- .../java/net/ess3/api/events/VanishStatusChangeEvent.java | 6 ++++++ .../net/essentialsx/discord/listeners/BukkitListener.java | 8 +++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java b/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java index 13fdc6b0c7c..52188d5e787 100644 --- a/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/VanishStatusChangeEvent.java @@ -8,6 +8,12 @@ *

* For other cases where the player's vanish status changes, you should listen on PlayerJoinEvent and * check with {@link IUser#isVanished()}. + * + * WARNING: The values of {@link #getAffected()} and {@link #getController()} are inverted due to + * a long-standing parameter swap. {@link #getAffected()} returns the command sender (null for console), + * and {@link #getController()} returns the player whose vanish status changed. + * + * @see #2604 */ public class VanishStatusChangeEvent extends StatusChangeEvent { private static final HandlerList handlers = new HandlerList(); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java index c5dc69a6bb1..c2e9c4c1edb 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java @@ -126,14 +126,16 @@ public boolean isSilentJoinQuit(final IUser user, final String type) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onVanishStatusChange(VanishStatusChangeEvent event) { - if (!jda.getSettings().isVanishFakeJoinLeave() || event.getAffected().isLeavingHidden()) { + // Note: getController() returns the vanished player due to a long-standing parameter swap in Commandvanish. + final IUser vanished = event.getController(); + if (vanished == null || !jda.getSettings().isVanishFakeJoinLeave() || vanished.isLeavingHidden()) { return; } if (event.getValue()) { - sendJoinQuitMessage(event.getAffected().getBase(), ChatColor.YELLOW + event.getAffected().getName() + " left the game", MessageType.DefaultTypes.LEAVE); + sendJoinQuitMessage(vanished.getBase(), ChatColor.YELLOW + vanished.getName() + " left the game", MessageType.DefaultTypes.LEAVE); return; } - sendJoinQuitMessage(event.getAffected().getBase(), ChatColor.YELLOW + event.getAffected().getName() + " joined the game", MessageType.DefaultTypes.JOIN); + sendJoinQuitMessage(vanished.getBase(), ChatColor.YELLOW + vanished.getName() + " joined the game", MessageType.DefaultTypes.JOIN); } public void sendJoinQuitMessage(final Player player, final String message, MessageType type) {