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

Refactor mixins

This commit is contained in:
chylex 2025-01-30 23:05:28 +01:00
parent aa499bead5
commit 9da758937e
Signed by: chylex
SSH Key Fingerprint: SHA256:WqM8X/1DDn11LbYM0H5wsqZUjbcKxVsic37L+ERcF4o
16 changed files with 100 additions and 74 deletions

View File

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

View File

@ -1,6 +1,6 @@
package chylex.bettercontrols.input; package chylex.bettercontrols.input;
import chylex.bettercontrols.mixin.AccessKeyBindingFields; import chylex.bettercontrols.Mixins;
import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import java.util.HashSet; import java.util.HashSet;
@ -31,6 +31,6 @@ public final class ToggleTrackerForStickyKey extends ToggleTracker {
@Override @Override
protected boolean isResetKeyPressed() { protected boolean isResetKeyPressed() {
return ((AccessKeyBindingFields)bindingReset).isPressedField(); return Mixins.keyMappingFields(bindingReset).isPressedField();
} }
} }

View File

@ -6,7 +6,8 @@ import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map; import java.util.Map;
@Mixin(KeyMapping.class) @Mixin(KeyMapping.class)
public interface AccessKeyBindingFields { @SuppressWarnings("StaticMethodOnlyUsedInOneClass")
public interface AccessKeyMappingFields {
@Accessor("CATEGORY_SORT_ORDER") @Accessor("CATEGORY_SORT_ORDER")
static Map<String, Integer> getCategoryOrderMap() { static Map<String, Integer> getCategoryOrderMap() {
throw new AssertionError(); throw new AssertionError();

View File

@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
@Mixin(ToggleKeyMapping.class) @Mixin(ToggleKeyMapping.class)
public interface AccessStickyKeyBindingStateGetter { public interface AccessToggleKeyMappingFields {
@Accessor @Accessor
BooleanSupplier getNeedsToggle(); BooleanSupplier getNeedsToggle();

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.player.PlayerTicker; import chylex.bettercontrols.player.PlayerTicker;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.client.player.AbstractClientPlayer; 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") at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F")
) )
private float overrideWalkingSpeed(float walkingSpeed) { 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; return 0F;
} }
else { else {

View File

@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER; import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
@Mixin(KeyboardInput.class) @Mixin(KeyboardInput.class)
@SuppressWarnings({ "MethodMayBeStatic", "UnreachableCode" }) @SuppressWarnings("MethodMayBeStatic")
public abstract class HookClientPlayerInputTick { public abstract class HookClientPlayerInputTick {
@Inject( @Inject(
method = "tick", method = "tick",

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.player.PlayerTicker; import chylex.bettercontrols.player.PlayerTicker;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import net.minecraft.client.multiplayer.ClientLevel; 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; import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
@Mixin(LocalPlayer.class) @Mixin(LocalPlayer.class)
@SuppressWarnings("UnreachableCode")
public abstract class HookClientPlayerTick extends AbstractClientPlayer { public abstract class HookClientPlayerTick extends AbstractClientPlayer {
protected HookClientPlayerTick(ClientLevel world, GameProfile profile) { protected HookClientPlayerTick(ClientLevel world, GameProfile profile) {
super(world, profile); super(world, profile);
@ -20,22 +20,19 @@ public abstract class HookClientPlayerTick extends AbstractClientPlayer {
@Inject(method = "aiStep()V", at = @At("HEAD")) @Inject(method = "aiStep()V", at = @At("HEAD"))
private void atHead(CallbackInfo info) { private void atHead(CallbackInfo info) {
@SuppressWarnings("ConstantConditions") LocalPlayer player = Mixins.me(this);
LocalPlayer player = (LocalPlayer)(Object)this;
PlayerTicker.get(player).atHead(player); 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)) @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) { private void afterInputTick(CallbackInfo info) {
@SuppressWarnings("ConstantConditions") LocalPlayer player = Mixins.me(this);
LocalPlayer player = (LocalPlayer)(Object)this;
PlayerTicker.get(player).afterInputTick(player); 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)) @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) { private void afterSuperCall(CallbackInfo info) {
@SuppressWarnings("ConstantConditions") LocalPlayer player = Mixins.me(this);
LocalPlayer player = (LocalPlayer)(Object)this;
PlayerTicker.get(player).afterSuperCall(player); PlayerTicker.get(player).afterSuperCall(player);
} }
} }

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.player.FlightHelper; import chylex.bettercontrols.player.FlightHelper;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
@ -11,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.Slice;
@Mixin(LocalPlayer.class) @Mixin(LocalPlayer.class)
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity { public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
protected HookClientPlayerVerticalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) { protected HookClientPlayerVerticalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
super(type, world); super(type, world);
@ -26,8 +26,7 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
) )
) )
private float modifyVerticalFlightSpeed(float flyingSpeed) { private float modifyVerticalFlightSpeed(float flyingSpeed) {
@SuppressWarnings("ConstantConditions") LocalPlayer me = Mixins.me(this);
LocalPlayer me = (LocalPlayer)(Object)this;
return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me); return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me);
} }
} }

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.gui.BetterControlsScreen; import chylex.bettercontrols.gui.BetterControlsScreen;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.Options; import net.minecraft.client.Options;
@ -17,7 +18,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List; import java.util.List;
@Mixin(ControlsScreen.class) @Mixin(ControlsScreen.class)
@SuppressWarnings("UnreachableCode")
public abstract class HookControlsScreen extends OptionsSubScreen { public abstract class HookControlsScreen extends OptionsSubScreen {
public HookControlsScreen(Screen parentScreen, Options options, Component title) { public HookControlsScreen(Screen parentScreen, Options options, Component title) {
super(parentScreen, options, title); super(parentScreen, options, title);
@ -26,8 +26,7 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
@Inject(method = "addOptions", at = @At("RETURN")) @Inject(method = "addOptions", at = @At("RETURN"))
public void afterAddOptions(CallbackInfo ci) { public void afterAddOptions(CallbackInfo ci) {
if (list != null) { if (list != null) {
@SuppressWarnings("ConstantConditions") ControlsScreen screen = Mixins.me(this);
ControlsScreen screen = (ControlsScreen)(Object)this;
MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("..."); MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build())); list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
} }

View File

@ -38,6 +38,6 @@ public abstract class HookLoadGameOptions {
hasLoaded = true; hasLoaded = true;
keyMappings = ArrayUtils.addAll(keyMappings, config.getAllKeyBindings()); 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));
} }
} }

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.player.FlightHelper; import chylex.bettercontrols.player.FlightHelper;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue;
@ -13,7 +14,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.Slice;
@Mixin(Player.class) @Mixin(Player.class)
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
protected HookPlayerHorizontalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) { protected HookPlayerHorizontalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
super(type, world); super(type, world);
@ -29,8 +29,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
) )
) )
private boolean disableVanillaSprintBoost(boolean isSprinting) { private boolean disableVanillaSprintBoost(boolean isSprinting) {
@SuppressWarnings("ConstantConditions") Player me = Mixins.me(this);
Player me = (Player)(Object)this;
if (me instanceof LocalPlayer localPlayer && FlightHelper.isFlyingCreativeOrSpectator(localPlayer)) { if (me instanceof LocalPlayer localPlayer && FlightHelper.isFlyingCreativeOrSpectator(localPlayer)) {
return false; return false;
@ -42,8 +41,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
@ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN")) @ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN"))
private float modifyHorizontalFlyingSpeed(float flyingSpeed) { private float modifyHorizontalFlyingSpeed(float flyingSpeed) {
@SuppressWarnings("ConstantConditions") Player me = Mixins.me(this);
Player me = (Player)(Object)this;
if (me instanceof LocalPlayer localPlayer && localPlayer.getAbilities().flying) { if (me instanceof LocalPlayer localPlayer && localPlayer.getAbilities().flying) {
return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer); return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer);

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.input.ToggleTrackerForStickyKey; import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.client.ToggleKeyMapping; import net.minecraft.client.ToggleKeyMapping;
@ -24,7 +25,7 @@ public abstract class HookStickyKeyBindingState extends KeyMapping {
@Inject(method = "setDown", at = @At("HEAD"), cancellable = true) @Inject(method = "setDown", at = @At("HEAD"), cancellable = true)
public void setPressed(boolean pressed, CallbackInfo info) { public void setPressed(boolean pressed, CallbackInfo info) {
if (ToggleTrackerForStickyKey.isOverrideEnabled(this)) { if (ToggleTrackerForStickyKey.isOverrideEnabled(this)) {
((AccessKeyBindingFields)this).setPressedField(pressed); Mixins.keyMappingFields(this).setPressedField(pressed);
info.cancel(); info.cancel();
} }
} }

View File

@ -1,5 +1,6 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.Mixins;
import net.minecraft.client.OptionInstance; import net.minecraft.client.OptionInstance;
import net.minecraft.client.Options; import net.minecraft.client.Options;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
@ -10,12 +11,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.function.Consumer; import java.util.function.Consumer;
@Mixin(OptionInstance.class) @Mixin(OptionInstance.class)
@SuppressWarnings("UnreachableCode")
public abstract class HookToggleOptionButtons { public abstract class HookToggleOptionButtons {
@Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN")) @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) { private <T> void disableToggleOptions(Options options, int x, int y, int width, Consumer<T> callback, CallbackInfoReturnable<AbstractWidget> cir) {
@SuppressWarnings("ConstantConditions") OptionInstance<?> me = Mixins.me(this);
OptionInstance<?> me = (OptionInstance<?>)(Object)this;
if (me == options.toggleCrouch() || me == options.toggleSprint()) { if (me == options.toggleCrouch() || me == options.toggleSprint()) {
cir.getReturnValue().active = false; cir.getReturnValue().active = false;

View File

@ -1,10 +1,9 @@
package chylex.bettercontrols.player; package chylex.bettercontrols.player;
import chylex.bettercontrols.BetterControlsCommon;
import chylex.bettercontrols.config.BetterControlsConfig;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import static chylex.bettercontrols.BetterControlsCommon.getConfig;
public final class FlightHelper { public final class FlightHelper {
private FlightHelper() {} private FlightHelper() {}
@ -15,12 +14,8 @@ public final class FlightHelper {
return KEY_SPRINT.isDown(); return KEY_SPRINT.isDown();
} }
private static BetterControlsConfig cfg() {
return BetterControlsCommon.getConfig();
}
public static boolean shouldStartGliding(boolean isHoldingJump) { 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) { public static boolean isFlyingCreativeOrSpectator(LocalPlayer player) {
@ -28,15 +23,15 @@ public final class FlightHelper {
} }
static boolean shouldFlyOnGround(LocalPlayer player) { 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) { public static float getHorizontalSpeedMultiplier(LocalPlayer player) {
if (player.isCreative()) { if (player.isCreative()) {
return isSprinting() ? cfg().flightHorizontalSpeedMpCreativeSprinting : cfg().flightHorizontalSpeedMpCreativeDefault; return isSprinting() ? getConfig().flightHorizontalSpeedMpCreativeSprinting : getConfig().flightHorizontalSpeedMpCreativeDefault;
} }
else if (player.isSpectator()) { else if (player.isSpectator()) {
return isSprinting() ? cfg().flightHorizontalSpeedMpSpectatorSprinting : cfg().flightHorizontalSpeedMpSpectatorDefault; return isSprinting() ? getConfig().flightHorizontalSpeedMpSpectatorSprinting : getConfig().flightHorizontalSpeedMpSpectatorDefault;
} }
else { else {
return 1F; return 1F;
@ -45,10 +40,10 @@ public final class FlightHelper {
public static float getVerticalSpeedMultiplier(LocalPlayer player) { public static float getVerticalSpeedMultiplier(LocalPlayer player) {
if (player.isCreative()) { if (player.isCreative()) {
return isSprinting() ? cfg().flightVerticalSpeedMpCreativeSprinting : cfg().flightVerticalSpeedMpCreativeDefault; return isSprinting() ? getConfig().flightVerticalSpeedMpCreativeSprinting : getConfig().flightVerticalSpeedMpCreativeDefault;
} }
else if (player.isSpectator()) { else if (player.isSpectator()) {
return isSprinting() ? cfg().flightVerticalSpeedMpSpectatorSprinting : cfg().flightVerticalSpeedMpSpectatorDefault; return isSprinting() ? getConfig().flightVerticalSpeedMpSpectatorSprinting : getConfig().flightVerticalSpeedMpSpectatorDefault;
} }
else { else {
return 1F; return 1F;

View File

@ -1,30 +1,28 @@
package chylex.bettercontrols.player; package chylex.bettercontrols.player;
import chylex.bettercontrols.BetterControlsCommon; import chylex.bettercontrols.Mixins;
import chylex.bettercontrols.config.BetterControlsConfig;
import chylex.bettercontrols.gui.BetterControlsScreen; import chylex.bettercontrols.gui.BetterControlsScreen;
import chylex.bettercontrols.input.SprintMode; import chylex.bettercontrols.input.SprintMode;
import chylex.bettercontrols.input.ToggleTracker; import chylex.bettercontrols.input.ToggleTracker;
import chylex.bettercontrols.input.ToggleTrackerForStickyKey; import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
import chylex.bettercontrols.mixin.AccessCameraFields; import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields;
import chylex.bettercontrols.mixin.AccessClientPlayerFields;
import chylex.bettercontrols.mixin.AccessPlayerFields;
import chylex.bettercontrols.mixin.AccessStickyKeyBindingStateGetter;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.Options; import net.minecraft.client.Options;
import net.minecraft.client.ToggleKeyMapping;
import net.minecraft.client.player.ClientInput; import net.minecraft.client.player.ClientInput;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.world.entity.player.Input; import net.minecraft.world.entity.player.Input;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
import static chylex.bettercontrols.BetterControlsCommon.getConfig;
public final class PlayerTicker { public final class PlayerTicker {
private static final Minecraft MINECRAFT = Minecraft.getInstance(); private static final Minecraft MINECRAFT = Minecraft.getInstance();
private static final Options OPTIONS = MINECRAFT.options; 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_SNEAK = OPTIONS.keyShift;
private static final KeyMapping KEY_FORWARD = OPTIONS.keyUp; private static final KeyMapping KEY_FORWARD = OPTIONS.keyUp;
private static final KeyMapping KEY_JUMP = OPTIONS.keyJump; private static final KeyMapping KEY_JUMP = OPTIONS.keyJump;
@ -39,10 +37,6 @@ public final class PlayerTicker {
return ticker; return ticker;
} }
private static BetterControlsConfig cfg() {
return BetterControlsCommon.getConfig();
}
private final WeakReference<LocalPlayer> ref; private final WeakReference<LocalPlayer> ref;
private PlayerTicker(LocalPlayer player) { private PlayerTicker(LocalPlayer player) {
@ -52,10 +46,10 @@ public final class PlayerTicker {
// Logic // Logic
private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(cfg().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set); private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(getConfig().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set);
private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(cfg().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set); private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(getConfig().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set);
private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, KEY_FORWARD); private final ToggleTracker toggleWalkForward = new ToggleTracker(getConfig().keyToggleWalkForward, KEY_FORWARD);
private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, KEY_JUMP); private final ToggleTracker toggleJump = new ToggleTracker(getConfig().keyToggleJump, KEY_JUMP);
private boolean waitingForSprintKeyRelease = false; private boolean waitingForSprintKeyRelease = false;
private boolean stopSprintingAfterReleasingSprintKey = false; private boolean stopSprintingAfterReleasingSprintKey = false;
@ -69,7 +63,7 @@ public final class PlayerTicker {
private int temporaryFlyOnGroundTimer = 0; private int temporaryFlyOnGroundTimer = 0;
private void setup() { private void setup() {
AccessStickyKeyBindingStateGetter sprint = (AccessStickyKeyBindingStateGetter)KEY_SPRINT; AccessToggleKeyMappingFields sprint = Mixins.toggleKeyMappingFields(KEY_SPRINT);
BooleanSupplier getter = sprint.getNeedsToggle(); BooleanSupplier getter = sprint.getNeedsToggle();
if (getter instanceof SprintPressGetter g) { if (getter instanceof SprintPressGetter g) {
@ -84,15 +78,15 @@ public final class PlayerTicker {
player.setOnGround(false); player.setOnGround(false);
} }
if (!cfg().doubleTapForwardToSprint) { if (!getConfig().doubleTapForwardToSprint) {
((AccessClientPlayerFields)player).setSprintTriggerTime(0); Mixins.clientPlayerFields(player).setSprintTriggerTime(0);
} }
if (!cfg().doubleTapJumpToToggleFlight) { if (!getConfig().doubleTapJumpToToggleFlight) {
((AccessPlayerFields)player).setJumpTriggerTime(0); Mixins.playerFields(player).setJumpTriggerTime(0);
} }
SprintMode sprintMode = cfg().sprintMode; SprintMode sprintMode = getConfig().sprintMode;
boolean wasSprintToggled = Boolean.TRUE.equals(OPTIONS.toggleSprint().get()); boolean wasSprintToggled = Boolean.TRUE.equals(OPTIONS.toggleSprint().get());
boolean isSprintToggled = toggleSprint.tick(); boolean isSprintToggled = toggleSprint.tick();
@ -170,7 +164,7 @@ public final class PlayerTicker {
player.input.makeJump(); player.input.makeJump();
} }
if (cfg().resumeSprintingAfterHittingObstacle) { if (getConfig().resumeSprintingAfterHittingObstacle) {
if (wasHittingObstacle != player.horizontalCollision) { if (wasHittingObstacle != player.horizontalCollision) {
if (!wasHittingObstacle) { if (!wasHittingObstacle) {
wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown(); wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown();
@ -229,7 +223,7 @@ public final class PlayerTicker {
holdingSneakWhileTouchingGround = false; holdingSneakWhileTouchingGround = false;
} }
if (FlightHelper.isFlyingCreativeOrSpectator(player) && cfg().disableFlightInertia) { if (FlightHelper.isFlyingCreativeOrSpectator(player) && getConfig().disableFlightInertia) {
ClientInput input = player.input; ClientInput input = player.input;
if (input.forwardImpulse == 0F && input.leftImpulse == 0F) { if (input.forwardImpulse == 0F && input.leftImpulse == 0F) {
@ -242,7 +236,7 @@ public final class PlayerTicker {
} }
if (player.isCreative()) { if (player.isCreative()) {
if (cfg().keyToggleFlight.consumeClick()) { if (getConfig().keyToggleFlight.consumeClick()) {
boolean isFlying = !player.getAbilities().flying; boolean isFlying = !player.getAbilities().flying;
player.getAbilities().flying = isFlying; player.getAbilities().flying = isFlying;
@ -267,27 +261,27 @@ public final class PlayerTicker {
temporaryFlyOnGroundTimer = 0; temporaryFlyOnGroundTimer = 0;
} }
if (!cfg().sneakingMovesCameraSmoothly) { if (!getConfig().sneakingMovesCameraSmoothly) {
Camera camera = MINECRAFT.gameRenderer.getMainCamera(); Camera camera = MINECRAFT.gameRenderer.getMainCamera();
if (camera.getEntity() == player) { 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(); toggleSprint.reset();
toggleSneak.reset(); toggleSneak.reset();
toggleWalkForward.reset(); toggleWalkForward.reset();
toggleJump.reset(); toggleJump.reset();
} }
if (cfg().keyOpenMenu.isDown()) { if (getConfig().keyOpenMenu.isDown()) {
MINECRAFT.setScreen(new BetterControlsScreen(null)); MINECRAFT.setScreen(new BetterControlsScreen(null));
} }
} }
public boolean shouldResetFOV(LocalPlayer player) { public static boolean shouldResetFOV(LocalPlayer player) {
return cfg().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player); return getConfig().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player);
} }
} }

View File

@ -7,9 +7,9 @@
"client": [ "client": [
"AccessCameraFields", "AccessCameraFields",
"AccessClientPlayerFields", "AccessClientPlayerFields",
"AccessKeyBindingFields", "AccessKeyMappingFields",
"AccessPlayerFields", "AccessPlayerFields",
"AccessStickyKeyBindingStateGetter", "AccessToggleKeyMappingFields",
"HookClientPlayerFOV", "HookClientPlayerFOV",
"HookClientPlayerInputTick", "HookClientPlayerInputTick",
"HookClientPlayerTick", "HookClientPlayerTick",