90 lines
3 KiB
Java
Executable file
90 lines
3 KiB
Java
Executable file
package game.pathfinding;
|
|
|
|
import game.block.Block;
|
|
import game.entity.Entity;
|
|
import game.util.ExtMath;
|
|
import game.world.BlockPos;
|
|
import game.world.Facing;
|
|
|
|
public class SwimNodeProcessor extends NodeProcessor
|
|
{
|
|
public void initProcessor(PathCache iblockaccessIn, Entity entityIn)
|
|
{
|
|
super.initProcessor(iblockaccessIn, entityIn);
|
|
}
|
|
|
|
/**
|
|
* This method is called when all nodes have been processed and PathEntity is created.
|
|
* {@link game.pathfinding.WalkNodeProcessor WalkNodeProcessor} uses this to change its field {@link
|
|
* game.pathfinding.WalkNodeProcessor#avoidsWater avoidsWater}
|
|
*/
|
|
public void postProcess()
|
|
{
|
|
super.postProcess();
|
|
}
|
|
|
|
/**
|
|
* Returns given entity's position as PathPoint
|
|
*/
|
|
public PathPoint getPathPointTo(Entity entityIn)
|
|
{
|
|
return this.openPoint(ExtMath.floord(entityIn.getEntityBoundingBox().minX), ExtMath.floord(entityIn.getEntityBoundingBox().minY + 0.5D), ExtMath.floord(entityIn.getEntityBoundingBox().minZ));
|
|
}
|
|
|
|
/**
|
|
* Returns PathPoint for given coordinates
|
|
*/
|
|
public PathPoint getPathPointToCoords(Entity entityIn, double x, double y, double target)
|
|
{
|
|
return this.openPoint(ExtMath.floord(x - (double)(entityIn.width / 2.0F)), ExtMath.floord(y + 0.5D), ExtMath.floord(target - (double)(entityIn.width / 2.0F)));
|
|
}
|
|
|
|
public int findPathOptions(PathPoint[] pathOptions, Entity entityIn, PathPoint currentPoint, PathPoint targetPoint, float maxDistance)
|
|
{
|
|
int i = 0;
|
|
|
|
for (Facing enumfacing : Facing.values())
|
|
{
|
|
PathPoint pathpoint = this.getSafePoint(entityIn, currentPoint.xCoord + enumfacing.getFrontOffsetX(), currentPoint.yCoord + enumfacing.getFrontOffsetY(), currentPoint.zCoord + enumfacing.getFrontOffsetZ());
|
|
|
|
if (pathpoint != null && !pathpoint.visited && pathpoint.distanceTo(targetPoint) < maxDistance)
|
|
{
|
|
pathOptions[i++] = pathpoint;
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
/**
|
|
* Returns a point that the entity can safely move to
|
|
*/
|
|
private PathPoint getSafePoint(Entity entityIn, int x, int y, int z)
|
|
{
|
|
int i = this.func_176186_b(entityIn, x, y, z);
|
|
return i == -1 ? this.openPoint(x, y, z) : null;
|
|
}
|
|
|
|
private int func_176186_b(Entity entityIn, int x, int y, int z)
|
|
{
|
|
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
|
|
|
|
for (int i = x; i < x + this.entitySizeX; ++i)
|
|
{
|
|
for (int j = y; j < y + this.entitySizeY; ++j)
|
|
{
|
|
for (int k = z; k < z + this.entitySizeZ; ++k)
|
|
{
|
|
Block block = this.blockaccess.getState(blockpos$mutableblockpos.set(i, j, k)).getBlock();
|
|
|
|
if (!block.getMaterial().isColdLiquid())
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
}
|