001 package net.minecraft.src; 002 003 public abstract class EntityAIDoorInteract extends EntityAIBase 004 { 005 protected EntityLiving theEntity; 006 protected int entityPosX; 007 protected int entityPosY; 008 protected int entityPosZ; 009 protected BlockDoor targetDoor; 010 011 /** 012 * If is true then the Entity has stopped Door Interaction and compoleted the task. 013 */ 014 boolean hasStoppedDoorInteraction; 015 float entityPositionX; 016 float entityPositionZ; 017 018 public EntityAIDoorInteract(EntityLiving par1EntityLiving) 019 { 020 this.theEntity = par1EntityLiving; 021 } 022 023 /** 024 * Returns whether the EntityAIBase should begin execution. 025 */ 026 public boolean shouldExecute() 027 { 028 if (!this.theEntity.isCollidedHorizontally) 029 { 030 return false; 031 } 032 else 033 { 034 PathNavigate var1 = this.theEntity.getNavigator(); 035 PathEntity var2 = var1.getPath(); 036 037 if (var2 != null && !var2.isFinished() && var1.getCanBreakDoors()) 038 { 039 for (int var3 = 0; var3 < Math.min(var2.getCurrentPathIndex() + 2, var2.getCurrentPathLength()); ++var3) 040 { 041 PathPoint var4 = var2.getPathPointFromIndex(var3); 042 this.entityPosX = var4.xCoord; 043 this.entityPosY = var4.yCoord + 1; 044 this.entityPosZ = var4.zCoord; 045 046 if (this.theEntity.getDistanceSq((double)this.entityPosX, this.theEntity.posY, (double)this.entityPosZ) <= 2.25D) 047 { 048 this.targetDoor = this.findUsableDoor(this.entityPosX, this.entityPosY, this.entityPosZ); 049 050 if (this.targetDoor != null) 051 { 052 return true; 053 } 054 } 055 } 056 057 this.entityPosX = MathHelper.floor_double(this.theEntity.posX); 058 this.entityPosY = MathHelper.floor_double(this.theEntity.posY + 1.0D); 059 this.entityPosZ = MathHelper.floor_double(this.theEntity.posZ); 060 this.targetDoor = this.findUsableDoor(this.entityPosX, this.entityPosY, this.entityPosZ); 061 return this.targetDoor != null; 062 } 063 else 064 { 065 return false; 066 } 067 } 068 } 069 070 /** 071 * Returns whether an in-progress EntityAIBase should continue executing 072 */ 073 public boolean continueExecuting() 074 { 075 return !this.hasStoppedDoorInteraction; 076 } 077 078 /** 079 * Execute a one shot task or start executing a continuous task 080 */ 081 public void startExecuting() 082 { 083 this.hasStoppedDoorInteraction = false; 084 this.entityPositionX = (float)((double)((float)this.entityPosX + 0.5F) - this.theEntity.posX); 085 this.entityPositionZ = (float)((double)((float)this.entityPosZ + 0.5F) - this.theEntity.posZ); 086 } 087 088 /** 089 * Updates the task 090 */ 091 public void updateTask() 092 { 093 float var1 = (float)((double)((float)this.entityPosX + 0.5F) - this.theEntity.posX); 094 float var2 = (float)((double)((float)this.entityPosZ + 0.5F) - this.theEntity.posZ); 095 float var3 = this.entityPositionX * var1 + this.entityPositionZ * var2; 096 097 if (var3 < 0.0F) 098 { 099 this.hasStoppedDoorInteraction = true; 100 } 101 } 102 103 /** 104 * Determines if a door can be broken with AI. 105 */ 106 private BlockDoor findUsableDoor(int par1, int par2, int par3) 107 { 108 int var4 = this.theEntity.worldObj.getBlockId(par1, par2, par3); 109 return var4 != Block.doorWood.blockID ? null : (BlockDoor)Block.blocksList[var4]; 110 } 111 }