    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    }