diff --git a/src/main/java/cpw/mods/fml/common/DummyModContainer.java b/src/main/java/cpw/mods/fml/common/DummyModContainer.java index 95bac54b18..b77e137351 100644 --- a/src/main/java/cpw/mods/fml/common/DummyModContainer.java +++ b/src/main/java/cpw/mods/fml/common/DummyModContainer.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.collect.ImmutableList; import com.google.common.eventbus.EventBus; import cpw.mods.fml.common.versioning.ArtifactVersion; @@ -193,4 +194,10 @@ public class DummyModContainer implements ModContainer { return null; } + + @Override + public List getOwnedPackages() + { + return ImmutableList.of(); + } } diff --git a/src/main/java/cpw/mods/fml/common/FMLModContainer.java b/src/main/java/cpw/mods/fml/common/FMLModContainer.java index f2c6079418..ff6ed966f6 100644 --- a/src/main/java/cpw/mods/fml/common/FMLModContainer.java +++ b/src/main/java/cpw/mods/fml/common/FMLModContainer.java @@ -624,4 +624,10 @@ public class FMLModContainer implements ModContainer { return (String) descriptor.get("guiFactory"); } + + @Override + public List getOwnedPackages() + { + return candidate.getContainedPackages(); + } } diff --git a/src/main/java/cpw/mods/fml/common/InjectedModContainer.java b/src/main/java/cpw/mods/fml/common/InjectedModContainer.java index 1907f43634..5da03c6e53 100644 --- a/src/main/java/cpw/mods/fml/common/InjectedModContainer.java +++ b/src/main/java/cpw/mods/fml/common/InjectedModContainer.java @@ -195,4 +195,10 @@ public class InjectedModContainer implements ModContainer { return wrappedContainer.getGuiClassName(); } + + @Override + public List getOwnedPackages() + { + return wrappedContainer.getOwnedPackages(); + } } diff --git a/src/main/java/cpw/mods/fml/common/LoadController.java b/src/main/java/cpw/mods/fml/common/LoadController.java index 826cab7adc..1f61310943 100644 --- a/src/main/java/cpw/mods/fml/common/LoadController.java +++ b/src/main/java/cpw/mods/fml/common/LoadController.java @@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.Iterables; +import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -55,6 +56,7 @@ public class LoadController private List activeModList = Lists.newArrayList(); private ModContainer activeContainer; private BiMap modObjectList; + private ListMultimap packageOwners; public LoadController(Loader loader) { @@ -63,7 +65,7 @@ public class LoadController this.masterChannel.register(this); state = LoaderState.NOINIT; - + packageOwners = ArrayListMultimap.create(); } @@ -171,7 +173,7 @@ public class LoadController public ModContainer activeContainer() { - return activeContainer; + return activeContainer != null ? activeContainer : findActiveContainerFromStack(); } @Subscribe @@ -229,6 +231,11 @@ public class LoadController if (!mc.isImmutable() && mc.getMod()!=null) { builder.put(mc, mc.getMod()); + List packages = mc.getOwnedPackages(); + for (String pkg : packages) + { + packageOwners.put(pkg, mc); + } } if (mc.getMod()==null && !mc.isImmutable() && state!=LoaderState.CONSTRUCTING) { @@ -309,4 +316,37 @@ public class LoadController { this.state = newState; } + + private ModContainer findActiveContainerFromStack() + { + for (Class c : getCallingStack()) + { + int idx = c.getName().lastIndexOf('.'); + if (idx == -1) + { + continue; + } + String pkg = c.getName().substring(0,idx); + if (packageOwners.containsKey(pkg)) + { + return packageOwners.get(pkg).get(0); + } + } + + return null; + } + private FMLSecurityManager accessibleManager = new FMLSecurityManager(); + + class FMLSecurityManager extends SecurityManager + { + Class[] getStackClasses() + { + return getClassContext(); + } + } + + Class[] getCallingStack() + { + return accessibleManager.getStackClasses(); + } } diff --git a/src/main/java/cpw/mods/fml/common/ModContainer.java b/src/main/java/cpw/mods/fml/common/ModContainer.java index 164178880e..abed85d410 100644 --- a/src/main/java/cpw/mods/fml/common/ModContainer.java +++ b/src/main/java/cpw/mods/fml/common/ModContainer.java @@ -145,4 +145,6 @@ public interface ModContainer Disableable canBeDisabled(); String getGuiClassName(); + + List getOwnedPackages(); }