From 2fc4a4a9ce01e7a299a4ae0d5059090d43d96b97 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Sun, 13 Jul 2025 11:55:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BF=AE=E5=A4=8DOBB?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86OBB=E5=88=A4=E5=AE=9A=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=B8=8D=E5=A4=AA=E5=8F=AF=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mixins/ProjectileUtilMixin.java | 2 ++ .../atsuishio/superbwarfare/tools/OBB.java | 32 +++++++++++++++---- .../superbwarfare/tools/TraceTool.java | 2 +- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/ProjectileUtilMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/ProjectileUtilMixin.java index bb4fd4ffe..80bed2281 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/ProjectileUtilMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/ProjectileUtilMixin.java @@ -62,6 +62,8 @@ public class ProjectileUtilMixin { } } + // TODO 这个似乎有问题,OBB背后还有OBB时会返回后面那个 + @Inject(method = "getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;", at = @At("HEAD"), cancellable = true) private static void getEntityHitResult(Entity pShooter, Vec3 pStartVec, Vec3 pEndVec, AABB pBoundingBox, Predicate pFilter, double pDistance, CallbackInfoReturnable cir) { diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/OBB.java b/src/main/java/com/atsuishio/superbwarfare/tools/OBB.java index b4d3ca729..458737dd2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/OBB.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/OBB.java @@ -443,23 +443,41 @@ public record OBB(Vector3f center, Vector3f extents, Quaternionf rotation, Part //获取玩家看向的某个OBB - // TODO 修复看向的第一个OBB后方如果还有另外的OBB时,无法正确返回看向的第一个OBB的BUG - public static OBB getLookingObb(Player player, double range) { - OBB lookingOBB = null; Entity lookingEntity = TraceTool.findLookingEntity(player, range); if (lookingEntity instanceof OBBEntity obbEntity) { var obbList = obbEntity.getOBBs(); for (OBB obb : obbList) { Vec3 hitPos = TraceTool.playerFindLookingPos(player, lookingEntity, range); - if (hitPos != null && obb.contains(hitPos.add(player.getViewVector(1).scale(0.02)))) { + if (hitPos != null && obb.contains(hitPos.add(player.getViewVector(1).scale(0.05)))) { // player.displayClientMessage(Component.literal(String.valueOf(obb)), true); - lookingOBB = obb; - break; + // 测试粒子 +// if (player.level() instanceof ServerLevel serverLevel) { +// sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), hitPos.x, hitPos.y, hitPos.z, 1, 0, 0, 0, 0.01, false); +// } + return obb; } } } - return lookingOBB; + return null; + } + + public static Optional getNearestOBB(Vec3 vec3, List obbs) { + if (obbs.isEmpty()) return Optional.empty(); + + OBB nearest = null; + double minDistanceSq = Double.MAX_VALUE; + + for (OBB obb : obbs) { + double distanceSq = obb.center.distanceSquared((float) vec3.x, (float) vec3.y, (float) vec3.z); + + if (distanceSq < minDistanceSq) { + minDistanceSq = distanceSq; + nearest = obb; + } + } + + return Optional.ofNullable(nearest); } public enum Part { diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java index fe496801a..31d5bc054 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/TraceTool.java @@ -130,7 +130,7 @@ public class TraceTool { Vec3 viewVec = player.getViewVector(1); Vec3 toVec = player.getEyePosition().add(viewVec.x * entityReach, viewVec.y * entityReach, viewVec.z * entityReach); AABB aabb = entity.getBoundingBox().expandTowards(viewVec.scale(entityReach)).inflate(1.0D, 1.0D, 1.0D); - EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(player, player.getEyePosition(), toVec, aabb, p -> true, distance); + EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(player.level(), player, player.getEyePosition(), toVec, aabb, p -> true, (float) distance); if (entityhitresult != null) { hitResult = entityhitresult;