001 package net.minecraft.src; 002 003 public class EntityAIControlledByPlayer extends EntityAIBase 004 { 005 private final EntityLiving field_82640_a; 006 private final float field_82638_b; 007 private float field_82639_c = 0.0F; 008 private boolean field_82636_d = false; 009 private int field_82637_e = 0; 010 private int field_82635_f = 0; 011 012 public EntityAIControlledByPlayer(EntityLiving par1EntityLiving, float par2) 013 { 014 this.field_82640_a = par1EntityLiving; 015 this.field_82638_b = par2; 016 this.setMutexBits(7); 017 } 018 019 /** 020 * Execute a one shot task or start executing a continuous task 021 */ 022 public void startExecuting() 023 { 024 this.field_82639_c = 0.0F; 025 } 026 027 /** 028 * Resets the task 029 */ 030 public void resetTask() 031 { 032 this.field_82636_d = false; 033 this.field_82639_c = 0.0F; 034 } 035 036 /** 037 * Returns whether the EntityAIBase should begin execution. 038 */ 039 public boolean shouldExecute() 040 { 041 return this.field_82640_a.isEntityAlive() && this.field_82640_a.riddenByEntity != null && this.field_82640_a.riddenByEntity instanceof EntityPlayer && (this.field_82636_d || this.field_82640_a.func_82171_bF()); 042 } 043 044 /** 045 * Updates the task 046 */ 047 public void updateTask() 048 { 049 EntityPlayer var1 = (EntityPlayer)this.field_82640_a.riddenByEntity; 050 EntityCreature var2 = (EntityCreature)this.field_82640_a; 051 float var3 = MathHelper.wrapAngleTo180_float(var1.rotationYaw - this.field_82640_a.rotationYaw) * 0.5F; 052 053 if (var3 > 5.0F) 054 { 055 var3 = 5.0F; 056 } 057 058 if (var3 < -5.0F) 059 { 060 var3 = -5.0F; 061 } 062 063 this.field_82640_a.rotationYaw = MathHelper.wrapAngleTo180_float(this.field_82640_a.rotationYaw + var3); 064 065 if (this.field_82639_c < this.field_82638_b) 066 { 067 this.field_82639_c += (this.field_82638_b - this.field_82639_c) * 0.01F; 068 } 069 070 if (this.field_82639_c > this.field_82638_b) 071 { 072 this.field_82639_c = this.field_82638_b; 073 } 074 075 int var4 = MathHelper.floor_double(this.field_82640_a.posX); 076 int var5 = MathHelper.floor_double(this.field_82640_a.posY); 077 int var6 = MathHelper.floor_double(this.field_82640_a.posZ); 078 float var7 = this.field_82639_c; 079 080 if (this.field_82636_d) 081 { 082 if (this.field_82637_e++ > this.field_82635_f) 083 { 084 this.field_82636_d = false; 085 } 086 087 var7 += var7 * 1.15F * MathHelper.sin((float)this.field_82637_e / (float)this.field_82635_f * (float)Math.PI); 088 } 089 090 float var8 = 0.91F; 091 092 if (this.field_82640_a.onGround) 093 { 094 var8 = 0.54600006F; 095 int var9 = this.field_82640_a.worldObj.getBlockId(MathHelper.floor_float((float)var4), MathHelper.floor_float((float)var5) - 1, MathHelper.floor_float((float)var6)); 096 097 if (var9 > 0) 098 { 099 var8 = Block.blocksList[var9].slipperiness * 0.91F; 100 } 101 } 102 103 float var21 = 0.16277136F / (var8 * var8 * var8); 104 float var10 = MathHelper.sin(var2.rotationYaw * (float)Math.PI / 180.0F); 105 float var11 = MathHelper.cos(var2.rotationYaw * (float)Math.PI / 180.0F); 106 float var12 = var2.getAIMoveSpeed() * var21; 107 float var13 = Math.max(var7, 1.0F); 108 var13 = var12 / var13; 109 float var14 = var7 * var13; 110 float var15 = -(var14 * var10); 111 float var16 = var14 * var11; 112 113 if (MathHelper.abs(var15) > MathHelper.abs(var16)) 114 { 115 if (var15 < 0.0F) 116 { 117 var15 -= this.field_82640_a.width / 2.0F; 118 } 119 120 if (var15 > 0.0F) 121 { 122 var15 += this.field_82640_a.width / 2.0F; 123 } 124 125 var16 = 0.0F; 126 } 127 else 128 { 129 var15 = 0.0F; 130 131 if (var16 < 0.0F) 132 { 133 var16 -= this.field_82640_a.width / 2.0F; 134 } 135 136 if (var16 > 0.0F) 137 { 138 var16 += this.field_82640_a.width / 2.0F; 139 } 140 } 141 142 int var17 = MathHelper.floor_double(this.field_82640_a.posX + (double)var15); 143 int var18 = MathHelper.floor_double(this.field_82640_a.posZ + (double)var16); 144 PathPoint var19 = new PathPoint(MathHelper.floor_float(this.field_82640_a.width + 1.0F), MathHelper.floor_float(this.field_82640_a.height + var1.height + 1.0F), MathHelper.floor_float(this.field_82640_a.width + 1.0F)); 145 146 if ((var4 != var17 || var6 != var18) && PathFinder.func_82565_a(this.field_82640_a, var17, var5, var18, var19, false, false, true) == 0 && PathFinder.func_82565_a(this.field_82640_a, var4, var5 + 1, var6, var19, false, false, true) == 1 && PathFinder.func_82565_a(this.field_82640_a, var17, var5 + 1, var18, var19, false, false, true) == 1) 147 { 148 var2.getJumpHelper().setJumping(); 149 } 150 151 if (!var1.capabilities.isCreativeMode && this.field_82639_c >= this.field_82638_b * 0.5F && this.field_82640_a.getRNG().nextFloat() < 0.006F && !this.field_82636_d) 152 { 153 ItemStack var20 = var1.getHeldItem(); 154 155 if (var20 != null && var20.itemID == Item.field_82793_bR.shiftedIndex) 156 { 157 var20.damageItem(1, var1); 158 159 if (var20.stackSize == 0) 160 { 161 var1.inventory.mainInventory[var1.inventory.currentItem] = new ItemStack(Item.fishingRod); 162 } 163 } 164 } 165 166 this.field_82640_a.moveEntityWithHeading(0.0F, var7); 167 } 168 169 public boolean func_82634_f() 170 { 171 return this.field_82636_d; 172 } 173 174 public void func_82632_g() 175 { 176 this.field_82636_d = true; 177 this.field_82637_e = 0; 178 this.field_82635_f = this.field_82640_a.getRNG().nextInt(841) + 140; 179 } 180 181 public boolean func_82633_h() 182 { 183 return !this.func_82634_f() && this.field_82639_c > this.field_82638_b * 0.3F; 184 } 185 }