diff --git a/codechicken/lib/asm/ObfMapping.java b/codechicken/lib/asm/ObfMapping.java index e2c02ad..7af323f 100644 --- a/codechicken/lib/asm/ObfMapping.java +++ b/codechicken/lib/asm/ObfMapping.java @@ -69,7 +69,7 @@ public class ObfMapping public static ObfMapping fromDesc(String s) { - int lastDot = s.lastIndexOf('.'); + int lastDot = s.lastIndexOf('.'); if(lastDot < 0) return new ObfMapping(s, "", ""); int sep = s.indexOf('(');//methods @@ -85,7 +85,7 @@ public class ObfMapping if(sep < 0) return new ObfMapping(s.substring(0, lastDot), s.substring(lastDot + 1), ""); - return new ObfMapping(s.substring(0, lastDot), s.substring(lastDot+1, sep), s.substring(sep_end)); + return new ObfMapping(s.substring(0, lastDot), s.substring(lastDot+1, sep), s.substring(sep_end)); } public ObfMapping subclass(String subclass) @@ -176,7 +176,17 @@ public class ObfMapping return "["+s_owner+"]"; if(s_desc.length() == 0) return "["+s_owner+"."+s_name+"]"; - return "["+s_owner+"."+s_name+s_desc+"]"; + return "["+(isMethod() ? methodDesc() : fieldDesc())+"]"; + } + + public String methodDesc() + { + return s_owner+"."+s_name+s_desc; + } + + public String fieldDesc() + { + return s_owner+"."+s_name+":"+s_desc; } public boolean isClass() @@ -203,12 +213,14 @@ public class ObfMapping s_owner = mapper.mapType(s_owner); - if(!isClass()) + if(isMethod()) + s_desc = mapper.mapMethodDesc(s_desc); + else if(!isClass()) s_desc = mapper.mapDesc(s_desc); return this; } - + public ObfMapping toRuntime() { if(!runtime) @@ -217,9 +229,9 @@ public class ObfMapping runtime = true; return this; } - + public ObfMapping copy() { - return new ObfMapping(s_owner, s_name, s_desc); + return new ObfMapping(s_owner, s_name, s_desc); } } diff --git a/codechicken/lib/lang/LangUtil.java b/codechicken/lib/lang/LangUtil.java new file mode 100644 index 0000000..608c7f9 --- /dev/null +++ b/codechicken/lib/lang/LangUtil.java @@ -0,0 +1,111 @@ +package codechicken.lib.lang; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.SortedSet; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.Language; +import net.minecraft.client.resources.Resource; +import net.minecraft.client.resources.ResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; + +import cpw.mods.fml.common.registry.LanguageRegistry; + +/** + * Easy localisation access. + */ +public class LangUtil +{ + public static LangUtil instance = new LangUtil(null); + + public String prefix; + + public LangUtil(String prefix) + { + this.prefix = prefix; + } + + public static String translateG(String s, Object... format) + { + return instance.translate(s, format); + } + + public String translate(String s, Object... format) + { + if(prefix != null && !s.startsWith(prefix+".")) + s = prefix+"."+s; + String ret = LanguageRegistry.instance().getStringLocalization(s); + if(ret.length() == 0) + ret = LanguageRegistry.instance().getStringLocalization(s, "en_US"); + if(ret.length() == 0) + ret = StatCollector.translateToLocal(s); + if(ret.length() == 0) + return s; + if(format.length > 0) + ret = String.format(ret, format); + return ret; + } + + public void addLangFile(InputStream resource, String lang) throws IOException + { + LanguageRegistry reg = LanguageRegistry.instance(); + BufferedReader reader = new BufferedReader(new InputStreamReader(resource, "UTF-8")); + while(true) + { + String read = reader.readLine(); + if(read == null) + break; + + int equalIndex = read.indexOf('='); + if(equalIndex == -1) + continue; + String key = read.substring(0, equalIndex); + String value = read.substring(equalIndex+1); + if(prefix != null) + key = prefix+"."+key; + reg.addStringLocalization(key, lang, value); + } + } + + public static LangUtil loadLangDir(String domain) + { + return new LangUtil(domain).addLangDir(new ResourceLocation(domain, "lang")); + } + + public LangUtil addLangDir(ResourceLocation dir) + { + ResourceManager resManager = Minecraft.getMinecraft().func_110442_L(); + for(Language lang : (SortedSet)Minecraft.getMinecraft().func_135016_M().func_135040_d()) + { + String langID = lang.func_135034_a(); + Resource langRes; + try + { + langRes = resManager.func_110536_a(new ResourceLocation(dir.func_110624_b(), dir.func_110623_a()+'/'+langID+".lang")); + } + catch(Exception e) + { + continue; + } + try + { + addLangFile(langRes.func_110527_b(), langID); + } + catch(IOException e) + { + System.err.println("Failed to load lang resource. domain="+prefix+", resource="+langRes); + e.printStackTrace(); + } + } + + return this; + } + + public static void loadBaseLangDir(ResourceLocation dir) + { + instance.addLangDir(dir); + } +}