public boolean canSpawn(World world, int x, int y, int z) {

    if (world.getActualHeight() <= 200) {
      return true;
    }
    return false;
  }
  // Adapted from BCs oilspout gen code
  @Override
  public boolean generate(World world, Random random, int x, int y, int z) {
    // Find ground level
    int groundLevel = this.getTopBlock(world, x, z);
    if (groundLevel < 5) {
      return false;
    }

    int wellX = x;
    int wellZ = z;
    int wellHeight = 6 + random.nextInt(3);
    int maxHeight = groundLevel + wellHeight;
    if (maxHeight >= (world.getActualHeight() - 1)) {
      return false;
    }

    new WorldGenLakes(this.block).generate(world, random, x, y, z);

    int wellY = 50 + random.nextInt(10);

    for (int i = wellY + 1; i <= maxHeight; ++i) {
      world.setBlock(wellX, i, wellZ, this.block, 0, 3);
    }
    for (int i = wellY; i <= (maxHeight - (wellHeight / 2)); ++i) {
      world.setBlock(wellX + 1, i, wellZ, this.block, 0, 3);
      world.setBlock(wellX - 1, i, wellZ, this.block, 0, 3);
      world.setBlock(wellX, i, wellZ + 1, this.block, 0, 3);
      world.setBlock(wellX, i, wellZ - 1, this.block, 0, 3);
    }
    return true;
  }
  @Override
  public boolean onBlockActivated(
      World world,
      int x,
      int y,
      int z,
      EntityPlayer player,
      int side,
      float xOffset,
      float yOffset,
      float zOffset) {

    ItemStack ci = player.inventory.mainInventory[player.inventory.currentItem];
    if (ci != null && Block.getBlockFromItem(ci.getItem()).equals(this)) {
      for (int i = y + 1, e = world.getActualHeight(); i < e; ++i) {
        Block block = world.getBlock(x, i, z);
        if (block.isAir(world, x, i, z) || block.isReplaceable(world, x, i, z)) {
          if (!world.isRemote && world.setBlock(x, i, z, this, 0, 3)) {
            world.playAuxSFXAtEntity(null, 2001, x, i, z, Block.getIdFromBlock(this));
            if (!player.capabilities.isCreativeMode) {
              ci.stackSize--;
              if (ci.stackSize == 0) {
                player.inventory.mainInventory[player.inventory.currentItem] = null;
              }
            }
          }
          return true;
        } else if (!block.equals(this)) {
          return false;
        }
      }
    }
    return false;
  }
  @Override
  public void trigger(World world, int x, int y, int z, EntityPlayer player) {
    int xChange = ((world.rand.nextInt(50) + 20) + x) - 35;
    int zChange = ((world.rand.nextInt(50) + 20) + z) - 35;

    int yChange = -1;

    for (int yy = 0; yy <= world.getActualHeight(); yy++) {
      if (world.getBlock(xChange, yy, zChange).isAir(world, xChange, yy, zChange)
          && world.getBlock(xChange, yy + 1, zChange).isAir(world, xChange, yy + 1, zChange)) {
        yChange = yy;
        break;
      }
    }
    if (yChange == -1) return;

    player.setPositionAndUpdate(xChange, yChange, zChange);
  }
  @Override
  public boolean generate(World world, Random rand, int x, int retries, int z) {
    for (int c = 0; c < retries; c++) {
      int y = world.getActualHeight() - 1;
      Block block = Block.blocksList[world.getBlockId(x, y, z)];
      while ((block == null || block.isAirBlock(world, x, y, z)) && y > 0) {
        y--;
      }

      if (!growTree(world, rand, x, y + 1, z)) {
        retries--;
      }

      x += rand.nextInt(16) - 8;
      z += rand.nextInt(16) - 8;
    }

    return true;
  }
  @Override
  public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {

    if (!canBlockStay(world, x, y, z)) {
      for (int e = world.getActualHeight(); y < e; ++y) {
        block = world.getBlock(x, y, z);
        if (!block.equals(this)) break;
        dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
        world.setBlock(x, y, z, Blocks.air, 0, 2);
        for (ForgeDirection d : _attachDirections) {
          BlockPosition bp = new BlockPosition(x, y, z, d);
          for (int i = 0; i < _attachDistance; i++) {
            bp.moveForwards(1);
            block = world.getBlock(bp.x, bp.y, bp.z);
            if (block.equals(this)) {
              world.func_147446_b(bp.x, bp.y, bp.z, block, 0, 0);
            } else break;
          }
        }
      }
    }
  }
 public static int getFirstNonAirBlockFromTop(World world, int x, int z) {
   int y;
   for (y = world.getActualHeight(); world.isAirBlock(x, y - 1, z) && y > 0; y--) {}
   return y;
 }