    001    package net.minecraft.entity.ai;
    002
    003    import net.minecraft.entity.EntityLiving;
    004
    005    public class EntityAIBreakDoor extends EntityAIDoorInteract
    006    {
    007        private int breakingTime;
    008        private int field_75358_j = -1;
    009
    010        public EntityAIBreakDoor(EntityLiving par1EntityLiving)
    011        {
    012            super(par1EntityLiving);
    013        }
    014
    015        /**
    016         * Returns whether the EntityAIBase should begin execution.
    017         */
    018        public boolean shouldExecute()
    019        {
    020            return !super.shouldExecute() ? false : (!this.theEntity.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing") ? false : !this.targetDoor.isDoorOpen(this.theEntity.worldObj, this.entityPosX, this.entityPosY, this.entityPosZ));
    021        }
    022
    023        /**
    024         * Execute a one shot task or start executing a continuous task
    025         */
    026        public void startExecuting()
    027        {
    028            super.startExecuting();
    029            this.breakingTime = 0;
    030        }
    031
    032        /**
    033         * Returns whether an in-progress EntityAIBase should continue executing
    034         */
    035        public boolean continueExecuting()
    036        {
    037            double var1 = this.theEntity.getDistanceSq((double)this.entityPosX, (double)this.entityPosY, (double)this.entityPosZ);
    038            return this.breakingTime <= 240 && !this.targetDoor.isDoorOpen(this.theEntity.worldObj, this.entityPosX, this.entityPosY, this.entityPosZ) && var1 < 4.0D;
    039        }
    040
    041        /**
    042         * Resets the task
    043         */
    044        public void resetTask()
    045        {
    046            super.resetTask();
    047            this.theEntity.worldObj.destroyBlockInWorldPartially(this.theEntity.entityId, this.entityPosX, this.entityPosY, this.entityPosZ, -1);
    048        }
    049
    050        /**
    051         * Updates the task
    052         */
    053        public void updateTask()
    054        {
    055            super.updateTask();
    056
    057            if (this.theEntity.getRNG().nextInt(20) == 0)
    058            {
    059                this.theEntity.worldObj.playAuxSFX(1010, this.entityPosX, this.entityPosY, this.entityPosZ, 0);
    060            }
    061
    062            ++this.breakingTime;
    063            int var1 = (int)((float)this.breakingTime / 240.0F * 10.0F);
    064
    065            if (var1 != this.field_75358_j)
    066            {
    067                this.theEntity.worldObj.destroyBlockInWorldPartially(this.theEntity.entityId, this.entityPosX, this.entityPosY, this.entityPosZ, var1);
    068                this.field_75358_j = var1;
    069            }
    070
    071            if (this.breakingTime == 240 && this.theEntity.worldObj.difficultySetting == 3)
    072            {
    073                this.theEntity.worldObj.setBlockWithNotify(this.entityPosX, this.entityPosY, this.entityPosZ, 0);
    074                this.theEntity.worldObj.playAuxSFX(1012, this.entityPosX, this.entityPosY, this.entityPosZ, 0);
    075                this.theEntity.worldObj.playAuxSFX(2001, this.entityPosX, this.entityPosY, this.entityPosZ, this.targetDoor.blockID);
    076            }
    077        }
    078    }