diff --git a/Dalamud/Plugin/Internal/PluginManager.cs b/Dalamud/Plugin/Internal/PluginManager.cs
index bfb1b3430..5cd5eadd1 100644
--- a/Dalamud/Plugin/Internal/PluginManager.cs
+++ b/Dalamud/Plugin/Internal/PluginManager.cs
@@ -1294,6 +1294,25 @@ internal class PluginManager : IInternalDisposableService
/// The calling plugin, or null.
public LocalPlugin? FindCallingPlugin() => this.FindCallingPlugin(new StackTrace());
+ ///
+ /// Notifies all plugins that the active plugins list changed.
+ ///
+ /// The invalidation kind.
+ /// The affected plugins.
+ public void NotifyPluginsForStateChange(PluginListInvalidationKind kind, IEnumerable affectedInternalNames)
+ {
+ foreach (var installedPlugin in this.installedPluginsList)
+ {
+ if (!installedPlugin.IsLoaded || installedPlugin.DalamudInterface == null)
+ continue;
+
+ installedPlugin.DalamudInterface.NotifyActivePluginsChanged(
+ kind,
+ // ReSharper disable once PossibleMultipleEnumeration
+ affectedInternalNames.Contains(installedPlugin.Manifest.InternalName));
+ }
+ }
+
///
/// Resolves the services that a plugin may have a dependency on.
/// This is required, as the lifetime of a plugin cannot be longer than PluginManager,
@@ -1823,20 +1842,6 @@ internal class PluginManager : IInternalDisposableService
this.OnInstalledPluginsChanged?.InvokeSafely();
}
- private void NotifyPluginsForStateChange(PluginListInvalidationKind kind, IEnumerable affectedInternalNames)
- {
- foreach (var installedPlugin in this.installedPluginsList)
- {
- if (!installedPlugin.IsLoaded || installedPlugin.DalamudInterface == null)
- continue;
-
- installedPlugin.DalamudInterface.NotifyActivePluginsChanged(
- kind,
- // ReSharper disable once PossibleMultipleEnumeration
- affectedInternalNames.Contains(installedPlugin.Manifest.InternalName));
- }
- }
-
private void LoadAndStartLoadSyncPlugins()
{
try
diff --git a/Dalamud/Plugin/Internal/Types/LocalPlugin.cs b/Dalamud/Plugin/Internal/Types/LocalPlugin.cs
index 4b2b62669..c426c4cdc 100644
--- a/Dalamud/Plugin/Internal/Types/LocalPlugin.cs
+++ b/Dalamud/Plugin/Internal/Types/LocalPlugin.cs
@@ -395,6 +395,9 @@ internal class LocalPlugin : IAsyncDisposable
this.dalamudInterface);
this.State = PluginState.Loaded;
Log.Information("Finished loading {PluginName}", this.InternalName);
+
+ var manager = Service.Get();
+ manager.NotifyPluginsForStateChange(PluginListInvalidationKind.Load, [this.manifest.InternalName]);
}
catch (Exception ex)
{
@@ -470,6 +473,9 @@ internal class LocalPlugin : IAsyncDisposable
this.State = PluginState.Unloaded;
Log.Information("Finished unloading {PluginName}", this.InternalName);
+
+ var manager = Service.Get();
+ manager.NotifyPluginsForStateChange(PluginListInvalidationKind.Unload, [this.manifest.InternalName]);
}
catch (Exception ex)
{
diff --git a/Dalamud/Plugin/PluginListInvalidationKind.cs b/Dalamud/Plugin/PluginListInvalidationKind.cs
index 4e7782703..7ee121697 100644
--- a/Dalamud/Plugin/PluginListInvalidationKind.cs
+++ b/Dalamud/Plugin/PluginListInvalidationKind.cs
@@ -1,10 +1,20 @@
-namespace Dalamud.Plugin;
+namespace Dalamud.Plugin;
///
/// Causes for a change to the plugin list.
///
public enum PluginListInvalidationKind
{
+ ///
+ /// A plugin was loaded.
+ ///
+ Load,
+
+ ///
+ /// A plugin was unloaded.
+ ///
+ Unload,
+
///
/// An installer-initiated update reloaded plugins.
///