001    package net.minecraft.pathfinding;
002    
003    import net.minecraft.entity.Entity;
004    import net.minecraft.util.Vec3;
005    
006    public class PathEntity
007    {
008        /** The actual points in the path */
009        private final PathPoint[] points;
010    
011        /** PathEntity Array Index the Entity is currently targeting */
012        private int currentPathIndex;
013    
014        /** The total length of the path */
015        private int pathLength;
016    
017        public PathEntity(PathPoint[] par1ArrayOfPathPoint)
018        {
019            this.points = par1ArrayOfPathPoint;
020            this.pathLength = par1ArrayOfPathPoint.length;
021        }
022    
023        /**
024         * Directs this path to the next point in its array
025         */
026        public void incrementPathIndex()
027        {
028            ++this.currentPathIndex;
029        }
030    
031        /**
032         * Returns true if this path has reached the end
033         */
034        public boolean isFinished()
035        {
036            return this.currentPathIndex >= this.pathLength;
037        }
038    
039        /**
040         * returns the last PathPoint of the Array
041         */
042        public PathPoint getFinalPathPoint()
043        {
044            return this.pathLength > 0 ? this.points[this.pathLength - 1] : null;
045        }
046    
047        /**
048         * return the PathPoint located at the specified PathIndex, usually the current one
049         */
050        public PathPoint getPathPointFromIndex(int par1)
051        {
052            return this.points[par1];
053        }
054    
055        public int getCurrentPathLength()
056        {
057            return this.pathLength;
058        }
059    
060        public void setCurrentPathLength(int par1)
061        {
062            this.pathLength = par1;
063        }
064    
065        public int getCurrentPathIndex()
066        {
067            return this.currentPathIndex;
068        }
069    
070        public void setCurrentPathIndex(int par1)
071        {
072            this.currentPathIndex = par1;
073        }
074    
075        /**
076         * Gets the vector of the PathPoint associated with the given index.
077         */
078        public Vec3 getVectorFromIndex(Entity par1Entity, int par2)
079        {
080            double var3 = (double)this.points[par2].xCoord + (double)((int)(par1Entity.width + 1.0F)) * 0.5D;
081            double var5 = (double)this.points[par2].yCoord;
082            double var7 = (double)this.points[par2].zCoord + (double)((int)(par1Entity.width + 1.0F)) * 0.5D;
083            return par1Entity.worldObj.getWorldVec3Pool().getVecFromPool(var3, var5, var7);
084        }
085    
086        /**
087         * returns the current PathEntity target node as Vec3D
088         */
089        public Vec3 getPosition(Entity par1Entity)
090        {
091            return this.getVectorFromIndex(par1Entity, this.currentPathIndex);
092        }
093    
094        /**
095         * Returns true if the EntityPath are the same. Non instance related equals.
096         */
097        public boolean isSamePath(PathEntity par1PathEntity)
098        {
099            if (par1PathEntity == null)
100            {
101                return false;
102            }
103            else if (par1PathEntity.points.length != this.points.length)
104            {
105                return false;
106            }
107            else
108            {
109                for (int var2 = 0; var2 < this.points.length; ++var2)
110                {
111                    if (this.points[var2].xCoord != par1PathEntity.points[var2].xCoord || this.points[var2].yCoord != par1PathEntity.points[var2].yCoord || this.points[var2].zCoord != par1PathEntity.points[var2].zCoord)
112                    {
113                        return false;
114                    }
115                }
116    
117                return true;
118            }
119        }
120    
121        /**
122         * Returns true if the final PathPoint in the PathEntity is equal to Vec3D coords.
123         */
124        public boolean isDestinationSame(Vec3 par1Vec3)
125        {
126            PathPoint var2 = this.getFinalPathPoint();
127            return var2 == null ? false : var2.xCoord == (int)par1Vec3.xCoord && var2.zCoord == (int)par1Vec3.zCoord;
128        }
129    }