diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index d124a1c..d430687 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -581,7 +581,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase private void OnPalettePlusPaletteChange(Character character, string palette) { - Mediator.Publish(new PalettePlusMessage()); + Mediator.Publish(new PalettePlusMessage(character)); } private void PenumbraDispose() diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index a5454f7..25cf3bb 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.8.3 + 0.8.4 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index c50f8b9..c8d040e 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -15,7 +15,7 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase private readonly PlayerDataFactory _characterDataFactory; private readonly CancellationTokenSource _cts = new(); private readonly CharacterData _playerData = new(); - private readonly List _playerRelatedObjects = new(); + private readonly Dictionary _playerRelatedObjects = new(); private Task? _cacheCreationTask; private CancellationTokenSource _palettePlusCts = new(); @@ -24,21 +24,23 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase { _characterDataFactory = characterDataFactory; + _playerRelatedObjects[ObjectKind.Player] = + gameObjectHandlerFactory(ObjectKind.Player, () => dalamudUtil.PlayerPointer, true); + _playerRelatedObjects[ObjectKind.MinionOrMount] = + gameObjectHandlerFactory(ObjectKind.Player, () => dalamudUtil.GetMinionOrMount(), true); + _playerRelatedObjects[ObjectKind.Pet] = + gameObjectHandlerFactory(ObjectKind.Pet, () => dalamudUtil.GetPet(), true); + _playerRelatedObjects[ObjectKind.Companion] = + gameObjectHandlerFactory(ObjectKind.Companion, () => dalamudUtil.GetCompanion(), true); + Mediator.Subscribe(this, (msg) => { + Logger.LogDebug("Received CreateCacheForObject for {handler}, updating player", msg.ObjectToCreateFor); _cacheCreateLock.Wait(); _cachesToCreate[msg.ObjectToCreateFor.ObjectKind] = msg.ObjectToCreateFor; _cacheCreateLock.Release(); }); - _playerRelatedObjects.AddRange(new List() - { - gameObjectHandlerFactory(ObjectKind.Player, () => dalamudUtil.PlayerPointer, true), - gameObjectHandlerFactory(ObjectKind.MinionOrMount, () => dalamudUtil.GetMinionOrMount(), true), - gameObjectHandlerFactory(ObjectKind.Pet, () => dalamudUtil.GetPet(), true), - gameObjectHandlerFactory(ObjectKind.Companion, () => dalamudUtil.GetCompanion(), true), - }); - Mediator.Subscribe(this, (msg) => { Task.Run(() => @@ -50,24 +52,43 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase }); Mediator.Subscribe(this, (msg) => ProcessCacheCreation()); - Mediator.Subscribe(this, async (_) => await AddPlayerCacheToCreate().ConfigureAwait(false)); - Mediator.Subscribe(this, async (_) => await AddPlayerCacheToCreate().ConfigureAwait(false)); - Mediator.Subscribe(this, (_) => PalettePlusChanged()); - Mediator.Subscribe(this, async (msg) => await AddPlayerCacheToCreate().ConfigureAwait(false)); + Mediator.Subscribe(this, async (_) => + { + Logger.LogDebug("Received CustomizePlus change, updating player"); + await AddPlayerCacheToCreate().ConfigureAwait(false); + }); + Mediator.Subscribe(this, async (_) => + { + Logger.LogDebug("Received Heels Offset change, updating player"); + await AddPlayerCacheToCreate().ConfigureAwait(false); + }); + Mediator.Subscribe(this, (msg) => + { + if (msg.Character.Address == _playerRelatedObjects[ObjectKind.Player].Address) + { + Logger.LogDebug("Received PalettePlus change, updating player"); + PalettePlusChanged(); + } + }); + Mediator.Subscribe(this, async (msg) => + { + Logger.LogDebug("Received Penumbra Mod settings change, updating player"); + await AddPlayerCacheToCreate().ConfigureAwait(false); + }); } protected override void Dispose(bool disposing) { base.Dispose(disposing); - _playerRelatedObjects.ForEach(p => p.Dispose()); + _playerRelatedObjects.Values.ToList().ForEach(p => p.Dispose()); _cts.Dispose(); } private async Task AddPlayerCacheToCreate() { await _cacheCreateLock.WaitAsync().ConfigureAwait(false); - _cachesToCreate[ObjectKind.Player] = _playerRelatedObjects.First(p => p.ObjectKind == ObjectKind.Player); + _cachesToCreate[ObjectKind.Player] = _playerRelatedObjects[ObjectKind.Player]; _cacheCreateLock.Release(); } diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index 36ff33a..0e90bc9 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -157,14 +157,20 @@ public class DalamudUtilService : IHostedService public async Task RunOnFrameworkThread(Action act) { - _logger.LogTrace("Running Action on framework thread: {act}", act); - await _framework.RunOnFrameworkThread(act).ConfigureAwait(false); + _logger.LogTrace("Running Action on framework thread (FrameworkContext: {ctx}): {act}", _framework.IsInFrameworkUpdateThread, act); + if (!_framework.IsInFrameworkUpdateThread) + await _framework.RunOnFrameworkThread(act).ConfigureAwait(false); + else + act(); } public async Task RunOnFrameworkThread(Func func) { - _logger.LogTrace("Running Func on framework thread: {func}", func); - return await _framework.RunOnFrameworkThread(func).ConfigureAwait(false); + _logger.LogTrace("Running Func on framework thread (FrameworkContext: {ctx}): {act}", _framework.IsInFrameworkUpdateThread, func); + if (!_framework.IsInFrameworkUpdateThread) + return await _framework.RunOnFrameworkThread(func).ConfigureAwait(false); + else + return func.Invoke(); } public Task StartAsync(CancellationToken cancellationToken) diff --git a/MareSynchronos/Services/Mediator/Messages.cs b/MareSynchronos/Services/Mediator/Messages.cs index cdb3533..59841ed 100644 --- a/MareSynchronos/Services/Mediator/Messages.cs +++ b/MareSynchronos/Services/Mediator/Messages.cs @@ -1,4 +1,5 @@ -using Dalamud.Interface.Internal.Notifications; +using Dalamud.Game.ClientState.Objects.Types; +using Dalamud.Interface.Internal.Notifications; using MareSynchronos.API.Dto; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.WebAPI.Files.Models; @@ -30,7 +31,7 @@ public record PenumbraRedrawMessage(IntPtr Address, int ObjTblIdx, bool WasReque public record HeelsOffsetMessage : IMessage; public record PenumbraResourceLoadMessage(IntPtr GameObject, string GamePath, string FilePath) : IMessage; public record CustomizePlusMessage : IMessage; -public record PalettePlusMessage : IMessage; +public record PalettePlusMessage(Character Character) : IMessage; public record PlayerChangedMessage(API.Data.CharacterData Data) : IMessage; public record CharacterChangedMessage(GameObjectHandler GameObjectHandler) : IMessage; public record TransientResourceChangedMessage(IntPtr Address) : IMessage;