diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java index 7041df4..fd81d62 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java @@ -1,22 +1,26 @@ package chylex.bettercontrols.mixin; import chylex.bettercontrols.player.PlayerTicker; -import net.minecraft.client.Minecraft; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.entity.player.Abilities; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(AbstractClientPlayer.class) public abstract class HookClientPlayerFOV { - @Redirect( + @ModifyExpressionValue( method = "getFieldOfViewModifier", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F") ) - private float overrideWalkingSpeed(final Abilities abilities) { - final LocalPlayer player = Minecraft.getInstance().player; - return (player != null && PlayerTicker.get(player).shouldResetFOV(player)) ? 0F : abilities.getWalkingSpeed(); + private float overrideWalkingSpeed(final float walkingSpeed) { + final AbstractClientPlayer me = (AbstractClientPlayer)(Object)this; + + if (me instanceof LocalPlayer localPlayer && PlayerTicker.get(localPlayer).shouldResetFOV(localPlayer)) { + return 0F; + } + else { + return walkingSpeed; + } } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java index 720a0dd..3d5e010 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java @@ -1,14 +1,13 @@ package chylex.bettercontrols.mixin; import chylex.bettercontrols.player.FlightHelper; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Abilities; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Slice; @Mixin(LocalPlayer.class) @@ -18,7 +17,7 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity { super(type, world); } - @Redirect( + @ModifyExpressionValue( method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F"), slice = @Slice( @@ -26,9 +25,9 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity { to = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V") ) ) - private float modifyVerticalFlightSpeed(final Abilities abilities) { + private float modifyVerticalFlightSpeed(final float flyingSpeed) { @SuppressWarnings("ConstantConditions") final LocalPlayer me = (LocalPlayer)(Object)this; - return abilities.getFlyingSpeed() * FlightHelper.getVerticalSpeedMultiplier(me); + return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java index 2dd0ec3..b7d008a 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java @@ -1,6 +1,8 @@ package chylex.bettercontrols.mixin; import chylex.bettercontrols.BetterControlsCommon; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; @@ -10,16 +12,16 @@ import net.minecraft.client.gui.screens.options.controls.KeyBindsList.Entry; import org.apache.commons.lang3.ArrayUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(KeyBindsList.class) +@SuppressWarnings("MethodMayBeStatic") public abstract class HookControlsListWidget extends ContainerObjectSelectionList<Entry> { public HookControlsListWidget(final Minecraft client, final int width, final int height, final int top, final int itemHeight) { super(client, width, height, top, itemHeight); } - @Redirect(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;")) - private KeyMapping[] excludeOwnKeyBindings(final Options options) { - return ArrayUtils.removeElements(options.keyMappings, BetterControlsCommon.getConfig().getAllKeyBindings()); + @WrapOperation(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;")) + private KeyMapping[] excludeOwnKeyBindings(final Options options, final Operation<KeyMapping[]> operation) { + return ArrayUtils.removeElements(operation.call(options), BetterControlsCommon.getConfig().getAllKeyBindings()); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java index f953d44..73d2643 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java @@ -1,6 +1,8 @@ package chylex.bettercontrols.mixin; import chylex.bettercontrols.player.FlightHelper; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -8,10 +10,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; 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.Redirect; import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Player.class) @SuppressWarnings({ "SameReturnValue", "UnreachableCode" }) @@ -21,7 +20,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { } @SuppressWarnings("SimplifiableIfStatement") - @Redirect( + @ModifyExpressionValue( method = "getFlyingSpeed", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"), slice = @Slice( @@ -29,23 +28,28 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F") ) ) - private boolean disableVanillaSprintBoost(final Player player) { - if (player instanceof LocalPlayer) { + private boolean disableVanillaSprintBoost(final boolean isSprinting) { + @SuppressWarnings("ConstantConditions") + final Player me = (Player)(Object)this; + + if (me instanceof LocalPlayer) { return false; } else { - return player.isSprinting(); + return isSprinting; } } - @Inject(method = "getFlyingSpeed", at = @At("RETURN"), cancellable = true) - private void modifyHorizontalFlyingSpeed(final CallbackInfoReturnable<Float> cir) { + @ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN")) + private float modifyHorizontalFlyingSpeed(final float flyingSpeed) { @SuppressWarnings("ConstantConditions") final Player me = (Player)(Object)this; if (me instanceof final LocalPlayer localPlayer && localPlayer.getAbilities().flying) { - final float multiplier = FlightHelper.getHorizontalSpeedMultiplier(localPlayer); - cir.setReturnValue(Float.valueOf(cir.getReturnValueF() * multiplier)); + return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer); + } + else { + return flyingSpeed; } } }