package net.minecraft.pathfinding; import java.util.Iterator; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.passive.EntityChicken; import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.pathfinder.WalkNodeProcessor; public class PathNavigateGround extends PathNavigate { protected WalkNodeProcessor field_179695_a; private boolean field_179694_f; private static final String __OBFID = "CL_00002246"; public PathNavigateGround(EntityLiving p_i45875_1_, World worldIn) { super(p_i45875_1_, worldIn); } protected PathFinder func_179679_a() { this.field_179695_a = new WalkNodeProcessor(); this.field_179695_a.func_176175_a(true); return new PathFinder(this.field_179695_a); } /** * If on ground or swimming and can swim */ protected boolean canNavigate() { return this.theEntity.onGround || this.func_179684_h() && this.isInLiquid() || this.theEntity.isRiding() && this.theEntity instanceof EntityZombie && this.theEntity.ridingEntity instanceof EntityChicken; } protected Vec3 getEntityPosition() { return new Vec3(this.theEntity.posX, (double)this.func_179687_p(), this.theEntity.posZ); } private int func_179687_p() { if (this.theEntity.isInWater() && this.func_179684_h()) { int var1 = (int)this.theEntity.getEntityBoundingBox().minY; Block var2 = this.worldObj.getBlockState(new BlockPos(MathHelper.floor_double(this.theEntity.posX), var1, MathHelper.floor_double(this.theEntity.posZ))).getBlock(); int var3 = 0; do { if (var2 != Blocks.flowing_water && var2 != Blocks.water) { return var1; } ++var1; var2 = this.worldObj.getBlockState(new BlockPos(MathHelper.floor_double(this.theEntity.posX), var1, MathHelper.floor_double(this.theEntity.posZ))).getBlock(); ++var3; } while (var3 <= 16); return (int)this.theEntity.getEntityBoundingBox().minY; } else { return (int)(this.theEntity.getEntityBoundingBox().minY + 0.5D); } } /** * Trims path data from the end to the first sun covered block */ protected void removeSunnyPath() { super.removeSunnyPath(); if (this.field_179694_f) { if (this.worldObj.isAgainstSky(new BlockPos(MathHelper.floor_double(this.theEntity.posX), (int)(this.theEntity.getEntityBoundingBox().minY + 0.5D), MathHelper.floor_double(this.theEntity.posZ)))) { return; } for (int var1 = 0; var1 < this.currentPath.getCurrentPathLength(); ++var1) { PathPoint var2 = this.currentPath.getPathPointFromIndex(var1); if (this.worldObj.isAgainstSky(new BlockPos(var2.xCoord, var2.yCoord, var2.zCoord))) { this.currentPath.setCurrentPathLength(var1 - 1); return; } } } } /** * Returns true when an entity of specified size could safely walk in a straight line between the two points. Args: * pos1, pos2, entityXSize, entityYSize, entityZSize */ protected boolean isDirectPathBetweenPoints(Vec3 p_75493_1_, Vec3 p_75493_2_, int p_75493_3_, int p_75493_4_, int p_75493_5_) { int var6 = MathHelper.floor_double(p_75493_1_.xCoord); int var7 = MathHelper.floor_double(p_75493_1_.zCoord); double var8 = p_75493_2_.xCoord - p_75493_1_.xCoord; double var10 = p_75493_2_.zCoord - p_75493_1_.zCoord; double var12 = var8 * var8 + var10 * var10; if (var12 < 1.0E-8D) { return false; } else { double var14 = 1.0D / Math.sqrt(var12); var8 *= var14; var10 *= var14; p_75493_3_ += 2; p_75493_5_ += 2; if (!this.func_179683_a(var6, (int)p_75493_1_.yCoord, var7, p_75493_3_, p_75493_4_, p_75493_5_, p_75493_1_, var8, var10)) { return false; } else { p_75493_3_ -= 2; p_75493_5_ -= 2; double var16 = 1.0D / Math.abs(var8); double var18 = 1.0D / Math.abs(var10); double var20 = (double)(var6 * 1) - p_75493_1_.xCoord; double var22 = (double)(var7 * 1) - p_75493_1_.zCoord; if (var8 >= 0.0D) { ++var20; } if (var10 >= 0.0D) { ++var22; } var20 /= var8; var22 /= var10; int var24 = var8 < 0.0D ? -1 : 1; int var25 = var10 < 0.0D ? -1 : 1; int var26 = MathHelper.floor_double(p_75493_2_.xCoord); int var27 = MathHelper.floor_double(p_75493_2_.zCoord); int var28 = var26 - var6; int var29 = var27 - var7; do { if (var28 * var24 <= 0 && var29 * var25 <= 0) { return true; } if (var20 < var22) { var20 += var16; var6 += var24; var28 = var26 - var6; } else { var22 += var18; var7 += var25; var29 = var27 - var7; } } while (this.func_179683_a(var6, (int)p_75493_1_.yCoord, var7, p_75493_3_, p_75493_4_, p_75493_5_, p_75493_1_, var8, var10)); return false; } } } private boolean func_179683_a(int p_179683_1_, int p_179683_2_, int p_179683_3_, int p_179683_4_, int p_179683_5_, int p_179683_6_, Vec3 p_179683_7_, double p_179683_8_, double p_179683_10_) { int var12 = p_179683_1_ - p_179683_4_ / 2; int var13 = p_179683_3_ - p_179683_6_ / 2; if (!this.func_179692_b(var12, p_179683_2_, var13, p_179683_4_, p_179683_5_, p_179683_6_, p_179683_7_, p_179683_8_, p_179683_10_)) { return false; } else { for (int var14 = var12; var14 < var12 + p_179683_4_; ++var14) { for (int var15 = var13; var15 < var13 + p_179683_6_; ++var15) { double var16 = (double)var14 + 0.5D - p_179683_7_.xCoord; double var18 = (double)var15 + 0.5D - p_179683_7_.zCoord; if (var16 * p_179683_8_ + var18 * p_179683_10_ >= 0.0D) { Block var20 = this.worldObj.getBlockState(new BlockPos(var14, p_179683_2_ - 1, var15)).getBlock(); Material var21 = var20.getMaterial(); if (var21 == Material.air) { return false; } if (var21 == Material.water && !this.theEntity.isInWater()) { return false; } if (var21 == Material.lava) { return false; } } } } return true; } } private boolean func_179692_b(int p_179692_1_, int p_179692_2_, int p_179692_3_, int p_179692_4_, int p_179692_5_, int p_179692_6_, Vec3 p_179692_7_, double p_179692_8_, double p_179692_10_) { Iterator var12 = BlockPos.getAllInBox(new BlockPos(p_179692_1_, p_179692_2_, p_179692_3_), new BlockPos(p_179692_1_ + p_179692_4_ - 1, p_179692_2_ + p_179692_5_ - 1, p_179692_3_ + p_179692_6_ - 1)).iterator(); while (var12.hasNext()) { BlockPos var13 = (BlockPos)var12.next(); double var14 = (double)var13.getX() + 0.5D - p_179692_7_.xCoord; double var16 = (double)var13.getZ() + 0.5D - p_179692_7_.zCoord; if (var14 * p_179692_8_ + var16 * p_179692_10_ >= 0.0D) { Block var18 = this.worldObj.getBlockState(var13).getBlock(); if (!var18.isPassable(this.worldObj, var13)) { return false; } } } return true; } public void func_179690_a(boolean p_179690_1_) { this.field_179695_a.func_176176_c(p_179690_1_); } public boolean func_179689_e() { return this.field_179695_a.func_176173_e(); } public void func_179688_b(boolean p_179688_1_) { this.field_179695_a.func_176172_b(p_179688_1_); } public void func_179691_c(boolean p_179691_1_) { this.field_179695_a.func_176175_a(p_179691_1_); } public boolean func_179686_g() { return this.field_179695_a.func_176179_b(); } public void func_179693_d(boolean p_179693_1_) { this.field_179695_a.func_176178_d(p_179693_1_); } public boolean func_179684_h() { return this.field_179695_a.func_176174_d(); } public void func_179685_e(boolean p_179685_1_) { this.field_179694_f = p_179685_1_; } }