BetterControlsScreen.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package chylex.bettercontrols.gui;
  2. import chylex.bettercontrols.BetterControlsMod;
  3. import chylex.bettercontrols.config.BetterControlsConfig;
  4. import chylex.bettercontrols.gui.elements.BooleanValueWidget;
  5. import chylex.bettercontrols.gui.elements.DiscreteValueSliderWidget;
  6. import chylex.bettercontrols.gui.elements.KeyBindingWidget;
  7. import chylex.bettercontrols.gui.elements.Option;
  8. import chylex.bettercontrols.gui.elements.TextWidget;
  9. import net.minecraft.client.MinecraftClient;
  10. import net.minecraft.client.gui.Element;
  11. import net.minecraft.client.gui.screen.Screen;
  12. import net.minecraft.client.gui.screen.ScreenTexts;
  13. import net.minecraft.client.gui.screen.options.GameOptionsScreen;
  14. import net.minecraft.client.gui.widget.ButtonWidget;
  15. import net.minecraft.client.options.KeyBinding;
  16. import net.minecraft.client.util.InputUtil;
  17. import net.minecraft.client.util.math.MatrixStack;
  18. import net.minecraft.text.LiteralText;
  19. import net.minecraft.text.Text;
  20. import org.lwjgl.glfw.GLFW;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.List;
  24. import static chylex.bettercontrols.gui.OptionListWidget.COL2_W;
  25. import static chylex.bettercontrols.gui.OptionListWidget.ROW_WIDTH;
  26. import static chylex.bettercontrols.gui.OptionListWidget.col2;
  27. import static chylex.bettercontrols.gui.elements.TextWidget.CENTER;
  28. public class BetterControlsScreen extends GameOptionsScreen{
  29. public static final LiteralText TITLE = new LiteralText("Better Controls");
  30. private static final int BOTTOM_PADDING = 3;
  31. private static final int TEXT_PADDING_RIGHT = 4;
  32. private static final int TITLE_MARGIN_TOP = 3;
  33. private static final int ROW_HEIGHT = 22;
  34. // Options
  35. private int generateSprintingOptions(int y, final List<Element> elements){
  36. final BetterControlsConfig cfg = BetterControlsMod.config;
  37. generateLeftSideText(y, elements, Text.of("Double Tap 'Walk Forwards' To Sprint"));
  38. elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.doubleTapForwardToSprint, value -> cfg.doubleTapForwardToSprint = value));
  39. y += ROW_HEIGHT;
  40. return y;
  41. }
  42. @SuppressWarnings({ "AutoBoxing", "AutoUnboxing" })
  43. private int generateFlightOptions(int y, final List<Element> elements){
  44. final BetterControlsConfig cfg = BetterControlsMod.config;
  45. final List<Option<Float>> flightSpeedOptions = Arrays.asList(
  46. new Option<>(Float.valueOf(0.25F), Text.of("0.25x")),
  47. new Option<>(Float.valueOf(0.50F), Text.of("0.5x")),
  48. new Option<>(Float.valueOf(0.75F), Text.of("0.75x")),
  49. new Option<>(Float.valueOf(1.00F), Text.of("1x")),
  50. new Option<>(Float.valueOf(1.50F), Text.of("1.5x")),
  51. new Option<>(Float.valueOf(2.00F), Text.of("2x")),
  52. new Option<>(Float.valueOf(3.00F), Text.of("3x")),
  53. new Option<>(Float.valueOf(4.00F), Text.of("4x")),
  54. new Option<>(Float.valueOf(6.00F), Text.of("6x")),
  55. new Option<>(Float.valueOf(8.00F), Text.of("8x"))
  56. );
  57. generateLeftSideText(y, elements, Text.of("Fly On Ground (Creative Mode)"));
  58. elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.flyOnGroundInCreative, value -> cfg.flyOnGroundInCreative = value));
  59. y += ROW_HEIGHT * 4 / 3;
  60. generateLeftSideText(y, elements, Text.of("Speed Multiplier (Creative)"));
  61. elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpCreativeDefault, value -> cfg.flightSpeedMpCreativeDefault = value));
  62. y += ROW_HEIGHT;
  63. generateLeftSideText(y, elements, Text.of("Speed Multiplier (Creative + Sprinting)"));
  64. elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpCreativeSprinting, value -> cfg.flightSpeedMpCreativeSprinting = value));
  65. y += ROW_HEIGHT;
  66. generateLeftSideText(y, elements, Text.of("Speed Multiplier (Spectator)"));
  67. elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorDefault, value -> cfg.flightSpeedMpSpectatorDefault = value));
  68. y += ROW_HEIGHT;
  69. generateLeftSideText(y, elements, Text.of("Speed Multiplier (Spectator + Sprinting)"));
  70. elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorSprinting, value -> cfg.flightSpeedMpSpectatorSprinting = value));
  71. y += ROW_HEIGHT;
  72. return y;
  73. }
  74. // Helpers
  75. private static void generateLeftSideText(final int y, final List<Element> elements, final Text text){
  76. elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text));
  77. }
  78. // Instance
  79. private OptionListWidget optionsWidget;
  80. private KeyBindingWidget editingKeyBinding;
  81. private final List<KeyBindingWidget> allKeyBindings = new ArrayList<>();
  82. public BetterControlsScreen(final Screen parentScreen){
  83. super(parentScreen, MinecraftClient.getInstance().options, TITLE);
  84. }
  85. @Override
  86. public void init(){
  87. allKeyBindings.clear();
  88. final List<Element> elements = new ArrayList<>();
  89. int y = 0;
  90. elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Sprinting"), CENTER));
  91. y = generateSprintingOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
  92. elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Flying"), CENTER));
  93. y = generateFlightOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
  94. addButton(new ButtonWidget(width / 2 - 99, height - 29, 200, 20, ScreenTexts.DONE, btn -> client.openScreen(parent)));
  95. addChild(optionsWidget = new OptionListWidget(21, height - 32, width, height, elements, y - TITLE_MARGIN_TOP + BOTTOM_PADDING));
  96. }
  97. @Override
  98. public void removed(){
  99. BetterControlsMod.config.save();
  100. }
  101. @Override
  102. public void render(final MatrixStack matrices, final int mouseX, final int mouseY, final float delta){
  103. renderBackground(matrices);
  104. optionsWidget.render(matrices, mouseX, mouseY, delta);
  105. drawCenteredText(matrices, textRenderer, title, width / 2, 8, (255 << 16) | (255 << 8) | 255);
  106. super.render(matrices, mouseX, mouseY, delta);
  107. }
  108. private void startEditingKeyBinding(final KeyBindingWidget widget){
  109. if (editingKeyBinding != null){
  110. editingKeyBinding.stopEditing();
  111. }
  112. editingKeyBinding = widget;
  113. }
  114. @Override
  115. public boolean mouseClicked(final double mouseX, final double mouseY, final int button){
  116. if (editingKeyBinding != null){
  117. editingKeyBinding.bindAndStopEditing(InputUtil.Type.MOUSE.createFromCode(button));
  118. onKeyBindingEditingFinished();
  119. return true;
  120. }
  121. else{
  122. return super.mouseClicked(mouseX, mouseY, button);
  123. }
  124. }
  125. @Override
  126. public boolean keyPressed(final int keyCode, final int scanCode, final int modifiers){
  127. if (editingKeyBinding != null){
  128. if (keyCode == GLFW.GLFW_KEY_ESCAPE){
  129. editingKeyBinding.bindAndStopEditing(InputUtil.UNKNOWN_KEY);
  130. }
  131. else{
  132. editingKeyBinding.bindAndStopEditing(InputUtil.fromKeyCode(keyCode, scanCode));
  133. }
  134. onKeyBindingEditingFinished();
  135. return true;
  136. }
  137. else{
  138. return super.keyPressed(keyCode, scanCode, modifiers);
  139. }
  140. }
  141. private void onKeyBindingEditingFinished(){
  142. editingKeyBinding = null;
  143. KeyBinding.updateKeysByCode();
  144. for(final KeyBindingWidget widget : allKeyBindings){
  145. widget.updateKeyBindingText();
  146. }
  147. }
  148. }