001package net.minecraft.entity.ai;
002
003import net.minecraft.block.Block;
004import net.minecraft.entity.EntityLiving;
005import net.minecraft.util.MathHelper;
006import net.minecraft.world.World;
007
008public class EntityAIEatGrass extends EntityAIBase
009{
010    private EntityLiving theEntity;
011    private World theWorld;
012
013    /** A decrementing tick used for the sheep's head offset and animation. */
014    int eatGrassTick = 0;
015
016    public EntityAIEatGrass(EntityLiving par1EntityLiving)
017    {
018        this.theEntity = par1EntityLiving;
019        this.theWorld = par1EntityLiving.worldObj;
020        this.setMutexBits(7);
021    }
022
023    /**
024     * Returns whether the EntityAIBase should begin execution.
025     */
026    public boolean shouldExecute()
027    {
028        if (this.theEntity.getRNG().nextInt(this.theEntity.isChild() ? 50 : 1000) != 0)
029        {
030            return false;
031        }
032        else
033        {
034            int i = MathHelper.floor_double(this.theEntity.posX);
035            int j = MathHelper.floor_double(this.theEntity.posY);
036            int k = MathHelper.floor_double(this.theEntity.posZ);
037            return this.theWorld.getBlockId(i, j, k) == Block.tallGrass.blockID && this.theWorld.getBlockMetadata(i, j, k) == 1 ? true : this.theWorld.getBlockId(i, j - 1, k) == Block.grass.blockID;
038        }
039    }
040
041    /**
042     * Execute a one shot task or start executing a continuous task
043     */
044    public void startExecuting()
045    {
046        this.eatGrassTick = 40;
047        this.theWorld.setEntityState(this.theEntity, (byte)10);
048        this.theEntity.getNavigator().clearPathEntity();
049    }
050
051    /**
052     * Resets the task
053     */
054    public void resetTask()
055    {
056        this.eatGrassTick = 0;
057    }
058
059    /**
060     * Returns whether an in-progress EntityAIBase should continue executing
061     */
062    public boolean continueExecuting()
063    {
064        return this.eatGrassTick > 0;
065    }
066
067    public int getEatGrassTick()
068    {
069        return this.eatGrassTick;
070    }
071
072    /**
073     * Updates the task
074     */
075    public void updateTask()
076    {
077        this.eatGrassTick = Math.max(0, this.eatGrassTick - 1);
078
079        if (this.eatGrassTick == 4)
080        {
081            int i = MathHelper.floor_double(this.theEntity.posX);
082            int j = MathHelper.floor_double(this.theEntity.posY);
083            int k = MathHelper.floor_double(this.theEntity.posZ);
084
085            if (this.theWorld.getBlockId(i, j, k) == Block.tallGrass.blockID)
086            {
087                this.theWorld.func_94578_a(i, j, k, false);
088                this.theEntity.eatGrassBonus();
089            }
090            else if (this.theWorld.getBlockId(i, j - 1, k) == Block.grass.blockID)
091            {
092                this.theWorld.playAuxSFX(2001, i, j - 1, k, Block.grass.blockID);
093                this.theWorld.setBlockAndMetadataWithNotify(i, j - 1, k, Block.dirt.blockID, 0, 2);
094                this.theEntity.eatGrassBonus();
095            }
096        }
097    }
098}