Create/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java
2023-10-22 11:03:28 +02:00

106 lines
3.6 KiB
Java

package com.simibubi.create.infrastructure.command;
import java.util.Collections;
import java.util.function.Predicate;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.loading.FMLLoader;
public class AllCommands {
public static final Predicate<CommandSourceStack> SOURCE_IS_PLAYER = cs -> cs.getEntity() instanceof Player;
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
LiteralCommandNode<CommandSourceStack> util = buildUtilityCommands();
LiteralArgumentBuilder<CommandSourceStack> root = Commands.literal("create")
.requires(cs -> cs.hasPermission(0))
// general purpose
.then(new ToggleDebugCommand().register())
.then(FabulousWarningCommand.register())
.then(OverlayConfigCommand.register())
.then(DumpRailwaysCommand.register())
.then(FixLightingCommand.register())
.then(DebugInfoCommand.register())
.then(HighlightCommand.register())
.then(KillTrainCommand.register())
.then(PassengerCommand.register())
.then(CouplingCommand.register())
.then(ConfigCommand.register())
.then(PonderCommand.register())
.then(CloneCommand.register())
.then(GlueCommand.register())
// utility
.then(util);
if (!FMLLoader.isProduction() && FMLLoader.getDist() == Dist.CLIENT)
root.then(CreateTestCommand.register());
LiteralCommandNode<CommandSourceStack> createRoot = dispatcher.register(root);
createRoot.addChild(buildRedirect("u", util));
CommandNode<CommandSourceStack> c = dispatcher.findNode(Collections.singleton("c"));
if (c != null)
return;
dispatcher.getRoot()
.addChild(buildRedirect("c", createRoot));
}
private static LiteralCommandNode<CommandSourceStack> buildUtilityCommands() {
return Commands.literal("util")
.then(ReplaceInCommandBlocksCommand.register())
.then(ClearBufferCacheCommand.register())
.then(CameraDistanceCommand.register())
.then(CameraAngleCommand.register())
.then(FlySpeedCommand.register())
//.then(DebugValueCommand.register())
//.then(KillTPSCommand.register())
.build();
}
/**
* *****
* https://github.com/VelocityPowered/Velocity/blob/8abc9c80a69158ebae0121fda78b55c865c0abad/proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java#L38
* *****
* <p>
* Returns a literal node that redirects its execution to
* the given destination node.
*
* @param alias the command alias
* @param destination the destination node
*
* @return the built node
*/
public static LiteralCommandNode<CommandSourceStack> buildRedirect(final String alias, final LiteralCommandNode<CommandSourceStack> destination) {
// Redirects only work for nodes with children, but break the top argument-less command.
// Manually adding the root command after setting the redirect doesn't fix it.
// See https://github.com/Mojang/brigadier/issues/46). Manually clone the node instead.
LiteralArgumentBuilder<CommandSourceStack> builder = LiteralArgumentBuilder
.<CommandSourceStack>literal(alias)
.requires(destination.getRequirement())
.forward(destination.getRedirect(), destination.getRedirectModifier(), destination.isFork())
.executes(destination.getCommand());
for (CommandNode<CommandSourceStack> child : destination.getChildren()) {
builder.then(child);
}
return builder.build();
}
}