From 4f659d900f52e7d5b3ed73bfb757cebfacf479c1 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 16 Jan 2024 19:21:10 -0300 Subject: [PATCH] Game rule command now tells you when the value is wrong --- .../GenericGameRuleArgumentType.java | 32 +++++++++++++++++++ .../content/commands/GameRuleCommand.java | 5 +-- 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/pedroricardo/commander/content/arguments/GenericGameRuleArgumentType.java diff --git a/src/main/java/net/pedroricardo/commander/content/arguments/GenericGameRuleArgumentType.java b/src/main/java/net/pedroricardo/commander/content/arguments/GenericGameRuleArgumentType.java new file mode 100644 index 0000000..dca06a6 --- /dev/null +++ b/src/main/java/net/pedroricardo/commander/content/arguments/GenericGameRuleArgumentType.java @@ -0,0 +1,32 @@ +package net.pedroricardo.commander.content.arguments; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.core.data.gamerule.GameRule; +import net.pedroricardo.commander.content.exceptions.CommanderExceptions; + +public class GenericGameRuleArgumentType implements ArgumentType { + private final GameRule gameRule; + + private GenericGameRuleArgumentType(GameRule gameRule) { + this.gameRule = gameRule; + } + + public static GenericGameRuleArgumentType gameRule(GameRule gameRule) { + return new GenericGameRuleArgumentType(gameRule); + } + + @Override + public Object parse(StringReader reader) throws CommandSyntaxException { + StringBuilder read = new StringBuilder(); + Object value = null; + while (reader.canRead() && (StringReader.isQuotedStringStart(reader.peek()) || StringReader.isAllowedInUnquotedString(reader.peek())) && value == null) { + read.append(reader.readString()); + value = this.gameRule.parseFromString(read.toString()); + } + System.out.println(read); + if (value != null) return value; + throw CommanderExceptions.invalidGameRuleValue().create(); + } +} diff --git a/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java b/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java index 6fae558..8bff7ad 100644 --- a/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java +++ b/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java @@ -11,6 +11,7 @@ import net.minecraft.core.data.gamerule.GameRuleBoolean; import net.minecraft.core.data.registry.Registries; import net.pedroricardo.commander.content.CommanderCommandSource; +import net.pedroricardo.commander.content.arguments.GenericGameRuleArgumentType; import net.pedroricardo.commander.content.exceptions.CommanderExceptions; @SuppressWarnings("unchecked") @@ -27,9 +28,9 @@ public static void register(CommandDispatcher dispatcher return Command.SINGLE_SUCCESS; }); } else { - gameRuleValueArgument = RequiredArgumentBuilder.argument("value", StringArgumentType.greedyString()) + gameRuleValueArgument = RequiredArgumentBuilder.argument("value", GenericGameRuleArgumentType.gameRule(gameRule)) .executes(c -> { - Object o = gameRule.parseFromString(StringArgumentType.getString(c, "value")); + Object o = c.getArgument("value", Object.class); if (o == null) throw CommanderExceptions.invalidGameRuleValue().create(); c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRule) gameRule, o); c.getSource().sendTranslatableMessage("commands.commander.gamerule.set", gameRule.getKey(), o);