Add IDutyState (#1275)

This commit is contained in:
MidoriKami 2023-06-24 21:03:47 -07:00 committed by GitHub
parent 7ab20e9125
commit 518fc348e1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 31 deletions

View file

@ -5,6 +5,7 @@ using Dalamud.Game.ClientState.Conditions;
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.IoC; using Dalamud.IoC;
using Dalamud.IoC.Internal; using Dalamud.IoC.Internal;
using Dalamud.Plugin.Services;
using Dalamud.Utility; using Dalamud.Utility;
namespace Dalamud.Game.DutyState; namespace Dalamud.Game.DutyState;
@ -15,7 +16,10 @@ namespace Dalamud.Game.DutyState;
[PluginInterface] [PluginInterface]
[InterfaceVersion("1.0")] [InterfaceVersion("1.0")]
[ServiceManager.EarlyLoadedService] [ServiceManager.EarlyLoadedService]
public unsafe class DutyState : IDisposable, IServiceType #pragma warning disable SA1015
[ResolveVia<IDutyState>]
#pragma warning restore SA1015
public unsafe class DutyState : IDisposable, IServiceType, IDutyState
{ {
private readonly DutyStateAddressResolver address; private readonly DutyStateAddressResolver address;
private readonly Hook<SetupContentDirectNetworkMessageDelegate> contentDirectorNetworkMessageHook; private readonly Hook<SetupContentDirectNetworkMessageDelegate> contentDirectorNetworkMessageHook;
@ -44,42 +48,24 @@ public unsafe class DutyState : IDisposable, IServiceType
[UnmanagedFunctionPointer(CallingConvention.ThisCall)] [UnmanagedFunctionPointer(CallingConvention.ThisCall)]
private delegate byte SetupContentDirectNetworkMessageDelegate(IntPtr a1, IntPtr a2, ushort* a3); private delegate byte SetupContentDirectNetworkMessageDelegate(IntPtr a1, IntPtr a2, ushort* a3);
/// <summary> /// <inheritdoc/>
/// Event that gets fired when the duty starts. Triggers when the "Duty Start"
/// message displays, and on the remove of the ring at duty's spawn.
/// </summary>
public event EventHandler<ushort> DutyStarted; public event EventHandler<ushort> DutyStarted;
/// <summary> /// <inheritdoc/>
/// Event that gets fired when everyone in the party dies and the screen fades to black.
/// </summary>
public event EventHandler<ushort> DutyWiped; public event EventHandler<ushort> DutyWiped;
/// <summary> /// <inheritdoc/>
/// Event that gets fired when the "Duty Recommence" message displays,
/// and on the remove the the ring at duty's spawn.
/// </summary>
public event EventHandler<ushort> DutyRecommenced; public event EventHandler<ushort> DutyRecommenced;
/// <summary> /// <inheritdoc/>
/// Event that gets fired when the duty is completed successfully.
/// </summary>
public event EventHandler<ushort> DutyCompleted; public event EventHandler<ushort> DutyCompleted;
/// <summary> /// <inheritdoc/>
/// Gets a value indicating whether the current duty has been started.
/// </summary>
public bool IsDutyStarted { get; private set; } public bool IsDutyStarted { get; private set; }
/// <summary>
/// Gets or sets a value indicating whether the current duty has been completed or not.
/// Prevents DutyStarted from triggering if combat is entered after receiving a duty complete network event.
/// </summary>
private bool CompletedThisTerritory { get; set; } private bool CompletedThisTerritory { get; set; }
/// <summary> /// <inheritdoc/>
/// Dispose of managed and unmanaged resources.
/// </summary>
void IDisposable.Dispose() void IDisposable.Dispose()
{ {
this.contentDirectorNetworkMessageHook.Dispose(); this.contentDirectorNetworkMessageHook.Dispose();
@ -171,9 +157,6 @@ public unsafe class DutyState : IDisposable, IServiceType
else if (!this.IsBoundByDuty() && this.IsDutyStarted) else if (!this.IsBoundByDuty() && this.IsDutyStarted)
{ {
this.IsDutyStarted = false; this.IsDutyStarted = false;
// Could potentially add a call to DutyCompleted here since this
// should only be reached if we are actually no longer in a duty, and missed the network event.
} }
} }

View file

@ -0,0 +1,36 @@
using System;
namespace Dalamud.Plugin.Services;
/// <summary>
/// This class represents the state of the currently occupied duty.
/// </summary>
public interface IDutyState
{
/// <summary>
/// Event that gets fired when the duty starts.
/// Triggers when the "Duty Start" message displays, and on the removal of the ring at duty's spawn.
/// Does not trigger when loading into a duty that was in progress, or from loading in after a disconnect.
/// </summary>
public event EventHandler<ushort> DutyStarted;
/// <summary>
/// Event that gets fired when everyone in the party dies and the screen fades to black.
/// </summary>
public event EventHandler<ushort> DutyWiped;
/// <summary>
/// Event that gets fired when the "Duty Recommence" message displays, and on the removal of the ring at duty's spawn.
/// </summary>
public event EventHandler<ushort> DutyRecommenced;
/// <summary>
/// Event that gets fired when the duty is completed successfully.
/// </summary>
public event EventHandler<ushort> DutyCompleted;
/// <summary>
/// Gets a value indicating whether the current duty has been started.
/// </summary>
public bool IsDutyStarted { get; }
}