From 7b02d22ac75f5bc42cf84136f85fb83ce14788d9 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 1 Aug 2024 16:59:37 -0700 Subject: [PATCH] Fix incompatibility with AlternativeCommandsHandler & Paper API (#5881) --- .../essentials/AlternativeCommandsHandler.java | 16 +++++++++++++--- .../java/com/earth2me/essentials/Settings.java | 13 +++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java b/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java index 1028c830087..6b1215c3bd0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java @@ -1,5 +1,6 @@ package com.earth2me.essentials; +import java.util.stream.Collectors; import org.bukkit.command.Command; import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.plugin.Plugin; @@ -31,7 +32,7 @@ public final void addPlugin(final Plugin plugin) { if (plugin.getDescription().getMain().contains("com.earth2me.essentials") || plugin.getDescription().getMain().contains("net.essentialsx")) { return; } - for (final Map.Entry entry : getPluginCommands(plugin).entrySet()) { + for (final Map.Entry entry : getPluginCommands(plugin)) { final String[] commandSplit = entry.getKey().split(":", 2); final String commandName = commandSplit.length > 1 ? commandSplit[1] : entry.getKey(); final Command command = entry.getValue(); @@ -64,14 +65,23 @@ public final void addPlugin(final Plugin plugin) { } } - private Map getPluginCommands(Plugin plugin) { + private List> getPluginCommands(Plugin plugin) { final Map commands = new HashMap<>(); for (final Map.Entry entry : ess.getKnownCommandsProvider().getKnownCommands().entrySet()) { if (entry.getValue() instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand) entry.getValue()).getPlugin().equals(plugin)) { commands.put(entry.getKey(), entry.getValue()); } } - return commands; + // Try to use non-namespaced commands first if we can, some Commands may not like being registered under a + // different label than their getName() returns, so avoid doing that when we can + return commands.entrySet().stream().sorted((o1, o2) -> { + if (o1.getKey().contains(":") && !o2.getKey().contains(":")) { + return 1; + } else if (!o1.getKey().contains(":") && o2.getKey().contains(":")) { + return -1; + } + return 0; + }).collect(Collectors.toList()); } public void removePlugin(final Plugin plugin) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index bd8d64b4f0d..07ab7c3b2c4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -23,6 +23,7 @@ import org.bukkit.command.Command; import org.bukkit.event.EventPriority; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; import org.spongepowered.configurate.CommentedConfigurationNode; import java.io.File; @@ -705,6 +706,18 @@ public void reloadConfig() { mapModified = true; } + if (reloadCount.get() < 2) { + // on startup: add plugins again in case they registered commands with the new API + // we need to schedule this task before any of the below tasks using _addAlternativeCommand. + ess.scheduleSyncDelayedTask(() -> { + for (final Plugin plugin : ess.getServer().getPluginManager().getPlugins()) { + if (plugin.isEnabled()) { + ess.getAlternativeCommandsHandler().addPlugin(plugin); + } + } + }); + } + for (final String command : disabledCommands) { final String effectiveAlias = command.toLowerCase(Locale.ENGLISH); final Command toDisable = ess.getPluginCommand(effectiveAlias);