From 0d1462a021c63ffddf9176737ded7e9a5d79d06a Mon Sep 17 00:00:00 2001 From: MD <1917406+mdcfe@users.noreply.github.com> Date: Mon, 5 Feb 2024 01:31:58 +0000 Subject: [PATCH 01/33] Fix message display issues from Adventure refactor (#5648) Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com> --- .../java/com/earth2me/essentials/Essentials.java | 3 ++- .../essentials/EssentialsPlayerListener.java | 9 ++++----- .../main/java/com/earth2me/essentials/User.java | 4 ++-- .../earth2me/essentials/commands/Commandban.java | 2 +- .../earth2me/essentials/commands/Commandbanip.java | 2 +- .../earth2me/essentials/commands/Commandhelp.java | 3 ++- .../earth2me/essentials/commands/Commandkick.java | 2 +- .../essentials/commands/Commandkickall.java | 3 ++- .../earth2me/essentials/commands/Commandnear.java | 3 ++- .../essentials/commands/Commandtempban.java | 3 ++- .../essentials/commands/Commandtempbanip.java | 2 +- .../essentials/commands/Commandtogglejail.java | 4 ++-- .../earth2me/essentials/textreader/HelpInput.java | 14 +++++++------- .../discordlink/listeners/LinkBukkitListener.java | 3 ++- 14 files changed, 31 insertions(+), 26 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index c19a5ca11..8e47ae748 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -904,7 +904,8 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { @Override public void showError(final CommandSource sender, final Throwable exception, final String commandLabel) { if (exception instanceof TranslatableException) { - sender.sendTl(((TranslatableException) exception).getTlKey(), ((TranslatableException) exception).getArgs()); + final String tlMessage = sender.tl(((TranslatableException) exception).getTlKey(), ((TranslatableException) exception).getArgs()); + sender.sendTl("errorWithMessage", AdventureUtil.parsed(tlMessage)); } else { sender.sendTl("errorWithMessage", exception.getMessage()); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 248157acb..1f5e784a7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -642,11 +642,10 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor { if (!user.isAuthorized("essentials.chat.spy.exempt")) { for (final User spyer : ess.getOnlineUsers()) { if (spyer.isSocialSpyEnabled() && !player.equals(spyer.getBase())) { - if (user.isMuted() && ess.getSettings().getSocialSpyListenMutedPlayers()) { - spyer.sendMessage(spyer.playerTl("socialSpyMutedPrefix") + player.getDisplayName() + ": " + event.getMessage()); - } else { - spyer.sendMessage(spyer.playerTl("socialSpyPrefix") + player.getDisplayName() + ": " + event.getMessage()); - } + final Component base = (user.isMuted() && ess.getSettings().getSocialSpyListenMutedPlayers()) + ? spyer.tlComponent("socialSpyMutedPrefix") + : spyer.tlComponent("socialSpyPrefix"); + spyer.sendComponent(base.append(Component.text(AdventureUtil.legacyToAdventure(player.getDisplayName()) + ": " + event.getMessage()))); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index b7afe1d3a..fe0c74f6a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -834,7 +834,7 @@ public class User extends UserData implements Comparable, IMessageRecipien } public void checkActivity() { - // Graceful time before the first afk check call. + // Graceful time before the first afk check call. if (System.currentTimeMillis() - lastActivity <= 10000) { return; } @@ -847,7 +847,7 @@ public class User extends UserData implements Comparable, IMessageRecipien lastActivity = 0; final double kickTime = autoafkkick / 60.0; - this.getBase().kickPlayer(playerTl("autoAfkKickReason", kickTime)); + this.getBase().kickPlayer(AdventureUtil.miniToLegacy(playerTl("autoAfkKickReason", kickTime))); for (final User user : ess.getOnlineUsers()) { if (user.isAuthorized("essentials.kick.notify")) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java index a0b5361a2..633140c63 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandban.java @@ -55,7 +55,7 @@ public class Commandban extends EssentialsCommand { final String banDisplay = tlLiteral("banFormat", banReason, senderDisplayName); - user.getBase().kickPlayer(banDisplay); + user.getBase().kickPlayer(AdventureUtil.miniToLegacy(banDisplay)); ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("playerBanned", senderDisplayName, user.getName(), banDisplay))); if (nomatch) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java index 99b3fd54e..a9cc79ed1 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbanip.java @@ -52,7 +52,7 @@ public class Commandbanip extends EssentialsCommand { banReason = tlLiteral("defaultBanReason"); } - final String banDisplay = tlLiteral("banFormat", banReason, senderDisplayName); + final String banDisplay = AdventureUtil.miniToLegacy(tlLiteral("banFormat", banReason, senderDisplayName)); ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, null, senderName); ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("playerBanIpAddress", senderDisplayName, ipAddress, banReason))); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java index 2ebacb858..270290c80 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java @@ -7,6 +7,7 @@ import com.earth2me.essentials.textreader.IText; import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.TextInput; import com.earth2me.essentials.textreader.TextPager; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.NumberUtil; import org.bukkit.Server; import org.bukkit.command.Command; @@ -44,7 +45,7 @@ public class Commandhelp extends EssentialsCommand { final IEssentialsCommand essCommand = isEssCommand ? ess.getCommandMap().get(knownCmd.getValue().getName()) : null; if (essCommand != null && !essCommand.getUsageStrings().isEmpty()) { for (Map.Entry usage : essCommand.getUsageStrings().entrySet()) { - user.sendTl("commandHelpLineUsage", usage.getKey().replace("", cmd), usage.getValue()); + user.sendTl("commandHelpLineUsage", usage.getKey().replace("", cmd), AdventureUtil.parsed(usage.getValue())); } } else { user.sendMessage(knownCmd.getValue().getUsage()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java index d3844bd9a..0efb0fd07 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkick.java @@ -39,7 +39,7 @@ public class Commandkick extends EssentialsCommand { } } - String kickReason = args.length > 1 ? getFinalArg(args, 1) : tlLiteral("kickDefault"); + String kickReason = args.length > 1 ? getFinalArg(args, 1) : AdventureUtil.miniToLegacy(tlLiteral("kickDefault")); kickReason = FormatUtil.replaceFormat(kickReason.replace("\\n", "\n").replace("|", "\n")); final UserKickEvent event = new UserKickEvent(user, target, kickReason); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkickall.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkickall.java index 75d9996f6..6d53141af 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkickall.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkickall.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.FormatUtil; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -14,7 +15,7 @@ public class Commandkickall extends EssentialsCommand { @Override public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - String kickReason = args.length > 0 ? getFinalArg(args, 0) : tlLiteral("kickDefault"); + String kickReason = args.length > 0 ? getFinalArg(args, 0) : AdventureUtil.miniToLegacy(tlLiteral("kickDefault")); kickReason = FormatUtil.replaceFormat(kickReason.replace("\\n", "\n").replace("|", "\n")); for (final Player onlinePlayer : ess.getOnlinePlayers()) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java index 6498b9796..eda41aab5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.CommonPlaceholders; import com.google.common.collect.Lists; import net.ess3.api.IUser; @@ -74,7 +75,7 @@ public class Commandnear extends EssentialsCommand { } catch (final NumberFormatException ignored) { } } - sender.sendTl("nearbyPlayers", getLocal(sender, otherUser, radius)); + sender.sendTl("nearbyPlayers", AdventureUtil.parsed(getLocal(sender, otherUser, radius))); } private String getLocal(final CommandSource source, final User user, final long radius) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java index bcf166954..7c785a835 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempban.java @@ -53,7 +53,8 @@ public class Commandtempban extends EssentialsCommand { ess.getServer().getBanList(BanList.Type.NAME).addBan(user.getName(), banReason, new Date(banTimestamp), senderName); final String expiry = DateUtil.formatDateDiff(banTimestamp); - user.getBase().kickPlayer(user.playerTl("tempBanned", expiry, senderDisplayName, banReason)); + final String banDisplay = user.playerTl("tempBanned", expiry, senderDisplayName, banReason); + user.getBase().kickPlayer(AdventureUtil.miniToLegacy(banDisplay)); ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("playerTempBanned", senderDisplayName, user.getName(), expiry, banReason))); ess.broadcastTl((IUser) null, "essentials.ban.notify", "playerTempBanned", senderDisplayName, user.getName(), expiry, banReason); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java index 47f7fd20a..4b0865740 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtempbanip.java @@ -63,7 +63,7 @@ public class Commandtempbanip extends EssentialsCommand { ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, new Date(banTimestamp), senderName); - final String banDisplay = tlLiteral("banFormat", banReason, senderDisplayName); + final String banDisplay = AdventureUtil.miniToLegacy(tlLiteral("banFormat", banReason, senderDisplayName)); for (final Player player : ess.getServer().getOnlinePlayers()) { if (player.getAddress().getAddress().getHostAddress().equalsIgnoreCase(ipAddress)) { player.kickPlayer(banDisplay); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java index 69f613399..1cab26deb 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java @@ -90,11 +90,11 @@ public class Commandtogglejail extends EssentialsCommand { final Object[] objects; if (timeDiff > 0) { tlKey = "jailNotifyJailedFor"; - objects = new Object[]{player.getName(), DateUtil.formatDateDiff(finalDisplayTime)}; + objects = new Object[]{player.getName(), DateUtil.formatDateDiff(finalDisplayTime), sender.getSender().getName()}; sender.sendTl("playerJailedFor", player.getName(), DateUtil.formatDateDiff(finalDisplayTime)); } else { tlKey = "jailNotifyJailed"; - objects = new Object[]{player.getName(), sender.getSender().getName()}; + objects = new Object[]{player.getName(), sender.getSender().getName(), sender.getSender().getName()}; sender.sendTl("playerJailed", player.getName()); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java b/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java index b9312aa6c..a4d37fb98 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java +++ b/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java @@ -28,7 +28,7 @@ public class HelpInput implements IText { String pluginName = ""; String pluginNameLow = ""; if (!match.equalsIgnoreCase("")) { - lines.add(user.playerTl("helpMatching", match)); + lines.add(AdventureUtil.miniToLegacy(user.playerTl("helpMatching", match))); } final Multimap pluginCommands = HashMultimap.create(); @@ -50,7 +50,7 @@ public class HelpInput implements IText { if (pluginNameLow.equals(match)) { lines.clear(); newLines.clear(); - lines.add(user.playerTl("helpFrom", p.getDescription().getName())); + lines.add(AdventureUtil.miniToLegacy(user.playerTl("helpFrom", p.getDescription().getName()))); } final boolean isOnWhitelist = user.isAuthorized("essentials.help." + pluginNameLow); @@ -69,7 +69,7 @@ public class HelpInput implements IText { if (pluginNameLow.contains("essentials")) { final String node = "essentials." + commandName; if (!ess.getSettings().isCommandDisabled(commandName) && user.isAuthorized(node)) { - pluginLines.add(user.playerTl("helpLine", commandName, commandDescription)); + pluginLines.add(AdventureUtil.miniToLegacy(user.playerTl("helpLine", commandName, commandDescription))); } } else { if (ess.getSettings().showNonEssCommandsInHelp()) { @@ -82,7 +82,7 @@ public class HelpInput implements IText { } if (isOnWhitelist || user.isAuthorized("essentials.help." + pluginNameLow + "." + commandName)) { - pluginLines.add(user.playerTl("helpLine", commandName, commandDescription)); + pluginLines.add(AdventureUtil.miniToLegacy(user.playerTl("helpLine", commandName, commandDescription))); } else if (permissions.length != 0) { boolean enabled = false; @@ -94,11 +94,11 @@ public class HelpInput implements IText { } if (enabled) { - pluginLines.add(user.playerTl("helpLine", commandName, commandDescription)); + pluginLines.add(AdventureUtil.miniToLegacy(user.playerTl("helpLine", commandName, commandDescription))); } } else { if (!ess.getSettings().hidePermissionlessHelp()) { - pluginLines.add(user.playerTl("helpLine", commandName, commandDescription)); + pluginLines.add(AdventureUtil.miniToLegacy(user.playerTl("helpLine", commandName, commandDescription))); } } } @@ -112,7 +112,7 @@ public class HelpInput implements IText { break; } if (match.equalsIgnoreCase("")) { - lines.add(user.playerTl("helpPlugin", pluginName, pluginNameLow)); + lines.add(AdventureUtil.miniToLegacy(user.playerTl("helpPlugin", pluginName, pluginNameLow))); } } } catch (final NullPointerException ignored) { diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java index 4a7891016..bb7eee63e 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java @@ -1,5 +1,6 @@ package net.essentialsx.discordlink.listeners; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.FormatUtil; import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; import net.essentialsx.api.v2.events.UserMailEvent; @@ -153,7 +154,7 @@ public class LinkBukkitListener implements Listener { switch (ess.getSettings().getLinkPolicy()) { case KICK: { - final Runnable kickTask = () -> event.getUser().getBase().kickPlayer(event.getUser().playerTl("discordLinkLoginKick", "/link " + finalCode, ess.getApi().getInviteUrl())); + final Runnable kickTask = () -> event.getUser().getBase().kickPlayer(AdventureUtil.miniToLegacy(event.getUser().playerTl("discordLinkLoginKick", "/link " + finalCode, ess.getApi().getInviteUrl()))); if (Bukkit.isPrimaryThread()) { kickTask.run(); } else { From d4ecfd226368a82f8b2ed8c004679cb01518b81e Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 5 Feb 2024 13:15:13 -0500 Subject: [PATCH 02/33] Fix component appending in social spy (#5650) fixes #5649 this time it wasn't me! --- .../java/com/earth2me/essentials/EssentialsPlayerListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 1f5e784a7..26409815f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -645,7 +645,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor { final Component base = (user.isMuted() && ess.getSettings().getSocialSpyListenMutedPlayers()) ? spyer.tlComponent("socialSpyMutedPrefix") : spyer.tlComponent("socialSpyPrefix"); - spyer.sendComponent(base.append(Component.text(AdventureUtil.legacyToAdventure(player.getDisplayName()) + ": " + event.getMessage()))); + spyer.sendComponent(base.append(AdventureUtil.legacyToAdventure(player.getDisplayName())).append(Component.text(": " + event.getMessage()))); } } } From 4134b5fb997eaf9f0886260db4f93ffbb4c9f652 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:13:02 -0500 Subject: [PATCH 03/33] Fix format parsing for command usage strings --- .../java/com/earth2me/essentials/commands/Commandhelp.java | 2 +- .../com/earth2me/essentials/commands/EssentialsCommand.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java index 270290c80..453a35bbc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java @@ -45,7 +45,7 @@ public class Commandhelp extends EssentialsCommand { final IEssentialsCommand essCommand = isEssCommand ? ess.getCommandMap().get(knownCmd.getValue().getName()) : null; if (essCommand != null && !essCommand.getUsageStrings().isEmpty()) { for (Map.Entry usage : essCommand.getUsageStrings().entrySet()) { - user.sendTl("commandHelpLineUsage", usage.getKey().replace("", cmd), AdventureUtil.parsed(usage.getValue())); + user.sendTl("commandHelpLineUsage", AdventureUtil.parsed(usage.getKey().replace("", cmd)), AdventureUtil.parsed(usage.getValue())); } } else { user.sendMessage(knownCmd.getValue().getUsage()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 52fe19b7b..36cdad3e4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -10,7 +10,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.ess3.api.IEssentials; -import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -67,7 +66,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand { final Matcher matcher = ARGUMENT_PATTERN.matcher(usage); while (matcher.find()) { final String color = matcher.group(3).equals("<") ? tlLiteral("commandArgumentRequired") : tlLiteral("commandArgumentOptional"); - matcher.appendReplacement(buffer, "$1" + color + matcher.group(2).replace("|", tlLiteral("commandArgumentOr") + "|" + color) + ChatColor.RESET); + matcher.appendReplacement(buffer, "$1" + color + matcher.group(2).replace("|", tlLiteral("commandArgumentOr") + "|" + color) + ""); } matcher.appendTail(buffer); usageStrings.put(buffer.toString(), description); From 51075adec6c411e1acee90b79ea3c882c2a70b7f Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:17:26 -0500 Subject: [PATCH 04/33] Fix format parsing in /near (Fixes #5641) --- .../java/com/earth2me/essentials/commands/Commandnear.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java index eda41aab5..34bc3aaa9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnear.java @@ -3,9 +3,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.google.common.collect.Lists; -import net.ess3.api.IUser; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; @@ -59,7 +57,7 @@ public class Commandnear extends EssentialsCommand { if (otherUser == null || !user.isAuthorized("essentials.near.others")) { otherUser = user; } - user.sendTl("nearbyPlayers", getLocal(user.getSource(), otherUser, radius)); + user.sendTl("nearbyPlayers", AdventureUtil.parsed(getLocal(user.getSource(), otherUser, radius))); } @Override @@ -109,7 +107,7 @@ public class Commandnear extends EssentialsCommand { if (nearbyPlayer == null) { continue; } - output.append(user.playerTl("nearbyPlayersList", CommonPlaceholders.displayName((IUser) nearbyPlayer), (long)nearbyPlayer.getLocation().distance(loc))); + output.append(user.playerTl("nearbyPlayersList", nearbyPlayer.getDisplayName(), (long)nearbyPlayer.getLocation().distance(loc))); } return output.length() > 1 ? output.toString() : source.tl("none"); From 1e040fa7b5b716b16589af61602e61471b772112 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:27:04 -0500 Subject: [PATCH 05/33] Fix format parsing in /me (Fixes #5654) --- .../essentials/commands/Commandme.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java index a38ae5487..46cd33d17 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java @@ -2,10 +2,8 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.FormatUtil; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import net.essentialsx.api.v2.events.UserActionEvent; import org.bukkit.Bukkit; @@ -45,9 +43,8 @@ public class Commandme extends EssentialsCommand { user.setDisplayNick(); long radius = ess.getSettings().getChatRadius(); - final String toSend = tlLiteral("action", CommonPlaceholders.displayName((IUser) user), message); if (radius < 1) { - ess.broadcastMessage(user, toSend); + ess.broadcastTl("action", user.getDisplayName(), message); ess.getServer().getPluginManager().callEvent(new UserActionEvent(user, message, Collections.unmodifiableCollection(ess.getServer().getOnlinePlayers()))); return; } @@ -55,7 +52,7 @@ public class Commandme extends EssentialsCommand { final World world = user.getWorld(); final Location loc = user.getLocation(); - final Set outList = new HashSet<>(); + final Set outList = new HashSet<>(); for (final Player player : Bukkit.getOnlinePlayers()) { final User onlineUser = ess.getUser(player); @@ -74,13 +71,13 @@ public class Commandme extends EssentialsCommand { } if (abort) { if (onlineUser.isAuthorized("essentials.chat.spy")) { - outList.add(player); // Just use the same list unless we wanted to format spyying for this. + outList.add(onlineUser); // Just use the same list unless we wanted to format spyying for this. } } else { - outList.add(player); + outList.add(onlineUser); } } else { - outList.add(player); // Add yourself to the list. + outList.add(onlineUser); // Add yourself to the list. } } @@ -88,10 +85,19 @@ public class Commandme extends EssentialsCommand { user.sendTl("localNoOne"); } - for (final Player onlinePlayer : outList) { - onlinePlayer.sendMessage(toSend); + for (final User onlineUser : outList) { + onlineUser.sendTl("action", user.getDisplayName(), message); + } + + // Only take the time to generate this list if there are listeners. + if (UserActionEvent.getHandlerList().getRegisteredListeners().length > 0) { + final Set outListPlayers = new HashSet<>(); + for (final User onlineUser : outList) { + outListPlayers.add(onlineUser.getBase()); + } + + ess.getServer().getPluginManager().callEvent(new UserActionEvent(user, message, Collections.unmodifiableCollection(outListPlayers))); } - ess.getServer().getPluginManager().callEvent(new UserActionEvent(user, message, Collections.unmodifiableCollection(outList))); } @Override From 596ba6e2f5928063fdaa3a039530a38cb511e3fc Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:31:28 -0500 Subject: [PATCH 06/33] Fix format parsing in /ptime (Fixes #5655) --- .../java/com/earth2me/essentials/commands/Commandptime.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java index ef6264912..9e66b0e2a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandptime.java @@ -3,6 +3,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.DescParseTickFormat; import com.google.common.collect.Lists; import org.bukkit.Server; @@ -82,7 +83,7 @@ public class Commandptime extends EssentialsLoopCommand { } final String formattedTime = DescParseTickFormat.format(ticks); - sender.sendTl(fixed ? "pTimeSetFixed" : "pTimeSet", formattedTime, joiner.toString()); + sender.sendTl(fixed ? "pTimeSetFixed" : "pTimeSet", AdventureUtil.parsed(formattedTime), joiner.toString()); } public void getUserTime(final CommandSource sender, final IUser user) { @@ -96,7 +97,7 @@ public class Commandptime extends EssentialsLoopCommand { } final String time = DescParseTickFormat.format(user.getBase().getPlayerTime()); - sender.sendTl(user.getBase().isPlayerTimeRelative() ? "pTimeCurrent" : "pTimeCurrentFixed", user.getName(), time); + sender.sendTl(user.getBase().isPlayerTimeRelative() ? "pTimeCurrent" : "pTimeCurrentFixed", user.getName(), AdventureUtil.parsed(time)); } private void setUserTime(final User user, final Long ticks, final Boolean relative) { From 544f69aec807c4f11cdaa8ce3f0389b63440d4b9 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:40:15 -0500 Subject: [PATCH 07/33] Fix format parsing in /kit (Fixes #5651) --- .../com/earth2me/essentials/commands/Commandkit.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java index 3cdbecb76..1394a3c5e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkit.java @@ -3,9 +3,8 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.Kit; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.StringUtil; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import org.bukkit.Server; @@ -24,7 +23,7 @@ public class Commandkit extends EssentialsCommand { public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { final String kitList = ess.getKits().listKits(ess, user); - user.sendTl(kitList.length() > 0 ? "kits" : "noKits", kitList); + user.sendTl(kitList.length() > 0 ? "kits" : "noKits", AdventureUtil.parsed(kitList)); throw new NoChargeException(); } else if (args.length > 1 && user.isAuthorized("essentials.kit.others")) { giveKits(getPlayer(server, user, args, 1), user, StringUtil.sanitizeString(args[0].toLowerCase(Locale.ENGLISH)).trim()); @@ -37,7 +36,7 @@ public class Commandkit extends EssentialsCommand { public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { final String kitList = ess.getKits().listKits(ess, null); - sender.sendTl(kitList.length() > 0 ? "kits" : "noKits", kitList); + sender.sendTl(kitList.length() > 0 ? "kits" : "noKits", AdventureUtil.parsed(kitList)); throw new NoChargeException(); } else { final User userTo = getPlayer(server, args, 1, true, false); @@ -45,7 +44,7 @@ public class Commandkit extends EssentialsCommand { for (final String kitName : args[0].toLowerCase(Locale.ENGLISH).split(",")) { new Kit(kitName, ess).expandItems(userTo); - sender.sendTl("kitGiveTo", kitName, CommonPlaceholders.displayName((IUser) userTo)); + sender.sendTl("kitGiveTo", kitName, userTo.getDisplayName()); userTo.sendTl("kitReceive", kitName); } } @@ -81,7 +80,7 @@ public class Commandkit extends EssentialsCommand { kit.chargeUser(userTo); if (!userFrom.equals(userTo)) { - userFrom.sendTl("kitGiveTo", kit.getName(), CommonPlaceholders.displayName((IUser) userTo)); + userFrom.sendTl("kitGiveTo", kit.getName(), userTo.getDisplayName()); } userTo.sendTl("kitReceive", kit.getName()); From 3d9d3a325432b1a49895e4330a6141e254b61801 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:40:40 -0500 Subject: [PATCH 08/33] Fix format parsing in /home (Fixes #5653) --- .../java/com/earth2me/essentials/commands/Commandhome.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java index 11535f4f5..a8017dcbf 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhome.java @@ -3,6 +3,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.OfflinePlayerStub; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.StringUtil; import io.papermc.lib.PaperLib; import net.ess3.api.TranslatableException; @@ -97,7 +98,7 @@ public class Commandhome extends EssentialsCommand { homes.add(user.playerTl("bedNull")); } } - user.sendTl("homes", StringUtil.joinList(homes), count, getHomeLimit(finalPlayer)); + user.sendTl("homes", AdventureUtil.parsed(StringUtil.joinList(homes)), count, getHomeLimit(finalPlayer)); } }); if (!player.getBase().isOnline() || player.getBase() instanceof OfflinePlayerStub) { From 8a57856c9644bda3e8c19a622e29eba281d14fc2 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 9 Feb 2024 23:01:20 -0500 Subject: [PATCH 09/33] Remove CommonPlaceholders#displayName methods I18n argument mutation already converts legacy color codes to parsed MiniMessage. This was redundant and was creating issues with other parts of the codebase. --- .../essentials/EssentialsPlayerListener.java | 2 +- .../java/com/earth2me/essentials/User.java | 22 +++++++++---------- .../essentials/commands/Commandafk.java | 6 ++--- .../essentials/commands/Commandbalance.java | 6 ++--- .../essentials/commands/Commandburn.java | 4 +--- .../essentials/commands/Commandeco.java | 4 +--- .../commands/Commandessentials.java | 4 +--- .../essentials/commands/Commandexp.java | 6 ++--- .../essentials/commands/Commandext.java | 4 +--- .../essentials/commands/Commandfeed.java | 4 +--- .../essentials/commands/Commandfly.java | 5 ++--- .../essentials/commands/Commandgamemode.java | 6 ++--- .../essentials/commands/Commandgive.java | 6 ++--- .../essentials/commands/Commandheal.java | 4 +--- .../essentials/commands/Commandhelpop.java | 6 ++--- .../essentials/commands/Commandice.java | 3 +-- .../essentials/commands/Commandkitreset.java | 6 ++--- .../essentials/commands/Commandlightning.java | 4 +--- .../essentials/commands/Commandmail.java | 10 ++++----- .../essentials/commands/Commandmsgtoggle.java | 4 +--- .../essentials/commands/Commandmute.java | 11 +++++----- .../essentials/commands/Commandnick.java | 6 ++--- .../essentials/commands/Commandpay.java | 4 +--- .../essentials/commands/Commandpaytoggle.java | 4 +--- .../essentials/commands/Commandrealname.java | 4 +--- .../essentials/commands/Commandrest.java | 3 +-- .../essentials/commands/Commandrtoggle.java | 3 +-- .../essentials/commands/Commandseen.java | 2 +- .../essentials/commands/Commandsell.java | 3 +-- .../essentials/commands/Commandsocialspy.java | 4 ++-- .../essentials/commands/Commandspeed.java | 5 ++--- .../essentials/commands/Commandsuicide.java | 3 +-- .../essentials/commands/Commandtp.java | 15 ++++++------- .../essentials/commands/Commandtpa.java | 17 +++++++------- .../essentials/commands/Commandtpaall.java | 5 ++--- .../essentials/commands/Commandtpaccept.java | 3 +-- .../essentials/commands/Commandtpahere.java | 13 +++++------ .../essentials/commands/Commandtpauto.java | 3 +-- .../essentials/commands/Commandtpdeny.java | 5 ++--- .../essentials/commands/Commandtphere.java | 3 +-- .../essentials/commands/Commandtpo.java | 3 +-- .../essentials/commands/Commandtpoffline.java | 3 +-- .../essentials/commands/Commandtptoggle.java | 3 +-- .../essentials/commands/Commandunlimited.java | 5 ++--- .../essentials/commands/Commandvanish.java | 4 ++-- .../essentials/commands/Commandwhois.java | 2 +- .../essentials/signs/SignGameMode.java | 4 +--- .../essentials/utils/CommonPlaceholders.java | 10 --------- .../essentials/chat/Commandtoggleshout.java | 4 +--- .../geoip/EssentialsGeoIPPlayerListener.java | 6 ++--- .../essentials/spawn/Commandspawn.java | 4 +--- 51 files changed, 100 insertions(+), 180 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 26409815f..a7bca0435 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -455,7 +455,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor { user.getBase().setAllowFlight(true); user.getBase().setFlying(true); if (ess.getSettings().isSendFlyEnableOnJoin()) { - user.sendTl("flyMode", CommonPlaceholders.enableDisable(user.getSource(), true), CommonPlaceholders.displayName(user)); + user.sendTl("flyMode", CommonPlaceholders.enableDisable(user.getSource(), true), user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index fe0c74f6a..46e2e03e4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -7,7 +7,6 @@ import com.earth2me.essentials.economy.EconomyLayers; import com.earth2me.essentials.messaging.IMessageRecipient; import com.earth2me.essentials.messaging.SimpleMessageRecipient; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.EnumUtil; import com.earth2me.essentials.utils.FormatUtil; @@ -16,7 +15,6 @@ import com.earth2me.essentials.utils.TriState; import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; import net.ess3.api.IEssentials; -import net.ess3.api.IUser; import net.ess3.api.MaxMoneyException; import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.JailStatusChangeEvent; @@ -250,7 +248,7 @@ public class User extends UserData implements Comparable, IMessageRecipien setMoney(getMoney().add(value), cause); sendTl("addedToAccount", NumberUtil.displayCurrency(value, ess)); if (initiator != null) { - initiator.sendTl("addedToOthersAccount", NumberUtil.displayCurrency(value, ess), CommonPlaceholders.displayName((IUser) this), NumberUtil.displayCurrency(getMoney(), ess)); + initiator.sendTl("addedToOthersAccount", NumberUtil.displayCurrency(value, ess), getDisplayName(), NumberUtil.displayCurrency(getMoney(), ess)); } } @@ -267,8 +265,8 @@ public class User extends UserData implements Comparable, IMessageRecipien if (canAfford(value)) { setMoney(getMoney().subtract(value), cause); reciever.setMoney(reciever.getMoney().add(value), cause); - sendTl("moneySentTo", NumberUtil.displayCurrency(value, ess), CommonPlaceholders.displayName((IUser) reciever)); - reciever.sendTl("moneyRecievedFrom", NumberUtil.displayCurrency(value, ess), CommonPlaceholders.displayName((IUser) this)); + sendTl("moneySentTo", NumberUtil.displayCurrency(value, ess), reciever.getDisplayName()); + reciever.sendTl("moneyRecievedFrom", NumberUtil.displayCurrency(value, ess), getDisplayName()); final TransactionEvent transactionEvent = new TransactionEvent(this.getSource(), reciever, value); ess.getServer().getPluginManager().callEvent(transactionEvent); } else { @@ -297,7 +295,7 @@ public class User extends UserData implements Comparable, IMessageRecipien } sendTl("takenFromAccount", NumberUtil.displayCurrency(value, ess)); if (initiator != null) { - initiator.sendTl("takenFromOthersAccount", NumberUtil.displayCurrency(value, ess), CommonPlaceholders.displayName((IUser) this), NumberUtil.displayCurrency(getMoney(), ess)); + initiator.sendTl("takenFromOthersAccount", NumberUtil.displayCurrency(value, ess), getDisplayName(), NumberUtil.displayCurrency(getMoney(), ess)); } } @@ -409,7 +407,7 @@ public class User extends UserData implements Comparable, IMessageRecipien } teleportRequestQueue.remove(playerUsername); if (inform) { - sendTl("requestTimedOutFrom", CommonPlaceholders.displayName((IUser) ess.getUser(request.getRequesterUuid()))); + sendTl("requestTimedOutFrom", ess.getUser(request.getRequesterUuid()).getDisplayName()); } return null; } @@ -443,7 +441,7 @@ public class User extends UserData implements Comparable, IMessageRecipien } } else { if (inform) { - sendTl("requestTimedOutFrom", CommonPlaceholders.displayName((IUser) ess.getUser(request.getRequesterUuid()))); + sendTl("requestTimedOutFrom", ess.getUser(request.getRequesterUuid()).getDisplayName()); } teleportRequestQueue.remove(key); } @@ -806,9 +804,9 @@ public class User extends UserData implements Comparable, IMessageRecipien if (broadcast && !isHidden() && !isAfk()) { setDisplayNick(); if (ess.getSettings().broadcastAfkMessage()) { - ess.broadcastTl(this, u -> u == this, "userIsNotAway", CommonPlaceholders.displayName((IUser) this)); + ess.broadcastTl(this, u -> u == this, "userIsNotAway", getDisplayName()); } - sendTl("userIsNotAwaySelf", CommonPlaceholders.displayName((IUser) this)); + sendTl("userIsNotAwaySelf", getDisplayName()); } } lastActivity = System.currentTimeMillis(); @@ -861,9 +859,9 @@ public class User extends UserData implements Comparable, IMessageRecipien if (isAfk() && !isHidden()) { setDisplayNick(); if (ess.getSettings().broadcastAfkMessage()) { - ess.broadcastTl(this, u -> u == this, "userIsAway", CommonPlaceholders.displayName((IUser) this)); + ess.broadcastTl(this, u -> u == this, "userIsAway", getDisplayName()); } - sendTl("userIsAwaySelf", CommonPlaceholders.displayName((IUser) this)); + sendTl("userIsAwaySelf", getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java index 4514635f6..51ec11841 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandafk.java @@ -2,9 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.DateUtil; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import net.ess3.api.events.AfkStatusChangeEvent; import org.bukkit.Server; @@ -97,10 +95,10 @@ public class Commandafk extends EssentialsCommand { } if (!tlKey.isEmpty() && ess.getSettings().broadcastAfkMessage()) { // exclude user from receiving general AFK announcement in favor of personal message - ess.broadcastTl(user, u -> u == user, tlKey, CommonPlaceholders.displayName((IUser) user), message); + ess.broadcastTl(user, u -> u == user, tlKey, user.getDisplayName(), message); } if (!selfTlKey.isEmpty()) { - user.sendTl(selfTlKey, CommonPlaceholders.displayName((IUser) user), message); + user.sendTl(selfTlKey, user.getDisplayName(), message); } user.setDisplayNick(); // Set this again after toggling } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java index 5ab239d31..67a8db25e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalance.java @@ -2,9 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.NumberUtil; -import net.ess3.api.IUser; import org.bukkit.Server; import java.util.Collections; @@ -22,14 +20,14 @@ public class Commandbalance extends EssentialsCommand { } final User target = getPlayer(server, args, 0, false, true); - sender.sendTl("balanceOther", target.isHidden() ? target.getName() : CommonPlaceholders.displayName((IUser) target), NumberUtil.displayCurrency(target.getMoney(), ess)); + sender.sendTl("balanceOther", target.isHidden() ? target.getName() : target.getDisplayName(), NumberUtil.displayCurrency(target.getMoney(), ess)); } @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { if (args.length == 1 && user.isAuthorized("essentials.balance.others")) { final User target = getPlayer(server, args, 0, true, true); - user.sendTl("balanceOther", target.isHidden() ? target.getName() : CommonPlaceholders.displayName((IUser) target), NumberUtil.displayCurrency(target.getMoney(), ess)); + user.sendTl("balanceOther", target.isHidden() ? target.getName() : target.getDisplayName(), NumberUtil.displayCurrency(target.getMoney(), ess)); } else if (args.length < 2) { user.sendTl("balance", NumberUtil.displayCurrency(user.getMoney(), ess)); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java index 0e2032e61..0455e2dad 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; import java.util.Collections; @@ -22,7 +20,7 @@ public class Commandburn extends EssentialsCommand { final User user = getPlayer(server, sender, args, 0); user.getBase().setFireTicks(Integer.parseInt(args[1]) * 20); - sender.sendTl("burnMsg", CommonPlaceholders.displayName((IUser) user), Integer.parseInt(args[1])); + sender.sendTl("burnMsg", user.getDisplayName(), Integer.parseInt(args[1])); } @Override diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java index 96b27646b..887703339 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandeco.java @@ -3,10 +3,8 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; -import net.ess3.api.IUser; import net.ess3.api.MaxMoneyException; import net.ess3.api.TranslatableException; import net.ess3.api.events.UserBalanceUpdateEvent; @@ -67,7 +65,7 @@ public class Commandeco extends EssentialsLoopCommand { final boolean aboveMax = userAmount.compareTo(maxBal) > 0; player.setMoney(underMin ? minBal : aboveMax ? maxBal : userAmount, UserBalanceUpdateEvent.Cause.COMMAND_ECO); player.sendTl("setBal", NumberUtil.displayCurrency(player.getMoney(), ess)); - sender.sendTl("setBalOthers", CommonPlaceholders.displayName((IUser) player), NumberUtil.displayCurrency(player.getMoney(), ess)); + sender.sendTl("setBalOthers", player.getDisplayName(), NumberUtil.displayCurrency(player.getMoney(), ess)); break; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java index bd2a1017f..eede838da 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java @@ -9,7 +9,6 @@ import com.earth2me.essentials.economy.EconomyLayers; import com.earth2me.essentials.userstorage.ModernUserMap; import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.CommandMapUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.EnumUtil; import com.earth2me.essentials.utils.FloatUtil; @@ -22,7 +21,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -485,7 +483,7 @@ public class Commandessentials extends EssentialsCommand { } final User user = getPlayer(server, args, 1, true, true); user.reset(); - sender.sendMessage("Reset Essentials userdata for player: " + CommonPlaceholders.displayName((IUser) user)); + sender.sendMessage("Reset Essentials userdata for player: " + user.getDisplayName()); } // Toggles debug mode. diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java index d579be1a3..9f4270aa0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandexp.java @@ -4,8 +4,6 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.SetExpFix; -import com.earth2me.essentials.messaging.IMessageRecipient; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; import org.bukkit.Server; @@ -99,7 +97,7 @@ public class Commandexp extends EssentialsLoopCommand { } private void showExp(final CommandSource sender, final IUser target) { - sender.sendTl("exp", CommonPlaceholders.displayNameRecipient((IMessageRecipient) target), SetExpFix.getTotalExperience(target.getBase()), target.getBase().getLevel(), SetExpFix.getExpUntilNextLevel(target.getBase())); + sender.sendTl("exp", target.getDisplayName(), SetExpFix.getTotalExperience(target.getBase()), target.getBase().getLevel(), SetExpFix.getExpUntilNextLevel(target.getBase())); } //TODO: Limit who can give negative exp? @@ -131,7 +129,7 @@ public class Commandexp extends EssentialsLoopCommand { amount = 0L; } SetExpFix.setTotalExperience(target.getBase(), (int) amount); - sender.sendTl("expSet", CommonPlaceholders.displayNameRecipient((IMessageRecipient) target), amount); + sender.sendTl("expSet", target.getDisplayName(), amount); } @Override diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java index 5344c557b..ba3df39f4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandext.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -38,7 +36,7 @@ public class Commandext extends EssentialsLoopCommand { @Override protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) { extPlayer(player.getBase()); - sender.sendTl("extinguishOthers", CommonPlaceholders.displayName((IUser) player)); + sender.sendTl("extinguishOthers", player.getDisplayName()); } private void extPlayer(final Player player) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java index ab1b2dfb0..72efa62ac 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfeed.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.event.entity.FoodLevelChangeEvent; @@ -44,7 +42,7 @@ public class Commandfeed extends EssentialsLoopCommand { protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws PlayerExemptException { try { feedPlayer(player.getBase()); - sender.sendTl("feedOther", CommonPlaceholders.displayName((IUser) player)); + sender.sendTl("feedOther", player.getDisplayName()); } catch (final QuietAbortException e) { //Handle Quietly } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfly.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfly.java index 885a52549..c6a38fa47 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfly.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandfly.java @@ -3,7 +3,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import net.ess3.api.events.FlyStatusChangeEvent; import org.bukkit.Server; @@ -39,9 +38,9 @@ public class Commandfly extends EssentialsToggleCommand { user.getBase().setFlying(false); } - user.sendTl("flyMode", CommonPlaceholders.enableDisable(user.getSource(), enabled), CommonPlaceholders.displayName((IUser) user)); + user.sendTl("flyMode", CommonPlaceholders.enableDisable(user.getSource(), enabled), user.getDisplayName()); if (!sender.isPlayer() || !sender.getPlayer().equals(user.getBase())) { - sender.sendTl("flyMode", CommonPlaceholders.enableDisable(user.getSource(), enabled), CommonPlaceholders.displayName((IUser) user)); + sender.sendTl("flyMode", CommonPlaceholders.enableDisable(user.getSource(), enabled), user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java index 65a6432c9..52a2a2215 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgamemode.java @@ -3,8 +3,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; -import com.earth2me.essentials.messaging.IMessageRecipient; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.google.common.collect.ImmutableList; import org.bukkit.GameMode; import org.bukkit.Server; @@ -62,7 +60,7 @@ public class Commandgamemode extends EssentialsLoopCommand { } user.getBase().setGameMode(gameMode); - user.sendTl("gameMode", user.playerTl(user.getBase().getGameMode().toString().toLowerCase(Locale.ENGLISH)), CommonPlaceholders.displayNameRecipient((IMessageRecipient) user)); + user.sendTl("gameMode", user.playerTl(user.getBase().getGameMode().toString().toLowerCase(Locale.ENGLISH)), user.getDisplayName()); } private void setUserGamemode(final CommandSource sender, final GameMode gameMode, final User user) throws NotEnoughArgumentsException { @@ -76,7 +74,7 @@ public class Commandgamemode extends EssentialsLoopCommand { } user.getBase().setGameMode(gameMode); - sender.sendTl("gameMode", sender.tl(gameMode.toString().toLowerCase(Locale.ENGLISH)), CommonPlaceholders.displayNameRecipient((IMessageRecipient) user)); + sender.sendTl("gameMode", sender.tl(gameMode.toString().toLowerCase(Locale.ENGLISH)), user.getDisplayName()); } // essentials.gamemode will let them change to any but essentials.gamemode.survival would only let them change to survival. diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java index cd7ecde5e..9991e826a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java @@ -4,11 +4,9 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.MetaItemStack; import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.Inventories; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import org.bukkit.Material; import org.bukkit.Server; @@ -81,7 +79,7 @@ public class Commandgive extends EssentialsLoopCommand { final boolean isDropItemsIfFull = ess.getSettings().isDropItemsIfFull(); final ItemStack finalStack = stack; loopOnlinePlayersConsumer(server, sender, false, true, args[0], player -> { - sender.sendTl("giveSpawn", finalStack.getAmount(), itemName, CommonPlaceholders.displayName((IUser) player)); + sender.sendTl("giveSpawn", finalStack.getAmount(), itemName, player.getDisplayName()); final Map leftovers = Inventories.addItem(player.getBase(), player.isAuthorized("essentials.oversizedstacks") ? ess.getSettings().getOversizedStackSize() : 0, finalStack); @@ -90,7 +88,7 @@ public class Commandgive extends EssentialsLoopCommand { final World w = player.getWorld(); w.dropItemNaturally(player.getLocation(), item); } else { - sender.sendTl("giveSpawnFailure", item.getAmount(), itemName, CommonPlaceholders.displayName((IUser) player)); + sender.sendTl("giveSpawnFailure", item.getAmount(), itemName, player.getDisplayName()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java index 4f27d86ce..e65eed752 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandheal.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityRegainHealthEvent; @@ -71,7 +69,7 @@ public class Commandheal extends EssentialsLoopCommand { player.removePotionEffect(effect.getType()); } } - sender.sendTl("healOther", CommonPlaceholders.displayName((IUser) user)); + sender.sendTl("healOther", user.getDisplayName()); } catch (final QuietAbortException e) { //Handle Quietly } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelpop.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelpop.java index 0e3ba10c7..28d5870dd 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelpop.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelpop.java @@ -5,7 +5,6 @@ import com.earth2me.essentials.Console; import com.earth2me.essentials.User; import com.earth2me.essentials.messaging.IMessageRecipient; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.FormatUtil; import net.ess3.api.IUser; import net.essentialsx.api.v2.events.HelpopMessageSendEvent; @@ -40,8 +39,7 @@ public class Commandhelpop extends EssentialsCommand { } final String message = FormatUtil.stripFormat(getFinalArg(args, 0)); - final AdventureUtil.ParsedPlaceholder displayName = CommonPlaceholders.displayNameRecipient(from); - ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("helpOp", displayName, message))); + ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("helpOp", from.getDisplayName(), message))); final List recipients = new ArrayList<>(); for (IUser user : ess.getOnlineUsers()) { @@ -54,7 +52,7 @@ public class Commandhelpop extends EssentialsCommand { ess.getServer().getPluginManager().callEvent(sendEvent); for (IUser recipient : sendEvent.getRecipients()) { - recipient.sendTl("helpOp", displayName, message); + recipient.sendTl("helpOp", from.getDisplayName(), message); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java index 098141151..4c802a79f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java @@ -3,7 +3,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.IUser; import net.ess3.api.MaxMoneyException; @@ -39,7 +38,7 @@ public class Commandice extends EssentialsLoopCommand { @Override protected void updatePlayer(Server server, CommandSource sender, User user, String[] args) throws NotEnoughArgumentsException, PlayerExemptException, ChargeException, MaxMoneyException { freezePlayer(user); - sender.sendTl("iceOther", CommonPlaceholders.displayName((IUser) user)); + sender.sendTl("iceOther", user.getDisplayName()); } private void freezePlayer(final IUser user) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java index 72bfad0dd..70c8873f7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkitreset.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import org.bukkit.Server; @@ -36,7 +34,7 @@ public class Commandkitreset extends EssentialsCommand { if (user.equals(target)) { user.sendTl("kitReset", kitName); } else { - user.sendTl("kitResetOther", kitName, CommonPlaceholders.displayName((IUser) target)); + user.sendTl("kitResetOther", kitName, target.getDisplayName()); } } @@ -53,7 +51,7 @@ public class Commandkitreset extends EssentialsCommand { final User target = getPlayer(server, sender, args, 1); target.setKitTimestamp(kitName, 0); - sender.sendTl("kitResetOther", kitName, CommonPlaceholders.displayName((IUser) target)); + sender.sendTl("kitResetOther", kitName, target.getDisplayName()); } @Override diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java index 5d1fc812e..a8a53db62 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlightning.java @@ -2,9 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.google.common.collect.Lists; -import net.ess3.api.IUser; import org.bukkit.Server; import org.bukkit.entity.LightningStrike; @@ -35,7 +33,7 @@ public class Commandlightning extends EssentialsLoopCommand { } final int finalPower = power; loopOnlinePlayersConsumer(server, sender, false, true, args[0], player -> { - sender.sendTl("lightningUse", CommonPlaceholders.displayName((IUser) player)); + sender.sendTl("lightningUse", player.getDisplayName()); final LightningStrike strike = player.getBase().getWorld().strikeLightningEffect(player.getBase().getLocation()); if (!player.isGodModeEnabled()) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java index fc19a582d..7dad73063 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java @@ -6,13 +6,11 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.messaging.IMessageRecipient; import com.earth2me.essentials.textreader.SimpleTextPager; import com.earth2me.essentials.textreader.SimpleTranslatableText; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; import com.google.common.collect.Lists; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import net.essentialsx.api.v2.services.mail.MailMessage; import org.bukkit.Server; @@ -102,7 +100,7 @@ public class Commandmail extends EssentialsCommand { u.sendMail(user, msg); } - user.sendTl("mailSentTo", CommonPlaceholders.displayName((IUser) u), u.getName()); + user.sendTl("mailSentTo", u.getDisplayName(), u.getName()); user.sendMessage(msg); return; } @@ -145,7 +143,7 @@ public class Commandmail extends EssentialsCommand { u.sendMail(user, msg, dateDiff); } - user.sendTl("mailSentToExpire", CommonPlaceholders.displayName((IUser) u), DateUtil.formatDateDiff(dateDiff), u.getName()); + user.sendTl("mailSentToExpire", u.getDisplayName(), DateUtil.formatDateDiff(dateDiff), u.getName()); user.sendMessage(msg); return; } @@ -187,7 +185,7 @@ public class Commandmail extends EssentialsCommand { final ArrayList mails = mailUser.getMailMessages(); if (mails == null || mails.isEmpty()) { - user.sendTl(mailUser == user ? "noMail" : "noMailOther", CommonPlaceholders.displayName((IUser) mailUser)); + user.sendTl(mailUser == user ? "noMail" : "noMailOther", mailUser.getDisplayName()); throw new NoChargeException(); } @@ -227,7 +225,7 @@ public class Commandmail extends EssentialsCommand { final ArrayList mails = mailUser.getMailMessages(); if (mails == null || mails.isEmpty()) { - sender.sendTl("noMailOther", CommonPlaceholders.displayName((IUser) mailUser)); + sender.sendTl("noMailOther", mailUser.getDisplayName()); throw new NoChargeException(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsgtoggle.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsgtoggle.java index df4aa2db9..1bdb484a5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsgtoggle.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmsgtoggle.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; public class Commandmsgtoggle extends EssentialsToggleCommand { @@ -31,7 +29,7 @@ public class Commandmsgtoggle extends EssentialsToggleCommand { user.sendTl(!enabled ? "msgEnabled" : "msgDisabled"); if (!sender.isPlayer() || !user.getBase().equals(sender.getPlayer())) { - sender.sendTl(!enabled ? "msgEnabledFor" : "msgDisabledFor", CommonPlaceholders.displayName((IUser) user)); + sender.sendTl(!enabled ? "msgEnabledFor" : "msgDisabledFor", user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java index d47b7c21f..53d1b2175 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmute.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.OfflinePlayerStub; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.DateUtil; import net.ess3.api.TranslatableException; import net.ess3.api.events.MuteStatusChangeEvent; @@ -87,18 +86,18 @@ public class Commandmute extends EssentialsCommand { if (muted) { if (muteTimestamp > 0) { if (!user.hasMuteReason()) { - sender.sendTl("mutedPlayerFor", CommonPlaceholders.displayName(user), muteTime); + sender.sendTl("mutedPlayerFor", user.getDisplayName(), muteTime); user.sendTl("playerMutedFor", muteTime); } else { - sender.sendTl("mutedPlayerForReason", CommonPlaceholders.displayName(user), muteTime, user.getMuteReason()); + sender.sendTl("mutedPlayerForReason", user.getDisplayName(), muteTime, user.getMuteReason()); user.sendTl("playerMutedForReason", muteTime, user.getMuteReason()); } } else { if (!user.hasMuteReason()) { - sender.sendTl("mutedPlayer", CommonPlaceholders.displayName(user)); + sender.sendTl("mutedPlayer", user.getDisplayName()); user.sendTl("playerMuted"); } else { - sender.sendTl("mutedPlayerReason", CommonPlaceholders.displayName(user), user.getMuteReason()); + sender.sendTl("mutedPlayerReason", user.getDisplayName(), user.getMuteReason()); user.sendTl("playerMutedReason", user.getMuteReason()); } } @@ -121,7 +120,7 @@ public class Commandmute extends EssentialsCommand { ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral(tlKey, objects))); ess.broadcastTl(null, "essentials.mute.notify", tlKey, objects); } else { - sender.sendTl("unmutedPlayer", CommonPlaceholders.displayName(user)); + sender.sendTl("unmutedPlayer", user.getDisplayName()); user.sendTl("playerUnmuted"); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java index cd69214fe..8b47afb02 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandnick.java @@ -2,9 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.FormatUtil; -import net.ess3.api.IUser; import net.ess3.api.TranslatableException; import net.ess3.api.events.NickChangeEvent; import org.bukkit.ChatColor; @@ -54,12 +52,12 @@ public class Commandnick extends EssentialsLoopCommand { if (!target.getDisplayName().equalsIgnoreCase(target.getDisplayName())) { target.sendTl("nickNoMore"); } - target.sendTl("nickSet", ess.getSettings().changeDisplayName() ? CommonPlaceholders.displayName((IUser) target) : nick); + target.sendTl("nickSet", ess.getSettings().changeDisplayName() ? target.getDisplayName() : nick); } else if (nickInUse(target, nick)) { throw new NotEnoughArgumentsException(sender.tl("nickInUse")); } else { setNickname(server, sender, target, nick); - target.sendTl("nickSet", ess.getSettings().changeDisplayName() ? CommonPlaceholders.displayName((IUser) target) : nick); + target.sendTl("nickSet", ess.getSettings().changeDisplayName() ? target.getDisplayName() : nick); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java index 4530c0ee1..734c90fc8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java @@ -3,11 +3,9 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; import com.google.common.collect.Lists; -import net.ess3.api.IUser; import net.ess3.api.MaxMoneyException; import net.ess3.api.TranslatableException; import net.ess3.api.events.UserBalanceUpdateEvent; @@ -88,7 +86,7 @@ public class Commandpay extends EssentialsLoopCommand { } if (!player.isAcceptingPay() || (ess.getSettings().isPayExcludesIgnoreList() && player.isIgnoredPlayer(user))) { - user.sendTl("notAcceptingPay", CommonPlaceholders.displayName((IUser) player)); + user.sendTl("notAcceptingPay", player.getDisplayName()); return; } if (user.isPromptingPayConfirm() && !amount.equals(user.getConfirmingPayments().get(player))) { // checks if exists and if command needs to be repeated. diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpaytoggle.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpaytoggle.java index a6e20e749..66efcf960 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpaytoggle.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpaytoggle.java @@ -2,8 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; public class Commandpaytoggle extends EssentialsToggleCommand { @@ -38,7 +36,7 @@ public class Commandpaytoggle extends EssentialsToggleCommand { user.sendTl(enabled ? "payToggleOn" : "payToggleOff"); if (!sender.isPlayer() || !user.getBase().equals(sender.getPlayer())) { - sender.sendTl(enabled ? "payEnabledFor" : "payDisabledFor", CommonPlaceholders.displayName((IUser) user)); + sender.sendTl(enabled ? "payEnabledFor" : "payDisabledFor", user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrealname.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrealname.java index a5e8ccbc5..387264115 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrealname.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrealname.java @@ -2,9 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.FormatUtil; -import net.ess3.api.IUser; import org.bukkit.Server; import java.util.Locale; @@ -31,7 +29,7 @@ public class Commandrealname extends EssentialsCommand { u.setDisplayNick(); if (FormatUtil.stripFormat(u.getDisplayName()).toLowerCase(Locale.ENGLISH).contains(lookup)) { foundUser = true; - sender.sendTl("realName", CommonPlaceholders.displayName((IUser) u), u.getName()); + sender.sendTl("realName", u.getDisplayName(), u.getName()); } } if (!foundUser) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java index 2060c139d..82946b4f0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrest.java @@ -3,7 +3,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Server; import org.bukkit.Statistic; @@ -35,7 +34,7 @@ public class Commandrest extends EssentialsLoopCommand { @Override protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws PlayerExemptException { restPlayer(player); - sender.sendTl("restOther", CommonPlaceholders.displayName(player)); + sender.sendTl("restOther", player.getDisplayName()); } private void restPlayer(final IUser user) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrtoggle.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrtoggle.java index 918b1a319..f566dbd54 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrtoggle.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrtoggle.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import org.bukkit.Server; public class Commandrtoggle extends EssentialsToggleCommand { @@ -30,7 +29,7 @@ public class Commandrtoggle extends EssentialsToggleCommand { user.sendTl(!enabled ? "replyLastRecipientDisabled" : "replyLastRecipientEnabled"); if (!sender.isPlayer() || !user.getBase().equals(sender.getPlayer())) { - sender.sendTl(!enabled ? "replyLastRecipientDisabledFor" : "replyLastRecipientEnabledFor", CommonPlaceholders.displayName(user)); + sender.sendTl(!enabled ? "replyLastRecipientDisabledFor" : "replyLastRecipientEnabledFor", user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java index ac6ae93be..6acfc2c45 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandseen.java @@ -102,7 +102,7 @@ public class Commandseen extends EssentialsCommand { private void seenOnline(final CommandSource sender, final User user, final boolean showIp) { user.setDisplayNick(); - sender.sendTl("seenOnline", CommonPlaceholders.displayName(user), DateUtil.formatDateDiff(user.getLastLogin())); + sender.sendTl("seenOnline", user.getDisplayName(), DateUtil.formatDateDiff(user.getLastLogin())); final List history = user.getPastUsernames(); if (history != null && !history.isEmpty()) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsell.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsell.java index a24d1044e..92ef2b3e2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsell.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsell.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.Inventories; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; import net.ess3.api.TranslatableException; @@ -123,7 +122,7 @@ public class Commandsell extends EssentialsCommand { final String typeName = is.getType().toString().toLowerCase(Locale.ENGLISH); final String worthDisplay = NumberUtil.displayCurrency(worth, ess); user.sendTl("itemSold", NumberUtil.displayCurrency(result, ess), amount, typeName, worthDisplay); - ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("itemSoldConsole", user.getName(), typeName, NumberUtil.displayCurrency(result, ess), amount, worthDisplay, CommonPlaceholders.displayName(user)))); + ess.getLogger().log(Level.INFO, AdventureUtil.miniToLegacy(tlLiteral("itemSoldConsole", user.getName(), typeName, NumberUtil.displayCurrency(result, ess), amount, worthDisplay, user.getDisplayName()))); return result; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsocialspy.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsocialspy.java index 3ff406db7..e8cd954d7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsocialspy.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsocialspy.java @@ -28,9 +28,9 @@ public class Commandsocialspy extends EssentialsToggleCommand { user.setSocialSpyEnabled(enabled); - user.sendTl("socialSpy", CommonPlaceholders.displayName(user), CommonPlaceholders.enableDisable(user.getSource(), enabled)); + user.sendTl("socialSpy", user.getDisplayName(), CommonPlaceholders.enableDisable(user.getSource(), enabled)); if (!sender.isPlayer() || !sender.getPlayer().equals(user.getBase())) { - sender.sendTl("socialSpy", CommonPlaceholders.displayName(user), CommonPlaceholders.enableDisable(user.getSource(), enabled)); + sender.sendTl("socialSpy", user.getDisplayName(), CommonPlaceholders.enableDisable(user.getSource(), enabled)); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java index f86a8d2fb..6eb6975ad 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspeed.java @@ -3,7 +3,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.earth2me.essentials.utils.FloatUtil; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -54,11 +53,11 @@ public class Commandspeed extends EssentialsCommand { if (isFly) { user.getBase().setFlySpeed(getRealMoveSpeed(speed, true, isBypass)); - user.sendTl("moveSpeed", AdventureUtil.parsed(user.playerTl("flying")), speed, CommonPlaceholders.displayName(user)); + user.sendTl("moveSpeed", AdventureUtil.parsed(user.playerTl("flying")), speed, user.getDisplayName()); return; } user.getBase().setWalkSpeed(getRealMoveSpeed(speed, false, isBypass)); - user.sendTl("moveSpeed", AdventureUtil.parsed(user.playerTl("walking")), speed, CommonPlaceholders.displayName(user)); + user.sendTl("moveSpeed", AdventureUtil.parsed(user.playerTl("walking")), speed, user.getDisplayName()); } private void speedOtherPlayers(final Server server, final CommandSource sender, final boolean isFly, final boolean isBypass, final float speed, final String name) throws PlayerNotFoundException { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java index 2abb5e07c..53b170f67 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import org.bukkit.Server; import org.bukkit.event.entity.EntityDamageEvent; @@ -21,7 +20,7 @@ public class Commandsuicide extends EssentialsCommand { user.getBase().setHealth(0); user.sendTl("suicideMessage"); user.setDisplayNick(); - ess.broadcastTl(user, "suicideSuccess", CommonPlaceholders.displayName(user)); + ess.broadcastTl(user, "suicideSuccess", user.getDisplayName()); } @Override diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java index cb0cad879..747775d4a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtp.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.Console; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import org.bukkit.Location; import org.bukkit.Server; @@ -29,12 +28,12 @@ public class Commandtp extends EssentialsCommand { final User player = getPlayer(server, user, args, 0, false, true); if (!player.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportDisabled", player.getDisplayName()); } if (!player.getBase().isOnline()) { if (user.isAuthorized("essentials.tpoffline")) { - throw new TranslatableException("teleportOffline", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportOffline", player.getDisplayName()); } throw new PlayerNotFoundException(); } @@ -80,7 +79,7 @@ public class Commandtp extends EssentialsCommand { } final Location locposother = new Location(target2.getWorld(), x, y, z, target2.getLocation().getYaw(), target2.getLocation().getPitch()); if (!target2.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(target2)); + throw new TranslatableException("teleportDisabled", target2.getDisplayName()); } user.sendTl("teleporting", locposother.getWorld().getName(), locposother.getBlockX(), locposother.getBlockY(), locposother.getBlockZ()); target2.getAsyncTeleport().now(locposother, false, TeleportCause.COMMAND, future); @@ -98,15 +97,15 @@ public class Commandtp extends EssentialsCommand { final User target = getPlayer(server, user, args, 0); final User toPlayer = getPlayer(server, user, args, 1); if (!target.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(target)); + throw new TranslatableException("teleportDisabled", target.getDisplayName()); } if (!toPlayer.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(toPlayer)); + throw new TranslatableException("teleportDisabled", toPlayer.getDisplayName()); } if (target.getWorld() != toPlayer.getWorld() && ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.worlds." + toPlayer.getWorld().getName())) { throw new TranslatableException("noPerm", "essentials.worlds." + toPlayer.getWorld().getName()); } - target.sendTl("teleportAtoB", CommonPlaceholders.displayName(user), CommonPlaceholders.displayName(toPlayer)); + target.sendTl("teleportAtoB", user.getDisplayName(), toPlayer.getDisplayName()); target.getAsyncTeleport().now(toPlayer.getBase(), false, TeleportCause.COMMAND, future); break; } @@ -121,7 +120,7 @@ public class Commandtp extends EssentialsCommand { final User target = getPlayer(server, args, 0, true, false); if (args.length == 2) { final User toPlayer = getPlayer(server, args, 1, true, false); - target.sendTl("teleportAtoB", Console.DISPLAY_NAME, CommonPlaceholders.displayName(toPlayer)); + target.sendTl("teleportAtoB", Console.DISPLAY_NAME, toPlayer.getDisplayName()); target.getAsyncTeleport().now(toPlayer.getBase(), false, TeleportCause.COMMAND, getNewExceptionFuture(sender, commandLabel)); } else if (args.length > 3) { final double x = args[1].startsWith("~") ? target.getLocation().getX() + (args[1].length() > 1 ? Double.parseDouble(args[1].substring(1)) : 0) : Double.parseDouble(args[1]); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java index 3f88df273..f33e83246 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpa.java @@ -3,7 +3,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.AsyncTeleport; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import net.ess3.api.events.TPARequestEvent; import org.bukkit.Server; @@ -29,10 +28,10 @@ public class Commandtpa extends EssentialsCommand { throw new NotEnoughArgumentsException(); } if (!player.isAuthorized("essentials.tpaccept")) { - throw new TranslatableException("teleportNoAcceptPermission", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportNoAcceptPermission", player.getDisplayName()); } if (!player.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportDisabled", player.getDisplayName()); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.worlds." + player.getWorld().getName())) { throw new TranslatableException("noPerm", "essentials.worlds." + player.getWorld().getName()); @@ -40,7 +39,7 @@ public class Commandtpa extends EssentialsCommand { // Don't let sender request teleport twice to the same player. if (player.hasOutstandingTpaRequest(user.getName(), false)) { - throw new TranslatableException("requestSentAlready", CommonPlaceholders.displayName(player)); + throw new TranslatableException("requestSentAlready", player.getDisplayName()); } if (player.isAutoTeleportEnabled() && !player.isIgnoredPlayer(user)) { @@ -51,8 +50,8 @@ public class Commandtpa extends EssentialsCommand { teleport.teleport(player.getBase(), charge, PlayerTeleportEvent.TeleportCause.COMMAND, future); future.thenAccept(success -> { if (success) { - player.sendTl("requestAcceptedAuto", CommonPlaceholders.displayName(user)); - user.sendTl("requestAcceptedFromAuto", CommonPlaceholders.displayName(player)); + player.sendTl("requestAcceptedAuto", user.getDisplayName()); + user.sendTl("requestAcceptedFromAuto", player.getDisplayName()); } }); throw new NoChargeException(); @@ -62,10 +61,10 @@ public class Commandtpa extends EssentialsCommand { final TPARequestEvent tpaEvent = new TPARequestEvent(user.getSource(), player, false); ess.getServer().getPluginManager().callEvent(tpaEvent); if (tpaEvent.isCancelled()) { - throw new TranslatableException("teleportRequestCancelled", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportRequestCancelled", player.getDisplayName()); } player.requestTeleport(user, false); - player.sendTl("teleportRequest", CommonPlaceholders.displayName(user)); + player.sendTl("teleportRequest", user.getDisplayName()); player.sendTl("typeTpaccept"); player.sendTl("typeTpdeny"); if (ess.getSettings().getTpaAcceptCancellation() != 0) { @@ -73,7 +72,7 @@ public class Commandtpa extends EssentialsCommand { } } - user.sendTl("requestSent", CommonPlaceholders.displayName(player)); + user.sendTl("requestSent", player.getDisplayName()); if (user.isAuthorized("essentials.tpacancel")) { user.sendTl("typeTpacancel"); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java index 5193d0531..9cc135294 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaall.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.events.TPARequestEvent; import org.bukkit.Server; @@ -45,11 +44,11 @@ public class Commandtpaall extends EssentialsCommand { final TPARequestEvent tpaEvent = new TPARequestEvent(sender, player, true); ess.getServer().getPluginManager().callEvent(tpaEvent); if (tpaEvent.isCancelled()) { - sender.sendTl("teleportRequestCancelled", CommonPlaceholders.displayName(player)); + sender.sendTl("teleportRequestCancelled", player.getDisplayName()); continue; } player.requestTeleport(target, true); - player.sendTl("teleportHereRequest", CommonPlaceholders.displayName(target)); + player.sendTl("teleportHereRequest", target.getDisplayName()); player.sendTl("typeTpaccept"); if (ess.getSettings().getTpaAcceptCancellation() != 0) { player.sendTl("teleportRequestTimeoutInfo", ess.getSettings().getTpaAcceptCancellation()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaccept.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaccept.java index b90e980b3..43398bdb7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaccept.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpaccept.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.AsyncTeleport; import com.earth2me.essentials.IUser; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import net.essentialsx.api.v2.events.TeleportRequestResponseEvent; import org.bukkit.Bukkit; @@ -105,7 +104,7 @@ public class Commandtpaccept extends EssentialsCommand { } final Trade charge = new Trade(this.getName(), ess); - requester.sendTl("requestAcceptedFrom", CommonPlaceholders.displayName(user)); + requester.sendTl("requestAcceptedFrom", user.getDisplayName()); final CompletableFuture future = getNewExceptionFuture(requester.getSource(), commandLabel); future.exceptionally(e -> { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java index d27ced895..54383495c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpahere.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import net.ess3.api.events.TPARequestEvent; import org.bukkit.Server; @@ -25,10 +24,10 @@ public class Commandtpahere extends EssentialsCommand { throw new NotEnoughArgumentsException(); } if (!player.isAuthorized("essentials.tpaccept")) { - throw new TranslatableException("teleportNoAcceptPermission", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportNoAcceptPermission", player.getDisplayName()); } if (!player.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportDisabled", player.getDisplayName()); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { throw new TranslatableException("noPerm", "essentials.worlds." + user.getWorld().getName()); @@ -36,24 +35,24 @@ public class Commandtpahere extends EssentialsCommand { // Don't let sender request teleport twice to the same player. if (player.hasOutstandingTpaRequest(user.getName(), true)) { - throw new TranslatableException("requestSentAlready", CommonPlaceholders.displayName(player)); + throw new TranslatableException("requestSentAlready", player.getDisplayName()); } if (!player.isIgnoredPlayer(user)) { final TPARequestEvent tpaEvent = new TPARequestEvent(user.getSource(), player, true); ess.getServer().getPluginManager().callEvent(tpaEvent); if (tpaEvent.isCancelled()) { - throw new TranslatableException("teleportRequestCancelled", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportRequestCancelled", player.getDisplayName()); } player.requestTeleport(user, true); - player.sendTl("teleportHereRequest", CommonPlaceholders.displayName(user)); + player.sendTl("teleportHereRequest", user.getDisplayName()); player.sendTl("typeTpaccept"); player.sendTl("typeTpdeny"); if (ess.getSettings().getTpaAcceptCancellation() != 0) { player.sendTl("teleportRequestTimeoutInfo", ess.getSettings().getTpaAcceptCancellation()); } } - user.sendTl("requestSent", CommonPlaceholders.displayName(player)); + user.sendTl("requestSent", player.getDisplayName()); user.sendTl("typeTpacancel"); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpauto.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpauto.java index efc97a0a4..c084f437e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpauto.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpauto.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import org.bukkit.Server; public class Commandtpauto extends EssentialsToggleCommand { @@ -33,7 +32,7 @@ public class Commandtpauto extends EssentialsToggleCommand { user.sendTl("teleportationDisabledWarning"); } if (!sender.isPlayer() || !user.getBase().equals(sender.getPlayer())) { - sender.sendTl(enabled ? "autoTeleportEnabledFor" : "autoTeleportDisabledFor", CommonPlaceholders.displayName(user)); + sender.sendTl(enabled ? "autoTeleportEnabledFor" : "autoTeleportDisabledFor", user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpdeny.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpdeny.java index 8f4f056b1..869eb7da2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpdeny.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpdeny.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import net.essentialsx.api.v2.events.TeleportRequestResponseEvent; import org.bukkit.Bukkit; @@ -55,7 +54,7 @@ public class Commandtpdeny extends EssentialsCommand { } user.sendTl("requestDenied"); - player.sendTl("requestDeniedFrom", CommonPlaceholders.displayName(user)); + player.sendTl("requestDeniedFrom", user.getDisplayName()); user.removeTpaRequest(denyRequest.getName()); } @@ -70,7 +69,7 @@ public class Commandtpdeny extends EssentialsCommand { } if (player != null && player.getBase().isOnline()) { - player.sendTl("requestDeniedFrom", CommonPlaceholders.displayName(user)); + player.sendTl("requestDeniedFrom", user.getDisplayName()); } user.removeTpaRequest(request.getName()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java index b3334dd35..c18609c5d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtphere.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -19,7 +18,7 @@ public class Commandtphere extends EssentialsCommand { public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { final User player = getPlayer(server, user, args, 0); if (!player.isTeleportEnabled()) { - throw new TranslatableException("teleportDisabled", CommonPlaceholders.displayName(player)); + throw new TranslatableException("teleportDisabled", player.getDisplayName()); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { throw new TranslatableException("noPerm", "essentials.worlds." + user.getWorld().getName()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java index 6ef2324a6..448628187 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpo.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -44,7 +43,7 @@ public class Commandtpo extends EssentialsCommand { target.getAsyncTeleport().now(toPlayer.getBase(), false, TeleportCause.COMMAND, future); future.thenAccept(success -> { if (success) { - target.sendTl("teleportAtoB", CommonPlaceholders.displayName(user), CommonPlaceholders.displayName(toPlayer)); + target.sendTl("teleportAtoB", user.getDisplayName(), toPlayer.getDisplayName()); } }); break; diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpoffline.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpoffline.java index 75ee93642..5448aa7cf 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpoffline.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtpoffline.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import org.bukkit.Location; import org.bukkit.Server; @@ -22,7 +21,7 @@ public class Commandtpoffline extends EssentialsCommand { final Location logout = target.getLogoutLocation(); if (logout == null) { - user.sendTl("teleportOfflineUnknown", CommonPlaceholders.displayName(user)); + user.sendTl("teleportOfflineUnknown", user.getDisplayName()); throw new NoChargeException(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtptoggle.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtptoggle.java index c01f7951e..cae89c1ec 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtptoggle.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtptoggle.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import org.bukkit.Server; public class Commandtptoggle extends EssentialsToggleCommand { @@ -30,7 +29,7 @@ public class Commandtptoggle extends EssentialsToggleCommand { user.sendTl(enabled ? "teleportationEnabled" : "teleportationDisabled"); if (!sender.isPlayer() || !user.getBase().equals(sender.getPlayer())) { - sender.sendTl(enabled ? "teleportationEnabledFor" : "teleportationDisabledFor", CommonPlaceholders.displayName(user)); + sender.sendTl(enabled ? "teleportationEnabledFor" : "teleportationDisabledFor", user.getDisplayName()); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java index a79de2f04..d3581c20f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java @@ -2,7 +2,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.Inventories; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.TranslatableException; import org.bukkit.Material; import org.bukkit.Server; @@ -82,9 +81,9 @@ public class Commandunlimited extends EssentialsCommand { } if (user != target) { - user.sendTl(message, itemname, CommonPlaceholders.displayName(target)); + user.sendTl(message, itemname, target.getDisplayName()); } - target.sendTl(message, itemname, CommonPlaceholders.displayName(target)); + target.sendTl(message, itemname, target.getDisplayName()); target.setUnlimited(stack, enableUnlimited); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandvanish.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandvanish.java index 316e2b58f..3c31bc14c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandvanish.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandvanish.java @@ -34,13 +34,13 @@ public class Commandvanish extends EssentialsToggleCommand { } user.setVanished(enabled); - user.sendTl("vanish", CommonPlaceholders.displayName(user), CommonPlaceholders.enableDisable(user.getSource(), enabled)); + user.sendTl("vanish", user.getDisplayName(), CommonPlaceholders.enableDisable(user.getSource(), enabled)); if (enabled) { user.sendTl("vanished"); } if (!sender.isPlayer() || !sender.getPlayer().equals(user.getBase())) { - sender.sendTl("vanish", CommonPlaceholders.displayName(user), CommonPlaceholders.enableDisable(user.getSource(), enabled)); + sender.sendTl("vanish", user.getDisplayName(), CommonPlaceholders.enableDisable(user.getSource(), enabled)); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java index 694cb25f1..4a82d9eab 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandwhois.java @@ -34,7 +34,7 @@ public class Commandwhois extends EssentialsCommand { sender.sendTl("whoisTop", user.getName()); user.setDisplayNick(); - sender.sendTl("whoisNick", CommonPlaceholders.displayName(user)); + sender.sendTl("whoisNick", user.getDisplayName()); sender.sendTl("whoisUuid", user.getBase().getUniqueId().toString()); sender.sendTl("whoisHealth", user.getBase().getHealth()); sender.sendTl("whoisHunger", user.getBase().getFoodLevel(), user.getBase().getSaturation()); diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignGameMode.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignGameMode.java index 3a9d5aba9..d60e07e8a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignGameMode.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignGameMode.java @@ -3,9 +3,7 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.CommonPlaceholders; import net.ess3.api.IEssentials; -import net.ess3.api.IUser; import org.bukkit.GameMode; import org.bukkit.entity.Player; @@ -40,7 +38,7 @@ public class SignGameMode extends EssentialsSign { charge.isAffordableFor(player); performSetMode(mode.toLowerCase(Locale.ENGLISH), player.getBase()); - player.sendTl("gameMode", player.playerTl(player.getBase().getGameMode().toString().toLowerCase(Locale.ENGLISH)), CommonPlaceholders.displayName((IUser) player)); + player.sendTl("gameMode", player.playerTl(player.getBase().getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getDisplayName()); Trade.log("Sign", "gameMode", "Interact", username, null, username, charge, sign.getBlock().getLocation(), player.getMoney(), ess); charge.charge(player); return true; diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/CommonPlaceholders.java b/Essentials/src/main/java/com/earth2me/essentials/utils/CommonPlaceholders.java index 13ca6c7f8..9910940ae 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/CommonPlaceholders.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/CommonPlaceholders.java @@ -1,8 +1,6 @@ package com.earth2me.essentials.utils; import com.earth2me.essentials.CommandSource; -import com.earth2me.essentials.messaging.IMessageRecipient; -import net.ess3.api.IUser; public final class CommonPlaceholders { private CommonPlaceholders() { @@ -15,12 +13,4 @@ public final class CommonPlaceholders { public static AdventureUtil.ParsedPlaceholder trueFalse(final CommandSource source, final boolean condition) { return AdventureUtil.parsed(source.tl(condition ? "true" : "false")); } - - public static AdventureUtil.ParsedPlaceholder displayNameRecipient(final IMessageRecipient recipient) { - return AdventureUtil.parsed(AdventureUtil.legacyToMini(recipient.getDisplayName())); - } - - public static AdventureUtil.ParsedPlaceholder displayName(final IUser user) { - return AdventureUtil.parsed(AdventureUtil.legacyToMini(user.getDisplayName())); - } } diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/Commandtoggleshout.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/Commandtoggleshout.java index 726c62911..7a4b29a3e 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/Commandtoggleshout.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/Commandtoggleshout.java @@ -3,8 +3,6 @@ package com.earth2me.essentials.chat; import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; import com.earth2me.essentials.commands.EssentialsToggleCommand; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import org.bukkit.Server; public class Commandtoggleshout extends EssentialsToggleCommand { @@ -32,7 +30,7 @@ public class Commandtoggleshout extends EssentialsToggleCommand { user.sendTl(enabled ? "shoutEnabled" : "shoutDisabled"); if (!sender.isPlayer() || !user.getBase().equals(sender.getPlayer())) { - sender.sendTl(enabled ? "shoutEnabledFor" : "shoutDisabledFor", CommonPlaceholders.displayName((IUser) user)); + sender.sendTl(enabled ? "shoutEnabledFor" : "shoutDisabledFor", user.getDisplayName()); } } } diff --git a/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java b/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java index 8196adc94..b8594e267 100644 --- a/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java +++ b/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.IConf; import com.earth2me.essentials.User; import com.earth2me.essentials.config.EssentialsConfiguration; import com.earth2me.essentials.utils.AdventureUtil; -import com.earth2me.essentials.utils.CommonPlaceholders; import com.ice.tar.TarEntry; import com.ice.tar.TarInputStream; import com.maxmind.geoip2.DatabaseReader; @@ -13,7 +12,6 @@ import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; import com.maxmind.geoip2.model.CountryResponse; import net.ess3.api.IEssentials; -import net.ess3.api.IUser; import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -102,7 +100,7 @@ public class EssentialsGeoIPPlayerListener implements Listener, IConf { for (final Player online : player.getServer().getOnlinePlayers()) { final User user = ess.getUser(online); if (user.isAuthorized("essentials.geoip.show")) { - user.sendTl("geoipCantFind", CommonPlaceholders.displayName((IUser) u)); + user.sendTl("geoipCantFind", u.getDisplayName()); } } return; @@ -121,7 +119,7 @@ public class EssentialsGeoIPPlayerListener implements Listener, IConf { for (final Player onlinePlayer : player.getServer().getOnlinePlayers()) { final User user = ess.getUser(onlinePlayer); if (user.isAuthorized("essentials.geoip.show")) { - user.sendTl("geoipJoinFormat", CommonPlaceholders.displayName((IUser) u), sb.toString()); + user.sendTl("geoipJoinFormat", u.getDisplayName(), sb.toString()); } } } diff --git a/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java b/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java index 74b275728..7fa8b7f1b 100644 --- a/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java +++ b/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/Commandspawn.java @@ -7,8 +7,6 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.commands.EssentialsCommand; import com.earth2me.essentials.commands.NoChargeException; import com.earth2me.essentials.commands.NotEnoughArgumentsException; -import com.earth2me.essentials.utils.CommonPlaceholders; -import net.ess3.api.IUser; import net.essentialsx.api.v2.events.UserTeleportSpawnEvent; import org.bukkit.Location; import org.bukkit.Server; @@ -33,7 +31,7 @@ public class Commandspawn extends EssentialsCommand { future.thenAccept(success -> { if (success) { if (!otherUser.equals(user)) { - otherUser.sendTl("teleportAtoB", CommonPlaceholders.displayName((IUser) user), "spawn"); + otherUser.sendTl("teleportAtoB", user.getDisplayName(), "spawn"); } } }); From 63234d6b1d7a49039b2a2eef81bbe10c5a316bbc Mon Sep 17 00:00:00 2001 From: MD <1917406+mdcfe@users.noreply.github.com> Date: Sun, 18 Feb 2024 16:14:56 +0000 Subject: [PATCH 10/33] Update Gradle and plugins; don't enforce running tests on Java 8 (#5685) Fixes CI failures when trying to run `testJava8`, now that Spigot API is compiled for Java 17. --- build-logic/build.gradle.kts | 2 +- .../essentials.base-conventions.gradle.kts | 2 ++ gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 22 +++++++++++------- gradlew.bat | 20 ++++++++-------- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 53ead835f..d306fc9d9 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -9,5 +9,5 @@ repositories { dependencies { implementation("net.kyori", "indra-common", "3.1.3") implementation("com.github.johnrengelman", "shadow", "8.1.1") - implementation("xyz.jpenilla", "run-task", "2.1.0") + implementation("xyz.jpenilla", "run-task", "2.2.3") } diff --git a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts index e2401cba3..efb9fdbc4 100644 --- a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts @@ -117,6 +117,8 @@ indra { javaVersions { target(8) minimumToolchain(17) + // Don't enforce running tests on Java 8; we only care about the release for compiling, not running tests + strictVersions(false) } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 62076 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c30b486a8..a80b22ce5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb4..1aa94a426 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f1..25da30dbd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail From 0cd47639c28dfb0b3013c8b4fe7edd7e2a90e25a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:48:34 -0500 Subject: [PATCH 11/33] Fix /kill and /suicide on latest Spigot/Paper --- .../com/earth2me/essentials/Essentials.java | 15 ++++++++++++ .../com/earth2me/essentials/IEssentials.java | 3 +++ .../essentials/commands/Commandkill.java | 3 +-- .../essentials/commands/Commandsuicide.java | 3 +-- .../providers/LegacyDamageEventProvider.java | 19 +++++++++++++++ .../ess3/provider/DamageEventProvider.java | 8 +++++++ .../providers/ModernDamageEventProvider.java | 24 +++++++++++++++++++ 7 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 8e47ae748..261a13f46 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -60,6 +60,7 @@ import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; import net.ess3.provider.ContainerProvider; +import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; @@ -83,10 +84,12 @@ import net.ess3.provider.providers.BukkitMaterialTagProvider; import net.ess3.provider.providers.BukkitSpawnerBlockProvider; import net.ess3.provider.providers.FixedHeightWorldInfoProvider; import net.ess3.provider.providers.FlatSpawnEggProvider; +import net.ess3.provider.providers.LegacyDamageEventProvider; import net.ess3.provider.providers.LegacyItemUnbreakableProvider; import net.ess3.provider.providers.LegacyPlayerLocaleProvider; import net.ess3.provider.providers.LegacyPotionMetaProvider; import net.ess3.provider.providers.LegacySpawnEggProvider; +import net.ess3.provider.providers.ModernDamageEventProvider; import net.ess3.provider.providers.ModernDataWorldInfoProvider; import net.ess3.provider.providers.ModernItemUnbreakableProvider; import net.ess3.provider.providers.ModernPersistentDataProvider; @@ -193,6 +196,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient WorldInfoProvider worldInfoProvider; private transient PlayerLocaleProvider playerLocaleProvider; private transient SignDataProvider signDataProvider; + private transient DamageEventProvider damageEventProvider; private transient Kits kits; private transient RandomTeleport randomTeleport; private transient UpdateChecker updateChecker; @@ -475,6 +479,12 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { playerLocaleProvider = new LegacyPlayerLocaleProvider(); } + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_20_4_R01)) { + damageEventProvider = new ModernDamageEventProvider(); + } else { + damageEventProvider = new LegacyDamageEventProvider(); + } + execTimer.mark("Init(Providers)"); reload(); @@ -1405,6 +1415,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return playerLocaleProvider; } + @Override + public DamageEventProvider getDamageEventProvider() { + return damageEventProvider; + } + @Override public SignDataProvider getSignDataProvider() { return signDataProvider; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index f0b627133..9aea053e8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -10,6 +10,7 @@ import com.earth2me.essentials.updatecheck.UpdateChecker; import com.earth2me.essentials.userstorage.IUserMap; import net.ess3.nms.refl.providers.ReflOnlineModeProvider; import net.ess3.provider.ContainerProvider; +import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; @@ -183,5 +184,7 @@ public interface IEssentials extends Plugin { PlayerLocaleProvider getPlayerLocaleProvider(); + DamageEventProvider getDamageEventProvider(); + PluginCommand getPluginCommand(String cmd); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java index 6bb19b4bb..d2a76cbfa 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java @@ -29,8 +29,7 @@ public class Commandkill extends EssentialsLoopCommand { if (sender.isPlayer() && user.isAuthorized("essentials.kill.exempt") && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.kill.force")) { throw new PlayerExemptException("killExempt", matchPlayer.getDisplayName()); } - final EntityDamageEvent ede = new EntityDamageEvent(matchPlayer, sender.isPlayer() && sender.getPlayer().getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Float.MAX_VALUE); - server.getPluginManager().callEvent(ede); + final EntityDamageEvent ede = ess.getDamageEventProvider().callDamageEvent(matchPlayer, sender.isPlayer() && sender.getPlayer().getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Float.MAX_VALUE); if (ede.isCancelled() && sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.kill.force")) { return; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java index 53b170f67..c81d92c8e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java @@ -14,8 +14,7 @@ public class Commandsuicide extends EssentialsCommand { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - final EntityDamageEvent ede = new EntityDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Float.MAX_VALUE); - server.getPluginManager().callEvent(ede); + final EntityDamageEvent ede = ess.getDamageEventProvider().callDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Float.MAX_VALUE); ede.getEntity().setLastDamageCause(ede); user.getBase().setHealth(0); user.sendTl("suicideMessage"); diff --git a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java new file mode 100644 index 000000000..74487c25d --- /dev/null +++ b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java @@ -0,0 +1,19 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.DamageEventProvider; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public class LegacyDamageEventProvider implements DamageEventProvider { + @Override + public EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage) { + final EntityDamageEvent ede = new EntityDamageEvent(player, cause, damage); + player.getServer().getPluginManager().callEvent(ede); + return ede; + } + + @Override + public String getDescription() { + return "Legacy Damage Event Provider"; + } +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java new file mode 100644 index 000000000..4eb229bf2 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java @@ -0,0 +1,8 @@ +package net.ess3.provider; + +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public interface DamageEventProvider extends Provider { + EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage); +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java new file mode 100644 index 000000000..77ba5cb9b --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java @@ -0,0 +1,24 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.DamageEventProvider; +import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +@SuppressWarnings("UnstableApiUsage") +public class ModernDamageEventProvider implements DamageEventProvider { + private final DamageSource MAGIC_SOURCE = DamageSource.builder(DamageType.MAGIC).build(); + + @Override + public EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage) { + final EntityDamageEvent ede = new EntityDamageEvent(player, cause, MAGIC_SOURCE, damage); + player.getServer().getPluginManager().callEvent(ede); + return ede; + } + + @Override + public String getDescription() { + return "1.20.4+ Damage Event Provider"; + } +} From ac0ba8890f163d3c646812985c7a0c78d82fffb0 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:52:00 -0500 Subject: [PATCH 12/33] Fix format parsing in /unlimited --- .../com/earth2me/essentials/commands/Commandunlimited.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java index d3581c20f..448934aa8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.Inventories; +import com.earth2me.essentials.utils.AdventureUtil; import net.ess3.api.TranslatableException; import org.bukkit.Material; import org.bukkit.Server; @@ -29,7 +30,7 @@ public class Commandunlimited extends EssentialsCommand { } if (args[0].equalsIgnoreCase("list")) { - user.sendMessage(getList(user, target)); + user.sendComponent(AdventureUtil.miniMessage().deserialize(getList(user, target))); } else if (args[0].equalsIgnoreCase("clear")) { for (final Material m : new HashSet<>(target.getUnlimited())) { if (m == null) { @@ -56,7 +57,7 @@ public class Commandunlimited extends EssentialsCommand { } joiner.add(material.toString().toLowerCase(Locale.ENGLISH).replace("_", "")); } - output.append(joiner.toString()); + output.append(joiner); return output.toString(); } From 1dccfbfceedce904715802dffe926ced99caab54 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:57:25 -0500 Subject: [PATCH 13/33] Fix format parsing in /suicide (Fixes #5662) --- .../java/com/earth2me/essentials/commands/Commandsuicide.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java index c81d92c8e..eb259bc53 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java @@ -19,7 +19,7 @@ public class Commandsuicide extends EssentialsCommand { user.getBase().setHealth(0); user.sendTl("suicideMessage"); user.setDisplayNick(); - ess.broadcastTl(user, "suicideSuccess", user.getDisplayName()); + ess.broadcastTl(user, "suicideSuccess", new Object[]{user.getDisplayName()}); } @Override From 82606a7cedbd66cac9223501cd6d96ea3dc8e339 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 21:36:57 -0500 Subject: [PATCH 14/33] Fix format parsing in local spy chat format (Fixes #5665) --- .../java/com/earth2me/essentials/utils/AdventureUtil.java | 7 +++++++ .../essentials/chat/processing/AbstractChatHandler.java | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java index 6b23b0efe..828ee6886 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java @@ -125,6 +125,13 @@ public final class AdventureUtil { return COLORS[index]; } + /** + * Convenience method for submodules to escape MiniMessage tags. + */ + public static String escapeTags(final String input) { + return miniMessage().escapeTags(input); + } + /** * Parameters for a translation message are not parsed for MiniMessage by default to avoid injection. If you want * a parameter to be parsed for MiniMessage you must wrap it in a ParsedPlaceholder by using this method. diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java index f3e515b4a..f593840d7 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java @@ -227,8 +227,10 @@ public abstract class AbstractChatHandler { server.getPluginManager().callEvent(spyEvent); if (!spyEvent.isCancelled()) { + final String legacyString = AdventureUtil.miniToLegacy(String.format(spyEvent.getFormat(), AdventureUtil.legacyToMini(user.getDisplayName()), AdventureUtil.escapeTags(spyEvent.getMessage()))); + for (final Player onlinePlayer : spyEvent.getRecipients()) { - onlinePlayer.sendMessage(String.format(spyEvent.getFormat(), user.getDisplayName(), spyEvent.getMessage())); + onlinePlayer.sendMessage(legacyString); } } } From 221a6622f38f3e4dad206faaa8844cacfd8bf909 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 21:47:49 -0500 Subject: [PATCH 15/33] Fix format parsing in /time (Fixes #5661) --- .../java/com/earth2me/essentials/commands/Commandtime.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java index 848126fea..4e85d7b4c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.DescParseTickFormat; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; @@ -95,12 +96,12 @@ public class Commandtime extends EssentialsCommand { private void getWorldsTime(final CommandSource sender, final Collection worlds) { if (worlds.size() == 1) { final Iterator iter = worlds.iterator(); - sender.sendMessage(DescParseTickFormat.format(iter.next().getTime())); + sender.sendComponent(AdventureUtil.miniMessage().deserialize(DescParseTickFormat.format(iter.next().getTime()))); return; } for (final World world : worlds) { - sender.sendTl("timeWorldCurrent", world.getName(), DescParseTickFormat.format(world.getTime())); + sender.sendTl("timeWorldCurrent", world.getName(), AdventureUtil.parsed(DescParseTickFormat.format(world.getTime()))); } } From dfc5c49f563f39d6a24b97eeedbbbdad0f91c3be Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 15 Feb 2024 20:50:42 -0500 Subject: [PATCH 16/33] Log individual JUnit test results --- .../main/kotlin/essentials.base-conventions.gradle.kts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts index efb9fdbc4..0a497fed8 100644 --- a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts @@ -11,8 +11,8 @@ val baseExtension = extensions.create("essentials", pro val checkstyleVersion = "8.36.2" val spigotVersion = "1.20.4-R0.1-SNAPSHOT" -val junit5Version = "5.7.0" -val mockitoVersion = "3.2.0" +val junit5Version = "5.10.2" +val mockitoVersion = "3.12.4" dependencies { testImplementation("org.junit.jupiter", "junit-jupiter", junit5Version) @@ -26,6 +26,12 @@ dependencies { } } +tasks.test { + testLogging { + events("PASSED", "SKIPPED", "FAILED") + } +} + afterEvaluate { if (baseExtension.injectBukkitApi.get()) { dependencies { From 14125d9c4caa95e7e7d0158c7675ebe909fe5af0 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:39:39 -0500 Subject: [PATCH 17/33] Fix format parsing in /spawner (Fixes #5680) --- .../src/main/java/com/earth2me/essentials/Essentials.java | 2 +- .../com/earth2me/essentials/commands/Commandbroadcastworld.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 261a13f46..506ed9165 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -873,7 +873,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { sender.sendMessage(command.getUsage().replace("", commandLabel)); } if (!ex.getMessage().isEmpty()) { - sender.sendMessage(ex.getMessage()); + sender.sendComponent(AdventureUtil.miniMessage().deserialize(ex.getMessage())); } if (ex.getCause() != null && settings.isDebug()) { ex.getCause().printStackTrace(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java index 089883b1c..b9156cf8b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java @@ -39,7 +39,7 @@ public class Commandbroadcastworld extends EssentialsCommand { @Override public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { - throw new NotEnoughArgumentsException("world"); + throw new NotEnoughArgumentsException(); } final World world = ess.getWorld(args[0]); From 77d505bb4ac7982c6ff12b281d6ed2e3af60b189 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:20:41 -0500 Subject: [PATCH 18/33] Fix format parsing using in-game commands in console (Fixes #5670) --- .../com/earth2me/essentials/commands/EssentialsCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 36cdad3e4..187067298 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -10,6 +10,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.ess3.api.IEssentials; +import net.ess3.api.TranslatableException; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -180,7 +181,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand { } protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - throw new Exception(tlLiteral("onlyPlayers", commandLabel)); + throw new TranslatableException("onlyPlayers", commandLabel); } @Override From 80e6f96c710149bca1f8a520381c4519fd8c9057 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:30:19 -0500 Subject: [PATCH 19/33] Fix format parsing in /msg from Discord (Fixes #5671) --- .../discord/interactions/commands/MessageCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java index e85cb4ca4..abfd6b83c 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java @@ -2,6 +2,7 @@ package net.essentialsx.discord.interactions.commands; import com.earth2me.essentials.User; import com.earth2me.essentials.commands.PlayerNotFoundException; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.FormatUtil; import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; import net.essentialsx.api.v2.services.discord.InteractionCommandArgumentType; @@ -51,7 +52,7 @@ public class MessageCommand extends InteractionCommandImpl { FormatUtil.replaceFormat(event.getStringArgument("message")) : FormatUtil.stripFormat(event.getStringArgument("message")); event.reply(tlLiteral("msgFormat", tlLiteral("meSender"), MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message))); - user.sendMessage(tlLiteral("msgFormat", event.getMember().getTag(), user.playerTl("meRecipient"), message)); + user.sendTl("msgFormat", event.getMember().getTag(), AdventureUtil.parsed(user.playerTl("meRecipient")), message); // We use an atomic reference here so that java will garbage collect the recipient final AtomicReference ref = new AtomicReference<>(new DiscordMessageRecipient(event.getMember())); jda.getPlugin().getEss().runTaskLaterAsynchronously(() -> ref.set(null), 6000); // Expires after 5 minutes From d307279b3b332f33fcfd9ebf3c00677cd0d00c05 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:41:15 -0500 Subject: [PATCH 20/33] Fix format parsing in unlinked kick message (Fixes #5667) --- .../essentialsx/discordlink/listeners/LinkBukkitListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java index bb7eee63e..99cdb76b2 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java @@ -60,7 +60,7 @@ public class LinkBukkitListener implements Listener { } catch (IllegalArgumentException e) { code = e.getMessage(); } - event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, tlLiteral("discordLinkLoginKick", "/link " + code, ess.getApi().getInviteUrl())); + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, AdventureUtil.miniToLegacy(tlLiteral("discordLinkLoginKick", "/link " + code, ess.getApi().getInviteUrl()))); } } From 139db29782fe83cb629dcd55967af310d2e90f08 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:49:59 -0500 Subject: [PATCH 21/33] Fix format parsing in various discord commands --- .../api/v2/services/discord/InteractionEvent.java | 7 +++++++ .../interactions/InteractionControllerImpl.java | 2 +- .../discord/interactions/InteractionEventImpl.java | 8 ++++++++ .../discord/interactions/commands/ExecuteCommand.java | 2 +- .../discord/interactions/commands/MessageCommand.java | 10 +++++----- .../commands/discord/AccountInteractionCommand.java | 6 +++--- .../commands/discord/LinkInteractionCommand.java | 6 +++--- .../commands/discord/UnlinkInteractionCommand.java | 4 ++-- 8 files changed, 30 insertions(+), 15 deletions(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java index eece3cb36..f66105e27 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java @@ -10,6 +10,13 @@ public interface InteractionEvent { */ void reply(String message); + /** + * Appends the given string to the initial response message and creates one if it doesn't exist. + * @param tlKey The tlKey of the message to append. + * @param args The args for the message to append. + */ + void replyTl(String tlKey, Object... args); + /** * Gets the member which caused this event. * @return the member which caused the event. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java index ed62f0165..265815972 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java @@ -61,7 +61,7 @@ public class InteractionControllerImpl extends ListenerAdapter implements Intera final InteractionEvent interactionEvent = new InteractionEventImpl(event); final List commandSnowflakes = jda.getSettings().getCommandSnowflakes(command.getName()); if (commandSnowflakes != null && !DiscordUtil.hasRoles(event.getMember(), commandSnowflakes)) { - interactionEvent.reply(tlLiteral("noAccessCommand")); + interactionEvent.replyTl("noAccessCommand"); return; } jda.getPlugin().getEss().scheduleSyncDelayedTask(() -> command.onCommand(interactionEvent)); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java index 018916415..ca008c37f 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java @@ -1,5 +1,6 @@ package net.essentialsx.discord.interactions; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.FormatUtil; import com.google.common.base.Joiner; import net.dv8tion.jda.api.entities.Message; @@ -18,6 +19,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import static com.earth2me.essentials.I18n.tlLiteral; + /** * A class which provides information about what triggered an interaction event. */ @@ -45,6 +48,11 @@ public class InteractionEventImpl implements InteractionEvent { .queue(null, error -> logger.log(Level.SEVERE, "Error while editing command interaction response", error)); } + @Override + public void replyTl(String tlKey, Object... args) { + reply(AdventureUtil.miniToLegacy(tlLiteral(tlKey, args))); + } + @Override public InteractionMember getMember() { return member; diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java index 31e8a4efb..09e1a9fad 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java @@ -21,7 +21,7 @@ public class ExecuteCommand extends InteractionCommandImpl { @Override public void onCommand(final InteractionEvent event) { final String command = event.getStringArgument("command"); - event.reply(tlLiteral("discordCommandExecuteReply", command)); + event.replyTl("discordCommandExecuteReply", command); Bukkit.getScheduler().runTask(jda.getPlugin(), () -> { try { Bukkit.dispatchCommand(new DiscordCommandSender(jda, Bukkit.getConsoleSender(), message -> event.reply(MessageUtil.sanitizeDiscordMarkdown(message))).getSender(), command); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java index abfd6b83c..94f00faf6 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java @@ -31,26 +31,26 @@ public class MessageCommand extends InteractionCommandImpl { try { user = jda.getPlugin().getEss().matchUser(Bukkit.getServer(), null, event.getStringArgument("username"), getHidden, false); } catch (PlayerNotFoundException e) { - event.reply(tlLiteral("errorWithMessage", e.getMessage())); + event.replyTl("errorWithMessage", e.getMessage()); return; } if (!getHidden && user.isIgnoreMsg()) { - event.reply(tlLiteral("msgIgnore", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()))); + event.replyTl("msgIgnore", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName())); return; } if (user.isAfk()) { if (user.getAfkMessage() != null) { - event.reply(tlLiteral("userAFKWithMessage", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(user.getAfkMessage()))); + event.replyTl("userAFKWithMessage", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(user.getAfkMessage())); } else { - event.reply(tlLiteral("userAFK", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()))); + event.replyTl("userAFK", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName())); } } final String message = event.getMember().hasRoles(jda.getSettings().getPermittedFormattingRoles()) ? FormatUtil.replaceFormat(event.getStringArgument("message")) : FormatUtil.stripFormat(event.getStringArgument("message")); - event.reply(tlLiteral("msgFormat", tlLiteral("meSender"), MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message))); + event.replyTl("msgFormat", tlLiteral("meSender"), MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message)); user.sendTl("msgFormat", event.getMember().getTag(), AdventureUtil.parsed(user.playerTl("meRecipient")), message); // We use an atomic reference here so that java will garbage collect the recipient diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java index c9758c964..753223582 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java @@ -53,14 +53,14 @@ public class AccountInteractionCommand implements InteractionCommand { final InteractionMember effectiveUser = userArg == null ? event.getMember() : userArg; final IUser user = accounts.getUser(effectiveUser.getId()); if (user == null) { - event.reply(tlLiteral(event.getMember().getId().equals(effectiveUser.getId()) ? "discordCommandAccountResponseNotLinked" : "discordCommandAccountResponseNotLinkedOther", effectiveUser.getAsMention())); + event.replyTl(event.getMember().getId().equals(effectiveUser.getId()) ? "discordCommandAccountResponseNotLinked" : "discordCommandAccountResponseNotLinkedOther", effectiveUser.getAsMention()); return; } if (event.getMember().getId().equals(effectiveUser.getId())) { - event.reply(tlLiteral("discordCommandAccountResponseLinked", user.getName())); + event.replyTl("discordCommandAccountResponseLinked", user.getName()); return; } - event.reply(tlLiteral("discordCommandAccountResponseLinkedOther", effectiveUser.getAsMention(), user.getName())); + event.replyTl("discordCommandAccountResponseLinkedOther", effectiveUser.getAsMention(), user.getName()); } } diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java index befd71c4b..16ca47034 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java @@ -25,18 +25,18 @@ public class LinkInteractionCommand implements InteractionCommand { @Override public void onCommand(InteractionEvent event) { if (accounts.isLinked(event.getMember().getId())) { - event.reply(tlLiteral("discordCommandLinkHasAccount")); + event.replyTl("discordCommandLinkHasAccount"); return; } final UUID uuid = accounts.getPendingUUID(event.getStringArgument("code")); if (uuid == null) { - event.reply(tlLiteral("discordCommandLinkInvalidCode")); + event.replyTl("discordCommandLinkInvalidCode"); return; } accounts.registerAccount(uuid, event.getMember(), DiscordLinkStatusChangeEvent.Cause.SYNC_PLAYER); - event.reply(tlLiteral("discordCommandLinkLinked")); + event.replyTl("discordCommandLinkLinked"); } @Override diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java index 46f344132..b2d26e904 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java @@ -20,10 +20,10 @@ public class UnlinkInteractionCommand implements InteractionCommand { @Override public void onCommand(InteractionEvent event) { if (!accounts.removeAccount(event.getMember(), DiscordLinkStatusChangeEvent.Cause.UNSYNC_PLAYER)) { - event.reply(tlLiteral("discordCommandUnlinkInvalidCode")); + event.replyTl("discordCommandUnlinkInvalidCode"); return; } - event.reply(tlLiteral("discordCommandUnlinkUnlinked")); + event.replyTl("discordCommandUnlinkUnlinked"); } @Override From 4386713807d14b217c9d47a211caa2096aee03c5 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:37:03 -0500 Subject: [PATCH 22/33] Fix messages not sending after /ess reload (Fixes #5663) --- .../src/main/java/com/earth2me/essentials/Essentials.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 506ed9165..a5e091487 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -635,6 +635,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { public void reload() { Trade.closeLog(); + if (bukkitAudience != null) { + bukkitAudience.close(); + bukkitAudience = null; + } + for (final IConf iConf : confList) { iConf.reloadConfig(); execTimer.mark("Reload(" + iConf.getClass().getSimpleName() + ")"); From 1929d4110af296ee8dbc869b8846b1847ed52403 Mon Sep 17 00:00:00 2001 From: Charles DeLancey <46200123+Evidentsinger14@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:57:57 -0500 Subject: [PATCH 23/33] Fix format parsing in /heal (Fixes #5690) --- Essentials/src/main/java/com/earth2me/essentials/User.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index 46e2e03e4..16cabcf3f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -16,6 +16,7 @@ import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; +import net.ess3.api.TranslatableException; import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.JailStatusChangeEvent; import net.ess3.api.events.MuteStatusChangeEvent; @@ -225,7 +226,7 @@ public class User extends UserData implements Comparable, IMessageRecipien cooldownTime.add(Calendar.SECOND, (int) cooldown); cooldownTime.add(Calendar.MILLISECOND, (int) ((cooldown * 1000.0) % 1000.0)); if (cooldownTime.after(now) && !isAuthorized("essentials.heal.cooldown.bypass")) { - throw new Exception(playerTl("timeBeforeHeal", DateUtil.formatDateDiff(cooldownTime.getTimeInMillis()))); + throw new TranslatableException("timeBeforeHeal", DateUtil.formatDateDiff(cooldownTime.getTimeInMillis())); } } setLastHealTimestamp(now.getTimeInMillis()); From 09fa6463a7ff7788621c4d704ade68f10e9e31dd Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 24 Feb 2024 12:28:07 -0800 Subject: [PATCH 24/33] Update GitHub Actions (#5704) Bump actions steps to remove deprecation warnings on GitHub https://github.com/EssentialsX/Essentials/assets/17698576/0d032078-0c36-4362-b680-5a9b30d30345 --- .github/workflows/build-master.yml | 14 +++++++------- .github/workflows/build-pr.yml | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml index e2c3b7e63..62e0e96f4 100644 --- a/.github/workflows/build-master.yml +++ b/.github/workflows/build-master.yml @@ -16,18 +16,18 @@ jobs: steps: - name: Checkout Git repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: 17 - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 - name: Build with Gradle run: | @@ -35,7 +35,7 @@ jobs: ./gradlew build --stacktrace - name: Archive plugin jars on GitHub - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: EssentialsX plugin jars path: jars/ @@ -61,7 +61,7 @@ jobs: cp -r EssentialsXMPP/build/docs/javadoc/ javadocs/EssentialsXMPP/ - name: Archive Javadocs - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: javadocs path: javadocs/ @@ -74,12 +74,12 @@ jobs: steps: - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 16 - name: Download Javadocs - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: javadocs path: javadocs/ diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index fbf6eacd1..5cb330dbb 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -18,18 +18,18 @@ jobs: steps: - name: Checkout Git repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: 17 - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 - name: Build with Gradle run: | @@ -37,7 +37,7 @@ jobs: ./gradlew build --stacktrace - name: Archive plugin jars on GitHub - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: EssentialsX plugin jars path: jars/ From 9be27ad7ac3d63414e123505d3f1d5177b99c2d6 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 24 Feb 2024 12:39:40 -0800 Subject: [PATCH 25/33] Fix custom message colors config not working (#5705) No linked issue; discussed on Discord with @Evidentsinger14 Also @JRoy, I refuse to believe you ever tested this feature, you're trolling --------- Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com> --- .../com/earth2me/essentials/Essentials.java | 1 + .../com/earth2me/essentials/Settings.java | 24 +++++++++-------- .../essentials/utils/AdventureUtil.java | 27 ++++++++++--------- .../earth2me/essentials/utils/NumberUtil.java | 9 +++++++ 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index a5e091487..3a54a58bc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -657,6 +657,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { final PluginManager pm = getServer().getPluginManager(); registerListeners(pm); + AdventureUtil.setEss(this); bukkitAudience = BukkitAudiences.create(this); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index 666599a52..5fe884f7a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -53,6 +53,8 @@ import static com.earth2me.essentials.I18n.tlLiteral; public class Settings implements net.ess3.api.ISettings { private static final BigDecimal DEFAULT_MAX_MONEY = new BigDecimal("10000000000000"); private static final BigDecimal DEFAULT_MIN_MONEY = new BigDecimal("-10000000000000"); + private static final Tag DEFAULT_PRIMARY_COLOR = Tag.styling(NamedTextColor.GOLD); + private static final Tag DEFAULT_SECONDARY_COLOR = Tag.styling(NamedTextColor.RED); private final transient EssentialsConfiguration config; private final transient IEssentials ess; private final transient AtomicInteger reloadCount = new AtomicInteger(0); @@ -141,8 +143,8 @@ public class Settings implements net.ess3.api.ISettings { private double maxProjectileSpeed; private boolean removeEffectsOnHeal; private Map worldAliases; - private Tag primaryColor = Tag.styling(NamedTextColor.GOLD); - private Tag secondaryColor = Tag.styling(NamedTextColor.RED); + private Tag primaryColor = DEFAULT_PRIMARY_COLOR; + private Tag secondaryColor = DEFAULT_SECONDARY_COLOR; public Settings(final IEssentials ess) { this.ess = ess; @@ -1970,7 +1972,8 @@ public class Settings implements net.ess3.api.ISettings { private Tag _getPrimaryColor() { final String color = config.getString("message-colors.primary", "#ffaa00"); - return Tag.styling(_getTagColor(color, NamedTextColor.GOLD)); + final TextColor textColor = _getTagColor(color); + return textColor != null ? Tag.styling(textColor) : DEFAULT_PRIMARY_COLOR; } @Override @@ -1980,24 +1983,23 @@ public class Settings implements net.ess3.api.ISettings { private Tag _getSecondaryColor() { final String color = config.getString("message-colors.secondary", "#ff5555"); - return Tag.styling(_getTagColor(color, NamedTextColor.RED)); + final TextColor textColor = _getTagColor(color); + return textColor != null ? Tag.styling(textColor) : DEFAULT_SECONDARY_COLOR; } - private TextColor _getTagColor(final String color, final TextColor def) { + private TextColor _getTagColor(final String color) { try { - if (color.startsWith("#") && color.length() == 7 && NumberUtil.isNumeric(color.substring(1))) { + if (color.startsWith("#") && color.length() == 7 && NumberUtil.isHexadecimal(color.substring(1))) { return TextColor.color(Color.fromRGB(Integer.decode(color)).asRGB()); } if (color.length() == 1) { - final NamedTextColor named = AdventureUtil.fromChar(color.charAt(0)); - return named != null ? named : def; + return AdventureUtil.fromChar(color.charAt(0)); } - final NamedTextColor named = NamedTextColor.NAMES.value(color.toLowerCase(Locale.ENGLISH)); - return named != null ? named : def; + return NamedTextColor.NAMES.value(color.toLowerCase(Locale.ENGLISH)); } catch (IllegalArgumentException ignored) { } - return def; + return null; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java index 828ee6886..4016504a5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java @@ -15,13 +15,13 @@ import java.util.regex.Pattern; public final class AdventureUtil { private static final LegacyComponentSerializer LEGACY_SERIALIZER; - private static final MiniMessage MINI_MESSAGE_INSTANCE; - private static IEssentials ess; private static final Pattern NAMED_PATTERN = Pattern.compile(ChatColor.COLOR_CHAR + "[0-9a-fk-orA-FK-OR]"); private static final Pattern HEX_PATTERN = Pattern.compile(ChatColor.COLOR_CHAR + "x((?:" + ChatColor.COLOR_CHAR + "[0-9a-fA-F]){6})"); private static final String LOOKUP = "0123456789abcdefklmnor"; private static final String[] MINI_TAGS = new String[] {"black", "dark_blue", "dark_green", "dark_aqua", "dark_red", "dark_purple", "gold", "gray", "dark_gray", "blue", "green", "aqua", "red", "light_purple", "yellow", "white", "obf", "b", "st", "u", "i", "reset"}; private static final NamedTextColor[] COLORS = new NamedTextColor[] {NamedTextColor.BLACK, NamedTextColor.DARK_BLUE, NamedTextColor.DARK_GREEN, NamedTextColor.DARK_AQUA, NamedTextColor.DARK_RED, NamedTextColor.DARK_PURPLE, NamedTextColor.GOLD, NamedTextColor.GRAY, NamedTextColor.DARK_GRAY, NamedTextColor.BLUE, NamedTextColor.GREEN, NamedTextColor.AQUA, NamedTextColor.RED, NamedTextColor.LIGHT_PURPLE, NamedTextColor.YELLOW, NamedTextColor.WHITE}; + private static IEssentials ess; + private static MiniMessage miniMessageInstance; static { final LegacyComponentSerializer.Builder builder = LegacyComponentSerializer.builder().flattener(ComponentFlattener.basic()).useUnusualXRepeatedCharacterHexFormat(); @@ -29,15 +29,7 @@ public final class AdventureUtil { builder.hexColors(); } LEGACY_SERIALIZER = builder.build(); - - MINI_MESSAGE_INSTANCE = MiniMessage.builder() - .tags(TagResolver.builder() - .resolvers(TagResolver.standard()) - .resolver(TagResolver.resolver("primary", supplyTag(true))) - .resolver(TagResolver.resolver("secondary", supplyTag(false))) - .build()) - .build(); - + miniMessageInstance = createMiniMessageInstance(); } private AdventureUtil() { @@ -45,10 +37,21 @@ public final class AdventureUtil { public static void setEss(final IEssentials ess) { AdventureUtil.ess = ess; + miniMessageInstance = createMiniMessageInstance(); + } + + private static MiniMessage createMiniMessageInstance() { + return MiniMessage.builder() + .tags(TagResolver.builder() + .resolvers(TagResolver.standard()) + .resolver(TagResolver.resolver("primary", supplyTag(true))) + .resolver(TagResolver.resolver("secondary", supplyTag(false))) + .build()) + .build(); } public static MiniMessage miniMessage() { - return MINI_MESSAGE_INSTANCE; + return miniMessageInstance; } /** diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/NumberUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/NumberUtil.java index 7bd4adcad..9b253e243 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/NumberUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/NumberUtil.java @@ -129,6 +129,15 @@ public final class NumberUtil { return true; } + public static boolean isHexadecimal(final String sNum) { + try { + Integer.parseInt(sNum, 16); + return true; + } catch (final NumberFormatException e) { + return false; + } + } + /** * Backport from Guava. */ From 7a9a0e6f513777dd5f3f1b8a39ae0bfcf74fe965 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 24 Feb 2024 12:42:30 -0800 Subject: [PATCH 26/33] Fix /me from console (#5700) Fixes #5689 --- .../main/java/com/earth2me/essentials/commands/Commandme.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java index 46cd33d17..ce1e70835 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandme.java @@ -17,8 +17,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import static com.earth2me.essentials.I18n.tlLiteral; - public class Commandme extends EssentialsCommand { public Commandme() { super("me"); @@ -109,7 +107,7 @@ public class Commandme extends EssentialsCommand { String message = getFinalArg(args, 0); message = FormatUtil.replaceFormat(message); - ess.getServer().broadcastMessage(tlLiteral("action", "@", message)); + ess.broadcastTl("action", "@", message); } @Override From 185b4e266b8ece312c3c8556e23af2eee8fcdeed Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 24 Feb 2024 14:40:22 -0800 Subject: [PATCH 27/33] Fix /broadcastworld sending in all but the intended world (#5699) Fixes #5694 This issue was caused by the passed predicate being excludes rather than includes. Also addresses a separate issue where no help output was given when no arguments were specified and the command was sent by a player. --- .../earth2me/essentials/commands/Commandbroadcastworld.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java index b9156cf8b..93c271dca 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java @@ -19,13 +19,13 @@ public class Commandbroadcastworld extends EssentialsCommand { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (args.length == 0) { + if (args.length < 2) { throw new NotEnoughArgumentsException(); } World world = user.getWorld(); String message = getFinalArg(args, 0); - if (args.length > 1 && ess.getSettings().isAllowWorldInBroadcastworld()) { + if (ess.getSettings().isAllowWorldInBroadcastworld()) { final World argWorld = ess.getWorld(args[0]); if (argWorld != null) { world = argWorld; @@ -53,7 +53,7 @@ public class Commandbroadcastworld extends EssentialsCommand { if (message.isEmpty()) { throw new NotEnoughArgumentsException(); } - ess.broadcastTl(null, u -> u.getBase().getWorld().equals(world), true, "broadcast", message, AdventureUtil.parsed(AdventureUtil.legacyToMini(name))); + ess.broadcastTl(null, u -> !u.getBase().getWorld().equals(world), true, "broadcast", message, AdventureUtil.parsed(AdventureUtil.legacyToMini(name))); } @Override From d4b72c8af6ac00b8a25cc2e80f26da0e56e1196a Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sun, 25 Feb 2024 00:06:52 -0800 Subject: [PATCH 28/33] Fix Discord /list command showing tags in output (#5698) --- .../java/com/earth2me/essentials/utils/FormatUtil.java | 7 +++++++ .../discord/interactions/commands/ListCommand.java | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java index 5cc901793..e911e3a8f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java @@ -40,6 +40,13 @@ public final class FormatUtil { return ChatColor.stripColor(input); } + public static String stripMiniFormat(final String input) { + if (input == null) { + return null; + } + return AdventureUtil.miniMessage().stripTags(input); + } + //This method is used to simply strip the & convention colour codes public static String stripEssentialsFormat(final String input) { if (input == null) { diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java index 60057bc46..a34d52991 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java @@ -3,6 +3,7 @@ package net.essentialsx.discord.interactions.commands; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.PlayerList; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.FormatUtil; import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; import net.essentialsx.api.v2.services.discord.InteractionCommandArgumentType; import net.essentialsx.api.v2.services.discord.InteractionEvent; @@ -45,8 +46,8 @@ public class ListCommand extends InteractionCommandImpl { final StringBuilder stringBuilder = new StringBuilder(); for (final String str : output) { - stringBuilder.append(str).append("\n"); + stringBuilder.append(FormatUtil.stripMiniFormat(str)).append("\n"); } - event.reply(MessageUtil.sanitizeDiscordMarkdown(stringBuilder.substring(0, stringBuilder.length() - 2))); + event.reply(MessageUtil.sanitizeDiscordMarkdown(stringBuilder.substring(0, stringBuilder.length() - 1))); } } From 1b1b511b61eb122405711334de9abccbc4742039 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sun, 25 Feb 2024 17:39:18 -0800 Subject: [PATCH 29/33] Fix conversion issues between Legacy and MiniMessage (#5702) Fixes #5652 --- .../java/com/earth2me/essentials/I18n.java | 6 ++- .../essentials/utils/AdventureUtil.java | 46 +++++-------------- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/I18n.java b/Essentials/src/main/java/com/earth2me/essentials/I18n.java index 9d7668651..b09cb6712 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/I18n.java +++ b/Essentials/src/main/java/com/earth2me/essentials/I18n.java @@ -182,8 +182,10 @@ public class I18n implements net.ess3.api.II18n { } final Object[] processedArgs = mutateArgs(objects, arg -> { - final String str = arg instanceof AdventureUtil.ParsedPlaceholder ? arg.toString() : AdventureUtil.miniMessage().escapeTags(arg.toString()); - return AdventureUtil.legacyToMini(str); + if (arg instanceof AdventureUtil.ParsedPlaceholder) { + return arg.toString(); + } + return AdventureUtil.legacyToMini(AdventureUtil.miniMessage().escapeTags(arg.toString())); }); return messageFormat.format(processedArgs).replace(' ', ' '); // replace nbsp with a space diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java index 4016504a5..18bf8aa8d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java @@ -8,18 +8,12 @@ import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.ChatColor; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; public final class AdventureUtil { private static final LegacyComponentSerializer LEGACY_SERIALIZER; - private static final Pattern NAMED_PATTERN = Pattern.compile(ChatColor.COLOR_CHAR + "[0-9a-fk-orA-FK-OR]"); - private static final Pattern HEX_PATTERN = Pattern.compile(ChatColor.COLOR_CHAR + "x((?:" + ChatColor.COLOR_CHAR + "[0-9a-fA-F]){6})"); + private static final MiniMessage MINI_MESSAGE_NO_TAGS; private static final String LOOKUP = "0123456789abcdefklmnor"; - private static final String[] MINI_TAGS = new String[] {"black", "dark_blue", "dark_green", "dark_aqua", "dark_red", "dark_purple", "gold", "gray", "dark_gray", "blue", "green", "aqua", "red", "light_purple", "yellow", "white", "obf", "b", "st", "u", "i", "reset"}; - private static final NamedTextColor[] COLORS = new NamedTextColor[] {NamedTextColor.BLACK, NamedTextColor.DARK_BLUE, NamedTextColor.DARK_GREEN, NamedTextColor.DARK_AQUA, NamedTextColor.DARK_RED, NamedTextColor.DARK_PURPLE, NamedTextColor.GOLD, NamedTextColor.GRAY, NamedTextColor.DARK_GRAY, NamedTextColor.BLUE, NamedTextColor.GREEN, NamedTextColor.AQUA, NamedTextColor.RED, NamedTextColor.LIGHT_PURPLE, NamedTextColor.YELLOW, NamedTextColor.WHITE}; + private static final NamedTextColor[] COLORS = new NamedTextColor[]{NamedTextColor.BLACK, NamedTextColor.DARK_BLUE, NamedTextColor.DARK_GREEN, NamedTextColor.DARK_AQUA, NamedTextColor.DARK_RED, NamedTextColor.DARK_PURPLE, NamedTextColor.GOLD, NamedTextColor.GRAY, NamedTextColor.DARK_GRAY, NamedTextColor.BLUE, NamedTextColor.GREEN, NamedTextColor.AQUA, NamedTextColor.RED, NamedTextColor.LIGHT_PURPLE, NamedTextColor.YELLOW, NamedTextColor.WHITE}; private static IEssentials ess; private static MiniMessage miniMessageInstance; @@ -29,6 +23,9 @@ public final class AdventureUtil { builder.hexColors(); } LEGACY_SERIALIZER = builder.build(); + + MINI_MESSAGE_NO_TAGS = MiniMessage.miniMessage(); + miniMessageInstance = createMiniMessageInstance(); } @@ -84,37 +81,16 @@ public final class AdventureUtil { /** * Converts a section sign legacy string to a MiniMessage string. + * * @param useCustomTags true if gold and red colors should use primary and secondary tags instead. */ public static String legacyToMini(String text, boolean useCustomTags) { - StringBuffer buffer = new StringBuffer(); - Matcher matcher = HEX_PATTERN.matcher(text); - while (matcher.find()) { - final String code = matcher.group(1).replace(String.valueOf(ChatColor.COLOR_CHAR), ""); - matcher.appendReplacement(buffer, "<#" + code + ">"); + final Component deserializedText = LEGACY_SERIALIZER.deserialize(text); + if (useCustomTags) { + return miniMessageInstance.serialize(deserializedText); + } else { + return MINI_MESSAGE_NO_TAGS.serialize(deserializedText); } - matcher.appendTail(buffer); - - matcher = NAMED_PATTERN.matcher(buffer.toString()); - buffer = new StringBuffer(); - while (matcher.find()) { - final int format = LOOKUP.indexOf(Character.toLowerCase(matcher.group().charAt(1))); - if (format != -1) { - String tagName = MINI_TAGS[format]; - if (useCustomTags) { - if (tagName.equals("gold")) { - tagName = "primary"; - } else if (tagName.equals("red")) { - tagName = "secondary"; - } - } - - matcher.appendReplacement(buffer, "<" + tagName + ">"); - } - } - matcher.appendTail(buffer); - - return buffer.toString(); } /** From 52a638f18fb830ec604af240388648e8472da687 Mon Sep 17 00:00:00 2001 From: MD <1917406+mdcfe@users.noreply.github.com> Date: Mon, 26 Feb 2024 01:51:31 +0000 Subject: [PATCH 30/33] Add actions step to log JUnit test reports (#5684) --- .github/workflows/build-master.yml | 6 ++++++ .github/workflows/build-pr.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml index 62e0e96f4..1780c2731 100644 --- a/.github/workflows/build-master.yml +++ b/.github/workflows/build-master.yml @@ -34,6 +34,12 @@ jobs: chmod +x gradlew ./gradlew build --stacktrace + - name: Publish JUnit report + uses: mikepenz/action-junit-report@v4 + if: success() || failure() # Run even if the previous step fails + with: + report_paths: '**/build/test-results/test*/TEST-*.xml' + - name: Archive plugin jars on GitHub uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 5cb330dbb..ac9715fb1 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -36,6 +36,12 @@ jobs: chmod +x gradlew ./gradlew build --stacktrace + - name: Publish JUnit report + uses: mikepenz/action-junit-report@v4 + if: success() || failure() # Run even if the previous step fails + with: + report_paths: '**/build/test-results/test*/TEST-*.xml' + - name: Archive plugin jars on GitHub uses: actions/upload-artifact@v4 with: From bd8c792fa4cc1a508f8dc9b3c404cab9fed3ca47 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 26 Feb 2024 03:47:00 -0800 Subject: [PATCH 31/33] Support custom biomes in random teleport excluded biome list (#5703) --- .../com/earth2me/essentials/Essentials.java | 12 ++++++ .../com/earth2me/essentials/IEssentials.java | 3 ++ .../earth2me/essentials/RandomTeleport.java | 41 ++++++++++++++----- .../net/ess3/provider/BiomeKeyProvider.java | 8 ++++ providers/PaperProvider/build.gradle | 4 +- .../providers/PaperBiomeKeyProvider.java | 19 +++++++++ 6 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java create mode 100644 providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 3a54a58bc..81a4ab8f3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -59,6 +59,7 @@ import net.ess3.nms.refl.providers.ReflServerStateProvider; import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; +import net.ess3.provider.BiomeKeyProvider; import net.ess3.provider.ContainerProvider; import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; @@ -95,6 +96,7 @@ import net.ess3.provider.providers.ModernItemUnbreakableProvider; import net.ess3.provider.providers.ModernPersistentDataProvider; import net.ess3.provider.providers.ModernPlayerLocaleProvider; import net.ess3.provider.providers.ModernSignDataProvider; +import net.ess3.provider.providers.PaperBiomeKeyProvider; import net.ess3.provider.providers.PaperContainerProvider; import net.ess3.provider.providers.PaperKnownCommandsProvider; import net.ess3.provider.providers.PaperMaterialTagProvider; @@ -197,6 +199,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient PlayerLocaleProvider playerLocaleProvider; private transient SignDataProvider signDataProvider; private transient DamageEventProvider damageEventProvider; + private transient BiomeKeyProvider biomeKeyProvider; private transient Kits kits; private transient RandomTeleport randomTeleport; private transient UpdateChecker updateChecker; @@ -485,6 +488,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { damageEventProvider = new LegacyDamageEventProvider(); } + if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_19_4_R01)) { + biomeKeyProvider = new PaperBiomeKeyProvider(); + } + execTimer.mark("Init(Providers)"); reload(); @@ -1426,6 +1433,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return damageEventProvider; } + @Override + public BiomeKeyProvider getBiomeKeyProvider() { + return biomeKeyProvider; + } + @Override public SignDataProvider getSignDataProvider() { return signDataProvider; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index 9aea053e8..3b41f1c30 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -9,6 +9,7 @@ import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.updatecheck.UpdateChecker; import com.earth2me.essentials.userstorage.IUserMap; import net.ess3.nms.refl.providers.ReflOnlineModeProvider; +import net.ess3.provider.BiomeKeyProvider; import net.ess3.provider.ContainerProvider; import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; @@ -186,5 +187,7 @@ public interface IEssentials extends Plugin { DamageEventProvider getDamageEventProvider(); + BiomeKeyProvider getBiomeKeyProvider(); + PluginCommand getPluginCommand(String cmd); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java index f020a2cca..b1b683ab6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java @@ -6,13 +6,12 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.VersionUtil; import io.papermc.lib.PaperLib; import net.ess3.api.InvalidWorldException; +import net.ess3.provider.BiomeKeyProvider; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.block.Biome; import java.io.File; import java.util.HashSet; -import java.util.List; import java.util.Queue; import java.util.Random; import java.util.Set; @@ -76,14 +75,10 @@ public class RandomTeleport implements IConf { config.save(); } - public Set getExcludedBiomes() { - final List biomeNames = config.getList("excluded-biomes", String.class); - final Set excludedBiomes = new HashSet<>(); - for (final String biomeName : biomeNames) { - try { - excludedBiomes.add(Biome.valueOf(biomeName.toUpperCase())); - } catch (final IllegalArgumentException ignored) { - } + public Set getExcludedBiomes() { + final Set excludedBiomes = new HashSet<>(); + for (final String key : config.getList("excluded-biomes", String.class)) { + excludedBiomes.add(key.toLowerCase()); } return excludedBiomes; } @@ -204,7 +199,31 @@ public class RandomTeleport implements IConf { } private boolean isValidRandomLocation(final Location location) { - return location.getBlockY() > ess.getWorldInfoProvider().getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome()); + return location.getBlockY() > ess.getWorldInfoProvider().getMinHeight(location.getWorld()) && !isExcludedBiome(location); + } + + // Exclude biome if enum or namespaced key matches + private boolean isExcludedBiome(final Location location) { + final Set excluded = getExcludedBiomes(); + final String enumKey = location.getBlock().getBiome().name().toLowerCase(); + // Try with good old bukkit enum + if (excluded.contains(enumKey)) { + return true; + } + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_4_R01)) { + // No way to get the biome key on versions below this + return false; + } + final String biomeKey; + final BiomeKeyProvider biomeKeyProvider = ess.getBiomeKeyProvider(); + if (biomeKeyProvider != null) { + // Works with custom biome keys + biomeKey = biomeKeyProvider.getBiomeKey(location.getBlock()).toString(); + } else { + // Custom biome keys resolve as "minecraft:custom" which is unfortunate + biomeKey = location.getBlock().getBiome().getKey().toString(); + } + return excluded.contains(biomeKey); } public File getFile() { diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java new file mode 100644 index 000000000..94ee756fc --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java @@ -0,0 +1,8 @@ +package net.ess3.provider; + +import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; + +public interface BiomeKeyProvider extends Provider { + NamespacedKey getBiomeKey(Block block); +} diff --git a/providers/PaperProvider/build.gradle b/providers/PaperProvider/build.gradle index ecff3ba47..b66ffd77c 100644 --- a/providers/PaperProvider/build.gradle +++ b/providers/PaperProvider/build.gradle @@ -11,8 +11,8 @@ dependencies { implementation(project(':providers:BaseProviders')) { exclude(module: 'spigot-api') } - compileOnly 'io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT' - compileOnly 'io.papermc.paper:paper-mojangapi:1.18.2-R0.1-SNAPSHOT' + compileOnly 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT' + compileOnly 'io.papermc.paper:paper-mojangapi:1.20.4-R0.1-SNAPSHOT' } essentials { diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java new file mode 100644 index 000000000..34c26ea48 --- /dev/null +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java @@ -0,0 +1,19 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.BiomeKeyProvider; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; + +@SuppressWarnings("deprecation") +public class PaperBiomeKeyProvider implements BiomeKeyProvider { + @Override + public NamespacedKey getBiomeKey(final Block block) { + return Bukkit.getUnsafe().getBiomeKey(block.getWorld(), block.getX(), block.getY(), block.getZ()); + } + + @Override + public String getDescription() { + return "Paper Biome Key Provider"; + } +} From 421945070545843e031d36f78d575e4747a11513 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 26 Feb 2024 05:09:02 -0800 Subject: [PATCH 32/33] Hotfix legacy serializer to include capitalized formatting code chars (#5711) --- .../essentials/utils/AdventureUtil.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java index 18bf8aa8d..e3d361803 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java @@ -4,10 +4,17 @@ import net.ess3.api.IEssentials; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.flattener.ComponentFlattener; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.serializer.legacy.CharacterAndFormat; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.Reset; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public final class AdventureUtil { private static final LegacyComponentSerializer LEGACY_SERIALIZER; @@ -18,7 +25,26 @@ public final class AdventureUtil { private static MiniMessage miniMessageInstance; static { - final LegacyComponentSerializer.Builder builder = LegacyComponentSerializer.builder().flattener(ComponentFlattener.basic()).useUnusualXRepeatedCharacterHexFormat(); + final List formats = new ArrayList<>(); + formats.addAll(CharacterAndFormat.defaults()); + formats.addAll(Arrays.asList( + CharacterAndFormat.characterAndFormat('A', NamedTextColor.GREEN), + CharacterAndFormat.characterAndFormat('B', NamedTextColor.AQUA), + CharacterAndFormat.characterAndFormat('C', NamedTextColor.RED), + CharacterAndFormat.characterAndFormat('D', NamedTextColor.LIGHT_PURPLE), + CharacterAndFormat.characterAndFormat('E', NamedTextColor.YELLOW), + CharacterAndFormat.characterAndFormat('F', NamedTextColor.WHITE), + CharacterAndFormat.characterAndFormat('K', TextDecoration.OBFUSCATED), + CharacterAndFormat.characterAndFormat('L', TextDecoration.BOLD), + CharacterAndFormat.characterAndFormat('M', TextDecoration.STRIKETHROUGH), + CharacterAndFormat.characterAndFormat('N', TextDecoration.UNDERLINED), + CharacterAndFormat.characterAndFormat('O', TextDecoration.ITALIC), + CharacterAndFormat.characterAndFormat('R', Reset.INSTANCE) + )); + final LegacyComponentSerializer.Builder builder = LegacyComponentSerializer.builder() + .flattener(ComponentFlattener.basic()) + .formats(formats) + .useUnusualXRepeatedCharacterHexFormat(); if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_1_R01)) { builder.hexColors(); } From 6b521e78a6d47c7481a7bd5eadc9a7454953f9b9 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 26 Feb 2024 11:32:44 -0800 Subject: [PATCH 33/33] Fix jail-online-time with offline players (#5701) --- .../java/com/earth2me/essentials/PlayerExtension.java | 8 ++++++++ .../earth2me/essentials/commands/Commandtogglejail.java | 4 ++-- .../java/com/earth2me/essentials/OfflinePlayerStub.java | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/PlayerExtension.java b/Essentials/src/main/java/com/earth2me/essentials/PlayerExtension.java index 23bbb5a3a..09c3d0191 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/PlayerExtension.java +++ b/Essentials/src/main/java/com/earth2me/essentials/PlayerExtension.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.entity.Player; @@ -31,4 +32,11 @@ public class PlayerExtension { public Location getLocation() { return base.getLocation(); } + + public OfflinePlayer getOffline() { + if (base instanceof OfflinePlayerStub) { + return ((OfflinePlayerStub) base).base; + } + return base; + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java index 1cab26deb..ce777f67f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtogglejail.java @@ -83,7 +83,7 @@ public class Commandtogglejail extends EssentialsCommand { if (args.length > 2) { player.setJailTimeout(timeDiff); // 50 MSPT (milliseconds per tick) - player.setOnlineJailedTime(ess.getSettings().isJailOnlineTime() ? ((player.getBase().getStatistic(PLAY_ONE_TICK)) + (timeDiff / 50)) : 0); + player.setOnlineJailedTime(ess.getSettings().isJailOnlineTime() ? ((player.getOffline().getStatistic(PLAY_ONE_TICK)) + (timeDiff / 50)) : 0); } final String tlKey; @@ -121,7 +121,7 @@ public class Commandtogglejail extends EssentialsCommand { final long displayTimeDiff = DateUtil.parseDateDiff(unparsedTime, true); final long timeDiff = DateUtil.parseDateDiff(unparsedTime, true, ess.getSettings().isJailOnlineTime()); player.setJailTimeout(timeDiff); - player.setOnlineJailedTime(ess.getSettings().isJailOnlineTime() ? ((player.getBase().getStatistic(PLAY_ONE_TICK)) + (timeDiff / 50)) : 0); + player.setOnlineJailedTime(ess.getSettings().isJailOnlineTime() ? ((player.getOffline().getStatistic(PLAY_ONE_TICK)) + (timeDiff / 50)) : 0); sender.sendTl("jailSentenceExtended", DateUtil.formatDateDiff(displayTimeDiff)); final String tlKey = "jailNotifySentenceExtended"; diff --git a/providers/1_12Provider/src/main/java/com/earth2me/essentials/OfflinePlayerStub.java b/providers/1_12Provider/src/main/java/com/earth2me/essentials/OfflinePlayerStub.java index 77f778682..a73f6ff15 100644 --- a/providers/1_12Provider/src/main/java/com/earth2me/essentials/OfflinePlayerStub.java +++ b/providers/1_12Provider/src/main/java/com/earth2me/essentials/OfflinePlayerStub.java @@ -64,8 +64,8 @@ import java.util.Set; import java.util.UUID; public class OfflinePlayerStub implements Player { + protected final transient org.bukkit.OfflinePlayer base; private final transient Server server; - private final transient org.bukkit.OfflinePlayer base; private transient Location location = new Location(null, 0, 0, 0, 0, 0); private transient World world; private boolean allowFlight = false;