优化动画

This commit is contained in:
Atsuihsio 2024-11-01 16:50:41 +08:00
parent fe9d843e6d
commit 148e80bd2a
9 changed files with 186 additions and 57 deletions

View file

@ -41,7 +41,6 @@ public class AK12ItemModel extends GeoModel<AK12Item> {
@Override
public void setCustomAnimations(AK12Item animatable, long instanceId, AnimationState animationState) {
CoreGeoBone gun = getAnimationProcessor().getBone("bone");
CoreGeoBone shen = getAnimationProcessor().getBone("shen");
CoreGeoBone scope1 = getAnimationProcessor().getBone("Scope1");
CoreGeoBone scope2 = getAnimationProcessor().getBone("Scope2");
CoreGeoBone scope3 = getAnimationProcessor().getBone("Scope3");
@ -54,6 +53,7 @@ public class AK12ItemModel extends GeoModel<AK12Item> {
ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return;
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
double zt = ClientEventHandler.zoomTime;
double zp = ClientEventHandler.zoomPos;
double zpz = ClientEventHandler.zoomPosZ;
@ -67,12 +67,11 @@ public class AK12ItemModel extends GeoModel<AK12Item> {
double turnRotX = ClientEventHandler.turnRot[0];
double turnRotY = ClientEventHandler.turnRot[1];
double turnRotZ = ClientEventHandler.turnRot[2];
double fpz = ClientEventHandler.firePosZ;
double fpz = ClientEventHandler.firePosZ * 13 * times;;
double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot;
int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
float posY = switch (type) {
case 0 -> 0.781f;
@ -110,22 +109,35 @@ public class AK12ItemModel extends GeoModel<AK12Item> {
stack.getOrCreateTag().putBoolean("HoloHidden", !(gun.getPosX() > 1.85));
fireRotY = (float) Mth.lerp(0.35f * times, fireRotY, 0.26f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.35f * times, fireRotZ, (0.4f + 0.5 * fr) * ClientEventHandler.recoilHorizon);
CoreGeoBone shen;
if (zt < 0.5) {
shen = getAnimationProcessor().getBone("fireRootNormal");
} else {
shen = switch (type) {
case 0 -> getAnimationProcessor().getBone("fireRoot0");
case 1 -> getAnimationProcessor().getBone("fireRoot1");
case 2 -> getAnimationProcessor().getBone("fireRoot2");
case 3 -> getAnimationProcessor().getBone("fireRoot3");
default -> getAnimationProcessor().getBone("fireRootNormal");
};
}
shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp));
fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.7f * times, fireRotZ, (0.4f + 0.5 * fr) * ClientEventHandler.recoilHorizon);
shen.setPosX((float) (-1.65f * ClientEventHandler.recoilHorizon * fpz * fp));
shen.setPosY((float) (0.15f * fp + 0.18f * fr));
shen.setPosZ((float) (0.275 * fp + 0.34f * fr + 0.65 * fpz));
shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz));
shen.setRotX((float) (0.01f * fp + 0.08f * fr + 0.01f * fpz));
shen.setRotY(fireRotY);
shen.setRotZ(fireRotZ);
shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt)));
shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt)));
shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt)));
shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.75 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
shuan.setPosZ(2.4f * (float) fp);

View file

