001    package net.minecraft.entity.ai;
002    
003    import net.minecraft.entity.EntityCreature;
004    import net.minecraft.entity.player.EntityPlayer;
005    import net.minecraft.item.ItemStack;
006    
007    public class EntityAITempt extends EntityAIBase
008    {
009        /** The entity using this AI that is tempted by the player. */
010        private EntityCreature temptedEntity;
011        private float field_75282_b;
012        private double field_75283_c;
013        private double field_75280_d;
014        private double field_75281_e;
015        private double field_75278_f;
016        private double field_75279_g;
017    
018        /** The player that is tempting the entity that is using this AI. */
019        private EntityPlayer temptingPlayer;
020    
021        /**
022         * A counter that is decremented each time the shouldExecute method is called. The shouldExecute method will always
023         * return false if delayTemptCounter is greater than 0.
024         */
025        private int delayTemptCounter = 0;
026        private boolean field_75287_j;
027    
028        /**
029         * This field saves the ID of the items that can be used to breed entities with this behaviour.
030         */
031        private int breedingFood;
032    
033        /**
034         * Whether the entity using this AI will be scared by the tempter's sudden movement.
035         */
036        private boolean scaredByPlayerMovement;
037        private boolean field_75286_m;
038    
039        public EntityAITempt(EntityCreature par1EntityCreature, float par2, int par3, boolean par4)
040        {
041            this.temptedEntity = par1EntityCreature;
042            this.field_75282_b = par2;
043            this.breedingFood = par3;
044            this.scaredByPlayerMovement = par4;
045            this.setMutexBits(3);
046        }
047    
048        /**
049         * Returns whether the EntityAIBase should begin execution.
050         */
051        public boolean shouldExecute()
052        {
053            if (this.delayTemptCounter > 0)
054            {
055                --this.delayTemptCounter;
056                return false;
057            }
058            else
059            {
060                this.temptingPlayer = this.temptedEntity.worldObj.getClosestPlayerToEntity(this.temptedEntity, 10.0D);
061    
062                if (this.temptingPlayer == null)
063                {
064                    return false;
065                }
066                else
067                {
068                    ItemStack var1 = this.temptingPlayer.getCurrentEquippedItem();
069                    return var1 == null ? false : var1.itemID == this.breedingFood;
070                }
071            }
072        }
073    
074        /**
075         * Returns whether an in-progress EntityAIBase should continue executing
076         */
077        public boolean continueExecuting()
078        {
079            if (this.scaredByPlayerMovement)
080            {
081                if (this.temptedEntity.getDistanceSqToEntity(this.temptingPlayer) < 36.0D)
082                {
083                    if (this.temptingPlayer.getDistanceSq(this.field_75283_c, this.field_75280_d, this.field_75281_e) > 0.010000000000000002D)
084                    {
085                        return false;
086                    }
087    
088                    if (Math.abs((double)this.temptingPlayer.rotationPitch - this.field_75278_f) > 5.0D || Math.abs((double)this.temptingPlayer.rotationYaw - this.field_75279_g) > 5.0D)
089                    {
090                        return false;
091                    }
092                }
093                else
094                {
095                    this.field_75283_c = this.temptingPlayer.posX;
096                    this.field_75280_d = this.temptingPlayer.posY;
097                    this.field_75281_e = this.temptingPlayer.posZ;
098                }
099    
100                this.field_75278_f = (double)this.temptingPlayer.rotationPitch;
101                this.field_75279_g = (double)this.temptingPlayer.rotationYaw;
102            }
103    
104            return this.shouldExecute();
105        }
106    
107        /**
108         * Execute a one shot task or start executing a continuous task
109         */
110        public void startExecuting()
111        {
112            this.field_75283_c = this.temptingPlayer.posX;
113            this.field_75280_d = this.temptingPlayer.posY;
114            this.field_75281_e = this.temptingPlayer.posZ;
115            this.field_75287_j = true;
116            this.field_75286_m = this.temptedEntity.getNavigator().getAvoidsWater();
117            this.temptedEntity.getNavigator().setAvoidsWater(false);
118        }
119    
120        /**
121         * Resets the task
122         */
123        public void resetTask()
124        {
125            this.temptingPlayer = null;
126            this.temptedEntity.getNavigator().clearPathEntity();
127            this.delayTemptCounter = 100;
128            this.field_75287_j = false;
129            this.temptedEntity.getNavigator().setAvoidsWater(this.field_75286_m);
130        }
131    
132        /**
133         * Updates the task
134         */
135        public void updateTask()
136        {
137            this.temptedEntity.getLookHelper().setLookPositionWithEntity(this.temptingPlayer, 30.0F, (float)this.temptedEntity.getVerticalFaceSpeed());
138    
139            if (this.temptedEntity.getDistanceSqToEntity(this.temptingPlayer) < 6.25D)
140            {
141                this.temptedEntity.getNavigator().clearPathEntity();
142            }
143            else
144            {
145                this.temptedEntity.getNavigator().tryMoveToEntityLiving(this.temptingPlayer, this.field_75282_b);
146            }
147        }
148    
149        public boolean func_75277_f()
150        {
151            return this.field_75287_j;
152        }
153    }