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    }