--- 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; @@ -23,6 +24,8 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import net.minecraft.commands.CommandListenerWrapper; // CraftBukkit + public abstract class CommandNode implements Comparable> { private final Map> children = new LinkedHashMap<>(); private final Map> literals = new LinkedHashMap<>(); @@ -32,6 +35,13 @@ private final RedirectModifier modifier; private final boolean forks; private Command command; + // CraftBukkit start + public void removeCommand(String name) { + children.remove(name); + literals.remove(name); + 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; @@ -61,7 +71,17 @@ return modifier; } - public boolean canUse(final S source) { + // CraftBukkit start + public synchronized boolean canUse(final S source) { + if (source instanceof CommandListenerWrapper) { + try { + ((CommandListenerWrapper) source).currentCommand = this; + return requirement.test(source); + } finally { + ((CommandListenerWrapper) source).currentCommand = null; + } + } + // CraftBukkit end return requirement.test(source); }