diff --git a/fml/common/cpw/mods/fml/common/FMLModContainer.java b/fml/common/cpw/mods/fml/common/FMLModContainer.java index 7fe9565c4..8aac5129e 100644 --- a/fml/common/cpw/mods/fml/common/FMLModContainer.java +++ b/fml/common/cpw/mods/fml/common/FMLModContainer.java @@ -105,15 +105,43 @@ public class FMLModContainer implements ModContainer private boolean fingerprintNotPresent; private Set sourceFingerprints; private Certificate certificate; + private String modLanguage; + private ILanguageAdapter languageAdapter; + public static interface ILanguageAdapter { + public Object getNewInstance(FMLModContainer container, Class objectClass, ClassLoader classLoader) throws Exception; + } + public static class ScalaAdapter implements ILanguageAdapter { + @Override + public Object getNewInstance(FMLModContainer container, Class scalaObjectClass, ClassLoader classLoader) throws Exception + { + System.out.println("Scala class : "+ scalaObjectClass); + Class sObjectClass = Class.forName(scalaObjectClass.getName()+"$",true,classLoader); + return sObjectClass.getField("MODULE$").get(null); + } + } + + public static class JavaAdapter implements ILanguageAdapter { + @Override + public Object getNewInstance(FMLModContainer container, Class objectClass, ClassLoader classLoader) throws Exception + { + return objectClass.newInstance(); + } + } public FMLModContainer(String className, File modSource, Map modDescriptor) { this.className = className; this.source = modSource; this.descriptor = modDescriptor; + this.modLanguage = (String) modDescriptor.get("modLanguage"); + this.languageAdapter = "scala".equals(modLanguage) ? new ScalaAdapter() : new JavaAdapter(); } + private ILanguageAdapter getLanguageAdapter() + { + return languageAdapter; + } @Override public String getModId() { @@ -456,7 +484,7 @@ public class FMLModContainer implements ModContainer annotations = gatherAnnotations(clazz); isNetworkMod = FMLNetworkHandler.instance().registerNetworkMod(this, clazz, event.getASMHarvestedData()); - modInstance = clazz.newInstance(); + modInstance = getLanguageAdapter().getNewInstance(this,clazz, modClassLoader); if (fingerprintNotPresent) { eventBus.post(new FMLFingerprintViolationEvent(source.isDirectory(), source, ImmutableSet.copyOf(this.sourceFingerprints), expectedFingerprint)); diff --git a/fml/common/cpw/mods/fml/relauncher/CoreFMLLibraries.java b/fml/common/cpw/mods/fml/relauncher/CoreFMLLibraries.java index 4ec319707..4dc065b5f 100644 --- a/fml/common/cpw/mods/fml/relauncher/CoreFMLLibraries.java +++ b/fml/common/cpw/mods/fml/relauncher/CoreFMLLibraries.java @@ -5,7 +5,7 @@ * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * + * * Contributors: * cpw - implementation */ @@ -14,8 +14,8 @@ package cpw.mods.fml.relauncher; public class CoreFMLLibraries implements ILibrarySet { - private static String[] libraries = { "argo-small-3.2.jar","guava-14.0-rc3.jar","asm-all-4.1.jar", "bcprov-jdk15on-148.jar", FMLInjectionData.debfuscationDataName() }; - private static String[] checksums = { "58912ea2858d168c50781f956fa5b59f0f7c6b51", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", "054986e962b88d8660ae4566475658469595ef58", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", FMLInjectionData.deobfuscationDataHash }; + private static String[] libraries = { "argo-small-3.2.jar","guava-14.0-rc3.jar","asm-all-4.1.jar", "bcprov-jdk15on-148.jar", FMLInjectionData.debfuscationDataName(), "scala-library.jar" }; + private static String[] checksums = { "58912ea2858d168c50781f956fa5b59f0f7c6b51", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", "054986e962b88d8660ae4566475658469595ef58", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", FMLInjectionData.deobfuscationDataHash, "458d046151ad179c85429ed7420ffb1eaf6ddf85" }; @Override public String[] getLibraries() diff --git a/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java b/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java index 26b954710..cd45223cb 100644 --- a/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java +++ b/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java @@ -5,7 +5,7 @@ * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * + * * Contributors: * cpw - implementation */ @@ -526,7 +526,7 @@ public class RelaunchLibraryManager return loadedLibraries; } - private static ByteBuffer downloadBuffer = ByteBuffer.allocateDirect(1 << 22); + private static ByteBuffer downloadBuffer = ByteBuffer.allocateDirect(1 << 23); static IDownloadDisplay downloadMonitor; private static void performDownload(InputStream is, int sizeGuess, String validationHash, File target)