From ff281241b5a8ee804c6e833f82edbc4137e11857 Mon Sep 17 00:00:00 2001 From: Minenash Date: Sun, 13 Jan 2019 00:32:55 -0500 Subject: Added the ability to unload using the fallback.* * Unfortunately it still won't remove the commands from the TabComplete * Also, changed the error msg from an unregistered command to help lessen the confusion on the previous issue. --- src/main/java/com/nemez/cmdmgr/CommandManager.java | 39 +++++++++++++++++++++- src/main/java/com/nemez/cmdmgr/EmptyCommand.java | 4 +-- .../java/com/nemez/cmdmgr/util/Executable.java | 16 ++++++--- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/nemez/cmdmgr/CommandManager.java b/src/main/java/com/nemez/cmdmgr/CommandManager.java index 5beb1e6..92905a0 100644 --- a/src/main/java/com/nemez/cmdmgr/CommandManager.java +++ b/src/main/java/com/nemez/cmdmgr/CommandManager.java @@ -11,6 +11,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -154,6 +155,7 @@ public class CommandManager { } reader.close(); } catch (Exception e) { + e.printStackTrace(); plugin.getLogger().log(Level.WARNING, "Error while loading command file. (" + sourceFile.getAbsolutePath() + ")"); plugin.getLogger().log(Level.WARNING, e.getCause().toString()); errors = true; @@ -325,6 +327,41 @@ public class CommandManager { } } + public static void unregisterAllWithFallback(String fallback) { + try { + final Field cmdMap = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + cmdMap.setAccessible(true); + CommandMap map = (CommandMap) cmdMap.get(Bukkit.getServer()); + final Field knownCommandsField = map.getClass().getSuperclass().getDeclaredField("knownCommands"); + knownCommandsField.setAccessible(true); + @SuppressWarnings("unchecked") + Map knownCommands = (Map) knownCommandsField.get(map); + + fallback = fallback.toLowerCase(); + System.out.println(fallback); + + List toRemove = new ArrayList<>(); + + for (String key: knownCommands.keySet()) { + org.bukkit.command.Command value = knownCommands.get(key); + if ((value instanceof Executable) && ((Executable)value).getMethodContainerName().equals(fallback)) { + toRemove.add(key); + value.unregister(map); + } + } + for (String key : toRemove) { + //EmptyCommand emptyCommand = new EmptyCommand(key); + knownCommands.remove(key); + //map.register(key, emptyCommand); + System.out.println("Unregestered " + key); + } + + + } catch (Exception e) { + e.printStackTrace(); + } + } + /** * Parses the source code into an abstract command syntax * @@ -719,7 +756,7 @@ public class CommandManager { components.help = null; components.permission = null; components.type = null; - Executable cmd = new Executable(cmdName, constructHelpPages(cmdName, components)); + Executable cmd = new Executable(cmdName, constructHelpPages(cmdName, components), methodContainer.getClass().getSimpleName()); cmd.register(methods, plugin, methodContainer, components.getAliases()); } diff --git a/src/main/java/com/nemez/cmdmgr/EmptyCommand.java b/src/main/java/com/nemez/cmdmgr/EmptyCommand.java index 8a29527..770ed77 100644 --- a/src/main/java/com/nemez/cmdmgr/EmptyCommand.java +++ b/src/main/java/com/nemez/cmdmgr/EmptyCommand.java @@ -8,13 +8,13 @@ public class EmptyCommand extends Executable { public EmptyCommand(String name) { - super(name, null); + super(name, null, ""); } @Override public boolean execute(CommandSender sender, String name, String[] args_) { - sender.sendMessage("§cUnknown command. Use §e/help§c, §e/plugins§c or ask a mod."); + sender.sendMessage("§cCommand no longer Exists. Use §e/help§c, §e/plugins§c or ask a mod."); return true; } } diff --git a/src/main/java/com/nemez/cmdmgr/util/Executable.java b/src/main/java/com/nemez/cmdmgr/util/Executable.java index 3d14598..9f39100 100644 --- a/src/main/java/com/nemez/cmdmgr/util/Executable.java +++ b/src/main/java/com/nemez/cmdmgr/util/Executable.java @@ -35,17 +35,23 @@ public class Executable extends org.bukkit.command.Command { private ArrayList commands; private ArrayList help; private String name; + private String methodContainerName; private JavaPlugin plugin; - public Executable(String name, ArrayList help) { + public Executable(String name, ArrayList help, String methodContainerName) { super(name); this.help = help; this.name = name; this.commands = new ArrayList(); + this.methodContainerName = methodContainerName; + } + + public String getMethodContainerName() { + return methodContainerName; } public void register(ArrayList methods, JavaPlugin plugin, Object methodContainer, ArrayList aliases) { - String moduleName = methodContainer.getClass().getSimpleName(); + methodContainerName = methodContainer.getClass().getSimpleName().toLowerCase(); for (HelpPageCommand[] page : help) { for (HelpPageCommand cmd : page) { if (cmd != null) { @@ -95,13 +101,13 @@ public class Executable extends org.bukkit.command.Command { @SuppressWarnings("unchecked") Map knownCommands = (Map) knownCommandsField.get(map); knownCommands.remove(name); - map.register(moduleName, this); + map.register(methodContainerName, this); for (String alias : aliases) { - Executable cmd = new Executable(alias, this.help); + Executable cmd = new Executable(alias, this.help, methodContainerName); cmd.commands = this.commands; cmd.plugin = this.plugin; knownCommands.remove(alias); - map.register(moduleName, cmd); + map.register(methodContainerName, cmd); } } catch (Exception e) { plugin.getLogger().log(Level.SEVERE, "Failed to register command '" + name + "'!"); -- cgit v1.2.3