137 lines
4.3 KiB
Java
137 lines
4.3 KiB
Java
package net.minecraft.pathfinding;
|
|
|
|
import net.minecraft.network.PacketBuffer;
|
|
import net.minecraft.util.math.MathHelper;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
|
|
|
public class PathPoint
|
|
{
|
|
/** The x coordinate of this point */
|
|
public final int x;
|
|
/** The y coordinate of this point */
|
|
public final int y;
|
|
/** The z coordinate of this point */
|
|
public final int z;
|
|
/** A hash of the coordinates used to identify this point */
|
|
private final int hash;
|
|
/** The index of this point in its assigned path */
|
|
public int index = -1;
|
|
/** The distance along the path to this point */
|
|
public float totalPathDistance;
|
|
/** The linear distance to the next point */
|
|
public float distanceToNext;
|
|
/** The distance to the target */
|
|
public float distanceToTarget;
|
|
/** The point preceding this in its assigned path */
|
|
public PathPoint previous;
|
|
/** True if the pathfinder has already visited this point */
|
|
public boolean visited;
|
|
public float distanceFromOrigin;
|
|
public float cost;
|
|
public float costMalus;
|
|
public PathNodeType nodeType = PathNodeType.BLOCKED;
|
|
|
|
public PathPoint(int x, int y, int z)
|
|
{
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
this.hash = makeHash(x, y, z);
|
|
}
|
|
|
|
public PathPoint cloneMove(int x, int y, int z)
|
|
{
|
|
PathPoint pathpoint = new PathPoint(x, y, z);
|
|
pathpoint.index = this.index;
|
|
pathpoint.totalPathDistance = this.totalPathDistance;
|
|
pathpoint.distanceToNext = this.distanceToNext;
|
|
pathpoint.distanceToTarget = this.distanceToTarget;
|
|
pathpoint.previous = this.previous;
|
|
pathpoint.visited = this.visited;
|
|
pathpoint.distanceFromOrigin = this.distanceFromOrigin;
|
|
pathpoint.cost = this.cost;
|
|
pathpoint.costMalus = this.costMalus;
|
|
pathpoint.nodeType = this.nodeType;
|
|
return pathpoint;
|
|
}
|
|
|
|
public static int makeHash(int x, int y, int z)
|
|
{
|
|
return y & 255 | (x & 32767) << 8 | (z & 32767) << 24 | (x < 0 ? Integer.MIN_VALUE : 0) | (z < 0 ? 32768 : 0);
|
|
}
|
|
|
|
/**
|
|
* Returns the linear distance to another path point
|
|
*/
|
|
public float distanceTo(PathPoint pathpointIn)
|
|
{
|
|
float f = (float)(pathpointIn.x - this.x);
|
|
float f1 = (float)(pathpointIn.y - this.y);
|
|
float f2 = (float)(pathpointIn.z - this.z);
|
|
return MathHelper.sqrt(f * f + f1 * f1 + f2 * f2);
|
|
}
|
|
|
|
/**
|
|
* Returns the squared distance to another path point
|
|
*/
|
|
public float distanceToSquared(PathPoint pathpointIn)
|
|
{
|
|
float f = (float)(pathpointIn.x - this.x);
|
|
float f1 = (float)(pathpointIn.y - this.y);
|
|
float f2 = (float)(pathpointIn.z - this.z);
|
|
return f * f + f1 * f1 + f2 * f2;
|
|
}
|
|
|
|
public float distanceManhattan(PathPoint p_186281_1_)
|
|
{
|
|
float f = (float)Math.abs(p_186281_1_.x - this.x);
|
|
float f1 = (float)Math.abs(p_186281_1_.y - this.y);
|
|
float f2 = (float)Math.abs(p_186281_1_.z - this.z);
|
|
return f + f1 + f2;
|
|
}
|
|
|
|
public boolean equals(Object p_equals_1_)
|
|
{
|
|
if (!(p_equals_1_ instanceof PathPoint))
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
PathPoint pathpoint = (PathPoint)p_equals_1_;
|
|
return this.hash == pathpoint.hash && this.x == pathpoint.x && this.y == pathpoint.y && this.z == pathpoint.z;
|
|
}
|
|
}
|
|
|
|
public int hashCode()
|
|
{
|
|
return this.hash;
|
|
}
|
|
|
|
/**
|
|
* Returns true if this point has already been assigned to a path
|
|
*/
|
|
public boolean isAssigned()
|
|
{
|
|
return this.index >= 0;
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
return this.x + ", " + this.y + ", " + this.z;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public static PathPoint createFromBuffer(PacketBuffer buf)
|
|
{
|
|
PathPoint pathpoint = new PathPoint(buf.readInt(), buf.readInt(), buf.readInt());
|
|
pathpoint.distanceFromOrigin = buf.readFloat();
|
|
pathpoint.cost = buf.readFloat();
|
|
pathpoint.costMalus = buf.readFloat();
|
|
pathpoint.visited = buf.readBoolean();
|
|
pathpoint.nodeType = PathNodeType.values()[buf.readInt()];
|
|
pathpoint.distanceToTarget = buf.readFloat();
|
|
return pathpoint;
|
|
}
|
|
} |