From 74ead3d8b448958c3745930bf46a963ab6d82259 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Sun, 8 Jun 2025 19:31:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96a10=E5=92=8C=E5=B0=8F?= =?UTF-8?q?=E9=B8=9F=E7=9A=84=E7=9E=84=E5=87=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/AircraftOverlay.java | 6 +-- .../client/overlay/HelicopterHudOverlay.java | 29 ++---------- .../entity/vehicle/A10Entity.java | 24 +++++++--- .../entity/vehicle/Ah6Entity.java | 44 +++++++++++++------ .../entity/vehicle/base/AirEntity.java | 7 +++ .../entity/vehicle/base/AircraftEntity.java | 7 --- 6 files changed, 63 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java index ddadc270c..bc75303ed 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java @@ -93,7 +93,7 @@ public class AircraftOverlay implements LayeredDraw.Layer { Vec3 pos = cameraPos.add(mobileVehicle.getViewVector(partialTick).scale(192)); Vec3 lookAngle = lookVec.normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom)); - Vec3 posCross = cameraPos.add(aircraftEntity.shootVec(partialTick).scale(192)); + Vec3 posCross = aircraftEntity.shootPos(partialTick).add(aircraftEntity.shootVec(partialTick).scale(192)); Vec3 lookAngle2 = lookVec.normalize().scale(posCross.distanceTo(cameraPos) * (1 - 1.0 / zoom)); var cPos = cameraPos.add(lookAngle); @@ -221,8 +221,8 @@ public class AircraftOverlay implements LayeredDraw.Layer { // 准星 if (pCross != null) { poseStack.pushPose(); - float x = (float) pCross.x + (zoomVehicle ? 8 * (float) (Minecraft.getInstance().options.fov().get() / 70) : 3); - float y = (float) pCross.y + (zoomVehicle ? 25 * (float) (Minecraft.getInstance().options.fov().get() / 70) : 5); + float x = (float) pCross.x; + float y = (float) pCross.y + (zoomVehicle ? 15 * (float) (Minecraft.getInstance().options.fov().get() / 70) : 5); if (mc.options.getCameraType() == CameraType.FIRST_PERSON && !(mobileVehicle instanceof A10Entity a10Entity && a10Entity.getWeaponIndex(0) == 3)) { RenderSystem.disableDepthTest(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java index abf527d8b..ac92ebd8d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java @@ -6,7 +6,6 @@ import com.atsuishio.superbwarfare.client.RenderHelper; import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; import com.atsuishio.superbwarfare.entity.vehicle.base.HelicopterEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity; -import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.tools.FormatTool; @@ -32,8 +31,6 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import org.joml.Math; -import org.joml.Matrix4f; -import org.joml.Vector4f; import javax.annotation.ParametersAreNonnullByDefault; @@ -154,22 +151,17 @@ public class HelicopterHudOverlay implements LayeredDraw.Layer { } - Matrix4f transform = getVehicleTransform(mobileVehicle, partialTick); - float x0 = 0f; - float y0 = 0.65f; - float z0 = 0.8f; - - Vector4f worldPosition = transformPosition(transform, x0, y0, z0); float fovAdjust2 = (float) (Minecraft.getInstance().options.fov().get() / 30) - 1; double zoom = 0.96 * 3 + 0.06 * fovAdjust2; - Vec3 pos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(partialTick).scale(192)); - Vec3 lookAngle = mobileVehicle.getViewVector(partialTick).normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom)); + Vec3 lookVec = new Vec3(camera.getLookVector()); + Vec3 pos = iHelicopterEntity.shootPos(partialTick).add(iHelicopterEntity.shootVec(partialTick).scale(192)); + Vec3 lookAngle = lookVec.normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom)); var cPos = cameraPos.add(lookAngle); - Vec3 p = RenderHelper.worldToScreen(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(partialTick).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos); + Vec3 p = RenderHelper.worldToScreen(iHelicopterEntity.shootPos(partialTick).add(mobileVehicle.getViewVector(partialTick).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos); if (p != null) { poseStack.pushPose(); @@ -225,19 +217,6 @@ public class HelicopterHudOverlay implements LayeredDraw.Layer { preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_driver_angle.png"), k + diffY, l + diffX, 0, 0.0F, i, j, i, j); } - public static Matrix4f getVehicleTransform(VehicleEntity vehicle, float partialTicks) { - Matrix4f transform = new Matrix4f(); - transform.translate((float) Mth.lerp(partialTicks, vehicle.xo, vehicle.getX()), (float) Mth.lerp(partialTicks, vehicle.yo + 1.45, vehicle.getY() + 1.45), (float) Mth.lerp(partialTicks, vehicle.zo, vehicle.getZ())); - transform.rotate(Axis.YP.rotationDegrees(-vehicle.getYRot())); - transform.rotate(Axis.XP.rotationDegrees(vehicle.getXRot())); - transform.rotate(Axis.ZP.rotationDegrees(vehicle.getRoll())); - return transform; - } - - public static Vector4f transformPosition(Matrix4f transform, float x, float y, float z) { - return transform.transform(new Vector4f(x, y, z, 1)); - } - public static double length(double x, double y, double z) { return Math.sqrt(x * x + y * y + z * z); } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java index 5f6bf9af9..33f391abf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java @@ -766,7 +766,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity if (getWeaponIndex(0) == 0) { worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f); } else if (getWeaponIndex(0) == 1) { - worldPosition = transformPosition(transform, 0f, -1.76f, 1.87f); + worldPosition = transformPosition(transform, 0f, -1.443f, 0.13f); } else { worldPosition = transformPosition(transform, 0f, -1.203125f, 0.0625f); } @@ -783,7 +783,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity worldPosition2 = transformPosition(transform, 0, 0f, 1); } else { worldPosition = transformPosition(transform, 0, 0, 0); - worldPosition2 = transformPosition(transform, 0.007f, -0.03f, 1); + worldPosition2 = transformPosition(transform, 0, -0.03f, 1); } return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); } @@ -802,7 +802,12 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity boolean hasCreativeAmmo = getFirstPassenger() instanceof Player pPlayer && InventoryTool.hasCreativeAmmoBox(pPlayer); + Vector4f worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f); + Vector4f worldPosition2 = transformPosition(transform, 0.1321625f + 0.01f, -0.56446875f - 0.03f, 8.85210625f); + + Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); + if (this.entityData.get(AMMO) > 0 || hasCreativeAmmo) { entityData.set(FIRE_TIME, Math.min(entityData.get(FIRE_TIME) + 6, 6)); @@ -810,7 +815,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player); entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - entityToSpawn.shoot(shootVec(1).x, shootVec(1).y, shootVec(1).z, 30, 0.5f); + entityToSpawn.shoot(shootVec.x, shootVec.y, shootVec.z, 30, 0.5f); level().addFreshEntity(entityToSpawn); sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPosition.x, worldPosition.y, worldPosition.z, 1, 0.2, 0.2, 0.2, 0.001, true); @@ -836,23 +841,30 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity var heliRocketEntity = ((HeliRocketWeapon) getWeapon(0)).create(player); Vector4f worldPosition; + Vector4f worldPosition2; if (fireIndex == 0) { worldPosition = transformPosition(transform, -3.9321875f, -1.38680625f, 0.12965f); + worldPosition2 = transformPosition(transform, -3.9321875f + 0.01f + 0.005f, -1.38680625f - 0.03f, 1.12965f); fireIndex = 1; } else if (fireIndex == 1) { worldPosition = transformPosition(transform, -1.56875f, -1.443f, 0.1272f); + worldPosition2 = transformPosition(transform, -1.56875f + 0.01f + 0.005f, -1.443f - 0.03f, 1.1272f); fireIndex = 2; } else if (fireIndex == 2) { worldPosition = transformPosition(transform, 1.56875f, -1.443f, 0.1272f); + worldPosition2 = transformPosition(transform, 1.56875f + 0.01f - 0.002f, -1.443f - 0.03f, 1.1272f); fireIndex = 3; } else { worldPosition = transformPosition(transform, 3.9321875f, -1.38680625f, 0.12965f); + worldPosition2 = transformPosition(transform, 3.9321875f + 0.01f - 0.002f, -1.38680625f - 0.03f, 1.12965f); fireIndex = 0; } + Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); + heliRocketEntity.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - heliRocketEntity.shoot(shootVec(1).x, shootVec(1).y, shootVec(1).z, 8, 0.5f); + heliRocketEntity.shoot(shootVec.x, shootVec.y, shootVec.z, 8, 0.5f); player.level().addFreshEntity(heliRocketEntity); BlockPos pos = BlockPos.containing(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z)); @@ -906,9 +918,9 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity } else if (this.getEntityData().get(LOADED_MISSILE) == 3) { worldPosition = transformPosition(transform, -5.28f, -1.76f, 1.87f); } else if (this.getEntityData().get(LOADED_MISSILE) == 2) { - worldPosition = transformPosition(transform, 6.63f, -0.55f, 1.83f); + worldPosition = transformPosition(transform, 6.63f, -1.55f, 1.83f); } else { - worldPosition = transformPosition(transform, -6.63f, -0.55f, 1.83f); + worldPosition = transformPosition(transform, -6.63f, -1.55f, 1.83f); } if (locked) { 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 fdd24d978..fa778cf25 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -507,6 +507,21 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity return this.cache; } + @Override + public Vec3 shootPos(float tickDelta) { + Matrix4f transform = getVehicleTransform(tickDelta); + Vector4f worldPosition = transformPosition(transform, 0f, -0.83f, 0.8f); + return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z); + } + + @Override + public Vec3 shootVec(float tickDelta) { + Matrix4f transform = getVehicleTransform(tickDelta); + Vector4f worldPosition = transformPosition(transform, 0, 0, 0); + Vector4f worldPosition2 = transformPosition(transform, 0, 0.01f, 1); + return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); + } + @Override public void vehicleShoot(Player player, int type) { boolean hasCreativeAmmo = false; @@ -524,25 +539,26 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity if (getWeaponIndex(0) == 0) { if (this.cannotFire) return; - x = 1.15f; - y = 0.62f - 1.45f; - z = 0.8f; - Vector4f worldPosition; + Vector4f worldPosition2; if (fireIndex == 0) { - worldPosition = transformPosition(transform, -x, y, z); + worldPosition = transformPosition(transform, 1.15f, -0.83f, 0.8f); + worldPosition2 = transformPosition(transform, 1.15f + 0.009f - 0.002f, -0.83f + 0.012f, 1.8f); fireIndex = 1; } else { - worldPosition = transformPosition(transform, x, y, z); + worldPosition = transformPosition(transform, -1.15f, -0.83f, 0.8f); + worldPosition2 = transformPosition(transform, -1.15f + 0.009f + 0.002f, -0.83f + 0.012f, 1.8f); fireIndex = 0; } + Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); + if (this.entityData.get(AMMO) > 0 || hasCreativeAmmo) { var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player); entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - entityToSpawn.shoot(getLookAngle().x, getLookAngle().y + 0.008, getLookAngle().z, 20, 0.15f); + entityToSpawn.shoot(shootVec.x, shootVec.y, shootVec.z, 20, 0.15f); level().addFreshEntity(entityToSpawn); sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPosition.x, worldPosition.y, worldPosition.z, 1, 0, 0, 0, 0, false); @@ -571,24 +587,26 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity } } else if (getWeaponIndex(0) == 1 && this.getEntityData().get(LOADED_ROCKET) > 0) { - x = 1.7f; - y = 0.62f - 1.45f; - z = 0.8f; var heliRocketEntity = ((HeliRocketWeapon) getWeapon(0)).create(player); Vector4f worldPosition; + Vector4f worldPosition2; if (fireIndex == 0) { - worldPosition = transformPosition(transform, -x, y, z); + worldPosition = transformPosition(transform, 1.7f, -0.83f, 0.8f); + worldPosition2 = transformPosition(transform, 1.7f + 0.009f - 0.0025f, -0.83f + 0.012f, 1.8f); fireIndex = 1; } else { - worldPosition = transformPosition(transform, x, y, z); + worldPosition = transformPosition(transform, -1.7f, -0.83f, 0.8f); + worldPosition2 = transformPosition(transform, -1.7f + 0.009f + 0.0025f, -0.83f + 0.012f, 1.8f); fireIndex = 0; } + Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); + heliRocketEntity.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - heliRocketEntity.shoot(this.getLookAngle().x, this.getLookAngle().y + 0.008, this.getLookAngle().z, 7, 0.25f); + heliRocketEntity.shoot(shootVec.x, shootVec.y, shootVec.z, 7, 0.25f); player.level().addFreshEntity(heliRocketEntity); if (!player.level().isClientSide) { diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AirEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AirEntity.java index 8784518f9..891d240cf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AirEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AirEntity.java @@ -1,5 +1,7 @@ package com.atsuishio.superbwarfare.entity.vehicle.base; +import net.minecraft.world.phys.Vec3; + public interface AirEntity extends ArmedVehicleEntity { float getRotX(float tickDelta); @@ -11,4 +13,9 @@ public interface AirEntity extends ArmedVehicleEntity { float getPower(); int getDecoy(); + + Vec3 shootPos(float tickDelta); + + Vec3 shootVec(float tickDelta); + } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AircraftEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AircraftEntity.java index 498f79b2b..f5303833d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AircraftEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/AircraftEntity.java @@ -1,12 +1,5 @@ package com.atsuishio.superbwarfare.entity.vehicle.base; -import net.minecraft.world.phys.Vec3; - public interface AircraftEntity extends AirEntity { - - Vec3 shootPos(float tickDelta); - - Vec3 shootVec(float tickDelta); - Float gearRot(float tickDelta); }