feat: implemented LookCloseGoal
This commit is contained in:
parent
6cdbcad921
commit
49b5ad6db4
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user