protected void dig() {

    powerProvider.configure(20, 30, 200, 50, MAX_ENERGY);
    if (powerProvider.useEnergy(30, 30, true) != 30) {
      return;
    }

    if (!findTarget(true)) {

      // I believe the issue is box going null becuase of bad chunkloader positioning
      if (arm != null && box != null)
        arm.setTarget(
            (double) box.xMin + (box.xMax - box.xMin) / 2D,
            yCoord + 2D,
            (double) box.zMin + (box.zMax - box.zMin) / 2D);

      isDigging = false;
    }

    inProcess = true;
  }
  public boolean findTarget(boolean doSet) {

    if (worldObj.isRemote) return false;

    boolean[][] blockedColumns =
        new boolean[bluePrintBuilder.bluePrint.sizeX - 2][bluePrintBuilder.bluePrint.sizeZ - 2];

    //		for (int searchX = 0; searchX < bluePrintBuilder.bluePrint.sizeX - 2; ++searchX) {
    //			for (int searchZ = 0; searchZ < bluePrintBuilder.bluePrint.sizeZ - 2; ++searchZ) {
    //				blockedColumns[searchX][searchZ] = false;
    //			}
    //		}
    //
    for (int searchY = yCoord + 3; searchY >= 0; --searchY) {
      int startX, endX, incX;

      if (searchY % 2 == 0) {
        startX = 0;
        endX = bluePrintBuilder.bluePrint.sizeX - 2;
        incX = 1;
      } else {
        startX = bluePrintBuilder.bluePrint.sizeX - 3;
        endX = -1;
        incX = -1;
      }

      for (int searchX = startX; searchX != endX; searchX += incX) {
        int startZ, endZ, incZ;

        if (searchX % 2 == searchY % 2) {
          startZ = 0;
          endZ = bluePrintBuilder.bluePrint.sizeZ - 2;
          incZ = 1;
        } else {
          startZ = bluePrintBuilder.bluePrint.sizeZ - 3;
          endZ = -1;
          incZ = -1;
        }

        for (int searchZ = startZ; searchZ != endZ; searchZ += incZ) {
          if (!blockedColumns[searchX][searchZ]) {
            int bx = box.xMin + searchX + 1, by = searchY, bz = box.zMin + searchZ + 1;

            int blockId = worldObj.getBlockId(bx, by, bz);

            if (isUnquarriableBlock(blockId, bx, by, bz)) {
              blockedColumns[searchX][searchZ] = true;
            } else if (isQuarriableBlock(blockId, bx, by + 1, bz)) {
              if (doSet && arm != null) {
                arm.setTarget(bx, by + 1, bz);
              }

              return true;
            }
          }
        }
      }
    }

    return false;
  }