    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    }