001    package net.minecraft.entity.ai;
002    
003    import java.util.Iterator;
004    import java.util.List;
005    import net.minecraft.entity.monster.EntityIronGolem;
006    import net.minecraft.entity.passive.EntityVillager;
007    
008    public class EntityAIFollowGolem extends EntityAIBase
009    {
010        private EntityVillager theVillager;
011        private EntityIronGolem theGolem;
012        private int takeGolemRoseTick;
013        private boolean tookGolemRose = false;
014    
015        public EntityAIFollowGolem(EntityVillager par1EntityVillager)
016        {
017            this.theVillager = par1EntityVillager;
018            this.setMutexBits(3);
019        }
020    
021        /**
022         * Returns whether the EntityAIBase should begin execution.
023         */
024        public boolean shouldExecute()
025        {
026            if (this.theVillager.getGrowingAge() >= 0)
027            {
028                return false;
029            }
030            else if (!this.theVillager.worldObj.isDaytime())
031            {
032                return false;
033            }
034            else
035            {
036                List var1 = this.theVillager.worldObj.getEntitiesWithinAABB(EntityIronGolem.class, this.theVillager.boundingBox.expand(6.0D, 2.0D, 6.0D));
037    
038                if (var1.isEmpty())
039                {
040                    return false;
041                }
042                else
043                {
044                    Iterator var2 = var1.iterator();
045    
046                    while (var2.hasNext())
047                    {
048                        EntityIronGolem var3 = (EntityIronGolem)var2.next();
049    
050                        if (var3.getHoldRoseTick() > 0)
051                        {
052                            this.theGolem = var3;
053                            break;
054                        }
055                    }
056    
057                    return this.theGolem != null;
058                }
059            }
060        }
061    
062        /**
063         * Returns whether an in-progress EntityAIBase should continue executing
064         */
065        public boolean continueExecuting()
066        {
067            return this.theGolem.getHoldRoseTick() > 0;
068        }
069    
070        /**
071         * Execute a one shot task or start executing a continuous task
072         */
073        public void startExecuting()
074        {
075            this.takeGolemRoseTick = this.theVillager.getRNG().nextInt(320);
076            this.tookGolemRose = false;
077            this.theGolem.getNavigator().clearPathEntity();
078        }
079    
080        /**
081         * Resets the task
082         */
083        public void resetTask()
084        {
085            this.theGolem = null;
086            this.theVillager.getNavigator().clearPathEntity();
087        }
088    
089        /**
090         * Updates the task
091         */
092        public void updateTask()
093        {
094            this.theVillager.getLookHelper().setLookPositionWithEntity(this.theGolem, 30.0F, 30.0F);
095    
096            if (this.theGolem.getHoldRoseTick() == this.takeGolemRoseTick)
097            {
098                this.theVillager.getNavigator().tryMoveToEntityLiving(this.theGolem, 0.15F);
099                this.tookGolemRose = true;
100            }
101    
102            if (this.tookGolemRose && this.theVillager.getDistanceSqToEntity(this.theGolem) < 4.0D)
103            {
104                this.theGolem.setHoldingRose(false);
105                this.theVillager.getNavigator().clearPathEntity();
106            }
107        }
108    }