package ic2.api.recipe; import java.util.ArrayList; import java.util.Collections; import java.util.List; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; public class RecipeInputOreDict implements IRecipeInput { public RecipeInputOreDict(String input1) { this(input1, 1); } public RecipeInputOreDict(String input1, int amount1) { this(input1, amount1, null); } public RecipeInputOreDict(String input1, int amount1, Integer meta) { this.input = input1; this.amount = amount1; this.meta = meta; } @Override public boolean matches(ItemStack subject) { List<ItemStack> inputs = getOres(); boolean useOreStackMeta = (meta == null); Item subjectItem = subject.getItem(); int subjectMeta = subject.getItemDamage(); for (ItemStack oreStack : inputs) { Item oreItem = oreStack.getItem(); if (oreItem == null) continue; // ignore invalid int metaRequired = useOreStackMeta ? oreStack.getItemDamage() : meta; if (subjectItem == oreItem && (subjectMeta == metaRequired || metaRequired == OreDictionary.WILDCARD_VALUE)) { return true; } } return false; } @Override public int getAmount() { return amount; } @Override public List<ItemStack> getInputs() { List<ItemStack> ores = getOres(); // check if we have to filter the list first boolean hasInvalidEntries = false; for (ItemStack stack : ores) { if (stack.getItem() == null) { hasInvalidEntries = true; break; } } if (!hasInvalidEntries) return ores; List<ItemStack> ret = new ArrayList<ItemStack>(ores.size()); for (ItemStack stack : ores) { if (stack.getItem() != null) ret.add(stack); // ignore invalid } return Collections.unmodifiableList(ret); } @Override public String toString() { if (meta == null) { return "RInputOreDict<"+amount+"x"+input+">"; } else { return "RInputOreDict<"+amount+"x"+input+"@"+meta+">"; } } private List<ItemStack> getOres() { if (ores != null) return ores; // cache the ore list by making use of the fact that forge always uses the same list, // unless it's EMPTY_LIST, which should never happen. List<ItemStack> ret = OreDictionary.getOres(input); if (ret != OreDictionary.EMPTY_LIST) ores = ret; return ret; } public final String input; public final int amount; public final Integer meta; private List<ItemStack> ores; }