8000 Improve the system to better avoid conflicts · CommandAPI/CommandAPI@e4c1317 · GitHub
[go: up one dir, main page]

Skip to content

Commit e4c1317

Browse files
Improve the system to better avoid conflicts
Co-authored-by: willkroboth <46540330+willkroboth@users.noreply.github.com>
1 parent 0f94824 commit e4c1317

File tree

24 files changed

+74
-58
lines changed
  • commandapi-platforms/commandapi-bukkit
    • commandapi-bukkit-core/src/main/java/dev/jorel/commandapi
    • commandapi-bukkit-nms
    • commandapi-bukkit-test
      • commandapi-bukkit-test-impl-1.16.5/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.17/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.18/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.19.2/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.19.4/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.20.2/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.20.3/src/main/java/dev/jorel/commandapi/test
      • commandapi-bukkit-test-impl-1.20/src/main/java/dev/jorel/commandapi/test

24 files changed

+74
-58
lines changed

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/CommandAPIBukkit.java

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public abstract class CommandAPIBukkit<Source> implements CommandAPIPlatform<Arg
7171
private PaperImplementations paper;
7272

7373
private final Set<String> namespacesToFix = new HashSet<>();
74+
private final RootCommandNode<Source> minecraftCommandNamespaces = new RootCommandNode<>();
7475

