From: Irtimaled Date: Fri, 1 May 2020 08:19:55 +0000 (-0700) Subject: Add config command to allow easier config editing X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=75174b7b5edf4e395a560b0324a0a6d440ae97ec;p=BoundingBoxOutlineReloaded.git Add config command to allow easier config editing --- diff --git a/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java b/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java new file mode 100644 index 0000000..3e8aa95 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java @@ -0,0 +1,82 @@ +package com.irtimaled.bbor.client.commands; + +import com.irtimaled.bbor.client.gui.SettingsScreen; +import com.irtimaled.bbor.config.ConfigManager; +import com.irtimaled.bbor.config.Setting; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.ISuggestionProvider; + +import java.util.function.Function; + +public class ConfigCommand { + private static final String COMMAND = "bbor:config"; + private static final String GET = "get"; + private static final String SET = "set"; + private static final String SAVE = "save"; + private static final String SHOW_GUI = "showGui"; + private static final String VALUE = "value"; + + public static void register(CommandDispatcher commandDispatcher) { + LiteralArgumentBuilder command = Commands.literal(COMMAND) + .then(buildCommands(GET, ConfigCommand::getCommandForSetting)) + .then(buildCommands(SET, ConfigCommand::setCommandForSetting)) + .then(Commands.literal(SAVE) + .executes(context -> { + ConfigManager.saveConfig(); + return 0; + })) + .then(Commands.literal(SHOW_GUI) + .executes(context -> { + SettingsScreen.show(); + return 0; + })); + + commandDispatcher.register(command); + } + + private interface CommandBuilder extends Function, LiteralArgumentBuilder> { + } + + private static LiteralArgumentBuilder buildCommands(String commandName, + CommandBuilder commandBuilder) { + LiteralArgumentBuilder command = Commands.literal(commandName); + for (Setting setting : ConfigManager.getSettings()) { + command.then(commandBuilder.apply(setting)); + } + return command; + } + + private static LiteralArgumentBuilder getCommandForSetting(Setting setting) { + return Commands.literal(setting.getName()) + .executes(context -> { + CommandHelper.feedback(context, "%s: %s", setting.getName(), setting.get()); + return 0; + }); + } + + private static LiteralArgumentBuilder setCommandForSetting(Setting setting) { + LiteralArgumentBuilder command = Commands.literal(setting.getName()); + switch (setting.getType()) { + case 'B': + return command.then(Commands.argument(VALUE, BoolArgumentType.bool()) + .executes(context -> { + boolean value = BoolArgumentType.getBool(context, VALUE); + ((Setting) setting).set(value); + return 0; + })); + case 'I': + return command.then(Commands.argument(VALUE, IntegerArgumentType.integer()) + .executes(context -> { + int value = IntegerArgumentType.getInteger(context, VALUE); + ((Setting) setting).set(value); + return 0; + })); + } + return command; + } +} diff --git a/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java b/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java index 68e1d9b..d540dd2 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java @@ -2,10 +2,7 @@ package com.irtimaled.bbor.client.interop; import com.irtimaled.bbor.client.ClientRenderer; import com.irtimaled.bbor.client.Player; -import com.irtimaled.bbor.client.commands.BeaconCommand; -import com.irtimaled.bbor.client.commands.BoxCommand; -import com.irtimaled.bbor.client.commands.SeedCommand; -import com.irtimaled.bbor.client.commands.SpawningSphereCommand; +import com.irtimaled.bbor.client.commands.*; import com.irtimaled.bbor.client.events.DisconnectedFromRemoteServer; import com.irtimaled.bbor.client.events.UpdateWorldSpawnReceived; import com.irtimaled.bbor.client.providers.SlimeChunkProvider; @@ -93,5 +90,6 @@ public class ClientInterop { SpawningSphereCommand.register(commandDispatcher); BoxCommand.register(commandDispatcher); BeaconCommand.register(commandDispatcher); + ConfigCommand.register(commandDispatcher); } } diff --git a/src/main/java/com/irtimaled/bbor/config/AbstractSetting.java b/src/main/java/com/irtimaled/bbor/config/AbstractSetting.java index a3d6e74..0ff0901 100644 --- a/src/main/java/com/irtimaled/bbor/config/AbstractSetting.java +++ b/src/main/java/com/irtimaled/bbor/config/AbstractSetting.java @@ -7,13 +7,15 @@ public abstract class AbstractSetting { private final char type; - public AbstractSetting(char type) { + AbstractSetting(char type) { this.type = type; } - char getType() { + public char getType() { return type; } + public String getName() { return name; } + abstract Object getValue(); } diff --git a/src/main/java/com/irtimaled/bbor/config/ConfigManager.java b/src/main/java/com/irtimaled/bbor/config/ConfigManager.java index 633fdac..8b37fec 100644 --- a/src/main/java/com/irtimaled/bbor/config/ConfigManager.java +++ b/src/main/java/com/irtimaled/bbor/config/ConfigManager.java @@ -138,4 +138,8 @@ public class ConfigManager { public static void Toggle(Setting setting) { setting.set(!setting.get()); } + + public static Set> getSettings() { + return settings; + } } diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/gui/MixinGuiChat.java b/src/main/java/com/irtimaled/bbor/mixin/client/gui/MixinGuiChat.java new file mode 100644 index 0000000..2cfd6fd --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/mixin/client/gui/MixinGuiChat.java @@ -0,0 +1,20 @@ +package com.irtimaled.bbor.mixin.client.gui; + +import com.irtimaled.bbor.client.gui.ListScreen; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiChat; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(GuiChat.class) +public class MixinGuiChat { + @Inject(method = "keyPressed", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;displayGuiScreen(Lnet/minecraft/client/gui/GuiScreen;)V", shift = At.Shift.BEFORE), cancellable = true) + private void keyPressed(CallbackInfoReturnable cir) { + if (Minecraft.getInstance().currentScreen instanceof ListScreen) { + cir.setReturnValue(true); + cir.cancel(); + } + } +} diff --git a/src/main/resources/mixins.bbor.json b/src/main/resources/mixins.bbor.json index 6d81eef..ca84b7c 100644 --- a/src/main/resources/mixins.bbor.json +++ b/src/main/resources/mixins.bbor.json @@ -15,6 +15,7 @@ "client": [ "client.MixinMinecraft", "client.entity.MixinEntityPlayerSP", + "client.gui.MixinGuiChat", "client.gui.MixinGuiOptions", "client.multiplayer.MixinWorldClient", "client.network.MixinNetHandlerLoginClient",