From 52f131358b52cfc2b1f85ef5bf466b5265f974d1 Mon Sep 17 00:00:00 2001 From: Irtimaled Date: Sun, 17 May 2020 18:12:06 -0700 Subject: [PATCH] Rework settings/config command --- .../bbor/client/commands/Arguments.java | 11 ++-- .../bbor/client/commands/CommandHelper.java | 16 ++++++ .../bbor/client/commands/ConfigCommand.java | 55 ++++++++++++++----- .../bbor/client/config/AbstractSetting.java | 21 ------- .../bbor/client/config/ConfigManager.java | 3 + .../bbor/client/config/Configuration.java | 2 +- .../irtimaled/bbor/client/config/Setting.java | 20 +++++-- 7 files changed, 81 insertions(+), 47 deletions(-) delete mode 100644 src/main/java/com/irtimaled/bbor/client/config/AbstractSetting.java diff --git a/src/main/java/com/irtimaled/bbor/client/commands/Arguments.java b/src/main/java/com/irtimaled/bbor/client/commands/Arguments.java index 72c3ca1..5a71d2f 100644 --- a/src/main/java/com/irtimaled/bbor/client/commands/Arguments.java +++ b/src/main/java/com/irtimaled/bbor/client/commands/Arguments.java @@ -36,7 +36,7 @@ public class Arguments { } public static StringArgumentType string() { - return StringArgumentType.greedyString(); + return StringArgumentType.string(); } public static BoolArgumentType bool() { @@ -67,11 +67,10 @@ public class Arguments { return getArgumentValueOrDefault(context, name, BoolArgumentType::getBool, () -> false); } - - public static T getArgumentValueOrDefault(CommandContext context, - String name, - ArgumentFetcher getValue, - Supplier defaultValue) throws CommandSyntaxException { + private static T getArgumentValueOrDefault(CommandContext context, + String name, + ArgumentFetcher getValue, + Supplier defaultValue) throws CommandSyntaxException { try { return getValue.get(context, name); } catch (IllegalArgumentException exception) { diff --git a/src/main/java/com/irtimaled/bbor/client/commands/CommandHelper.java b/src/main/java/com/irtimaled/bbor/client/commands/CommandHelper.java index cdb7260..3391860 100644 --- a/src/main/java/com/irtimaled/bbor/client/commands/CommandHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/commands/CommandHelper.java @@ -1,6 +1,8 @@ package com.irtimaled.bbor.client.commands; import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.tree.CommandNode; +import com.mojang.brigadier.tree.LiteralCommandNode; import net.minecraft.command.CommandSource; import net.minecraft.util.text.TextComponentTranslation; @@ -8,4 +10,18 @@ class CommandHelper { static void feedback(CommandContext context, String format, Object... values) { context.getSource().sendFeedback(new TextComponentTranslation(format, values), false); } + + static boolean lastNodeIsLiteral(CommandContext context, String literal) { + CommandNode lastNode = getLastNode(context); + if (lastNode instanceof LiteralCommandNode) { + LiteralCommandNode literalCommandNode = (LiteralCommandNode) lastNode; + return literalCommandNode.getLiteral().equals(literal); + } + return false; + } + + private static CommandNode getLastNode(CommandContext context) { + CommandNode[] nodes = context.getNodes().keySet().toArray(new CommandNode[0]); + return nodes[nodes.length-1]; + } } diff --git a/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java b/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java index a371f17..00ff4ea 100644 --- a/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java +++ b/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java @@ -3,7 +3,9 @@ package com.irtimaled.bbor.client.commands; import com.irtimaled.bbor.client.config.ConfigManager; import com.irtimaled.bbor.client.config.Setting; import com.irtimaled.bbor.client.gui.SettingsScreen; +import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; @@ -17,11 +19,18 @@ public class ConfigCommand { private static final String SAVE = "save"; private static final String SHOW_GUI = "showGui"; private static final String VALUE = "value"; + private static final String RESET = "reset"; public static void register(CommandDispatcher commandDispatcher) { LiteralArgumentBuilder command = Commands.literal(COMMAND) .then(buildCommands(GET, ConfigCommand::getCommandForSetting)) .then(buildCommands(ArgumentNames.SET, ConfigCommand::setCommandForSetting)) + .then(buildCommands(RESET, ConfigCommand::resetCommandForSetting) + .executes(context1 -> { + ConfigManager.getSettings().forEach(Setting::reset); + ConfigManager.saveConfig(); + return 0; + })) .then(Commands.literal(SAVE) .executes(context -> { ConfigManager.saveConfig(); @@ -36,11 +45,19 @@ public class ConfigCommand { commandDispatcher.register(command); } + private static LiteralArgumentBuilder resetCommandForSetting(Setting setting) { + return Commands.literal(setting.getName()) + .executes(context -> { + setting.reset(); + ConfigManager.saveConfig(); + return 0; + }); + } + private interface CommandBuilder extends Function, LiteralArgumentBuilder> { } - private static LiteralArgumentBuilder buildCommands(String commandName, - CommandBuilder commandBuilder) { + private static LiteralArgumentBuilder buildCommands(String commandName, CommandBuilder commandBuilder) { LiteralArgumentBuilder command = Commands.literal(commandName); for (Setting setting : ConfigManager.getSettings()) { command.then(commandBuilder.apply(setting)); @@ -60,20 +77,30 @@ public class ConfigCommand { LiteralArgumentBuilder command = Commands.literal(setting.getName()); switch (setting.getType()) { case 'B': - return command.then(Commands.argument(VALUE, Arguments.bool()) - .executes(context -> { - boolean value = Arguments.getBool(context, VALUE); - ((Setting) setting).set(value); - return 0; - })); + buildSetSettingCommand(command, (Setting) setting, Arguments.bool(), Boolean.class); + break; case 'I': - return command.then(Commands.argument(VALUE, Arguments.integer()) - .executes(context -> { - int value = Arguments.getInteger(context, VALUE); - ((Setting) setting).set(value); - return 0; - })); + buildSetSettingCommand(command, (Setting) setting, Arguments.integer(), Integer.class); + break; + case 'S': + buildSetSettingCommand(command, (Setting) setting, Arguments.string(), String.class); + break; } return command; } + + private static void buildSetSettingCommand(LiteralArgumentBuilder command, + Setting setting, ArgumentType argument, Class clazz) { + Command setSettingCommand = context -> { + setting.set(context.getArgument(VALUE, clazz)); + if (CommandHelper.lastNodeIsLiteral(context, SAVE)) { + ConfigManager.saveConfig(); + } + return 0; + }; + command.then(Commands.argument(VALUE, argument) + .executes(setSettingCommand) + .then(Commands.literal(SAVE) + .executes(setSettingCommand))); + } } diff --git a/src/main/java/com/irtimaled/bbor/client/config/AbstractSetting.java b/src/main/java/com/irtimaled/bbor/client/config/AbstractSetting.java deleted file mode 100644 index 0d64876..0000000 --- a/src/main/java/com/irtimaled/bbor/client/config/AbstractSetting.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.irtimaled.bbor.client.config; - -public abstract class AbstractSetting { - String comment; - String category; - String name; - - private final char type; - - AbstractSetting(char type) { - this.type = type; - } - - public char getType() { - return type; - } - - public String getName() { return name; } - - abstract Object getValue(); -} diff --git a/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java b/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java index 5742a3a..bb0622a 100644 --- a/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java +++ b/src/main/java/com/irtimaled/bbor/client/config/ConfigManager.java @@ -146,6 +146,9 @@ public class ConfigManager { Setting setting = config.get(category, settingName, defaultValue); setting.category = category; setting.name = settingName; + setting.defaultValue = defaultValue; + if (setting.get() == null) + setting.reset(); setting.comment = comment + " (default: " + defaultValue.toString() + ")"; settings.add(setting); return setting; diff --git a/src/main/java/com/irtimaled/bbor/client/config/Configuration.java b/src/main/java/com/irtimaled/bbor/client/config/Configuration.java index 65f9a0d..432a076 100644 --- a/src/main/java/com/irtimaled/bbor/client/config/Configuration.java +++ b/src/main/java/com/irtimaled/bbor/client/config/Configuration.java @@ -30,7 +30,7 @@ class Configuration { first = false; Setting setting = settings.get(settingName); writer.write(String.format(" # %s\n", setting.comment)); - writer.write(String.format(" %s:%s=%s\n", setting.getType(), settingName, setting.getValue())); + writer.write(String.format(" %s:%s=%s\n", setting.getType(), settingName, setting.get())); } writer.write("}\n"); } diff --git a/src/main/java/com/irtimaled/bbor/client/config/Setting.java b/src/main/java/com/irtimaled/bbor/client/config/Setting.java index f07f5fb..1c3a223 100644 --- a/src/main/java/com/irtimaled/bbor/client/config/Setting.java +++ b/src/main/java/com/irtimaled/bbor/client/config/Setting.java @@ -1,10 +1,15 @@ package com.irtimaled.bbor.client.config; -public class Setting extends AbstractSetting { +public class Setting { + private final char type; + String comment; + String category; + String name; private T value; + T defaultValue; Setting(char type, T value) { - super(type); + this.type = type; this.value = value; } @@ -16,8 +21,13 @@ public class Setting extends AbstractSetting { this.value = value; } - @Override - Object getValue() { - return value; + public void reset() { + this.value = this.defaultValue; + } + + public char getType() { + return type; } + + public String getName() { return name; } } -- 2.44.0