From a6580f59475799fb681bff2ba82a186508430762 Mon Sep 17 00:00:00 2001 From: Mergu Date: Wed, 14 Nov 2018 04:24:47 -0500 Subject: [PATCH] Fix tab completion in 1.13 --- .../java/net/aufdemrand/denizen/Denizen.java | 3 +++ .../denizen/DenizenCommandHandler.java | 3 +++ .../containers/core/CommandScriptHelper.java | 21 +++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java index ef6cd3bd83..30a1ca6087 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -902,6 +902,9 @@ public void run() { try { DenizenCore.loadScripts(); + // Synchronize any script commands added while loading scripts. + CommandScriptHelper.syncDenizenCommands(); + // Load the saves.yml into memory reloadSaves(); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/DenizenCommandHandler.java b/plugin/src/main/java/net/aufdemrand/denizen/DenizenCommandHandler.java index 2a93af82a3..9ec2e43d79 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/DenizenCommandHandler.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/DenizenCommandHandler.java @@ -3,6 +3,7 @@ import net.aufdemrand.denizen.objects.dLocation; import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.objects.notable.NotableManager; +import net.aufdemrand.denizen.scripts.containers.core.CommandScriptHelper; import net.aufdemrand.denizen.scripts.containers.core.VersionScriptContainer; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.ScriptVersionChecker; @@ -319,6 +320,7 @@ public void reload(CommandContext args, CommandSender sender) throws CommandExce DenizenCore.reloadScripts(); denizen.notableManager().reloadNotables(); denizen.reloadSaves(); + CommandScriptHelper.syncDenizenCommands(); Messaging.send(sender, "Denizen/saves.yml, Denizen/notables.yml, Denizen/config.yml, Denizen/scripts/..., and Denizen/externals/... reloaded from disk to memory."); if (ScriptHelper.hadError()) { Messaging.sendError(sender, "There was an error loading your scripts, check the console for details!"); @@ -351,6 +353,7 @@ else if (args.getString(1).equalsIgnoreCase("config")) { } else if (args.getString(1).equalsIgnoreCase("scripts")) { DenizenCore.reloadScripts(); + CommandScriptHelper.syncDenizenCommands(); Messaging.send(sender, "Denizen/scripts/... reloaded from disk to memory."); if (ScriptHelper.hadError()) { Messaging.sendError(sender, "There was an error loading your scripts, check the console for details!"); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/CommandScriptHelper.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/CommandScriptHelper.java index d465fb6667..1a1194902c 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/CommandScriptHelper.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/CommandScriptHelper.java @@ -2,6 +2,8 @@ import com.google.common.base.Predicate; import net.aufdemrand.denizen.Settings; +import net.aufdemrand.denizen.nms.NMSHandler; +import net.aufdemrand.denizen.nms.NMSVersion; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.DenizenAliasHelpTopic; import net.aufdemrand.denizen.utilities.DenizenCommand; @@ -17,6 +19,7 @@ import org.bukkit.scheduler.BukkitRunnable; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -89,6 +92,24 @@ public void run() { } } + /** + * In 1.13+, commands are also sent to players client-side via packets. + * We need to sync them for tab completion to work. + */ + public static void syncDenizenCommands() { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13_R2)) { + try { + final Server server = DenizenAPI.getCurrentInstance().getServer(); + final Method syncMethod = server.getClass().getDeclaredMethod("syncCommands"); + syncMethod.setAccessible(true); + syncMethod.invoke(server); + } + catch (Exception e) { + dB.echoError("Failed to synchronize server commands."); + } + } + } + /** * Removes all registered {@link DenizenCommand DenizenCommands} from CraftBukkit and restores any * overridden Commands.