    001    package net.minecraft.entity.ai;
    002
    003    import java.util.Iterator;
    004    import java.util.List;
    005    import net.minecraft.entity.EntityLiving;
    006    import net.minecraft.entity.passive.EntityVillager;
    007    import net.minecraft.util.Vec3;
    008
    009    public class EntityAIPlay extends EntityAIBase
    010    {
    011        private EntityVillager villagerObj;
    012        private EntityLiving targetVillager;
    013        private float field_75261_c;
    014        private int playTime;
    015
    016        public EntityAIPlay(EntityVillager par1EntityVillager, float par2)
    017        {
    018            this.villagerObj = par1EntityVillager;
    019            this.field_75261_c = par2;
    020            this.setMutexBits(1);
    021        }
    022
    023        /**
    024         * Returns whether the EntityAIBase should begin execution.
    025         */
    026        public boolean shouldExecute()
    027        {
    028            if (this.villagerObj.getGrowingAge() >= 0)
    029            {
    030                return false;
    031            }
    032            else if (this.villagerObj.getRNG().nextInt(400) != 0)
    033            {
    034                return false;
    035            }
    036            else
    037            {
    038                List var1 = this.villagerObj.worldObj.getEntitiesWithinAABB(EntityVillager.class, this.villagerObj.boundingBox.expand(6.0D, 3.0D, 6.0D));
    039                double var2 = Double.MAX_VALUE;
    040                Iterator var4 = var1.iterator();
    041
    042                while (var4.hasNext())
    043                {
    044                    EntityVillager var5 = (EntityVillager)var4.next();
    045
    046                    if (var5 != this.villagerObj && !var5.isPlaying() && var5.getGrowingAge() < 0)
    047                    {
    048                        double var6 = var5.getDistanceSqToEntity(this.villagerObj);
    049
    050                        if (var6 <= var2)
    051                        {
    052                            var2 = var6;
    053                            this.targetVillager = var5;
    054                        }
    055                    }
    056                }
    057
    058                if (this.targetVillager == null)
    059                {
    060                    Vec3 var8 = RandomPositionGenerator.findRandomTarget(this.villagerObj, 16, 3);
    061
    062                    if (var8 == null)
    063                    {
    064                        return false;
    065                    }
    066                }
    067
    068                return true;
    069            }
    070        }
    071
    072        /**
    073         * Returns whether an in-progress EntityAIBase should continue executing
    074         */
    075        public boolean continueExecuting()
    076        {
    077            return this.playTime > 0;
    078        }
    079
    080        /**
    081         * Execute a one shot task or start executing a continuous task
    082         */
    083        public void startExecuting()
    084        {
    085            if (this.targetVillager != null)
    086            {
    087                this.villagerObj.setPlaying(true);
    088            }
    089
    090            this.playTime = 1000;
    091        }
    092
    093        /**
    094         * Resets the task
    095         */
    096        public void resetTask()
    097        {
    098            this.villagerObj.setPlaying(false);
    099            this.targetVillager = null;
    100        }
    101
    102        /**
    103         * Updates the task
    104         */
    105        public void updateTask()
    106        {
    107            --this.playTime;
    108
    109            if (this.targetVillager != null)
    110            {
    111                if (this.villagerObj.getDistanceSqToEntity(this.targetVillager) > 4.0D)
    112                {
    113                    this.villagerObj.getNavigator().tryMoveToEntityLiving(this.targetVillager, this.field_75261_c);
    114                }
    115            }
    116            else if (this.villagerObj.getNavigator().noPath())
    117            {
    118                Vec3 var1 = RandomPositionGenerator.findRandomTarget(this.villagerObj, 16, 3);
    119
    120                if (var1 == null)
    121                {
    122                    return;
    123                }
    124
    125                this.villagerObj.getNavigator().tryMoveToXYZ(var1.xCoord, var1.yCoord, var1.zCoord, this.field_75261_c);
    126            }
    127        }
    128    }