@ -37,7 +37,6 @@ public class AK47ItemModel extends GeoModel<AK47Item> {
@Override
public void setCustomAnimations(AK47Item animatable, long instanceId, AnimationState animationState) {
CoreGeoBone gun = getAnimationProcessor().getBone("bone");
CoreGeoBone shen = getAnimationProcessor().getBone("shen");
CoreGeoBone scope = getAnimationProcessor().getBone("Scope1");
CoreGeoBone scope2 = getAnimationProcessor().getBone("Scope2");
CoreGeoBone scope3 = getAnimationProcessor().getBone("Scope3");
@ -49,6 +48,7 @@ public class AK47ItemModel extends GeoModel<AK47Item> {
ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return;
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
double zt = ClientEventHandler.zoomTime;
double zp = ClientEventHandler.zoomPos;
double zpz = ClientEventHandler.zoomPosZ;
@ -62,12 +62,11 @@ public class AK47ItemModel extends GeoModel<AK47Item> {
double turnRotX = ClientEventHandler.turnRot[0];
double turnRotY = ClientEventHandler.turnRot[1];
double turnRotZ = ClientEventHandler.turnRot[2];
double fpz = ClientEventHandler.firePosZ;
double fpz = ClientEventHandler.firePosZ * 13 * times;
double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot;
int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
float posYAlt = switch (type) {
case 2 -> 0.45f;
@ -111,22 +110,35 @@ public class AK47ItemModel extends GeoModel<AK47Item> {
stack.getOrCreateTag().putBoolean("HoloHidden", !(gun.getPosX() > 1.8));
fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.3f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.3f * times, fireRotZ, (0.5f + 0.7 * fr) * ClientEventHandler.recoilHorizon);
CoreGeoBone shen;
if (zt < 0.5) {
shen = getAnimationProcessor().getBone("fireRootNormal");
} else {
shen = switch (type) {
case 0 -> getAnimationProcessor().getBone("fireRoot0");
case 1 -> getAnimationProcessor().getBone("fireRoot1");
case 2 -> getAnimationProcessor().getBone("fireRoot2");
case 3 -> getAnimationProcessor().getBone("fireRoot3");
default -> getAnimationProcessor().getBone("fireRootNormal");
};
}
shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp));
fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.7f * times, fireRotZ, (0.4f + 0.5 * fr) * ClientEventHandler.recoilHorizon);
shen.setPosX((float) (-1.65f * ClientEventHandler.recoilHorizon * fpz * fp));
shen.setPosY((float) (0.15f * fp + 0.18f * fr));
shen.setPosZ((float) (0.275 * fp + 0.34f * fr + 0.65 * fpz));
shen.setRotX((float) (0.01f * fp + 0.08f * fr + 0.01f * fpz));
shen.setRotY(fireRotY);
shen.setRotZ(fireRotZ);
shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt)));
shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt)));
shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt)));
shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.8 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.8 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.75 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
shuan.setPosZ(2.4f * (float) fp);

View file

@ -39,7 +39,6 @@ public class Hk416ItemModel extends GeoModel<Hk416Item> {
@Override
public void setCustomAnimations(Hk416Item animatable, long instanceId, AnimationState animationState) {
CoreGeoBone gun = getAnimationProcessor().getBone("bone");
CoreGeoBone shen = getAnimationProcessor().getBone("shen");
CoreGeoBone scope = getAnimationProcessor().getBone("Scope1");
CoreGeoBone scope2 = getAnimationProcessor().getBone("Scope2");
CoreGeoBone scope3 = getAnimationProcessor().getBone("Scope3");
@ -52,6 +51,8 @@ public class Hk416ItemModel extends GeoModel<Hk416Item> {
ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return;
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
double zt = ClientEventHandler.zoomTime;
double zp = ClientEventHandler.zoomPos;
double zpz = ClientEventHandler.zoomPosZ;
@ -65,12 +66,11 @@ public class Hk416ItemModel extends GeoModel<Hk416Item> {
double turnRotX = ClientEventHandler.turnRot[0];
double turnRotY = ClientEventHandler.turnRot[1];
double turnRotZ = ClientEventHandler.turnRot[2];
double fpz = ClientEventHandler.firePosZ;
double fpz = ClientEventHandler.firePosZ * 17 * times;
double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot;
int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
float posY = switch (type) {
case 0 -> 1.04f;
@ -102,22 +102,35 @@ public class Hk416ItemModel extends GeoModel<Hk416Item> {
stack.getOrCreateTag().putBoolean("HoloHidden", !(gun.getPosX() > 3.1));
fireRotY = (float) Mth.lerp(0.4f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.4f * times, fireRotZ, (0.3f + 0.4 * fr) * ClientEventHandler.recoilHorizon);
CoreGeoBone shen;
if (zt < 0.5) {
shen = getAnimationProcessor().getBone("fireRootNormal");
} else {
shen = switch (type) {
case 0 -> getAnimationProcessor().getBone("fireRoot0");
case 1 -> getAnimationProcessor().getBone("fireRoot1");
case 2 -> getAnimationProcessor().getBone("fireRoot2");
case 3 -> getAnimationProcessor().getBone("fireRoot3");
default -> getAnimationProcessor().getBone("fireRootNormal");
};
}
shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp));
fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.9f * times, fireRotZ, (0.2f + 0.3 * fr) * ClientEventHandler.recoilHorizon);
shen.setPosX((float) (-3.45f * ClientEventHandler.recoilHorizon * fpz * fp));
shen.setPosY((float) (0.15f * fp + 0.18f * fr));
shen.setPosZ((float) (0.275 * fp + 0.34f * fr + 0.65 * fpz));
shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz));
shen.setRotY(fireRotY);
shen.setRotZ(fireRotZ);
shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt)));
shen.setPosY((float) (shen.getPosY() * (-1 + 0.4 * zt)));
shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt)));
shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt)));
shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.75 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
cross1.setPosY(-0.75f * (float) fpz);
cross2.setPosY(-0.7f * (float) fpz);

