优化bmp2履带动画,增强小鸟机动,期待后人智慧突破XRot限制

This commit is contained in:
Atsuihsio 2025-02-04 16:01:37 +08:00
parent 781988f32d
commit f3091dc76b
3 changed files with 79 additions and 138 deletions

View file

@ -43,7 +43,6 @@ public class Bmp2Model extends GeoModel<Bmp2Entity> {
@Override @Override
public void setCustomAnimations(Bmp2Entity animatable, long instanceId, AnimationState<Bmp2Entity> animationState) { public void setCustomAnimations(Bmp2Entity animatable, long instanceId, AnimationState<Bmp2Entity> animationState) {
for (int i = 0; i < 50; i++) { for (int i = 0; i < 50; i++) {
CoreGeoBone trackL = getAnimationProcessor().getBone("trackL" + i); CoreGeoBone trackL = getAnimationProcessor().getBone("trackL" + i);
CoreGeoBone trackLRot = getAnimationProcessor().getBone("trackLRot" + i); CoreGeoBone trackLRot = getAnimationProcessor().getBone("trackLRot" + i);
@ -56,65 +55,7 @@ public class Bmp2Model extends GeoModel<Bmp2Entity> {
t -= 100; t -= 100;
} }
if (t < 37.5) { trackAnimation(trackL, trackLRot, t);
trackL.setPosY(0);
trackL.setPosZ(3 * t);
trackLRot.setRotX(0);
}
if (t >= 37.5 && t < 39.5) {
trackL.setPosY(-(t - 37.5f) * 3 * 0.7071f);
trackL.setPosZ(3 * 37.5f + (t - 37.5f) * 3 * 0.7071f);
trackLRot.setRotX(45 * Mth.DEG_TO_RAD);
}
if (t >= 39.5 && t < 41.5) {
trackL.setPosY(-5.3f - (t - 39.5f) * 3);
trackL.setPosZ(116);
trackLRot.setRotX(90 * Mth.DEG_TO_RAD);
}
if (t >= 41.5 && t < 43) {
trackL.setPosY(-11.6f - (t - 41.5f) * 3 * 0.7071f);
trackL.setPosZ(115 - (t - 41.5f) * 3 * 0.7071f);
trackLRot.setRotX(135 * Mth.DEG_TO_RAD);
}
if (t >= 43 && t < 49.5) {
trackL.setPosY(-15.6f - (t - 43f) * 3 * 0.45f);
trackL.setPosZ(109.5f - (t - 43f) * 3 * 0.75f);
trackLRot.setRotX(150 * Mth.DEG_TO_RAD);
}
if (t >= 49.5 && t < 76.5) {
trackL.setPosY(-23.5f);
trackL.setPosZ(95f - (t - 49.5f) * 3);
trackLRot.setRotX(180 * Mth.DEG_TO_RAD);
}
if (t >= 76.5 && t < 83.5) {
trackL.setPosY(-23.5f + (t - 76.5f) * 3 * 0.45f);
trackL.setPosZ(13.5f - (t - 76.5f) * 3 * 0.75f);
trackLRot.setRotX(210 * Mth.DEG_TO_RAD);
}
if (t >= 83.5 && t < 85.5) {
trackL.setPosY(-12.7f + (t - 83.5f) * 3 * 0.7071f);
trackL.setPosZ(-3.5f - (t - 83.5f) * 3 * 0.7071f);
trackLRot.setRotX(225 * Mth.DEG_TO_RAD);
}
if (t >= 85.5 && t < 87) {
trackL.setPosY(-9.2f + (t - 85.5f) * 3);
trackL.setPosZ(-6.9f);
trackLRot.setRotX(270 * Mth.DEG_TO_RAD);
}
if (t >= 87 && t < 89) {
trackL.setPosY(-4.3f + (t - 87f) * 3 * 0.7071f);
trackL.setPosZ(-6.9f + (t - 87f) * 3 * 0.7071f);
trackLRot.setRotX(315 * Mth.DEG_TO_RAD);
}
float t2 = animatable.getEntityData().get(TRACK_R) + 2 * i; float t2 = animatable.getEntityData().get(TRACK_R) + 2 * i;
@ -122,65 +63,69 @@ public class Bmp2Model extends GeoModel<Bmp2Entity> {
t2 -= 100; t2 -= 100;
} }
if (t2 < 37.5) { trackAnimation(trackR, trackRRot, t2);
trackR.setPosY(0); }
trackR.setPosZ(3 * t2); }
trackRRot.setRotX(0);
}
if (t2>= 37.5 && t2< 39.5) { public void trackAnimation(CoreGeoBone track, CoreGeoBone trackRot, float t) {
trackR.setPosY(-(t2- 37.5f) * 3 * 0.7071f); if (t < 37.5) {
trackR.setPosZ(3 * 37.5f + (t2- 37.5f) * 3 * 0.7071f); track.setPosY(0);
trackRRot.setRotX(45 * Mth.DEG_TO_RAD); track.setPosZ(3 * t);
} trackRot.setRotX(0);
}
if (t2>= 39.5 && t2< 41.5) { if (t >= 37.5 && t < 39.5) {
trackR.setPosY(-5.3f - (t2- 39.5f) * 3); track.setPosY(-(t - 37.5f) * 3 * 0.7071f);
trackR.setPosZ(116); track.setPosZ(3 * 37.5f + (t - 37.5f) * 3 * 0.7071f);
trackRRot.setRotX(90 * Mth.DEG_TO_RAD); trackRot.setRotX(45 * Mth.DEG_TO_RAD);
} }
if (t2>= 41.5 && t2< 43) { if (t >= 39.5 && t < 41.5) {
trackR.setPosY(-11.6f - (t2- 41.5f) * 3 * 0.7071f); track.setPosY(-5.3f - (t - 39.5f) * 3);
trackR.setPosZ(115 - (t2- 41.5f) * 3 * 0.7071f); track.setPosZ(116);
trackRRot.setRotX(135 * Mth.DEG_TO_RAD); trackRot.setRotX(90 * Mth.DEG_TO_RAD);
} }
if (t2>= 43 && t2< 49.5) { if (t >= 41.5 && t < 43) {
trackR.setPosY(-15.6f - (t2- 43f) * 3 * 0.45f); track.setPosY(-11.6f - (t - 41.5f) * 3 * 0.7071f);
trackR.setPosZ(109.5f - (t2- 43f) * 3 * 0.75f); track.setPosZ(115 - (t - 41.5f) * 3 * 0.7071f);
trackRRot.setRotX(150 * Mth.DEG_TO_RAD); trackRot.setRotX(135 * Mth.DEG_TO_RAD);
} }
if (t2>= 49.5 && t2< 76.5) { if (t >= 43 && t < 49.5) {
trackR.setPosY(-23.5f); track.setPosY(-15.6f - (t - 43f) * 3 * 0.45f);
trackR.setPosZ(95f - (t2- 49.5f) * 3); track.setPosZ(109.5f - (t - 43f) * 3 * 0.75f);
trackRRot.setRotX(180 * Mth.DEG_TO_RAD); trackRot.setRotX(150 * Mth.DEG_TO_RAD);
} }
if (t2>= 76.5 && t2< 83.5) { if (t >= 49.5 && t < 76.5) {
trackR.setPosY(-23.5f + (t2- 76.5f) * 3 * 0.45f); track.setPosY(-23.5f);
trackR.setPosZ(13.5f - (t2- 76.5f) * 3 * 0.75f); track.setPosZ(95f - (t - 49.5f) * 3);
trackRRot.setRotX(210 * Mth.DEG_TO_RAD); trackRot.setRotX(180 * Mth.DEG_TO_RAD);
} }
if (t2>= 83.5 && t2< 85.5) { if (t >= 76.5 && t < 83.5) {
trackR.setPosY(-12.7f + (t2- 83.5f) * 3 * 0.7071f); track.setPosY(-23.5f + (t - 76.5f) * 3 * 0.45f);
trackR.setPosZ(-3.5f - (t2- 83.5f) * 3 * 0.7071f); track.setPosZ(13.5f - (t - 76.5f) * 3 * 0.75f);
trackRRot.setRotX(225 * Mth.DEG_TO_RAD); trackRot.setRotX(210 * Mth.DEG_TO_RAD);
} }
if (t2>= 85.5 && t2< 87) { if (t >= 83.5 && t < 85.5) {
trackR.setPosY(-9.2f + (t2- 85.5f) * 3); track.setPosY(-12.7f + (t - 83.5f) * 3 * 0.7071f);
trackR.setPosZ(-6.9f); track.setPosZ(-3.5f - (t - 83.5f) * 3 * 0.7071f);
trackRRot.setRotX(270 * Mth.DEG_TO_RAD); trackRot.setRotX(225 * Mth.DEG_TO_RAD);
} }
if (t2>= 87 && t2< 89) { if (t >= 85.5 && t < 87) {
trackR.setPosY(-4.3f + (t2- 87f) * 3 * 0.7071f); track.setPosY(-9.2f + (t - 85.5f) * 3);
trackR.setPosZ(-6.9f + (t2- 87f) * 3 * 0.7071f); track.setPosZ(-6.9f);
trackRRot.setRotX(315 * Mth.DEG_TO_RAD); trackRot.setRotX(270 * Mth.DEG_TO_RAD);
} }
if (t >= 87 && t < 89) {
track.setPosY(-4.3f + (t - 87f) * 3 * 0.7071f);
track.setPosZ(-6.9f + (t - 87f) * 3 * 0.7071f);
trackRot.setRotX(315 * Mth.DEG_TO_RAD);
} }
} }
} }

