fabric: Add registration environment meta

This commit is contained in:
Zach Levis 2021-01-01 15:14:34 -08:00 committed by Jason
parent dc90551168
commit 79006ac40f
2 changed files with 25 additions and 1 deletions

View file

@ -33,6 +33,7 @@ import cloud.commandframework.execution.AsynchronousCommandExecutionCoordinator;
import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.execution.CommandExecutionCoordinator;
import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.CommandMeta;
import cloud.commandframework.meta.SimpleCommandMeta; import cloud.commandframework.meta.SimpleCommandMeta;
import net.minecraft.server.command.CommandManager.RegistrationEnvironment;
import net.minecraft.server.command.CommandOutput; import net.minecraft.server.command.CommandOutput;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
@ -43,6 +44,17 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.function.Function; import java.util.function.Function;
public class FabricCommandManager<C> extends CommandManager<C> implements BrigadierManagerHolder<C> { public class FabricCommandManager<C> extends CommandManager<C> implements BrigadierManagerHolder<C> {
/**
* A meta attribute specifying which environments a command should be registered in.
*
* <p>The default value is {@link RegistrationEnvironment#ALL}.</p>
*/
public static final CommandMeta.Key<RegistrationEnvironment> META_REGISTRATION_ENVIRONMENT = CommandMeta.Key.of(
RegistrationEnvironment.class,
"cloud:registration-environment"
);
private final Function<ServerCommandSource, C> commandSourceMapper; private final Function<ServerCommandSource, C> commandSourceMapper;
private final Function<C, ServerCommandSource> backwardsCommandSourceMapper; private final Function<C, ServerCommandSource> backwardsCommandSourceMapper;
private final CloudBrigadierManager<C, ServerCommandSource> brigadierManager; private final CloudBrigadierManager<C, ServerCommandSource> brigadierManager;
@ -100,7 +112,7 @@ public class FabricCommandManager<C> extends CommandManager<C> implements Brigad
null, null,
null null
)), )),
this.getCaptionRegistry() this
)); ));
((FabricCommandRegistrationHandler<C>) this.getCommandRegistrationHandler()).initialize(this); ((FabricCommandRegistrationHandler<C>) this.getCommandRegistrationHandler()).initialize(this);
@ -149,6 +161,7 @@ public class FabricCommandManager<C> extends CommandManager<C> implements Brigad
return this.brigadierManager; return this.brigadierManager;
} }
/* transition state to prevent further registration */
final void registrationCalled() { final void registrationCalled() {
this.transitionOrThrow(RegistrationState.REGISTERING, RegistrationState.AFTER_REGISTRATION); this.transitionOrThrow(RegistrationState.REGISTERING, RegistrationState.AFTER_REGISTRATION);
} }

View file

@ -32,6 +32,7 @@ import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.RootCommandNode; import com.mojang.brigadier.tree.RootCommandNode;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.CommandManager.RegistrationEnvironment;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -65,6 +66,16 @@ public final class FabricCommandRegistrationHandler<C> implements CommandRegistr
private void registerAllCommands(final CommandDispatcher<ServerCommandSource> dispatcher, final boolean isDedicated) { private void registerAllCommands(final CommandDispatcher<ServerCommandSource> dispatcher, final boolean isDedicated) {
this.commandManager.registrationCalled(); this.commandManager.registrationCalled();
for (final Command<C> command : this.registeredCommands) { for (final Command<C> command : this.registeredCommands) {
/* Only register commands in the declared environment */
final RegistrationEnvironment env = command.getCommandMeta().getOrDefault(
FabricCommandManager.META_REGISTRATION_ENVIRONMENT,
RegistrationEnvironment.ALL
);
if ((env == RegistrationEnvironment.INTEGRATED && isDedicated)
|| (env == RegistrationEnvironment.DEDICATED && !isDedicated)) {
continue;
}
this.registerCommand(dispatcher.getRoot(), command); this.registerCommand(dispatcher.getRoot(), command);
} }
} }