@Override
  public void generate(
      Random random,
      int chunkX,
      int chunkZ,
      World world,
      IChunkProvider chunkGenerator,
      IChunkProvider chunkProvider) {

    chunkX *= 16;
    chunkZ *= 16;

    if (!skipPlants && this.generateIn(world, false)) {

      for (int i = 0; i < TieredPlants.list.length; i++) {
        TieredPlants p = TieredPlants.list[i];
        boolean flag = false;
        if (random.nextInt(p.getGenerationChance()) == 0) {
          int n = p.getGenerationCount();
          for (int k = 0; k < n; k++) {
            int posX = chunkX + random.nextInt(16);
            int posZ = chunkZ + random.nextInt(16);
            Coordinate c = p.generate(world, posX, posZ, random);
            if (c != null) {
              c.setBlock(world, p.getBlock(), p.ordinal());
            }
          }
        }
      }
    }

    if (!skipOres && this.generateIn(world, true)) {
      for (int i = 0; i < TieredOres.list.length; i++) {
        TieredOres p = TieredOres.list[i];
        boolean flag = false;
        if (random.nextInt(p.getGenerationChance()) == 0) {
          int n = p.getGenerationCount();
          for (int k = 0; k < n; k++) {
            int posX = chunkX + random.nextInt(16);
            int posZ = chunkZ + random.nextInt(16);
            flag |= p.generate(world, posX, posZ, random);
          }
        }
      }
    }

    skipOres = false;
    skipPlants = false;
  }
 @SideOnly(Side.CLIENT)
 private static void registerTexture(TieredOres t, WandCap cap) {
   cap.setTexture(
       DirectResourceManager.getResource(
           "Reika/ChromatiCraft/Textures/Wands/cap_"
               + t.name().toLowerCase(Locale.ENGLISH)
               + ".png"));
 }
  public static void addRecipes() {
    int i = -2;
    String ref =
        FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT
            ? ChromaDescriptions.getParentPage() + "thaum.xml"
            : "";
    for (TieredOres t : items.keySet()) {
      WandType wt = items.get(t);
      AspectList al = new AspectList();
      int n = t == TieredOres.FOCAL ? 2 : 1;
      al.add(Aspect.ORDER, 20 * n);
      Aspect a = wt.aspects.get(0);
      al.add(a, 50 * n);
      Object[] recipe = {"AAA", "A A", 'A', wt.raw};
      ShapedArcaneRecipe ir = ThaumcraftApi.addArcaneCraftingRecipe("", wt.item, al, recipe);
      String id = "CAP_TIEREDCAP_" + t.name();
      String desc = "Novel caps";

      MathExpression cost =
          new MathExpression() {
            @Override
            public double evaluate(double arg) throws ArithmeticException {
              return arg / 5D;
            }

            @Override
            public double getBaseValue() {
              return 0;
            }

            @Override
            public String toString() {
              return "/5";
            }
          };

      ReikaThaumHelper.addArcaneRecipeBookEntryViaXML(
          id, desc, "chromaticraft", ir, cost, 2, i, ChromatiCraft.class, ref);
      i++;
    }
  }
 private TieredOreCap(TieredOres t) {
   super("TIEREDCAP_" + t.name(), 0.8F, items.get(t).aspects, 0.5F, items.get(t).item, 10);
 }