001    package net.minecraft.entity.ai;
002    
003    import net.minecraft.entity.EntityLiving;
004    import net.minecraft.world.World;
005    
006    public class EntityAIOcelotAttack extends EntityAIBase
007    {
008        World theWorld;
009        EntityLiving theEntity;
010        EntityLiving theVictim;
011        int attackCountdown = 0;
012    
013        public EntityAIOcelotAttack(EntityLiving par1EntityLiving)
014        {
015            this.theEntity = par1EntityLiving;
016            this.theWorld = par1EntityLiving.worldObj;
017            this.setMutexBits(3);
018        }
019    
020        /**
021         * Returns whether the EntityAIBase should begin execution.
022         */
023        public boolean shouldExecute()
024        {
025            EntityLiving var1 = this.theEntity.getAttackTarget();
026    
027            if (var1 == null)
028            {
029                return false;
030            }
031            else
032            {
033                this.theVictim = var1;
034                return true;
035            }
036        }
037    
038        /**
039         * Returns whether an in-progress EntityAIBase should continue executing
040         */
041        public boolean continueExecuting()
042        {
043            return !this.theVictim.isEntityAlive() ? false : (this.theEntity.getDistanceSqToEntity(this.theVictim) > 225.0D ? false : !this.theEntity.getNavigator().noPath() || this.shouldExecute());
044        }
045    
046        /**
047         * Resets the task
048         */
049        public void resetTask()
050        {
051            this.theVictim = null;
052            this.theEntity.getNavigator().clearPathEntity();
053        }
054    
055        /**
056         * Updates the task
057         */
058        public void updateTask()
059        {
060            this.theEntity.getLookHelper().setLookPositionWithEntity(this.theVictim, 30.0F, 30.0F);
061            double var1 = (double)(this.theEntity.width * 2.0F * this.theEntity.width * 2.0F);
062            double var3 = this.theEntity.getDistanceSq(this.theVictim.posX, this.theVictim.boundingBox.minY, this.theVictim.posZ);
063            float var5 = 0.23F;
064    
065            if (var3 > var1 && var3 < 16.0D)
066            {
067                var5 = 0.4F;
068            }
069            else if (var3 < 225.0D)
070            {
071                var5 = 0.18F;
072            }
073    
074            this.theEntity.getNavigator().tryMoveToEntityLiving(this.theVictim, var5);
075            this.attackCountdown = Math.max(this.attackCountdown - 1, 0);
076    
077            if (var3 <= var1)
078            {
079                if (this.attackCountdown <= 0)
080                {
081                    this.attackCountdown = 20;
082                    this.theEntity.attackEntityAsMob(this.theVictim);
083                }
084            }
085        }
086    }