diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java new file mode 100644 index 0000000..03170d5 --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java @@ -0,0 +1,36 @@ +package chylex.bettercontrols.mixin; + +import chylex.bettercontrols.player.FlightHelper; +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; + +@SuppressWarnings("SameReturnValue") +@Mixin(LocalPlayer.class) +public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity { + protected HookClientPlayerVerticalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) { + super(type, world); + } + + @Redirect( + method = "aiStep", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F"), + slice = @Slice( + from = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;flying:Z"), + to = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V") + ) + ) + private float modifyVerticalFlightSpeed(final Abilities abilities) { + @SuppressWarnings("ConstantConditions") + final LocalPlayer me = (LocalPlayer)(Object)this; + + final float multiplier = 1F + FlightHelper.getVerticalSpeedBoost(me); + return abilities.getFlyingSpeed() * multiplier; + } +} diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerFlightSpeed.java deleted file mode 100644 index e8dab90..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/HookPlayerFlightSpeed.java +++ /dev/null @@ -1,30 +0,0 @@ -package chylex.bettercontrols.mixin; - -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -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.Redirect; -import org.spongepowered.asm.mixin.injection.Slice; - -@SuppressWarnings("SameReturnValue") -@Mixin(Player.class) -public abstract class HookPlayerFlightSpeed extends LivingEntity { - protected HookPlayerFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) { - super(type, world); - } - - @Redirect( - method = "getFlyingSpeed", - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"), - slice = @Slice( - from = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;flying:Z"), - to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F") - ) - ) - private boolean disableVanillaSprintBoost(final Player player) { - return false; - } -} diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java new file mode 100644 index 0000000..963a6b2 --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java @@ -0,0 +1,51 @@ +package chylex.bettercontrols.mixin; + +import chylex.bettercontrols.player.FlightHelper; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +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; + +@SuppressWarnings("SameReturnValue") +@Mixin(Player.class) +public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity { + protected HookPlayerHorizontalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) { + super(type, world); + } + + @SuppressWarnings("SimplifiableIfStatement") + @Redirect( + method = "getFlyingSpeed", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"), + slice = @Slice( + from = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;flying:Z"), + to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F") + ) + ) + private boolean disableVanillaSprintBoost(final Player player) { + if (player instanceof LocalPlayer) { + return false; + } + else { + return player.isSprinting(); + } + } + + @Inject(method = "getFlyingSpeed", at = @At("RETURN"), cancellable = true) + private void modifyHorizontalFlyingSpeed(final CallbackInfoReturnable<Float> cir) { + @SuppressWarnings("ConstantConditions") + final Player me = (Player)(Object)this; + + if (me instanceof final LocalPlayer localPlayer) { + final float multiplier = FlightHelper.getHorizontalSpeedMultiplier(localPlayer); + cir.setReturnValue(Float.valueOf(cir.getReturnValueF() * multiplier)); + } + } +} diff --git a/src/main/java/chylex/bettercontrols/player/FlightHelper.java b/src/main/java/chylex/bettercontrols/player/FlightHelper.java index 8f9680a..e8e4843 100644 --- a/src/main/java/chylex/bettercontrols/player/FlightHelper.java +++ b/src/main/java/chylex/bettercontrols/player/FlightHelper.java @@ -2,13 +2,18 @@ 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; -final class FlightHelper { +public final class FlightHelper { private FlightHelper() {} - private static final float BASE_FLIGHT_SPEED = 0.05F; - private static final float BASE_VERTICAL_VELOCITY = 3F; + private static final KeyMapping KEY_SPRINT = Minecraft.getInstance().options.keySprint; + + private static boolean isSprinting() { + return KEY_SPRINT.isDown(); + } private static BetterControlsConfig cfg() { return BetterControlsCommon.getConfig(); @@ -22,44 +27,24 @@ final class FlightHelper { return cfg().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying; } - static float getFlightSpeed(final LocalPlayer player, final boolean boost) { + public static float getHorizontalSpeedMultiplier(final LocalPlayer player) { if (player.isCreative()) { - if (boost) { - return BASE_FLIGHT_SPEED * cfg().flightSpeedMpCreativeSprinting; - } - else { - return BASE_FLIGHT_SPEED * cfg().flightSpeedMpCreativeDefault; - } + return isSprinting() ? cfg().flightSpeedMpCreativeSprinting : cfg().flightSpeedMpCreativeDefault; } else if (player.isSpectator()) { - if (boost) { - return BASE_FLIGHT_SPEED * cfg().flightSpeedMpSpectatorSprinting; - } - else { - return BASE_FLIGHT_SPEED * cfg().flightSpeedMpSpectatorDefault; - } + return isSprinting() ? cfg().flightSpeedMpSpectatorSprinting : cfg().flightSpeedMpSpectatorDefault; } else { - return 0F; + return 1F; } } - static float getExtraVerticalVelocity(final LocalPlayer player, final boolean isSprinting) { + public static float getVerticalSpeedBoost(final LocalPlayer player) { if (player.isCreative()) { - if (isSprinting) { - return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostCreativeSprinting; - } - else { - return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostCreativeDefault; - } + return isSprinting() ? cfg().flightVerticalBoostCreativeSprinting : cfg().flightVerticalBoostCreativeDefault; } else if (player.isSpectator()) { - if (isSprinting) { - return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostSpectatorSprinting; - } - else { - return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostSpectatorDefault; - } + return isSprinting() ? cfg().flightVerticalBoostSpectatorSprinting : cfg().flightVerticalBoostSpectatorDefault; } else { return 0F; diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java index 359f1a5..05e5bd8 100644 --- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java +++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java @@ -163,32 +163,6 @@ public final class PlayerTicker { input.jumping |= toggleJump.tick(); } - if (FlightHelper.isFlyingCreativeOrSpectator(player)) { - final boolean boost = KEY_SPRINT.isDown(); - final float flightSpeed = FlightHelper.getFlightSpeed(player, boost); - final float verticalVelocity = FlightHelper.getExtraVerticalVelocity(player, boost); - - if (flightSpeed > 0F) { - player.getAbilities().setFlyingSpeed(flightSpeed); - } - - if (Math.abs(verticalVelocity) > 1E-5F && player == MINECRAFT.getCameraEntity()) { - int direction = 0; - - if (input.shiftKeyDown) { - --direction; - } - - if (input.jumping) { - ++direction; - } - - if (direction != 0) { - player.setDeltaMovement(player.getDeltaMovement().add(0D, flightSpeed * verticalVelocity * direction, 0D)); - } - } - } - if (cfg().resumeSprintingAfterHittingObstacle) { if (wasHittingObstacle != player.horizontalCollision) { if (!wasHittingObstacle) { diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json index c0ec713..3ee539c 100644 --- a/src/main/resources/bettercontrols.mixins.json +++ b/src/main/resources/bettercontrols.mixins.json @@ -13,10 +13,11 @@ "HookClientPlayerFOV", "HookClientPlayerInputTick", "HookClientPlayerTick", + "HookClientPlayerVerticalFlightSpeed", "HookControlsListWidget", "HookControlsScreen", "HookLoadGameOptions", - "HookPlayerFlightSpeed", + "HookPlayerHorizontalFlightSpeed", "HookStickyKeyBindingState", "HookToggleOptionButtons" ],