diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java index 3dd60dd..b0efa1c 100644 --- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java +++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java @@ -1,4 +1,5 @@ package chylex.bettercontrols.config; +import chylex.bettercontrols.input.KeyBindingWithModifier; import net.minecraft.client.options.KeyBinding; import java.nio.file.Path; @@ -20,6 +21,8 @@ public final class BetterControlsConfig{ public float flightSpeedMpSpectatorDefault = 1F; public float flightSpeedMpSpectatorSprinting = 2F; + public final KeyBindingWithModifier keyOpenMenu = new KeyBindingWithModifier("key.bettercontrols.open_menu"); + BetterControlsConfig(){} private BetterControlsConfig setPath(final Path path){ @@ -28,7 +31,9 @@ public final class BetterControlsConfig{ } public KeyBinding[] getAllKeyBindings(){ - return new KeyBinding[0]; + return new KeyBinding[]{ + keyOpenMenu + }; } public void save(){ diff --git a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java index 38e97c0..08a7bfe 100644 --- a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java +++ b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java @@ -41,6 +41,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js Json.setFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault); Json.setFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting); + Json.writeKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu); + return obj; } @@ -60,6 +62,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js cfg.flightSpeedMpSpectatorDefault = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault); cfg.flightSpeedMpSpectatorSprinting = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting); + Json.readKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu); + return cfg; } diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java index 066a74c..88c3742 100644 --- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java +++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java @@ -2,10 +2,13 @@ package chylex.bettercontrols.gui; import chylex.bettercontrols.BetterControlsMod; import chylex.bettercontrols.config.BetterControlsConfig; import chylex.bettercontrols.gui.elements.BooleanValueWidget; +import chylex.bettercontrols.gui.elements.CycleButtonWidget; import chylex.bettercontrols.gui.elements.DiscreteValueSliderWidget; import chylex.bettercontrols.gui.elements.KeyBindingWidget; import chylex.bettercontrols.gui.elements.Option; import chylex.bettercontrols.gui.elements.TextWidget; +import chylex.bettercontrols.input.KeyBindingWithModifier; +import chylex.bettercontrols.input.ModifierKey; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; @@ -22,8 +25,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static chylex.bettercontrols.gui.OptionListWidget.COL2_W; +import static chylex.bettercontrols.gui.OptionListWidget.COL4_W; import static chylex.bettercontrols.gui.OptionListWidget.ROW_WIDTH; import static chylex.bettercontrols.gui.OptionListWidget.col2; +import static chylex.bettercontrols.gui.OptionListWidget.col4; import static chylex.bettercontrols.gui.elements.TextWidget.CENTER; public class BetterControlsScreen extends GameOptionsScreen{ @@ -105,8 +110,35 @@ public class BetterControlsScreen extends GameOptionsScreen{ return y; } + private int generateMiscellaneousOptions(int y, final List<Element> elements){ + final BetterControlsConfig cfg = BetterControlsMod.config; + + generateKeyBindingWithModifierOption(y, elements, Text.of("Open Better Controls Menu"), cfg.keyOpenMenu); + + y += ROW_HEIGHT; + return y; + } + // Helpers + private static final List<Option<ModifierKey>> MODIFIER_OPTIONS = Arrays.asList( + new Option<>(null, Text.of("(No Modifier)")), + new Option<>(ModifierKey.CONTROL, Text.of("Control")), + new Option<>(ModifierKey.SHIFT, Text.of("Shift")), + new Option<>(ModifierKey.ALT, Text.of("Alt")) + ); + + private void generateKeyBindingWithModifierOption(final int y, final List<Element> elements, final Text text, final KeyBindingWithModifier binding){ + final CycleButtonWidget<ModifierKey> modifierButton = new CycleButtonWidget<>(col4(2), y, COL4_W, MODIFIER_OPTIONS, binding.getModifier(), binding::setModifier); + final KeyBindingWidget bindingButton = new KeyBindingWidget(col4(3), y, COL4_W, binding, this::startEditingKeyBinding); + bindingButton.linkButtonToBoundState(modifierButton); + + generateLeftSideText(y, elements, text); + elements.add(modifierButton); + elements.add(bindingButton); + allKeyBindings.add(bindingButton); + } + private static void generateLeftSideText(final int y, final List<Element> elements, final Text text){ elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text)); } @@ -137,6 +169,9 @@ public class BetterControlsScreen extends GameOptionsScreen{ elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Flying"), CENTER)); y = generateFlightOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP; + elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Miscellaneous"), CENTER)); + y = generateMiscellaneousOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP; + addButton(new ButtonWidget(width / 2 - 99, height - 29, 200, 20, ScreenTexts.DONE, btn -> client.openScreen(parent))); addChild(optionsWidget = new OptionListWidget(21, height - 32, width, height, elements, y - TITLE_MARGIN_TOP + BOTTOM_PADDING)); } diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java index 9ce0cdb..cc8c7a1 100644 --- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java +++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java @@ -1,6 +1,7 @@ package chylex.bettercontrols.player; import chylex.bettercontrols.BetterControlsMod; import chylex.bettercontrols.config.BetterControlsConfig; +import chylex.bettercontrols.gui.BetterControlsScreen; import chylex.bettercontrols.mixin.AccessCameraFields; import chylex.bettercontrols.mixin.AccessClientPlayerFields; import net.minecraft.client.MinecraftClient; @@ -123,5 +124,9 @@ public final class PlayerTicker{ camera.setCameraY(player.getStandingEyeHeight()); } } + + if (cfg().keyOpenMenu.isPressed()){ + mc().openScreen(new BetterControlsScreen(null)); + } } } diff --git a/src/main/resources/assets/bettercontrols/lang/en_us.json b/src/main/resources/assets/bettercontrols/lang/en_us.json index f4fb070..b04b077 100644 --- a/src/main/resources/assets/bettercontrols/lang/en_us.json +++ b/src/main/resources/assets/bettercontrols/lang/en_us.json @@ -1,3 +1,4 @@ { - "key.categories.bettercontrols": "Better Controls" + "key.categories.bettercontrols": "Better Controls", + "key.bettercontrols.open_menu": "Open Menu" }