base mod created
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
package net.minecraft.pathfinding;
|
||||
|
||||
public class PathHeap
|
||||
{
|
||||
/** Contains the points in this path */
|
||||
private PathPoint[] pathPoints = new PathPoint[128];
|
||||
/** The number of points in this path */
|
||||
private int count;
|
||||
|
||||
/**
|
||||
* Adds a point to the path
|
||||
*/
|
||||
public PathPoint addPoint(PathPoint point)
|
||||
{
|
||||
if (point.index >= 0)
|
||||
{
|
||||
throw new IllegalStateException("OW KNOWS!");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.count == this.pathPoints.length)
|
||||
{
|
||||
PathPoint[] apathpoint = new PathPoint[this.count << 1];
|
||||
System.arraycopy(this.pathPoints, 0, apathpoint, 0, this.count);
|
||||
this.pathPoints = apathpoint;
|
||||
}
|
||||
|
||||
this.pathPoints[this.count] = point;
|
||||
point.index = this.count;
|
||||
this.sortBack(this.count++);
|
||||
return point;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the path
|
||||
*/
|
||||
public void clearPath()
|
||||
{
|
||||
this.count = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns and removes the first point in the path
|
||||
*/
|
||||
public PathPoint dequeue()
|
||||
{
|
||||
PathPoint pathpoint = this.pathPoints[0];
|
||||
this.pathPoints[0] = this.pathPoints[--this.count];
|
||||
this.pathPoints[this.count] = null;
|
||||
|
||||
if (this.count > 0)
|
||||
{
|
||||
this.sortForward(0);
|
||||
}
|
||||
|
||||
pathpoint.index = -1;
|
||||
return pathpoint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the provided point's distance to target
|
||||
*/
|
||||
public void changeDistance(PathPoint point, float distance)
|
||||
{
|
||||
float f = point.distanceToTarget;
|
||||
point.distanceToTarget = distance;
|
||||
|
||||
if (distance < f)
|
||||
{
|
||||
this.sortBack(point.index);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.sortForward(point.index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts a point to the left
|
||||
*/
|
||||
private void sortBack(int index)
|
||||
{
|
||||
PathPoint pathpoint = this.pathPoints[index];
|
||||
int i;
|
||||
|
||||
for (float f = pathpoint.distanceToTarget; index > 0; index = i)
|
||||
{
|
||||
i = index - 1 >> 1;
|
||||
PathPoint pathpoint1 = this.pathPoints[i];
|
||||
|
||||
if (f >= pathpoint1.distanceToTarget)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
this.pathPoints[index] = pathpoint1;
|
||||
pathpoint1.index = index;
|
||||
}
|
||||
|
||||
this.pathPoints[index] = pathpoint;
|
||||
pathpoint.index = index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts a point to the right
|
||||
*/
|
||||
private void sortForward(int index)
|
||||
{
|
||||
PathPoint pathpoint = this.pathPoints[index];
|
||||
float f = pathpoint.distanceToTarget;
|
||||
|
||||
while (true)
|
||||
{
|
||||
int i = 1 + (index << 1);
|
||||
int j = i + 1;
|
||||
|
||||
if (i >= this.count)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
PathPoint pathpoint1 = this.pathPoints[i];
|
||||
float f1 = pathpoint1.distanceToTarget;
|
||||
PathPoint pathpoint2;
|
||||
float f2;
|
||||
|
||||
if (j >= this.count)
|
||||
{
|
||||
pathpoint2 = null;
|
||||
f2 = Float.POSITIVE_INFINITY;
|
||||
}
|
||||
else
|
||||
{
|
||||
pathpoint2 = this.pathPoints[j];
|
||||
f2 = pathpoint2.distanceToTarget;
|
||||
}
|
||||
|
||||
if (f1 < f2)
|
||||
{
|
||||
if (f1 >= f)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
this.pathPoints[index] = pathpoint1;
|
||||
pathpoint1.index = index;
|
||||
index = i;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (f2 >= f)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
this.pathPoints[index] = pathpoint2;
|
||||
pathpoint2.index = index;
|
||||
index = j;
|
||||
}
|
||||
}
|
||||
|
||||
this.pathPoints[index] = pathpoint;
|
||||
pathpoint.index = index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this path contains no points
|
||||
*/
|
||||
public boolean isPathEmpty()
|
||||
{
|
||||
return this.count == 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user