diff options
Diffstat (limited to 'paper-server/patches/unapplied/com/mojang/brigadier/tree/CommandNode.java.patch')
-rw-r--r-- | paper-server/patches/unapplied/com/mojang/brigadier/tree/CommandNode.java.patch | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/paper-server/patches/unapplied/com/mojang/brigadier/tree/CommandNode.java.patch b/paper-server/patches/unapplied/com/mojang/brigadier/tree/CommandNode.java.patch new file mode 100644 index 0000000000..179686de6f --- /dev/null +++ b/paper-server/patches/unapplied/com/mojang/brigadier/tree/CommandNode.java.patch @@ -0,0 +1,102 @@ +--- a/com/mojang/brigadier/tree/CommandNode.java ++++ b/com/mojang/brigadier/tree/CommandNode.java +@@ -3,6 +3,7 @@ + + package com.mojang.brigadier.tree; + ++// CHECKSTYLE:OFF + import com.mojang.brigadier.AmbiguityConsumer; + import com.mojang.brigadier.Command; + import com.mojang.brigadier.RedirectModifier; +@@ -22,6 +23,7 @@ + import java.util.Set; + import java.util.concurrent.CompletableFuture; + import java.util.function.Predicate; ++import net.minecraft.commands.CommandSourceStack; + + public abstract class CommandNode<S> implements Comparable<CommandNode<S>> { + private final Map<String, CommandNode<S>> children = new LinkedHashMap<>(); +@@ -32,6 +34,16 @@ + private final RedirectModifier<S> modifier; + private final boolean forks; + private Command<S> command; ++ public CommandNode<CommandSourceStack> clientNode; // Paper - Brigadier API ++ public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> unwrappedCached = null; // Paper - Brigadier Command API ++ public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> wrappedCached = null; // 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<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks) { + this.command = command; +@@ -61,7 +73,17 @@ + return this.modifier; + } + +- public boolean canUse(final S source) { ++ // CraftBukkit start ++ public synchronized boolean canUse(final S source) { ++ if (source instanceof CommandSourceStack) { ++ try { ++ ((CommandSourceStack) source).currentCommand.put(Thread.currentThread(), this); // Paper - Thread Safe Vanilla Command permission checking ++ return this.requirement.test(source); ++ } finally { ++ ((CommandSourceStack) source).currentCommand.remove(Thread.currentThread()); // Paper - Thread Safe Vanilla Command permission checking ++ } ++ } ++ // CraftBukkit end + return this.requirement.test(source); + } + +@@ -151,6 +173,12 @@ + protected abstract String getSortedKey(); + + public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input) { ++ // Paper start - prioritize mc commands in function parsing ++ return this.getRelevantNodes(input, null); ++ } ++ @org.jetbrains.annotations.ApiStatus.Internal ++ public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input, final Object source) { ++ // Paper end - prioritize mc commands in function parsing + if (this.literals.size() > 0) { + final int cursor = input.getCursor(); + while (input.canRead() && input.peek() != ' ') { +@@ -158,7 +186,21 @@ + } + final String text = input.getString().substring(cursor, input.getCursor()); + input.setCursor(cursor); +- final LiteralCommandNode<S> literal = this.literals.get(text); ++ // Paper start - prioritize mc commands in function parsing ++ LiteralCommandNode<S> literal = null; ++ if (source instanceof CommandSourceStack css && css.source == net.minecraft.commands.CommandSource.NULL) { ++ if (!text.contains(":")) { ++ literal = this.literals.get("minecraft:" + text); ++ } ++ } else if (source instanceof 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 +225,11 @@ + } + + public abstract Collection<String> getExamples(); ++ // Paper start - Brigadier Command API ++ public void clearAll() { ++ this.children.clear(); ++ this.literals.clear(); ++ this.arguments.clear(); ++ } ++ // Paper end - Brigadier Command API + } |