72 lines
2.3 KiB
Java
72 lines
2.3 KiB
Java
package net.minecraft.pathfinding;
|
|
|
|
import net.minecraft.entity.EntityLiving;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.RayTraceResult;
|
|
import net.minecraft.util.math.Vec3d;
|
|
import net.minecraft.world.World;
|
|
|
|
public class PathNavigateSwimmer extends PathNavigate
|
|
{
|
|
public PathNavigateSwimmer(EntityLiving entitylivingIn, World worldIn)
|
|
{
|
|
super(entitylivingIn, worldIn);
|
|
}
|
|
|
|
protected PathFinder getPathFinder()
|
|
{
|
|
return new PathFinder(new SwimNodeProcessor());
|
|
}
|
|
|
|
/**
|
|
* If on ground or swimming and can swim
|
|
*/
|
|
protected boolean canNavigate()
|
|
{
|
|
return this.isInLiquid();
|
|
}
|
|
|
|
protected Vec3d getEntityPosition()
|
|
{
|
|
return new Vec3d(this.entity.posX, this.entity.posY + (double)this.entity.height * 0.5D, this.entity.posZ);
|
|
}
|
|
|
|
protected void pathFollow()
|
|
{
|
|
Vec3d vec3d = this.getEntityPosition();
|
|
float f = this.entity.width * this.entity.width;
|
|
int i = 6;
|
|
|
|
if (vec3d.squareDistanceTo(this.currentPath.getVectorFromIndex(this.entity, this.currentPath.getCurrentPathIndex())) < (double)f)
|
|
{
|
|
this.currentPath.incrementPathIndex();
|
|
}
|
|
|
|
for (int j = Math.min(this.currentPath.getCurrentPathIndex() + 6, this.currentPath.getCurrentPathLength() - 1); j > this.currentPath.getCurrentPathIndex(); --j)
|
|
{
|
|
Vec3d vec3d1 = this.currentPath.getVectorFromIndex(this.entity, j);
|
|
|
|
if (vec3d1.squareDistanceTo(vec3d) <= 36.0D && this.isDirectPathBetweenPoints(vec3d, vec3d1, 0, 0, 0))
|
|
{
|
|
this.currentPath.setCurrentPathIndex(j);
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.checkForStuck(vec3d);
|
|
}
|
|
|
|
/**
|
|
* Checks if the specified entity can safely walk to the specified location.
|
|
*/
|
|
protected boolean isDirectPathBetweenPoints(Vec3d posVec31, Vec3d posVec32, int sizeX, int sizeY, int sizeZ)
|
|
{
|
|
RayTraceResult raytraceresult = this.world.rayTraceBlocks(posVec31, new Vec3d(posVec32.x, posVec32.y + (double)this.entity.height * 0.5D, posVec32.z), false, true, false);
|
|
return raytraceresult == null || raytraceresult.typeOfHit == RayTraceResult.Type.MISS;
|
|
}
|
|
|
|
public boolean canEntityStandOnPos(BlockPos pos)
|
|
{
|
|
return !this.world.getBlockState(pos).isFullBlock();
|
|
}
|
|
} |