aboutsummaryrefslogtreecommitdiffhomepage
path: root/paper-server/patches/unapplied/com/mojang/brigadier/tree/CommandNode.java.patch
diff options
context:
space:
mode:
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.patch102
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
+ }