From fd391e81a03f79d8c7b1dd49b10ef4de59572d47 Mon Sep 17 00:00:00 2001
From: chylex <contact@chylex.com>
Date: Sat, 2 Oct 2021 15:03:26 +0200
Subject: [PATCH] Remove some utility classes & unify with Fabric codebase

---
 .../config/BetterControlsConfig.java          |  2 +-
 .../chylex/bettercontrols/config/Json.java    | 10 ++--
 .../gui/BetterControlsScreen.java             | 22 +++++----
 .../gui/elements/KeyBindingWidget.java        | 22 ++++-----
 .../bettercontrols/gui/elements/Option.java   |  8 ++--
 .../gui/elements/TextWidget.java              | 10 ++--
 .../bettercontrols/input/ModifierKey.java     | 12 ++---
 .../bettercontrols/input/ToggleTracker.java   |  5 +-
 .../bettercontrols/player/PlayerTicker.java   | 19 ++++----
 .../java/chylex/bettercontrols/util/Key.java  | 46 -------------------
 .../bettercontrols/util/LiteralText.java      | 12 -----
 src/main/resources/bettercontrols.mixins.json |  2 +-
 12 files changed, 58 insertions(+), 112 deletions(-)
 delete mode 100644 src/main/java/chylex/bettercontrols/util/Key.java
 delete mode 100644 src/main/java/chylex/bettercontrols/util/LiteralText.java

diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
index 248ac50..8aeea7c 100644
--- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
+++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
@@ -45,7 +45,7 @@ public final class BetterControlsConfig {
 	}
 	
 	public KeyBindingWithModifier[] getAllKeyBindings() {
-		return new KeyBindingWithModifier[]{
+		return new KeyBindingWithModifier[] {
 			keyToggleSprint,
 			keyToggleSneak,
 			keyToggleFlight,
diff --git a/src/main/java/chylex/bettercontrols/config/Json.java b/src/main/java/chylex/bettercontrols/config/Json.java
index 210bfca..739a0ce 100644
--- a/src/main/java/chylex/bettercontrols/config/Json.java
+++ b/src/main/java/chylex/bettercontrols/config/Json.java
@@ -1,8 +1,8 @@
 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 com.mojang.blaze3d.platform.InputConstants;
 
 final class Json {
 	private Json() {}
@@ -52,7 +52,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, Key.writeBinding(keyBinding));
+		obj.addProperty(key + KEY_SUFFIX, keyBinding.saveString());
 		
 		if (keyBinding.getModifier() != null) {
 			obj.addProperty(key + MOD_SUFFIX, Integer.valueOf(keyBinding.getModifier().id));
@@ -61,7 +61,11 @@ final class Json {
 	
 	static void readKeyBinding(final JsonObject obj, final String key, final KeyBindingWithModifier keyBinding) {
 		if (obj.has(key + KEY_SUFFIX)) {
-			Key.readBinding(keyBinding, obj.get(key + KEY_SUFFIX).getAsString());
+			try {
+				keyBinding.setKey(InputConstants.getKey(obj.get(key + KEY_SUFFIX).getAsString()));
+			} catch (final IllegalArgumentException e) {
+				e.printStackTrace(); // let's not crash if the config file has garbage, okay?
+			}
 		}
 		
 		if (obj.has(key + MOD_SUFFIX)) {
diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
index d68a7a0..6d173f8 100644
--- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
@@ -10,8 +10,7 @@ import chylex.bettercontrols.gui.elements.TextWidget;
 import chylex.bettercontrols.input.KeyBindingWithModifier;
 import chylex.bettercontrols.input.ModifierKey;
 import chylex.bettercontrols.input.SprintMode;
-import chylex.bettercontrols.util.Key;
-import chylex.bettercontrols.util.LiteralText;
+import com.mojang.blaze3d.platform.InputConstants;
 import com.mojang.blaze3d.vertex.PoseStack;
 import net.minecraft.client.KeyMapping;
 import net.minecraft.client.gui.components.Button;
@@ -19,6 +18,8 @@ import net.minecraft.client.gui.components.events.GuiEventListener;
 import net.minecraft.client.gui.screens.OptionsSubScreen;
 import net.minecraft.client.gui.screens.Screen;
 import net.minecraft.network.chat.CommonComponents;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.TextComponent;
 import org.lwjgl.glfw.GLFW;
 import javax.annotation.Nullable;
 import java.util.ArrayList;
@@ -30,11 +31,14 @@ 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 OptionsSubScreen {
-	public static final LiteralText TITLE = text("Better Controls");
+	private static TextComponent text(final String text) {
+		return new TextComponent(text);
+	}
+	
+	public static final Component TITLE = text("Better Controls");
 	
 	private static final int BOTTOM_PADDING = 3;
 	private static final int TEXT_PADDING_RIGHT = 4;
@@ -203,7 +207,7 @@ public class BetterControlsScreen extends OptionsSubScreen {
 		new Option<>(ModifierKey.ALT, text("Alt"))
 	);
 	
-	private void generateKeyBindingWithModifierOption(final int y, final List<GuiEventListener> elements, final LiteralText text, final KeyBindingWithModifier binding) {
+	private void generateKeyBindingWithModifierOption(final int y, final List<GuiEventListener> elements, final Component 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, text, binding, this::startEditingKeyBinding);
 		bindingButton.linkButtonToBoundState(modifierButton);
@@ -214,7 +218,7 @@ public class BetterControlsScreen extends OptionsSubScreen {
 		allKeyBindings.add(bindingButton);
 	}
 	
-	private static void generateLeftSideText(final int y, final List<GuiEventListener> elements, final LiteralText text) {
+	private static void generateLeftSideText(final int y, final List<GuiEventListener> elements, final Component text) {
 		elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text));
 	}
 	
@@ -275,7 +279,7 @@ public class BetterControlsScreen extends OptionsSubScreen {
 	@Override
 	public boolean mouseClicked(final double mouseX, final double mouseY, final int button) {
 		if (editingKeyBinding != null) {
-			editingKeyBinding.bindAndStopEditing(Key.inputFromMouse(button));
+			editingKeyBinding.bindAndStopEditing(InputConstants.Type.MOUSE.getOrCreate(button));
 			onKeyBindingEditingFinished();
 			return true;
 		}
@@ -288,10 +292,10 @@ public class BetterControlsScreen extends OptionsSubScreen {
 	public boolean keyPressed(final int keyCode, final int scanCode, final int modifiers) {
 		if (editingKeyBinding != null) {
 			if (keyCode == GLFW.GLFW_KEY_ESCAPE) {
-				editingKeyBinding.bindAndStopEditing(Key.INVALID);
+				editingKeyBinding.bindAndStopEditing(InputConstants.UNKNOWN);
 			}
 			else {
-				editingKeyBinding.bindAndStopEditing(Key.inputFromKeyboard(keyCode, scanCode));
+				editingKeyBinding.bindAndStopEditing(InputConstants.getKey(keyCode, scanCode));
 			}
 			
 			onKeyBindingEditingFinished();
diff --git a/src/main/java/chylex/bettercontrols/gui/elements/KeyBindingWidget.java b/src/main/java/chylex/bettercontrols/gui/elements/KeyBindingWidget.java
index 848b45b..287016b 100644
--- a/src/main/java/chylex/bettercontrols/gui/elements/KeyBindingWidget.java
+++ b/src/main/java/chylex/bettercontrols/gui/elements/KeyBindingWidget.java
@@ -1,6 +1,4 @@
 package chylex.bettercontrols.gui.elements;
-import chylex.bettercontrols.util.Key;
-import chylex.bettercontrols.util.LiteralText;
 import com.mojang.blaze3d.platform.InputConstants;
 import net.minecraft.ChatFormatting;
 import net.minecraft.client.KeyMapping;
@@ -24,7 +22,7 @@ public final class KeyBindingWidget extends Button {
 	private final Consumer<KeyBindingWidget> onEditingStarted;
 	private boolean isEditing;
 	
-	public KeyBindingWidget(final int x, final int y, final int width, final int height, final LiteralText bindingName, final KeyMapping binding, final Consumer<KeyBindingWidget> onEditingStarted) {
+	public KeyBindingWidget(final int x, final int y, final int width, final int height, final Component bindingName, final KeyMapping binding, final Consumer<KeyBindingWidget> onEditingStarted) {
 		super(x, y, width, height, TextComponent.EMPTY, btn -> {});
 		this.binding = binding;
 		this.bindingName = bindingName;
@@ -32,18 +30,18 @@ public final class KeyBindingWidget extends Button {
 		updateKeyBindingText();
 	}
 	
-	public KeyBindingWidget(final int x, final int y, final int width, final LiteralText bindingName, final KeyMapping binding, final Consumer<KeyBindingWidget> onEditingStarted) {
+	public KeyBindingWidget(final int x, final int y, final int width, final Component bindingName, final KeyMapping binding, final Consumer<KeyBindingWidget> onEditingStarted) {
 		this(x, y, width, 20, bindingName, binding, onEditingStarted);
 	}
 	
 	public void linkButtonToBoundState(final AbstractButton button) {
 		linkedButtons.add(button);
-		button.active = !Key.isUnbound(binding);
+		button.active = !binding.isUnbound();
 	}
 	
 	@Override
 	protected MutableComponent createNarrationMessage() {
-		return Key.isUnbound(binding) ? new TranslatableComponent("narrator.controls.unbound", bindingName) : new TranslatableComponent("narrator.controls.bound", bindingName, super.createNarrationMessage());
+		return binding.isUnbound() ? new TranslatableComponent("narrator.controls.unbound", bindingName) : new TranslatableComponent("narrator.controls.bound", bindingName, super.createNarrationMessage());
 	}
 	
 	@Override
@@ -54,11 +52,11 @@ public final class KeyBindingWidget extends Button {
 	}
 	
 	public void bindAndStopEditing(final InputConstants.Key key) {
-		Key.bind(binding, key);
+		binding.setKey(key);
 		stopEditing();
 		
 		for (final AbstractButton button : linkedButtons) {
-			button.active = !Key.isUnbound(binding);
+			button.active = !binding.isUnbound();
 		}
 	}
 	
@@ -70,7 +68,7 @@ public final class KeyBindingWidget extends Button {
 	public void updateKeyBindingText() {
 		boolean hasConflict = false;
 		
-		if (!Key.isUnbound(binding)) {
+		if (!binding.isUnbound()) {
 			for (final KeyMapping other : OPTIONS.keyMappings) {
 				if (binding != other && binding.equals(other)) {
 					hasConflict = true;
@@ -80,13 +78,13 @@ public final class KeyBindingWidget extends Button {
 		}
 		
 		if (isEditing) {
-			setMessage((new TextComponent("> ")).append(Key.getBoundKeyText(binding).copy().withStyle(ChatFormatting.YELLOW)).append(" <").withStyle(ChatFormatting.YELLOW));
+			setMessage((new TextComponent("> ")).append(binding.getTranslatedKeyMessage().copy().withStyle(ChatFormatting.YELLOW)).append(" <").withStyle(ChatFormatting.YELLOW));
 		}
 		else if (hasConflict) {
-			setMessage(Key.getBoundKeyText(binding).copy().withStyle(ChatFormatting.RED));
+			setMessage(binding.getTranslatedKeyMessage().copy().withStyle(ChatFormatting.RED));
 		}
 		else {
-			setMessage(Key.isUnbound(binding) ? new TextComponent("(No Binding)") : Key.getBoundKeyText(binding));
+			setMessage(binding.isUnbound() ? new TextComponent("(No Binding)") : binding.getTranslatedKeyMessage());
 		}
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/gui/elements/Option.java b/src/main/java/chylex/bettercontrols/gui/elements/Option.java
index 9702ea9..0052648 100644
--- a/src/main/java/chylex/bettercontrols/gui/elements/Option.java
+++ b/src/main/java/chylex/bettercontrols/gui/elements/Option.java
@@ -1,13 +1,13 @@
 package chylex.bettercontrols.gui.elements;
-import chylex.bettercontrols.util.LiteralText;
+import net.minecraft.network.chat.Component;
 import java.util.List;
 import java.util.Objects;
 
 public final class Option<T> {
 	private final T value;
-	private final LiteralText text;
+	private final Component text;
 	
-	public Option(final T value, final LiteralText text) {
+	public Option(final T value, final Component text) {
 		this.value = value;
 		this.text = text;
 	}
@@ -16,7 +16,7 @@ public final class Option<T> {
 		return value;
 	}
 	
-	public LiteralText getText() {
+	public Component getText() {
 		return text;
 	}
 	
diff --git a/src/main/java/chylex/bettercontrols/gui/elements/TextWidget.java b/src/main/java/chylex/bettercontrols/gui/elements/TextWidget.java
index 02329e4..58e3ecd 100644
--- a/src/main/java/chylex/bettercontrols/gui/elements/TextWidget.java
+++ b/src/main/java/chylex/bettercontrols/gui/elements/TextWidget.java
@@ -1,9 +1,9 @@
 package chylex.bettercontrols.gui.elements;
 import chylex.bettercontrols.gui.OptionListWidget.OptionWidget;
-import chylex.bettercontrols.util.LiteralText;
 import com.mojang.blaze3d.vertex.PoseStack;
 import net.minecraft.client.gui.Font;
 import net.minecraft.client.gui.GuiComponent;
+import net.minecraft.network.chat.Component;
 import net.minecraft.util.FormattedCharSequence;
 import java.util.List;
 import static chylex.bettercontrols.util.Statics.MINECRAFT;
@@ -12,14 +12,14 @@ public final class TextWidget extends GuiComponent implements OptionWidget {
 	public static final int LEFT = 0;
 	public static final int CENTER = 1;
 	
-	private final LiteralText text;
+	private final Component 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 LiteralText text, final int align) {
+	public TextWidget(final int x, final int y, final int width, final int height, final Component text, final int align) {
 		this.x = x;
 		this.y = y;
 		this.width = width;
@@ -28,11 +28,11 @@ public final class TextWidget extends GuiComponent implements OptionWidget {
 		this.align = align;
 	}
 	
-	public TextWidget(final int x, final int y, final int width, final LiteralText text, final int align) {
+	public TextWidget(final int x, final int y, final int width, final Component text, final int align) {
 		this(x, y, width, 20, text, align);
 	}
 	
-	public TextWidget(final int x, final int y, final int width, final LiteralText text) {
+	public TextWidget(final int x, final int y, final int width, final Component text) {
 		this(x, y, width, 20, text, LEFT);
 	}
 	
diff --git a/src/main/java/chylex/bettercontrols/input/ModifierKey.java b/src/main/java/chylex/bettercontrols/input/ModifierKey.java
index 882025e..41c6f06 100644
--- a/src/main/java/chylex/bettercontrols/input/ModifierKey.java
+++ b/src/main/java/chylex/bettercontrols/input/ModifierKey.java
@@ -32,11 +32,11 @@ public enum ModifierKey {
 	public abstract boolean isPressed();
 	
 	public static ModifierKey getById(final int id) {
-		switch (id) {
-			case 0: return CONTROL;
-			case 1: return SHIFT;
-			case 2: return ALT;
-			default: return null;
-		}
+		return switch (id) {
+			case 0 -> CONTROL;
+			case 1 -> SHIFT;
+			case 2 -> ALT;
+			default -> null;
+		};
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/input/ToggleTracker.java b/src/main/java/chylex/bettercontrols/input/ToggleTracker.java
index 6e39711..f497a76 100644
--- a/src/main/java/chylex/bettercontrols/input/ToggleTracker.java
+++ b/src/main/java/chylex/bettercontrols/input/ToggleTracker.java
@@ -1,5 +1,4 @@
 package chylex.bettercontrols.input;
-import chylex.bettercontrols.util.Key;
 import net.minecraft.client.KeyMapping;
 
 public class ToggleTracker {
@@ -44,7 +43,7 @@ public class ToggleTracker {
 	public boolean tick() {
 		final boolean isHoldingReset = isResetKeyPressed();
 		
-		if (Key.isPressed(bindingToggle)) {
+		if (bindingToggle.isDown()) {
 			if (!waitForRelease) {
 				if (skipNextToggle) {
 					skipNextToggle = false;
@@ -79,7 +78,7 @@ public class ToggleTracker {
 	}
 	
 	protected boolean isResetKeyPressed() {
-		return Key.isPressed(bindingReset);
+		return bindingReset.isDown();
 	}
 	
 	public void reset() {
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index cf1d494..ff3b226 100644
--- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
+++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
@@ -9,7 +9,6 @@ import chylex.bettercontrols.mixin.AccessCameraFields;
 import chylex.bettercontrols.mixin.AccessClientPlayerFields;
 import chylex.bettercontrols.mixin.AccessPlayerFields;
 import chylex.bettercontrols.mixin.AccessStickyKeyBindingStateGetter;
-import chylex.bettercontrols.util.Key;
 import net.minecraft.client.Camera;
 import net.minecraft.client.player.Input;
 import net.minecraft.client.player.LocalPlayer;
@@ -97,7 +96,7 @@ public final class PlayerTicker {
 			final int nextTemporarySprintTimer = temporarySprintTimer - 1;
 			temporarySprintTimer = 0;
 			
-			if (!Key.isPressed(KEY_SPRINT) && Key.isPressed(KEY_FORWARD)) {
+			if (!KEY_SPRINT.isDown() && KEY_FORWARD.isDown()) {
 				temporarySprintTimer = nextTemporarySprintTimer;
 			}
 			else if (sprintMode == SprintMode.TAP_TO_TOGGLE) {
@@ -114,7 +113,7 @@ public final class PlayerTicker {
 			waitingForSprintKeyRelease = true;
 		}
 		else if (sprintMode == SprintMode.TAP_TO_TOGGLE) {
-			if (Key.isPressed(KEY_SPRINT)) {
+			if (KEY_SPRINT.isDown()) {
 				if (!waitingForSprintKeyRelease) {
 					waitingForSprintKeyRelease = true;
 					stopSprintingAfterReleasingSprintKey = player.isSprinting();
@@ -129,12 +128,12 @@ public final class PlayerTicker {
 			}
 		}
 		else if (sprintMode == SprintMode.HOLD) {
-			if (Key.isPressed(KEY_SPRINT)) {
+			if (KEY_SPRINT.isDown()) {
 				stopSprintingAfterReleasingSprintKey = true;
 			}
 		}
 		
-		if (stopSprintingAfterReleasingSprintKey && !Key.isPressed(KEY_SPRINT)) {
+		if (stopSprintingAfterReleasingSprintKey && !KEY_SPRINT.isDown()) {
 			stopSprintingAfterReleasingSprintKey = false;
 			waitingForSprintKeyRelease = false;
 			player.setSprinting(false);
@@ -157,7 +156,7 @@ public final class PlayerTicker {
 		}
 		
 		if (FlightHelper.isFlyingCreativeOrSpectator(player)) {
-			final boolean boost = Key.isPressed(KEY_SPRINT);
+			final boolean boost = KEY_SPRINT.isDown();
 			final float flightSpeed = FlightHelper.getFlightSpeed(player, boost);
 			final float verticalVelocity = FlightHelper.getExtraVerticalVelocity(player, boost);
 			
@@ -185,7 +184,7 @@ public final class PlayerTicker {
 		if (cfg().resumeSprintingAfterHittingObstacle) {
 			if (wasHittingObstacle != player.horizontalCollision) {
 				if (!wasHittingObstacle) {
-					wasSprintingBeforeHittingObstacle = player.isSprinting() || Key.isPressed(KEY_SPRINT);
+					wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown();
 				}
 				else if (wasSprintingBeforeHittingObstacle) {
 					wasSprintingBeforeHittingObstacle = false;
@@ -254,7 +253,7 @@ public final class PlayerTicker {
 		}
 		
 		if (player.isCreative()) {
-			if (Key.wasPressed(cfg().keyToggleFlight)) {
+			if (cfg().keyToggleFlight.consumeClick()) {
 				final boolean isFlying = !player.getAbilities().flying;
 				
 				player.getAbilities().flying = isFlying;
@@ -287,14 +286,14 @@ public final class PlayerTicker {
 			}
 		}
 		
-		if (Key.wasPressed(cfg().keyResetAllToggles)) {
+		if (cfg().keyResetAllToggles.consumeClick()) {
 			toggleSprint.reset();
 			toggleSneak.reset();
 			toggleWalkForward.reset();
 			toggleJump.reset();
 		}
 		
-		if (Key.isPressed(cfg().keyOpenMenu)) {
+		if (cfg().keyOpenMenu.isDown()) {
 			MINECRAFT.setScreen(new BetterControlsScreen(null));
 		}
 	}
diff --git a/src/main/java/chylex/bettercontrols/util/Key.java b/src/main/java/chylex/bettercontrols/util/Key.java
deleted file mode 100644
index 0240f20..0000000
--- a/src/main/java/chylex/bettercontrols/util/Key.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package chylex.bettercontrols.util;
-import com.mojang.blaze3d.platform.InputConstants;
-import net.minecraft.client.KeyMapping;
-import net.minecraft.network.chat.Component;
-
-public final class Key {
-	private Key() {}
-	
-	public static final InputConstants.Key INVALID = InputConstants.UNKNOWN;
-	
-	public static boolean isUnbound(final KeyMapping binding) {
-		return binding.isUnbound();
-	}
-	
-	public static boolean isPressed(final KeyMapping binding) {
-		return binding.isDown();
-	}
-	
-	public static boolean wasPressed(final KeyMapping binding) {
-		return binding.consumeClick();
-	}
-	
-	public static Component getBoundKeyText(final KeyMapping binding) {
-		return binding.getTranslatedKeyMessage();
-	}
-	
-	public static void bind(final KeyMapping binding, final InputConstants.Key input) {
-		binding.setKey(input);
-	}
-	
-	public static String writeBinding(final KeyMapping binding) {
-		return binding.saveString();
-	}
-	
-	public static void readBinding(final KeyMapping binding, final String serialized) {
-		bind(binding, InputConstants.getKey(serialized));
-	}
-	
-	public static InputConstants.Key inputFromMouse(final int button) {
-		return InputConstants.Type.MOUSE.getOrCreate(button);
-	}
-	
-	public static InputConstants.Key inputFromKeyboard(final int keyCode, final int scanCode) {
-		return InputConstants.getKey(keyCode, scanCode);
-	}
-}
diff --git a/src/main/java/chylex/bettercontrols/util/LiteralText.java b/src/main/java/chylex/bettercontrols/util/LiteralText.java
deleted file mode 100644
index 10f70c1..0000000
--- a/src/main/java/chylex/bettercontrols/util/LiteralText.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package chylex.bettercontrols.util;
-import net.minecraft.network.chat.TextComponent;
-
-public final class LiteralText extends TextComponent {
-	public static LiteralText text(final String text) {
-		return new LiteralText(text);
-	}
-	
-	public LiteralText(final String msg) {
-		super(msg);
-	}
-}
diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json
index 041af30..466efa4 100644
--- a/src/main/resources/bettercontrols.mixins.json
+++ b/src/main/resources/bettercontrols.mixins.json
@@ -2,7 +2,7 @@
   "required": true,
   "minVersion": "0.8",
   "package": "chylex.bettercontrols.mixin",
-  "compatibilityLevel": "JAVA_8",
+  "compatibilityLevel": "JAVA_16",
   "client": [
     "AccessCameraFields",
     "AccessClientPlayerFields",