feat: implemented LookCloseGoal

This commit is contained in:
Andrey Terentev 2025-03-17 01:17:05 +07:00
parent 6cdbcad921
commit 49b5ad6db4

View File

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