From 58a88578adb855fb906fb8ca79493186f36be20e Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Wed, 2 Jul 2025 15:37:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8A=95=E5=BC=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/AircraftOverlay.java | 51 +++++- .../client/renderer/entity/A10Renderer.java | 7 + .../entity/vehicle/A10Entity.java | 48 +++++- .../tools/ProjectileCalculator.java | 146 ++++++++++++++++++ .../textures/screens/aircraft/bomb_scope.png | Bin 0 -> 30701 bytes .../screens/aircraft/bomb_scope_pitch.png | Bin 0 -> 16449 bytes 6 files changed, 241 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/tools/ProjectileCalculator.java create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/bomb_scope.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/bomb_scope_pitch.png 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 edd3bf02f..93046e03e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java @@ -35,6 +35,7 @@ import java.util.List; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; import static com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity.HEAT; +import static com.atsuishio.superbwarfare.event.ClientEventHandler.zoomVehicle; @OnlyIn(Dist.CLIENT) public class AircraftOverlay implements LayeredDraw.Layer { @@ -45,6 +46,8 @@ public class AircraftOverlay implements LayeredDraw.Layer { private static float lerpLock = 1; private static float lerpG = 1; + private static float scopeScale = 1; + private static final ResourceLocation FRAME = Mod.loc("textures/screens/aircraft/frame.png"); private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/aircraft/frame_target.png"); private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/aircraft/frame_lock.png"); @@ -60,7 +63,6 @@ public class AircraftOverlay implements LayeredDraw.Layer { Camera camera = mc.gameRenderer.getMainCamera(); Vec3 cameraPos = camera.getPosition(); PoseStack poseStack = guiGraphics.pose(); - Vec3 lookVec = new Vec3(camera.getLookVector()); var partialTick = deltaTracker.getGameTimeDeltaPartialTick(true); @@ -89,6 +91,42 @@ public class AircraftOverlay implements LayeredDraw.Layer { Vec3 p = VectorUtil.worldToScreen(pos, cameraPos); Vec3 pCross = VectorUtil.worldToScreen(posCross, cameraPos); + // 投弹准星 + if (mobileVehicle instanceof A10Entity a10Entity && weaponVehicle.getWeaponIndex(0) == 2 && (zoomVehicle || mc.options.getCameraType() != CameraType.FIRST_PERSON)) { + Vec3 p0 = a10Entity.bombLandingPosO; + Vec3 p1 = a10Entity.bombLandingPos; + if (p0 != null && p1 != null) { + Vec3 bombCross = p0.lerp(p1, partialTick); + pCross = VectorUtil.worldToScreen(bombCross, cameraPos); + + if (pCross != null && zoomVehicle) { + float f = (float) Math.min(screenWidth, screenHeight); + float f1 = Math.min((float) screenWidth / f, (float) screenHeight / f); + int i = Mth.floor(f * f1); + int j = Mth.floor(f * f1); + + float x = (float) pCross.x; + float y = (float) pCross.y; + poseStack.pushPose(); + poseStack.rotateAround(Axis.ZP.rotationDegrees(aircraftEntity.getRotZ(partialTick)), x, y, 0); + poseStack.pushPose(); + + poseStack.pushPose(); + poseStack.translate(x, y, 0); + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("MK82 BOMB " + aircraftEntity.getAmmoCount(player)), 25, -11, 1, false); + poseStack.popPose(); + + preciseBlit(guiGraphics, Mod.loc("textures/screens/aircraft/bomb_scope.png"), x - 1.5f * i, y - 1.5f * j, 0, 0, 3 * i, 3 * j, 3 * i, 3 * j); + preciseBlit(guiGraphics, Mod.loc("textures/screens/aircraft/bomb_scope_pitch.png"), x - 1.5f * i, y - 1.5f * j - 4 * a10Entity.getPitch(partialTick), 0, 0, 3 * i, 3 * j, 3 * i, 3 * j); + renderKillIndicator(guiGraphics, x - 7.5f + (float) (2 * (Math.random() - 0.5f)), y - 7.5f + (float) (2 * (Math.random() - 0.5f))); + poseStack.popPose(); + poseStack.popPose(); + return; + } + } + + } + if (p != null) { poseStack.pushPose(); float x = (float) p.x; @@ -226,14 +264,13 @@ public class AircraftOverlay implements LayeredDraw.Layer { } else if (mc.options.getCameraType() == CameraType.THIRD_PERSON_BACK) { poseStack.pushPose(); poseStack.rotateAround(Axis.ZP.rotationDegrees(aircraftEntity.getRotZ(partialTick)), x, y, 0); - preciseBlit(guiGraphics, Mod.loc("textures/screens/drone.png"), x - 8, y - 8, 0, 0, 16, 16, 16, 16); - renderKillIndicator(guiGraphics, x - 7.5f + (float) (2 * (Math.random() - 0.5f)), y - 7.5f + (float) (2 * (Math.random() - 0.5f))); - poseStack.pushPose(); - poseStack.translate(x, y, 0); poseStack.scale(0.75f, 0.75f, 1); + ResourceLocation cross = Mod.loc("textures/screens/drone.png"); + float size = 16; + if (mobileVehicle instanceof A10Entity a10Entity) { if (weaponVehicle.getWeaponIndex(0) == 0) { double heat = a10Entity.getEntityData().get(HEAT) / 100.0F; @@ -241,6 +278,8 @@ public class AircraftOverlay implements LayeredDraw.Layer { } else if (weaponVehicle.getWeaponIndex(0) == 1) { guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("70MM ROCKET " + aircraftEntity.getAmmoCount(player)), 25, -9, -1, false); } else if (weaponVehicle.getWeaponIndex(0) == 2) { + cross = Mod.loc("textures/screens/shotgun_hud.png"); + size = 24; guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("MK82 BOMB " + aircraftEntity.getAmmoCount(player)), 25, -9, -1, false); } else if (weaponVehicle.getWeaponIndex(0) == 3) { guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("AGM-65 " + aircraftEntity.getAmmoCount(player)), 25, -9, -1, false); @@ -249,6 +288,8 @@ public class AircraftOverlay implements LayeredDraw.Layer { guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("IR FLARES " + aircraftEntity.getDecoy()), 25, 1, -1, false); poseStack.popPose(); + preciseBlit(guiGraphics, cross, x - 0.5f * size, y - 0.5f * size, 0, 0, size, size, size, size); + renderKillIndicator(guiGraphics, x - 7.5f + (float) (2 * (Math.random() - 0.5f)), y - 7.5f + (float) (2 * (Math.random() - 0.5f))); poseStack.popPose(); } poseStack.popPose(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/A10Renderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/A10Renderer.java index 882066a6d..b59645ff8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/A10Renderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/A10Renderer.java @@ -2,14 +2,17 @@ package com.atsuishio.superbwarfare.client.renderer.entity; import com.atsuishio.superbwarfare.client.model.entity.A10Model; import com.atsuishio.superbwarfare.entity.vehicle.A10Entity; +import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -54,6 +57,10 @@ public class A10Renderer extends GeoEntityRenderer { @Override public void renderRecursively(PoseStack poseStack, A10Entity animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { String name = bone.getName(); + if (name.equals("root")) { + Player player = Minecraft.getInstance().player; + bone.setHidden(ClientEventHandler.zoomVehicle && animatable.getFirstPassenger() == player && animatable.getWeaponIndex(0) == 2); + } if (name.equals("wingLR")) { bone.setRotX(1.5f * Mth.lerp(partialTick, animatable.flap1LRotO, animatable.getFlap1LRot()) * Mth.DEG_TO_RAD); } 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 7df9854f4..455904f88 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java @@ -7,7 +7,6 @@ import com.atsuishio.superbwarfare.entity.OBBEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.*; import com.atsuishio.superbwarfare.entity.vehicle.damage.DamageModifier; import com.atsuishio.superbwarfare.entity.vehicle.weapon.*; -import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientMouseHandler; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModItems; @@ -17,6 +16,8 @@ import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage; import com.atsuishio.superbwarfare.tools.*; import com.mojang.math.Axis; import it.unimi.dsi.fastutil.Pair; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -58,6 +59,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; import java.util.function.Consumer; +import static com.atsuishio.superbwarfare.event.ClientEventHandler.zoomVehicle; import static com.atsuishio.superbwarfare.event.ClientMouseHandler.freeCameraPitch; import static com.atsuishio.superbwarfare.event.ClientMouseHandler.freeCameraYaw; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; @@ -84,6 +86,10 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity private boolean wasFiring = false; public float delta_x; public float delta_y; + public Vec3 bombLandingPosO; + public Vec3 bombLandingPos; + public Vec3 deltaMovementO; + public OBB obb; public OBB obb2; public OBB obb3; @@ -222,6 +228,8 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity this.wasFiring = this.isFiring(); this.lockingTargetO = getTargetUuid(); + bombLandingPosO = bombLandingPos; + deltaMovementO = getDeltaMovement(); super.baseTick(); this.updateOBB(); @@ -277,6 +285,12 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity lowHealthWarning(); releaseDecoy(); + + // 计算航弹落点 + if (level().isClientSide) { + bombLandingPos = ProjectileCalculator.calculateImpactPosition(level(), shootPos(1), shootVec(1), -0.06).getCenter(); + } + this.refreshDimensions(); } @@ -734,8 +748,10 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f); } else if (getWeaponIndex(0) == 1) { worldPosition = transformPosition(transform, 0f, -1.443f, 0.13f); - } else { + } else if (getWeaponIndex(0) == 2) { worldPosition = transformPosition(transform, 0f, -1.203125f, 0.0625f); + } else { + worldPosition = transformPosition(transform, 0, -1.55f, 1.83f); } return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z); } @@ -745,7 +761,9 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity Matrix4f transform = getVehicleTransform(tickDelta); Vector4f worldPosition; Vector4f worldPosition2; - if (getWeaponIndex(0) == 3) { + if (getWeaponIndex(0) == 2) { + return deltaMovementO.lerp(getDeltaMovement(), tickDelta).scale(0.75); + } else if (getWeaponIndex(0) == 3) { worldPosition = transformPosition(transform, 0, 0, 0); worldPosition2 = transformPosition(transform, 0, 0f, 1); } else { @@ -849,7 +867,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity } Mk82Entity.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - Mk82Entity.shoot(getDeltaMovement().x, getDeltaMovement().y, getDeltaMovement().z, (float) getDeltaMovement().length(), 10); + Mk82Entity.shoot(getDeltaMovement().x, getDeltaMovement().y, getDeltaMovement().z, (float) getDeltaMovement().scale(0.75).length(), 0.5f); player.level().addFreshEntity(Mk82Entity); BlockPos pos = BlockPos.containing(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z)); @@ -982,7 +1000,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity @Override public double getMouseSensitivity() { - return ClientEventHandler.zoomVehicle ? 0.03 : 0.07; + return zoomVehicle ? 0.03 : 0.07; } @Override @@ -1018,7 +1036,21 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity @OnlyIn(Dist.CLIENT) @Override public @Nullable Vec2 getCameraRotation(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) { + Minecraft mc = Minecraft.getInstance(); + Camera camera = mc.gameRenderer.getMainCamera(); + Vec3 cameraPos = camera.getPosition(); + + Vec3 p0 = bombLandingPosO; + Vec3 p1 = bombLandingPos; + Vec3 p2 = getViewVector(partialTicks); + if (p0 != null && p1 != null) { + p2 = cameraPos.vectorTo(p0.lerp(p1, partialTicks)); + } + if (this.getSeatIndex(player) == 0) { + if (getWeaponIndex(0) == 2 && zoomVehicle) { + return new Vec2((float) (-getYRotFromVector(p2) - freeCameraYaw), (float) (-getXRotFromVector(p2) + freeCameraPitch)); + } return new Vec2((float) (getRotY(partialTicks) - freeCameraYaw), (float) (getRotX(partialTicks) + freeCameraPitch)); } @@ -1029,8 +1061,12 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity @Override public Vec3 getCameraPosition(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) { if (this.getSeatIndex(player) == 0) { - Matrix4f transform = getClientVehicleTransform(partialTicks); + if (getWeaponIndex(0) == 2 && zoomVehicle) { + return shootPos(partialTicks); + } + + Matrix4f transform = getClientVehicleTransform(partialTicks); Vector4f maxCameraPosition = transformPosition(transform, 0, 4, -14 - (float) ClientMouseHandler.custom3pDistanceLerp); Vec3 finalPos = CameraTool.getMaxZoom(transform, maxCameraPosition); diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileCalculator.java b/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileCalculator.java new file mode 100644 index 000000000..35ec8fba1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/tools/ProjectileCalculator.java @@ -0,0 +1,146 @@ +package com.atsuishio.superbwarfare.tools; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class ProjectileCalculator { + private static final double TIME_STEP = 0.1; // 时间步长(刻) + private static final int MAX_ITERATIONS = 1000; // 最大迭代次数 + + /** + * 计算炮弹落地位置 + * + * @param world 世界对象 + * @param startPos 发射点位置 + * @param launchVector 发射向量 + * @return 预测的落点方块位置 + */ + public static BlockPos calculateImpactPosition(Level world, Vec3 startPos, Vec3 launchVector, double gravity) { + // 当前炮弹位置和速度 + Vec3 currentPos = startPos; + Vec3 currentVelocity = launchVector; + + // 记录上一刻位置 + Vec3 prevPos = startPos; + + for (int i = 0; i < MAX_ITERATIONS; i++) { + // 更新位置 + Vec3 nextPos = currentPos.add( + currentVelocity.x * TIME_STEP, + currentVelocity.y * TIME_STEP, + currentVelocity.z * TIME_STEP + ); + + // 更新速度(重力影响) + currentVelocity = currentVelocity.add(0, gravity * TIME_STEP, 0); + + // 检查是否碰撞方块 + BlockPos collisionPos = checkCollision(world, prevPos, nextPos); + if (collisionPos != null) { + return collisionPos; + } + + // 更新位置进行下一步 + prevPos = currentPos; + currentPos = nextPos; + + // 安全检查:防止飞出世界边界 + if (currentPos.y < world.getMinBuildHeight() || currentPos.y > world.getMaxBuildHeight()) { + return new BlockPos( + (int)Math.floor(currentPos.x), + (int)Math.floor(currentPos.y), + (int)Math.floor(currentPos.z) + ); + } + } + + // 超过最大迭代次数,返回当前位置 + return new BlockPos( + (int)Math.floor(currentPos.x), + (int)Math.floor(currentPos.y), + (int)Math.floor(currentPos.z) + ); + } + + /** + * 检查两点之间是否有碰撞方块 + */ + private static BlockPos checkCollision(Level world, Vec3 start, Vec3 end) { + // 使用距离和方向向量 + double dx = end.x - start.x; + double dy = end.y - start.y; + double dz = end.z - start.z; + double distance = Math.sqrt(dx*dx + dy*dy + dz*dz); + + if (distance == 0) return null; + + // 方向单位向量 + double dirX = dx / distance; + double dirY = dy / distance; + double dirZ = dz / distance; + + // 步进检查 + double stepSize = 0.1; // 检查步长 + for (double t = 0; t < distance; t += stepSize) { + double x = start.x + dirX * t; + double y = start.y + dirY * t; + double z = start.z + dirZ * t; + + BlockPos pos = new BlockPos((int)Math.floor(x), (int)Math.floor(y), (int)Math.floor(z)); + BlockState state = world.getBlockState(pos); + + // 检查是否碰到固体方块 + if (!state.isAir()) { + return pos; + } + + // 检查是否碰到下方方块(炮弹落地) + BlockPos belowPos = pos.below(); + BlockState belowState = world.getBlockState(belowPos); + + if (y - Math.floor(y) < 0.1 && !belowState.isAir()) { + return belowPos; + } + } + + return null; + } + + + /** + * 快速预测落点(不考虑地形,仅数学计算) + * 用于平坦地形或初始估算 + */ + public static Vec3 estimateLandingPosition(Vec3 startPos, Vec3 launchVector, double gravity) { + double vx = launchVector.x; + double vy = launchVector.y; + double vz = launchVector.z; + + // 计算飞行时间 (解二次方程: y = y0 + vy*t + 0.5*g*t² = 0) + double a = 0.5 * gravity; + double b = vy; + double c = startPos.y; // 假设地面高度为0 + + // 计算判别式 + double discriminant = b*b - 4*a*c; + + if (discriminant < 0) { + // 无实数解,炮弹不会落地 + return null; + } + + // 取正数解 + double t = (-b + Math.sqrt(discriminant)) / (2*a); + if (t < 0) { + t = (-b - Math.sqrt(discriminant)) / (2*a); + } + + // 计算落点 + double x = startPos.x + vx * t; + double z = startPos.z + vz * t; + + return new Vec3(x, 0, z); + } +} diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/bomb_scope.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/bomb_scope.png new file mode 100644 index 0000000000000000000000000000000000000000..482fe9df693fe30bd0af9847f327468f12547998 GIT binary patch literal 30701 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 z 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/bomb_scope_pitch.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/bomb_scope_pitch.png new file mode 100644 index 0000000000000000000000000000000000000000..420cce7e052891e2e272781624b2638a3e8f9298 GIT binary patch literal 16449 zcmeI&JxBvF6u|L!May}mC!#{Jh%UN_;3&9U^@_crMWhZ+7IaY@3L>~!D)=!7E`oxC zxHzd$D7cB@;3#ymF5Nn`ii<9S=cRbNli=|WBrk+VlJ^@!_GU8EQKQcgk*JfhXGL^x zs*4`>Lg~CR=7o-YYJN?`yjNX295Le}gW}kU?8Zs+R@1zc!ok