View file

@ -44,7 +44,6 @@ public class M4ItemModel extends GeoModel<M4Item> {
@Override
public void setCustomAnimations(M4Item animatable, long instanceId, AnimationState animationState) {
CoreGeoBone gun = getAnimationProcessor().getBone("bone");
CoreGeoBone shen = getAnimationProcessor().getBone("shen");
CoreGeoBone scope = getAnimationProcessor().getBone("Scope1");
CoreGeoBone scope2 = getAnimationProcessor().getBone("Scope2");
CoreGeoBone scope3 = getAnimationProcessor().getBone("Scope3");
@ -61,6 +60,7 @@ public class M4ItemModel extends GeoModel<M4Item> {
ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return;
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
double zt = ClientEventHandler.zoomTime;
double zp = ClientEventHandler.zoomPos;
double zpz = ClientEventHandler.zoomPosZ;
@ -74,12 +74,11 @@ public class M4ItemModel extends GeoModel<M4Item> {
double turnRotX = ClientEventHandler.turnRot[0];
double turnRotY = ClientEventHandler.turnRot[1];
double turnRotZ = ClientEventHandler.turnRot[2];
double fpz = ClientEventHandler.firePosZ;
double fpz = ClientEventHandler.firePosZ * 17 * times;
double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot;
int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 1.6);
posYAlt = Mth.lerp(times, posYAlt, stack.getOrCreateTag().getBoolean("ScopeAlt")? -0.6875f : 0.5625f);
scaleZAlt = Mth.lerp(times, scaleZAlt, stack.getOrCreateTag().getBoolean("ScopeAlt")? 0.4f : 0.88f);
@ -125,27 +124,40 @@ public class M4ItemModel extends GeoModel<M4Item> {
if (type == 3 && zt > 0.5) {
lh.setPosY((float) (-zt * 4));
}
CoreGeoBone shen;
if (zt < 0.5) {
shen = getAnimationProcessor().getBone("fireRootNormal");
} else {
shen = switch (type) {
case 0 -> getAnimationProcessor().getBone("fireRoot0");
case 1 -> getAnimationProcessor().getBone("fireRoot1");
case 2 -> getAnimationProcessor().getBone("fireRoot2");
case 3 -> getAnimationProcessor().getBone("fireRoot3");
default -> getAnimationProcessor().getBone("fireRootNormal");
};
}
fireRotY = (float) Mth.lerp(0.38f * times, fireRotY, 0.25f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.38f * times, fireRotZ, (0.3f + 0.5 * fr) * ClientEventHandler.recoilHorizon);
fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(0.9f * times, fireRotZ, (0.2f + 0.3 * fr) * ClientEventHandler.recoilHorizon);
shen.setPosX((float) (1.35f * ClientEventHandler.recoilHorizon * fpz * fp));
shen.setPosX((float) (-3.45f * ClientEventHandler.recoilHorizon * fpz * fp));
shen.setPosY((float) (0.15f * fp + 0.18f * fr));
shen.setPosZ((float) (0.345 * fp + 0.44f * fr + 0.75 * fpz));
shen.setPosZ((float) (0.275 * fp + 0.34f * fr + 0.65 * fpz));
shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz));
shen.setRotY(fireRotY);
shen.setRotZ(fireRotZ);
cross1.setPosY(-0.75f * (float) fpz);
cross1.setPosY(-0.25f * (float) fpz);
cross2.setPosY(-0.1f * (float) fpz);
crossAlt.setPosY(-0.2f * (float) fpz);
cross3.setPosY(-0.2f * (float) fpz);
shen.setPosX((float) (shen.getPosX() * (1 - 0.8 * zt)));
shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt)));
shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt)));
shen.setRotX((float) (shen.getRotX() * (1 - (type == 3 ? 0.96 : type == 1 ? 0.4 : 0.9) * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - (type == 3 ? 0.98 : 0.9) * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt)));
shen.setRotX((float) (shen.getRotX() * (1 - (type == 3 ? 0.96 : type == 1 ? 0.8 : 0.9) * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - (type == 3 ? 0.95 : 0.9) * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
shen.setPosX(0.2f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread)));

View file

@ -509,7 +509,7 @@ public class ClientEventHandler {
}
private static void handleWeaponFire(ViewportEvent.ComputeCameraAngles event, LivingEntity entity) {
float times = 2f * Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8f);
float times = 2f * Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.48f);
float yaw = event.getYaw();
float pitch = event.getPitch();
float roll = event.getRoll();
@ -520,8 +520,8 @@ public class ClientEventHandler {
firePosTimer = 0.001;
fireRotTimer = 0.001;
fireRecoilTime -= 7 * times;
fireSpread += 0.1;
firePosZ += 0.5 * firePosZ + 0.15;
fireSpread += 0.1 * times;
firePosZ += (0.8 * firePosZ + 0.25) * (4 * Math.random() + 0.85) * times;
recoilTime = 0.01;
}

