private CachedShapelessRecipe shapelessRecipe(ShapelessRecipes recipe) {
    if (recipe.recipeItems == null) // because some mod subclasses actually do this
    {
      return null;
    }

    return new CachedShapelessRecipe(recipe.recipeItems, recipe.getRecipeOutput());
  }
Example #2
0
  public static void removeShapelessRecipe(ItemStack resultItem) {
    List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();
    for (int i = 0; i < recipes.size(); i++) {
      IRecipe tmpRecipe = recipes.get(i);
      if (tmpRecipe instanceof ShapelessRecipes) {
        ShapelessRecipes recipe = (ShapelessRecipes) tmpRecipe;
        ItemStack recipeResult = recipe.getRecipeOutput();

        if (ItemStack.areItemStacksEqual(resultItem, recipeResult)) {
          recipes.remove(i--);
        }
      }
    }
  }
  @SuppressWarnings("unchecked")
  public static void initVanillaEntries() {
    if (!hasInit) {
      registerOre("logWood", new ItemStack(Blocks.log, 1, WILDCARD_VALUE));
      registerOre("logWood", new ItemStack(Blocks.log2, 1, WILDCARD_VALUE));
      registerOre("plankWood", new ItemStack(Blocks.planks, 1, WILDCARD_VALUE));
      registerOre("slabWood", new ItemStack(Blocks.wooden_slab, 1, WILDCARD_VALUE));
      registerOre("stairWood", Blocks.oak_stairs);
      registerOre("stairWood", Blocks.spruce_stairs);
      registerOre("stairWood", Blocks.birch_stairs);
      registerOre("stairWood", Blocks.jungle_stairs);
      registerOre("stairWood", Blocks.acacia_stairs);
      registerOre("stairWood", Blocks.dark_oak_stairs);
      registerOre("stickWood", Items.stick);
      registerOre("treeSapling", new ItemStack(Blocks.sapling, 1, WILDCARD_VALUE));
      registerOre("treeLeaves", new ItemStack(Blocks.leaves, 1, WILDCARD_VALUE));
      registerOre("treeLeaves", new ItemStack(Blocks.leaves2, 1, WILDCARD_VALUE));
      registerOre("oreGold", Blocks.gold_ore);
      registerOre("oreIron", Blocks.iron_ore);
      registerOre("oreLapis", Blocks.lapis_ore);
      registerOre("oreDiamond", Blocks.diamond_ore);
      registerOre("oreRedstone", Blocks.redstone_ore);
      registerOre("oreEmerald", Blocks.emerald_ore);
      registerOre("oreQuartz", Blocks.quartz_ore);
      registerOre("oreCoal", Blocks.coal_ore);
      registerOre("blockGold", Blocks.gold_block);
      registerOre("blockIron", Blocks.iron_block);
      registerOre("blockLapis", Blocks.lapis_block);
      registerOre("blockDiamond", Blocks.diamond_block);
      registerOre("blockRedstone", Blocks.redstone_block);
      registerOre("blockEmerald", Blocks.emerald_block);
      registerOre("blockQuartz", Blocks.quartz_block);
      registerOre("blockCoal", Blocks.coal_block);
      registerOre("blockGlassColorless", Blocks.glass);
      registerOre("blockGlass", Blocks.glass);
      registerOre("blockGlass", new ItemStack(Blocks.stained_glass, 1, WILDCARD_VALUE));
      // blockGlass{Color} is added below with dyes
      registerOre("paneGlassColorless", Blocks.glass_pane);
      registerOre("paneGlass", Blocks.glass_pane);
      registerOre("paneGlass", new ItemStack(Blocks.stained_glass_pane, 1, WILDCARD_VALUE));
      // paneGlass{Color} is added below with dyes
      registerOre("ingotIron", Items.iron_ingot);
      registerOre("ingotGold", Items.gold_ingot);
      registerOre("ingotBrick", Items.brick);
      registerOre("ingotBrickNether", Items.netherbrick);
      registerOre("nuggetGold", Items.gold_nugget);
      registerOre("gemDiamond", Items.diamond);
      registerOre("gemEmerald", Items.emerald);
      registerOre("gemQuartz", Items.quartz);
      registerOre("dustRedstone", Items.redstone);
      registerOre("dustGlowstone", Items.glowstone_dust);
      registerOre("gemLapis", new ItemStack(Items.dye, 1, 4));
      registerOre("slimeball", Items.slime_ball);
      registerOre("glowstone", Blocks.glowstone);
      registerOre("cropWheat", Items.wheat);
      registerOre("cropPotato", Items.potato);
      registerOre("cropCarrot", Items.carrot);
      registerOre("stone", Blocks.stone);
      registerOre("cobblestone", Blocks.cobblestone);
      registerOre("sandstone", new ItemStack(Blocks.sandstone, 1, WILDCARD_VALUE));
      registerOre("sand", new ItemStack(Blocks.sand, 1, WILDCARD_VALUE));
      registerOre("dye", new ItemStack(Items.dye, 1, WILDCARD_VALUE));
      registerOre("record", Items.record_13);
      registerOre("record", Items.record_cat);
      registerOre("record", Items.record_blocks);
      registerOre("record", Items.record_chirp);
      registerOre("record", Items.record_far);
      registerOre("record", Items.record_mall);
      registerOre("record", Items.record_mellohi);
      registerOre("record", Items.record_stal);
      registerOre("record", Items.record_strad);
      registerOre("record", Items.record_ward);
      registerOre("record", Items.record_11);
      registerOre("record", Items.record_wait);
      registerOre("chest", Blocks.chest);
      registerOre("chest", Blocks.ender_chest);
      registerOre("chest", Blocks.trapped_chest);
      registerOre("chestWood", Blocks.chest);
      registerOre("chestEnder", Blocks.ender_chest);
      registerOre("chestTrapped", Blocks.trapped_chest);
    }

    // Build our list of items to replace with ore tags
    Map<ItemStack, String> replacements = new HashMap<ItemStack, String>();
    replacements.put(new ItemStack(Items.stick), "stickWood");
    replacements.put(new ItemStack(Blocks.planks), "plankWood");
    replacements.put(new ItemStack(Blocks.planks, 1, WILDCARD_VALUE), "plankWood");
    replacements.put(new ItemStack(Blocks.wooden_slab, 1, WILDCARD_VALUE), "slabWood");
    replacements.put(new ItemStack(Blocks.stone), "stone");
    // replacements.put(new ItemStack(Blocks.stone, 1, WILDCARD_VALUE), "stone");
    replacements.put(new ItemStack(Blocks.cobblestone), "cobblestone");
    replacements.put(new ItemStack(Blocks.cobblestone, 1, WILDCARD_VALUE), "cobblestone");
    replacements.put(new ItemStack(Items.gold_ingot), "ingotGold");
    replacements.put(new ItemStack(Items.iron_ingot), "ingotIron");
    replacements.put(new ItemStack(Items.diamond), "gemDiamond");
    replacements.put(new ItemStack(Items.emerald), "gemEmerald");
    replacements.put(new ItemStack(Items.redstone), "dustRedstone");
    replacements.put(new ItemStack(Items.glowstone_dust), "dustGlowstone");
    replacements.put(new ItemStack(Blocks.glowstone), "glowstone");
    replacements.put(new ItemStack(Items.slime_ball), "slimeball");
    replacements.put(new ItemStack(Blocks.glass), "blockGlassColorless");
    replacements.put(new ItemStack(Blocks.chest), "chestWood");
    replacements.put(new ItemStack(Blocks.ender_chest), "chestEnder");
    replacements.put(new ItemStack(Blocks.trapped_chest), "chestTrapped");

    // Register dyes
    String[] dyes = {
      "Black",
      "Red",
      "Green",
      "Brown",
      "Blue",
      "Purple",
      "Cyan",
      "LightGray",
      "Gray",
      "Pink",
      "Lime",
      "Yellow",
      "LightBlue",
      "Magenta",
      "Orange",
      "White"
    };

    for (int i = 0; i < 16; i++) {
      ItemStack dye = new ItemStack(Items.dye, 1, i);
      ItemStack block = new ItemStack(Blocks.stained_glass, 1, 15 - i);
      ItemStack pane = new ItemStack(Blocks.stained_glass_pane, 1, 15 - i);
      if (!hasInit) {
        registerOre("dye" + dyes[i], dye);
        registerOre("blockGlass" + dyes[i], block);
        registerOre("paneGlass" + dyes[i], pane);
      }
      replacements.put(dye, "dye" + dyes[i]);
      replacements.put(block, "blockGlass" + dyes[i]);
      replacements.put(pane, "paneGlass" + dyes[i]);
    }
    hasInit = true;

    ItemStack[] replaceStacks =
        replacements.keySet().toArray(new ItemStack[replacements.keySet().size()]);

    // Ignore recipes for the following items
    ItemStack[] exclusions =
        new ItemStack[] {
          new ItemStack(Blocks.lapis_block),
          new ItemStack(Items.cookie),
          new ItemStack(Blocks.stonebrick),
          new ItemStack(Blocks.stone_slab, 1, WILDCARD_VALUE),
          new ItemStack(Blocks.stone_stairs),
          new ItemStack(Blocks.cobblestone_wall),
          new ItemStack(Blocks.oak_fence),
          new ItemStack(Blocks.oak_fence_gate),
          new ItemStack(Blocks.oak_stairs),
          new ItemStack(Blocks.spruce_fence),
          new ItemStack(Blocks.spruce_fence_gate),
          new ItemStack(Blocks.spruce_stairs),
          new ItemStack(Blocks.birch_fence),
          new ItemStack(Blocks.birch_fence_gate),
          new ItemStack(Blocks.birch_stairs),
          new ItemStack(Blocks.jungle_fence),
          new ItemStack(Blocks.jungle_fence_gate),
          new ItemStack(Blocks.jungle_stairs),
          new ItemStack(Blocks.acacia_fence),
          new ItemStack(Blocks.acacia_fence_gate),
          new ItemStack(Blocks.acacia_stairs),
          new ItemStack(Blocks.dark_oak_fence),
          new ItemStack(Blocks.dark_oak_fence_gate),
          new ItemStack(Blocks.dark_oak_stairs),
          new ItemStack(Blocks.wooden_slab),
          new ItemStack(Blocks.glass_pane),
          null // So the above can have a comma and we don't have to keep editing extra lines.
        };

    List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();
    List<IRecipe> recipesToRemove = new ArrayList<IRecipe>();
    List<IRecipe> recipesToAdd = new ArrayList<IRecipe>();

    // Search vanilla recipes for recipes to replace
    for (Object obj : recipes) {
      if (obj instanceof ShapedRecipes) {
        ShapedRecipes recipe = (ShapedRecipes) obj;
        ItemStack output = recipe.getRecipeOutput();
        if (output != null && containsMatch(false, exclusions, output)) {
          continue;
        }

        if (containsMatch(true, recipe.recipeItems, replaceStacks)) {
          recipesToRemove.add(recipe);
          recipesToAdd.add(new ShapedOreRecipe(recipe, replacements));
        }
      } else if (obj instanceof ShapelessRecipes) {
        ShapelessRecipes recipe = (ShapelessRecipes) obj;
        ItemStack output = recipe.getRecipeOutput();
        if (output != null && containsMatch(false, exclusions, output)) {
          continue;
        }

        if (containsMatch(
            true,
            (ItemStack[]) recipe.recipeItems.toArray(new ItemStack[recipe.recipeItems.size()]),
            replaceStacks)) {
          recipesToRemove.add((IRecipe) obj);
          IRecipe newRecipe = new ShapelessOreRecipe(recipe, replacements);
          recipesToAdd.add(newRecipe);
        }
      }
    }

    recipes.removeAll(recipesToRemove);
    recipes.addAll(recipesToAdd);
    if (recipesToRemove.size() > 0) {
      FMLLog.info("Replaced %d ore recipies", recipesToRemove.size());
    }
  }