7576
// Static VarHandles
7677
// I'd like to make the Maps here `Map<String, CommandNode<Source>>`, but these static fields cannot use the type
@@ -199,9 +200,10 @@ public void onEnable() {
199200
JavaPlugin plugin = config.getPlugin();
200201

201202
new Schedulers(paper).scheduleSyncDelayed(plugin, () -> {
203+
// Fix namespaces first thing when starting the server
204+
fixNamespaces();
202205
// Sort out permissions after the server has finished registering them all
203206
fixPermissions();
204-
fixNamespaces();
205207
if (paper.isFoliaPresent()) {
206208
CommandAPI.logNormal("Skipping initial datapack reloading because Folia was detected");
207209
} else {
@@ -397,10 +399,18 @@ void updateHelpForCommands(List<RegisteredCommand> commands) {
397399
private void fixNamespaces() {
398400
Map<String, Command> knownCommands = commandMapKnownCommands.get((SimpleCommandMap) paper.getCommandMap());
399401
CommandDispatcher<Source> resourcesDispatcher = getResourcesDispatcher();
402+
// Remove namespaces
400403
for (String command : namespacesToFix) {
401404
knownCommands.remove(command);
402405
removeBrigadierCommands(resourcesDispatcher, command, false, c -> true);
403406
}
407+
408+
// Add back certain minecraft: namespace commands
409+
RootCommandNode<Source> rootNode = resourcesDispatcher.getRoot();
410+
for (CommandNode<Source> node : minecraftCommandNamespaces.getChildren()) {
411+
knownCommands.put(node.getName(), wrapToVanillaCommandWrapper(node));
412+
rootNode.addChild(node);
413+
}
404414
}
405415

406416
@Override
@@ -558,25 +568,55 @@ private LiteralCommandNode<Source> namespaceNode(LiteralCommandNode<Source> orig
558568

559569
@Override
560570
public LiteralCommandNode<Source> registerCommandNode(LiteralArgumentBuilder<Source> node, String namespace) {
561-
LiteralCommandNode<Source> builtNode = getBrigadierDispatcher().register(node);
562-
if (namespace.isEmpty()) {
571+
LiteralCommandNode<Source> builtNode = node.build();
572+
LiteralCommandNode<Source> customNamespaceNode = null;
573+
574+
String name = node.getLiteral();
575+
boolean namespaceEqualsMinecraft = namespace.equals("minecraft");
576+
if (namespaceEqualsMinecraft && namespacesToFix.contains("minecraft:" + name)) {
577+
// This command wants to exist as `minecraft:name`
578+
// However, another command has requested that `minecraft:name` be removed
579+
// We'll keep track of everything that should be `minecraft:name` in
580+
// `minecraftCommandNamespaces` and fix this later in `#fixNamespaces`
581+
minecraftCommandNamespaces.addChild(namespaceNode(builtNode, "minecraft"));
582+
} else if (namespace.isEmpty()) {
563583
// Bukkit will automatically create `minecraft:command`
564584
// We want to remove that so there is no namespace
565-
fillNamespacesToFix(node.getLiteral());
566-
return builtNode;
585+
fillNamespacesToFix(name);
586+
} else if (!namespaceEqualsMinecraft) {
587+
// We should set up a custom namespace
588+
customNamespaceNode = namespaceNode(builtNode, namespace);
589+
// Make sure to remove the `minecraft:name` and
590+
// `minecraft:namespace:name` commands Bukkit will create
591+
fillNamespacesToFix(name, namespace + ":" + name);
567592
}
568-
if(!namespace.equals("minecraft")) {
569-
String name = node.getLiteral();
570-
String namespacedName = namespace + ":" + name;
571-
getBrigadierDispatcher().getRoot().addChild(namespaceNode(builtNode, namespace));
572-
fillNamespacesToFix(name, namespacedName);
593+
594+
// Add the nodes to the main dispatcher
595+
RootCommandNode<Source> rootNode = getBrigadierDispatcher().getRoot();
596+
rootNode.addChild(builtNode);
597+
if (customNamespaceNode != null) {
598+
rootNode.addChild(customNamespaceNode);
573599
}
574600
return builtNode;
575601
}
576602

577603
private void fillNamespacesToFix(String... namespacedCommands) {
578604
for (String namespacedCommand : namespacedCommands) {
579-
namespacesToFix.add("minecraft:" + namespacedCommand);
605+
// We'll remove these commands later when fixNamespaces is called
606+
if (!namespacesToFix.add("minecraft:" + namespacedCommand)) {
607+
continue;
608+
}
609+
610+
// If this is the first time considering this command for removal
611+
// and there is already a command with this name in the dispatcher
612+
// then, the command currently in the dispatcher is supposed to appear as `minecraft:command`
613+
CommandNode<Source> currentNode = getBrigadierDispatcher().getRoot().getChild(namespacedCommand);
614+
if(currentNode != null) {
615+
// We'll keep track of everything that should be `minecraft:command` in
616+
// `minecraftCommandNamespaces` and fix this later in `#fixNamespaces`
617+
// TODO: Ideally, we should be working without this cast to LiteralCommandNode. I don't know if this can fail
618+
minecraftCommandNamespaces.addChild(namespaceNode((LiteralCommandNode<Source>) currentNode, "minecraft"));
619+
}
580620
}
581621
}
582622

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/nms/NMS.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import java.util.function.Predicate;
3030

3131
import com.mojang.brigadier.tree.CommandNode;
32-
import com.mojang.brigadier.tree.LiteralCommandNode;
3332
import org.bukkit.Axis;
3433
import org.bukkit.ChatColor;
3534
import org.bukkit.Location;
@@ -436,7 +435,7 @@ String getScoreHolderSingle(CommandContext<CommandListenerWrapper> cmdCtx, Strin
436435
* @param node The LiteralCommandNode to wrap
437436
* @return A VanillaCommandWrapper representing the given node
438437
*/
439-
Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandListenerWrapper> node);
438+
Command wrapToVanillaCommandWrapper(CommandNode<CommandListenerWrapper> node);
440439

441440
/**
442441
* Checks if a Brigadier command node is being handled by Bukkit's BukkitCommandWrapper

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.15/src/main/java/dev/jorel/commandapi/nms/NMS_1_15.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import java.util.function.ToIntFunction;
1919

2020
import com.mojang.brigadier.tree.CommandNode;
21-
import com.mojang.brigadier.tree.LiteralCommandNode;
2221
import org.bukkit.Axis;
2322
import org.bukkit.Bukkit;
2423
import org.bukkit.ChatColor;
@@ -961,7 +960,7 @@ public boolean isVanillaCommandWrapper(Command command) {
961960
}
962961

963962
@Override
964-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandListenerWrapper> node) {
963+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandListenerWrapper> node) {
965964
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
966965
}
967966

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.1/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R1.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.function.ToIntFunction;
2323

2424
import com.mojang.brigadier.tree.CommandNode;
25-
import com.mojang.brigadier.tree.LiteralCommandNode;
2625
import org.bukkit.Axis;
2726
import org.bukkit.Bukkit;
2827
import org.bukkit.ChatColor;
@@ -992,7 +991,7 @@ public boolean isVanillaCommandWrapper(Comman 10000 d command) {
992991
}
993992

994993
@Override
995-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandListenerWrapper> node) {
994+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandListenerWrapper> node) {
996995
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
997996
}
998997

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_R2.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.function.ToIntFunction;
2323

2424
import com.mojang.brigadier.tree.CommandNode;
25-
import com.mojang.brigadier.tree.LiteralCommandNode;
2625
import org.bukkit.Axis;
2726
import org.bukkit.Bukkit;
2827
import org.bukkit.ChatColor;
@@ -978,7 +977,7 @@ public boolean isVanillaCommandWrapper(Command command) {
978977
}
979978

980979
@Override
981-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandListenerWrapper> node) {
980+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandListenerWrapper> node) {
982981
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
983982
}
984983

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.16.4/src/main/java/dev/jorel/commandapi/nms/NMS_1_16_4_R3.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import java.util.function.ToIntFunction;
4343

4444
import com.mojang.brigadier.tree.CommandNode;
45-
import com.mojang.brigadier.tree.LiteralCommandNode;
4645
import org.bukkit.Axis;
4746
import org.bukkit.Bukkit;
4847
import org.bukkit.ChatColor;
@@ -929,7 +928,7 @@ public boolean isVanillaCommandWrapper(Command command) {
929928
}
930929

931930
@Override
932-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandListenerWrapper> node) {
931+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandListenerWrapper> node) {
933932
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
934933
}
935934

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.17-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_17_Common.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import java.util.function.ToIntFunction;
3737

3838
import com.mojang.brigadier.tree.CommandNode;
39-
import com.mojang.brigadier.tree.LiteralCommandNode;
4039
import dev.jorel.commandapi.wrappers.*;
4140
import net.minecraft.advancements.critereon.MinMaxBounds;
4241
import net.minecraft.commands.arguments.*;
@@ -700,7 +699,7 @@ public boolean isVanillaCommandWrapper(Command command) {
700699
}
701700

702701
@Override
703-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandSourceStack> node) {
702+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandSourceStack> node) {
704703
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
705704
}
706705

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18.2/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R2.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import java.util.function.ToIntFunction;
4040

4141
import com.mojang.brigadier.tree.CommandNode;
42-
import com.mojang.brigadier.tree.LiteralCommandNode;
4342
import dev.jorel.commandapi.wrappers.*;
4443
import net.minecraft.advancements.critereon.MinMaxBounds;
4544
import net.minecraft.commands.arguments.*;
@@ -749,7 +748,7 @@ public boolean isVanillaCommandWrapper(Command command) {
749748
}
750749

751750
@Override
752-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandSourceStack> node) {
751+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandSourceStack> node) {
753752
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
754753
}
755754

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.18/src/main/java/dev/jorel/commandapi/nms/NMS_1_18_R1.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.function.ToIntFunction;
3939

4040
import com.mojang.brigadier.tree.CommandNode;
41-
import com.mojang.brigadier.tree.LiteralCommandNode;
4241
import dev.jorel.commandapi.wrappers.*;
4342
import net.minecraft.advancements.critereon.MinMaxBounds;
4443
import net.minecraft.commands.arguments.*;
@@ -694,7 +693,7 @@ public boolean isVanillaCommandWrapper(Command command) {
694693
}
695694

696695
@Override
697-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandSourceStack> node) {
696+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandSourceStack> node) {
698697
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
699698
}
700699

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.19-common/src/main/java/dev/jorel/commandapi/nms/NMS_1_19_Common.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.mojang.brigadier.suggestion.SuggestionProvider;
3333
import com.mojang.brigadier.suggestion.Suggestions;
3434
import com.mojang.brigadier.tree.CommandNode;
35-
import com.mojang.brigadier.tree.LiteralCommandNode;
3635
import com.mojang.logging.LogUtils;
3736
import dev.jorel.commandapi.CommandAPI;
3837
import dev.jorel.commandapi.CommandAPIHandler;
@@ -792,7 +791,7 @@ public final boolean isVanillaCommandWrapper(Command command) {
792791
}
793792

794793
@Override
795-
public Command wrapToVanillaCommandWrapper(LiteralCommandNode<CommandSourceStack> node) {
794+
public Command wrapToVanillaCommandWrapper(CommandNode<CommandSourceStack> node) {
796795
return new VanillaCommandWrapper(this.<MinecraftServer>getMinecraftServer().vanillaCommandDispatcher, node);
797796
}
798797

0 commit comments

Comments
 (0)
0