View file

@ -25,13 +25,33 @@
"pivot": [0, 0, 0]
},
{
"name": "shen",
"name": "fireRootNormal",
"parent": "bone",
"pivot": [0.5, 3, 2]
"pivot": [0.5, 0, 3]
},
{
"name": "fireRoot0",
"parent": "fireRootNormal",
"pivot": [0.5, 3.55, 2]
},
{
"name": "fireRoot1",
"parent": "fireRoot0",
"pivot": [0.5, 4.42656, 2]
},
{
"name": "fireRoot2",
"parent": "fireRoot1",
"pivot": [0.59609, 4.52187, 2]
},
{
"name": "fireRoot3",
"parent": "fireRoot2",
"pivot": [0.5, 4.58828, 2]
},
{
"name": "0",
"parent": "shen",
"parent": "fireRoot3",
"pivot": [0, 0, 0]
},
{

View file

@ -25,13 +25,33 @@
"pivot": [0, 0, 0]
},
{
"name": "shen",
"name": "fireRootNormal",
"parent": "bone",
"pivot": [0.5, 3.5, 3]
"pivot": [0.5, 0, 3]
},
{
"name": "fireRoot0",
"parent": "fireRootNormal",
"pivot": [0.5, 3.86953, 2]
},
{
"name": "fireRoot1",
"parent": "fireRoot0",
"pivot": [0.5, 4.20703, 2]
},
{
"name": "fireRoot2",
"parent": "fireRoot1",
"pivot": [0.5, 4.70625, 2]
},
{
"name": "fireRoot3",
"parent": "fireRoot2",
"pivot": [0.5, 4.6625, 2]
},
{
"name": "0",
"parent": "shen",
"parent": "fireRoot3",
"pivot": [0, 0, 0]
},
{

View file

@ -21,13 +21,33 @@
"pivot": [0, 0, 0]
},
{
"name": "shen",
"name": "fireRootNormal",
"parent": "bone",
"pivot": [0, 3.4, 3]
"pivot": [0.5, 0, 3]
},
{
"name": "fireRoot0",
"parent": "fireRootNormal",
"pivot": [0, 4.25, 2]
},
{
"name": "fireRoot1",
"parent": "fireRoot0",
"pivot": [0, 4.78437, 2]
},
{
"name": "fireRoot2",
"parent": "fireRoot1",
"pivot": [0, 5.02187, 2]
},
{
"name": "fireRoot3",
"parent": "fireRoot2",
"pivot": [0, 4.78828, 2]
},
{
"name": "0",
"parent": "shen",
"parent": "fireRoot3",
"pivot": [0, 0, 0]
},
{

View file

@ -25,13 +25,33 @@
"pivot": [0, 0, 0]
},
{
"name": "shen",
"name": "fireRootNormal",
"parent": "bone",
"pivot": [0, 3, 3.25]
"pivot": [0.5, 0, 3]
},
{
"name": "fireRoot0",
"parent": "fireRootNormal",
"pivot": [0, 4.64609, 2]
},
{
"name": "fireRoot1",
"parent": "fireRoot0",
"pivot": [0, 5.07578, 2]
},
{
"name": "fireRoot2",
"parent": "fireRoot1",
"pivot": [0, 4.92187, 2]
},
{
"name": "fireRoot3",
"parent": "fireRoot2",
"pivot": [0, 4.63125, 2]
},
{
"name": "0",
"parent": "shen",
"parent": "fireRoot3",
"pivot": [0, 0, 0]
},
{