Skip to content

Commit b81c42c

Browse files
committed
Permit mods registering commands with a namespace
1 parent e8f84c8 commit b81c42c

File tree

6 files changed

+34
-8
lines changed

6 files changed

+34
-8
lines changed

forge/src/mixins/java/org/spongepowered/forge/mixin/core/commands/CommandsMixin_Forge.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040
import org.spongepowered.api.service.permission.Subject;
4141
import org.spongepowered.asm.mixin.Mixin;
4242
import org.spongepowered.asm.mixin.injection.At;
43+
import org.spongepowered.asm.mixin.injection.Inject;
4344
import org.spongepowered.asm.mixin.injection.Redirect;
45+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4446
import org.spongepowered.common.bridge.commands.CommandSourceStackBridge;
47+
import org.spongepowered.common.bridge.commands.CommandsBridge;
4548
import org.spongepowered.common.command.manager.SpongeCommandManager;
4649
import org.spongepowered.common.event.tracking.PhaseTracker;
4750

@@ -52,7 +55,7 @@
5255
import java.util.function.Function;
5356

5457
@Mixin(Commands.class)
55-
public abstract class CommandsMixin_Forge {
58+
public abstract class CommandsMixin_Forge implements CommandsBridge {
5659

5760
private WeakHashMap<ServerPlayer, Map<CommandNode<CommandSourceStack>, List<CommandNode<SharedSuggestionProvider>>>> impl$playerNodeCache;
5861
private SpongeCommandManager impl$commandManager;
@@ -98,4 +101,8 @@ public abstract class CommandsMixin_Forge {
98101
}
99102
}
100103

104+
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/event/ForgeEventFactory;onCommandRegister(Lcom/mojang/brigadier/CommandDispatcher;Lnet/minecraft/commands/Commands$CommandSelection;Lnet/minecraft/commands/CommandBuildContext;)V", unsafe = true))
105+
private void forge$tellDispatcherCommandsAreRegistered(final CallbackInfo ci) {
106+
this.bridge$endVanillaRegistration();
107+
}
101108
}

neoforge/src/mixins/java/org/spongepowered/neoforge/mixin/core/commands/CommandsMixin_Neo.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040
import org.spongepowered.api.service.permission.Subject;
4141
import org.spongepowered.asm.mixin.Mixin;
4242
import org.spongepowered.asm.mixin.injection.At;
43+
import org.spongepowered.asm.mixin.injection.Inject;
4344
import org.spongepowered.asm.mixin.injection.Redirect;
45+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4446
import org.spongepowered.common.bridge.commands.CommandSourceStackBridge;
47+
import org.spongepowered.common.bridge.commands.CommandsBridge;
4548
import org.spongepowered.common.command.manager.SpongeCommandManager;
4649
import org.spongepowered.common.event.tracking.PhaseTracker;
4750

@@ -52,7 +55,7 @@
5255
import java.util.function.Function;
5356

5457
@Mixin(Commands.class)
55-
public abstract class CommandsMixin_Neo {
58+
public abstract class CommandsMixin_Neo implements CommandsBridge {
5659

5760
private WeakHashMap<ServerPlayer, Map<CommandNode<CommandSourceStack>, List<CommandNode<SharedSuggestionProvider>>>> impl$playerNodeCache;
5861
private SpongeCommandManager impl$commandManager;
@@ -97,4 +100,8 @@ public abstract class CommandsMixin_Neo {
97100
}
98101
}
99102

103+
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/event/EventHooks;onCommandRegister(Lcom/mojang/brigadier/CommandDispatcher;Lnet/minecraft/commands/Commands$CommandSelection;Lnet/minecraft/commands/CommandBuildContext;)V"))
104+
private void neo$tellDispatcherCommandsAreRegistered(final CallbackInfo ci) {
105+
this.bridge$endVanillaRegistration();
106+
}
100107
}

src/main/java/org/spongepowered/common/bridge/commands/CommandsBridge.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@
2929
public interface CommandsBridge {
3030

3131
SpongeCommandManager bridge$commandManager();
32+
33+
void bridge$endVanillaRegistration();
3234
}

src/main/java/org/spongepowered/common/command/registrar/BrigadierCommandRegistrar.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,12 @@ private String createCommandString(final String command, final String argument)
242242

243243
private LiteralCommandNode<CommandSourceStack> applyNamespace(final PluginContainer pluginContainer,
244244
final LiteralArgumentBuilder<CommandSourceStack> builder, final boolean isSpongeAware) {
245-
if (builder.getLiteral().contains(":") || builder.getLiteral().contains(" ")) {
245+
if (!isSpongeAware && builder.getLiteral().contains(":")) {
246+
if (builder.getLiteral().contains(" ")) {
247+
throw new IllegalArgumentException("The literal must not contain a space.");
248+
}
249+
return new SpongePermissionWrappedLiteralCommandNode(builder);
250+
} else if (isSpongeAware && (builder.getLiteral().contains(":") || builder.getLiteral().contains(" "))) {
246251
// nope
247252
throw new IllegalArgumentException("The literal must not contain a colon or a space.");
248253
}

src/mixins/java/org/spongepowered/common/mixin/core/commands/CommandsMixin.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,8 @@
4242
import org.spongepowered.asm.mixin.Mixin;
4343
import org.spongepowered.asm.mixin.Shadow;
4444
import org.spongepowered.asm.mixin.injection.At;
45-
import org.spongepowered.asm.mixin.injection.Inject;
4645
import org.spongepowered.asm.mixin.injection.Redirect;
4746
import org.spongepowered.asm.mixin.injection.Slice;
48-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4947
import org.spongepowered.common.bridge.commands.CommandsBridge;
5048
import org.spongepowered.common.bridge.commands.arguments.CompletionsArgumentTypeBridge;
5149
import org.spongepowered.common.command.brigadier.dispatcher.DelegatingCommandDispatcher;
@@ -108,8 +106,7 @@ public abstract class CommandsMixin implements CommandsBridge {
108106
AdvancementCommands.register(dispatcher);
109107
}
110108

111-
@Inject(method = "<init>", at = @At("RETURN"))
112-
private void impl$tellDispatcherCommandsAreRegistered(final CallbackInfo ci) {
109+
public void bridge$endVanillaRegistration() {
113110
if (this.impl$initFrame != null) {
114111
this.impl$initFrame.popCause();
115112
PhaseTracker.getInstance().popCauseFrame(this.impl$initFrame);

vanilla/src/mixins/java/org/spongepowered/vanilla/mixin/core/commands/CommandsMixin_Vanilla.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@
3636
import org.spongepowered.asm.mixin.Mixin;
3737
import org.spongepowered.asm.mixin.Shadow;
3838
import org.spongepowered.asm.mixin.injection.At;
39+
import org.spongepowered.asm.mixin.injection.Inject;
3940
import org.spongepowered.asm.mixin.injection.Redirect;
41+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4042
import org.spongepowered.common.bridge.commands.CommandSourceStackBridge;
43+
import org.spongepowered.common.bridge.commands.CommandsBridge;
4144
import org.spongepowered.common.command.manager.SpongeCommandManager;
4245
import org.spongepowered.common.event.tracking.PhaseTracker;
4346

@@ -47,7 +50,7 @@
4750
import java.util.WeakHashMap;
4851

4952
@Mixin(Commands.class)
50-
public abstract class CommandsMixin_Vanilla {
53+
public abstract class CommandsMixin_Vanilla implements CommandsBridge {
5154

5255
// @formatter:off
5356
@Shadow private void shadow$fillUsableCommands(final CommandNode<CommandSourceStack> rootCommandSource,
@@ -87,4 +90,9 @@ public abstract class CommandsMixin_Vanilla {
8790
}
8891
}
8992
}
93+
94+
@Inject(method = "<init>", at = @At("RETURN"))
95+
private void vanilla$tellDispatcherCommandsAreRegistered(final CallbackInfo ci) {
96+
this.bridge$endVanillaRegistration();
97+
}
9098
}

0 commit comments

Comments
 (0)