package net.minecraft.entity.ai;
import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.util.MathHelper;
import net.minecraft.village.Village;
import net.minecraft.world.World;
public class EntityAIVillagerMate extends EntityAIBase
{
private EntityVillager villagerObj;
private EntityVillager mate;
private World worldObj;
private int matingTimeout;
Village villageObj;
private static final String __OBFID = "CL_00001594";
public EntityAIVillagerMate(EntityVillager p_i1634_1_)
{
this.villagerObj = p_i1634_1_;
this.worldObj = p_i1634_1_.worldObj;
this.setMutexBits(3);
}
/**
* Returns whether the EntityAIBase should begin execution.
*/
public boolean shouldExecute()
{
if (this.villagerObj.getGrowingAge() != 0)
{
return false;
}
else if (this.villagerObj.getRNG().nextInt(500) != 0)
{
return false;
}
else
{
this.villageObj = this.worldObj.villageCollectionObj.findNearestVillage(MathHelper.floor_double(this.villagerObj.posX), MathHelper.floor_double(this.villagerObj.posY), MathHelper.floor_double(this.villagerObj.posZ), 0);
if (this.villageObj == null)
{
return false;
}
else if (!this.checkSufficientDoorsPresentForNewVillager())
{
return false;
}
else
{
Entity entity = this.worldObj.findNearestEntityWithinAABB(EntityVillager.class, this.villagerObj.boundingBox.expand(8.0D, 3.0D, 8.0D), this.villagerObj);
if (entity == null)
{
return false;
}
else
{
this.mate = (EntityVillager)entity;
return this.mate.getGrowingAge() == 0;
}
}
}
}
/**
* Execute a one shot task or start executing a continuous task
*/
public void startExecuting()
{
this.matingTimeout = 300;
this.villagerObj.setMating(true);
}
/**
* Resets the task
*/
public void resetTask()
{
this.villageObj = null;
this.mate = null;
this.villagerObj.setMating(false);
}
/**
* Returns whether an in-progress EntityAIBase should continue executing
*/
public boolean continueExecuting()
{
return this.matingTimeout >= 0 && this.checkSufficientDoorsPresentForNewVillager() && this.villagerObj.getGrowingAge() == 0;
}
/**
* Updates the task
*/
public void updateTask()
{
--this.matingTimeout;
this.villagerObj.getLookHelper().setLookPositionWithEntity(this.mate, 10.0F, 30.0F);
if (this.villagerObj.getDistanceSqToEntity(this.mate) > 2.25D)
{
this.villagerObj.getNavigator().tryMoveToEntityLiving(this.mate, 0.25D);
}
else if (this.matingTimeout == 0 && this.mate.isMating())
{
this.giveBirth();
}
if (this.villagerObj.getRNG().nextInt(35) == 0)
{
this.worldObj.setEntityState(this.villagerObj, (byte)12);
}
}
private boolean checkSufficientDoorsPresentForNewVillager()
{
if (!this.villageObj.isMatingSeason())
{
return false;
}
else
{
int i = (int)((double)((float)this.villageObj.getNumVillageDoors()) * 0.35D);
return this.villageObj.getNumVillagers() < i;
}
}
private void giveBirth()
{
EntityVillager entityvillager = this.villagerObj.createChild(this.mate);
this.mate.setGrowingAge(6000);
this.villagerObj.setGrowingAge(6000);
entityvillager.setGrowingAge(-24000);
entityvillager.setLocationAndAngles(this.villagerObj.posX, this.villagerObj.posY, this.villagerObj.posZ, 0.0F, 0.0F);
this.worldObj.spawnEntityInWorld(entityvillager);
this.worldObj.setEntityState(entityvillager, (byte)12);
}
}