优化测距

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());
}
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)),

View file

@ -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);

View file

@ -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);

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.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;

View file

@ -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);