1
0
mirror of https://github.com/chylex/Better-Controls.git synced 2025-04-09 15:15:51 +02:00

Refactor code to make porting easier

This commit is contained in:
chylex 2020-10-30 17:07:03 +01:00
parent 2b1a032295
commit 0c2eb63a24
16 changed files with 217 additions and 154 deletions

View File

@ -1,7 +1,6 @@
package chylex.bettercontrols.config;
import chylex.bettercontrols.input.KeyBindingWithModifier;
import chylex.bettercontrols.input.SprintMode;
import net.minecraft.client.options.KeyBinding;
import java.nio.file.Path;
public final class BetterControlsConfig{
@ -44,8 +43,8 @@ public final class BetterControlsConfig{
return this;
}
public KeyBinding[] getAllKeyBindings(){
return new KeyBinding[]{
public KeyBindingWithModifier[] getAllKeyBindings(){
return new KeyBindingWithModifier[]{
keyToggleSprint,
keyToggleSneak,
keyToggleFlight,

View File

@ -1,20 +1,12 @@
package chylex.bettercontrols.config;
import chylex.bettercontrols.input.KeyBindingWithModifier;
import chylex.bettercontrols.input.ModifierKey;
import chylex.bettercontrols.util.Key;
import com.google.gson.JsonObject;
import net.minecraft.client.util.InputUtil;
final class Json{
private Json(){}
static void setInt(final JsonObject obj, final String key, final int value){
obj.addProperty(key, Integer.valueOf(value));
}
static int getInt(final JsonObject obj, final String key, final int defaultValue){
return obj.has(key) ? obj.get(key).getAsInt() : defaultValue;
}
static void setFloat(final JsonObject obj, final String key, final float value){
obj.addProperty(key, Float.valueOf(value));
}
@ -59,7 +51,7 @@ final class Json{
private static final String MOD_SUFFIX = ".Mod";
static void writeKeyBinding(final JsonObject obj, final String key, final KeyBindingWithModifier keyBinding){
obj.addProperty(key + KEY_SUFFIX, keyBinding.getBoundKeyTranslationKey());
obj.addProperty(key + KEY_SUFFIX, Key.writeBinding(keyBinding));
if (keyBinding.getModifier() != null){
obj.addProperty(key + MOD_SUFFIX, Integer.valueOf(keyBinding.getModifier().id));
@ -68,7 +60,7 @@ final class Json{
static void readKeyBinding(final JsonObject obj, final String key, final KeyBindingWithModifier keyBinding){
if (obj.has(key + KEY_SUFFIX)){
keyBinding.setBoundKey(InputUtil.fromTranslationKey(obj.get(key + KEY_SUFFIX).getAsString()));
Key.readBinding(keyBinding, obj.get(key + KEY_SUFFIX).getAsString());
}
if (obj.has(key + MOD_SUFFIX)){

View File

@ -10,7 +10,7 @@ import chylex.bettercontrols.gui.elements.TextWidget;
import chylex.bettercontrols.input.KeyBindingWithModifier;
import chylex.bettercontrols.input.ModifierKey;
import chylex.bettercontrols.input.SprintMode;
import net.minecraft.client.MinecraftClient;
import chylex.bettercontrols.util.LiteralText;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ScreenTexts;
@ -19,8 +19,6 @@ import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import org.lwjgl.glfw.GLFW;
import java.util.ArrayList;
import java.util.Arrays;
@ -31,9 +29,11 @@ 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;
import static chylex.bettercontrols.util.LiteralText.text;
import static chylex.bettercontrols.util.Statics.OPTIONS;
public class BetterControlsScreen extends GameOptionsScreen{
public static final LiteralText TITLE = new LiteralText("Better Controls");
public static final LiteralText TITLE = text("Better Controls");
private static final int BOTTOM_PADDING = 3;
private static final int TEXT_PADDING_RIGHT = 4;
@ -41,9 +41,9 @@ public class BetterControlsScreen extends GameOptionsScreen{
private static final int ROW_HEIGHT = 22;
private final List<Option<SprintMode>> SPRINT_MODE_OPTIONS = Arrays.asList(
new Option<>(SprintMode.TAP_TO_START, Text.of("Tap To Start Sprinting")),
new Option<>(SprintMode.TAP_TO_TOGGLE, Text.of("Tap To Start / Stop Sprinting")),
new Option<>(SprintMode.HOLD, Text.of("Hold To Sprint"))
new Option<>(SprintMode.TAP_TO_START, text("Tap To Start Sprinting")),
new Option<>(SprintMode.TAP_TO_TOGGLE, text("Tap To Start / Stop Sprinting")),
new Option<>(SprintMode.HOLD, text("Hold To Sprint"))
);
// Options
@ -51,21 +51,21 @@ public class BetterControlsScreen extends GameOptionsScreen{
private int generateSprintingOptions(int y, final List<Element> elements){
final BetterControlsConfig cfg = BetterControlsMod.config;
generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Sprint"), cfg.keyToggleSprint);
generateKeyBindingWithModifierOption(y, elements, text("Toggle Sprint"), cfg.keyToggleSprint);
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Sprint Key Mode"));
generateLeftSideText(y, elements, text("Sprint Key Mode"));
elements.add(new CycleButtonWidget<>(col2(1), y, COL2_W, SPRINT_MODE_OPTIONS, cfg.sprintMode, value -> cfg.sprintMode = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Double Tap 'Walk Forwards' To Sprint"));
generateLeftSideText(y, elements, text("Double Tap 'Walk Forwards' To Sprint"));
elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.doubleTapForwardToSprint, value -> cfg.doubleTapForwardToSprint = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Resume Sprinting After Hitting Obstacle"));
generateLeftSideText(y, elements, text("Resume Sprinting After Hitting Obstacle"));
elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.resumeSprintingAfterHittingObstacle, value -> cfg.resumeSprintingAfterHittingObstacle = value));
y += ROW_HEIGHT;
@ -75,11 +75,11 @@ public class BetterControlsScreen extends GameOptionsScreen{
private int generateSneakingOptions(int y, final List<Element> elements){
final BetterControlsConfig cfg = BetterControlsMod.config;
generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Sneak"), cfg.keyToggleSneak);
generateKeyBindingWithModifierOption(y, elements, text("Toggle Sneak"), cfg.keyToggleSneak);
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Move Camera Smoothly"));
generateLeftSideText(y, elements, text("Move Camera Smoothly"));
elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.sneakingMovesCameraSmoothly, value -> cfg.sneakingMovesCameraSmoothly = value));
y += ROW_HEIGHT;
@ -91,75 +91,75 @@ public class BetterControlsScreen extends GameOptionsScreen{
final BetterControlsConfig cfg = BetterControlsMod.config;
final List<Option<Float>> flightSpeedOptions = Arrays.asList(
new Option<>(Float.valueOf(0.25F), Text.of("0.25x")),
new Option<>(Float.valueOf(0.50F), Text.of("0.5x")),
new Option<>(Float.valueOf(0.75F), Text.of("0.75x")),
new Option<>(Float.valueOf(1.00F), Text.of("1x")),
new Option<>(Float.valueOf(1.50F), Text.of("1.5x")),
new Option<>(Float.valueOf(2.00F), Text.of("2x")),
new Option<>(Float.valueOf(3.00F), Text.of("3x")),
new Option<>(Float.valueOf(4.00F), Text.of("4x")),
new Option<>(Float.valueOf(5.00F), Text.of("5x")),
new Option<>(Float.valueOf(6.00F), Text.of("6x")),
new Option<>(Float.valueOf(7.00F), Text.of("7x")),
new Option<>(Float.valueOf(8.00F), Text.of("8x"))
new Option<>(Float.valueOf(0.25F), text("0.25x")),
new Option<>(Float.valueOf(0.50F), text("0.5x")),
new Option<>(Float.valueOf(0.75F), text("0.75x")),
new Option<>(Float.valueOf(1.00F), text("1x")),
new Option<>(Float.valueOf(1.50F), text("1.5x")),
new Option<>(Float.valueOf(2.00F), text("2x")),
new Option<>(Float.valueOf(3.00F), text("3x")),
new Option<>(Float.valueOf(4.00F), text("4x")),
new Option<>(Float.valueOf(5.00F), text("5x")),
new Option<>(Float.valueOf(6.00F), text("6x")),
new Option<>(Float.valueOf(7.00F), text("7x")),
new Option<>(Float.valueOf(8.00F), text("8x"))
);
final List<Option<Float>> flightVerticalBoostOptions = Arrays.asList(
new Option<>(Float.valueOf(0.00F), Text.of("None")),
new Option<>(Float.valueOf(0.25F), Text.of("+25%")),
new Option<>(Float.valueOf(0.50F), Text.of("+50%")),
new Option<>(Float.valueOf(0.75F), Text.of("+75%")),
new Option<>(Float.valueOf(1.00F), Text.of("+100%")),
new Option<>(Float.valueOf(1.50F), Text.of("+150%")),
new Option<>(Float.valueOf(2.00F), Text.of("+200%")),
new Option<>(Float.valueOf(2.50F), Text.of("+250%")),
new Option<>(Float.valueOf(3.00F), Text.of("+300%"))
new Option<>(Float.valueOf(0.00F), text("None")),
new Option<>(Float.valueOf(0.25F), text("+25%")),
new Option<>(Float.valueOf(0.50F), text("+50%")),
new Option<>(Float.valueOf(0.75F), text("+75%")),
new Option<>(Float.valueOf(1.00F), text("+100%")),
new Option<>(Float.valueOf(1.50F), text("+150%")),
new Option<>(Float.valueOf(2.00F), text("+200%")),
new Option<>(Float.valueOf(2.50F), text("+250%")),
new Option<>(Float.valueOf(3.00F), text("+300%"))
);
generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Flight (Creative)"), cfg.keyToggleFlight);
generateKeyBindingWithModifierOption(y, elements, text("Toggle Flight (Creative)"), cfg.keyToggleFlight);
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Sprint Key Mode While Flying"));
generateLeftSideText(y, elements, text("Sprint Key Mode While Flying"));
elements.add(new CycleButtonWidget<>(col2(1), y, COL2_W, SPRINT_MODE_OPTIONS, cfg.sprintModeWhileFlying, value -> cfg.sprintModeWhileFlying = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Disable Field Of View Changing"));
generateLeftSideText(y, elements, text("Disable Field Of View Changing"));
elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.disableChangingFovWhileFlying, value -> cfg.disableChangingFovWhileFlying = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Fly On Ground (Creative Mode)"));
generateLeftSideText(y, elements, text("Fly On Ground (Creative Mode)"));
elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.flyOnGroundInCreative, value -> cfg.flyOnGroundInCreative = value));
y += ROW_HEIGHT * 4 / 3;
elements.add(new TextWidget(col4(2), y, COL4_W - TEXT_PADDING_RIGHT, Text.of("Creative"), CENTER));
elements.add(new TextWidget(col4(3), y, COL4_W - TEXT_PADDING_RIGHT, Text.of("Spectator"), CENTER));
elements.add(new TextWidget(col4(2), y, COL4_W - TEXT_PADDING_RIGHT, text("Creative"), CENTER));
elements.add(new TextWidget(col4(3), y, COL4_W - TEXT_PADDING_RIGHT, text("Spectator"), CENTER));
y += ROW_HEIGHT * 7 / 8;
generateLeftSideText(y, elements, Text.of("Speed Multiplier (Default)"));
generateLeftSideText(y, elements, text("Speed Multiplier (Default)"));
elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpCreativeDefault, value -> cfg.flightSpeedMpCreativeDefault = value));
elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorDefault, value -> cfg.flightSpeedMpSpectatorDefault = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Speed Multiplier (Sprinting)"));
generateLeftSideText(y, elements, text("Speed Multiplier (Sprinting)"));
elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpCreativeSprinting, value -> cfg.flightSpeedMpCreativeSprinting = value));
elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorSprinting, value -> cfg.flightSpeedMpSpectatorSprinting = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Vertical Speed Boost (Default)"));
generateLeftSideText(y, elements, text("Vertical Speed Boost (Default)"));
elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostCreativeDefault, value -> cfg.flightVerticalBoostCreativeDefault = value));
elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostSpectatorDefault, value -> cfg.flightVerticalBoostSpectatorDefault = value));
y += ROW_HEIGHT;
generateLeftSideText(y, elements, Text.of("Vertical Speed Boost (Sprinting)"));
generateLeftSideText(y, elements, text("Vertical Speed Boost (Sprinting)"));
elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostCreativeSprinting, value -> cfg.flightVerticalBoostCreativeSprinting = value));
elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostSpectatorSprinting, value -> cfg.flightVerticalBoostSpectatorSprinting = value));
@ -170,19 +170,19 @@ public class BetterControlsScreen extends GameOptionsScreen{
private int generateMiscellaneousOptions(int y, final List<Element> elements){
final BetterControlsConfig cfg = BetterControlsMod.config;
generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Walk Forwards"), cfg.keyToggleWalkForward);
generateKeyBindingWithModifierOption(y, elements, text("Toggle Walk Forwards"), cfg.keyToggleWalkForward);
y += ROW_HEIGHT;
generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Jump"), cfg.keyToggleJump);
generateKeyBindingWithModifierOption(y, elements, text("Toggle Jump"), cfg.keyToggleJump);
y += ROW_HEIGHT;
generateKeyBindingWithModifierOption(y, elements, Text.of("Reset All Toggles"), cfg.keyResetAllToggles);
generateKeyBindingWithModifierOption(y, elements, text("Reset All Toggles"), cfg.keyResetAllToggles);
y += ROW_HEIGHT * 4 / 3;
generateKeyBindingWithModifierOption(y, elements, Text.of("Open Better Controls Menu"), cfg.keyOpenMenu);
generateKeyBindingWithModifierOption(y, elements, text("Open Better Controls Menu"), cfg.keyOpenMenu);
y += ROW_HEIGHT;
return y;
@ -191,13 +191,13 @@ public class BetterControlsScreen extends GameOptionsScreen{
// 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"))
new Option<>(null, text("(No Modifier)")),
new Option<>(ModifierKey.CONTROL, text("Control")),
new Option<>(ModifierKey.SHIFT, text("Shift")),
new Option<>(ModifierKey.ALT, text("Alt"))
);
private void generateKeyBindingWithModifierOption(final int y, final List<Element> elements, final Text text, final KeyBindingWithModifier binding){
private void generateKeyBindingWithModifierOption(final int y, final List<Element> elements, final LiteralText 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);
@ -208,7 +208,7 @@ public class BetterControlsScreen extends GameOptionsScreen{
allKeyBindings.add(bindingButton);
}
private static void generateLeftSideText(final int y, final List<Element> elements, final Text text){
private static void generateLeftSideText(final int y, final List<Element> elements, final LiteralText text){
elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text));
}
@ -219,7 +219,7 @@ public class BetterControlsScreen extends GameOptionsScreen{
private final List<KeyBindingWidget> allKeyBindings = new ArrayList<>();
public BetterControlsScreen(final Screen parentScreen){
super(parentScreen, MinecraftClient.getInstance().options, TITLE);
super(parentScreen, OPTIONS, TITLE);
}
@Override
@ -229,16 +229,16 @@ public class BetterControlsScreen extends GameOptionsScreen{
final List<Element> elements = new ArrayList<>();
int y = 0;
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Sprinting"), CENTER));
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, text("Sprinting"), CENTER));
y = generateSprintingOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Sneaking"), CENTER));
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, text("Sneaking"), CENTER));
y = generateSneakingOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Flying"), CENTER));
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, text("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));
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, text("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)));

View File

@ -1,6 +1,5 @@
package chylex.bettercontrols.gui;
import chylex.bettercontrols.gui.OptionListWidget.Entry;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.widget.AbstractButtonWidget;
@ -12,32 +11,23 @@ import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import static chylex.bettercontrols.util.Statics.MINECRAFT;
public final class OptionListWidget extends ElementListWidget<Entry>{
public static final int ROW_WIDTH = 408;
public static final int ROW_PADDING = 2;
public static final int COL2_W = (ROW_WIDTH / 2) - ROW_PADDING;
public static final int COL3_W = (ROW_WIDTH / 3) - ROW_PADDING;
public static final int COL4_W = (ROW_WIDTH / 4) - ROW_PADDING;
public static final int COL6_W = (ROW_WIDTH / 6) - ROW_PADDING;
public static int col2(final int column){
return (column * ROW_WIDTH) / 2;
}
public static int col3(final int column){
return (column * ROW_WIDTH) / 3;
}
public static int col4(final int column){
return (column * ROW_WIDTH) / 4;
}
public static int col6(final int column){
return (column * ROW_WIDTH) / 6;
}
private static Offset getElementOffset(final Element element){
if (element instanceof Widget){
return new Offset(((Widget)element).getX(), ((Widget)element).getY());
@ -68,7 +58,7 @@ public final class OptionListWidget extends ElementListWidget<Entry>{
}
public OptionListWidget(final int top, final int bottom, final int width, final int height, final List<Element> widgets, final int innerHeight){
super(MinecraftClient.getInstance(), width, height, top, bottom, innerHeight);
super(MINECRAFT, width, height, top, bottom, innerHeight);
addEntry(new Entry(widgets));
}

View File

@ -1,15 +1,16 @@
package chylex.bettercontrols.gui;
import chylex.bettercontrols.mixin.AccessScreenButtons;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.ParentElement;
import net.minecraft.client.gui.screen.options.AccessibilityOptionsScreen;
import net.minecraft.client.gui.screen.options.ControlsOptionsScreen;
import net.minecraft.client.gui.widget.AbstractButtonWidget;
import net.minecraft.client.gui.widget.ButtonListWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.OptionButtonWidget;
import net.minecraft.client.options.Option;
import java.util.List;
import java.util.function.Consumer;
import static chylex.bettercontrols.util.Statics.MINECRAFT;
public final class ScreenPatcher{
private ScreenPatcher(){}
@ -31,27 +32,31 @@ public final class ScreenPatcher{
buttons.remove(autoJump);
accessor.callAddButton(new ButtonWidget(autoJump.x, autoJump.y, autoJump.getWidth(), autoJump.getHeight(), BetterControlsScreen.TITLE.copy().append("..."), btn -> {
MinecraftClient.getInstance().openScreen(new BetterControlsScreen(screen));
MINECRAFT.openScreen(new BetterControlsScreen(screen));
}));
}
}
public static void onAccessibilityScreenOpened(final AccessibilityOptionsScreen screen){
final AccessScreenButtons accessor = (AccessScreenButtons)screen;
screen.children()
.stream()
.filter(it -> it instanceof ButtonListWidget)
.flatMap(it -> ((ButtonListWidget)it).children().stream())
.flatMap(it -> it.children().stream())
.filter(it -> it instanceof OptionButtonWidget)
.forEach(it -> {
walkChildren(screen.children(), it -> {
if (it instanceof OptionButtonWidget){
final OptionButtonWidget button = (OptionButtonWidget)it;
final Option option = button.getOption();
if (option == Option.SPRINT_TOGGLED || option == Option.SNEAK_TOGGLED){
button.active = false;
}
});
}
});
}
private static void walkChildren(final List<? extends Element> elements, final Consumer<Element> callback){
for(final Element element : elements){
callback.accept(element);
if (element instanceof ParentElement){
walkChildren(((ParentElement)element).children(), callback);
}
}
}
}

View File

@ -1,5 +1,5 @@
package chylex.bettercontrols.gui.elements;
import net.minecraft.client.MinecraftClient;
import chylex.bettercontrols.util.Key;
import net.minecraft.client.gui.widget.AbstractButtonWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.options.KeyBinding;
@ -12,6 +12,7 @@ import net.minecraft.util.Formatting;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import static chylex.bettercontrols.util.Statics.OPTIONS;
public final class KeyBindingWidget extends ButtonWidget{
private final KeyBinding binding;
@ -36,12 +37,12 @@ public final class KeyBindingWidget extends ButtonWidget{
public void linkButtonToBoundState(final AbstractButtonWidget button){
linkedButtons.add(button);
button.active = !binding.isUnbound();
button.active = !Key.isUnbound(binding);
}
@Override
protected MutableText getNarrationMessage(){
return binding.isUnbound() ? new TranslatableText("narrator.controls.unbound", bindingName) : new TranslatableText("narrator.controls.bound", bindingName, super.getNarrationMessage());
return Key.isUnbound(binding) ? new TranslatableText("narrator.controls.unbound", bindingName) : new TranslatableText("narrator.controls.bound", bindingName, super.getNarrationMessage());
}
@Override
@ -52,11 +53,11 @@ public final class KeyBindingWidget extends ButtonWidget{
}
public void bindAndStopEditing(final InputUtil.Key key){
binding.setBoundKey(key);
Key.bind(binding, key);
stopEditing();
for(final AbstractButtonWidget button : linkedButtons){
button.active = !binding.isUnbound();
button.active = !Key.isUnbound(binding);
}
}
@ -68,22 +69,23 @@ public final class KeyBindingWidget extends ButtonWidget{
public void updateKeyBindingText(){
boolean hasConflict = false;
if (!binding.isUnbound()){
for(final KeyBinding other : MinecraftClient.getInstance().options.keysAll){
if (!Key.isUnbound(binding)){
for(final KeyBinding other : OPTIONS.keysAll){
if (binding != other && binding.equals(other)){
hasConflict = true;
break;
}
}
}
if (isEditing){
setMessage((new LiteralText("> ")).append(binding.getBoundKeyLocalizedText().shallowCopy().formatted(Formatting.YELLOW)).append(" <").formatted(Formatting.YELLOW));
setMessage((new LiteralText("> ")).append(Key.getBoundKeyText(binding).copy().formatted(Formatting.YELLOW)).append(" <").formatted(Formatting.YELLOW));
}
else if (hasConflict){
setMessage(binding.getBoundKeyLocalizedText().shallowCopy().formatted(Formatting.RED));
setMessage(Key.getBoundKeyText(binding).copy().formatted(Formatting.RED));
}
else{
setMessage(binding.isUnbound() ? Text.of("(No Binding)") : binding.getBoundKeyLocalizedText());
setMessage(Key.isUnbound(binding) ? Text.of("(No Binding)") : Key.getBoundKeyText(binding));
}
}
}

View File

@ -1,13 +1,13 @@
package chylex.bettercontrols.gui.elements;
import net.minecraft.text.Text;
import chylex.bettercontrols.util.LiteralText;
import java.util.List;
import java.util.Objects;
public final class Option<T>{
private final T value;
private final Text text;
private final LiteralText text;
public Option(final T value, final Text text){
public Option(final T value, final LiteralText text){
this.value = value;
this.text = text;
}
@ -16,7 +16,7 @@ public final class Option<T>{
return value;
}
public Text getText(){
public LiteralText getText(){
return text;
}

View File

@ -1,25 +1,25 @@
package chylex.bettercontrols.gui.elements;
import chylex.bettercontrols.gui.OptionListWidget.Widget;
import net.minecraft.client.MinecraftClient;
import chylex.bettercontrols.util.LiteralText;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.OrderedText;
import net.minecraft.text.Text;
import java.util.List;
import static chylex.bettercontrols.util.Statics.MINECRAFT;
public final class TextWidget extends DrawableHelper implements Widget{
public static final int LEFT = 0;
public static final int CENTER = 1;
private final Text text;
private final LiteralText text;
private int x;
private int y;
private final int width;
private final int height;
private final int align;
public TextWidget(final int x, final int y, final int width, final int height, final Text text, final int align){
public TextWidget(final int x, final int y, final int width, final int height, final LiteralText text, final int align){
this.x = x;
this.y = y;
this.width = width;
@ -28,11 +28,11 @@ public final class TextWidget extends DrawableHelper implements Widget{
this.align = align;
}
public TextWidget(final int x, final int y, final int width, final Text text, final int align){
public TextWidget(final int x, final int y, final int width, final LiteralText text, final int align){
this(x, y, width, 20, text, align);
}
public TextWidget(final int x, final int y, final int width, final Text text){
public TextWidget(final int x, final int y, final int width, final LiteralText text){
this(x, y, width, 20, text, LEFT);
}
@ -58,7 +58,7 @@ public final class TextWidget extends DrawableHelper implements Widget{
@Override
public void render(final MatrixStack matrices, final int mouseX, final int mouseY, final float delta){
final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
final TextRenderer textRenderer = MINECRAFT.textRenderer;
final List<OrderedText> lines = textRenderer.wrapLines(text, width);
final int lineHeight = textRenderer.fontHeight + 1;

View File

@ -19,11 +19,12 @@ public class KeyBindingWithModifier extends KeyBinding{
super(translationKey, Type.KEYSYM, -1, CATEGORY);
}
public void setModifier(final @Nullable ModifierKey modifier){
public void setModifier(@Nullable final ModifierKey modifier){
this.modifier = modifier;
}
public @Nullable ModifierKey getModifier(){
@Nullable
public ModifierKey getModifier(){
return modifier;
}

View File

@ -1,4 +1,5 @@
package chylex.bettercontrols.input;
import chylex.bettercontrols.util.Key;
import net.minecraft.client.options.KeyBinding;
public class ToggleTracker{
@ -43,7 +44,7 @@ public class ToggleTracker{
public boolean tick(){
final boolean isHoldingReset = isResetKeyPressed();
if (bindingToggle.isPressed()){
if (Key.isPressed(bindingToggle)){
if (!waitForRelease){
if (skipNextToggle){
skipNextToggle = false;
@ -78,7 +79,7 @@ public class ToggleTracker{
}
protected boolean isResetKeyPressed(){
return bindingReset.isPressed();
return Key.isPressed(bindingReset);
}
public void reset(){

View File

@ -1,12 +1,12 @@
package chylex.bettercontrols.mixin;
import chylex.bettercontrols.player.PlayerTicker;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.input.KeyboardInput;
import net.minecraft.client.network.ClientPlayerEntity;
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.CallbackInfo;
import static chylex.bettercontrols.util.Statics.MINECRAFT;
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
@Mixin(KeyboardInput.class)
@ -14,7 +14,7 @@ public abstract class HookClientPlayerInputTick{
@Inject(method = "tick(Z)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/input/KeyboardInput;pressingForward:Z", ordinal = 0, shift = AFTER))
private void afterInputTick(final CallbackInfo info){
final KeyboardInput input = (KeyboardInput)(Object)this;
final ClientPlayerEntity player = MinecraftClient.getInstance().player;
final ClientPlayerEntity player = MINECRAFT.player;
if (player != null){
PlayerTicker.get(player).afterInputAssignsPressingForward(input);

View File

@ -8,13 +8,13 @@ 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.CallbackInfo;
import static chylex.bettercontrols.util.Statics.MINECRAFT;
@Mixin(value = MinecraftClient.class, priority = 100)
public abstract class HookOpenScreen{
@Inject(method = "openScreen(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("TAIL"))
private void openScreen(final Screen ignore, final CallbackInfo ci){
final MinecraftClient mc = MinecraftClient.getInstance();
final Screen screen = mc.currentScreen;
final Screen screen = MINECRAFT.currentScreen;
if (screen != null && !Screen.hasAltDown()){
if (screen.getClass() == ControlsOptionsScreen.class){

View File

@ -9,13 +9,18 @@ import chylex.bettercontrols.mixin.AccessCameraFields;
import chylex.bettercontrols.mixin.AccessClientPlayerFields;
import chylex.bettercontrols.mixin.AccessGameRendererFields;
import chylex.bettercontrols.mixin.AccessStickyKeyBindingStateGetter;
import net.minecraft.client.MinecraftClient;
import chylex.bettercontrols.util.Key;
import net.minecraft.client.input.KeyboardInput;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.options.GameOptions;
import net.minecraft.util.math.MathHelper;
import java.lang.ref.WeakReference;
import java.util.function.BooleanSupplier;
import static chylex.bettercontrols.util.Statics.KEY_FORWARD;
import static chylex.bettercontrols.util.Statics.KEY_JUMP;
import static chylex.bettercontrols.util.Statics.KEY_SNEAK;
import static chylex.bettercontrols.util.Statics.KEY_SPRINT;
import static chylex.bettercontrols.util.Statics.MINECRAFT;
import static chylex.bettercontrols.util.Statics.OPTIONS;
public final class PlayerTicker{
private static PlayerTicker ticker = new PlayerTicker(null);
@ -28,10 +33,6 @@ public final class PlayerTicker{
return ticker;
}
private static MinecraftClient mc(){
return MinecraftClient.getInstance();
}
private static BetterControlsConfig cfg(){
return BetterControlsMod.config;
}
@ -45,10 +46,10 @@ public final class PlayerTicker{
// Logic
private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(cfg().keyToggleSprint, mc().options.keySprint, toggled -> mc().options.sprintToggled = toggled);
private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(cfg().keyToggleSneak, mc().options.keySneak, toggled -> mc().options.sneakToggled = toggled);
private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, mc().options.keyForward);
private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, mc().options.keyJump);
private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(cfg().keyToggleSprint, KEY_SPRINT, toggled -> OPTIONS.sprintToggled = toggled);
private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(cfg().keyToggleSneak, KEY_SNEAK, toggled -> OPTIONS.sneakToggled = toggled);
private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, KEY_FORWARD);
private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, KEY_JUMP);
private boolean waitingForSprintKeyRelease = false;
private boolean stopSprintingAfterReleasingSprintKey = false;
@ -62,7 +63,7 @@ public final class PlayerTicker{
private int temporaryFlyOnGroundTimer = 0;
private void setup(){
final AccessStickyKeyBindingStateGetter sprint = (AccessStickyKeyBindingStateGetter)mc().options.keySprint;
final AccessStickyKeyBindingStateGetter sprint = (AccessStickyKeyBindingStateGetter)KEY_SPRINT;
BooleanSupplier getter = sprint.getToggleGetter();
if (getter instanceof SprintPressGetter){
@ -90,8 +91,7 @@ public final class PlayerTicker{
sprintMode = cfg().sprintMode;
}
final GameOptions opts = mc().options;
final boolean wasSprintToggled = opts.sprintToggled;
final boolean wasSprintToggled = OPTIONS.sprintToggled;
final boolean isSprintToggled = toggleSprint.tick();
if (temporarySprintTimer > 0){
@ -101,7 +101,7 @@ public final class PlayerTicker{
final int nextTemporarySprintTimer = temporarySprintTimer - 1;
temporarySprintTimer = 0;
if (!opts.keySprint.isPressed() && opts.keyForward.isPressed()){
if (!Key.isPressed(KEY_SPRINT) && Key.isPressed(KEY_FORWARD)){
temporarySprintTimer = nextTemporarySprintTimer;
}
else if (sprintMode == SprintMode.TAP_TO_TOGGLE){
@ -118,7 +118,7 @@ public final class PlayerTicker{
waitingForSprintKeyRelease = true;
}
else if (sprintMode == SprintMode.TAP_TO_TOGGLE){
if (opts.keySprint.isPressed()){
if (Key.isPressed(KEY_SPRINT)){
if (!waitingForSprintKeyRelease){
waitingForSprintKeyRelease = true;
stopSprintingAfterReleasingSprintKey = player.isSprinting();
@ -133,12 +133,12 @@ public final class PlayerTicker{
}
}
else if (sprintMode == SprintMode.HOLD){
if (opts.keySprint.isPressed()){
if (Key.isPressed(KEY_SPRINT)){
stopSprintingAfterReleasingSprintKey = true;
}
}
if (stopSprintingAfterReleasingSprintKey && !opts.keySprint.isPressed()){
if (stopSprintingAfterReleasingSprintKey && !Key.isPressed(KEY_SPRINT)){
stopSprintingAfterReleasingSprintKey = false;
waitingForSprintKeyRelease = false;
player.setSprinting(false);
@ -148,13 +148,13 @@ public final class PlayerTicker{
}
public void afterInputAssignsPressingForward(final KeyboardInput input){
if (mc().currentScreen == null){
if (MINECRAFT.currentScreen == null){
input.pressingForward |= toggleWalkForward.tick();
}
}
public void afterInputTick(final ClientPlayerEntity player){
if (mc().currentScreen == null && !player.abilities.flying){
if (MINECRAFT.currentScreen == null && !player.abilities.flying){
player.input.jumping |= toggleJump.tick();
}
@ -167,7 +167,7 @@ public final class PlayerTicker{
final float verticalVelocity = FlightHelper.getExtraVerticalVelocity(player);
if (!MathHelper.approximatelyEquals(verticalVelocity, 0F) && player == mc().getCameraEntity()){
if (!MathHelper.approximatelyEquals(verticalVelocity, 0F) && player == MINECRAFT.getCameraEntity()){
int direction = 0;
if (player.input.sneaking){
@ -187,7 +187,7 @@ public final class PlayerTicker{
if (cfg().resumeSprintingAfterHittingObstacle){
if (wasHittingObstacle != player.horizontalCollision){
if (!wasHittingObstacle){
wasSprintingBeforeHittingObstacle = player.isSprinting() || mc().options.keySprint.isPressed();
wasSprintingBeforeHittingObstacle = player.isSprinting() || Key.isPressed(KEY_SPRINT);
}
else if (wasSprintingBeforeHittingObstacle){
wasSprintingBeforeHittingObstacle = false;
@ -204,7 +204,7 @@ public final class PlayerTicker{
}
if (cfg().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player)){
((AccessGameRendererFields)mc().gameRenderer).setMovementFovMultiplier(1F);
((AccessGameRendererFields)MINECRAFT.gameRenderer).setMovementFovMultiplier(1F);
}
}
@ -248,7 +248,7 @@ public final class PlayerTicker{
}
if (player.isCreative()){
if (cfg().keyToggleFlight.wasPressed()){
if (Key.wasPressed(cfg().keyToggleFlight)){
final boolean isFlying = !player.abilities.flying;
player.abilities.flying = isFlying;
@ -274,22 +274,22 @@ public final class PlayerTicker{
}
if (!cfg().sneakingMovesCameraSmoothly){
final AccessCameraFields camera = (AccessCameraFields)mc().gameRenderer.getCamera();
final AccessCameraFields camera = (AccessCameraFields)MINECRAFT.gameRenderer.getCamera();
if (camera.getFocusedEntity() == player){
camera.setCameraY(player.getStandingEyeHeight());
}
}
if (cfg().keyResetAllToggles.wasPressed()){
if (Key.wasPressed(cfg().keyResetAllToggles)){
toggleSprint.reset();
toggleSneak.reset();
toggleWalkForward.reset();
toggleJump.reset();
}
if (cfg().keyOpenMenu.isPressed()){
mc().openScreen(new BetterControlsScreen(null));
if (Key.isPressed(cfg().keyOpenMenu)){
MINECRAFT.openScreen(new BetterControlsScreen(null));
}
}
}

View File

@ -0,0 +1,46 @@
package chylex.bettercontrols.util;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.text.Text;
public final class Key{
private Key(){}
public static final InputUtil.Key INVALID = InputUtil.UNKNOWN_KEY;
public static boolean isUnbound(final KeyBinding binding){
return binding.isUnbound();
}
public static boolean isPressed(final KeyBinding binding){
return binding.isPressed();
}
public static boolean wasPressed(final KeyBinding binding){
return binding.wasPressed();
}
public static Text getBoundKeyText(final KeyBinding binding){
return binding.getBoundKeyLocalizedText();
}
public static void bind(final KeyBinding binding, final InputUtil.Key input){
binding.setBoundKey(input);
}
public static String writeBinding(final KeyBinding binding){
return binding.getTranslationKey();
}
public static void readBinding(final KeyBinding binding, final String serialized){
bind(binding, InputUtil.fromTranslationKey(serialized));
}
public static InputUtil.Key inputFromMouse(final int button){
return InputUtil.Type.MOUSE.createFromCode(button);
}
public static InputUtil.Key inputFromKeyboard(final int keyCode, final int scanCode){
return InputUtil.fromKeyCode(keyCode, scanCode);
}
}

View File

@ -0,0 +1,11 @@
package chylex.bettercontrols.util;
public final class LiteralText extends net.minecraft.text.LiteralText{
public static LiteralText text(final String text){
return new LiteralText(text);
}
public LiteralText(final String msg){
super(msg);
}
}

View File

@ -0,0 +1,16 @@
package chylex.bettercontrols.util;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.options.GameOptions;
import net.minecraft.client.options.KeyBinding;
public final class Statics{
private Statics(){}
public static final MinecraftClient MINECRAFT = MinecraftClient.getInstance();
public static final GameOptions OPTIONS = MINECRAFT.options;
public static final KeyBinding KEY_SPRINT = OPTIONS.keySprint;
public static final KeyBinding KEY_SNEAK = OPTIONS.keySneak;
public static final KeyBinding KEY_FORWARD = OPTIONS.keyForward;
public static final KeyBinding KEY_JUMP = OPTIONS.keyJump;
}