From cd719777166a780b59bfb5c32612316f0a7d8b61 Mon Sep 17 00:00:00 2001 From: tanyaofei Date: Tue, 3 Jun 2025 16:18:23 +0800 Subject: [PATCH] "Look at Entity" prioritizes the nearest entity --- .../action/impl/LookAtEntityAction.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/action/impl/LookAtEntityAction.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/action/impl/LookAtEntityAction.java index 93685a7..5cfb1b6 100644 --- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/action/impl/LookAtEntityAction.java +++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/action/impl/LookAtEntityAction.java @@ -1,11 +1,15 @@ package io.github.hello09x.fakeplayer.core.entity.action.impl; -import com.google.common.collect.Iterables; import io.github.hello09x.fakeplayer.api.spi.Action; import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer; import io.papermc.paper.entity.LookAnchor; import org.bukkit.entity.Damageable; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; public class LookAtEntityAction implements Action { @@ -26,7 +30,12 @@ public class LookAtEntityAction implements Action { return false; } - bukkitPlayer.lookAt(Iterables.getFirst(entities, null), LookAnchor.EYES, LookAnchor.EYES); + var entity = this.getNearestEntity(bukkitPlayer, entities); + if (entity == null) { + return false; + } + + bukkitPlayer.lookAt(entity, LookAnchor.EYES, LookAnchor.EYES); player.resetLastActionTime(); return true; } @@ -40,4 +49,25 @@ public class LookAtEntityAction implements Action { public void stop() { } + + private @Nullable Entity getNearestEntity(@NotNull Player player, @NotNull Collection entities) { + if (entities.isEmpty()) { + return null; + } + var loc = player.getLocation(); + Entity nearest = null; + double distance = 0; + for (var entity : entities) { + if (nearest == null) { + nearest = entity; + } else { + var d = loc.distance(entity.getLocation()); + if (d < distance) { + nearest = entity; + distance = d; + } + } + } + return nearest; + } }