diff --git a/src/main/java/codechicken/nei/ClientHandler.java b/src/main/java/codechicken/nei/ClientHandler.java index 6e51761e..7b154139 100644 --- a/src/main/java/codechicken/nei/ClientHandler.java +++ b/src/main/java/codechicken/nei/ClientHandler.java @@ -46,6 +46,9 @@ import codechicken.nei.recipe.GuiRecipeTab; import codechicken.nei.recipe.StackInfo; import cpw.mods.fml.client.CustomModLoadingErrorDisplayException; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModClassLoader; +import cpw.mods.fml.common.discovery.ASMDataTable; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; @@ -254,11 +257,29 @@ public class ClientHandler { } public static void loadPluginsList() { - final ClassDiscoverer classDiscoverer = new ClassDiscoverer( - test -> test.startsWith("NEI") && test.endsWith("Config.class"), - IConfigureNEI.class); + if (!Loader.isModLoaded("jarjar")) { + // Do the old style class discovery + final ClassDiscoverer classDiscoverer = new ClassDiscoverer( + test -> test.startsWith("NEI") && test.endsWith("Config.class"), + IConfigureNEI.class); - NEIClientConfig.pluginsList.addAll(classDiscoverer.findClasses()); + NEIClientConfig.pluginsList.addAll(classDiscoverer.findClasses()); + } else { + // If JarJar's loaded, the ASMDataTable now includes interfaces in addition to Annotations, so use that + // instead Includes a small change in behavior of no longer requiring the class to start with NEI and end + // with Config; This could easily be changed if desired, but the previous behavior was likely to speed + // things up by limiting the scope when looking at all of the jars and classes in the classpath. + final ASMDataTable dataTable = NEIModContainer.getAsmDataTable(); + final ModClassLoader modClassLoader = (ModClassLoader) Loader.instance().getModClassLoader(); + for (ASMDataTable.ASMData asmData : dataTable.getAll(IConfigureNEI.class.getName().replace('.', '/'))) { + final String className = asmData.getClassName().replace('/', '.'); + try { + NEIClientConfig.pluginsList.add(Class.forName(className, true, modClassLoader)); + } catch (ClassNotFoundException e) { + NEIClientConfig.logger.error("Failed to load plugin class {}", className, e); + } + } + } } @SubscribeEvent diff --git a/src/main/java/codechicken/nei/NEIModContainer.java b/src/main/java/codechicken/nei/NEIModContainer.java index 8e18ef02..ba0dada7 100644 --- a/src/main/java/codechicken/nei/NEIModContainer.java +++ b/src/main/java/codechicken/nei/NEIModContainer.java @@ -25,6 +25,7 @@ import cpw.mods.fml.common.DummyModContainer; import cpw.mods.fml.common.LoadController; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.discovery.ASMDataTable; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLLoadCompleteEvent; @@ -41,6 +42,8 @@ public class NEIModContainer extends DummyModContainer { private static boolean gregTech5Loaded; private static boolean gtnhLibLoaded; + private static ASMDataTable asmDataTable; + public NEIModContainer() { super(getModMetadata()); loadMetadata(); @@ -117,6 +120,7 @@ public class NEIModContainer extends DummyModContainer { gregTech5Loaded = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi_post"); gtnhLibLoaded = Loader.isModLoaded("gtnhlib"); if (CommonUtils.isClient()) ClientHandler.preInit(); + asmDataTable = event.getAsmData(); } @Subscribe @@ -139,6 +143,7 @@ public class NEIModContainer extends DummyModContainer { GuiRecipeTab.loadHandlerInfo(); ClientHandler.loadPluginsList(); ClientHandler.loadHandlerOrdering(); + asmDataTable = null; } } @@ -161,4 +166,8 @@ public class NEIModContainer extends DummyModContainer { public Class getCustomResourcePackClass() { return getSource().isDirectory() ? FMLFolderResourcePack.class : FMLFileResourcePack.class; } + + public static ASMDataTable getAsmDataTable() { + return asmDataTable; + } }