Example #4
0
 public BukkitRecipe(ShapelessRecipes shapeless) {
   this.result = new CraftItemStack(shapeless.getRecipeOutput());
 }
  private static void initVanillaEntries() {
    if (!hasInit) {
      // tree- and wood-related things
      registerOre("logWood", new ItemStack(Blocks.log, 1, WILDCARD_VALUE));
      registerOre("logWood", new ItemStack(Blocks.log2, 1, WILDCARD_VALUE));
      registerOre("plankWood", new ItemStack(Blocks.planks, 1, WILDCARD_VALUE));
      registerOre("slabWood", new ItemStack(Blocks.wooden_slab, 1, WILDCARD_VALUE));
      registerOre("stairWood", Blocks.oak_stairs);
      registerOre("stairWood", Blocks.spruce_stairs);
      registerOre("stairWood", Blocks.birch_stairs);
      registerOre("stairWood", Blocks.jungle_stairs);
      registerOre("stairWood", Blocks.acacia_stairs);
      registerOre("stairWood", Blocks.dark_oak_stairs);
      registerOre("stickWood", Items.stick);
      registerOre("treeSapling", new ItemStack(Blocks.sapling, 1, WILDCARD_VALUE));
      registerOre("treeLeaves", new ItemStack(Blocks.leaves, 1, WILDCARD_VALUE));
      registerOre("treeLeaves", new ItemStack(Blocks.leaves2, 1, WILDCARD_VALUE));
      registerOre("vine", Blocks.vine);

      // Ores
      registerOre("oreGold", Blocks.gold_ore);
      registerOre("oreIron", Blocks.iron_ore);
      registerOre("oreLapis", Blocks.lapis_ore);
      registerOre("oreDiamond", Blocks.diamond_ore);
      registerOre("oreRedstone", Blocks.redstone_ore);
      registerOre("oreEmerald", Blocks.emerald_ore);
      registerOre("oreQuartz", Blocks.quartz_ore);
      registerOre("oreCoal", Blocks.coal_ore);

      // ingots/nuggets
      registerOre("ingotIron", Items.iron_ingot);
      registerOre("ingotGold", Items.gold_ingot);
      registerOre("ingotBrick", Items.brick);
      registerOre("ingotBrickNether", Items.netherbrick);
      registerOre("nuggetGold", Items.gold_nugget);

      // gems and dusts
      registerOre("gemDiamond", Items.diamond);
      registerOre("gemEmerald", Items.emerald);
      registerOre("gemQuartz", Items.quartz);
      registerOre("gemPrismarine", Items.prismarine_shard);
      registerOre("dustPrismarine", Items.prismarine_crystals);
      registerOre("dustRedstone", Items.redstone);
      registerOre("dustGlowstone", Items.glowstone_dust);
      registerOre("gemLapis", new ItemStack(Items.dye, 1, 4));

      // storage blocks
      registerOre("blockGold", Blocks.gold_block);
      registerOre("blockIron", Blocks.iron_block);
      registerOre("blockLapis", Blocks.lapis_block);
      registerOre("blockDiamond", Blocks.diamond_block);
      registerOre("blockRedstone", Blocks.redstone_block);
      registerOre("blockEmerald", Blocks.emerald_block);
      registerOre("blockQuartz", Blocks.quartz_block);
      registerOre("blockCoal", Blocks.coal_block);

      // crops
      registerOre("cropWheat", Items.wheat);
      registerOre("cropPotato", Items.potato);
      registerOre("cropCarrot", Items.carrot);
      registerOre("cropNetherWart", Items.nether_wart);
      registerOre("sugarcane", Items.reeds);
      registerOre("blockCactus", Blocks.cactus);

      // misc materials
      registerOre("dye", new ItemStack(Items.dye, 1, WILDCARD_VALUE));
      registerOre("paper", new ItemStack(Items.paper));

      // mob drops
      registerOre("slimeball", Items.slime_ball);
      registerOre("enderpearl", Items.ender_pearl);
      registerOre("bone", Items.bone);
      registerOre("gunpowder", Items.gunpowder);
      registerOre("string", Items.string);
      registerOre("netherStar", Items.nether_star);
      registerOre("leather", Items.leather);
      registerOre("feather", Items.feather);
      registerOre("egg", Items.egg);

      // records
      registerOre("record", Items.record_13);
      registerOre("record", Items.record_cat);
      registerOre("record", Items.record_blocks);
      registerOre("record", Items.record_chirp);
      registerOre("record", Items.record_far);
      registerOre("record", Items.record_mall);
      registerOre("record", Items.record_mellohi);
      registerOre("record", Items.record_stal);
      registerOre("record", Items.record_strad);
      registerOre("record", Items.record_ward);
      registerOre("record", Items.record_11);
      registerOre("record", Items.record_wait);

      // blocks
      registerOre("dirt", Blocks.dirt);
      registerOre("grass", Blocks.grass);
      registerOre("stone", Blocks.stone);
      registerOre("cobblestone", Blocks.cobblestone);
      registerOre("gravel", Blocks.gravel);
      registerOre("sand", new ItemStack(Blocks.sand, 1, WILDCARD_VALUE));
      registerOre("sandstone", new ItemStack(Blocks.sandstone, 1, WILDCARD_VALUE));
      registerOre("sandstone", new ItemStack(Blocks.red_sandstone, 1, WILDCARD_VALUE));
      registerOre("netherrack", Blocks.netherrack);
      registerOre("obsidian", Blocks.obsidian);
      registerOre("glowstone", Blocks.glowstone);
      registerOre("endstone", Blocks.end_stone);
      registerOre("torch", Blocks.torch);
      registerOre("workbench", Blocks.crafting_table);
      registerOre("blockSlime", Blocks.slime_block);
      registerOre(
          "blockPrismarine",
          new ItemStack(Blocks.prismarine, 1, BlockPrismarine.EnumType.ROUGH.getMetadata()));
      registerOre(
          "blockPrismarineBrick",
          new ItemStack(Blocks.prismarine, 1, BlockPrismarine.EnumType.BRICKS.getMetadata()));
      registerOre(
          "blockPrismarineDark",
          new ItemStack(Blocks.prismarine, 1, BlockPrismarine.EnumType.DARK.getMetadata()));
      registerOre("stoneGranite", new ItemStack(Blocks.stone, 1, 1));
      registerOre("stoneGranitePolished", new ItemStack(Blocks.stone, 1, 2));
      registerOre("stoneDiorite", new ItemStack(Blocks.stone, 1, 3));
      registerOre("stoneDioritePolished", new ItemStack(Blocks.stone, 1, 4));
      registerOre("stoneAndesite", new ItemStack(Blocks.stone, 1, 5));
      registerOre("stoneAndesitePolished", new ItemStack(Blocks.stone, 1, 6));
      registerOre("blockGlassColorless", Blocks.glass);
      registerOre("blockGlass", Blocks.glass);
      registerOre("blockGlass", new ItemStack(Blocks.stained_glass, 1, WILDCARD_VALUE));
      // blockGlass{Color} is added below with dyes
      registerOre("paneGlassColorless", Blocks.glass_pane);
      registerOre("paneGlass", Blocks.glass_pane);
      registerOre("paneGlass", new ItemStack(Blocks.stained_glass_pane, 1, WILDCARD_VALUE));
      // paneGlass{Color} is added below with dyes

      // chests
      registerOre("chest", Blocks.chest);
      registerOre("chest", Blocks.ender_chest);
      registerOre("chest", Blocks.trapped_chest);
      registerOre("chestWood", Blocks.chest);
      registerOre("chestEnder", Blocks.ender_chest);
      registerOre("chestTrapped", Blocks.trapped_chest);
    }

    // Build our list of items to replace with ore tags
    Map<ItemStack, String> replacements = new HashMap<ItemStack, String>();

    // wood-related things
    replacements.put(new ItemStack(Items.stick), "stickWood");
    replacements.put(new ItemStack(Blocks.planks), "plankWood");
    replacements.put(new ItemStack(Blocks.planks, 1, WILDCARD_VALUE), "plankWood");
    replacements.put(new ItemStack(Blocks.wooden_slab, 1, WILDCARD_VALUE), "slabWood");

    // ingots/nuggets
    replacements.put(new ItemStack(Items.gold_ingot), "ingotGold");
    replacements.put(new ItemStack(Items.iron_ingot), "ingotIron");

    // gems and dusts
    replacements.put(new ItemStack(Items.diamond), "gemDiamond");
    replacements.put(new ItemStack(Items.emerald), "gemEmerald");
    replacements.put(new ItemStack(Items.prismarine_shard), "gemPrismarine");
    replacements.put(new ItemStack(Items.prismarine_crystals), "dustPrismarine");
    replacements.put(new ItemStack(Items.redstone), "dustRedstone");
    replacements.put(new ItemStack(Items.glowstone_dust), "dustGlowstone");

    // crops
    replacements.put(new ItemStack(Items.reeds), "sugarcane");
    replacements.put(new ItemStack(Blocks.cactus), "blockCactus");

    // misc materials
    replacements.put(new ItemStack(Items.paper), "paper");

    // mob drops
    replacements.put(new ItemStack(Items.slime_ball), "slimeball");
    replacements.put(new ItemStack(Items.string), "string");
    replacements.put(new ItemStack(Items.leather), "leather");
    replacements.put(new ItemStack(Items.ender_pearl), "enderpearl");
    replacements.put(new ItemStack(Items.gunpowder), "gunpowder");
    replacements.put(new ItemStack(Items.nether_star), "netherStar");
    replacements.put(new ItemStack(Items.feather), "feather");
    replacements.put(new ItemStack(Items.bone), "bone");
    replacements.put(new ItemStack(Items.egg), "egg");

    // blocks
    replacements.put(new ItemStack(Blocks.stone), "stone");
    replacements.put(new ItemStack(Blocks.cobblestone), "cobblestone");
    replacements.put(new ItemStack(Blocks.cobblestone, 1, WILDCARD_VALUE), "cobblestone");
    replacements.put(new ItemStack(Blocks.glowstone), "glowstone");
    replacements.put(new ItemStack(Blocks.glass), "blockGlassColorless");
    replacements.put(new ItemStack(Blocks.prismarine), "prismarine");
    replacements.put(new ItemStack(Blocks.stone, 1, 1), "stoneGranite");
    replacements.put(new ItemStack(Blocks.stone, 1, 2), "stoneGranitePolished");
    replacements.put(new ItemStack(Blocks.stone, 1, 3), "stoneDiorite");
    replacements.put(new ItemStack(Blocks.stone, 1, 4), "stoneDioritePolished");
    replacements.put(new ItemStack(Blocks.stone, 1, 5), "stoneAndesite");
    replacements.put(new ItemStack(Blocks.stone, 1, 6), "stoneAndesitePolished");

    // chests
    replacements.put(new ItemStack(Blocks.chest), "chestWood");
    replacements.put(new ItemStack(Blocks.ender_chest), "chestEnder");
    replacements.put(new ItemStack(Blocks.trapped_chest), "chestTrapped");

    // Register dyes
    String[] dyes = {
      "Black",
      "Red",
      "Green",
      "Brown",
      "Blue",
      "Purple",
      "Cyan",
      "LightGray",
      "Gray",
      "Pink",
      "Lime",
      "Yellow",
      "LightBlue",
      "Magenta",
      "Orange",
      "White"
    };

    for (int i = 0; i < 16; i++) {
      ItemStack dye = new ItemStack(Items.dye, 1, i);
      ItemStack block = new ItemStack(Blocks.stained_glass, 1, 15 - i);
      ItemStack pane = new ItemStack(Blocks.stained_glass_pane, 1, 15 - i);
      if (!hasInit) {
        registerOre("dye" + dyes[i], dye);
        registerOre("blockGlass" + dyes[i], block);
        registerOre("paneGlass" + dyes[i], pane);
      }
      replacements.put(dye, "dye" + dyes[i]);
      replacements.put(block, "blockGlass" + dyes[i]);
      replacements.put(pane, "paneGlass" + dyes[i]);
    }
    hasInit = true;

    ItemStack[] replaceStacks =
        replacements.keySet().toArray(new ItemStack[replacements.keySet().size()]);

    // Ignore recipes for the following items
    ItemStack[] exclusions =
        new ItemStack[] {
          new ItemStack(Blocks.lapis_block),
          new ItemStack(Items.cookie),
          new ItemStack(Blocks.stonebrick),
          new ItemStack(Blocks.stone_slab, 1, WILDCARD_VALUE),
          new ItemStack(Blocks.stone_stairs),
          new ItemStack(Blocks.cobblestone_wall),
          new ItemStack(Blocks.oak_fence),
          new ItemStack(Blocks.oak_fence_gate),
          new ItemStack(Blocks.oak_stairs),
          new ItemStack(Blocks.spruce_fence),
          new ItemStack(Blocks.spruce_fence_gate),
          new ItemStack(Blocks.spruce_stairs),
          new ItemStack(Blocks.birch_fence),
          new ItemStack(Blocks.birch_fence_gate),
          new ItemStack(Blocks.birch_stairs),
          new ItemStack(Blocks.jungle_fence),
          new ItemStack(Blocks.jungle_fence_gate),
          new ItemStack(Blocks.jungle_stairs),
          new ItemStack(Blocks.acacia_fence),
          new ItemStack(Blocks.acacia_fence_gate),
          new ItemStack(Blocks.acacia_stairs),
          new ItemStack(Blocks.dark_oak_fence),
          new ItemStack(Blocks.dark_oak_fence_gate),
          new ItemStack(Blocks.dark_oak_stairs),
          new ItemStack(Blocks.wooden_slab),
          new ItemStack(Blocks.glass_pane),
          null // So the above can have a comma and we don't have to keep editing extra lines.
        };

    List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();
    List<IRecipe> recipesToRemove = new ArrayList<IRecipe>();
    List<IRecipe> recipesToAdd = new ArrayList<IRecipe>();

    // Search vanilla recipes for recipes to replace
    for (Object obj : recipes) {
      if (obj instanceof ShapedRecipes) {
        ShapedRecipes recipe = (ShapedRecipes) obj;
        ItemStack output = recipe.getRecipeOutput();
        if (output != null && containsMatch(false, exclusions, output)) {
          continue;
        }

        if (containsMatch(true, recipe.recipeItems, replaceStacks)) {
          recipesToRemove.add(recipe);
          recipesToAdd.add(new ShapedOreRecipe(recipe, replacements));
        }
      } else if (obj instanceof ShapelessRecipes) {
        ShapelessRecipes recipe = (ShapelessRecipes) obj;
        ItemStack output = recipe.getRecipeOutput();
        if (output != null && containsMatch(false, exclusions, output)) {
          continue;
        }

        if (containsMatch(
            true,
            recipe.recipeItems.toArray(new ItemStack[recipe.recipeItems.size()]),
            replaceStacks)) {
          recipesToRemove.add((IRecipe) obj);
          IRecipe newRecipe = new ShapelessOreRecipe(recipe, replacements);
          recipesToAdd.add(newRecipe);
        }
      }
    }

    recipes.removeAll(recipesToRemove);
    recipes.addAll(recipesToAdd);
    if (recipesToRemove.size() > 0) {
      FMLLog.info("Replaced %d ore recipes", recipesToRemove.size());
    }
  }