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 var1 = MathHelper.floor_double(this.theEntity.posX);
035            int var2 = MathHelper.floor_double(this.theEntity.posY);
036            int var3 = MathHelper.floor_double(this.theEntity.posZ);
037            return this.theWorld.getBlockId(var1, var2, var3) == Block.tallGrass.blockID && this.theWorld.getBlockMetadata(var1, var2, var3) == 1 ? true : this.theWorld.getBlockId(var1, var2 - 1, var3) == 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 var1 = MathHelper.floor_double(this.theEntity.posX);
082            int var2 = MathHelper.floor_double(this.theEntity.posY);
083            int var3 = MathHelper.floor_double(this.theEntity.posZ);
084
085            if (this.theWorld.getBlockId(var1, var2, var3) == Block.tallGrass.blockID)
086            {
087                this.theWorld.playAuxSFX(2001, var1, var2, var3, Block.tallGrass.blockID + 4096);
088                this.theWorld.setBlockWithNotify(var1, var2, var3, 0);
089                this.theEntity.eatGrassBonus();
090            }
091            else if (this.theWorld.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID)
092            {
093                this.theWorld.playAuxSFX(2001, var1, var2 - 1, var3, Block.grass.blockID);
094                this.theWorld.setBlockWithNotify(var1, var2 - 1, var3, Block.dirt.blockID);
095                this.theEntity.eatGrassBonus();
096            }
097        }
098    }
099}