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