diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index 5b25b0e..f72a2be 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -114,6 +114,8 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase _glamourerRevertByName = pi.GetIpcSubscriber("Glamourer.RevertLock"); _glamourerUnlock = pi.GetIpcSubscriber("Glamourer.UnlockName"); + pi.GetIpcSubscriber, object?>("Glamourer.StateChanged").Subscribe((type, address, customize) => GlamourerChanged(address)); + _heelsGetApiVersion = pi.GetIpcSubscriber<(int, int)>("SimpleHeels.ApiVersion"); _heelsGetOffset = pi.GetIpcSubscriber("SimpleHeels.GetLocalPlayer"); _heelsRegisterPlayer = pi.GetIpcSubscriber("SimpleHeels.RegisterPlayer"); @@ -755,6 +757,11 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase return _penumbraResolveModDir!.Invoke().ToLowerInvariant(); } + private void GlamourerChanged(nint address) + { + Mediator.Publish(new GlamourerChangedMessage(address)); + } + private void HeelsOffsetChange(string offset) { Mediator.Publish(new HeelsOffsetMessage()); diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index 3790bf6..af27036 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -22,6 +22,7 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase private CancellationTokenSource _honorificCts = new(); private bool _isZoning = false; private CancellationTokenSource _palettePlusCts = new(); + private readonly Dictionary _glamourerCts = new(); public CacheCreationService(ILogger logger, MareMediator mediator, GameObjectHandlerFactory gameObjectHandlerFactory, PlayerDataFactory characterDataFactory, DalamudUtilService dalamudUtil) : base(logger, mediator) @@ -90,6 +91,15 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase Logger.LogDebug("Received Heels Offset change, updating player"); await AddPlayerCacheToCreate().ConfigureAwait(false); }); + Mediator.Subscribe(this, async (msg) => + { + if (_isZoning) return; + var changedType = _playerRelatedObjects.FirstOrDefault(f => f.Value.Address == msg.Address); + if (!default(KeyValuePair).Equals(changedType)) + { + GlamourerChanged(changedType.Key); + } + }); Mediator.Subscribe(this, (msg) => { if (_isZoning) return; @@ -132,6 +142,23 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase _cacheCreateLock.Release(); } + private void GlamourerChanged(ObjectKind kind) + { + if (_glamourerCts.TryGetValue(kind, out var cts)) + { + _glamourerCts[kind]?.Cancel(); + _glamourerCts[kind]?.Dispose(); + } + _glamourerCts[kind] = new(); + var token = _glamourerCts[kind].Token; + + _ = Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(1), token).ConfigureAwait(false); + await AddPlayerCacheToCreate(kind).ConfigureAwait(false); + }); + } + private void HonorificChanged() { _honorificCts?.Cancel(); diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 67a9665..9b6558d 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -80,7 +80,8 @@ public sealed class Plugin : IDalamudPlugin collection.AddSingleton(); collection.AddSingleton((s) => new PairHandlerFactory(s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), - s.GetRequiredService(), CancellationTokenSource.CreateLinkedTokenSource(addonLifecycle.GameShuttingDownToken, addonLifecycle.DalamudUnloadingToken).Token, + s.GetRequiredService(), + CancellationTokenSource.CreateLinkedTokenSource(addonLifecycle.GameShuttingDownToken, addonLifecycle.DalamudUnloadingToken).Token, s.GetRequiredService(), s.GetRequiredService())); collection.AddSingleton(); collection.AddSingleton(); diff --git a/MareSynchronos/Services/Mediator/Messages.cs b/MareSynchronos/Services/Mediator/Messages.cs index 62df5eb..2650c40 100644 --- a/MareSynchronos/Services/Mediator/Messages.cs +++ b/MareSynchronos/Services/Mediator/Messages.cs @@ -34,6 +34,7 @@ public record PenumbraModSettingChangedMessage : MessageBase; public record PenumbraInitializedMessage : MessageBase; public record PenumbraDisposedMessage : MessageBase; public record PenumbraRedrawMessage(IntPtr Address, int ObjTblIdx, bool WasRequested) : SameThreadMessage; +public record GlamourerChangedMessage(IntPtr Address) : MessageBase; public record HeelsOffsetMessage : MessageBase; public record PenumbraResourceLoadMessage(IntPtr GameObject, string GamePath, string FilePath) : SameThreadMessage; public record CustomizePlusMessage(string ProfileName) : MessageBase;