优化bmp2履带动画,增强小鸟机动,期待后人智慧突破XRot限制
This commit is contained in:
parent
781988f32d
commit
f3091dc76b
3 changed files with 79 additions and 138 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue