Code/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java

80 lines
2.7 KiB
Java

package net.minecraft.world.entity.ai.navigation;
import net.minecraft.core.BlockPos;
import net.minecraft.network.protocol.game.DebugPackets;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.pathfinder.FlyNodeEvaluator;
import net.minecraft.world.level.pathfinder.Path;
import net.minecraft.world.level.pathfinder.PathFinder;
import net.minecraft.world.phys.Vec3;
public class FlyingPathNavigation extends PathNavigation {
public FlyingPathNavigation(Mob p_26424_, Level p_26425_) {
super(p_26424_, p_26425_);
}
@Override
protected PathFinder createPathFinder(int p_26428_) {
this.nodeEvaluator = new FlyNodeEvaluator();
return new PathFinder(this.nodeEvaluator, p_26428_);
}
@Override
protected boolean canMoveDirectly(Vec3 p_262585_, Vec3 p_262682_) {
return isClearForMovementBetween(this.mob, p_262585_, p_262682_, true);
}
@Override
protected boolean canUpdatePath() {
return this.canFloat() && this.mob.isInLiquid() || !this.mob.isPassenger();
}
@Override
protected Vec3 getTempMobPos() {
return this.mob.position();
}
@Override
public Path createPath(Entity p_26430_, int p_26431_) {
return this.createPath(p_26430_.blockPosition(), p_26431_);
}
@Override
public void tick() {
this.tick++;
if (this.hasDelayedRecomputation) {
this.recomputePath();
}
if (!this.isDone()) {
if (this.canUpdatePath()) {
this.followThePath();
} else if (this.path != null && !this.path.isDone()) {
Vec3 vec3 = this.path.getNextEntityPos(this.mob);
if (this.mob.getBlockX() == Mth.floor(vec3.x)
&& this.mob.getBlockY() == Mth.floor(vec3.y)
&& this.mob.getBlockZ() == Mth.floor(vec3.z)) {
this.path.advance();
}
}
DebugPackets.sendPathFindingPacket(this.level, this.mob, this.path, this.maxDistanceToWaypoint);
if (!this.isDone()) {
Vec3 vec31 = this.path.getNextEntityPos(this.mob);
this.mob.getMoveControl().setWantedPosition(vec31.x, vec31.y, vec31.z, this.speedModifier);
}
}
}
public void setCanOpenDoors(boolean p_26441_) {
this.nodeEvaluator.setCanOpenDoors(p_26441_);
}
@Override
public boolean isStableDestination(BlockPos p_26439_) {
return this.level.getBlockState(p_26439_).entityCanStandOn(this.level, p_26439_, this.mob);
}
}