mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
Add DutyStatePluginScoped (#1382)
This commit is contained in:
parent
abf7c243e4
commit
d96175ed16
3 changed files with 74 additions and 27 deletions
|
|
@ -1,25 +1,19 @@
|
||||||
using System;
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
using Dalamud.Game.ClientState.Conditions;
|
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.Plugin.Services;
|
||||||
using Dalamud.Utility;
|
|
||||||
|
|
||||||
namespace Dalamud.Game.DutyState;
|
namespace Dalamud.Game.DutyState;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents the state of the currently occupied duty.
|
/// This class represents the state of the currently occupied duty.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PluginInterface]
|
|
||||||
[InterfaceVersion("1.0")]
|
[InterfaceVersion("1.0")]
|
||||||
[ServiceManager.EarlyLoadedService]
|
[ServiceManager.EarlyLoadedService]
|
||||||
#pragma warning disable SA1015
|
internal unsafe class DutyState : IDisposable, IServiceType, IDutyState
|
||||||
[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;
|
||||||
|
|
@ -49,16 +43,16 @@ public unsafe class DutyState : IDisposable, IServiceType, IDutyState
|
||||||
private delegate byte SetupContentDirectNetworkMessageDelegate(IntPtr a1, IntPtr a2, ushort* a3);
|
private delegate byte SetupContentDirectNetworkMessageDelegate(IntPtr a1, IntPtr a2, ushort* a3);
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public event EventHandler<ushort> DutyStarted;
|
public event EventHandler<ushort>? DutyStarted;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public event EventHandler<ushort> DutyWiped;
|
public event EventHandler<ushort>? DutyWiped;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public event EventHandler<ushort> DutyRecommenced;
|
public event EventHandler<ushort>? DutyRecommenced;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public event EventHandler<ushort> DutyCompleted;
|
public event EventHandler<ushort>? DutyCompleted;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public bool IsDutyStarted { get; private set; }
|
public bool IsDutyStarted { get; private set; }
|
||||||
|
|
@ -66,7 +60,7 @@ public unsafe class DutyState : IDisposable, IServiceType, IDutyState
|
||||||
private bool CompletedThisTerritory { get; set; }
|
private bool CompletedThisTerritory { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
void IDisposable.Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
this.contentDirectorNetworkMessageHook.Dispose();
|
this.contentDirectorNetworkMessageHook.Dispose();
|
||||||
this.framework.Update -= this.FrameworkOnUpdateEvent;
|
this.framework.Update -= this.FrameworkOnUpdateEvent;
|
||||||
|
|
@ -92,33 +86,33 @@ public unsafe class DutyState : IDisposable, IServiceType, IDutyState
|
||||||
// Duty Commenced
|
// Duty Commenced
|
||||||
case 0x4000_0001:
|
case 0x4000_0001:
|
||||||
this.IsDutyStarted = true;
|
this.IsDutyStarted = true;
|
||||||
this.DutyStarted.InvokeSafely(this, this.clientState.TerritoryType);
|
this.DutyStarted?.Invoke(this, this.clientState.TerritoryType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Party Wipe
|
// Party Wipe
|
||||||
case 0x4000_0005:
|
case 0x4000_0005:
|
||||||
this.IsDutyStarted = false;
|
this.IsDutyStarted = false;
|
||||||
this.DutyWiped.InvokeSafely(this, this.clientState.TerritoryType);
|
this.DutyWiped?.Invoke(this, this.clientState.TerritoryType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Duty Recommence
|
// Duty Recommence
|
||||||
case 0x4000_0006:
|
case 0x4000_0006:
|
||||||
this.IsDutyStarted = true;
|
this.IsDutyStarted = true;
|
||||||
this.DutyRecommenced.InvokeSafely(this, this.clientState.TerritoryType);
|
this.DutyRecommenced?.Invoke(this, this.clientState.TerritoryType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Duty Completed Flytext Shown
|
// Duty Completed Flytext Shown
|
||||||
case 0x4000_0002 when !this.CompletedThisTerritory:
|
case 0x4000_0002 when !this.CompletedThisTerritory:
|
||||||
this.IsDutyStarted = false;
|
this.IsDutyStarted = false;
|
||||||
this.CompletedThisTerritory = true;
|
this.CompletedThisTerritory = true;
|
||||||
this.DutyCompleted.InvokeSafely(this, this.clientState.TerritoryType);
|
this.DutyCompleted?.Invoke(this, this.clientState.TerritoryType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Duty Completed
|
// Duty Completed
|
||||||
case 0x4000_0003 when !this.CompletedThisTerritory:
|
case 0x4000_0003 when !this.CompletedThisTerritory:
|
||||||
this.IsDutyStarted = false;
|
this.IsDutyStarted = false;
|
||||||
this.CompletedThisTerritory = true;
|
this.CompletedThisTerritory = true;
|
||||||
this.DutyCompleted.InvokeSafely(this, this.clientState.TerritoryType);
|
this.DutyCompleted?.Invoke(this, this.clientState.TerritoryType);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -161,11 +155,68 @@ public unsafe class DutyState : IDisposable, IServiceType, IDutyState
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsBoundByDuty()
|
private bool IsBoundByDuty()
|
||||||
|
=> this.condition.Any(ConditionFlag.BoundByDuty,
|
||||||
|
ConditionFlag.BoundByDuty56,
|
||||||
|
ConditionFlag.BoundByDuty95);
|
||||||
|
|
||||||
|
private bool IsInCombat()
|
||||||
|
=> this.condition.Any(ConditionFlag.InCombat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Plugin scoped version of DutyState.
|
||||||
|
/// </summary>
|
||||||
|
[PluginInterface]
|
||||||
|
[InterfaceVersion("1.0")]
|
||||||
|
[ServiceManager.ScopedService]
|
||||||
|
#pragma warning disable SA1015
|
||||||
|
[ResolveVia<IDutyState>]
|
||||||
|
#pragma warning restore SA1015
|
||||||
|
internal class DutyStatePluginScoped : IDisposable, IServiceType, IDutyState
|
||||||
|
{
|
||||||
|
[ServiceManager.ServiceDependency]
|
||||||
|
private readonly DutyState dutyStateService = Service<DutyState>.Get();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="DutyStatePluginScoped"/> class.
|
||||||
|
/// </summary>
|
||||||
|
internal DutyStatePluginScoped()
|
||||||
{
|
{
|
||||||
return this.condition[ConditionFlag.BoundByDuty] ||
|
this.dutyStateService.DutyStarted += this.DutyStartedForward;
|
||||||
this.condition[ConditionFlag.BoundByDuty56] ||
|
this.dutyStateService.DutyWiped += this.DutyWipedForward;
|
||||||
this.condition[ConditionFlag.BoundByDuty95];
|
this.dutyStateService.DutyRecommenced += this.DutyRecommencedForward;
|
||||||
|
this.dutyStateService.DutyCompleted += this.DutyCompletedForward;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsInCombat() => this.condition[ConditionFlag.InCombat];
|
/// <inheritdoc/>
|
||||||
|
public event EventHandler<ushort>? DutyStarted;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public event EventHandler<ushort>? DutyWiped;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public event EventHandler<ushort>? DutyRecommenced;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public event EventHandler<ushort>? DutyCompleted;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public bool IsDutyStarted => this.dutyStateService.IsDutyStarted;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
this.dutyStateService.DutyStarted -= this.DutyStartedForward;
|
||||||
|
this.dutyStateService.DutyWiped -= this.DutyWipedForward;
|
||||||
|
this.dutyStateService.DutyRecommenced -= this.DutyRecommencedForward;
|
||||||
|
this.dutyStateService.DutyCompleted -= this.DutyCompletedForward;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DutyStartedForward(object sender, ushort territoryId) => this.DutyStarted?.Invoke(sender, territoryId);
|
||||||
|
|
||||||
|
private void DutyWipedForward(object sender, ushort territoryId) => this.DutyWiped?.Invoke(sender, territoryId);
|
||||||
|
|
||||||
|
private void DutyRecommencedForward(object sender, ushort territoryId) => this.DutyRecommenced?.Invoke(sender, territoryId);
|
||||||
|
|
||||||
|
private void DutyCompletedForward(object sender, ushort territoryId) => this.DutyCompleted?.Invoke(sender, territoryId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Dalamud.Game.DutyState;
|
namespace Dalamud.Game.DutyState;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
using System;
|
namespace Dalamud.Plugin.Services;
|
||||||
|
|
||||||
namespace Dalamud.Plugin.Services;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents the state of the currently occupied duty.
|
/// This class represents the state of the currently occupied duty.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue