--- a/com/mojang/brigadier/tree/CommandNode.java +++ b/com/mojang/brigadier/tree/CommandNode.java @@ -27,11 +_,22 @@ private final Map> children = new LinkedHashMap<>(); private final Map> literals = new LinkedHashMap<>(); private final Map> arguments = new LinkedHashMap<>(); - private final Predicate requirement; + public Predicate requirement; // Paper - public-f private final CommandNode redirect; private final RedirectModifier modifier; private final boolean forks; private Command command; + public CommandNode clientNode; // Paper - Brigadier API + public CommandNode unwrappedCached = null; // Paper - Brigadier Command API + public CommandNode wrappedCached = null; // Paper - Brigadier Command API + public io.papermc.paper.command.brigadier.APICommandMeta apiCommandMeta; // Paper - Brigadier Command API + // CraftBukkit start + public void removeCommand(String name) { + this.children.remove(name); + this.literals.remove(name); + this.arguments.remove(name); + } + // CraftBukkit end protected CommandNode(final Command command, final Predicate requirement, final CommandNode redirect, final RedirectModifier modifier, final boolean forks) { this.command = command; @@ -151,6 +_,12 @@ protected abstract String getSortedKey(); public Collection> getRelevantNodes(final StringReader input) { + // Paper start - prioritize mc commands in function parsing + return this.getRelevantNodes(input, null); + } + @org.jetbrains.annotations.ApiStatus.Internal + public Collection> getRelevantNodes(final StringReader input, final Object source) { + // Paper end - prioritize mc commands in function parsing if (literals.size() > 0) { final int cursor = input.getCursor(); while (input.canRead() && input.peek() != ' ') { @@ -158,7 +_,21 @@ } final String text = input.getString().substring(cursor, input.getCursor()); input.setCursor(cursor); - final LiteralCommandNode literal = literals.get(text); + // Paper start - prioritize mc commands in function parsing + LiteralCommandNode literal = null; + if (source instanceof net.minecraft.commands.CommandSourceStack css && css.source == net.minecraft.commands.CommandSource.NULL) { + if (!text.contains(":")) { + literal = this.literals.get("minecraft:" + text); + } + } else if (source instanceof net.minecraft.commands.CommandSourceStack css && css.source instanceof net.minecraft.world.level.BaseCommandBlock) { + if (css.getServer().server.getCommandBlockOverride(text) && !text.contains(":")) { + literal = this.literals.get("minecraft:" + text); + } + } + if (literal == null) { + literal = this.literals.get(text); + } + // Paper end - prioritize mc commands in function parsing if (literal != null) { return Collections.singleton(literal); } else { @@ -183,4 +_,11 @@ } public abstract Collection getExamples(); + // Paper start - Brigadier Command API + public void clearAll() { + this.children.clear(); + this.literals.clear(); + this.arguments.clear(); + } + // Paper end - Brigadier Command API }