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