package buildcraft.core.list; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import net.minecraftforge.oredict.OreDictionary; public final class ListOreDictionaryCache { public static final ListOreDictionaryCache INSTANCE = new ListOreDictionaryCache(); private static final String[] TYPE_KEYWORDS = { "Tiny", "Dense", "Small" }; private final Map<String, Set<Integer>> namingCache = new HashMap<String, Set<Integer>>(); private final Set<String> registeredNames = new HashSet<String>(); private ListOreDictionaryCache() { } public Set<Integer> getListOfPartialMatches(String part) { return namingCache.get(part); } private void addToNamingCache(String s, int id) { if (s == null) { return; } Set<Integer> ll = namingCache.get(s); if (ll == null) { ll = new HashSet<Integer>(); ll.add(id); namingCache.put(s, ll); } else { ll.add(id); } } public static String getType(String name) { // Rules for finding type: // - Split just before the last uppercase character found. int splitLocation = name.length() - 1; while (splitLocation >= 0) { if (Character.isUpperCase(name.codePointAt(splitLocation))) { break; } else { splitLocation--; } } return splitLocation >= 0 ? name.substring(0, splitLocation) : name; // No null - this handles things like "record". } public static String getMaterial(String name) { // Rules for finding material: // - For every uppercase character, check if the character is not in // TYPE_KEYWORDS. This is used to skip things like "plate[DenseIron]" // or "dust[TinyRedstone]". That part should be the material still. int splitLocation = 0; String t = null; while (splitLocation < name.length()) { if (!Character.isUpperCase(name.codePointAt(splitLocation))) { splitLocation++; } else { t = name.substring(splitLocation); for (String s : TYPE_KEYWORDS) { if (t.startsWith(s)) { t = null; break; } } if (t != null) { break; } else { splitLocation++; } } } return splitLocation < name.length() ? t : null; } public void registerName(String name) { if (registeredNames.contains(name)) { return; } int oreID = OreDictionary.getOreID(name); addToNamingCache(getType(name), oreID); addToNamingCache(getMaterial(name), oreID); registeredNames.add(name); } }