Skip to content

Commit feb3188

Browse files
DerEchtePilzwillkroboth
authored andcommitted
Fix minecraft:reload deleting commands on Paper-1.20.6-65 and beyond
1 parent 65a95f7 commit feb3188

File tree

6 files changed

+42
-11
lines changed

6 files changed

+42
-11
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ private void checkDependencies() {
176176
commandRegistrationStrategy = createCommandRegistrationStrategy();
177177
}
178178

179+
protected CommandRegistrationStrategy<Source> getCommandRegistrationStrategy() {
180+
return commandRegistrationStrategy;
181+
}
182+
179183
@Override
180184
public void onEnable() {
181185
JavaPlugin plugin = config.getPlugin();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,6 @@ protected static boolean isThisTheCommandButNamespaced(String commandName, Strin
8282
public abstract LiteralCommandNode<Source> registerCommandNode(LiteralArgumentBuilder<Source> node, String namespace);
8383

8484
public abstract void unregister(String commandName, boolean unregisterNamespaces, boolean unregisterBukkit);
85+
86+
public abstract void preReloadDataPacks();
8587
}

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

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,31 @@
22

33
import com.mojang.brigadier.CommandDispatcher;
44
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
5+
import com.mojang.brigadier.tree.CommandNode;
56
import com.mojang.brigadier.tree.LiteralCommandNode;
67

8+
import java.util.ArrayList;
79
import java.util.List;
10+
import java.util.function.Supplier;
811

912
/**
10-
* Handles logic for registering commands after Paper build 65, where https://github.com/PaperMC/Paper/pull/8235
13+
* Handles logic for registering commands after Paper build 65, where <a href="https://github.com/PaperMC/Paper/pull/8235">https://github.com/PaperMC/Paper/pull/8235</a>
1114
* changed a bunch of the behind-the-scenes logic.
1215
*/
1316
public class PaperCommandRegistration<Source> extends CommandRegistrationStrategy<Source> {
1417
// References to necessary objects
15-
private final CommandDispatcher<Source> brigadierDispatcher;
18+
private final Supplier<CommandDispatcher<Source>> getBrigadierDispatcher;
1619

17-
public PaperCommandRegistration(CommandDispatcher<Source> brigadierDispatcher) {
18-
this.brigadierDispatcher = brigadierDispatcher;
20+
// Store registered commands nodes for eventual reloads
21+
private final List<LiteralCommandNode<Source>> registeredNodes = new ArrayList<>();
22+
23+
public PaperCommandRegistration(Supplier<CommandDispatcher<Source>> getBrigadierDispatcher) {
24+
this.getBrigadierDispatcher = getBrigadierDispatcher;
1925
}
2026

2127
@Override
2228
public CommandDispatcher<Source> getBrigadierDispatcher() {
23-
return brigadierDispatcher;
29+
return getBrigadierDispatcher.get();
2430
}
2531

2632
@Override
@@ -35,20 +41,32 @@ public void postCommandRegistration(RegisteredCommand registeredCommand, Literal
3541

3642
@Override
3743
public LiteralCommandNode<Source> registerCommandNode(LiteralArgumentBuilder<Source> node, String namespace) {
38-
LiteralCommandNode<Source> builtNode = brigadierDispatcher.register(node);
44+
LiteralCommandNode<Source> commandNode = getBrigadierDispatcher.get().register(node);
45+
LiteralCommandNode<Source> namespacedCommandNode = CommandAPIHandler.getInstance().namespaceNode(commandNode, namespace);
46+
47+
// Add to registered command nodes
48+
registeredNodes.add(commandNode);
49+
registeredNodes.add(namespacedCommandNode);
3950

4051
// Namespace is not empty on Bukkit forks
41-
brigadierDispatcher.getRoot().addChild(CommandAPIHandler.getInstance().namespaceNode(builtNode, namespace));
52+
getBrigadierDispatcher.get().getRoot().addChild(namespacedCommandNode);
4253

43-
return builtNode;
54+
return commandNode;
4455
}
4556

4657
@Override
4758
public void unregister(String commandName, boolean unregisterNamespaces, boolean unregisterBukkit) {
4859
// Remove nodes from the dispatcher
49-
removeBrigadierCommands(brigadierDispatcher, commandName, unregisterNamespaces, c -> true);
60+
removeBrigadierCommands(getBrigadierDispatcher.get(), commandName, unregisterNamespaces, c -> true);
5061

5162
// Update the dispatcher file
5263
CommandAPIHandler.getInstance().writeDispatcherToFile();
5364
}
65+
66+
@Override
67+
public void preReloadDataPacks() {
68+
for (LiteralCommandNode<Source> commandNode : registeredNodes) {
69+
getBrigadierDispatcher.get().getRoot().addChild(commandNode);
70+
}
71+
}
5472
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ public void registerReloadHandler(Plugin plugin) {
5858

5959
@EventHandler
6060
public void onServerReloadResources(ServerResourcesReloadedEvent event) {
61+
// This event is called after Paper is done with everything command related
62+
// which means we can put commands back
63+
CommandAPIBukkit.get().getCommandRegistrationStrategy().preReloadDataPacks();
6164
CommandAPI.logNormal("/minecraft:reload detected. Reloading CommandAPI commands!");
6265
nmsInstance.reloadDataPacks();
6366
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ private void fixPermissions() {
134134

135135
@Override
136136
public void postCommandRegistration(RegisteredCommand registeredCommand, LiteralCommandNode<Source> resultantNode, List<LiteralCommandNode<Source>> aliasNodes) {
137-
138137
if (!CommandAPI.canRegister()) {
139138
// Usually, when registering commands during server startup, we can just put our commands into the
140139
// `net.minecraft.server.MinecraftServer#vanillaCommandDispatcher` and leave it. As the server finishes setup,
@@ -297,4 +296,9 @@ public void unregister(String commandName, boolean unregisterNamespaces, boolean
297296
c -> !unregisterBukkit ^ commandAPIBukkit.isBukkitCommandWrapper(c));
298297
}
299298
}
299+
300+
@Override
301+
public void preReloadDataPacks() {
302+
// Nothing to do
303+
}
300304
}

commandapi-platforms/commandapi-bukkit/commandapi-bukkit-nms/commandapi-bukkit-1.20.5/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ public CommandRegistrationStrategy<CommandSourceStack> createCommandRegistration
905905
() -> this.<MinecraftServer>getMinecraftServer().getCommands().getDispatcher()
906906
);
907907
} else {
908-
return new PaperCommandRegistration<>(this.<MinecraftServer>getMinecraftServer().getCommands().getDispatcher());
908+
return new PaperCommandRegistration<>(() -> this.<MinecraftServer>getMinecraftServer().getCommands().getDispatcher());
909909
}
910910
}
911911

0 commit comments

Comments
 (0)