From 7a924acdedba00b73fb511f19bc7b0e85653a4ff Mon Sep 17 00:00:00 2001 From: Exterminate Date: Sun, 2 Aug 2026 22:34:17 +1000 Subject: [PATCH 1/2] Fix momentum --- .../movement/constants/MixinEntity.java | 36 ++++++++++++++++--- .../movement/constants/MixinLivingEntity.java | 33 ++++++++++++++++- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java index ef92ab7b3..41c957d0f 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java @@ -23,7 +23,9 @@ import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; @@ -45,12 +47,36 @@ private double fixBlockCollisionMargin(double constant) { } } - @ModifyConstant(method = "getInputVector", constant = @Constant(doubleValue = 1E-7)) - private static double fixVelocityEpsilon(double epsilon) { + @Inject(method = "getInputVector", at = @At("RETURN"), cancellable = true) + private static void fixInputVector(Vec3 input, float speed, float yRot, CallbackInfoReturnable cir) { if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_13_2)) { - return 1E-4; - } else { - return epsilon; + float x = (float) input.x; + float z = (float) input.z; + + float length = x * x + z * z; + + if (length < 1.0E-4F) { + cir.setReturnValue(Vec3.ZERO); + } + + length = Mth.sqrt(length); + if (length < 1.0F) { + length = 1.0F; + } + + final float scale = speed / length; + + x *= scale; + z *= scale; + + final float sin = Mth.sin(yRot * (float) (Math.PI / 180.0)); + final float cos = Mth.cos(yRot * (float) (Math.PI / 180.0)); + + cir.setReturnValue(new Vec3( + x * cos - z * sin, + input.y, + z * cos + x * sin + )); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java index b027ee72a..81a7e6d4a 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java @@ -24,14 +24,36 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyConstant; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = LivingEntity.class, priority = 999 /* Workaround for https://github.com/ViaVersion/ViaFabricPlus/issues/684 */) -public abstract class MixinLivingEntity { +public abstract class MixinLivingEntity extends Entity { + + @Shadow + public abstract float getSpeed(); + + @Shadow + protected abstract float getFlyingSpeed(); + + @Shadow + protected abstract float getJumpPower(); + + public MixinLivingEntity(final EntityType type, final Level level) { + super(type, level); + } @ModifyExpressionValue(method = "tickEffects", at = @At(value = "CONSTANT", args = "intValue=4")) private int changeParticleDensity(int original) { @@ -51,4 +73,13 @@ private double modifyVelocityZero(double constant) { } } + @Inject(method = "getFrictionInfluencedSpeed", at = @At("RETURN"), cancellable = true) + private void modifyFrictionInfluencedSpeed(float blockFriction, CallbackInfoReturnable cir) { + if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_13_2)) { + float drag = this.onGround() ? blockFriction * 0.91F : 0.91F; + float accel = 0.16277136F / (drag * drag * drag); + cir.setReturnValue(this.onGround() ? this.getSpeed() * accel : this.getFlyingSpeed()); + } + } + } From 31cbd3e940dc3438ae401f4a887fe4f1d35fb3a0 Mon Sep 17 00:00:00 2001 From: Exterminate Date: Mon, 3 Aug 2026 23:00:03 +1000 Subject: [PATCH 2/2] Minor code cleanup --- .../movement/constants/MixinEntity.java | 7 ++-- .../movement/constants/MixinLivingEntity.java | 33 +------------------ .../limitation/MixinLivingEntity.java | 17 ++++++++++ 3 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java index 41c957d0f..70034bef3 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinEntity.java @@ -47,7 +47,7 @@ private double fixBlockCollisionMargin(double constant) { } } - @Inject(method = "getInputVector", at = @At("RETURN"), cancellable = true) + @Inject(method = "getInputVector", at = @At("HEAD"), cancellable = true) private static void fixInputVector(Vec3 input, float speed, float yRot, CallbackInfoReturnable cir) { if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_13_2)) { float x = (float) input.x; @@ -59,10 +59,7 @@ private static void fixInputVector(Vec3 input, float speed, float yRot, Callback cir.setReturnValue(Vec3.ZERO); } - length = Mth.sqrt(length); - if (length < 1.0F) { - length = 1.0F; - } + length = Math.max(Mth.sqrt(length), 1.0F); final float scale = speed / length; diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java index 81a7e6d4a..b027ee72a 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/constants/MixinLivingEntity.java @@ -24,36 +24,14 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyConstant; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = LivingEntity.class, priority = 999 /* Workaround for https://github.com/ViaVersion/ViaFabricPlus/issues/684 */) -public abstract class MixinLivingEntity extends Entity { - - @Shadow - public abstract float getSpeed(); - - @Shadow - protected abstract float getFlyingSpeed(); - - @Shadow - protected abstract float getJumpPower(); - - public MixinLivingEntity(final EntityType type, final Level level) { - super(type, level); - } +public abstract class MixinLivingEntity { @ModifyExpressionValue(method = "tickEffects", at = @At(value = "CONSTANT", args = "intValue=4")) private int changeParticleDensity(int original) { @@ -73,13 +51,4 @@ private double modifyVelocityZero(double constant) { } } - @Inject(method = "getFrictionInfluencedSpeed", at = @At("RETURN"), cancellable = true) - private void modifyFrictionInfluencedSpeed(float blockFriction, CallbackInfoReturnable cir) { - if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_13_2)) { - float drag = this.onGround() ? blockFriction * 0.91F : 0.91F; - float accel = 0.16277136F / (drag * drag * drag); - cir.setReturnValue(this.onGround() ? this.getSpeed() * accel : this.getFlyingSpeed()); - } - } - } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/limitation/MixinLivingEntity.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/limitation/MixinLivingEntity.java index d0cf71912..29bf11059 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/limitation/MixinLivingEntity.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/movement/limitation/MixinLivingEntity.java @@ -35,8 +35,10 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LivingEntity.class) public abstract class MixinLivingEntity extends Entity { @@ -45,6 +47,12 @@ public MixinLivingEntity(EntityType type, Level world) { super(type, world); } + @Shadow + public abstract float getSpeed(); + + @Shadow + protected abstract float getFlyingSpeed(); + @Shadow public abstract boolean hasEffect(Holder effect); @@ -57,6 +65,15 @@ private double allowFrictionLessThan(double constant) { } } + @Inject(method = "getFrictionInfluencedSpeed", at = @At("HEAD"), cancellable = true) + private void modifyFrictionInfluencedSpeed(float blockFriction, CallbackInfoReturnable cir) { + if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_13_2)) { + float drag = this.onGround() ? blockFriction * 0.91F : 0.91F; + float accel = 0.16277136F / (drag * drag * drag); + cir.setReturnValue(this.onGround() ? this.getSpeed() * accel : this.getFlyingSpeed()); + } + } + @Redirect(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;is(Ljava/lang/Object;)Z")) private boolean useEuclideanDistanceCalculation(LivingEntity instance, Object o) { if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_21_4)) {