61 lines
1.6 KiB
Java
61 lines
1.6 KiB
Java
package net.minecraft.world.entity.ai.goal;
|
|
|
|
import java.util.EnumSet;
|
|
import net.minecraft.world.entity.LivingEntity;
|
|
import net.minecraft.world.entity.PathfinderMob;
|
|
import net.minecraft.world.entity.ai.util.DefaultRandomPos;
|
|
import net.minecraft.world.phys.Vec3;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class MoveTowardsTargetGoal extends Goal {
|
|
private final PathfinderMob mob;
|
|
@Nullable
|
|
private LivingEntity target;
|
|
private double wantedX;
|
|
private double wantedY;
|
|
private double wantedZ;
|
|
private final double speedModifier;
|
|
private final float within;
|
|
|
|
public MoveTowardsTargetGoal(PathfinderMob mob, double speedModifier, float within) {
|
|
this.mob = mob;
|
|
this.speedModifier = speedModifier;
|
|
this.within = within;
|
|
this.setFlags(EnumSet.of(Goal.Flag.MOVE));
|
|
}
|
|
|
|
@Override
|
|
public boolean canUse() {
|
|
this.target = this.mob.getTarget();
|
|
if (this.target == null) {
|
|
return false;
|
|
} else if (this.target.distanceToSqr(this.mob) > this.within * this.within) {
|
|
return false;
|
|
} else {
|
|
Vec3 vec3 = DefaultRandomPos.getPosTowards(this.mob, 16, 7, this.target.position(), (float) (Math.PI / 2));
|
|
if (vec3 == null) {
|
|
return false;
|
|
} else {
|
|
this.wantedX = vec3.x;
|
|
this.wantedY = vec3.y;
|
|
this.wantedZ = vec3.z;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean canContinueToUse() {
|
|
return !this.mob.getNavigation().isDone() && this.target.isAlive() && this.target.distanceToSqr(this.mob) < this.within * this.within;
|
|
}
|
|
|
|
@Override
|
|
public void stop() {
|
|
this.target = null;
|
|
}
|
|
|
|
@Override
|
|
public void start() {
|
|
this.mob.getNavigation().moveTo(this.wantedX, this.wantedY, this.wantedZ, this.speedModifier);
|
|
}
|
|
}
|