/** Called to update the entity's position/logic. */
  @Override
  public void onUpdate() {
    super.onUpdate();

    if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) {
      float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
      this.prevRotationYaw =
          this.rotationYaw = (float) ((Math.atan2(this.motionX, this.motionZ) * 180D) / Math.PI);
      this.prevRotationPitch =
          this.rotationPitch = (float) ((Math.atan2(this.motionY, f) * 180D) / Math.PI);
    }

    int i = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);

    if (i > 0) {
      Block.blocksList[i].setBlockBoundsBasedOnState(
          this.worldObj, this.xTile, this.yTile, this.zTile);
      AxisAlignedBB axisalignedbb =
          Block.blocksList[i].getCollisionBoundingBoxFromPool(
              this.worldObj, this.xTile, this.yTile, this.zTile);

      if (axisalignedbb != null
          && axisalignedbb.isVecInside(
              Vec3.func_72437_a().func_72345_a(this.posX, this.posY, this.posZ))) {
        this.inGround = true;
      }
    }

    if (this.arrowShake > 0) {
      this.arrowShake--;
    }

    if (this.inGround) {
      int j = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
      int k = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile);

      if (j != this.inTile || k != this.inData) {
        this.inGround = false;
        this.motionX *= this.rand.nextFloat() * 0.2F;
        this.motionY *= this.rand.nextFloat() * 0.2F;
        this.motionZ *= this.rand.nextFloat() * 0.2F;
        this.ticksInGround = 0;
        this.ticksInAir = 0;
        return;
      }

      this.ticksInGround++;

      if (this.ticksInGround == 1200) {
        setDead();
      }

      return;
    }

    this.ticksInAir++;
    Vec3 vec3 = Vec3.func_72437_a().func_72345_a(this.posX, this.posY, this.posZ);
    Vec3 vec3_1 =
        Vec3.func_72437_a()
            .func_72345_a(
                this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
    MovingObjectPosition movingobjectposition =
        this.worldObj.rayTraceBlocks_do_do(vec3, vec3_1, false, true);
    vec3 = Vec3.func_72437_a().func_72345_a(this.posX, this.posY, this.posZ);
    vec3_1 =
        Vec3.func_72437_a()
            .func_72345_a(
                this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);

    if (movingobjectposition != null) {
      vec3_1 =
          Vec3.func_72437_a()
              .func_72345_a(
                  movingobjectposition.hitVec.xCoord,
                  movingobjectposition.hitVec.yCoord,
                  movingobjectposition.hitVec.zCoord);
    }

    Entity entity = null;
    List list =
        this.worldObj.getEntitiesWithinAABBExcludingEntity(
            this,
            this.boundingBox
                .addCoord(this.motionX, this.motionY, this.motionZ)
                .expand(1.0D, 1.0D, 1.0D));
    double d = 0.0D;
    Iterator iterator = list.iterator();

    do {
      if (!iterator.hasNext()) {
        break;
      }

      Entity entity1 = (Entity) iterator.next();

      if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) {
        float f5 = 0.3F;
        AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand(f5, f5, f5);
        MovingObjectPosition movingobjectposition1 =
            axisalignedbb1.calculateIntercept(vec3, vec3_1);

        if (movingobjectposition1 != null) {
          double d1 = vec3.distanceTo(movingobjectposition1.hitVec);

          if (d1 < d || d == 0.0D) {
            entity = entity1;
            d = d1;
          }
        }
      }
    } while (true);

    if (entity != null) {
      movingobjectposition = new MovingObjectPosition(entity);
    }

    if (movingobjectposition != null) {
      if (movingobjectposition.entityHit != null) {
        float f1 =
            MathHelper.sqrt_double(
                this.motionX * this.motionX
                    + this.motionY * this.motionY
                    + this.motionZ * this.motionZ);
        int i1 = MathHelper.func_76143_f(f1 * this.damage);

        if (func_70241_g()) {
          i1 += this.rand.nextInt(i1 / 2 + 2);
        }

        DamageSource damagesource = null;

        if (this.shootingEntity == null) {
          damagesource = DamageSource.causeArrowDamage(this, this);
        } else {
          damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity);
        }

        if (isBurning()) {
          movingobjectposition.entityHit.setFire(5);
        }

        if (movingobjectposition.entityHit.attackEntityFrom(damagesource, i1)) {
          if (movingobjectposition.entityHit instanceof EntityLiving) {
            ((EntityLiving) movingobjectposition.entityHit).arrowHitTempCounter++;

            if (this.knockbackStrength > 0) {
              float f7 =
                  MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);

              if (f7 > 0.0F) {
                movingobjectposition.entityHit.addVelocity(
                    (this.motionX * this.knockbackStrength * 0.60000002384185791D) / f7,
                    0.10000000000000001D,
                    (this.motionZ * this.knockbackStrength * 0.60000002384185791D) / f7);
              }
            }
          }

          this.worldObj.playSoundAtEntity(
              this, "random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
          setDead();
        } else {
          this.motionX *= -0.10000000149011612D;
          this.motionY *= -0.10000000149011612D;
          this.motionZ *= -0.10000000149011612D;
          this.rotationYaw += 180F;
          this.prevRotationYaw += 180F;
          this.ticksInAir = 0;
        }
      } else {
        this.xTile = movingobjectposition.blockX;
        this.yTile = movingobjectposition.blockY;
        this.zTile = movingobjectposition.blockZ;
        this.inTile = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
        this.inData = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile);
        this.motionX = (float) (movingobjectposition.hitVec.xCoord - this.posX);
        this.motionY = (float) (movingobjectposition.hitVec.yCoord - this.posY);
        this.motionZ = (float) (movingobjectposition.hitVec.zCoord - this.posZ);
        float f2 =
            MathHelper.sqrt_double(
                this.motionX * this.motionX
                    + this.motionY * this.motionY
                    + this.motionZ * this.motionZ);
        this.posX -= (this.motionX / f2) * 0.05000000074505806D;
        this.posY -= (this.motionY / f2) * 0.05000000074505806D;
        this.posZ -= (this.motionZ / f2) * 0.05000000074505806D;
        this.worldObj.playSoundAtEntity(
            this, "random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
        this.inGround = true;
        this.arrowShake = 7;
        func_70243_d(false);
      }
    }

    if (func_70241_g()) {
      for (int l = 0; l < 4; l++) {
        this.worldObj.spawnParticle(
            "crit",
            this.posX + (this.motionX * l) / 4D,
            this.posY + (this.motionY * l) / 4D,
            this.posZ + (this.motionZ * l) / 4D,
            -this.motionX,
            -this.motionY + 0.20000000000000001D,
            -this.motionZ);
      }
    }

    this.posX += this.motionX;
    this.posY += this.motionY;
    this.posZ += this.motionZ;
    float f3 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
    this.rotationYaw = (float) ((Math.atan2(this.motionX, this.motionZ) * 180D) / Math.PI);

    for (this.rotationPitch = (float) ((Math.atan2(this.motionY, f3) * 180D) / Math.PI);
        this.rotationPitch - this.prevRotationPitch < -180F;
        this.prevRotationPitch -= 360F) {}

    for (; this.rotationPitch - this.prevRotationPitch >= 180F; this.prevRotationPitch += 360F) {}

    for (; this.rotationYaw - this.prevRotationYaw < -180F; this.prevRotationYaw -= 360F) {}

    for (; this.rotationYaw - this.prevRotationYaw >= 180F; this.prevRotationYaw += 360F) {}

    this.rotationPitch =
        this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
    this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
    float f4 = 0.99F;
    float f6 = 0.05F;

    if (isInWater()) {
      for (int j1 = 0; j1 < 4; j1++) {
        float f8 = 0.25F;
        this.worldObj.spawnParticle(
            "bubble",
            this.posX - this.motionX * f8,
            this.posY - this.motionY * f8,
            this.posZ - this.motionZ * f8,
            this.motionX,
            this.motionY,
            this.motionZ);
      }

      f4 = 0.8F;
    }

    this.motionX *= f4;
    this.motionY *= f4;
    this.motionZ *= f4;
    this.motionY -= f6;
    setPosition(this.posX, this.posY, this.posZ);
    func_70017_D();
  }