diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 3b8c2f6e3f4..e8321e1890a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -21,6 +21,7 @@ import io.papermc.paper.event.player.PlayerServerFullCheckEvent; import net.ess3.api.IEssentials; import net.ess3.api.events.AfkStatusChangeEvent; +import net.ess3.api.events.VanishStatusChangeEvent; import net.ess3.provider.CommandSendListenerProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.InventoryViewProvider; @@ -32,6 +33,8 @@ import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; import org.bukkit.BanEntry; import org.bukkit.BanList; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; @@ -297,14 +300,7 @@ public void onPlayerQuit(final PlayerQuitEvent event) { if (hideJoinQuitMessages() || ess.getSettings().allowSilentJoinQuit() && user.isAuthorized("essentials.silentquit")) { event.setQuitMessage(null); } else if (ess.getSettings().isCustomQuitMessage() && event.getQuitMessage() != null) { - final Player player = event.getPlayer(); - final String msg = ess.getSettings().getCustomQuitMessage() - .replace("{PLAYER}", player.getDisplayName()) - .replace("{USERNAME}", player.getName()) - .replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size() - 1)) // Subtract 1 as the leaving player is still online during this time - .replace("{UPTIME}", DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())) - .replace("{PREFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getPrefix(player))) - .replace("{SUFFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getSuffix(player))); + final String msg = buildQuitMessage(user); event.setQuitMessage(msg.isEmpty() ? null : msg); } @@ -341,6 +337,51 @@ public void onPlayerQuit(final PlayerQuitEvent event) { user.dispose(); } + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onVanishStatusChange(final VanishStatusChangeEvent event) { + if (!ess.getSettings().isVanishFakeJoinLeave()) { + return; + } + + if (event.getValue()) { + String quitMessage = ChatColor.YELLOW + event.getAffected().getName() + " left the game"; + + if (ess.getSettings().isCustomQuitMessage()) + quitMessage = buildQuitMessage((User) event.getAffected());; + + Bukkit.broadcastMessage(quitMessage); + return; + } + + String joinMessage = ChatColor.YELLOW + event.getAffected().getName() + " joined the game"; + + if (ess.getSettings().isCustomJoinMessage()) + joinMessage = buildJoinMessage((User) event.getAffected(), false, null);; + + Bukkit.broadcastMessage(joinMessage); + } + + private String buildJoinMessage(final User user, boolean newUsername, String lastAccountName) { + return (newUsername && ess.getSettings().isCustomNewUsernameMessage() ? ess.getSettings().getCustomNewUsernameMessage() : ess.getSettings().getCustomJoinMessage()) + .replace("{PLAYER}", user.getDisplayName()).replace("{USERNAME}", user.getName()) + .replace("{UNIQUE}", NumberFormat.getInstance().format(ess.getUsers().getUserCount())) + .replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size())) + .replace("{UPTIME}", DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())) + .replace("{PREFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getPrefix(user.getBase()))) + .replace("{SUFFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getSuffix(user.getBase()))) + .replace("{OLDUSERNAME}", lastAccountName == null ? "" : lastAccountName); + } + + private String buildQuitMessage(final User user) { + return ess.getSettings().getCustomQuitMessage() + .replace("{PLAYER}", user.getDisplayName()) + .replace("{USERNAME}", user.getName()) + .replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size() - 1)) // Subtract 1 as the leaving player is still online during this time + .replace("{UPTIME}", DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())) + .replace("{PREFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getPrefix(user.getBase()))) + .replace("{SUFFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getSuffix(user.getBase()))); + } + @SuppressWarnings("UnstableApiUsage") private final class JoinListener1_21 implements Listener { private final Map newUserLocales = new ConcurrentHashMap<>(); @@ -458,14 +499,7 @@ private void joinFlow(final User user, final long currentTime, final String mess } else if (message == null || hideJoinQuitMessages()) { effectiveMessage = null; } else if (ess.getSettings().isCustomJoinMessage()) { - final String msg = (newUsername && ess.getSettings().isCustomNewUsernameMessage() ? ess.getSettings().getCustomNewUsernameMessage() : ess.getSettings().getCustomJoinMessage()) - .replace("{PLAYER}", user.getDisplayName()).replace("{USERNAME}", user.getName()) - .replace("{UNIQUE}", NumberFormat.getInstance().format(ess.getUsers().getUserCount())) - .replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size())) - .replace("{UPTIME}", DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())) - .replace("{PREFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getPrefix(user.getBase()))) - .replace("{SUFFIX}", FormatUtil.replaceFormat(ess.getPermissionsHandler().getSuffix(user.getBase()))) - .replace("{OLDUSERNAME}", lastAccountName == null ? "" : lastAccountName); + final String msg = buildJoinMessage(user, newUsername, lastAccountName); effectiveMessage = msg.isEmpty() ? null : msg; } else if (ess.getSettings().allowSilentJoinQuit()) { effectiveMessage = message; diff --git a/Essentials/src/main/java/com/earth2me/essentials/ISettings.java b/Essentials/src/main/java/com/earth2me/essentials/ISettings.java index 11566ca0459..bfbf1be0b47 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ISettings.java @@ -229,6 +229,8 @@ public interface ISettings extends IConf { boolean sleepIgnoresVanishedPlayers(); + boolean isVanishFakeJoinLeave(); + boolean isAfkListName(); String getAfkListName(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index fbec7ea904a..f9cba63f351 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -1350,6 +1350,11 @@ public boolean sleepIgnoresVanishedPlayers() { return config.getBoolean("sleep-ignores-vanished-player", true); } + @Override + public boolean isVanishFakeJoinLeave() { + return config.getBoolean("vanish-fake-join-leave", false); + } + public String _getAfkListName() { return FormatUtil.replaceFormat(config.getString("afk-list-name", "none")); } diff --git a/Essentials/src/main/resources/config.yml b/Essentials/src/main/resources/config.yml index eb441235b6b..d5bd052a3ca 100644 --- a/Essentials/src/main/resources/config.yml +++ b/Essentials/src/main/resources/config.yml @@ -544,6 +544,9 @@ sleep-ignores-afk-players: true # Players with the permission 'essentials.sleepingignored' will always be ignored. sleep-ignores-vanished-player: true +# Whether or not fake join and leave messages should be sent to the ingame-chat when a player toggles vanish. +vanish-fake-join-leave: false + # Change the player's /list name when they are AFK. This is none by default, which specifies that Essentials # should not interfere with the AFK player's /list name. # You may use color codes, {USERNAME} for the player's name, or {PLAYER} for the player's display name.