优化测距

This commit is contained in:
Atsuishio 2025-05-03 13:48:50 +08:00 committed by Light_Quanta
parent 65c5151c4b
commit b5bf19a3e7
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
5 changed files with 40 additions and 10 deletions

View file

@ -105,7 +105,7 @@ public class CannonHudOverlay implements LayeredDraw.Layer {
shootPos = cannon.driverZoomPos(deltaTracker.getRealtimeDeltaTicks()); shootPos = cannon.driverZoomPos(deltaTracker.getRealtimeDeltaTicks());
} }
Entity lookingEntity = TraceTool.vehiclefFindLookingEntity(cannon, shootPos, 512); Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks());
boolean lookAtEntity = false; boolean lookAtEntity = false;
BlockHitResult result = player.level().clip(new ClipContext(shootPos, shootPos.add(player.getViewVector(1).scale(512)), BlockHitResult result = player.level().clip(new ClipContext(shootPos, shootPos.add(player.getViewVector(1).scale(512)),

View file

@ -5,13 +5,11 @@ import com.atsuishio.superbwarfare.client.RenderHelper;
import com.atsuishio.superbwarfare.entity.vehicle.DroneEntity; import com.atsuishio.superbwarfare.entity.vehicle.DroneEntity;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.*;
import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.NBTTool;
import com.atsuishio.superbwarfare.tools.SeekTool;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker; import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
@ -53,6 +51,8 @@ public class DroneHudOverlay implements LayeredDraw.Layer {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
Player player = mc.player; Player player = mc.player;
Camera camera = mc.gameRenderer.getMainCamera();
Vec3 cameraPos = camera.getPosition();
if (player == null) return; if (player == null) return;
@ -95,7 +95,7 @@ public class DroneHudOverlay implements LayeredDraw.Layer {
double entityRange = 0; double entityRange = 0;
Entity lookingEntity = SeekTool.seekLivingEntity(entity, entity.level(), 512, 2); Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks());
if (lookingEntity != null) { if (lookingEntity != null) {
lookAtEntity = true; lookAtEntity = true;
entityRange = entity.distanceTo(lookingEntity); entityRange = entity.distanceTo(lookingEntity);

View file

@ -14,7 +14,7 @@ import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.InventoryTool;
import com.atsuishio.superbwarfare.tools.NBTTool; 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.AnimationCurves;
import com.atsuishio.superbwarfare.tools.animation.AnimationTimer; import com.atsuishio.superbwarfare.tools.animation.AnimationTimer;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
@ -209,7 +209,7 @@ public class VehicleHudOverlay implements LayeredDraw.Layer {
double entityRange = 0; double entityRange = 0;
Entity lookingEntity = SeekTool.seekLivingEntity(player, player.level(), 512, 1); Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks());
if (lookingEntity != null) { if (lookingEntity != null) {
lookAtEntity = true; lookAtEntity = true;
entityRange = player.distanceTo(lookingEntity); entityRange = player.distanceTo(lookingEntity);

View file

@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.TraceTool; import com.atsuishio.superbwarfare.tools.TraceTool;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker; import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
@ -13,6 +14,7 @@ import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
@ -28,14 +30,17 @@ public class VehicleTeamOverlay implements LayeredDraw.Layer {
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth(); int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight(); 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(); PoseStack poseStack = guiGraphics.pose();
if (player == null) return; if (player == null) return;
boolean lookAtEntity = false; boolean lookAtEntity = false;
double entityRange = 0; double entityRange = 0;
Entity lookingEntity = TraceTool.findLookingEntity(player, 520); Entity lookingEntity = TraceTool.camerafFindLookingEntity(player, cameraPos, 512, deltaTracker.getRealtimeDeltaTicks());
if (lookingEntity instanceof VehicleEntity) { if (lookingEntity instanceof VehicleEntity) {
lookAtEntity = true; lookAtEntity = true;

View file

@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; 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.Projectile;
import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.entity.projectile.ProjectileUtil;
import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.ClipContext;
@ -119,6 +120,30 @@ public class TraceTool {
return null; 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) { public static HitResult pickNew(Vec3 pos, double pHitDistance, VehicleEntity vehicle) {
Vec3 vec31 = vehicle.getBarrelVector(1); Vec3 vec31 = vehicle.getBarrelVector(1);
Vec3 vec32 = pos.add(vec31.x * pHitDistance, vec31.y * pHitDistance, vec31.z * pHitDistance); Vec3 vec32 = pos.add(vec31.x * pHitDistance, vec31.y * pHitDistance, vec31.z * pHitDistance);