Эх сурвалжийг харах

Refactor code to make porting easier

chylex 4 жил өмнө
parent
commit
0c2eb63a24

+ 2 - 3
src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java

@@ -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,

+ 3 - 11
src/main/java/chylex/bettercontrols/config/Json.java

@@ -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)){

+ 59 - 59
src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java

@@ -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)));

+ 2 - 12
src/main/java/chylex/bettercontrols/gui/OptionListWidget.java

@@ -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));
 	}
 	

+ 18 - 13
src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java

@@ -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);
+			}
+		}
 	}
 }

+ 12 - 10
src/main/java/chylex/bettercontrols/gui/elements/KeyBindingWidget.java

@@ -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));
 		}
 	}
 }

+ 4 - 4
src/main/java/chylex/bettercontrols/gui/elements/Option.java

@@ -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;
 	}
 	

+ 7 - 7
src/main/java/chylex/bettercontrols/gui/elements/TextWidget.java

@@ -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;
 		

+ 3 - 2
src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java

@@ -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;
 	}
 	

+ 3 - 2
src/main/java/chylex/bettercontrols/input/ToggleTracker.java

@@ -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(){

+ 2 - 2
src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java

@@ -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);

+ 2 - 2
src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java

@@ -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){

+ 27 - 27
src/main/java/chylex/bettercontrols/player/PlayerTicker.java

@@ -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));
 		}
 	}
 }

+ 46 - 0
src/main/java/chylex/bettercontrols/util/Key.java

@@ -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);
+	}
+}

+ 11 - 0
src/main/java/chylex/bettercontrols/util/LiteralText.java

@@ -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);
+	}
+}

+ 16 - 0
src/main/java/chylex/bettercontrols/util/Statics.java

@@ -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;
+}