001 package net.minecraft.src;
002
003 public class EntityAIFollowOwner extends EntityAIBase
004 {
005 private EntityTameable thePet;
006 private EntityLiving theOwner;
007 World theWorld;
008 private float field_75336_f;
009 private PathNavigate petPathfinder;
010 private int field_75343_h;
011 float maxDist;
012 float minDist;
013 private boolean field_75344_i;
014
015 public EntityAIFollowOwner(EntityTameable par1EntityTameable, float par2, float par3, float par4)
016 {
017 this.thePet = par1EntityTameable;
018 this.theWorld = par1EntityTameable.worldObj;
019 this.field_75336_f = par2;
020 this.petPathfinder = par1EntityTameable.getNavigator();
021 this.minDist = par3;
022 this.maxDist = par4;
023 this.setMutexBits(3);
024 }
025
026 /**
027 * Returns whether the EntityAIBase should begin execution.
028 */
029 public boolean shouldExecute()
030 {
031 EntityLiving var1 = this.thePet.getOwner();
032
033 if (var1 == null)
034 {
035 return false;
036 }
037 else if (this.thePet.isSitting())
038 {
039 return false;
040 }
041 else if (this.thePet.getDistanceSqToEntity(var1) < (double)(this.minDist * this.minDist))
042 {
043 return false;
044 }
045 else
046 {
047 this.theOwner = var1;
048 return true;
049 }
050 }
051
052 /**
053 * Returns whether an in-progress EntityAIBase should continue executing
054 */
055 public boolean continueExecuting()
056 {
057 return !this.petPathfinder.noPath() && this.thePet.getDistanceSqToEntity(this.theOwner) > (double)(this.maxDist * this.maxDist) && !this.thePet.isSitting();
058 }
059
060 /**
061 * Execute a one shot task or start executing a continuous task
062 */
063 public void startExecuting()
064 {
065 this.field_75343_h = 0;
066 this.field_75344_i = this.thePet.getNavigator().getAvoidsWater();
067 this.thePet.getNavigator().setAvoidsWater(false);
068 }
069
070 /**
071 * Resets the task
072 */
073 public void resetTask()
074 {
075 this.theOwner = null;
076 this.petPathfinder.clearPathEntity();
077 this.thePet.getNavigator().setAvoidsWater(this.field_75344_i);
078 }
079
080 /**
081 * Updates the task
082 */
083 public void updateTask()
084 {
085 this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float)this.thePet.getVerticalFaceSpeed());
086
087 if (!this.thePet.isSitting())
088 {
089 if (--this.field_75343_h <= 0)
090 {
091 this.field_75343_h = 10;
092
093 if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.field_75336_f))
094 {
095 if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D)
096 {
097 int var1 = MathHelper.floor_double(this.theOwner.posX) - 2;
098 int var2 = MathHelper.floor_double(this.theOwner.posZ) - 2;
099 int var3 = MathHelper.floor_double(this.theOwner.boundingBox.minY);
100
101 for (int var4 = 0; var4 <= 4; ++var4)
102 {
103 for (int var5 = 0; var5 <= 4; ++var5)
104 {
105 if ((var4 < 1 || var5 < 1 || var4 > 3 || var5 > 3) && this.theWorld.doesBlockHaveSolidTopSurface(var1 + var4, var3 - 1, var2 + var5) && !this.theWorld.isBlockNormalCube(var1 + var4, var3, var2 + var5) && !this.theWorld.isBlockNormalCube(var1 + var4, var3 + 1, var2 + var5))
106 {
107 this.thePet.setLocationAndAngles((double)((float)(var1 + var4) + 0.5F), (double)var3, (double)((float)(var2 + var5) + 0.5F), this.thePet.rotationYaw, this.thePet.rotationPitch);
108 this.petPathfinder.clearPathEntity();
109 return;
110 }
111 }
112 }
113 }
114 }
115 }
116 }
117 }
118 }