package net.minecraft.pathfinding; import net.minecraft.entity.Entity; import net.minecraft.util.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.pathfinder.NodeProcessor; public class PathFinder { /** The path being generated */ private Path path = new Path(); /** Selection of path points to add to the path */ private PathPoint[] pathOptions = new PathPoint[32]; private NodeProcessor field_176190_c; private static final String __OBFID = "CL_00000576"; public PathFinder(NodeProcessor p_i45557_1_) { this.field_176190_c = p_i45557_1_; } public PathEntity func_176188_a(IBlockAccess p_176188_1_, Entity p_176188_2_, Entity p_176188_3_, float p_176188_4_) { return this.func_176189_a(p_176188_1_, p_176188_2_, p_176188_3_.posX, p_176188_3_.getEntityBoundingBox().minY, p_176188_3_.posZ, p_176188_4_); } public PathEntity func_180782_a(IBlockAccess p_180782_1_, Entity p_180782_2_, BlockPos p_180782_3_, float p_180782_4_) { return this.func_176189_a(p_180782_1_, p_180782_2_, (double)((float)p_180782_3_.getX() + 0.5F), (double)((float)p_180782_3_.getY() + 0.5F), (double)((float)p_180782_3_.getZ() + 0.5F), p_180782_4_); } private PathEntity func_176189_a(IBlockAccess p_176189_1_, Entity p_176189_2_, double p_176189_3_, double p_176189_5_, double p_176189_7_, float p_176189_9_) { this.path.clearPath(); this.field_176190_c.func_176162_a(p_176189_1_, p_176189_2_); PathPoint var10 = this.field_176190_c.func_176161_a(p_176189_2_); PathPoint var11 = this.field_176190_c.func_176160_a(p_176189_2_, p_176189_3_, p_176189_5_, p_176189_7_); PathEntity var12 = this.func_176187_a(p_176189_2_, var10, var11, p_176189_9_); this.field_176190_c.func_176163_a(); return var12; } private PathEntity func_176187_a(Entity p_176187_1_, PathPoint p_176187_2_, PathPoint p_176187_3_, float p_176187_4_) { p_176187_2_.totalPathDistance = 0.0F; p_176187_2_.distanceToNext = p_176187_2_.distanceToSquared(p_176187_3_); p_176187_2_.distanceToTarget = p_176187_2_.distanceToNext; this.path.clearPath(); this.path.addPoint(p_176187_2_); PathPoint var5 = p_176187_2_; while (!this.path.isPathEmpty()) { PathPoint var6 = this.path.dequeue(); if (var6.equals(p_176187_3_)) { return this.createEntityPath(p_176187_2_, p_176187_3_); } if (var6.distanceToSquared(p_176187_3_) < var5.distanceToSquared(p_176187_3_)) { var5 = var6; } var6.visited = true; int var7 = this.field_176190_c.func_176164_a(this.pathOptions, p_176187_1_, var6, p_176187_3_, p_176187_4_); for (int var8 = 0; var8 < var7; ++var8) { PathPoint var9 = this.pathOptions[var8]; float var10 = var6.totalPathDistance + var6.distanceToSquared(var9); if (var10 < p_176187_4_ * 2.0F && (!var9.isAssigned() || var10 < var9.totalPathDistance)) { var9.previous = var6; var9.totalPathDistance = var10; var9.distanceToNext = var9.distanceToSquared(p_176187_3_); if (var9.isAssigned()) { this.path.changeDistance(var9, var9.totalPathDistance + var9.distanceToNext); } else { var9.distanceToTarget = var9.totalPathDistance + var9.distanceToNext; this.path.addPoint(var9); } } } } if (var5 == p_176187_2_) { return null; } else { return this.createEntityPath(p_176187_2_, var5); } } /** * Returns a new PathEntity for a given start and end point */ private PathEntity createEntityPath(PathPoint p_75853_1_, PathPoint p_75853_2_) { int var3 = 1; PathPoint var4; for (var4 = p_75853_2_; var4.previous != null; var4 = var4.previous) { ++var3; } PathPoint[] var5 = new PathPoint[var3]; var4 = p_75853_2_; --var3; for (var5[var3] = p_75853_2_; var4.previous != null; var5[var3] = var4) { var4 = var4.previous; --var3; } return new PathEntity(var5); } }