From f7d30feb7fd291b66889fb97c1640a42049d8111 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 24 Jul 2021 04:22:50 +0200 Subject: [PATCH] Cleanup EntityFinder --- .../server/utils/entity/EntityFinder.java | 99 +++++++------------ 1 file changed, 38 insertions(+), 61 deletions(-) diff --git a/src/main/java/net/minestom/server/utils/entity/EntityFinder.java b/src/main/java/net/minestom/server/utils/entity/EntityFinder.java index 2a2c4f1b7..cf365db4d 100644 --- a/src/main/java/net/minestom/server/utils/entity/EntityFinder.java +++ b/src/main/java/net/minestom/server/utils/entity/EntityFinder.java @@ -35,7 +35,7 @@ public class EntityFinder { private EntitySort entitySort = EntitySort.ARBITRARY; // Position - private Point startPosition = Vec.ZERO; + private Point startPosition; private Float dx, dy, dz; private IntRange distance; @@ -127,8 +127,7 @@ public class EntityFinder { * @param self the source of the query, null if not any * @return all entities validating the conditions, can be empty */ - @NotNull - public List find(@Nullable Instance instance, @Nullable Entity self) { + public @NotNull List<@NotNull Entity> find(@Nullable Instance instance, @Nullable Entity self) { if (targetSelector == TargetSelector.MINESTOM_USERNAME) { Check.notNull(constantName, "The player name should not be null when searching for it"); final Player player = MinecraftServer.getConnectionManager().getPlayer(constantName); @@ -139,8 +138,9 @@ public class EntityFinder { return entity != null ? Collections.singletonList(entity) : Collections.emptyList(); } - List result = findTarget(instance, targetSelector, startPosition, self); + final Point pos = startPosition != null ? startPosition : (self != null ? self.getPosition() : Vec.ZERO); + List result = findTarget(instance, targetSelector, pos, self); // Fast exit if there is nothing to process if (result.isEmpty()) return result; @@ -150,7 +150,7 @@ public class EntityFinder { final int minDistance = distance.getMinimum(); final int maxDistance = distance.getMaximum(); result = result.stream().filter(entity -> { - final int distance = (int) entity.getDistance(self); + final int distance = (int) entity.getPosition().distance(pos); return MathUtils.isBetween(distance, minDistance, maxDistance); }).collect(Collectors.toList()); } @@ -161,17 +161,17 @@ public class EntityFinder { final var entityPosition = entity.getPosition(); if (dx != null && !MathUtils.isBetweenUnordered( entityPosition.x(), - startPosition.x(), dx)) + pos.x(), dx)) return false; if (dy != null && !MathUtils.isBetweenUnordered( entityPosition.y(), - startPosition.y(), dy)) + pos.y(), dy)) return false; if (dz != null && !MathUtils.isBetweenUnordered( entityPosition.z(), - startPosition.z(), dz)) + pos.z(), dz)) return false; return true; @@ -181,7 +181,7 @@ public class EntityFinder { // Entity type if (!entityTypes.isEmpty()) { result = result.stream().filter(entity -> - filterToggleableMap(entity.getEntityType(), entityTypes)) + filterToggleableMap(entity.getEntityType(), entityTypes)) .collect(Collectors.toList()); } @@ -233,12 +233,12 @@ public class EntityFinder { // RANDOM is handled below return 1; case FURTHEST: - return startPosition.distance(ent1.getPosition()) > - startPosition.distance(ent2.getPosition()) ? + return pos.distance(ent1.getPosition()) > + pos.distance(ent2.getPosition()) ? 1 : 0; case NEAREST: - return startPosition.distance(ent1.getPosition()) < - startPosition.distance(ent2.getPosition()) ? + return pos.distance(ent1.getPosition()) < + pos.distance(ent2.getPosition()) ? 1 : 0; } return 1; @@ -251,12 +251,10 @@ public class EntityFinder { } } - return result; } - @NotNull - public List find(@NotNull CommandSender sender) { + public @NotNull List<@NotNull Entity> find(@NotNull CommandSender sender) { if (sender.isPlayer()) { Player player = sender.asPlayer(); return find(player.getInstance(), player); @@ -272,8 +270,7 @@ public class EntityFinder { * @return the first player returned by {@link #find(Instance, Entity)} * @see #find(Instance, Entity) */ - @Nullable - public Player findFirstPlayer(@Nullable Instance instance, @Nullable Entity self) { + public @Nullable Player findFirstPlayer(@Nullable Instance instance, @Nullable Entity self) { final List entities = find(instance, self); for (Entity entity : entities) { if (entity instanceof Player) { @@ -283,8 +280,7 @@ public class EntityFinder { return null; } - @Nullable - public Player findFirstPlayer(@NotNull CommandSender sender) { + public @Nullable Player findFirstPlayer(@NotNull CommandSender sender) { if (sender.isPlayer()) { final Player player = sender.asPlayer(); return findFirstPlayer(player.getInstance(), player); @@ -293,8 +289,7 @@ public class EntityFinder { } } - @Nullable - public Entity findFirstEntity(@Nullable Instance instance, @Nullable Entity self) { + public @Nullable Entity findFirstEntity(@Nullable Instance instance, @Nullable Entity self) { final List entities = find(instance, self); for (Entity entity : entities) { return entity; @@ -302,8 +297,7 @@ public class EntityFinder { return null; } - @Nullable - public Entity findFirstEntity(@NotNull CommandSender sender) { + public @Nullable Entity findFirstEntity(@NotNull CommandSender sender) { if (sender.isPlayer()) { final Player player = sender.asPlayer(); return findFirstEntity(player.getInstance(), player); @@ -337,62 +331,45 @@ public class EntityFinder { private static class ToggleableMap extends Object2BooleanOpenHashMap { } - @NotNull - private static List findTarget(@Nullable Instance instance, @NotNull TargetSelector targetSelector, - @NotNull Point startPosition, @Nullable Entity self) { - + private static @NotNull List<@NotNull Entity> findTarget(@Nullable Instance instance, + @NotNull TargetSelector targetSelector, + @NotNull Point startPosition, @Nullable Entity self) { if (targetSelector == TargetSelector.NEAREST_PLAYER) { - Entity entity = null; - double closestDistance = Double.MAX_VALUE; - - Collection instancePlayers = instance != null ? - instance.getPlayers() : MinecraftServer.getConnectionManager().getOnlinePlayers(); - for (Player player : instancePlayers) { - final double distance = player.getPosition().distance(startPosition); - if (distance < closestDistance) { - entity = player; - closestDistance = distance; - } - } - return Collections.singletonList(entity); + return MinecraftServer.getConnectionManager().getOnlinePlayers().stream() + .min(Comparator.comparingDouble(p -> p.getPosition().distance(startPosition))) + .>map(Collections::singletonList).orElse(Collections.emptyList()); } else if (targetSelector == TargetSelector.RANDOM_PLAYER) { - Collection instancePlayers = instance != null ? + Collection players = instance != null ? instance.getPlayers() : MinecraftServer.getConnectionManager().getOnlinePlayers(); - final int index = ThreadLocalRandom.current().nextInt(instancePlayers.size()); - final Player player = instancePlayers.stream().skip(index).findFirst().orElseThrow(); + final int index = ThreadLocalRandom.current().nextInt(players.size()); + final Player player = players.stream().skip(index).findFirst().orElseThrow(); return Collections.singletonList(player); } else if (targetSelector == TargetSelector.ALL_PLAYERS) { - return new ArrayList<>(instance != null ? + return List.copyOf(instance != null ? instance.getPlayers() : MinecraftServer.getConnectionManager().getOnlinePlayers()); } else if (targetSelector == TargetSelector.ALL_ENTITIES) { if (instance != null) { - return new ArrayList<>(instance.getEntities()); - } else { - // Get entities from every instance - var instances = MinecraftServer.getInstanceManager().getInstances(); - List entities = new LinkedList<>(); - for (Instance inst : instances) { - entities.addAll(inst.getEntities()); - } - return entities; + return List.copyOf(instance.getEntities()); } + // Get entities from every instance + var instances = MinecraftServer.getInstanceManager().getInstances(); + List entities = new ArrayList<>(); + for (Instance inst : instances) { + entities.addAll(inst.getEntities()); + } + return entities; } else if (targetSelector == TargetSelector.SELF) { - return Collections.singletonList(self); + return self != null ? Collections.singletonList(self) : Collections.emptyList(); } throw new IllegalStateException("Weird thing happened: " + targetSelector); } private static boolean filterToggleableMap(@NotNull T value, @NotNull ToggleableMap map) { for (Object2BooleanMap.Entry entry : map.object2BooleanEntrySet()) { - final T key = entry.getKey(); - final boolean include = entry.getBooleanValue(); - - final boolean equals = Objects.equals(value, key); - if (include && !equals || !include && equals) { + if (entry.getBooleanValue() != Objects.equals(value, entry.getKey())) { return false; } } - return true; } }