diff --git a/api/src/main/java/ru/dragonestia/msb3/api/entity/goal/LookCloseGoal.java b/api/src/main/java/ru/dragonestia/msb3/api/entity/goal/LookCloseGoal.java new file mode 100644 index 0000000..de6f120 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/entity/goal/LookCloseGoal.java @@ -0,0 +1,83 @@ +package ru.dragonestia.msb3.api.entity.goal; + +import lombok.Getter; +import lombok.Setter; +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.Player; +import net.minestom.server.entity.ai.GoalSelector; +import org.jetbrains.annotations.NotNull; + +public class LookCloseGoal extends GoalSelector { + + private final static int MAX_DIST = 7 * 7; + + @Setter @Getter private volatile boolean enabled = false; + private boolean lastSeePlayer = false; + @Getter private float defaultYaw; + @Getter private float defaultPitch; + + public LookCloseGoal(@NotNull EntityCreature entityCreature) { + super(entityCreature); + + defaultYaw = entityCreature.getPosition().yaw(); + defaultPitch = entityCreature.getPosition().pitch(); + } + + @Override + public boolean shouldStart() { + return true; + } + + @Override + public void start() {} + + @Override + public void tick(long l) { + if ((l & 0b11) == 0) return; + + if (!enabled) { + if (lastSeePlayer) { + entityCreature.setView(defaultYaw, defaultPitch); + lastSeePlayer = false; + } + return; + } + + Player closestPlayer = null; + double closestDistance = Double.MAX_VALUE; + + for (var player: entityCreature.getViewers()) { + var distance = player.getPosition().distanceSquared(entityCreature.getPosition()); + if (distance > MAX_DIST) continue; + + if (distance < closestDistance) { + closestDistance = distance; + closestPlayer = player; + } + } + + if (closestPlayer != null) { + entityCreature.lookAt(closestPlayer); + lastSeePlayer = true; + return; + } + + if (lastSeePlayer) { + entityCreature.setView(defaultYaw, defaultPitch); + lastSeePlayer = false; + } + } + + @Override + public boolean shouldEnd() { + return false; + } + + @Override + public void end() {} + + public void setDefaultRotation(float yaw, float pitch) { + defaultYaw = yaw; + defaultPitch = pitch; + } +}