]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/commitdiff
Add config command to allow easier config editing
authorIrtimaled <irtimaled@gmail.com>
Fri, 1 May 2020 08:19:55 +0000 (01:19 -0700)
committerIrtimaled <irtimaled@gmail.com>
Mon, 18 May 2020 00:28:01 +0000 (17:28 -0700)
src/main/java/com/irtimaled/bbor/client/commands/ConfigCommand.java [new file with mode: 0644]
src/main/java/com/irtimaled/bbor/client/interop/ClientInterop.java
src/main/java/com/irtimaled/bbor/config/AbstractSetting.java
src/main/java/com/irtimaled/bbor/config/ConfigManager.java
src/main/java/com/irtimaled/bbor/mixin/client/gui/MixinGuiChat.java [new file with mode: 0644]
src/main/resources/mixins.bbor.json

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 (file)
index 0000000..3e8aa95
--- /dev/null
@@ -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<ISuggestionProvider> 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<Setting<?>, LiteralArgumentBuilder<CommandSource>> {
+    }
+
+    private static LiteralArgumentBuilder<CommandSource> buildCommands(String commandName,
+                                                                       CommandBuilder commandBuilder) {
+        LiteralArgumentBuilder<CommandSource> command = Commands.literal(commandName);
+        for (Setting<?> setting : ConfigManager.getSettings()) {
+            command.then(commandBuilder.apply(setting));
+        }
+        return command;
+    }
+
+    private static LiteralArgumentBuilder<CommandSource> getCommandForSetting(Setting<?> setting) {
+        return Commands.literal(setting.getName())
+                .executes(context -> {
+                    CommandHelper.feedback(context, "%s: %s", setting.getName(), setting.get());
+                    return 0;
+                });
+    }
+
+    private static LiteralArgumentBuilder<CommandSource> setCommandForSetting(Setting<?> setting) {
+        LiteralArgumentBuilder<CommandSource> 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<Boolean>) setting).set(value);
+                            return 0;
+                        }));
+            case 'I':
+                return command.then(Commands.argument(VALUE, IntegerArgumentType.integer())
+                        .executes(context -> {
+                            int value = IntegerArgumentType.getInteger(context, VALUE);
+                            ((Setting<Integer>) setting).set(value);
+                            return 0;
+                        }));
+        }
+        return command;
+    }
+}
index 68e1d9b8f8dac725711ec971f9e6eb65b52465f2..d540dd2c0de1a3e7a8983470517846f679b1a554 100644 (file)
@@ -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);
     }
 }
index a3d6e748bc3f79629c4fa0538ac435a2a4fe8e97..0ff09013b324837a186c6fc2fde265ee6a30acd7 100644 (file)
@@ -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();
 }
index 633fdac5f063b358613ee539de890500ba1338b0..8b37fec4be185157993a672677d7bec465f42cc6 100644 (file)
@@ -138,4 +138,8 @@ public class ConfigManager {
     public static void Toggle(Setting<Boolean> setting) {
         setting.set(!setting.get());
     }
+
+    public static Set<Setting<?>> 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 (file)
index 0000000..2cfd6fd
--- /dev/null
@@ -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<Boolean> cir) {
+        if (Minecraft.getInstance().currentScreen instanceof ListScreen) {
+            cir.setReturnValue(true);
+            cir.cancel();
+        }
+    }
+}
index 6d81eefb501c1b248925a3e5ecda449169d9920b..ca84b7cf55281c34b0be534f66adcd4d247c41c6 100644 (file)
@@ -15,6 +15,7 @@
   "client": [
     "client.MixinMinecraft",
     "client.entity.MixinEntityPlayerSP",
+    "client.gui.MixinGuiChat",
     "client.gui.MixinGuiOptions",
     "client.multiplayer.MixinWorldClient",
     "client.network.MixinNetHandlerLoginClient",