diff --git a/src/main/java/mc/duzo/timeless/commands/argument/SuitArgumentType.java b/src/main/java/mc/duzo/timeless/commands/argument/SuitArgumentType.java new file mode 100644 index 0000000..c88ec22 --- /dev/null +++ b/src/main/java/mc/duzo/timeless/commands/argument/SuitArgumentType.java @@ -0,0 +1,51 @@ +package mc.duzo.timeless.commands.argument; + +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.CompletableFuture; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; + +import net.minecraft.command.CommandSource; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import mc.duzo.timeless.suit.Suit; +import mc.duzo.timeless.suit.SuitRegistry; + +public class SuitArgumentType implements ArgumentType { + private static final Collection EXAMPLES = Arrays.asList("foo", "foo:bar", "012"); + + public static SuitArgumentType suit() { + return new SuitArgumentType(); + } + + public static Suit getSuit(CommandContext context, String name) { + return context.getArgument(name, Suit.class); + } + + public Suit parse(StringReader stringReader) throws CommandSyntaxException { + Identifier id = Identifier.fromCommandInput(stringReader); + Suit found = SuitRegistry.REGISTRY.get(id); + + if (found == null) throw new SimpleCommandExceptionType(Text.literal("Suit not found in registry")).create(); + + return found; + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return CommandSource.suggestMatching(SuitRegistry.REGISTRY.stream().map(Suit::id).map(Identifier::toString), builder); + } + + public Collection getExamples() { + return EXAMPLES; + } +} diff --git a/src/main/java/mc/duzo/timeless/commands/argument/TimelessArgumentRegister.java b/src/main/java/mc/duzo/timeless/commands/argument/TimelessArgumentRegister.java new file mode 100644 index 0000000..5afaf10 --- /dev/null +++ b/src/main/java/mc/duzo/timeless/commands/argument/TimelessArgumentRegister.java @@ -0,0 +1,21 @@ +package mc.duzo.timeless.commands.argument; + +import java.util.function.Supplier; + +import com.mojang.brigadier.arguments.ArgumentType; +import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; + +import net.minecraft.command.argument.serialize.ConstantArgumentSerializer; +import net.minecraft.util.Identifier; + +import mc.duzo.timeless.Timeless; + +public class TimelessArgumentRegister { + public static void register() { + register("suit", SuitArgumentType.class, SuitArgumentType::suit); + } + + private static > void register(String name, Class t, Supplier supplier) { + ArgumentTypeRegistry.registerArgumentType(new Identifier(Timeless.MOD_ID, name), t, ConstantArgumentSerializer.of(supplier)); + } +} diff --git a/src/main/java/mc/duzo/timeless/commands/command/ApplySuitCommand.java b/src/main/java/mc/duzo/timeless/commands/command/ApplySuitCommand.java new file mode 100644 index 0000000..61fc779 --- /dev/null +++ b/src/main/java/mc/duzo/timeless/commands/command/ApplySuitCommand.java @@ -0,0 +1,36 @@ +package mc.duzo.timeless.commands.command; + +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.literal; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; + +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; + +import mc.duzo.timeless.Timeless; +import mc.duzo.timeless.commands.argument.SuitArgumentType; +import mc.duzo.timeless.suit.Suit; +public class ApplySuitCommand { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(literal(Timeless.MOD_ID) + .then(literal("suit").requires(source -> source.hasPermissionLevel(2)) + .then(literal("wear") + .then(argument("suit", SuitArgumentType.suit()) + .executes(ApplySuitCommand::runCommand))) + )); + } + + private static int runCommand(CommandContext context) { + ServerPlayerEntity player = context.getSource().getPlayer(); + + if (player == null) return 0; + + Suit suit = SuitArgumentType.getSuit(context, "suit"); + suit.getSet().wear(player); + + return Command.SINGLE_SUCCESS; + } +} diff --git a/src/main/java/mc/duzo/timeless/commands/command/TimelessCommands.java b/src/main/java/mc/duzo/timeless/commands/command/TimelessCommands.java new file mode 100644 index 0000000..570748a --- /dev/null +++ b/src/main/java/mc/duzo/timeless/commands/command/TimelessCommands.java @@ -0,0 +1,19 @@ +package mc.duzo.timeless.commands.command; + +import com.mojang.brigadier.CommandDispatcher; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; + +import net.minecraft.server.command.ServerCommandSource; + +import mc.duzo.timeless.commands.argument.TimelessArgumentRegister; + +public class TimelessCommands { + public static void init() { + TimelessArgumentRegister.register(); + CommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess, environment) -> registerCommands(dispatcher))); + } + + private static void registerCommands(CommandDispatcher dispatcher) { + ApplySuitCommand.register(dispatcher); + } +} diff --git a/src/main/java/mc/duzo/timeless/registry/Register.java b/src/main/java/mc/duzo/timeless/registry/Register.java index 63160c4..f504b56 100644 --- a/src/main/java/mc/duzo/timeless/registry/Register.java +++ b/src/main/java/mc/duzo/timeless/registry/Register.java @@ -23,6 +23,7 @@ import net.minecraft.util.Identifier; import mc.duzo.timeless.Timeless; +import mc.duzo.timeless.commands.command.TimelessCommands; import mc.duzo.timeless.power.PowerRegistry; import mc.duzo.timeless.suit.SuitRegistry; import mc.duzo.timeless.suit.client.animation.SuitAnimationTracker; @@ -106,6 +107,7 @@ public static void init() { Sounds.init(); Trackers.init(); Entities.init(); + TimelessCommands.init(); } public static T register(Registry registry, String name, T entry) {