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

Replace mixin redirects to improve compatibility with other mods

Closes 
This commit is contained in:
chylex 2025-01-30 00:38:17 +01:00
parent bd572bdfba
commit f55c82aa95
Signed by: chylex
SSH Key Fingerprint: SHA256:WqM8X/1DDn11LbYM0H5wsqZUjbcKxVsic37L+ERcF4o
4 changed files with 36 additions and 27 deletions

View File

@ -1,22 +1,26 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.player.PlayerTicker; 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.AbstractClientPlayer;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.world.entity.player.Abilities;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(AbstractClientPlayer.class) @Mixin(AbstractClientPlayer.class)
public abstract class HookClientPlayerFOV { public abstract class HookClientPlayerFOV {
@Redirect( @ModifyExpressionValue(
method = "getFieldOfViewModifier", method = "getFieldOfViewModifier",
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(final Abilities abilities) { private float overrideWalkingSpeed(final float walkingSpeed) {
final LocalPlayer player = Minecraft.getInstance().player; final AbstractClientPlayer me = (AbstractClientPlayer)(Object)this;
return (player != null && PlayerTicker.get(player).shouldResetFOV(player)) ? 0F : abilities.getWalkingSpeed();
if (me instanceof LocalPlayer localPlayer && PlayerTicker.get(localPlayer).shouldResetFOV(localPlayer)) {
return 0F;
}
else {
return walkingSpeed;
}
} }
} }

View File

@ -1,14 +1,13 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.player.FlightHelper; import chylex.bettercontrols.player.FlightHelper;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Abilities;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.Slice;
@Mixin(LocalPlayer.class) @Mixin(LocalPlayer.class)
@ -18,7 +17,7 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
super(type, world); super(type, world);
} }
@Redirect( @ModifyExpressionValue(
method = "aiStep", method = "aiStep",
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F"), at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F"),
slice = @Slice( 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") 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") @SuppressWarnings("ConstantConditions")
final LocalPlayer me = (LocalPlayer)(Object)this; final LocalPlayer me = (LocalPlayer)(Object)this;
return abilities.getFlyingSpeed() * FlightHelper.getVerticalSpeedMultiplier(me); return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me);
} }
} }

View File

@ -1,6 +1,8 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.BetterControlsCommon; 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.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.Options; 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.apache.commons.lang3.ArrayUtils;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(KeyBindsList.class) @Mixin(KeyBindsList.class)
@SuppressWarnings("MethodMayBeStatic")
public abstract class HookControlsListWidget extends ContainerObjectSelectionList<Entry> { public abstract class HookControlsListWidget extends ContainerObjectSelectionList<Entry> {
public HookControlsListWidget(final Minecraft client, final int width, final int height, final int top, final int itemHeight) { public HookControlsListWidget(final Minecraft client, final int width, final int height, final int top, final int itemHeight) {
super(client, width, height, top, itemHeight); super(client, width, height, top, itemHeight);
} }
@Redirect(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;")) @WrapOperation(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;"))
private KeyMapping[] excludeOwnKeyBindings(final Options options) { private KeyMapping[] excludeOwnKeyBindings(final Options options, final Operation<KeyMapping[]> operation) {
return ArrayUtils.removeElements(options.keyMappings, BetterControlsCommon.getConfig().getAllKeyBindings()); return ArrayUtils.removeElements(operation.call(options), BetterControlsCommon.getConfig().getAllKeyBindings());
} }
} }

View File

@ -1,6 +1,8 @@
package chylex.bettercontrols.mixin; package chylex.bettercontrols.mixin;
import chylex.bettercontrols.player.FlightHelper; 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.client.player.LocalPlayer;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
@ -8,10 +10,7 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; 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.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(Player.class) @Mixin(Player.class)
@SuppressWarnings({ "SameReturnValue", "UnreachableCode" }) @SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
@ -21,7 +20,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
} }
@SuppressWarnings("SimplifiableIfStatement") @SuppressWarnings("SimplifiableIfStatement")
@Redirect( @ModifyExpressionValue(
method = "getFlyingSpeed", method = "getFlyingSpeed",
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"), at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"),
slice = @Slice( 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") to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F")
) )
) )
private boolean disableVanillaSprintBoost(final Player player) { private boolean disableVanillaSprintBoost(final boolean isSprinting) {
if (player instanceof LocalPlayer) { @SuppressWarnings("ConstantConditions")
final Player me = (Player)(Object)this;
if (me instanceof LocalPlayer) {
return false; return false;
} }
else { else {
return player.isSprinting(); return isSprinting;
} }
} }
@Inject(method = "getFlyingSpeed", at = @At("RETURN"), cancellable = true) @ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN"))
private void modifyHorizontalFlyingSpeed(final CallbackInfoReturnable<Float> cir) { private float modifyHorizontalFlyingSpeed(final float flyingSpeed) {
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
final Player me = (Player)(Object)this; final Player me = (Player)(Object)this;
if (me instanceof final LocalPlayer localPlayer && localPlayer.getAbilities().flying) { if (me instanceof final LocalPlayer localPlayer && localPlayer.getAbilities().flying) {
final float multiplier = FlightHelper.getHorizontalSpeedMultiplier(localPlayer); return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer);
cir.setReturnValue(Float.valueOf(cir.getReturnValueF() * multiplier)); }
else {
return flyingSpeed;
} }
} }
} }