001 package net.minecraftforge.oredict; 002 003 import java.util.ArrayList; 004 import java.util.HashMap; 005 import java.util.Iterator; 006 import java.util.List; 007 import java.util.Map; 008 import java.util.Map.Entry; 009 010 import net.minecraft.src.Block; 011 import net.minecraft.src.Item; 012 import net.minecraft.src.ItemStack; 013 import net.minecraftforge.common.MinecraftForge; 014 import net.minecraftforge.event.Event; 015 016 public class OreDictionary 017 { 018 private static int maxID = 0; 019 private static HashMap<String, Integer> oreIDs = new HashMap<String, Integer>(); 020 private static HashMap<Integer, ArrayList<ItemStack>> oreStacks = new HashMap<Integer, ArrayList<ItemStack>>(); 021 022 /** 023 * Gets the integer ID for the specified ore name. 024 * If the name does not have a ID it assigns it a new one. 025 * 026 * @param name The unique name for this ore 'oreIron', 'ingotIron', etc.. 027 * @return A number representing the ID for this ore type 028 */ 029 public static int getOreID(String name) 030 { 031 Integer val = oreIDs.get(name); 032 if (val == null) 033 { 034 val = maxID++; 035 oreIDs.put(name, val); 036 oreStacks.put(val, new ArrayList<ItemStack>()); 037 } 038 return val; 039 } 040 041 /** 042 * Reverse of getOreID, will not create new entries. 043 * 044 * @param id The ID to translate to a string 045 * @return The String name, or "Unknown" if not found. 046 */ 047 public static String getOreName(int id) 048 { 049 for (Map.Entry<String, Integer> entry : oreIDs.entrySet()) 050 { 051 if (id == entry.getValue()) 052 { 053 return entry.getKey(); 054 } 055 } 056 return "Unknown"; 057 } 058 059 /** 060 * Retrieves the ArrayList of items that are registered to this ore type. 061 * Creates the list as empty if it did not exist. 062 * 063 * @param id The ore ID, see getOreID 064 * @return An arrayList containing ItemStacks registered for this ore 065 */ 066 public static ArrayList<ItemStack> getOres(String name) 067 { 068 return getOres(getOreID(name)); 069 } 070 071 /** 072 * Retrieves a list of all unique ore names that are already registered. 073 * 074 * @return All unique ore names that are currently registered. 075 */ 076 public static String[] getOreNames() 077 { 078 return oreIDs.keySet().toArray(new String[0]); 079 } 080 081 /** 082 * Retrieves the ArrayList of items that are registered to this ore type. 083 * Creates the list as empty if it did not exist. 084 * 085 * @param id The ore ID, see getOreID 086 * @return An arrayList containing ItemStacks registered for this ore 087 */ 088 public static ArrayList<ItemStack> getOres(Integer id) 089 { 090 ArrayList<ItemStack> val = oreStacks.get(id); 091 if (val == null) 092 { 093 val = new ArrayList<ItemStack>(); 094 oreStacks.put(id, val); 095 } 096 return val; 097 } 098 099 //Convenience functions that make for cleaner code mod side. They all drill down to registerOre(String, int, ItemStack) 100 public static void registerOre(String name, Item ore){ registerOre(name, new ItemStack(ore)); } 101 public static void registerOre(String name, Block ore){ registerOre(name, new ItemStack(ore)); } 102 public static void registerOre(String name, ItemStack ore){ registerOre(name, getOreID(name), ore); } 103 public static void registerOre(int id, Item ore){ registerOre(id, new ItemStack(ore)); } 104 public static void registerOre(int id, Block ore){ registerOre(id, new ItemStack(ore)); } 105 public static void registerOre(int id, ItemStack ore){ registerOre(getOreName(id), id, ore); } 106 107 /** 108 * Registers a ore item into the dictionary. 109 * Raises the registerOre function in all registered handlers. 110 * 111 * @param name The name of the ore 112 * @param id The ID of the ore 113 * @param ore The ore's ItemStack 114 */ 115 private static void registerOre(String name, int id, ItemStack ore) 116 { 117 ArrayList<ItemStack> ores = getOres(id); 118 ore = ore.copy(); 119 ores.add(ore); 120 MinecraftForge.EVENT_BUS.post(new OreRegisterEvent(name, ore)); 121 } 122 123 public static class OreRegisterEvent extends Event 124 { 125 public final String Name; 126 public final ItemStack Ore; 127 128 public OreRegisterEvent(String name, ItemStack ore) 129 { 130 this.Name = name; 131 this.Ore = ore; 132 } 133 } 134 }