diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java index 27c8dd2629..3fc1a11682 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginManager.java @@ -560,21 +560,39 @@ public class ExternalPluginManager try { - Module pluginModule = (Binder binder) -> + Injector parent = RuneLite.getInjector(); + + if (deps.size() > 1) { - binder.bind(clazz).toInstance(plugin); - binder.install(plugin); + List modules = new ArrayList<>(deps.size()); for (Plugin p : deps) { - Module p2 = (Binder binder2) -> + // Create a module for each dependency + Module module = (Binder binder) -> { - binder2.bind((Class) p.getClass()).toInstance(p); - binder2.install(p); + binder.bind((Class) p.getClass()).toInstance(p); + binder.install(p); }; - binder.install(p2); + modules.add(module); } + + // Create a parent injector containing all of the dependencies + parent = parent.createChildInjector(modules); + } + else if (!deps.isEmpty()) + { + // With only one dependency we can simply use its injector + parent = deps.get(0).injector; + } + + // Create injector for the module + Module pluginModule = (Binder binder) -> + { + // Since the plugin itself is a module, it won't bind itself, so we'll bind it here + binder.bind(clazz).toInstance(plugin); + binder.install(plugin); }; - Injector pluginInjector = RuneLite.getInjector().createChildInjector(pluginModule); + Injector pluginInjector = parent.createChildInjector(pluginModule); pluginInjector.injectMembers(plugin); plugin.injector = pluginInjector;