001 package net.minecraft.pathfinding;
002
003 public class Path
004 {
005 /** Contains the points in this path */
006 private PathPoint[] pathPoints = new PathPoint[1024];
007
008 /** The number of points in this path */
009 private int count = 0;
010
011 /**
012 * Adds a point to the path
013 */
014 public PathPoint addPoint(PathPoint par1PathPoint)
015 {
016 if (par1PathPoint.index >= 0)
017 {
018 throw new IllegalStateException("OW KNOWS!");
019 }
020 else
021 {
022 if (this.count == this.pathPoints.length)
023 {
024 PathPoint[] var2 = new PathPoint[this.count << 1];
025 System.arraycopy(this.pathPoints, 0, var2, 0, this.count);
026 this.pathPoints = var2;
027 }
028
029 this.pathPoints[this.count] = par1PathPoint;
030 par1PathPoint.index = this.count;
031 this.sortBack(this.count++);
032 return par1PathPoint;
033 }
034 }
035
036 /**
037 * Clears the path
038 */
039 public void clearPath()
040 {
041 this.count = 0;
042 }
043
044 /**
045 * Returns and removes the first point in the path
046 */
047 public PathPoint dequeue()
048 {
049 PathPoint var1 = this.pathPoints[0];
050 this.pathPoints[0] = this.pathPoints[--this.count];
051 this.pathPoints[this.count] = null;
052
053 if (this.count > 0)
054 {
055 this.sortForward(0);
056 }
057
058 var1.index = -1;
059 return var1;
060 }
061
062 /**
063 * Changes the provided point's distance to target
064 */
065 public void changeDistance(PathPoint par1PathPoint, float par2)
066 {
067 float var3 = par1PathPoint.distanceToTarget;
068 par1PathPoint.distanceToTarget = par2;
069
070 if (par2 < var3)
071 {
072 this.sortBack(par1PathPoint.index);
073 }
074 else
075 {
076 this.sortForward(par1PathPoint.index);
077 }
078 }
079
080 /**
081 * Sorts a point to the left
082 */
083 private void sortBack(int par1)
084 {
085 PathPoint var2 = this.pathPoints[par1];
086 int var4;
087
088 for (float var3 = var2.distanceToTarget; par1 > 0; par1 = var4)
089 {
090 var4 = par1 - 1 >> 1;
091 PathPoint var5 = this.pathPoints[var4];
092
093 if (var3 >= var5.distanceToTarget)
094 {
095 break;
096 }
097
098 this.pathPoints[par1] = var5;
099 var5.index = par1;
100 }
101
102 this.pathPoints[par1] = var2;
103 var2.index = par1;
104 }
105
106 /**
107 * Sorts a point to the right
108 */
109 private void sortForward(int par1)
110 {
111 PathPoint var2 = this.pathPoints[par1];
112 float var3 = var2.distanceToTarget;
113
114 while (true)
115 {
116 int var4 = 1 + (par1 << 1);
117 int var5 = var4 + 1;
118
119 if (var4 >= this.count)
120 {
121 break;
122 }
123
124 PathPoint var6 = this.pathPoints[var4];
125 float var7 = var6.distanceToTarget;
126 PathPoint var8;
127 float var9;
128
129 if (var5 >= this.count)
130 {
131 var8 = null;
132 var9 = Float.POSITIVE_INFINITY;
133 }
134 else
135 {
136 var8 = this.pathPoints[var5];
137 var9 = var8.distanceToTarget;
138 }
139
140 if (var7 < var9)
141 {
142 if (var7 >= var3)
143 {
144 break;
145 }
146
147 this.pathPoints[par1] = var6;
148 var6.index = par1;
149 par1 = var4;
150 }
151 else
152 {
153 if (var9 >= var3)
154 {
155 break;
156 }
157
158 this.pathPoints[par1] = var8;
159 var8.index = par1;
160 par1 = var5;
161 }
162 }
163
164 this.pathPoints[par1] = var2;
165 var2.index = par1;
166 }
167
168 /**
169 * Returns true if this path contains no points
170 */
171 public boolean isPathEmpty()
172 {
173 return this.count == 0;
174 }
175 }