diff --git a/managed/src/SwiftlyS2.Core/Hosting/PluginManagerInjection.cs b/managed/src/SwiftlyS2.Core/Hosting/PluginManagerInjection.cs index cca433f2e..4be263f25 100644 --- a/managed/src/SwiftlyS2.Core/Hosting/PluginManagerInjection.cs +++ b/managed/src/SwiftlyS2.Core/Hosting/PluginManagerInjection.cs @@ -13,6 +13,6 @@ public static IServiceCollection AddPluginManager( this IServiceCollection self public static void UsePluginManager( this IServiceProvider self ) { - _ = self.GetRequiredService(); + self.GetRequiredService().Initialize(); } } \ No newline at end of file diff --git a/managed/src/SwiftlyS2.Core/Modules/Plugins/PluginManager.cs b/managed/src/SwiftlyS2.Core/Modules/Plugins/PluginManager.cs index 4bd6b8579..2d62ed3de 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Plugins/PluginManager.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Plugins/PluginManager.cs @@ -150,7 +150,13 @@ static async Task WaitForFileAccess( CancellationToken token, string filePath, i ? Assembly.GetExecutingAssembly() : AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => loadingAssemblyName == a.GetName().Name); }; + } + /// + /// Must be called after DI container is fully built to avoid circular dependency. + /// + internal void Initialize() + { LoadExports(); LoadPlugins(); } diff --git a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs index 964c40423..e32cbdfd1 100644 --- a/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs +++ b/managed/src/SwiftlyS2.Core/Modules/Plugins/SwiftlyCore.cs @@ -81,7 +81,7 @@ internal class SwiftlyCore : ISwiftlyCore, IDisposable public string ContextBasePath { get; init; } public string PluginDataDirectory { get; init; } public GameFileSystem GameFileSystem { get; init; } - // public PluginManager PluginManager { get; set; } + public PluginManager PluginManager { get; set; } public SwiftlyCore( string contextId, string contextBaseDirectory, PluginMetadata? pluginManifest, Type contextType, IServiceProvider coreProvider, string pluginDataDirectory ) { @@ -94,7 +94,7 @@ public SwiftlyCore( string contextId, string contextBaseDirectory, PluginMetadat .AddSingleton(this) .AddSingleton(this) .AddSingleton(coreProvider.GetRequiredService()) - // .AddSingleton(coreProvider.GetRequiredService()) + .AddSingleton(coreProvider.GetRequiredService()) .AddSingleton(coreProvider.GetRequiredService()) .AddSingleton(coreProvider.GetRequiredService()) .AddSingleton(coreProvider.GetRequiredService()) @@ -141,7 +141,7 @@ public SwiftlyCore( string contextId, string contextBaseDirectory, PluginMetadat .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) - // .AddSingleton(provider => provider.GetRequiredService()) + .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) .AddSingleton(provider => provider.GetRequiredService()) @@ -185,7 +185,7 @@ public SwiftlyCore( string contextId, string contextBaseDirectory, PluginMetadat GameService = serviceProvider.GetRequiredService(); Logger = LoggerFactory.CreateLogger(contextType); GameFileSystem = serviceProvider.GetRequiredService(); - // PluginManager = serviceProvider.GetRequiredService(); + PluginManager = serviceProvider.GetRequiredService(); } public void InitializeType( Type type ) @@ -232,7 +232,7 @@ public void Dispose() IHelpers ISwiftlyCore.Helpers => Helpers; IGameService ISwiftlyCore.Game => GameService; IGameFileSystem ISwiftlyCore.GameFileSystem => GameFileSystem; - // IPluginManager ISwiftlyCore.PluginManager => PluginManager; + IPluginManager ISwiftlyCore.PluginManager => PluginManager; string ISwiftlyCore.PluginPath => ContextBasePath; string ISwiftlyCore.PluginDataDirectory => PluginDataDirectory; string ISwiftlyCore.CSGODirectory => NativeEngineHelpers.GetCSGODirectoryPath(); diff --git a/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs b/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs index 9dff7089b..13a0359ee 100644 --- a/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs +++ b/managed/src/SwiftlyS2.Shared/ISwiftlyCore.cs @@ -167,10 +167,11 @@ public interface ISwiftlyCore /// Game file system interface. /// public IGameFileSystem GameFileSystem { get; } + /// /// Plugin manager. /// - // public IPluginManager PluginManager { get; } + public IPluginManager PluginManager { get; } /// /// Gets the file path to the plugin directory. diff --git a/managed/src/SwiftlyS2.Shared/SwiftlyCoreInjection.cs b/managed/src/SwiftlyS2.Shared/SwiftlyCoreInjection.cs index 2f368a928..691f9dcb8 100644 --- a/managed/src/SwiftlyS2.Shared/SwiftlyCoreInjection.cs +++ b/managed/src/SwiftlyS2.Shared/SwiftlyCoreInjection.cs @@ -9,41 +9,42 @@ public static class SwiftlyCoreInjection public static IServiceCollection AddSwiftly( this IServiceCollection self, ISwiftlyCore core, bool addLogger = true, bool addConfiguration = true ) { _ = self - .AddSingleton(core) - .AddSingleton(core.ConVar) - .AddSingleton(core.Command) - .AddSingleton(core.Database) - .AddSingleton(core.Engine) - .AddSingleton(core.EntitySystem) - .AddSingleton(core.Event) - .AddSingleton(core.GameData) - .AddSingleton(core.GameEvent) - .AddSingleton(core.Localizer) - .AddSingleton(core.Memory) - .AddSingleton(core.NetMessage) - .AddSingleton(core.Permission) - .AddSingleton(core.PlayerManager) - .AddSingleton(core.Profiler) - .AddSingleton(core.Scheduler) - .AddSingleton(core.Trace) - .AddSingleton(core.MenusAPI) - .AddSingleton(core.CommandLine) - .AddSingleton(core.GameFileSystem) - .AddSingleton(core.Translation); + .AddSingleton(core) + .AddSingleton(core.ConVar) + .AddSingleton(core.Command) + .AddSingleton(core.Database) + .AddSingleton(core.Engine) + .AddSingleton(core.EntitySystem) + .AddSingleton(core.Event) + .AddSingleton(core.GameData) + .AddSingleton(core.GameEvent) + .AddSingleton(core.Localizer) + .AddSingleton(core.Memory) + .AddSingleton(core.NetMessage) + .AddSingleton(core.Permission) + .AddSingleton(core.PlayerManager) + .AddSingleton(core.Profiler) + .AddSingleton(core.Scheduler) + .AddSingleton(core.Trace) + .AddSingleton(core.MenusAPI) + .AddSingleton(core.CommandLine) + .AddSingleton(core.GameFileSystem) + .AddSingleton(core.Translation) + .AddSingleton(core.PluginManager); if (addLogger) { _ = self - .AddSingleton(core.LoggerFactory) - .AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + .AddSingleton(core.LoggerFactory) + .AddSingleton(typeof(ILogger<>), typeof(Logger<>)); } if (addConfiguration && core.Configuration.BasePathExists) { _ = self - .AddSingleton(core.Configuration) - .AddSingleton(core.Configuration.Manager) - .AddSingleton(provider => provider.GetRequiredService()); + .AddSingleton(core.Configuration) + .AddSingleton(core.Configuration.Manager) + .AddSingleton(provider => provider.GetRequiredService()); } return self;