From 395ee785ebab8e703df9f6b83e331f56979503e9 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Wed, 2 Apr 2025 15:27:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BD=BD=E5=85=B7=E4=B9=98?= =?UTF-8?q?=E5=AE=A2=E4=BD=8D=E7=BD=AE=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=90=84?= =?UTF-8?q?=E7=A7=8D=E7=81=AB=E7=82=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/vehicle/Ah6Entity.java | 3 +- .../entity/vehicle/AnnihilatorEntity.java | 22 +++- .../entity/vehicle/Mk42Entity.java | 36 ++++-- .../entity/vehicle/Mle1934Entity.java | 122 ++++++++---------- .../entity/vehicle/Tom6Entity.java | 3 +- .../entity/vehicle/WheelChairEntity.java | 3 +- .../entity/vehicle/base/VehicleEntity.java | 8 ++ 7 files changed, 101 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java index 64c01fd8a..e0cbaa381 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -440,9 +440,8 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity Matrix4f transform = getVehicleTransform(1); float x = 0.6f; - float y = 1.2f - 1.45f; + float y = -0.85f; float z = 1f; - y += (float) passenger.getVehicleAttachmentPoint(this).y; int i = this.getOrderedPassengers().indexOf(passenger); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java index 99f9fb268..8cba31313 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/AnnihilatorEntity.java @@ -53,13 +53,14 @@ import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import org.joml.Math; +import org.joml.Matrix4f; import org.joml.Vector3d; +import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Comparator; public class AnnihilatorEntity extends EnergyVehicleEntity implements GeoEntity, CannonEntity { @@ -174,13 +175,20 @@ public class AnnihilatorEntity extends EnergyVehicleEntity implements GeoEntity, } @Override - @ParametersAreNonnullByDefault - protected void positionRider(Entity pPassenger, MoveFunction pCallback) { - if (this.hasPassenger(pPassenger)) { - float f1 = (float) ((this.isRemoved() ? 0.009999999776482582 : this.getPassengerRidingPosition(pPassenger).y) + pPassenger.getVehicleAttachmentPoint(this).y); - Vec3 vec3 = (new Vec3(1, 0.0, 0.0)).yRot(-this.getYRot() * 0.017453292F - 1.5707964F); - pCallback.accept(pPassenger, this.getX() + vec3.x, this.getY() + (double) f1, this.getZ() + vec3.z); + public void positionRider(@NotNull Entity passenger, @NotNull MoveFunction callback) { + if (!this.hasPassenger(passenger)) { + return; } + + Matrix4f transform = getVehicleFlatTransform(1); + + float x = 0f; + float y = 3.3f; + float z = 1.5f; + + Vector4f worldPosition = transformPosition(transform, x, y, z); + passenger.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + callback.accept(passenger, worldPosition.x, worldPosition.y, worldPosition.z); } // TODO addEntityPacket diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java index 15ef7ab2f..ef27c02d9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mk42Entity.java @@ -45,6 +45,8 @@ import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import org.joml.Math; +import org.joml.Matrix4f; +import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; @@ -160,11 +162,6 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity entityData.set(PITCH, Mth.wrapDegrees((float) (-(Mth.atan2(d1, d3) * 57.2957763671875))) - (float) (distance * 0.008f)); } - @Override - public double getEyeY() { - return 2.16F; - } - // TODO addEntityPacket @Override public @NotNull Packet getAddEntityPacket(@NotNull ServerEntity entity) { @@ -178,8 +175,20 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity @Override - public @NotNull Vec3 getPassengerRidingPosition(@NotNull Entity entity) { - return super.getPassengerRidingPosition(entity).add(0, -0.25, 0); + public void positionRider(@NotNull Entity passenger, @NotNull MoveFunction callback) { + if (!this.hasPassenger(passenger)) { + return; + } + + Matrix4f transform = getVehicleFlatTransform(1); + + float x = 0f; + float y = 2.3f; + float z = 0f; + + Vector4f worldPosition = transformPosition(transform, x, y, z); + passenger.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + callback.accept(passenger, worldPosition.x, worldPosition.y, worldPosition.z); } @Override @@ -284,8 +293,11 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity var entityToSpawn = ((CannonShellWeapon) getWeapon(0)).create(player); - entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ()); - entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 15, 0.05f); + Matrix4f transform = getVehicleFlatTransform(1); + Vector4f worldPosition = transformPosition(transform, 0f, 2.16f, 0.5175f); + + entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + entityToSpawn.shoot(getLookAngle().x, getLookAngle().y, getLookAngle().z, 15, 0.05f); level.addFreshEntity(entityToSpawn); if (player instanceof ServerPlayer serverPlayer) { @@ -304,9 +316,9 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity this.getZ() + 5 * this.getLookAngle().z, 100, 7, 0.02, 7, 0.005); - double x = this.getX() + 9 * this.getLookAngle().x; - double y = this.getEyeY() + 9 * this.getLookAngle().y; - double z = this.getZ() + 9 * this.getLookAngle().z; + double x = worldPosition.x + 9 * this.getLookAngle().x; + double y = worldPosition.y + 9 * this.getLookAngle().y; + double z = worldPosition.z + 9 * this.getLookAngle().z; server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075); server.sendParticles(ParticleTypes.CLOUD, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java index 4658fbab5..1a9e7c87d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Mle1934Entity.java @@ -45,13 +45,13 @@ import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import org.joml.Math; -import org.joml.Vector3d; +import org.joml.Matrix4f; +import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Comparator; public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEntity { @@ -182,13 +182,20 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt // } @Override - @ParametersAreNonnullByDefault - protected void positionRider(Entity pPassenger, MoveFunction pCallback) { - if (this.hasPassenger(pPassenger)) { - float f1 = (float) ((this.isRemoved() ? 0.009999999776482582 : this.getPassengerRidingPosition(this).y) + pPassenger.getVehicleAttachmentPoint(this).y); - Vec3 vec3 = (new Vec3(1, 0.0, 0.0)).yRot(-this.getYRot() * 0.017453292F - 1.5707964F); - pCallback.accept(pPassenger, this.getX() + vec3.x, this.getY() + (double) f1, this.getZ() + vec3.z); + public void positionRider(@NotNull Entity passenger, @NotNull MoveFunction callback) { + if (!this.hasPassenger(passenger)) { + return; } + + Matrix4f transform = getVehicleFlatTransform(1); + + float x = 0f; + float y = 2.0f; + float z = 0.5f; + + Vector4f worldPosition = transformPosition(transform, x, y, z); + passenger.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + callback.accept(passenger, worldPosition.x, worldPosition.y, worldPosition.z); } @Override @@ -302,97 +309,70 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt boolean salvoShoot = consumed == 2; - float yRot = this.getYRot(); - if (yRot < 0) { - yRot += 360; - } - yRot = yRot + 90 % 360; - - var leftPos = new Vector3d(0, 0, -0.45); - leftPos.rotateZ(-this.getXRot() * Mth.DEG_TO_RAD); - leftPos.rotateY(-yRot * Mth.DEG_TO_RAD); + Matrix4f transform = getVehicleFlatTransform(1); + Vector4f worldPositionL = transformPosition(transform, 0.486775f, 1.4992625f, 1.52065f); + Vector4f worldPositionR = transformPosition(transform, -0.486775f, 1.4992625f, 1.52065f); // 左炮管 var entityToSpawnLeft = ((CannonShellWeapon) getWeapon(0)).create(player); - entityToSpawnLeft.setPos(this.getX() + leftPos.x, - this.getEyeY() - 0.2 + leftPos.y, - this.getZ() + leftPos.z); + entityToSpawnLeft.setPos(worldPositionL.x, worldPositionL.y, worldPositionL.z); entityToSpawnLeft.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 15, 0.05f); level.addFreshEntity(entityToSpawnLeft); - var leftPosP1 = new Vector3d(8, 0, -0.45); - leftPosP1.rotateZ(-this.getXRot() * Mth.DEG_TO_RAD); - leftPosP1.rotateY(-yRot * Mth.DEG_TO_RAD); - server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, - this.getX() + leftPosP1.x, - this.getEyeY() - 0.2 + leftPosP1.y, - this.getZ() + leftPosP1.z, - 10, 0.4, 0.4, 0.4, 0.0075); + this.getX() + 5 * this.getLookAngle().x, + this.getY(), + this.getZ() + 5 * this.getLookAngle().z, + 100, 7, 0.02, 7, 0.005); - server.sendParticles(ParticleTypes.CLOUD, - this.getX() + leftPosP1.x, - this.getEyeY() - 0.2 + leftPosP1.y, - this.getZ() + leftPosP1.z, - 10, 0.4, 0.4, 0.4, 0.0075); + double x = worldPositionL.x + 9 * this.getLookAngle().x; + double y = worldPositionL.y + 9 * this.getLookAngle().y; + double z = worldPositionL.z + 9 * this.getLookAngle().z; - int count = 5; + server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075); + server.sendParticles(ParticleTypes.CLOUD, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075); - for (float i = 9.5f; i < 14; i += .5f) { - var leftPosP = new Vector3d(i, 0, -0.45); - leftPosP.rotateZ(-this.getXRot() * Mth.DEG_TO_RAD); - leftPosP.rotateY(-yRot * Mth.DEG_TO_RAD); + int count = 6; + for (float i = 9.5f; i < 16; i += .5f) { server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, - this.getX() + leftPosP.x, - this.getEyeY() - 0.2 + leftPosP.y, - this.getZ() + leftPosP.z, - Mth.clamp(count--, 1, 5), 0.1, 0.1, 0.1, 0.002); + worldPositionL.x + i * this.getLookAngle().x, + worldPositionL.y + i * this.getLookAngle().y, + worldPositionL.z + i * this.getLookAngle().z, + Mth.clamp(count--, 1, 5), 0.15, 0.15, 0.15, 0.0025); } + // 右炮管 if (salvoShoot) { - var rightPos = new Vector3d(0, 0, 0.45); - rightPos.rotateZ(-this.getXRot() * Mth.DEG_TO_RAD); - rightPos.rotateY(-yRot * Mth.DEG_TO_RAD); - var entityToSpawnRight = ((CannonShellWeapon) getWeapon(0)).create(player); - entityToSpawnRight.setPos(this.getX() + rightPos.x, - this.getEyeY() - 0.2 + rightPos.y, - this.getZ() + rightPos.z); + entityToSpawnRight.setPos(worldPositionR.x, worldPositionR.y, worldPositionR.z); entityToSpawnRight.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 15, 0.05f); level.addFreshEntity(entityToSpawnRight); - var rightPosP1 = new Vector3d(8, 0, 0.45); - rightPosP1.rotateZ(-this.getXRot() * Mth.DEG_TO_RAD); - rightPosP1.rotateY(-yRot * Mth.DEG_TO_RAD); - server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, - this.getX() + rightPosP1.x, - this.getEyeY() - 0.2 + rightPosP1.y, - this.getZ() + rightPosP1.z, - 10, 0.4, 0.4, 0.4, 0.0075); + this.getX() + 5 * this.getLookAngle().x, + this.getY(), + this.getZ() + 5 * this.getLookAngle().z, + 100, 7, 0.02, 7, 0.005); - server.sendParticles(ParticleTypes.CLOUD, - this.getX() + rightPosP1.x, - this.getEyeY() - 0.2 + rightPosP1.y, - this.getZ() + rightPosP1.z, - 10, 0.4, 0.4, 0.4, 0.0075); + double xR = worldPositionR.x + 9 * this.getLookAngle().x; + double yR = worldPositionR.y + 9 * this.getLookAngle().y; + double zR = worldPositionR.z + 9 * this.getLookAngle().z; - int countR = 5; + server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, xR, yR, zR, 10, 0.4, 0.4, 0.4, 0.0075); + server.sendParticles(ParticleTypes.CLOUD, xR, yR, zR, 10, 0.4, 0.4, 0.4, 0.0075); - for (float i = 9.5f; i < 14; i += .5f) { - var rightPosP = new Vector3d(i, 0, 0.45); - rightPosP.rotateZ(-this.getXRot() * Mth.DEG_TO_RAD); - rightPosP.rotateY(-yRot * Mth.DEG_TO_RAD); + int countR = 6; + for (float i = 9.5f; i < 16; i += .5f) { server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, - this.getX() + rightPosP.x, - this.getEyeY() - 0.2 + rightPosP.y, - this.getZ() + rightPosP.z, - Mth.clamp(countR--, 1, 5), 0.1, 0.1, 0.1, 0.002); + worldPositionR.x + i * this.getLookAngle().x, + worldPositionR.y + i * this.getLookAngle().y, + worldPositionR.z + i * this.getLookAngle().z, + Mth.clamp(countR--, 1, 5), 0.15, 0.15, 0.15, 0.0025); } this.entityData.set(TYPE, 1); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java index c131a9c0a..e03e1f212 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java @@ -266,9 +266,8 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { Matrix4f transform = getVehicleTransform(1); float x = 0f; - float y = 0.45f; + float y = 0.05f; float z = -0.4f; - y += (float) passenger.getVehicleAttachmentPoint(this).y; int i = this.getSeatIndex(passenger); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java index 445b69bf2..39dfb616f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java @@ -259,9 +259,8 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity { Matrix4f transform = getVehicleTransform(1); float x = 0f; - float y = 0.3f; + float y = 0f; float z = 0f; - y += (float) passenger.getVehicleAttachmentPoint(this).y; int i = this.getSeatIndex(passenger); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index a3e461411..4f48ab03c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -746,6 +746,14 @@ public abstract class VehicleEntity extends Entity { return transform; } + public Matrix4f getVehicleFlatTransform(float ticks) { + Matrix4f transform = new Matrix4f(); + transform.translate((float) Mth.lerp(ticks, xo, getX()), (float) Mth.lerp(ticks, yo, getY()), (float) Mth.lerp(ticks, zo, getZ())); + transform.rotate(Axis.YP.rotationDegrees(-Mth.lerp(ticks, yRotO, getYRot()))); + transform.rotate(Axis.ZP.rotationDegrees(Mth.lerp(ticks, prevRoll, getRoll()))); + return transform; + } + public Vector4f transformPosition(Matrix4f transform, float x, float y, float z) { return transform.transform(new Vector4f(x, y, z, 1)); }