From 75f88d51043fa6fbe2592888e23a858e24300eae Mon Sep 17 00:00:00 2001 From: t0w0bi Date: Wed, 24 Sep 2025 20:37:12 +0100 Subject: [PATCH] Potential fix for Honorific throwing away data. Still testing efficacy. --- .../Interop/Ipc/IpcCallerHonorific.cs | 19 +++++++++++++++++++ MareSynchronos/MareSynchronos.csproj | 2 +- .../PlayerData/Handlers/PairHandler.cs | 9 +++++---- MareSynchronos/Utils/VariousExtensions.cs | 4 ++-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs b/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs index a4b39e7..926634e 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs @@ -14,6 +14,7 @@ public sealed class IpcCallerHonorific : IIpcCaller private readonly ICallGateSubscriber _honorificClearCharacterTitle; private readonly ICallGateSubscriber _honorificDisposing; private readonly ICallGateSubscriber _honorificGetLocalCharacterTitle; + private readonly ICallGateSubscriber _honorificGetCharacterTitle; private readonly ICallGateSubscriber _honorificLocalCharacterTitleChanged; private readonly ICallGateSubscriber _honorificReady; private readonly ICallGateSubscriber _honorificSetCharacterTitle; @@ -29,6 +30,7 @@ public sealed class IpcCallerHonorific : IIpcCaller _dalamudUtil = dalamudUtil; _honorificApiVersion = pi.GetIpcSubscriber<(uint, uint)>("Honorific.ApiVersion"); _honorificGetLocalCharacterTitle = pi.GetIpcSubscriber("Honorific.GetLocalCharacterTitle"); + _honorificGetCharacterTitle = pi.GetIpcSubscriber("Honorific.GetCharacterTitle"); _honorificClearCharacterTitle = pi.GetIpcSubscriber("Honorific.ClearCharacterTitle"); _honorificSetCharacterTitle = pi.GetIpcSubscriber("Honorific.SetCharacterTitle"); _honorificLocalCharacterTitleChanged = pi.GetIpcSubscriber("Honorific.LocalCharacterTitleChanged"); @@ -84,6 +86,23 @@ public sealed class IpcCallerHonorific : IIpcCaller return string.IsNullOrEmpty(title) ? string.Empty : Convert.ToBase64String(Encoding.UTF8.GetBytes(title)); } + public async Task GetTitleForPlayer(IntPtr character) + { + if (!APIAvailable) return string.Empty; + + string title = await _dalamudUtil.RunOnFrameworkThread(() => + { + var gameObj = _dalamudUtil.CreateGameObject(character); + if (gameObj is IPlayerCharacter pc) + { + return _honorificGetCharacterTitle.InvokeFunc(pc.ObjectIndex); + } + return string.Empty; + }).ConfigureAwait(false); + + return string.IsNullOrEmpty(title) ? string.Empty : Convert.ToBase64String(Encoding.UTF8.GetBytes(title)); + } + public async Task SetTitleAsync(IntPtr character, string honorificDataB64) { if (!APIAvailable) return; diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 7cc4d52..265c54e 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -2,7 +2,7 @@ ClubPenguinSync - 1.7.1.3 + 1.7.1.4 https://github.com/Rawrington/ClubPenguinSync/ diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index e4180f7..737a7e1 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -149,7 +149,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase public string? PlayerName { get; private set; } public string PlayerNameHash => Pair.Ident; - public void ApplyCharacterData(Guid applicationBase, CharacterData characterData, bool forceApplyCustomization = false) + public async void ApplyCharacterData(Guid applicationBase, CharacterData characterData, bool forceApplyCustomization = false) { if (_configService.Current.HoldCombatApplication && _dalamudUtil.IsInCombatOrPerforming) { @@ -175,7 +175,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase Logger.LogDebug("[BASE-{appBase}] Received data but player was in invalid state, charaHandlerIsNull: {charaIsNull}, playerPointerIsNull: {ptrIsNull}", applicationBase, _charaHandler == null, PlayerCharacter == IntPtr.Zero); var hasDiffMods = characterData.CheckUpdatedData(applicationBase, _cachedData, Logger, - this, forceApplyCustomization, forceApplyMods: false) + this, forceApplyCustomization, forceApplyMods: false, string.Empty) .Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles)); _forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null); _cachedData = characterData; @@ -201,7 +201,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase $"Not applying character data: {reasons}"))); Logger.LogDebug("[BASE-{appBase}] Not applying due to hold: {reasons}", applicationBase, reasons); var hasDiffMods = characterData.CheckUpdatedData(applicationBase, _cachedData, Logger, - this, forceApplyCustomization, forceApplyMods: false) + this, forceApplyCustomization, forceApplyMods: false, _ipcManager.Honorific.GetTitleForPlayer(PlayerCharacter).GetAwaiter().GetResult()) .Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles)); _forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null); _cachedData = characterData; @@ -228,7 +228,8 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase _forceApplyMods |= forceApplyCustomization; - var charaDataToUpdate = characterData.CheckUpdatedData(applicationBase, _cachedData?.DeepClone() ?? new(), Logger, this, forceApplyCustomization, _forceApplyMods); + string oldHonorificTitle = _ipcManager.Honorific.GetTitleForPlayer(PlayerCharacter).GetAwaiter().GetResult(); + var charaDataToUpdate = characterData.CheckUpdatedData(applicationBase, _cachedData?.DeepClone() ?? new(), Logger, this, forceApplyCustomization, _forceApplyMods, oldHonorificTitle); if (_charaHandler != null && _forceApplyMods) { diff --git a/MareSynchronos/Utils/VariousExtensions.cs b/MareSynchronos/Utils/VariousExtensions.cs index c916593..85e4527 100644 --- a/MareSynchronos/Utils/VariousExtensions.cs +++ b/MareSynchronos/Utils/VariousExtensions.cs @@ -56,7 +56,7 @@ public static class VariousExtensions } public static Dictionary> CheckUpdatedData(this CharacterData newData, Guid applicationBase, - CharacterData? oldData, ILogger logger, PairHandler cachedPlayer, bool forceApplyCustomization, bool forceApplyMods) + CharacterData? oldData, ILogger logger, PairHandler cachedPlayer, bool forceApplyCustomization, bool forceApplyMods, string oldHonorificData) { oldData ??= new(); var charaDataToUpdate = new Dictionary>(); @@ -182,7 +182,7 @@ public static class VariousExtensions charaDataToUpdate[objectKind].Add(PlayerChanges.Heels); } - bool honorificDataDifferent = !string.Equals(oldData.HonorificData, newData.HonorificData, StringComparison.Ordinal); + bool honorificDataDifferent = !string.Equals(oldHonorificData, newData.HonorificData, StringComparison.Ordinal); if (honorificDataDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newData.HonorificData))) { logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (Diff honorific data) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.Honorific);