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    }