001 package net.minecraftforge.oredict; 002 003 import java.util.ArrayList; 004 import java.util.Iterator; 005 import java.util.Map; 006 import java.util.Map.Entry; 007 import java.util.List; 008 009 import net.minecraft.block.Block; 010 import net.minecraft.item.crafting.CraftingManager; 011 import net.minecraft.item.crafting.IRecipe; 012 import net.minecraft.inventory.InventoryCrafting; 013 import net.minecraft.item.Item; 014 import net.minecraft.item.ItemStack; 015 import net.minecraft.item.crafting.ShapelessRecipes; 016 import net.minecraft.world.World; 017 018 public class ShapelessOreRecipe implements IRecipe 019 { 020 private ItemStack output = null; 021 private ArrayList input = new ArrayList(); 022 023 public ShapelessOreRecipe(Block result, Object... recipe){ this(new ItemStack(result), recipe); } 024 public ShapelessOreRecipe(Item result, Object... recipe){ this(new ItemStack(result), recipe); } 025 026 public ShapelessOreRecipe(ItemStack result, Object... recipe) 027 { 028 output = result.copy(); 029 for (Object in : recipe) 030 { 031 if (in instanceof ItemStack) 032 { 033 input.add(((ItemStack)in).copy()); 034 } 035 else if (in instanceof Item) 036 { 037 input.add(new ItemStack((Item)in)); 038 } 039 else if (in instanceof Block) 040 { 041 input.add(new ItemStack((Block)in)); 042 } 043 else if (in instanceof String) 044 { 045 input.add(OreDictionary.getOres((String)in)); 046 } 047 else 048 { 049 String ret = "Invalid shapeless ore recipe: "; 050 for (Object tmp : recipe) 051 { 052 ret += tmp + ", "; 053 } 054 ret += output; 055 throw new RuntimeException(ret); 056 } 057 } 058 } 059 060 ShapelessOreRecipe(ShapelessRecipes recipe, Map<ItemStack, String> replacements) 061 { 062 output = recipe.getRecipeOutput(); 063 064 for(ItemStack ingred : ((List<ItemStack>)recipe.recipeItems)) 065 { 066 Object finalObj = ingred; 067 for(Entry<ItemStack, String> replace : replacements.entrySet()) 068 { 069 if(OreDictionary.itemMatches(replace.getKey(), ingred, false)) 070 { 071 finalObj = OreDictionary.getOres(replace.getValue()); 072 break; 073 } 074 } 075 input.add(finalObj); 076 } 077 } 078 079 @Override 080 public int getRecipeSize(){ return input.size(); } 081 082 @Override 083 public ItemStack getRecipeOutput(){ return output; } 084 085 @Override 086 public ItemStack getCraftingResult(InventoryCrafting var1){ return output.copy(); } 087 088 @Override 089 public boolean matches(InventoryCrafting var1, World world) 090 { 091 ArrayList required = new ArrayList(input); 092 093 for (int x = 0; x < var1.getSizeInventory(); x++) 094 { 095 ItemStack slot = var1.getStackInSlot(x); 096 097 if (slot != null) 098 { 099 boolean inRecipe = false; 100 Iterator req = required.iterator(); 101 102 while (req.hasNext()) 103 { 104 boolean match = false; 105 106 Object next = req.next(); 107 108 if (next instanceof ItemStack) 109 { 110 match = checkItemEquals((ItemStack)next, slot); 111 } 112 else if (next instanceof ArrayList) 113 { 114 for (ItemStack item : (ArrayList<ItemStack>)next) 115 { 116 match = match || checkItemEquals(item, slot); 117 } 118 } 119 120 if (match) 121 { 122 inRecipe = true; 123 required.remove(next); 124 break; 125 } 126 } 127 128 if (!inRecipe) 129 { 130 return false; 131 } 132 } 133 } 134 135 return required.isEmpty(); 136 } 137 138 private boolean checkItemEquals(ItemStack target, ItemStack input) 139 { 140 return (target.itemID == input.itemID && (target.getItemDamage() == -1 || target.getItemDamage() == input.getItemDamage())); 141 } 142 }