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