From ff73c016eb4f1f67ac0ce2341d1531c3f81abcd2 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Thu, 20 Apr 2023 11:53:42 +0200 Subject: [PATCH 1/4] fixes for vfx display in ui --- MareSynchronos/UI/Components/DrawUserPair.cs | 4 ++-- MareSynchronos/UI/Components/GroupPanel.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MareSynchronos/UI/Components/DrawUserPair.cs b/MareSynchronos/UI/Components/DrawUserPair.cs index ba534eb..2b6450b 100644 --- a/MareSynchronos/UI/Components/DrawUserPair.cs +++ b/MareSynchronos/UI/Components/DrawUserPair.cs @@ -229,8 +229,8 @@ public class DrawUserPair : DrawPairBase } var isDisableVFX = entry.UserPair!.OwnPermissions.IsDisableVFX(); - string disableVFXText = isDisableAnims ? "Enable VFX sync" : "Disable VFX sync"; - var disableVFXIcon = isDisableAnims ? FontAwesomeIcon.Sun : FontAwesomeIcon.Circle; + string disableVFXText = isDisableVFX ? "Enable VFX sync" : "Disable VFX sync"; + var disableVFXIcon = isDisableVFX ? FontAwesomeIcon.Sun : FontAwesomeIcon.Circle; if (UiSharedService.IconTextButton(disableVFXIcon, disableVFXText)) { var permissions = entry.UserPair.OwnPermissions; diff --git a/MareSynchronos/UI/Components/GroupPanel.cs b/MareSynchronos/UI/Components/GroupPanel.cs index 9187f48..e56db5f 100644 --- a/MareSynchronos/UI/Components/GroupPanel.cs +++ b/MareSynchronos/UI/Components/GroupPanel.cs @@ -626,7 +626,7 @@ internal sealed class GroupPanel + Environment.NewLine + "Note: this setting does not apply to individual pairs that are also in the syncshell."); var vfxText = userVFXDisabled ? "Enable VFX sync" : "Disable VFX sync"; - if (UiSharedService.IconTextButton(userAnimIcon, vfxText)) + if (UiSharedService.IconTextButton(userVFXIcon, vfxText)) { ImGui.CloseCurrentPopup(); var perm = groupDto.GroupUserPermissions; From 28b89f66f8775b1ac88f0216ea3b620ae491f5ad Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Thu, 20 Apr 2023 12:26:14 +0200 Subject: [PATCH 2/4] delay honorific changes to avoid serverspam --- .../PlayerData/Services/CacheCreationService.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index c8552c0..286243b 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -17,6 +17,7 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase private readonly CharacterData _playerData = new(); private readonly Dictionary _playerRelatedObjects = new(); private Task? _cacheCreationTask; + private CancellationTokenSource _honorificCts = new(); private CancellationTokenSource _palettePlusCts = new(); public CacheCreationService(ILogger logger, MareMediator mediator, Func, bool, GameObjectHandler> gameObjectHandlerFactory, @@ -64,7 +65,7 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase Mediator.Subscribe(this, async (_) => { Logger.LogDebug("Received Honorific change, updating player"); - await AddPlayerCacheToCreate().ConfigureAwait(false); + HonorificChanged(); }); Mediator.Subscribe(this, async (msg) => { @@ -97,6 +98,20 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase _cacheCreateLock.Release(); } + private void HonorificChanged() + { + _honorificCts?.Cancel(); + _honorificCts?.Dispose(); + _honorificCts = new(); + var token = _honorificCts.Token; + + Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(3), token).ConfigureAwait(false); + await AddPlayerCacheToCreate().ConfigureAwait(false); + }, token); + } + private void PalettePlusChanged() { _palettePlusCts?.Cancel(); From e4b3a79f2b863d0d3c429e3594221b860cb295d5 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Fri, 21 Apr 2023 10:53:57 +0200 Subject: [PATCH 3/4] do not update on honorific change when no change actually happened --- MareSynchronos/Interop/IpcManager.cs | 66 +++++++++---------- .../Services/CacheCreationService.cs | 9 ++- MareSynchronos/Services/Mediator/Messages.cs | 2 +- 3 files changed, 40 insertions(+), 37 deletions(-) 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; From a59318896ee2aad570785a14f1f79c366a1c802f Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Fri, 21 Apr 2023 10:55:53 +0200 Subject: [PATCH 4/4] wait for pair initialize --- MareSynchronos/PlayerData/Pairs/Pair.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MareSynchronos/PlayerData/Pairs/Pair.cs b/MareSynchronos/PlayerData/Pairs/Pair.cs index 864e30a..7630368 100644 --- a/MareSynchronos/PlayerData/Pairs/Pair.cs +++ b/MareSynchronos/PlayerData/Pairs/Pair.cs @@ -141,7 +141,7 @@ public class Pair ShownHonorificWarning = _configService.Current.DisableOptionalPluginWarnings, }; - CachedPlayer.Initialize(name); + CachedPlayer.Initialize(name).Wait(); ApplyLastReceivedData(); @@ -222,7 +222,7 @@ public class Pair data.FileReplacements[objectKind] = data.FileReplacements[objectKind] .Where(f => !f.GamePaths.Any(p => p.EndsWith("tmb", StringComparison.OrdinalIgnoreCase) || p.EndsWith("pap", StringComparison.OrdinalIgnoreCase))) .ToList(); - if(disableVFX) + if (disableVFX) data.FileReplacements[objectKind] = data.FileReplacements[objectKind] .Where(f => !f.GamePaths.Any(p => p.EndsWith("atex", StringComparison.OrdinalIgnoreCase) || p.EndsWith("avfx", StringComparison.OrdinalIgnoreCase))) .ToList();