From b5bf19a3e759a23c49d04c34d018d78d828a71ac Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Sat, 3 May 2025 13:48:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B5=8B=E8=B7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/CannonHudOverlay.java | 2 +- .../client/overlay/DroneHudOverlay.java | 10 ++++---- .../client/overlay/VehicleHudOverlay.java | 4 +-- .../client/overlay/VehicleTeamOverlay.java | 9 +++++-- .../superbwarfare/tools/TraceTool.java | 25 +++++++++++++++++++ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java index 33293b42f..d6a5513ce 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java @@ -105,7 +105,7 @@ public class CannonHudOverlay implements LayeredDraw.Layer { shootPos = cannon.driverZoomPos(deltaTracker.getRealtimeDeltaTicks()); } - Entity lookingEntity = TraceTool.vehiclefFindLookingEntity(cannon, shootPos, 512); + Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks()); boolean lookAtEntity = false; BlockHitResult result = player.level().clip(new ClipContext(shootPos, shootPos.add(player.getViewVector(1).scale(512)), diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java index 2e0ea0cce..0b68b8e6f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java @@ -5,13 +5,11 @@ import com.atsuishio.superbwarfare.client.RenderHelper; import com.atsuishio.superbwarfare.entity.vehicle.DroneEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; -import com.atsuishio.superbwarfare.tools.EntityFindUtil; -import com.atsuishio.superbwarfare.tools.FormatTool; -import com.atsuishio.superbwarfare.tools.NBTTool; -import com.atsuishio.superbwarfare.tools.SeekTool; +import com.atsuishio.superbwarfare.tools.*; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -53,6 +51,8 @@ public class DroneHudOverlay implements LayeredDraw.Layer { Minecraft mc = Minecraft.getInstance(); Player player = mc.player; + Camera camera = mc.gameRenderer.getMainCamera(); + Vec3 cameraPos = camera.getPosition(); if (player == null) return; @@ -95,7 +95,7 @@ public class DroneHudOverlay implements LayeredDraw.Layer { double entityRange = 0; - Entity lookingEntity = SeekTool.seekLivingEntity(entity, entity.level(), 512, 2); + Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks()); if (lookingEntity != null) { lookAtEntity = true; entityRange = entity.distanceTo(lookingEntity); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java index 800d0efb3..190bba983 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java @@ -14,7 +14,7 @@ import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.NBTTool; -import com.atsuishio.superbwarfare.tools.SeekTool; +import com.atsuishio.superbwarfare.tools.TraceTool; import com.atsuishio.superbwarfare.tools.animation.AnimationCurves; import com.atsuishio.superbwarfare.tools.animation.AnimationTimer; import com.mojang.blaze3d.platform.GlStateManager; @@ -209,7 +209,7 @@ public class VehicleHudOverlay implements LayeredDraw.Layer { double entityRange = 0; - Entity lookingEntity = SeekTool.seekLivingEntity(player, player.level(), 512, 1); + Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks()); if (lookingEntity != null) { lookAtEntity = true; entityRange = player.distanceTo(lookingEntity); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java index 2b955fb7a..82a9240cb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java @@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.TraceTool; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -13,6 +14,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -28,14 +30,17 @@ public class VehicleTeamOverlay implements LayeredDraw.Layer { public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { int w = guiGraphics.guiWidth(); int h = guiGraphics.guiHeight(); - Player player = Minecraft.getInstance().player; + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + Camera camera = mc.gameRenderer.getMainCamera(); + Vec3 cameraPos = camera.getPosition(); PoseStack poseStack = guiGraphics.pose(); if (player == null) return; boolean lookAtEntity = false; double entityRange = 0; - Entity lookingEntity = TraceTool.findLookingEntity(player, 520); + Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks()); if (lookingEntity instanceof VehicleEntity) { lookAtEntity = true; diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java index bc6d5d8dc..b966446b0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.level.ClipContext; @@ -119,6 +120,30 @@ public class TraceTool { return null; } + public static Entity camerafFindLookingEntity(Player player, Vec3 pos, double entityReach, float ticks) { + double distance = entityReach * entityReach; + HitResult hitResult = player.pick(entityReach, 1.0f, false); + + Vec3 viewVec = player.getViewVector(ticks); + Vec3 toVec = pos.add(viewVec.x * entityReach, viewVec.y * entityReach, viewVec.z * entityReach); + AABB aabb = player.getBoundingBox().expandTowards(viewVec.scale(entityReach)).inflate(1.0D, 1.0D, 1.0D); + EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(player, pos, toVec, aabb, p -> !p.isSpectator() + && p.isAlive() + && !(p instanceof Projectile) + && SeekTool.baseFilter(p) + && !(p instanceof DecoyEntity) && smokeFilter(p) + && p != player + && p != player.getVehicle(), distance); + if (entityhitresult != null) { + hitResult = entityhitresult; + + } + if (hitResult.getType() == HitResult.Type.ENTITY) { + return ((EntityHitResult) hitResult).getEntity(); + } + return null; + } + public static HitResult pickNew(Vec3 pos, double pHitDistance, VehicleEntity vehicle) { Vec3 vec31 = vehicle.getBarrelVector(1); Vec3 vec32 = pos.add(vec31.x * pHitDistance, vec31.y * pHitDistance, vec31.z * pHitDistance);