    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.registry.VillagerRegistry;
    004
    005    public class EntityAIVillagerMate extends EntityAIBase
    006    {
    007        private EntityVillager villagerObj;
    008        private EntityVillager mate;
    009        private World worldObj;
    010        private int matingTimeout = 0;
    011        Village villageObj;
    012
    013        public EntityAIVillagerMate(EntityVillager par1EntityVillager)
    014        {
    015            this.villagerObj = par1EntityVillager;
    016            this.worldObj = par1EntityVillager.worldObj;
    017            this.setMutexBits(3);
    018        }
    019
    020        /**
    021         * Returns whether the EntityAIBase should begin execution.
    022         */
    023        public boolean shouldExecute()
    024        {
    025            if (this.villagerObj.getGrowingAge() != 0)
    026            {
    027                return false;
    028            }
    029            else if (this.villagerObj.getRNG().nextInt(500) != 0)
    030            {
    031                return false;
    032            }
    033            else
    034            {
    035                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);
    036
    037                if (this.villageObj == null)
    038                {
    039                    return false;
    040                }
    041                else if (!this.checkSufficientDoorsPresentForNewVillager())
    042                {
    043                    return false;
    044                }
    045                else
    046                {
    047                    Entity var1 = this.worldObj.findNearestEntityWithinAABB(EntityVillager.class, this.villagerObj.boundingBox.expand(8.0D, 3.0D, 8.0D), this.villagerObj);
    048
    049                    if (var1 == null)
    050                    {
    051                        return false;
    052                    }
    053                    else
    054                    {
    055                        this.mate = (EntityVillager)var1;
    056                        return this.mate.getGrowingAge() == 0;
    057                    }
    058                }
    059            }
    060        }
    061
    062        /**
    063         * Execute a one shot task or start executing a continuous task
    064         */
    065        public void startExecuting()
    066        {
    067            this.matingTimeout = 300;
    068            this.villagerObj.setMating(true);
    069        }
    070
    071        /**
    072         * Resets the task
    073         */
    074        public void resetTask()
    075        {
    076            this.villageObj = null;
    077            this.mate = null;
    078            this.villagerObj.setMating(false);
    079        }
    080
    081        /**
    082         * Returns whether an in-progress EntityAIBase should continue executing
    083         */
    084        public boolean continueExecuting()
    085        {
    086            return this.matingTimeout >= 0 && this.checkSufficientDoorsPresentForNewVillager() && this.villagerObj.getGrowingAge() == 0;
    087        }
    088
    089        /**
    090         * Updates the task
    091         */
    092        public void updateTask()
    093        {
    094            --this.matingTimeout;
    095            this.villagerObj.getLookHelper().setLookPositionWithEntity(this.mate, 10.0F, 30.0F);
    096
    097            if (this.villagerObj.getDistanceSqToEntity(this.mate) > 2.25D)
    098            {
    099                this.villagerObj.getNavigator().tryMoveToEntityLiving(this.mate, 0.25F);
    100            }
    101            else if (this.matingTimeout == 0 && this.mate.isMating())
    102            {
    103                this.giveBirth();
    104            }
    105
    106            if (this.villagerObj.getRNG().nextInt(35) == 0)
    107            {
    108                this.worldObj.setEntityState(this.villagerObj, (byte)12);
    109            }
    110        }
    111
    112        private boolean checkSufficientDoorsPresentForNewVillager()
    113        {
    114            if (!this.villageObj.func_82686_i())
    115            {
    116                return false;
    117            }
    118            else
    119            {
    120                int var1 = (int)((double)((float)this.villageObj.getNumVillageDoors()) * 0.35D);
    121                return this.villageObj.getNumVillagers() < var1;
    122            }
    123        }
    124
    125        private void giveBirth()
    126        {
    127            EntityVillager var1 = this.villagerObj.func_90012_b(this.mate);
    128            this.mate.setGrowingAge(6000);
    129            this.villagerObj.setGrowingAge(6000);
    130            var1.setGrowingAge(-24000);
    131            VillagerRegistry.applyRandomTrade(var1, this.villagerObj.getRNG());
    132            var1.setLocationAndAngles(this.villagerObj.posX, this.villagerObj.posY, this.villagerObj.posZ, 0.0F, 0.0F);
    133            this.worldObj.spawnEntityInWorld(var1);
    134            this.worldObj.setEntityState(var1, (byte)12);
    135        }
    136    }