From b4a6418d1c3b9b14998e75db82a2dfddc3dd2ea8 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 17 Jan 2014 17:47:30 -0500 Subject: [PATCH] Make UniqueIdentifier final and add a hashCode. Closes #348 Clean up language registry. It can be used to access all translations of mods on client or server. Auto loads from assets files. --- .../minecraft/util/StringTranslate.java.patch | 34 ++++- .../cpw/mods/fml/client/FMLClientHandler.java | 4 +- .../cpw/mods/fml/common/FMLCommonHandler.java | 1 - .../fml/common/registry/GameRegistry.java | 10 +- .../fml/common/registry/LanguageRegistry.java | 133 ++++++++++++++++-- .../cpw/mods/fml/server/FMLServerHandler.java | 64 +-------- 6 files changed, 165 insertions(+), 81 deletions(-) diff --git a/fml/patches/minecraft/net/minecraft/util/StringTranslate.java.patch b/fml/patches/minecraft/net/minecraft/util/StringTranslate.java.patch index acf32e636e..409d67b780 100644 --- a/fml/patches/minecraft/net/minecraft/util/StringTranslate.java.patch +++ b/fml/patches/minecraft/net/minecraft/util/StringTranslate.java.patch @@ -1,6 +1,6 @@ --- ../src-base/minecraft/net/minecraft/util/StringTranslate.java +++ ../src-work/minecraft/net/minecraft/util/StringTranslate.java -@@ -3,6 +3,8 @@ +@@ -3,10 +3,13 @@ import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; @@ -9,33 +9,53 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.io.IOException; -@@ -25,9 +27,19 @@ + import java.io.InputStream; ++import java.util.HashMap; + import java.util.IllegalFormatException; + import java.util.Iterator; + import java.util.Map; +@@ -25,9 +28,22 @@ public StringTranslate() { + InputStream inputstream = StringTranslate.class.getResourceAsStream("/assets/minecraft/lang/en_US.lang"); -+ localInject(inputstream); ++ inject(inputstream); + } + + public static void inject(InputStream inputstream) + { -+ field_74817_a.localInject(inputstream); ++ HashMap map = parseLangFile(inputstream); ++ field_74817_a.field_74816_c.putAll(map); ++ field_74817_a.field_150511_e = System.currentTimeMillis(); + } + -+ private void localInject(InputStream inputstream) ++ public static HashMap parseLangFile(InputStream inputstream) + { ++ HashMap table = Maps.newHashMap(); try { - InputStream inputstream = StringTranslate.class.getResourceAsStream("/assets/minecraft/lang/en_US.lang"); Iterator iterator = IOUtils.readLines(inputstream, Charsets.UTF_8).iterator(); while (iterator.hasNext()) -@@ -49,7 +61,7 @@ +@@ -42,17 +58,17 @@ + { + String s1 = astring[0]; + String s2 = field_111053_a.matcher(astring[1]).replaceAll("%$1s"); +- this.field_74816_c.put(s1, s2); ++ table.put(s1, s2); + } + } + } - this.field_150511_e = System.currentTimeMillis(); +- this.field_150511_e = System.currentTimeMillis(); } - catch (IOException ioexception) + catch (Exception ioexception) { ; } ++ return table; + } + + static StringTranslate func_74808_a() diff --git a/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java b/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java index 46c37731ac..fa5971bb75 100644 --- a/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java +++ b/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java @@ -17,8 +17,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -75,6 +75,7 @@ import cpw.mods.fml.common.WrongMinecraftVersionException; import cpw.mods.fml.common.eventhandler.EventBus; import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.common.registry.GameData; +import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.common.toposort.ModSortingException; import cpw.mods.fml.relauncher.Side; @@ -480,6 +481,7 @@ public class FMLClientHandler implements IFMLSidedHandler @Override public void addModAsResource(ModContainer container) { + LanguageRegistry.instance().loadLanguagesFor(container, Side.CLIENT); Class resourcePackType = container.getCustomResourcePackClass(); if (resourcePackType != null) { diff --git a/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java b/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java index 2604b456a0..6418f1a95f 100644 --- a/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java +++ b/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java @@ -79,7 +79,6 @@ public class FMLCommonHandler private List crashCallables = Lists.newArrayList(Loader.instance().getCallableCrashInformation()); private Set handlerSet = Sets.newSetFromMap(new MapMaker().weakKeys().makeMap()); private EventBus eventBus = new EventBus(); - /** * The FML event bus. Subscribe here for FML related events * diff --git a/fml/src/main/java/cpw/mods/fml/common/registry/GameRegistry.java b/fml/src/main/java/cpw/mods/fml/common/registry/GameRegistry.java index 77110de308..95e931b7ad 100644 --- a/fml/src/main/java/cpw/mods/fml/common/registry/GameRegistry.java +++ b/fml/src/main/java/cpw/mods/fml/common/registry/GameRegistry.java @@ -338,7 +338,7 @@ public class GameRegistry return null; } - public static class UniqueIdentifier + public static final class UniqueIdentifier { public final String modId; public final String name; @@ -363,7 +363,13 @@ public class GameRegistry final UniqueIdentifier other = (UniqueIdentifier) obj; return Objects.equal(modId, other.modId) && Objects.equal(name, other.name); } - + + @Override + public int hashCode() + { + return Objects.hashCode(modId, name); + } + @Override public String toString() { diff --git a/fml/src/main/java/cpw/mods/fml/common/registry/LanguageRegistry.java b/fml/src/main/java/cpw/mods/fml/common/registry/LanguageRegistry.java index 8273d5cdf1..4cc00c8dd6 100644 --- a/fml/src/main/java/cpw/mods/fml/common/registry/LanguageRegistry.java +++ b/fml/src/main/java/cpw/mods/fml/common/registry/LanguageRegistry.java @@ -12,18 +12,26 @@ package cpw.mods.fml.common.registry; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.apache.logging.log4j.Level; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.StringTranslate; import com.google.common.base.Charsets; @@ -31,6 +39,7 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.relauncher.Side; public class LanguageRegistry { @@ -38,6 +47,8 @@ public class LanguageRegistry private Map modLanguageData=new HashMap(); + private static final Pattern assetENUSLang = Pattern.compile("assets/(.*)/lang/(.*).lang"); + public static LanguageRegistry instance() { return INSTANCE; @@ -62,10 +73,19 @@ public class LanguageRegistry return localizedString; } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void addStringLocalization(String key, String value) { addStringLocalization(key, "en_US", value); } + + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void addStringLocalization(String key, String lang, String value) { Properties langPack=modLanguageData.get(lang); @@ -76,10 +96,18 @@ public class LanguageRegistry langPack.put(key,value); } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void addStringLocalization(Properties langPackAdditions) { addStringLocalization(langPackAdditions, "en_US"); } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void addStringLocalization(Properties langPackAdditions, String lang) { Properties langPack = modLanguageData.get(lang); if (langPack == null) { @@ -91,14 +119,10 @@ public class LanguageRegistry } } - public static void reloadLanguageTable() - { -// // reload language table by forcing lang to null and reloading the properties file -// String lang = StringTranslate.func_74808_a().func_74811_c(); -// StringTranslate.func_74808_a().func_74810_a(lang, true); - } - - + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void addNameForObject(Object objectToName, String lang, String name) { String objectName; @@ -115,12 +139,20 @@ public class LanguageRegistry addStringLocalization(objectName, lang, name); } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public static void addName(Object objectToName, String name) { instance().addNameForObject(objectToName, "en_US", name); } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ @SuppressWarnings("unchecked") + @Deprecated public void loadLanguageTable(@SuppressWarnings("rawtypes") Map field_135032_a, String lang) { Properties usPack=modLanguageData.get("en_US"); @@ -134,6 +166,10 @@ public class LanguageRegistry field_135032_a.putAll(langPack); } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void loadLocalization(String localizationFile, String lang, boolean isXML) { URL urlResource = this.getClass().getResource(localizationFile); @@ -155,6 +191,10 @@ public class LanguageRegistry } } + /** + * Deprecated for removal in 1.8. Use the assets lang system + */ + @Deprecated public void loadLocalization(URL localizationFile, String lang, boolean isXML) { InputStream langStream = null; @@ -186,4 +226,81 @@ public class LanguageRegistry } } } + + public void injectLanguage(String language, HashMap parsedLangFile) + { + + Properties p = modLanguageData.get(language); + if (p == null) + { + p = new Properties(); + modLanguageData.put(language, p); + } + p.putAll(parsedLangFile); + } + + public void loadLanguagesFor(ModContainer container, Side side) + { + File source = container.getSource(); + try + { + if (source.isDirectory()) + { + searchDirForLanguages(source, "", side); + } + else + { + searchZipForLanguages(source, side); + } + } + catch (IOException ioe) + { + + } + } + + private void searchZipForLanguages(File source, Side side) throws IOException + { + ZipFile zf = new ZipFile(source); + for (ZipEntry ze : Collections.list(zf.entries())) + { + Matcher matcher = assetENUSLang.matcher(ze.getName()); + if (matcher.matches()) + { + String lang = matcher.group(2); + FMLLog.fine("Injecting found translation data for lang %s in zip file %s at %s into language system", lang, source.getName(), ze.getName()); + LanguageRegistry.instance().injectLanguage(lang, StringTranslate.parseLangFile(zf.getInputStream(ze))); + // Ensure en_US is available to StringTranslate on the server + if ("en_US".equals(lang) && side == Side.SERVER) + { + StringTranslate.inject(zf.getInputStream(ze)); + } + } + } + zf.close(); + } + + private void searchDirForLanguages(File source, String path, Side side) throws IOException + { + for (File file : source.listFiles()) + { + String currPath = path+file.getName(); + if (file.isDirectory()) + { + searchDirForLanguages(file, currPath+'/', side); + } + Matcher matcher = assetENUSLang.matcher(currPath); + if (matcher.matches()) + { + String lang = matcher.group(2); + FMLLog.fine("Injecting found translation assets for lang %s at %s into language system", lang, currPath); + LanguageRegistry.instance().injectLanguage(lang, StringTranslate.parseLangFile(new FileInputStream(file))); + // Ensure en_US is available to StringTranslate on the server + if ("en_US".equals(lang) && side == Side.SERVER) + { + StringTranslate.inject(new FileInputStream(file)); + } + } + } + } } diff --git a/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java b/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java index b4965d0680..17bb021ac0 100644 --- a/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java +++ b/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java @@ -12,27 +12,14 @@ */ package cpw.mods.fml.server; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - import net.minecraft.network.INetHandler; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.StringTranslate; - import com.google.common.collect.ImmutableList; - import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.IFMLSidedHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModContainer; @@ -94,7 +81,6 @@ public class FMLServerHandler implements IFMLSidedHandler public void finishServerLoading() { Loader.instance().initializeMods(); - LanguageRegistry.reloadLanguageTable(); } @Override @@ -150,55 +136,9 @@ public class FMLServerHandler implements IFMLSidedHandler @Override public void addModAsResource(ModContainer container) { - File source = container.getSource(); - try - { - if (source.isDirectory()) - { - searchDirForENUSLanguage(source,""); - } - else - { - searchZipForENUSLanguage(source); - } - } - catch (IOException ioe) - { + LanguageRegistry.instance().loadLanguagesFor(container, Side.SERVER); + } - } - } - private static final Pattern assetENUSLang = Pattern.compile("assets/(.*)/lang/en_US.lang"); - private void searchZipForENUSLanguage(File source) throws IOException - { - ZipFile zf = new ZipFile(source); - for (ZipEntry ze : Collections.list(zf.entries())) - { - Matcher matcher = assetENUSLang.matcher(ze.getName()); - if (matcher.matches()) - { - FMLLog.fine("Injecting found translation data in zip file %s at %s into language system", source.getName(), ze.getName()); - StringTranslate.inject(zf.getInputStream(ze)); - } - } - zf.close(); - } - private void searchDirForENUSLanguage(File source, String path) throws IOException - { - for (File file : source.listFiles()) - { - String currPath = path+file.getName(); - if (file.isDirectory()) - { - searchDirForENUSLanguage(file, currPath+'/'); - } - Matcher matcher = assetENUSLang.matcher(currPath); - if (matcher.matches()) - { - FMLLog.fine("Injecting found translation data at %s into language system", currPath); - StringTranslate.inject(new FileInputStream(file)); - } - } - } @Override public void updateResourcePackList() {