changed mixins to affect ALL entities (might cause bugs) and fixed fall damage

This commit is contained in:
TechnoDraconic
2026-02-08 13:36:26 -08:00
parent aaa55b087f
commit 3154d32d79
4 changed files with 80 additions and 1 deletions

View File

@@ -0,0 +1,67 @@
package net.xevianlight.aphelion.mixins.common;
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.core.BlockPos;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.attachment.AttachmentHolder;
import net.xevianlight.aphelion.systems.GravityService;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.spongepowered.asm.util.Locals;
import java.io.ObjectOutputStream;
@Mixin(Entity.class)
public abstract class EntityMixin extends AttachmentHolder {
@Shadow
public float fallDistance;
// @At("RETURN") injects at all points IMMEDIATELY before a "return" opcode.
// Immediately before means IMMEDIATELY BEFORE,
// so even in a method like:
//
// return gravity;
//
// What's ACTUALLY happening is:
//
// $value = gravity;
// return $value;
//
// So, when we inject, we get:
//
// $value = gravity;
// [RETURN INJECT POINT]
// return $value;
//
// so we get to edit $value.
@Inject(method = "getGravity", at = @At("RETURN"), cancellable = true)
public void aphelion$getGravity(CallbackInfoReturnable<Double> cir) {
cir.setReturnValue(cir.getReturnValue() * GravityService.getGravityFactor((Entity) (Object) this));
}
// Should only break if the code that increases fall distance is moved outside Entity$checkFallDamage.
@WrapMethod(method = "checkFallDamage")
public void aphelion$checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos, Operation<Void> original) {
float prevFallDistance = this.fallDistance;
original.call(y, onGround, state, pos);
float newFallDistance = this.fallDistance;
if (newFallDistance > prevFallDistance && newFallDistance > 0) {
float fallDistanceGained = newFallDistance - prevFallDistance;
this.fallDistance = prevFallDistance + (fallDistanceGained * Math.min(GravityService.getGravityFactor((Entity) (Object) this), 1));
}
}
}

View File

@@ -31,6 +31,7 @@ public abstract class LivingEntityMixin extends Entity {
@Inject(method = "travel", at = @At("HEAD")) @Inject(method = "travel", at = @At("HEAD"))
public void aphelion$travel(Vec3 travelVector, CallbackInfo ci) { public void aphelion$travel(Vec3 travelVector, CallbackInfo ci) {
if (this.isControlledByLocalInstance()) GravityService.onEntityTravel(level(), (LivingEntity) (Object) this); // temporarily disabled in favor of aphelion$getGravity mixin
//if (this.isControlledByLocalInstance()) GravityService.onEntityTravel(level(), (LivingEntity) (Object) this);
} }
} }

View File

@@ -39,6 +39,16 @@ public class GravityService {
return getGravityAccel(entity.level(), entityBlockPos); return getGravityAccel(entity.level(), entityBlockPos);
} }
public static float getGravityFactor(Entity entity) {
float gravityAccelReal = getGravityAccel(entity);
// How many times normal gravity you're experiencing.
// "normal gravity" varies across different entities. Thankfully, minecraft slaps a "protected" status
// on LivingEntity.getGravity(), so i graciously get to go fuck myself and not care.
// Players are 0.08 units/second/travel() of gravity (from what i've gathered)
return gravityAccelReal / GravityData.ONE_G;
}
/// Called by LivingEntity$travel mixin /// Called by LivingEntity$travel mixin
public static void onEntityTravel(Level level, LivingEntity entity) { public static void onEntityTravel(Level level, LivingEntity entity) {
if ( if (

View File

@@ -4,6 +4,7 @@
"package": "net.xevianlight.aphelion.mixins", "package": "net.xevianlight.aphelion.mixins",
"compatibilityLevel": "JAVA_21", "compatibilityLevel": "JAVA_21",
"mixins": [ "mixins": [
"common.EntityMixin",
"common.LivingEntityMixin" "common.LivingEntityMixin"
], ],
"client": [ "client": [