From 32a756f0338ec55b0a5b2300821afc8b94c63ac1 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:14:36 -0700 Subject: [PATCH] Fix #387 --- .../brigadier/CloudBrigadierManager.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java index 1194352b..3a7f49d8 100644 --- a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java +++ b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java @@ -57,12 +57,16 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.context.ParsedCommandNode; +import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.suggestion.SuggestionProvider; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -617,7 +621,7 @@ public final class CloudBrigadierManager { cloudSender, this.commandManager ); - command = command.substring(senderContext.getLastChild().getNodes().get(0).getRange().getStart()); + command = command.substring(getNodes(senderContext.getLastChild()).get(0).getSecond().getStart()); } /* Remove namespace */ @@ -664,4 +668,32 @@ public final class CloudBrigadierManager { return suggestionsBuilder.buildFuture(); } + + /** + * Return type changed at some point, but information is essentially the same. This code works for both versions of the + * method. + * + * @param commandContext command context + * @param source type + * @return parsed nodes + */ + private static List, StringRange>> getNodes(final com.mojang.brigadier.context.CommandContext commandContext) { + try { + final Method getNodesMethod = commandContext.getClass().getDeclaredMethod("getNodes"); + final Object nodes = getNodesMethod.invoke(commandContext); + if (nodes instanceof List) { + return ((List>) nodes).stream() + .map(n -> Pair.of(n.getNode(), n.getRange())) + .collect(Collectors.toList()); + } else if (nodes instanceof Map) { + return ((Map, StringRange>) nodes).entrySet().stream() + .map(entry -> Pair.of(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); + } else { + throw new IllegalStateException(); + } + } catch (final ReflectiveOperationException ex) { + throw new RuntimeException(ex); + } + } }