diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java index feb3e3b..bb15553 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -109,11 +110,14 @@ public class BukkitPluginManager extends AbstractPluginManager disableOrderedPlugins(List plugins) { PluginResults disableResults = new PluginResults<>(); + Set removedCommands = new HashSet<>(); for (Plugin plugin : plugins) { String pluginId = getPluginId(plugin); if (!isPluginEnabled(pluginId)) return disableResults.addResult(pluginId, Result.ALREADY_DISABLED); Bukkit.getPluginManager().callEvent(new BukkitPluginDisableEvent(plugin, PluginEvent.Stage.PRE)); + Map pluginCommands = getPluginCommands(plugin); + try { Bukkit.getPluginManager().disablePlugin(plugin); RCraftingManager.removeRecipesFor(plugin); @@ -122,12 +126,14 @@ public class BukkitPluginManager extends AbstractPluginManager Map getPluginCommands(Plugin plugin) { + Map commands = new HashMap<>(); + + Map knownCommands = getKnownCommands(); + if (knownCommands == null) return commands; + + for (Map.Entry entry : knownCommands.entrySet()) { + Command c = entry.getValue(); + if (c instanceof PluginIdentifiableCommand) { + @SuppressWarnings("unchecked") + C pc = (C) c; + if (pc.getPlugin().getName().equals(plugin.getName())) { + commands.put(entry.getKey(), pc); + } + } + } + + return commands; + } + /** * Unregisters all commands from the specified plugin. * @param plugin The plugin. */ public static void unregisterCommands(Plugin plugin) { - Map knownCommands = getKnownCommands(); - if (knownCommands == null) return; + unregisterCommands(getPluginCommands(plugin)); + } - List unregisteredCommands = new ArrayList<>(); - knownCommands.entrySet().removeIf(e -> { - Command c = e.getValue(); - if (c instanceof PluginIdentifiableCommand) { - PluginIdentifiableCommand pc = (PluginIdentifiableCommand) c; - if (pc.getPlugin().getName().equals(plugin.getName())) { - c.unregister(RCraftServer.getCommandMap()); - unregisteredCommands.add(e.getKey()); - return true; - } - return false; - } - return false; - }); - - RCommandDispatcher.removeCommands(unregisteredCommands); - RCraftServer.updateCommands(); + private static void unregisterCommands(Map pluginCommands) { + pluginCommands.values().forEach(c -> c.unregister(RCraftServer.getCommandMap())); + RCommandDispatcher.removeCommands(pluginCommands.keySet()); } /** diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java index 6009f95..049ee45 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java @@ -48,7 +48,7 @@ public class RCraftServer { * Syncs and registers all commands, but keeping the old values that haven't been added. */ @SuppressWarnings({"rawtypes"}) - public static void syncCommands() { + public static void syncCommands(Set removedCommands) { if (MinecraftReflectionVersion.MINOR < 13) return; Collection children = RCommandDispatcher.getDispatcher().getRoot().getChildren(); @@ -56,8 +56,12 @@ public class RCraftServer { Object root = RCommandDispatcher.getDispatcher().getRoot(); for (Object child : children) { - RCommandNode.removeCommand(root, RCommandNode.getName(child)); - RCommandNode.addChild(root, child); + String name = RCommandNode.getName(child); + RCommandNode.removeCommand(root, name); + + if (!removedCommands.contains(name)) { + RCommandNode.addChild(root, child); + } } updateCommands(); } @@ -144,7 +148,7 @@ public class RCraftServer { ); commandMap.registerServerAliases(); - RCraftServer.syncCommands(); + RCraftServer.syncCommands(commandNames); } /**