Merge remote-tracking branch 'origin/master' into v9-rollup

This commit is contained in:
github-actions[bot] 2023-09-17 21:52:26 +00:00
commit 33868087ed
9 changed files with 687 additions and 78 deletions

View file

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Dalamud.Memory;
using FFXIVClientStructs.FFXIV.Component.GUI;
using Dalamud.Game.AddonLifecycle;
namespace Dalamud.Plugin.Services;
@ -11,35 +11,70 @@ namespace Dalamud.Plugin.Services;
public interface IAddonLifecycle
{
/// <summary>
/// Event that fires before an addon is being setup.
/// Delegate for receiving addon lifecycle event messages.
/// </summary>
public event Action<AddonArgs> AddonPreSetup;
/// <param name="eventType">The event type that triggered the message.</param>
/// <param name="addonInfo">Information about what addon triggered the message.</param>
public delegate void AddonEventDelegate(AddonEvent eventType, AddonArgs addonInfo);
/// <summary>
/// Event that fires after an addon is done being setup.
/// Register a listener that will trigger on the specified event and any of the specified addons.
/// </summary>
public event Action<AddonArgs> AddonPostSetup;
/// <param name="eventType">Event type to trigger on.</param>
/// <param name="addonNames">Addon names that will trigger the handler to be invoked.</param>
/// <param name="handler">The handler to invoke.</param>
void RegisterListener(AddonEvent eventType, IEnumerable<string> addonNames, AddonEventDelegate handler);
/// <summary>
/// Event that fires before an addon is being finalized.
/// Register a listener that will trigger on the specified event only for the specified addon.
/// </summary>
public event Action<AddonArgs> AddonPreFinalize;
/// <param name="eventType">Event type to trigger on.</param>
/// <param name="addonName">The addon name that will trigger the handler to be invoked.</param>
/// <param name="handler">The handler to invoke.</param>
void RegisterListener(AddonEvent eventType, string addonName, AddonEventDelegate handler);
/// <summary>
/// Addon argument data for use in event subscribers.
/// Register a listener that will trigger on the specified event for any addon.
/// </summary>
public unsafe class AddonArgs
{
private string? addonName;
/// <summary>
/// Gets the name of the addon this args referrers to.
/// </summary>
public string AddonName => this.Addon == nint.Zero ? "NullAddon" : this.addonName ??= MemoryHelper.ReadString((nint)((AtkUnitBase*)this.Addon)->Name, 0x20);
/// <summary>
/// Gets the pointer to the addons AtkUnitBase.
/// </summary>
required public nint Addon { get; init; }
}
/// <param name="eventType">Event type to trigger on.</param>
/// <param name="handler">The handler to invoke.</param>
void RegisterListener(AddonEvent eventType, AddonEventDelegate handler);
/// <summary>
/// Unregister listener from specified event type and specified addon names.
/// </summary>
/// <remarks>
/// If a specific handler is not provided, all handlers for the event type and addon names will be unregistered.
/// </remarks>
/// <param name="eventType">Event type to deregister.</param>
/// <param name="addonNames">Addon names to deregister.</param>
/// <param name="handler">Optional specific handler to remove.</param>
void UnregisterListener(AddonEvent eventType, IEnumerable<string> addonNames, [Optional] AddonEventDelegate handler);
/// <summary>
/// Unregister all listeners for the specified event type and addon name.
/// </summary>
/// <remarks>
/// If a specific handler is not provided, all handlers for the event type and addons will be unregistered.
/// </remarks>
/// <param name="eventType">Event type to deregister.</param>
/// <param name="addonName">Addon name to deregister.</param>
/// <param name="handler">Optional specific handler to remove.</param>
void UnregisterListener(AddonEvent eventType, string addonName, [Optional] AddonEventDelegate handler);
/// <summary>
/// Unregister an event type handler.<br/>This will only remove a handler that is added via <see cref="RegisterListener(AddonEvent, AddonEventDelegate)"/>.
/// </summary>
/// <remarks>
/// If a specific handler is not provided, all handlers for the event type and addons will be unregistered.
/// </remarks>
/// <param name="eventType">Event type to deregister.</param>
/// <param name="handler">Optional specific handler to remove.</param>
void UnregisterListener(AddonEvent eventType, [Optional] AddonEventDelegate handler);
/// <summary>
/// Unregister all events that use the specified handlers.
/// </summary>
/// <param name="handlers">Handlers to remove.</param>
void UnregisterListener(params AddonEventDelegate[] handlers);
}