001 package net.minecraft.entity.ai;
002
003 import net.minecraft.block.Block;
004 import net.minecraft.entity.EntityLiving;
005 import net.minecraft.util.MathHelper;
006 import net.minecraft.world.World;
007
008 public 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 }