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 }