package net.minecraft.server;
public abstract class EntityAnimal extends EntityAgeable implements IAnimal {
protected Block bz;
private int bw;
private EntityHuman bx;
public ItemStack breedItem; // CraftBukkit - Add breedItem variable
public EntityAnimal(World world) {
super(world);
this.bz = Blocks.GRASS;
}
@Override
protected void M() {
if (this.getAge() != 0) {
this.bw = 0;
}
super.M();
}
@Override
public void n() {
super.n();
if (this.getAge() != 0) {
this.bw = 0;
}
if (this.bw > 0) {
--this.bw;
if (this.bw % 10 == 0) {
double d0 = this.random.nextGaussian() * 0.02D;
double d1 = this.random.nextGaussian() * 0.02D;
double d2 = this.random.nextGaussian() * 0.02D;
this.world.addParticle(EnumParticle.HEART, this.locX + this.random.nextFloat() * this.width * 2.0F - this.width, this.locY + 0.5D + this.random.nextFloat() * this.length, this.locZ + this.random.nextFloat() * this.width * 2.0F - this.width, d0, d1, d2, new int[0]);
}
}
}
/* CraftBukkit start
// Function disabled as it has no special function anymore after
// setSitting is disabled.
public boolean damageEntity(DamageSource damagesource, float f) {
if (this.isInvulnerable(damagesource)) {
return false;
} else {
this.bw = 0;
return super.damageEntity(damagesource, f);
}
}
// CraftBukkit end */
@Override
public float a(BlockPosition blockposition) {
return this.world.getType(blockposition.down()).getBlock() == this.bz ? 10.0F : this.world.n(blockposition) - 0.5F;
}
@Override
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
nbttagcompound.setInt("InLove", this.bw);
}
@Override
public double ax() {
return 0.14D;
}
@Override
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
this.bw = nbttagcompound.getInt("InLove");
}
@Override
public boolean cM() {
int i = MathHelper.floor(this.locX);
int j = MathHelper.floor(this.getBoundingBox().b);
int k = MathHelper.floor(this.locZ);
BlockPosition blockposition = new BlockPosition(i, j, k);
return this.world.getType(blockposition.down()).getBlock() == this.bz && this.world.j(blockposition) > 8 && super.cM();
}
@Override
public int C() {
return 120;
}
@Override
protected boolean isTypeNotPersistent() {
return false;
}
@Override
protected int getExpValue(EntityHuman entityhuman) {
return 1 + this.world.random.nextInt(3);
}
public boolean e(ItemStack itemstack) {
return itemstack.getItem() == Items.WHEAT;
}
@Override
public boolean a(EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
if (!itemstack.isEmpty()) {
if (this.e(itemstack) && this.getAge() == 0 && this.bw <= 0) {
this.a(entityhuman, itemstack);
this.c(entityhuman);
return true;
}
if (this.isBaby() && this.e(itemstack)) {
this.a(entityhuman, itemstack);
this.setAge((int) (-this.getAge() / 20 * 0.1F), true);
return true;
}
}
return super.a(entityhuman, enumhand);
}
protected void a(EntityHuman entityhuman, ItemStack itemstack) {
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack.subtract(1);
}
}
public void c(EntityHuman entityhuman) {
this.bw = 600;
this.bx = entityhuman;
this.breedItem = entityhuman.inventory.getItemInHand(); // CraftBukkit
this.world.broadcastEntityEffect(this, (byte) 18);
}
public EntityHuman getBreedCause() {
return this.bx;
}
public boolean isInLove() {
return this.bw > 0;
}
public void resetLove() {
this.bw = 0;
}
public boolean mate(EntityAnimal entityanimal) {
return entityanimal == this ? false : (entityanimal.getClass() != this.getClass() ? false : this.isInLove() && entityanimal.isInLove());
}
}