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 static { 023 initVanillaEntries(); 024 } 025 026 public static void initVanillaEntries(){ 027 registerOre("woodLog", new ItemStack(Block.wood, 1, 0)); 028 registerOre("woodLog", new ItemStack(Block.wood, 1, 1)); 029 registerOre("woodLog", new ItemStack(Block.wood, 1, 2)); 030 registerOre("woodLog", new ItemStack(Block.wood, 1, 3)); 031 032 registerOre("woodPlank", new ItemStack(Block.planks, 1, 0)); 033 registerOre("woodPlank", new ItemStack(Block.planks, 1, 1)); 034 registerOre("woodPlank", new ItemStack(Block.planks, 1, 2)); 035 registerOre("woodPlank", new ItemStack(Block.planks, 1, 3)); 036 037 registerOre("woodSlab", new ItemStack(Block.woodSingleSlab, 1, 0)); 038 registerOre("woodSlab", new ItemStack(Block.woodSingleSlab, 1, 1)); 039 registerOre("woodSlab", new ItemStack(Block.woodSingleSlab, 1, 2)); 040 registerOre("woodSlab", new ItemStack(Block.woodSingleSlab, 1, 3)); 041 042 registerOre("woodStair", Block.stairCompactPlanks); 043 registerOre("woodStair", Block.stairsWoodBirch); 044 registerOre("woodStair", Block.stairsWoodJungle); 045 registerOre("woodStair", Block.stairsWoodSpruce); 046 047 registerOre("dyeBlack", new ItemStack(Item.dyePowder, 1, 0)); 048 registerOre("dyeRed", new ItemStack(Item.dyePowder, 1, 1)); 049 registerOre("dyeGreen", new ItemStack(Item.dyePowder, 1, 2)); 050 registerOre("dyeBrown", new ItemStack(Item.dyePowder, 1, 3)); 051 registerOre("dyeBlue", new ItemStack(Item.dyePowder, 1, 4)); 052 registerOre("dyePurple", new ItemStack(Item.dyePowder, 1, 5)); 053 registerOre("dyeCyan", new ItemStack(Item.dyePowder, 1, 6)); 054 registerOre("dyeLightGrey", new ItemStack(Item.dyePowder, 1, 7)); 055 registerOre("dyeGrey", new ItemStack(Item.dyePowder, 1, 8)); 056 registerOre("dyePink", new ItemStack(Item.dyePowder, 1, 9)); 057 registerOre("dyeLime", new ItemStack(Item.dyePowder, 1, 10)); 058 registerOre("dyeYellow", new ItemStack(Item.dyePowder, 1, 11)); 059 registerOre("dyeLightBlue", new ItemStack(Item.dyePowder, 1, 12)); 060 registerOre("dyeMagenta", new ItemStack(Item.dyePowder, 1, 13)); 061 registerOre("dyeOrange", new ItemStack(Item.dyePowder, 1, 14)); 062 registerOre("dyeWhite", new ItemStack(Item.dyePowder, 1, 15)); 063 } 064 065 /** 066 * Gets the integer ID for the specified ore name. 067 * If the name does not have a ID it assigns it a new one. 068 * 069 * @param name The unique name for this ore 'oreIron', 'ingotIron', etc.. 070 * @return A number representing the ID for this ore type 071 */ 072 public static int getOreID(String name) 073 { 074 Integer val = oreIDs.get(name); 075 if (val == null) 076 { 077 val = maxID++; 078 oreIDs.put(name, val); 079 oreStacks.put(val, new ArrayList<ItemStack>()); 080 } 081 return val; 082 } 083 084 /** 085 * Reverse of getOreID, will not create new entries. 086 * 087 * @param id The ID to translate to a string 088 * @return The String name, or "Unknown" if not found. 089 */ 090 public static String getOreName(int id) 091 { 092 for (Map.Entry<String, Integer> entry : oreIDs.entrySet()) 093 { 094 if (id == entry.getValue()) 095 { 096 return entry.getKey(); 097 } 098 } 099 return "Unknown"; 100 } 101 102 /** 103 * Retrieves the ArrayList of items that are registered to this ore type. 104 * Creates the list as empty if it did not exist. 105 * 106 * @param name The ore name, directly calls getOreID 107 * @return An arrayList containing ItemStacks registered for this ore 108 */ 109 public static ArrayList<ItemStack> getOres(String name) 110 { 111 return getOres(getOreID(name)); 112 } 113 114 /** 115 * Retrieves a list of all unique ore names that are already registered. 116 * 117 * @return All unique ore names that are currently registered. 118 */ 119 public static String[] getOreNames() 120 { 121 return oreIDs.keySet().toArray(new String[0]); 122 } 123 124 /** 125 * Retrieves the ArrayList of items that are registered to this ore type. 126 * Creates the list as empty if it did not exist. 127 * 128 * @param id The ore ID, see getOreID 129 * @return An arrayList containing ItemStacks registered for this ore 130 */ 131 public static ArrayList<ItemStack> getOres(Integer id) 132 { 133 ArrayList<ItemStack> val = oreStacks.get(id); 134 if (val == null) 135 { 136 val = new ArrayList<ItemStack>(); 137 oreStacks.put(id, val); 138 } 139 return val; 140 } 141 142 //Convenience functions that make for cleaner code mod side. They all drill down to registerOre(String, int, ItemStack) 143 public static void registerOre(String name, Item ore){ registerOre(name, new ItemStack(ore)); } 144 public static void registerOre(String name, Block ore){ registerOre(name, new ItemStack(ore)); } 145 public static void registerOre(String name, ItemStack ore){ registerOre(name, getOreID(name), ore); } 146 public static void registerOre(int id, Item ore){ registerOre(id, new ItemStack(ore)); } 147 public static void registerOre(int id, Block ore){ registerOre(id, new ItemStack(ore)); } 148 public static void registerOre(int id, ItemStack ore){ registerOre(getOreName(id), id, ore); } 149 150 /** 151 * Registers a ore item into the dictionary. 152 * Raises the registerOre function in all registered handlers. 153 * 154 * @param name The name of the ore 155 * @param id The ID of the ore 156 * @param ore The ore's ItemStack 157 */ 158 private static void registerOre(String name, int id, ItemStack ore) 159 { 160 ArrayList<ItemStack> ores = getOres(id); 161 ore = ore.copy(); 162 ores.add(ore); 163 MinecraftForge.EVENT_BUS.post(new OreRegisterEvent(name, ore)); 164 } 165 166 public static class OreRegisterEvent extends Event 167 { 168 public final String Name; 169 public final ItemStack Ore; 170 171 public OreRegisterEvent(String name, ItemStack ore) 172 { 173 this.Name = name; 174 this.Ore = ore; 175 } 176 } 177 }