1 package com.irtimaled.bbor.client.commands;
3 import com.irtimaled.bbor.client.config.ConfigManager;
4 import com.irtimaled.bbor.client.config.Setting;
5 import com.irtimaled.bbor.client.gui.SettingsScreen;
6 import com.mojang.brigadier.Command;
7 import com.mojang.brigadier.CommandDispatcher;
8 import com.mojang.brigadier.arguments.ArgumentType;
9 import com.mojang.brigadier.builder.LiteralArgumentBuilder;
10 import net.minecraft.command.CommandSource;
11 import net.minecraft.command.Commands;
12 import net.minecraft.command.ISuggestionProvider;
14 import java.util.function.Function;
16 public class ConfigCommand {
17 private static final String COMMAND = "bbor:config";
18 private static final String GET = "get";
19 private static final String SAVE = "save";
20 private static final String SHOW_GUI = "showGui";
21 private static final String VALUE = "value";
22 private static final String RESET = "reset";
24 public static void register(CommandDispatcher<ISuggestionProvider> commandDispatcher) {
25 LiteralArgumentBuilder command = Commands.literal(COMMAND)
26 .then(buildCommands(GET, ConfigCommand::getCommandForSetting))
27 .then(buildCommands(ArgumentNames.SET, ConfigCommand::setCommandForSetting))
28 .then(buildCommands(RESET, ConfigCommand::resetCommandForSetting)
29 .executes(context1 -> {
30 ConfigManager.getSettings().forEach(Setting::reset);
31 ConfigManager.saveConfig();
34 .then(Commands.literal(SAVE)
35 .executes(context -> {
36 ConfigManager.saveConfig();
39 .then(Commands.literal(SHOW_GUI)
40 .executes(context -> {
41 SettingsScreen.show();
45 commandDispatcher.register(command);
48 private static LiteralArgumentBuilder<CommandSource> resetCommandForSetting(Setting<?> setting) {
49 return Commands.literal(setting.getName())
50 .executes(context -> {
52 ConfigManager.saveConfig();
57 private interface CommandBuilder extends Function<Setting<?>, LiteralArgumentBuilder<CommandSource>> {
60 private static LiteralArgumentBuilder<CommandSource> buildCommands(String commandName, CommandBuilder commandBuilder) {
61 LiteralArgumentBuilder<CommandSource> command = Commands.literal(commandName);
62 for (Setting<?> setting : ConfigManager.getSettings()) {
63 command.then(commandBuilder.apply(setting));
68 private static LiteralArgumentBuilder<CommandSource> getCommandForSetting(Setting<?> setting) {
69 return Commands.literal(setting.getName())
70 .executes(context -> {
71 CommandHelper.feedback(context, "%s: %s", setting.getName(), setting.get());
76 private static LiteralArgumentBuilder<CommandSource> setCommandForSetting(Setting<?> setting) {
77 LiteralArgumentBuilder<CommandSource> command = Commands.literal(setting.getName());
78 switch (setting.getType()) {
80 buildSetSettingCommand(command, (Setting<Boolean>) setting, Arguments.bool(), Boolean.class);
83 buildSetSettingCommand(command, (Setting<Integer>) setting, Arguments.integer(), Integer.class);
86 buildSetSettingCommand(command, (Setting<String>) setting, Arguments.string(), String.class);
92 private static <T> void buildSetSettingCommand(LiteralArgumentBuilder<CommandSource> command,
93 Setting<T> setting, ArgumentType<T> argument, Class<T> clazz) {
94 Command<CommandSource> setSettingCommand = context -> {
95 setting.set(context.getArgument(VALUE, clazz));
96 if (CommandHelper.lastNodeIsLiteral(context, SAVE)) {
97 ConfigManager.saveConfig();
101 command.then(Commands.argument(VALUE, argument)
102 .executes(setSettingCommand)
103 .then(Commands.literal(SAVE)
104 .executes(setSettingCommand)));