1
0
mirror of https://github.com/chylex/Better-Controls.git synced 2025-04-07 00:15:53 +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;
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;
}
}
}

View File

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

View File

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

View File

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