190 lines
4.9 KiB
Java
190 lines
4.9 KiB
Java
package net.minecraft.pathfinding;
|
|
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.network.PacketBuffer;
|
|
import net.minecraft.util.math.Vec3d;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
|
|
|
public class Path
|
|
{
|
|
/** The actual points in the path */
|
|
private final PathPoint[] points;
|
|
private PathPoint[] openSet = new PathPoint[0];
|
|
private PathPoint[] closedSet = new PathPoint[0];
|
|
@SideOnly(Side.CLIENT)
|
|
private PathPoint target;
|
|
/** PathEntity Array Index the Entity is currently targeting */
|
|
private int currentPathIndex;
|
|
/** The total length of the path */
|
|
private int pathLength;
|
|
|
|
public Path(PathPoint[] pathpoints)
|
|
{
|
|
this.points = pathpoints;
|
|
this.pathLength = pathpoints.length;
|
|
}
|
|
|
|
/**
|
|
* Directs this path to the next point in its array
|
|
*/
|
|
public void incrementPathIndex()
|
|
{
|
|
++this.currentPathIndex;
|
|
}
|
|
|
|
/**
|
|
* Returns true if this path has reached the end
|
|
*/
|
|
public boolean isFinished()
|
|
{
|
|
return this.currentPathIndex >= this.pathLength;
|
|
}
|
|
|
|
/**
|
|
* returns the last PathPoint of the Array
|
|
*/
|
|
@Nullable
|
|
public PathPoint getFinalPathPoint()
|
|
{
|
|
return this.pathLength > 0 ? this.points[this.pathLength - 1] : null;
|
|
}
|
|
|
|
/**
|
|
* return the PathPoint located at the specified PathIndex, usually the current one
|
|
*/
|
|
public PathPoint getPathPointFromIndex(int index)
|
|
{
|
|
return this.points[index];
|
|
}
|
|
|
|
public void setPoint(int index, PathPoint point)
|
|
{
|
|
this.points[index] = point;
|
|
}
|
|
|
|
public int getCurrentPathLength()
|
|
{
|
|
return this.pathLength;
|
|
}
|
|
|
|
public void setCurrentPathLength(int length)
|
|
{
|
|
this.pathLength = length;
|
|
}
|
|
|
|
public int getCurrentPathIndex()
|
|
{
|
|
return this.currentPathIndex;
|
|
}
|
|
|
|
public void setCurrentPathIndex(int currentPathIndexIn)
|
|
{
|
|
this.currentPathIndex = currentPathIndexIn;
|
|
}
|
|
|
|
/**
|
|
* Gets the vector of the PathPoint associated with the given index.
|
|
*/
|
|
public Vec3d getVectorFromIndex(Entity entityIn, int index)
|
|
{
|
|
double d0 = (double)this.points[index].x + (double)((int)(entityIn.width + 1.0F)) * 0.5D;
|
|
double d1 = (double)this.points[index].y;
|
|
double d2 = (double)this.points[index].z + (double)((int)(entityIn.width + 1.0F)) * 0.5D;
|
|
return new Vec3d(d0, d1, d2);
|
|
}
|
|
|
|
/**
|
|
* returns the current PathEntity target node as Vec3D
|
|
*/
|
|
public Vec3d getPosition(Entity entityIn)
|
|
{
|
|
return this.getVectorFromIndex(entityIn, this.currentPathIndex);
|
|
}
|
|
|
|
public Vec3d getCurrentPos()
|
|
{
|
|
PathPoint pathpoint = this.points[this.currentPathIndex];
|
|
return new Vec3d((double)pathpoint.x, (double)pathpoint.y, (double)pathpoint.z);
|
|
}
|
|
|
|
/**
|
|
* Returns true if the EntityPath are the same. Non instance related equals.
|
|
*/
|
|
public boolean isSamePath(Path pathentityIn)
|
|
{
|
|
if (pathentityIn == null)
|
|
{
|
|
return false;
|
|
}
|
|
else if (pathentityIn.points.length != this.points.length)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < this.points.length; ++i)
|
|
{
|
|
if (this.points[i].x != pathentityIn.points[i].x || this.points[i].y != pathentityIn.points[i].y || this.points[i].z != pathentityIn.points[i].z)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public PathPoint[] getOpenSet()
|
|
{
|
|
return this.openSet;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public PathPoint[] getClosedSet()
|
|
{
|
|
return this.closedSet;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public PathPoint getTarget()
|
|
{
|
|
return this.target;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public static Path read(PacketBuffer buf)
|
|
{
|
|
int i = buf.readInt();
|
|
PathPoint pathpoint = PathPoint.createFromBuffer(buf);
|
|
PathPoint[] apathpoint = new PathPoint[buf.readInt()];
|
|
|
|
for (int j = 0; j < apathpoint.length; ++j)
|
|
{
|
|
apathpoint[j] = PathPoint.createFromBuffer(buf);
|
|
}
|
|
|
|
PathPoint[] apathpoint1 = new PathPoint[buf.readInt()];
|
|
|
|
for (int k = 0; k < apathpoint1.length; ++k)
|
|
{
|
|
apathpoint1[k] = PathPoint.createFromBuffer(buf);
|
|
}
|
|
|
|
PathPoint[] apathpoint2 = new PathPoint[buf.readInt()];
|
|
|
|
for (int l = 0; l < apathpoint2.length; ++l)
|
|
{
|
|
apathpoint2[l] = PathPoint.createFromBuffer(buf);
|
|
}
|
|
|
|
Path path = new Path(apathpoint);
|
|
path.openSet = apathpoint1;
|
|
path.closedSet = apathpoint2;
|
|
path.target = pathpoint;
|
|
path.currentPathIndex = i;
|
|
return path;
|
|
}
|
|
} |