diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index 4fca4cb..27e6ae8 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -36,11 +36,11 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase private readonly ICallGateSubscriber _heelsUnregisterPlayer; private readonly ICallGateSubscriber<(uint major, uint minor)> _honorificApiVersion; private readonly ICallGateSubscriber _honorificClearCharacterTitle; + private readonly ICallGateSubscriber _honorificDisposing; private readonly ICallGateSubscriber _honorificGetLocalCharacterTitle; private readonly ICallGateSubscriber _honorificLocalCharacterTitleChanged; - private readonly ICallGateSubscriber _honorificSetCharacterTitle; - private readonly ICallGateSubscriber _honorificDisposing; private readonly ICallGateSubscriber _honorificReady; + private readonly ICallGateSubscriber _honorificSetCharacterTitle; private readonly ConcurrentQueue _normalQueue = new(); private readonly ICallGateSubscriber _palettePlusApiVersion; private readonly ICallGateSubscriber _palettePlusBuildCharaPalette; @@ -155,6 +155,8 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase Mediator.Subscribe(this, (_) => HandleGposeActionQueue()); Mediator.Subscribe(this, (_) => ClearActionQueue()); Mediator.Subscribe(this, (_) => PeriodicApiStateCheck()); + + PeriodicApiStateCheck(); } public bool Initialized => CheckPenumbraApiInternal() && CheckGlamourerApiInternal(); @@ -337,22 +339,29 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase { if (!CheckHonorificApi()) return; Logger.LogTrace("Applying Honorific data to {chara}", character.ToString("X")); - await _dalamudUtil.RunOnFrameworkThread(() => + try { - var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is PlayerCharacter pc) + await _dalamudUtil.RunOnFrameworkThread(() => { - string honorificData = string.IsNullOrEmpty(honorificDataB64) ? string.Empty : Encoding.UTF8.GetString(Convert.FromBase64String(honorificDataB64)); - if (string.IsNullOrEmpty(honorificData)) + var gameObj = _dalamudUtil.CreateGameObject(character); + if (gameObj is PlayerCharacter pc) { - _honorificClearCharacterTitle!.InvokeAction(pc); + string honorificData = string.IsNullOrEmpty(honorificDataB64) ? string.Empty : Encoding.UTF8.GetString(Convert.FromBase64String(honorificDataB64)); + if (string.IsNullOrEmpty(honorificData)) + { + _honorificClearCharacterTitle!.InvokeAction(pc); + } + else + { + _honorificSetCharacterTitle!.InvokeAction(pc, honorificData); + } } - else - { - _honorificSetCharacterTitle!.InvokeAction(pc, honorificData); - } - } - }).ConfigureAwait(false); + }).ConfigureAwait(false); + } + catch (Exception e) + { + Logger.LogWarning(e, "Could not apply Honorific data"); + } } public async Task PalettePlusBuildPaletteAsync() @@ -645,17 +654,17 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase Mediator.Publish(new CustomizePlusMessage()); } + private void OnHonorificDisposing() + { + Mediator.Publish(new HonorificMessage(string.Empty)); + } + private void OnHonorificLocalCharacterTitleChanged(string titleJson) { string titleData = string.IsNullOrEmpty(titleJson) ? string.Empty : Convert.ToBase64String(Encoding.UTF8.GetBytes(titleJson)); Mediator.Publish(new HonorificMessage(titleData)); } - private void OnHonorificDisposing() - { - Mediator.Publish(new HonorificMessage(string.Empty)); - } - private void OnHonorificReady() { _honorificAvailable = CheckHonorificApiInternal(); diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index da48de2..dd13db0 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -535,11 +535,11 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase _lastGlamourerData = await _ipcManager.GlamourerGetCharacterCustomizationAsync(PlayerCharacter).ConfigureAwait(false); } }); - Mediator.Subscribe(this, async (_) => + Mediator.Subscribe(this, async (_) => { if (string.IsNullOrEmpty(_cachedData?.HonorificData)) return; Logger.LogTrace("Reapplying Honorific data for {this}", this); - await _ipcManager.HonorificSetTitleAsync(PlayerCharacter, _cachedData.HonorificData).ConfigureAwait(false); + await _ipcManager.HonorificSetTitleAsync(PlayerCharacter, _cachedData.HonorificData).ConfigureAwait(false); }); _downloadManager.Initialize(); diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index 685d7fa..bbf859b 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -332,7 +332,15 @@ public class DalamudUtilService : IHostedService private unsafe void FrameworkOnUpdateInternal() { - if (_clientState.LocalPlayer?.IsDead ?? false) return; + if (_clientState.LocalPlayer == null) + { + return; + } + + if (_clientState.LocalPlayer?.IsDead ?? false) + { + return; + } IsAnythingDrawing = false; _playerCharas = _performanceCollector.LogPerformance(this, "ObjTableToCharas",