ChipiMod/src/main/java/net/Chipperfluff/chipi/mixin/PlayerEntityMixin.java

82 lines
2.6 KiB
Java

package net.Chipperfluff.chipi.mixin;
import com.mojang.authlib.GameProfile;
import net.Chipperfluff.chipi.effect.ModEffects;
import net.Chipperfluff.chipi.effect.PregnantEffect;
import net.Chipperfluff.chipi.util.ChipiTrackedData;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
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.callback.CallbackInfo;
@Mixin(PlayerEntity.class)
public abstract class PlayerEntityMixin {
/* ============================================================
INIT: tracked data
============================================================ */
@Inject(method = "<init>", at = @At("TAIL"))
private void chipi$initTrackedData(
World world,
BlockPos pos,
float yaw,
GameProfile profile,
CallbackInfo ci
) {
PlayerEntity self = (PlayerEntity)(Object)this;
DataTracker tracker = self.getDataTracker();
tracker.startTracking(ChipiTrackedData.CHIPI_ENERGY, 1.0f);
}
/* ============================================================
JUMP CLAMP: pregnancy logic
============================================================ */
@Inject(
method = "jump",
at = @At("HEAD"),
cancellable = true
)
private void chipi$pregnancyJumpClamp(CallbackInfo ci) {
if (!((Object)this instanceof ServerPlayerEntity player)) return;
StatusEffectInstance inst =
player.getStatusEffect(ModEffects.PREGNANT);
if (inst == null) return; // normal jump
int total = PregnantEffect.TOTAL_DURATION;
int remaining = inst.getDuration();
// progress 0.0 → 1.0
double progress =
1.0 - ((double)remaining / total);
progress = Math.min(Math.max(progress, 0.0), 1.0);
// vanilla jump velocity ≈ 0.42
double maxJump = 0.42 * (1.0 - progress);
// End stage: NO jumping at all
if (maxJump < 0.05) {
ci.cancel();
return;
}
Vec3d vel = player.getVelocity();
player.setVelocity(vel.x, maxJump, vel.z);
player.velocityDirty = true;
// stop vanilla jump
ci.cancel();
}
}