From c5cddcc8147c8b43a4985ca25bdd6398c155f397 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Wed, 20 Nov 2024 19:52:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96seekEntity=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/tools/EntityFindUtil.java | 15 +++++++++++++++ .../mcreator/superbwarfare/tools/SeekTool.java | 7 +++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/mcreator/superbwarfare/tools/EntityFindUtil.java b/src/main/java/net/mcreator/superbwarfare/tools/EntityFindUtil.java index 68b05885a..00ab05ea9 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/EntityFindUtil.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/EntityFindUtil.java @@ -6,10 +6,25 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.LevelEntityGetter; import java.util.UUID; public class EntityFindUtil { + /** + * 获取世界里的所有实体,对ClientLevel和ServerLevel均有效 + * + * @param level 目标世界 + * @return 所有实体 + */ + public static LevelEntityGetter getEntities(Level level) { + if (level instanceof ServerLevel serverLevel) { + return serverLevel.getEntities(); + } + var clientLevel = (ClientLevel) level; + return clientLevel.getEntities(); + } + /** * 查找当前已知实体,对ClientLevel和ServerLevel均有效 * diff --git a/src/main/java/net/mcreator/superbwarfare/tools/SeekTool.java b/src/main/java/net/mcreator/superbwarfare/tools/SeekTool.java index 52e16d2f5..5851ec237 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/SeekTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/SeekTool.java @@ -3,19 +3,18 @@ package net.mcreator.superbwarfare.tools; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import java.util.Comparator; +import java.util.stream.StreamSupport; public class SeekTool { public static Entity seekEntity(Entity entity, Level level, double seekRange, double seekAngle) { - Vec3 pos = new Vec3(entity.getX(), entity.getY(), entity.getZ()); - return level.getEntitiesOfClass(Entity.class, new AABB(pos, pos).inflate(seekRange), e -> true).stream() + return StreamSupport.stream(EntityFindUtil.getEntities(level).getAll().spliterator(), false) .filter(e -> { - if (calculateAngle(e, entity) < seekAngle && e != entity) { + if (e.distanceTo(entity) <= seekRange && calculateAngle(e, entity) < seekAngle && e != entity) { return level.clip(new ClipContext(entity.getEyePosition(), e.getEyePosition(), ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, entity)).getType() != HitResult.Type.BLOCK; }