private BlockPosition getNextTreeSegment(BlockPosition pos) {
    Block block;

    if (_treeManager.getIsDone() || !_treeManager.getOrigin().equals(pos)) {
      int lowerBound = 0;
      int upperBound = MFRConfig.fruitTreeSearchMaxVertical.getInt();

      Area a =
          new Area(
              pos.copy(), MFRConfig.fruitTreeSearchMaxHorizontal.getInt(), lowerBound, upperBound);

      _treeManager.reset(worldObj, a, HarvestMode.FruitTree, null);
    }

    Map<Block, IFactoryFruit> fruits = MFRRegistry.getFruits();
    while (!_treeManager.getIsDone()) {
      BlockPosition bp = _treeManager.getNextBlock();
      block = worldObj.getBlock(bp.x, bp.y, bp.z);
      IFactoryFruit fruit = fruits.containsKey(block) ? fruits.get(block) : null;

      if (fruit != null && fruit.canBePicked(worldObj, bp.x, bp.y, bp.z)) return bp;

      _treeManager.moveNext();
    }
    return null;
  }
  private BlockPosition getNextTree() {
    BlockPosition bp = _areaManager.getNextBlock();
    if (!worldObj.blockExists(bp.x, bp.y, bp.z)) {
      return null;
    }

    Block search = worldObj.getBlock(bp.x, bp.y, bp.z);

    if (!MFRRegistry.getFruitLogBlocks().contains(search)) {
      IFactoryFruit f = MFRRegistry.getFruits().get(search);
      return f != null && f.canBePicked(worldObj, bp.x, bp.y, bp.z) ? bp : null;
    }

    BlockPosition temp = getNextTreeSegment(bp);
    if (temp != null) _areaManager.rewindBlock();

    return temp;
  }