Push AddonLifecycle event register/unregister to main thread

This commit is contained in:
MidoriKami 2026-01-04 14:03:15 -08:00
parent 9538af0554
commit 1398054216

View file

@ -27,6 +27,9 @@ internal unsafe class AddonLifecycle : IInternalDisposableService
private static readonly ModuleLog Log = new("AddonLifecycle");
[ServiceManager.ServiceDependency]
private readonly Framework framework = Service<Framework>.Get();
private Hook<AtkUnitBase.Delegates.Initialize>? onInitializeAddonHook;
[ServiceManager.ServiceConstructor]
@ -58,20 +61,23 @@ internal unsafe class AddonLifecycle : IInternalDisposableService
/// <param name="listener">The listener to register.</param>
internal void RegisterListener(AddonLifecycleEventListener listener)
{
if (!this.EventListeners.ContainsKey(listener.EventType))
this.framework.RunOnFrameworkThread(() =>
{
if (!this.EventListeners.TryAdd(listener.EventType, []))
return;
}
if (!this.EventListeners.ContainsKey(listener.EventType))
{
if (!this.EventListeners.TryAdd(listener.EventType, []))
return;
}
// Note: string.Empty is a valid addon name, as that will trigger on any addon for this event type
if (!this.EventListeners[listener.EventType].ContainsKey(listener.AddonName))
{
if (!this.EventListeners[listener.EventType].TryAdd(listener.AddonName, []))
return;
}
// Note: string.Empty is a valid addon name, as that will trigger on any addon for this event type
if (!this.EventListeners[listener.EventType].ContainsKey(listener.AddonName))
{
if (!this.EventListeners[listener.EventType].TryAdd(listener.AddonName, []))
return;
}
this.EventListeners[listener.EventType][listener.AddonName].Add(listener);
this.EventListeners[listener.EventType][listener.AddonName].Add(listener);
});
}
/// <summary>
@ -80,13 +86,16 @@ internal unsafe class AddonLifecycle : IInternalDisposableService
/// <param name="listener">The listener to unregister.</param>
internal void UnregisterListener(AddonLifecycleEventListener listener)
{
if (this.EventListeners.TryGetValue(listener.EventType, out var addonListeners))
this.framework.RunOnFrameworkThread(() =>
{
if (addonListeners.TryGetValue(listener.AddonName, out var addonListener))
if (this.EventListeners.TryGetValue(listener.EventType, out var addonListeners))
{
addonListener.Remove(listener);
if (addonListeners.TryGetValue(listener.AddonName, out var addonListener))
{
addonListener.Remove(listener);
}
}
}
});
}
/// <summary>