1 package com.irtimaled.bbor.client.commands;
3 import com.irtimaled.bbor.client.config.ConfigManager;
4 import com.irtimaled.bbor.client.config.HexColor;
5 import com.irtimaled.bbor.client.config.Setting;
6 import com.irtimaled.bbor.client.gui.SettingsScreen;
7 import com.mojang.brigadier.Command;
8 import com.mojang.brigadier.CommandDispatcher;
9 import com.mojang.brigadier.arguments.ArgumentType;
10 import com.mojang.brigadier.builder.LiteralArgumentBuilder;
11 import net.minecraft.server.command.CommandManager;
12 import net.minecraft.server.command.CommandSource;
13 import net.minecraft.server.command.ServerCommandSource;
15 import java.util.function.Function;
17 public class ConfigCommand {
18 private static final String COMMAND = "bbor:config";
19 private static final String GET = "get";
20 private static final String SAVE = "save";
21 private static final String SHOW_GUI = "showGui";
22 private static final String VALUE = "value";
23 private static final String RESET = "reset";
25 public static void register(CommandDispatcher<CommandSource> commandDispatcher) {
26 LiteralArgumentBuilder command = CommandManager.literal(COMMAND)
27 .then(buildCommands(GET, ConfigCommand::getCommandForSetting))
28 .then(buildCommands(ArgumentNames.SET, ConfigCommand::setCommandForSetting))
29 .then(buildCommands(RESET, ConfigCommand::resetCommandForSetting)
30 .executes(context1 -> {
31 ConfigManager.getSettings().forEach(Setting::reset);
32 ConfigManager.saveConfig();
35 .then(CommandManager.literal(SAVE)
36 .executes(context -> {
37 ConfigManager.saveConfig();
40 .then(CommandManager.literal(SHOW_GUI)
41 .executes(context -> {
42 SettingsScreen.show();
46 commandDispatcher.register(command);
49 private static LiteralArgumentBuilder<ServerCommandSource> resetCommandForSetting(Setting<?> setting) {
50 return CommandManager.literal(setting.getName())
51 .executes(context -> {
53 ConfigManager.saveConfig();
58 private interface CommandBuilder extends Function<Setting<?>, LiteralArgumentBuilder<ServerCommandSource>> {
61 private static LiteralArgumentBuilder<ServerCommandSource> buildCommands(String commandName, CommandBuilder commandBuilder) {
62 LiteralArgumentBuilder<ServerCommandSource> command = CommandManager.literal(commandName);
63 for (Setting<?> setting : ConfigManager.getSettings()) {
64 command.then(commandBuilder.apply(setting));
69 private static LiteralArgumentBuilder<ServerCommandSource> getCommandForSetting(Setting<?> setting) {
70 return CommandManager.literal(setting.getName())
71 .executes(context -> {
72 CommandHelper.feedback(context, "%s: %s", setting.getName(), setting.get());
77 private static LiteralArgumentBuilder<ServerCommandSource> setCommandForSetting(Setting<?> setting) {
78 LiteralArgumentBuilder<ServerCommandSource> command = CommandManager.literal(setting.getName());
79 switch (setting.getType()) {
81 buildSetSettingCommand(command, (Setting<Boolean>) setting, Arguments.bool(), Boolean.class);
84 buildSetSettingCommand(command, (Setting<Integer>) setting, Arguments.integer(), Integer.class);
87 buildSetSettingCommand(command, (Setting<String>) setting, Arguments.string(), String.class);
90 buildSetSettingCommand(command, (Setting<HexColor>) setting, Arguments.hexColor(), HexColor.class);
96 private static <T> void buildSetSettingCommand(LiteralArgumentBuilder<ServerCommandSource> command,
97 Setting<T> setting, ArgumentType<T> argument, Class<T> clazz) {
98 Command<ServerCommandSource> setSettingCommand = context -> {
99 setting.set(context.getArgument(VALUE, clazz));
100 if (CommandHelper.lastNodeIsLiteral(context, SAVE)) {
101 ConfigManager.saveConfig();
105 command.then(CommandManager.argument(VALUE, argument)
106 .executes(setSettingCommand)
107 .then(CommandManager.literal(SAVE)
108 .executes(setSettingCommand)));