diff --git a/src/main/java/chylex/bettercontrols/Mixins.java b/src/main/java/chylex/bettercontrols/Mixins.java new file mode 100644 index 0000000..f905a6c --- /dev/null +++ b/src/main/java/chylex/bettercontrols/Mixins.java @@ -0,0 +1,42 @@ +package chylex.bettercontrols; + +import chylex.bettercontrols.mixin.AccessCameraFields; +import chylex.bettercontrols.mixin.AccessClientPlayerFields; +import chylex.bettercontrols.mixin.AccessKeyMappingFields; +import chylex.bettercontrols.mixin.AccessPlayerFields; +import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields; +import net.minecraft.client.Camera; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.ToggleKeyMapping; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.player.Player; + +@SuppressWarnings("CastToIncompatibleInterface") +public final class Mixins { + private Mixins() {} + + @SuppressWarnings("unchecked") + public static <T> T me(Object object) { + return (T) object; + } + + public static AccessCameraFields cameraFields(Camera camera) { + return (AccessCameraFields) camera; + } + + public static AccessClientPlayerFields clientPlayerFields(LocalPlayer localPlayer) { + return (AccessClientPlayerFields) localPlayer; + } + + public static AccessKeyMappingFields keyMappingFields(KeyMapping keyMapping) { + return (AccessKeyMappingFields) keyMapping; + } + + public static AccessPlayerFields playerFields(Player player) { + return (AccessPlayerFields) player; + } + + public static AccessToggleKeyMappingFields toggleKeyMappingFields(ToggleKeyMapping toggleKeyMapping) { + return (AccessToggleKeyMappingFields) toggleKeyMapping; + } +} diff --git a/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java b/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java index 2446fed..c920700 100644 --- a/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java +++ b/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java @@ -1,6 +1,6 @@ package chylex.bettercontrols.input; -import chylex.bettercontrols.mixin.AccessKeyBindingFields; +import chylex.bettercontrols.Mixins; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import net.minecraft.client.KeyMapping; import java.util.HashSet; @@ -31,6 +31,6 @@ public final class ToggleTrackerForStickyKey extends ToggleTracker { @Override protected boolean isResetKeyPressed() { - return ((AccessKeyBindingFields)bindingReset).isPressedField(); + return Mixins.keyMappingFields(bindingReset).isPressedField(); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessKeyBindingFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessKeyMappingFields.java similarity index 82% rename from src/main/java/chylex/bettercontrols/mixin/AccessKeyBindingFields.java rename to src/main/java/chylex/bettercontrols/mixin/AccessKeyMappingFields.java index 61a7471..634782f 100644 --- a/src/main/java/chylex/bettercontrols/mixin/AccessKeyBindingFields.java +++ b/src/main/java/chylex/bettercontrols/mixin/AccessKeyMappingFields.java @@ -6,7 +6,8 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Map; @Mixin(KeyMapping.class) -public interface AccessKeyBindingFields { +@SuppressWarnings("StaticMethodOnlyUsedInOneClass") +public interface AccessKeyMappingFields { @Accessor("CATEGORY_SORT_ORDER") static Map<String, Integer> getCategoryOrderMap() { throw new AssertionError(); diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessStickyKeyBindingStateGetter.java b/src/main/java/chylex/bettercontrols/mixin/AccessToggleKeyMappingFields.java similarity index 88% rename from src/main/java/chylex/bettercontrols/mixin/AccessStickyKeyBindingStateGetter.java rename to src/main/java/chylex/bettercontrols/mixin/AccessToggleKeyMappingFields.java index 8383aaf..f11ac9b 100644 --- a/src/main/java/chylex/bettercontrols/mixin/AccessStickyKeyBindingStateGetter.java +++ b/src/main/java/chylex/bettercontrols/mixin/AccessToggleKeyMappingFields.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.function.BooleanSupplier; @Mixin(ToggleKeyMapping.class) -public interface AccessStickyKeyBindingStateGetter { +public interface AccessToggleKeyMappingFields { @Accessor BooleanSupplier getNeedsToggle(); diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java index a93d825..53437fd 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.player.PlayerTicker; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.player.AbstractClientPlayer; @@ -14,9 +15,9 @@ public abstract class HookClientPlayerFOV { at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F") ) private float overrideWalkingSpeed(float walkingSpeed) { - AbstractClientPlayer me = (AbstractClientPlayer)(Object)this; + AbstractClientPlayer me = Mixins.me(this); - if (me instanceof LocalPlayer localPlayer && PlayerTicker.get(localPlayer).shouldResetFOV(localPlayer)) { + if (me instanceof LocalPlayer localPlayer && PlayerTicker.shouldResetFOV(localPlayer)) { return 0F; } else { diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java index bdbf1de..c6a007a 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER; @Mixin(KeyboardInput.class) -@SuppressWarnings({ "MethodMayBeStatic", "UnreachableCode" }) +@SuppressWarnings("MethodMayBeStatic") public abstract class HookClientPlayerInputTick { @Inject( method = "tick", diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java index d856fd1..f2a1d1b 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.player.PlayerTicker; import com.mojang.authlib.GameProfile; import net.minecraft.client.multiplayer.ClientLevel; @@ -12,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER; @Mixin(LocalPlayer.class) -@SuppressWarnings("UnreachableCode") public abstract class HookClientPlayerTick extends AbstractClientPlayer { protected HookClientPlayerTick(ClientLevel world, GameProfile profile) { super(world, profile); @@ -20,22 +20,19 @@ public abstract class HookClientPlayerTick extends AbstractClientPlayer { @Inject(method = "aiStep()V", at = @At("HEAD")) private void atHead(CallbackInfo info) { - @SuppressWarnings("ConstantConditions") - LocalPlayer player = (LocalPlayer)(Object)this; + LocalPlayer player = Mixins.me(this); PlayerTicker.get(player).atHead(player); } @Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;tick()V", ordinal = 0, shift = AFTER)) private void afterInputTick(CallbackInfo info) { - @SuppressWarnings("ConstantConditions") - LocalPlayer player = (LocalPlayer)(Object)this; + LocalPlayer player = Mixins.me(this); PlayerTicker.get(player).afterInputTick(player); } @Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;aiStep()V", ordinal = 0, shift = AFTER)) private void afterSuperCall(CallbackInfo info) { - @SuppressWarnings("ConstantConditions") - LocalPlayer player = (LocalPlayer)(Object)this; + LocalPlayer player = Mixins.me(this); PlayerTicker.get(player).afterSuperCall(player); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java index 3f32b34..707cfd5 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.player.FlightHelper; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.player.LocalPlayer; @@ -11,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Slice; @Mixin(LocalPlayer.class) -@SuppressWarnings({ "SameReturnValue", "UnreachableCode" }) public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity { protected HookClientPlayerVerticalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) { super(type, world); @@ -26,8 +26,7 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity { ) ) private float modifyVerticalFlightSpeed(float flyingSpeed) { - @SuppressWarnings("ConstantConditions") - LocalPlayer me = (LocalPlayer)(Object)this; + LocalPlayer me = Mixins.me(this); return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java index 1ad5890..ce664c4 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.gui.BetterControlsScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; @@ -17,7 +18,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.List; @Mixin(ControlsScreen.class) -@SuppressWarnings("UnreachableCode") public abstract class HookControlsScreen extends OptionsSubScreen { public HookControlsScreen(Screen parentScreen, Options options, Component title) { super(parentScreen, options, title); @@ -26,8 +26,7 @@ public abstract class HookControlsScreen extends OptionsSubScreen { @Inject(method = "addOptions", at = @At("RETURN")) public void afterAddOptions(CallbackInfo ci) { if (list != null) { - @SuppressWarnings("ConstantConditions") - ControlsScreen screen = (ControlsScreen)(Object)this; + ControlsScreen screen = Mixins.me(this); MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("..."); list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build())); } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java b/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java index 13fb5ce..4851ce3 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java @@ -38,6 +38,6 @@ public abstract class HookLoadGameOptions { hasLoaded = true; keyMappings = ArrayUtils.addAll(keyMappings, config.getAllKeyBindings()); - AccessKeyBindingFields.getCategoryOrderMap().put(KeyBindingWithModifier.CATEGORY, Integer.valueOf(Integer.MAX_VALUE)); + AccessKeyMappingFields.getCategoryOrderMap().put(KeyBindingWithModifier.CATEGORY, Integer.valueOf(Integer.MAX_VALUE)); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java index f64cc7b..d548964 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.player.FlightHelper; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; @@ -13,7 +14,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Slice; @Mixin(Player.class) -@SuppressWarnings({ "SameReturnValue", "UnreachableCode" }) public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { protected HookPlayerHorizontalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) { super(type, world); @@ -29,8 +29,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { ) ) private boolean disableVanillaSprintBoost(boolean isSprinting) { - @SuppressWarnings("ConstantConditions") - Player me = (Player)(Object)this; + Player me = Mixins.me(this); if (me instanceof LocalPlayer localPlayer && FlightHelper.isFlyingCreativeOrSpectator(localPlayer)) { return false; @@ -42,8 +41,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { @ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN")) private float modifyHorizontalFlyingSpeed(float flyingSpeed) { - @SuppressWarnings("ConstantConditions") - Player me = (Player)(Object)this; + Player me = Mixins.me(this); if (me instanceof LocalPlayer localPlayer && localPlayer.getAbilities().flying) { return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer); diff --git a/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java b/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java index 7974ef5..7302d9a 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.input.ToggleTrackerForStickyKey; import net.minecraft.client.KeyMapping; import net.minecraft.client.ToggleKeyMapping; @@ -24,7 +25,7 @@ public abstract class HookStickyKeyBindingState extends KeyMapping { @Inject(method = "setDown", at = @At("HEAD"), cancellable = true) public void setPressed(boolean pressed, CallbackInfo info) { if (ToggleTrackerForStickyKey.isOverrideEnabled(this)) { - ((AccessKeyBindingFields)this).setPressedField(pressed); + Mixins.keyMappingFields(this).setPressedField(pressed); info.cancel(); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java index ea07bd5..ae78579 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java @@ -1,5 +1,6 @@ package chylex.bettercontrols.mixin; +import chylex.bettercontrols.Mixins; import net.minecraft.client.OptionInstance; import net.minecraft.client.Options; import net.minecraft.client.gui.components.AbstractWidget; @@ -10,12 +11,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.function.Consumer; @Mixin(OptionInstance.class) -@SuppressWarnings("UnreachableCode") public abstract class HookToggleOptionButtons { @Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN")) private <T> void disableToggleOptions(Options options, int x, int y, int width, Consumer<T> callback, CallbackInfoReturnable<AbstractWidget> cir) { - @SuppressWarnings("ConstantConditions") - OptionInstance<?> me = (OptionInstance<?>)(Object)this; + OptionInstance<?> me = Mixins.me(this); if (me == options.toggleCrouch() || me == options.toggleSprint()) { cir.getReturnValue().active = false; diff --git a/src/main/java/chylex/bettercontrols/player/FlightHelper.java b/src/main/java/chylex/bettercontrols/player/FlightHelper.java index 081fca9..ae7a8fc 100644 --- a/src/main/java/chylex/bettercontrols/player/FlightHelper.java +++ b/src/main/java/chylex/bettercontrols/player/FlightHelper.java @@ -1,10 +1,9 @@ package chylex.bettercontrols.player; -import chylex.bettercontrols.BetterControlsCommon; -import chylex.bettercontrols.config.BetterControlsConfig; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; +import static chylex.bettercontrols.BetterControlsCommon.getConfig; public final class FlightHelper { private FlightHelper() {} @@ -15,12 +14,8 @@ public final class FlightHelper { return KEY_SPRINT.isDown(); } - private static BetterControlsConfig cfg() { - return BetterControlsCommon.getConfig(); - } - public static boolean shouldStartGliding(boolean isHoldingJump) { - return cfg().keyStartGlide.isDown() || (cfg().doubleTapJumpToGlide && isHoldingJump); + return getConfig().keyStartGlide.isDown() || (getConfig().doubleTapJumpToGlide && isHoldingJump); } public static boolean isFlyingCreativeOrSpectator(LocalPlayer player) { @@ -28,15 +23,15 @@ public final class FlightHelper { } static boolean shouldFlyOnGround(LocalPlayer player) { - return cfg().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying; + return getConfig().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying; } public static float getHorizontalSpeedMultiplier(LocalPlayer player) { if (player.isCreative()) { - return isSprinting() ? cfg().flightHorizontalSpeedMpCreativeSprinting : cfg().flightHorizontalSpeedMpCreativeDefault; + return isSprinting() ? getConfig().flightHorizontalSpeedMpCreativeSprinting : getConfig().flightHorizontalSpeedMpCreativeDefault; } else if (player.isSpectator()) { - return isSprinting() ? cfg().flightHorizontalSpeedMpSpectatorSprinting : cfg().flightHorizontalSpeedMpSpectatorDefault; + return isSprinting() ? getConfig().flightHorizontalSpeedMpSpectatorSprinting : getConfig().flightHorizontalSpeedMpSpectatorDefault; } else { return 1F; @@ -45,10 +40,10 @@ public final class FlightHelper { public static float getVerticalSpeedMultiplier(LocalPlayer player) { if (player.isCreative()) { - return isSprinting() ? cfg().flightVerticalSpeedMpCreativeSprinting : cfg().flightVerticalSpeedMpCreativeDefault; + return isSprinting() ? getConfig().flightVerticalSpeedMpCreativeSprinting : getConfig().flightVerticalSpeedMpCreativeDefault; } else if (player.isSpectator()) { - return isSprinting() ? cfg().flightVerticalSpeedMpSpectatorSprinting : cfg().flightVerticalSpeedMpSpectatorDefault; + return isSprinting() ? getConfig().flightVerticalSpeedMpSpectatorSprinting : getConfig().flightVerticalSpeedMpSpectatorDefault; } else { return 1F; diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java index 40838c2..b9adcfa 100644 --- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java +++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java @@ -1,30 +1,28 @@ package chylex.bettercontrols.player; -import chylex.bettercontrols.BetterControlsCommon; -import chylex.bettercontrols.config.BetterControlsConfig; +import chylex.bettercontrols.Mixins; import chylex.bettercontrols.gui.BetterControlsScreen; import chylex.bettercontrols.input.SprintMode; import chylex.bettercontrols.input.ToggleTracker; import chylex.bettercontrols.input.ToggleTrackerForStickyKey; -import chylex.bettercontrols.mixin.AccessCameraFields; -import chylex.bettercontrols.mixin.AccessClientPlayerFields; -import chylex.bettercontrols.mixin.AccessPlayerFields; -import chylex.bettercontrols.mixin.AccessStickyKeyBindingStateGetter; +import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields; import net.minecraft.client.Camera; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; +import net.minecraft.client.ToggleKeyMapping; import net.minecraft.client.player.ClientInput; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.player.Input; import java.lang.ref.WeakReference; import java.util.function.BooleanSupplier; +import static chylex.bettercontrols.BetterControlsCommon.getConfig; public final class PlayerTicker { private static final Minecraft MINECRAFT = Minecraft.getInstance(); private static final Options OPTIONS = MINECRAFT.options; - private static final KeyMapping KEY_SPRINT = OPTIONS.keySprint; + private static final ToggleKeyMapping KEY_SPRINT = (ToggleKeyMapping) OPTIONS.keySprint; private static final KeyMapping KEY_SNEAK = OPTIONS.keyShift; private static final KeyMapping KEY_FORWARD = OPTIONS.keyUp; private static final KeyMapping KEY_JUMP = OPTIONS.keyJump; @@ -39,10 +37,6 @@ public final class PlayerTicker { return ticker; } - private static BetterControlsConfig cfg() { - return BetterControlsCommon.getConfig(); - } - private final WeakReference<LocalPlayer> ref; private PlayerTicker(LocalPlayer player) { @@ -52,10 +46,10 @@ public final class PlayerTicker { // Logic - private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(cfg().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set); - private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(cfg().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set); - private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, KEY_FORWARD); - private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, KEY_JUMP); + private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(getConfig().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set); + private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(getConfig().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set); + private final ToggleTracker toggleWalkForward = new ToggleTracker(getConfig().keyToggleWalkForward, KEY_FORWARD); + private final ToggleTracker toggleJump = new ToggleTracker(getConfig().keyToggleJump, KEY_JUMP); private boolean waitingForSprintKeyRelease = false; private boolean stopSprintingAfterReleasingSprintKey = false; @@ -69,7 +63,7 @@ public final class PlayerTicker { private int temporaryFlyOnGroundTimer = 0; private void setup() { - AccessStickyKeyBindingStateGetter sprint = (AccessStickyKeyBindingStateGetter)KEY_SPRINT; + AccessToggleKeyMappingFields sprint = Mixins.toggleKeyMappingFields(KEY_SPRINT); BooleanSupplier getter = sprint.getNeedsToggle(); if (getter instanceof SprintPressGetter g) { @@ -84,15 +78,15 @@ public final class PlayerTicker { player.setOnGround(false); } - if (!cfg().doubleTapForwardToSprint) { - ((AccessClientPlayerFields)player).setSprintTriggerTime(0); + if (!getConfig().doubleTapForwardToSprint) { + Mixins.clientPlayerFields(player).setSprintTriggerTime(0); } - if (!cfg().doubleTapJumpToToggleFlight) { - ((AccessPlayerFields)player).setJumpTriggerTime(0); + if (!getConfig().doubleTapJumpToToggleFlight) { + Mixins.playerFields(player).setJumpTriggerTime(0); } - SprintMode sprintMode = cfg().sprintMode; + SprintMode sprintMode = getConfig().sprintMode; boolean wasSprintToggled = Boolean.TRUE.equals(OPTIONS.toggleSprint().get()); boolean isSprintToggled = toggleSprint.tick(); @@ -170,7 +164,7 @@ public final class PlayerTicker { player.input.makeJump(); } - if (cfg().resumeSprintingAfterHittingObstacle) { + if (getConfig().resumeSprintingAfterHittingObstacle) { if (wasHittingObstacle != player.horizontalCollision) { if (!wasHittingObstacle) { wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown(); @@ -229,7 +223,7 @@ public final class PlayerTicker { holdingSneakWhileTouchingGround = false; } - if (FlightHelper.isFlyingCreativeOrSpectator(player) && cfg().disableFlightInertia) { + if (FlightHelper.isFlyingCreativeOrSpectator(player) && getConfig().disableFlightInertia) { ClientInput input = player.input; if (input.forwardImpulse == 0F && input.leftImpulse == 0F) { @@ -242,7 +236,7 @@ public final class PlayerTicker { } if (player.isCreative()) { - if (cfg().keyToggleFlight.consumeClick()) { + if (getConfig().keyToggleFlight.consumeClick()) { boolean isFlying = !player.getAbilities().flying; player.getAbilities().flying = isFlying; @@ -267,27 +261,27 @@ public final class PlayerTicker { temporaryFlyOnGroundTimer = 0; } - if (!cfg().sneakingMovesCameraSmoothly) { + if (!getConfig().sneakingMovesCameraSmoothly) { Camera camera = MINECRAFT.gameRenderer.getMainCamera(); if (camera.getEntity() == player) { - ((AccessCameraFields)camera).setEyeHeight(player.getEyeHeight()); + Mixins.cameraFields(camera).setEyeHeight(player.getEyeHeight()); } } - if (cfg().keyResetAllToggles.consumeClick()) { + if (getConfig().keyResetAllToggles.consumeClick()) { toggleSprint.reset(); toggleSneak.reset(); toggleWalkForward.reset(); toggleJump.reset(); } - if (cfg().keyOpenMenu.isDown()) { + if (getConfig().keyOpenMenu.isDown()) { MINECRAFT.setScreen(new BetterControlsScreen(null)); } } - public boolean shouldResetFOV(LocalPlayer player) { - return cfg().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player); + public static boolean shouldResetFOV(LocalPlayer player) { + return getConfig().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player); } } diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json index 42e43fb..db0b3e6 100644 --- a/src/main/resources/bettercontrols.mixins.json +++ b/src/main/resources/bettercontrols.mixins.json @@ -7,9 +7,9 @@ "client": [ "AccessCameraFields", "AccessClientPlayerFields", - "AccessKeyBindingFields", + "AccessKeyMappingFields", "AccessPlayerFields", - "AccessStickyKeyBindingStateGetter", + "AccessToggleKeyMappingFields", "HookClientPlayerFOV", "HookClientPlayerInputTick", "HookClientPlayerTick",