package net.minecraft.server;
// CraftBukkit start
import org.bukkit.event.entity.EntityUnleashEvent;
// CraftBukkit end
public abstract class EntityCreature extends EntityInsentient {
protected EntityCreature(EntityTypes<? extends EntityCreature> entitytypes, World world) {
super(entitytypes, world);
}
public float f(BlockPosition blockposition) {
return this.a(blockposition, (IWorldReader) this.world);
}
public float a(BlockPosition blockposition, IWorldReader iworldreader) {
return 0.0F;
}
@Override
public boolean a(GeneratorAccess generatoraccess, EnumMobSpawn enummobspawn) {
return this.a(new BlockPosition(this), (IWorldReader) generatoraccess) >= 0.0F;
}
public boolean eo() {
return !this.getNavigation().m();
}
@Override
protected void eh() {
super.eh();
Entity entity = this.getLeashHolder();
if (entity != null && entity.world == this.world) {
this.a(new BlockPosition(entity), 5);
float f = this.g(entity);
if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) {
if (f > 10.0F) {
this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
this.unleash(true, true);
}
return;
}
this.u(f);
if (f > 10.0F) {
this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
this.unleash(true, true);
this.goalSelector.a(PathfinderGoal.Type.MOVE);
} else if (f > 6.0F) {
double d0 = (entity.locX() - this.locX()) / (double) f;
double d1 = (entity.locY() - this.locY()) / (double) f;
double d2 = (entity.locZ() - this.locZ()) / (double) f;
this.setMot(this.getMot().add(Math.copySign(d0 * d0 * 0.4D, d0), Math.copySign(d1 * d1 * 0.4D, d1), Math.copySign(d2 * d2 * 0.4D, d2)));
} else {
this.goalSelector.b(PathfinderGoal.Type.MOVE);
float f1 = 2.0F;
Vec3D vec3d = (new Vec3D(entity.locX() - this.locX(), entity.locY() - this.locY(), entity.locZ() - this.locZ())).d().a((double) Math.max(f - 2.0F, 0.0F));
this.getNavigation().a(this.locX() + vec3d.x, this.locY() + vec3d.y, this.locZ() + vec3d.z, this.ep());
}
}
}
protected double ep() {
return 1.0D;
}
protected void u(float f) {}
}