Skip to content

Commit

Permalink
Clean up logic for unregistering and fix when server is running
Browse files Browse the repository at this point in the history
  • Loading branch information
willkroboth committed Jul 26, 2023
1 parent e8fb8d0 commit f0643d4
Show file tree
Hide file tree
Showing 19 changed files with 105 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,8 @@ void updateHelpForCommands(List<RegisteredCommand> commands) {
}
}

addToHelpMap(helpTopicsToAdd);
// We have to use helpTopics.put (instead of .addTopic) because we're overwriting an existing help topic, not adding a new help topic
getHelpMap().putAll(helpTopicsToAdd);
}

@Override
Expand Down Expand Up @@ -474,43 +475,59 @@ public LiteralCommandNode<Source> registerCommandNode(LiteralArgumentBuilder<Sou

@Override
public void unregister(String commandName, boolean force) {
if (CommandAPI.getConfiguration().hasVerboseOutput()) {
CommandAPI.logInfo("Unregistering command /" + commandName);
}

// Get the child nodes from the loaded dispatcher class
Map<String, CommandNode<?>> children = commandNodeChildren.get(getBrigadierDispatcher().getRoot());
CommandAPI.logInfo("Unregistering command /" + commandName);

if (force) {
// Remove them by force
for (String key : new HashSet<>(children.keySet())) {
if (key.contains(":") && key.split(":")[1].equalsIgnoreCase(commandName)) {
children.remove(key);
}
}
}
// Remove nodes from the Brigadier dispatcher
RootCommandNode<Source> brigRoot = getBrigadierDispatcher().getRoot();
commandNodeChildren.get(brigRoot).remove(commandName);
commandNodeLiterals.get(brigRoot).remove(commandName);
// We really only expect commands to be represented as literals, but it is technically possible
// to put an ArgumentCommandNode in here, so we'll check
commandNodeArguments.get(brigRoot).remove(commandName);

// Otherwise, just remove them normally
children.remove(commandName);
commandNodeLiterals.get(getBrigadierDispatcher().getRoot()).remove(commandName);
commandNodeArguments.get(getBrigadierDispatcher().getRoot()).remove(commandName);

if(!CommandAPI.canRegister()) {
if (!CommandAPI.canRegister() || force) {
// Bukkit is done with normal command stuff, so we have to modify their CommandMap ourselves
// If we're forcing, we'll also go here to make sure commands are really gone
Map<String, Command> knownCommands = getKnownCommands();

knownCommands.remove(commandName);
if (force) removeCommandNamespace(knownCommands, commandName);

// Remove commands from the resources dispatcher
RootCommandNode<Source> resourcesRoot = getResourcesDispatcher().getRoot();
Map<String, CommandNode<?>> children = commandNodeChildren.get(resourcesRoot);
Map<String, CommandNode<?>> literals = commandNodeLiterals.get(resourcesRoot);
Map<String, CommandNode<?>> arguments = commandNodeArguments.get(resourcesRoot);

children.remove(commandName);
literals.remove(commandName);
arguments.remove(commandName);

// Since the commands in here are copied from Bukkit's map, there may be namespaced versions of the command, which we should remove
if (force) {
for (String key : new HashSet<>(knownCommands.keySet())) {
if (key.contains(":") && key.split(":")[1].equalsIgnoreCase(commandName)) {
knownCommands.remove(key);
}
removeCommandNamespace(children, commandName);
removeCommandNamespace(literals, commandName);
removeCommandNamespace(arguments, commandName);
}

if (!CommandAPI.canRegister()) {
// If the server actually is running (not just force unregistering), we should also update help and notify players
getHelpMap().remove("/" + commandName);

for (Player p : Bukkit.getOnlinePlayers()) {
resendPackets(p);
}
}
}
}

private void removeCommandNamespace(Map<String, ?> map, String commandName) {
for(String key : new HashSet<>(map.keySet())) {
if(key.contains(":") && key.split(":")[1].equalsIgnoreCase(commandName)) {
map.remove(key);
}
}
}

private Map<String, Command> getKnownCommands() {
return commandMapKnownCommands.get((SimpleCommandMap) paper.getCommandMap());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ String getScoreHolderSingle(CommandContext<CommandListenerWrapper> cmdCtx, Strin

HelpTopic generateHelpTopic(String commandName, String shortDescription, String fullDescription, String permission);

void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd);
Map<String, HelpTopic> getHelpMap();

Message generateMessageFromJson(String json);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -387,10 +387,8 @@ public ArgumentType<?> _ArgumentVec3() {
}

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,8 @@ public ArgumentType<?> _ArgumentVec3() {
}

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -404,10 +404,8 @@ public ArgumentType<?> _ArgumentVec3() {
}

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,10 +354,8 @@ public final ArgumentType<?> _ArgumentScoreholder(ArgumentSubType subType) {
public ArgumentType<?> _ArgumentVec3() { return ArgumentVec3.a(); }

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import java.util.function.ToIntFunction;

import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.jorel.commandapi.preprocessor.Differs;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
Expand Down Expand Up @@ -241,10 +240,8 @@ public ArgumentType<?> _ArgumentSyntheticBiome() {
}

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,8 @@ public ArgumentType<?> _ArgumentSyntheticBiome() {
}

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,10 +244,8 @@ public ArgumentType<?> _ArgumentSyntheticBiome() {
}

@Override
public void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,10 +314,10 @@ public final ArgumentType<?> _ArgumentSyntheticBiome() {
}

@Override
public final void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
public final Map<String, HelpTopic> getHelpMap() {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,10 +225,8 @@ public final ArgumentType<?> _ArgumentSyntheticBiome() {
}

@Override
public final void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public final Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,8 @@ public final ArgumentType<?> _ArgumentSyntheticBiome() {
}

@Override
public final void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd) {
// We have to use VarHandles to use helpTopics.put (instead of .addTopic)
// because we're updating an existing help topic, not adding a new help topic
helpMapTopics.get((SimpleHelpMap) Bukkit.getServer().getHelpMap()).putAll(helpTopicsToAdd);
public final Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((SimpleHelpMap) Bukkit.getHelpMap());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ public final ArgumentType<?> _ArgumentVec3() {

@Override
@Unimplemented(because = REQUIRES_CRAFTBUKKIT, classNamed = "SimpleHelpMap")
public abstract void addToHelpMap(Map<String, HelpTopic> helpTopicsToAdd);
public abstract Map<String, HelpTopic> getHelpMap();

@Override
@Unimplemented(because = VERSION_SPECIFIC_IMPLEMENTATION)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import be.seeseemelk.mockbukkit.help.HelpMapMock;
import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.jorel.commandapi.SafeVarHandle;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
Expand Down Expand Up @@ -91,6 +93,8 @@
import net.minecraft.server.v1_16_R3.WorldServer;

public class MockNMS extends Enums {
private static final SafeVarHandle<HelpMapMock, Map<String, HelpTopic>> helpMapTopics =
SafeVarHandle.ofOrNull(HelpMapMock.class, "topics", "topics", Map.class);

static {
CodeSource src = PotionEffectType.class.getProtectionDomain().getCodeSource();
Expand Down Expand Up @@ -589,4 +593,8 @@ public HelpTopic generateHelpTopic(String commandName, String shortDescription,
return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission);
}

@Override
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((HelpMapMock) Bukkit.getHelpMap());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import be.seeseemelk.mockbukkit.help.HelpMapMock;
import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.jorel.commandapi.SafeVarHandle;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
Expand Down Expand Up @@ -92,6 +94,8 @@
import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType;

public class MockNMS extends Enums {
private static final SafeVarHandle<HelpMapMock, Map<String, HelpTopic>> helpMapTopics =
SafeVarHandle.ofOrNull(HelpMapMock.class, "topics", "topics", Map.class);

static ServerAdvancementManager advancementDataWorld = new ServerAdvancementManager(null);

Expand Down Expand Up @@ -579,4 +583,8 @@ public HelpTopic generateHelpTopic(String commandName, String shortDescription,
return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission);
}

@Override
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((HelpMapMock) Bukkit.getHelpMap());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import be.seeseemelk.mockbukkit.help.HelpMapMock;
import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.jorel.commandapi.SafeVarHandle;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
Expand Down Expand Up @@ -97,6 +99,8 @@
import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType;

public class MockNMS extends Enums {
private static final SafeVarHandle<HelpMapMock, Map<String, HelpTopic>> helpMapTopics =
SafeVarHandle.ofOrNull(HelpMapMock.class, "topics", "topics", Map.class);

static {
CodeSource src = PotionEffectType.class.getProtectionDomain().getCodeSource();
Expand Down Expand Up @@ -615,4 +619,8 @@ public HelpTopic generateHelpTopic(String commandName, String shortDescription,
return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission);
}

@Override
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((HelpMapMock) Bukkit.getHelpMap());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import be.seeseemelk.mockbukkit.help.HelpMapMock;
import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.jorel.commandapi.SafeVarHandle;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
Expand Down Expand Up @@ -95,6 +97,8 @@
import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType;

public class MockNMS extends Enums {
private static final SafeVarHandle<HelpMapMock, Map<String, HelpTopic>> helpMapTopics =
SafeVarHandle.ofOrNull(HelpMapMock.class, "topics", "topics", Map.class);

static {
CodeSource src = PotionEffectType.class.getProtectionDomain().getCodeSource();
Expand Down Expand Up @@ -796,4 +800,8 @@ public HelpTopic generateHelpTopic(String commandName, String shortDescription,
return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission);
}

@Override
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((HelpMapMock) Bukkit.getHelpMap());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import be.seeseemelk.mockbukkit.help.HelpMapMock;
import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.jorel.commandapi.SafeVarHandle;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Location;
Expand Down Expand Up @@ -96,6 +98,8 @@
import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType;

public class MockNMS extends Enums {
private static final SafeVarHandle<HelpMapMock, Map<String, HelpTopic>> helpMapTopics =
SafeVarHandle.ofOrNull(HelpMapMock.class, "topics", "topics", Map.class);

static {
CodeSource src = PotionEffectType.class.getProtectionDomain().getCodeSource();
Expand Down Expand Up @@ -807,4 +811,8 @@ public HelpTopic generateHelpTopic(String commandName, String shortDescription,
return baseNMS.generateHelpTopic(commandName, shortDescription, fullDescription, permission);
}

@Override
public Map<String, HelpTopic> getHelpMap() {
return helpMapTopics.get((HelpMapMock) Bukkit.getHelpMap());
}
}
Loading

0 comments on commit f0643d4

Please sign in to comment.