public void addBlocks() {
   dusts.addAll(oresToBlocks(OreDictionary.getOres("oreSaltpeter")));
   if (!OreDictionary.getOres("oreSulfur").isEmpty())
     dusts.addAll(oresToBlocks(OreDictionary.getOres("oreSulfur")));
   dusts.addAll(oresToBlocks(OreDictionary.getOres("oreLapis")));
   dusts.addAll(oresToBlocks(OreDictionary.getOres("oreRedstone")));
   dusts.addAll(oresToBlocks(OreDictionary.getOres("oreCoal")));
   dusts.addAll(oresToBlocks(OreDictionary.getOres("oreCoralium")));
   metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreIron")));
   metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreGold")));
   metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreAbyssalnite")));
   metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreDreadedAbyssalnite")));
   metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreCopper")));
   metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreTin")));
   if (!OreDictionary.getOres("oreAluminum").isEmpty())
     metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreAluminum")));
   if (!OreDictionary.getOres("oreAluminium").isEmpty())
     metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreAluminium")));
   if (!OreDictionary.getOres("oreBrass").isEmpty())
     metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreBrass")));
   if (!OreDictionary.getOres("oreSilver").isEmpty())
     metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreSilver")));
   if (!OreDictionary.getOres("oreZinc").isEmpty())
     metalloids.addAll(oresToBlocks(OreDictionary.getOres("oreZinc")));
   gems.addAll(oresToBlocks(OreDictionary.getOres("oreDiamond")));
   gems.addAll(oresToBlocks(OreDictionary.getOres("oreEmerald")));
   gems.addAll(oresToBlocks(OreDictionary.getOres("oreQuartz")));
   if (!OreDictionary.getOres("oreSapphire").isEmpty())
     gems.addAll(oresToBlocks(OreDictionary.getOres("oreSapphire")));
   if (!OreDictionary.getOres("oreRuby").isEmpty())
     gems.addAll(oresToBlocks(OreDictionary.getOres("oreRuby")));
   gems.addAll(oresToBlocks(OreDictionary.getOres("oreCoraliumStone")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stone")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stoneGranite")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stoneGranitePolished")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stoneDiorite")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stoneDioritePolished")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stoneAndesite")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("stoneAndesitePolished")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("sandstone")));
   stones.addAll(oresToBlocks(OreDictionary.getOres("cobblestone")));
   stones.add(Blocks.MOSSY_COBBLESTONE.getDefaultState());
   stones.add(Blocks.NETHERRACK.getDefaultState());
   stones.add(Blocks.END_STONE.getDefaultState());
   stones.add(ACBlocks.darkstone.getDefaultState());
   stones.add(ACBlocks.abyssalnite_stone.getDefaultState());
   stones.add(ACBlocks.dreadstone.getDefaultState());
   stones.add(ACBlocks.darkstone_cobblestone.getDefaultState());
   bricks.add(Blocks.STONEBRICK.getStateFromMeta(0));
   bricks.add(Blocks.STONEBRICK.getStateFromMeta(1));
   bricks.add(Blocks.STONEBRICK.getStateFromMeta(2));
   bricks.add(Blocks.STONEBRICK.getStateFromMeta(3));
   bricks.add(Blocks.NETHER_BRICK.getDefaultState());
   bricks.add(ACBlocks.darkstone_brick.getDefaultState());
   bricks.add(ACBlocks.abyssalnite_stone_brick.getDefaultState());
   bricks.add(ACBlocks.dreadstone_brick.getDefaultState());
   metals.add(ACBlocks.abyssal_iron_ore.getDefaultState());
   metals.add(ACBlocks.abyssal_gold_ore.getDefaultState());
   metals.add(ACBlocks.abyssal_copper_ore.getDefaultState());
   metals.add(ACBlocks.abyssal_tin_ore.getDefaultState());
   metals.add(ACBlocks.liquified_coralium_ore.getDefaultState());
 }
  @Override
  public boolean generate(World world, Random rand, BlockPos pos) {
    int i1 = rand.nextInt(2) + 2;
    int j1 = -i1 - 1;
    int k1 = i1 + 1;
    int i2 = rand.nextInt(2) + 2;
    int j2 = -i2 - 1;
    int k2 = i2 + 1;
    int count = 0;

    for (int x = j1; x <= k1; ++x) {
      for (int y = -1; y <= 4; ++y) {
        for (int z = j2; z <= k2; ++z) {
          BlockPos blockpos = pos.add(x, y, z);
          Material material = world.getBlockState(blockpos).getMaterial();
          boolean flag = material.isSolid();

          if (y == -1 && !flag) {
            return false;
          }

          if (y == 4 && !flag) {
            return false;
          }

          if ((x == j1 || x == k1 || z == j2 || z == k2)
              && y == 0
              && world.isAirBlock(blockpos)
              && world.isAirBlock(blockpos.up())) {
            ++count;
          }
        }
      }
    }

    if (count >= 1 && count <= 5) {
      int type = rand.nextInt(2);
      IBlockState state1;
      IBlockState state2;

      switch (type) {
        case 1:
          state1 = Blocks.STONEBRICK.getDefaultState();
          state2 =
              Blocks.STONEBRICK
                  .getDefaultState()
                  .withProperty(BlockStoneBrick.VARIANT, BlockStoneBrick.EnumType.MOSSY);
        default:
          state1 = Blocks.COBBLESTONE.getDefaultState();
          state2 = Blocks.MOSSY_COBBLESTONE.getDefaultState();
      }

      for (int x = j1; x <= k1; ++x) {
        for (int y = 3; y >= -1; --y) {
          for (int z = j2; z <= k2; ++z) {
            BlockPos blockpos = pos.add(x, y, z);

            if (x != j1 && y != -1 && z != j2 && x != k1 && y != 4 && z != k2) {
              if (world.getBlockState(blockpos).getBlock() != Blocks.CHEST) {
                world.setBlockToAir(blockpos);
              }
            } else if (blockpos.getY() >= 0
                && !world.getBlockState(blockpos.down()).getMaterial().isSolid()) {
              world.setBlockToAir(blockpos);
            } else if (world.getBlockState(blockpos).getMaterial().isSolid()
                && world.getBlockState(blockpos).getBlock() != Blocks.CHEST) {
              if (y == -1 && rand.nextInt(4) != 0) {
                world.setBlockState(blockpos, state2, 2);
              } else {
                world.setBlockState(blockpos, state1, 2);
              }
            }
          }
        }
      }

      for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
          int x = pos.getX() + rand.nextInt(i1 * 2 + 1) - i1;
          int y = pos.getY();
          int z = pos.getZ() + rand.nextInt(i2 * 2 + 1) - i2;
          BlockPos blockpos = new BlockPos(x, y, z);

          if (world.isAirBlock(blockpos)) {
            count = 0;

            for (EnumFacing face : EnumFacing.Plane.HORIZONTAL) {
              if (world.getBlockState(blockpos.offset(face)).getMaterial().isSolid()) {
                ++count;
              }
            }

            if (count == 1) {
              world.setBlockState(
                  blockpos,
                  Blocks.CHEST.correctFacing(world, blockpos, Blocks.CHEST.getDefaultState()),
                  2);

              TileEntity tile = world.getTileEntity(blockpos);

              if (tile != null && tile instanceof TileEntityChest) {
                ((TileEntityChest) tile)
                    .setLootTable(LootTableList.CHESTS_SIMPLE_DUNGEON, rand.nextLong());
              }

              break;
            }
          }
        }
      }

      world.setBlockState(pos, Blocks.MOB_SPAWNER.getDefaultState(), 2);

      TileEntity tile = world.getTileEntity(pos);

      if (tile != null && tile instanceof TileEntityMobSpawner) {
        ((TileEntityMobSpawner) tile).getSpawnerBaseLogic().setEntityName(pickMobSpawner(rand));
      } else {
        CaveLog.warning(
            "Failed to fetch mob spawner entity at ("
                + pos.getX()
                + ", "
                + pos.getY()
                + ", "
                + pos.getZ()
                + ")");
      }

      return true;
    }

    return false;
  }