package crazypants.enderio.material; import java.util.HashMap; import java.util.List; import java.util.Map; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import com.enderio.core.common.util.OreDictionaryHelper; public final class OreDictionaryPreferences { public static final OreDictionaryPreferences instance = new OreDictionaryPreferences(); public static void loadConfig() { OreDictionaryPreferenceParser.loadConfig(); } private Map<String, ItemStack> preferences = new HashMap<String, ItemStack>(); private Map<StackKey, ItemStack> stackCache = new HashMap<StackKey, ItemStack>(); public void setPreference(String oreDictName, ItemStack stack) { if(oreDictName == null || stack == null) { return; } preferences.put(oreDictName, stack.copy()); } public ItemStack getPreferred(String oreDictName) { ItemStack result = null; if(preferences.containsKey(oreDictName)) { result = preferences.get(oreDictName); } else { List<ItemStack> ores = OreDictionaryHelper.getOres(oreDictName); if(!ores.isEmpty() && ores.get(0) != null) { result = ores.get(0).copy(); } preferences.put(oreDictName, result); } return result; } public ItemStack getPreferred(ItemStack stack) { if(stack == null || stack.getItem() == null) { return stack; } StackKey key = new StackKey(stack); if(stackCache.containsKey(key)) { return stackCache.get(key); } ItemStack result = null; int[] ids = OreDictionary.getOreIDs(stack); if(ids != null) { for (int i = 0; i < ids.length && result == null; i++) { String oreDict = OreDictionary.getOreName(ids[i]); if(preferences.containsKey(oreDict)) { result = preferences.get(oreDict); } } } if(result == null) { result = stack.copy(); } stackCache.put(key, result); return stack; } private static class StackKey { Item item; int damage; StackKey(ItemStack stack) { item = stack.getItem(); damage = stack.getItemDamage(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + damage; result = prime * result + ((item == null) ? 0 : item.hashCode()); return result; } @Override public boolean equals(Object obj) { if(this == obj) { return true; } if(obj == null) { return false; } if(getClass() != obj.getClass()) { return false; } StackKey other = (StackKey) obj; if(damage != other.damage) { return false; } if(item == null) { if(other.item != null) { return false; } } else if(!item.equals(other.item)) { return false; } return true; } } }