diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index 47b52c4..aac0b9e 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -34,6 +34,11 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase private readonly ICallGateSubscriber _heelsOffsetUpdate; private readonly ICallGateSubscriber _heelsRegisterPlayer; private readonly ICallGateSubscriber _heelsUnregisterPlayer; + private readonly ICallGateSubscriber<(uint major, uint minor)> _honorificApiVersion; + private readonly ICallGateSubscriber _honorificClearCharacterTitle; + private readonly ICallGateSubscriber<(string Title, bool IsPrefix)> _honorificGetLocalCharacterTitle; + private readonly ICallGateSubscriber _honorificLocalCharacterTitleChanged; + private readonly ICallGateSubscriber _honorificSetCharacterTitle; private readonly ConcurrentQueue _normalQueue = new(); private readonly ICallGateSubscriber _palettePlusApiVersion; private readonly ICallGateSubscriber _palettePlusBuildCharaPalette; @@ -58,18 +63,13 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase private readonly FuncSubscriber _penumbraRemoveTemporaryMod; private readonly FuncSubscriber _penumbraResolveModDir; private readonly FuncSubscriber _penumbraResolvePaths; - private readonly ICallGateSubscriber<(uint major, uint minor)> _honorificApiVersion; - private readonly ICallGateSubscriber<(string Title, bool IsPrefix)> _honorificGetLocalCharacterTitle; - private readonly ICallGateSubscriber _honorificClearCharacterTitle; - private readonly ICallGateSubscriber _honorificSetCharacterTitle; - private readonly ICallGateSubscriber _honorificLocalCharacterTitleChanged; private bool _customizePlusAvailable = false; private CancellationTokenSource _disposalCts = new(); private bool _glamourerAvailable = false; private bool _heelsAvailable = false; + private bool _honorificAvailable = false; private bool _inGposeQueueMode = false; private bool _palettePlusAvailable = false; - private bool _honorificAvailable = false; private bool _penumbraAvailable = false; private bool _shownGlamourerUnavailable = false; private bool _shownPenumbraUnavailable = false; @@ -160,10 +160,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public bool CheckHeelsApi() => _heelsAvailable; - public bool CheckPalettePlusApi() => _palettePlusAvailable; - public bool CheckHonorificApi() => _honorificAvailable; + public bool CheckPalettePlusApi() => _palettePlusAvailable; + public bool CheckPenumbraApi() => _penumbraAvailable; public async Task CustomizePlusRevert(IntPtr character) @@ -289,7 +289,21 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase } }).ConfigureAwait(false); } - + + public async Task HonorificClearTitle(nint character) + { + if (!CheckHonorificApi()) return; + await _dalamudUtil.RunOnFrameworkThread(() => + { + var gameObj = _dalamudUtil.CreateGameObject(character); + if (gameObj is PlayerCharacter c) + { + Logger.LogTrace("Honorific removing for {addr}", c.Address.ToString("X")); + _honorificClearCharacterTitle!.InvokeAction(c); + } + }).ConfigureAwait(false); + } + public string HonorificGetTitle() { if (!CheckHonorificApi()) return string.Empty; @@ -312,26 +326,12 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase } else { - _honorificSetCharacterTitle!.InvokeAction(pc, honorificData[1..], honorificData[0] == '1'); + _honorificSetCharacterTitle!.InvokeAction(pc, honorificData[1..], honorificData[0] == '1'); } } }).ConfigureAwait(false); } - public async Task HonorificClearTitle(nint character) - { - if (!CheckHonorificApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => - { - var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is PlayerCharacter c) - { - Logger.LogTrace("Honorific removing for {addr}", c.Address.ToString("X")); - _honorificClearCharacterTitle!.InvokeAction(c); - } - }).ConfigureAwait(false); - } - public async Task PalettePlusBuildPalette() { if (!CheckPalettePlusApi()) return string.Empty; @@ -523,11 +523,11 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase } } - private bool CheckPalettePlusApiInternal() + private bool CheckHonorificApiInternal() { try { - return string.Equals(_palettePlusApiVersion.InvokeFunc(), "1.1.0", StringComparison.Ordinal); + return _honorificApiVersion.InvokeFunc() is { Item1: 1, Item2: >= 0 }; } catch { @@ -535,11 +535,11 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase } } - private bool CheckHonorificApiInternal() + private bool CheckPalettePlusApiInternal() { try { - return _honorificApiVersion.InvokeFunc() is { Item1: 1, Item2: >= 0 }; + return string.Equals(_palettePlusApiVersion.InvokeFunc(), "1.1.0", StringComparison.Ordinal); } catch { @@ -612,16 +612,16 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase Mediator.Publish(new CustomizePlusMessage()); } + private void OnHonorificLocalCharacterTitleChanged(string title, bool isPrefix) + { + Mediator.Publish(new HonorificMessage((isPrefix ? 0 : 1) + title)); + } + private void OnPalettePlusPaletteChange(Character character, string palette) { Mediator.Publish(new PalettePlusMessage(character)); } - private void OnHonorificLocalCharacterTitleChanged(string title, bool isPrefix) - { - Mediator.Publish(new HonorificMessage()); - } - private void PenumbraDispose() { _disposalCts.Cancel(); diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index 286243b..684bbff 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -62,10 +62,13 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase PalettePlusChanged(); } }); - Mediator.Subscribe(this, async (_) => + Mediator.Subscribe(this, (msg) => { - Logger.LogDebug("Received Honorific change, updating player"); - HonorificChanged(); + if (!string.Equals(msg.NewHonorificTitle, _playerData.HonorificData, StringComparison.Ordinal)) + { + Logger.LogDebug("Received Honorific change, updating player"); + HonorificChanged(); + } }); Mediator.Subscribe(this, async (msg) => { diff --git a/MareSynchronos/Services/Mediator/Messages.cs b/MareSynchronos/Services/Mediator/Messages.cs index 5afe307..544d761 100644 --- a/MareSynchronos/Services/Mediator/Messages.cs +++ b/MareSynchronos/Services/Mediator/Messages.cs @@ -35,7 +35,7 @@ public record HeelsOffsetMessage : IMessage; public record PenumbraResourceLoadMessage(IntPtr GameObject, string GamePath, string FilePath) : IMessage; public record CustomizePlusMessage : IMessage; public record PalettePlusMessage(Character Character) : IMessage; -public record HonorificMessage : IMessage; +public record HonorificMessage(string NewHonorificTitle) : IMessage; public record PlayerChangedMessage(API.Data.CharacterData Data) : IMessage; public record CharacterChangedMessage(GameObjectHandler GameObjectHandler) : IMessage; public record TransientResourceChangedMessage(IntPtr Address) : IMessage;