@Override
  public boolean iteratePattern(TileEntity tile, IBox box, ItemStack stackToPlace) {
    int xMin = (int) box.pMin().x;
    int yMin = (int) box.pMin().y;
    int zMin = (int) box.pMin().z;

    int xMax = (int) box.pMax().x;
    int zMax = (int) box.pMax().z;

    int sizeX = xMax - xMin + 1;
    int sizeZ = zMax - zMin + 1;

    boolean[][] blockedColumns = new boolean[sizeX][sizeZ];

    for (int i = 0; i < blockedColumns.length; ++i) {
      for (int j = 0; j < blockedColumns[0].length; ++j) {
        blockedColumns[i][j] = false;
      }
    }

    boolean found = false;
    int lastX = Integer.MAX_VALUE, lastY = Integer.MAX_VALUE, lastZ = Integer.MAX_VALUE;

    for (int y = yMin - 1; y >= 0; --y) {
      found = false;
      for (int x = xMin; x <= xMax; ++x) {
        for (int z = zMin; z <= zMax; ++z) {
          if (!BlockUtil.canChangeBlock(tile.worldObj, x, y, z)) {
            return true;
          }
          if (!blockedColumns[x - xMin][z - zMin]) {
            if (!BlockUtil.isSoftBlock(tile.worldObj, x, y, z)) {
              blockedColumns[x - xMin][z - zMin] = true;
            } else {
              found = true;
              lastX = x;
              lastY = y;
              lastZ = z;
            }
          }
        }
      }

      if (!found) {
        break;
      }
    }

    if (lastX != Integer.MAX_VALUE && stackToPlace != null) {
      stackToPlace
          .getItem()
          .onItemUse(
              stackToPlace,
              CoreProxy.proxy.getBuildCraftPlayer(tile.worldObj),
              tile.worldObj,
              lastX,
              lastY - 1,
              lastZ,
              1,
              0.0f,
              0.0f,
              0.0f);
    }

    if (lastX != Integer.MAX_VALUE) {
      return false;
    }

    return !empty(xMin, yMin, zMin, xMax, 64 * 2, zMax, tile.worldObj);
  }
 private void destroyPipe() {
   BlockUtil.explodeBlock(
       container.worldObj, container.xCoord, container.yCoord, container.zCoord);
   container.worldObj.setBlockToAir(container.xCoord, container.yCoord, container.zCoord);
 }