tcr/java/src/game/pathfinding/SwimNodeProcessor.java

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;
}
}