@SuppressWarnings("rawtypes")
  public EntityItem getClosestFish(Entity entity, double d) {
    double d1 = -1D;
    EntityItem entityitem = null;
    List list = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox.expand(d, d, d));
    for (int i = 0; i < list.size(); i++) {
      Entity entity1 = (Entity) list.get(i);
      if (!(entity1 instanceof EntityItem)) {
        continue;
      }
      EntityItem entityitem1 = (EntityItem) entity1;
      if (entityitem1.item.itemID != Item.fishRaw.shiftedIndex
          || !EntityHelper.getInWater(entityitem1)) {
        continue;
      }
      double d2 = entityitem1.getDistanceSq(entity.posX, entity.posY, entity.posZ);
      if ((d < 0.0D || d2 < d * d) && (d1 == -1D || d2 < d1)) {
        d1 = d2;
        entityitem = entityitem1;
      }
    }

    return entityitem;
  }
  protected void updatePlayerActionState() {
    if (riddenByEntity != null && tamed) {
      return;
    }
    hasAttacked = false;
    float f = 16F;
    if (playerToAttack == null) {
      playerToAttack = findPlayerToAttack();
      if (playerToAttack != null && EntityHelper.getInWater(playerToAttack)) {
        a = worldObj.getPathToEntity(this, playerToAttack, f);
      }
    } else if (!playerToAttack.isEntityAlive() || !EntityHelper.getInWater(playerToAttack)) {
      playerToAttack = null;
    } else {
      float f1 = playerToAttack.getDistanceToEntity(this);
      if (canEntityBeSeen(playerToAttack)) {
        attackEntity(playerToAttack, f1);
      }
    }
    if (!hasAttacked
        && playerToAttack != null
        && EntityHelper.getInWater(playerToAttack)
        && (a == null || rand.nextInt(20) == 0)) {
      a = worldObj.getPathToEntity(this, playerToAttack, f);
    } else if (a == null && rand.nextInt(80) == 0 || rand.nextInt(80) == 0) {
      boolean flag = false;
      int j = -1;
      int k = -1;
      int l = -1;
      float f2 = -99999F;
      for (int i1 = 0; i1 < 10; i1++) {
        int j1 = MathHelper.floor_double((posX + (double) rand.nextInt(13)) - 6D);
        int k1 = MathHelper.floor_double((posY + (double) rand.nextInt(7)) - 3D);
        int l1 = MathHelper.floor_double((posZ + (double) rand.nextInt(13)) - 6D);
        float f3 = getBlockPathWeight(j1, k1, l1);
        if (f3 > f2) {
          f2 = f3;
          j = j1;
          k = k1;
          l = l1;
          flag = true;
        }
      }

      if (flag) {
        a = worldObj.getEntityPathToXYZ(this, j, k, l, 10F);
      }
    }
    int i = MathHelper.floor_double(boundingBox.minY);
    boolean flag1 = handleWaterMovement();
    boolean flag2 = handleLavaMovement();
    rotationPitch = 0.0F;
    if (a == null || rand.nextInt(100) == 0) {
      super.updatePlayerActionState();
      a = null;
      return;
    }
    Vec3D vec3d = a.getPosition(this);
    for (double d = width * 2.0F;
        vec3d != null && vec3d.squareDistanceTo(posX, vec3d.yCoord, posZ) < d * d; ) {
      a.incrementPathIndex();
      if (a.isFinished()) {
        vec3d = null;
        a = null;
      } else {
        vec3d = a.getPosition(this);
      }
    }

    isJumping = false;
    if (vec3d != null) {
      double d1 = vec3d.xCoord - posX;
      double d2 = vec3d.zCoord - posZ;
      double d3 = vec3d.yCoord - (double) i;
      float f4 = (float) ((Math.atan2(d2, d1) * 180D) / 3.1415927410125728D) - 90F;
      float f5 = f4 - rotationYaw;
      moveForward = moveSpeed;
      for (; f5 < -180F; f5 += 360F) {}
      for (; f5 >= 180F; f5 -= 360F) {}
      if (f5 > 30F) {
        f5 = 30F;
      }
      if (f5 < -30F) {
        f5 = -30F;
      }
      rotationYaw += f5;
      if (hasAttacked && playerToAttack != null) {
        double d4 = playerToAttack.posX - posX;
        double d5 = playerToAttack.posZ - posZ;
        float f6 = rotationYaw;
        rotationYaw = (float) ((Math.atan2(d5, d4) * 180D) / 3.1415927410125728D) - 90F;
        float f7 = (((f6 - rotationYaw) + 90F) * 3.141593F) / 180F;
        moveStrafing = -MathHelper.sin(f7) * moveForward * 1.0F;
        moveForward = MathHelper.cos(f7) * moveForward * 1.0F;
      }
      if (d3 > 0.0D && playerToAttack != null && EntityHelper.getInWater(playerToAttack)) {
        isJumping = true;
      }
    }
    if (playerToAttack != null) {
      faceEntity(playerToAttack, 30F, 30F);
    }
    if (isCollidedHorizontally) {
      isJumping = true;
    }
    if (rand.nextFloat() < 0.8F && (flag1 || flag2)) {
      isJumping = true;
    }
  }