package net.minecraft.server;
import javax.annotation.Nullable;
public class PathfinderGoalPanic extends PathfinderGoal {
private final EntityCreature b;
protected double a;
private double c;
private double d;
private double e;
public PathfinderGoalPanic(EntityCreature entitycreature, double d0) {
this.b = entitycreature;
this.a = d0;
this.a(1);
}
public boolean a() {
if (this.b.getLastDamager() == null && !this.b.isBurning()) {
return false;
} else {
if (this.b.isBurning()) {
BlockPosition blockposition = this.a(this.b.world, this.b, 5, 4);
if (blockposition != null) {
this.c = (double) blockposition.getX();
this.d = (double) blockposition.getY();
this.e = (double) blockposition.getZ();
return true;
}
}
return this.f();
}
}
private boolean f() {
Vec3D vec3d = RandomPositionGenerator.a(this.b, 5, 4);
if (vec3d == null) {
return false;
} else {
this.c = vec3d.x;
this.d = vec3d.y;
this.e = vec3d.z;
return true;
}
}
public void c() {
this.b.getNavigation().a(this.c, this.d, this.e, this.a);
}
public boolean b() {
// CraftBukkit start - introduce a temporary timeout hack until this is fixed properly
if ((this.b.ticksLived - this.b.hurtTimestamp) > 100) {
this.b.b((EntityLiving) null);
return false;
}
// CraftBukkit end
return !this.b.getNavigation().n();
}
@Nullable
private BlockPosition a(World world, Entity entity, int i, int j) {
BlockPosition blockposition = new BlockPosition(entity);
int k = blockposition.getX();
int l = blockposition.getY();
int i1 = blockposition.getZ();
float f = (float) (i * i * j * 2);
BlockPosition blockposition1 = null;
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
for (int j1 = k - i; j1 <= k + i; ++j1) {
for (int k1 = l - j; k1 <= l + j; ++k1) {
for (int l1 = i1 - i; l1 <= i1 + i; ++l1) {
blockposition_mutableblockposition.c(j1, k1, l1);
IBlockData iblockdata = world.getType(blockposition_mutableblockposition);
if (iblockdata.getMaterial() == Material.WATER) {
float f1 = (float) ((j1 - k) * (j1 - k) + (k1 - l) * (k1 - l) + (l1 - i1) * (l1 - i1));
if (f1 < f) {
f = f1;
blockposition1 = new BlockPosition(blockposition_mutableblockposition);
}
}
}
}
}
return blockposition1;
}
}