View file

@ -248,7 +248,7 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli
this.setZRot(this.roll * 0.9f); this.setZRot(this.roll * 0.9f);
this.setXRot(this.getXRot() * 0.9f); this.setXRot(this.getXRot() * 0.9f);
} else { } else {
float f = (float) Mth.clamp(0.945f + 0.02f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); float f = (float) Mth.clamp(0.875f + 0.02f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99);
this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((this.getXRot() < 0 ? -0.032 : (this.getXRot() > 0 ? 0.032 : 0)) * this.getDeltaMovement().length()))); this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((this.getXRot() < 0 ? -0.032 : (this.getXRot() > 0 ? 0.032 : 0)) * this.getDeltaMovement().length())));
this.setDeltaMovement(this.getDeltaMovement().multiply(f, 0.95, f)); this.setDeltaMovement(this.getDeltaMovement().multiply(f, 0.95, f));
} }
@ -309,10 +309,10 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli
if (rightInputDown) { if (rightInputDown) {
holdTick++; holdTick++;
this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) - 2f * Math.min(holdTick, 7) * this.entityData.get(PROPELLER_ROT)); this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) - 2f * Math.min(holdTick, 7) * this.entityData.get(POWER));
} else if (this.leftInputDown) { } else if (this.leftInputDown) {
holdTick++; holdTick++;
this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) + 2f * Math.min(holdTick, 7) * this.entityData.get(PROPELLER_ROT)); this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) + 2f * Math.min(holdTick, 7) * this.entityData.get(POWER));
} else { } else {
holdTick = 0; holdTick = 0;
} }
@ -333,14 +333,14 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli
} }
if (up && engineStartOver) { if (up && engineStartOver) {
this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + 0.0032f, 0.12f)); this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + 0.005f, 0.12f));
} }
if (engineStartOver) { if (engineStartOver) {
if (down) { if (down) {
this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.0022f, this.onGround() ? 0 : 0.01f)); this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.0036f, this.onGround() ? 0 : 0.01f));
} else if (backInputDown) { } else if (backInputDown) {
this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.0022f, this.onGround() ? 0 : 0.052f)); this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.0036f, this.onGround() ? 0 : 0.052f));
if (passenger != null) { if (passenger != null) {
passenger.setXRot(0.8f * passenger.getXRot()); passenger.setXRot(0.8f * passenger.getXRot());
} }
@ -368,7 +368,7 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli
} }
this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.9f); this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.9f);
this.entityData.set(PROPELLER_ROT, Mth.lerp(0.5f, this.entityData.get(PROPELLER_ROT), this.entityData.get(POWER))); this.entityData.set(PROPELLER_ROT, Mth.lerp(0.18f, this.entityData.get(PROPELLER_ROT), this.entityData.get(POWER)));
this.setPropellerRot(this.getPropellerRot() + 30 * this.entityData.get(PROPELLER_ROT)); this.setPropellerRot(this.getPropellerRot() + 30 * this.entityData.get(PROPELLER_ROT));
this.entityData.set(PROPELLER_ROT, this.entityData.get(PROPELLER_ROT) * 0.9995f); this.entityData.set(PROPELLER_ROT, this.entityData.get(PROPELLER_ROT) * 0.9995f);
@ -376,13 +376,13 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli
this.consumeEnergy((int) (VehicleConfig.AH_6_MIN_ENERGY_COST.get() + this.entityData.get(POWER) * ((VehicleConfig.AH_6_MAX_ENERGY_COST.get() - VehicleConfig.AH_6_MIN_ENERGY_COST.get()) / 0.12))); this.consumeEnergy((int) (VehicleConfig.AH_6_MIN_ENERGY_COST.get() + this.entityData.get(POWER) * ((VehicleConfig.AH_6_MAX_ENERGY_COST.get() - VehicleConfig.AH_6_MIN_ENERGY_COST.get()) / 0.12)));
} }
setDeltaMovement(getDeltaMovement().add(0.0f, Math.min(Math.sin((90 - this.getXRot()) * Mth.DEG_TO_RAD), Math.sin((90 + this.getRoll()) * Mth.DEG_TO_RAD)) * this.entityData.get(PROPELLER_ROT), 0.0f)); setDeltaMovement(getDeltaMovement().add(0.0f, Math.min(Math.sin((90 - this.getXRot()) * Mth.DEG_TO_RAD), Math.sin((90 + this.getRoll()) * Mth.DEG_TO_RAD)) * this.entityData.get(POWER), 0.0f));
Vector3f direction = getRightDirection().mul(Math.cos((this.getRoll() + 90) * Mth.DEG_TO_RAD) * this.entityData.get(PROPELLER_ROT)); Vector3f direction = getRightDirection().mul(Math.cos((this.getRoll() + 90) * Mth.DEG_TO_RAD) * this.entityData.get(PROPELLER_ROT));
setDeltaMovement(getDeltaMovement().add(new Vec3(direction.x, direction.y, direction.z).scale(backInputDown ? 0.45 : 0.85))); setDeltaMovement(getDeltaMovement().add(new Vec3(direction.x, direction.y, direction.z).scale(backInputDown ? 0.1 : 2)));
Vector3f directionZ = getForwardDirection().mul(-Math.cos((this.getXRot() + 90) * Mth.DEG_TO_RAD) * this.entityData.get(PROPELLER_ROT)); Vector3f directionZ = getForwardDirection().mul(-Math.cos((this.getXRot() + 90) * Mth.DEG_TO_RAD) * this.entityData.get(PROPELLER_ROT));
setDeltaMovement(getDeltaMovement().add(new Vec3(directionZ.x, directionZ.y, directionZ.z).scale(backInputDown ? 0.1 : 0.35))); setDeltaMovement(getDeltaMovement().add(new Vec3(directionZ.x, directionZ.y, directionZ.z).scale(backInputDown ? 0.1 : 2)));
if (this.entityData.get(POWER) > 0.04f) { if (this.entityData.get(POWER) > 0.04f) {
engineStartOver = true; engineStartOver = true;

View file

@ -1,28 +1,24 @@
package com.atsuishio.superbwarfare.mixins; package com.atsuishio.superbwarfare.mixins;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(Entity.class) @Mixin(Entity.class)
public class EntityMixin { public class EntityMixin {
// TODO 优化后续逻辑 // TODO 优化后续逻辑
@Redirect(method = "turn(DD)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setXRot(F)V", ordinal = 1)) // @Redirect(method = "turn(DD)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setXRot(F)V", ordinal = 1))
public void turn(Entity instance, float pXRot) { // public void turn(Entity instance, float pXRot) {
if (instance instanceof Player player) { // if (instance instanceof Player player) {
player.setXRot(player.getXRot()); // player.setXRot(player.getXRot());
while (player.getXRot() > 180F) { // while (player.getXRot() > 180F) {
player.setXRot(player.getXRot() - 360F); // player.setXRot(player.getXRot() - 360F);
} // }
while (player.getYRot() <= -180F) { // while (player.getYRot() <= -180F) {
player.setXRot(player.getXRot() + 360F); // player.setXRot(player.getXRot() + 360F);
} // }
} else { // } else {
instance.setXRot(Mth.clamp(instance.getXRot(), -90.0F, 90.0F)); // instance.setXRot(Mth.clamp(instance.getXRot(), -90.0F, 90.0F));
} // }
} // }
} }