From 501009c11fe80bbe2220449b716de3f1e1276a4f Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 25 Aug 2012 21:57:25 -0400 Subject: [PATCH] Always for ML mods into "public" class accessibility - we don't call from the default package like ML does. --- common/cpw/mods/fml/common/ModClassLoader.java | 10 ++++++++++ .../fml/common/asm/transformers/AccessTransformer.java | 7 +++++++ .../fml/common/modloader/ModLoaderModContainer.java | 7 +++++-- .../cpw/mods/fml/relauncher/RelaunchClassLoader.java | 6 ++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/common/cpw/mods/fml/common/ModClassLoader.java b/common/cpw/mods/fml/common/ModClassLoader.java index 6e3e5331da..b5d8bf4ceb 100644 --- a/common/cpw/mods/fml/common/ModClassLoader.java +++ b/common/cpw/mods/fml/common/ModClassLoader.java @@ -23,6 +23,9 @@ import java.util.logging.Level; import com.google.common.collect.ImmutableList; +import cpw.mods.fml.common.asm.ASMTransformer; +import cpw.mods.fml.common.asm.transformers.AccessTransformer; +import cpw.mods.fml.common.modloader.BaseModProxy; import cpw.mods.fml.relauncher.RelaunchClassLoader; /** @@ -76,4 +79,11 @@ public class ModClassLoader extends URLClassLoader { return STANDARD_LIBRARIES; } + + public Class loadBaseModClass(String modClazzName) throws Exception + { + AccessTransformer transformer = (AccessTransformer)mainClassLoader.getTransformers().get(0); + transformer.ensurePublicAccessFor(modClazzName); + return (Class) Class.forName(modClazzName, true, this); + } } diff --git a/common/cpw/mods/fml/common/asm/transformers/AccessTransformer.java b/common/cpw/mods/fml/common/asm/transformers/AccessTransformer.java index d5dbef7fa7..65a04619c8 100644 --- a/common/cpw/mods/fml/common/asm/transformers/AccessTransformer.java +++ b/common/cpw/mods/fml/common/asm/transformers/AccessTransformer.java @@ -408,4 +408,11 @@ public class AccessTransformer implements IClassTransformer } } } + public void ensurePublicAccessFor(String modClazzName) + { + Modifier m = new Modifier(); + m.setTargetAccess("public"); + m.modifyClassVisibility = true; + modifiers.put(modClazzName, m); + } } \ No newline at end of file diff --git a/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java b/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java index c81efd512a..4a550fc9b8 100644 --- a/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java +++ b/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java @@ -17,6 +17,7 @@ import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -485,10 +486,12 @@ public class ModLoaderModContainer implements ModContainer EnumSet ticks = EnumSet.noneOf(TickType.class); this.gameTickHandler = new BaseModTicker(ticks, false); this.guiTickHandler = new BaseModTicker(ticks.clone(), true); - Class modClazz = (Class) Class.forName(modClazzName, true, modClassLoader); + Class modClazz = (Class) modClassLoader.loadBaseModClass(modClazzName); configureMod(modClazz, event.getASMHarvestedData()); isNetworkMod = FMLNetworkHandler.instance().registerNetworkMod(this, modClazz, event.getASMHarvestedData()); - mod = (BaseModProxy)modClazz.newInstance(); + Constructor ctor = modClazz.getConstructor(); + ctor.setAccessible(true); + mod = modClazz.newInstance(); if (!isNetworkMod) { FMLLog.fine("Injecting dummy network mod handler for BaseMod %s", getModId()); diff --git a/common/cpw/mods/fml/relauncher/RelaunchClassLoader.java b/common/cpw/mods/fml/relauncher/RelaunchClassLoader.java index 01252b1b38..2c037527d3 100644 --- a/common/cpw/mods/fml/relauncher/RelaunchClassLoader.java +++ b/common/cpw/mods/fml/relauncher/RelaunchClassLoader.java @@ -7,6 +7,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -175,4 +176,9 @@ public class RelaunchClassLoader extends URLClassLoader return new byte[0]; } } + + public List getTransformers() + { + return Collections.unmodifiableList(transformers); + } }