mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-05 18:27:17 +01:00
def8b96d4b
Datapacks check this on load and are built concurrently. This was breaking them badly due to race conditions. Plus, .canUse we want to be safe for async anyways.
52 lines
2 KiB
Diff
52 lines
2 KiB
Diff
--- 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,14 @@
|
|
private final RedirectModifier<S> modifier;
|
|
private final boolean forks;
|
|
private Command<S> command;
|
|
+ public CommandNode<CommandSourceStack> clientNode; // Paper - Brigadier 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 +71,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);
|
|
}
|
|
|