From 9d4d919f0d781ffeb65d90ede3dd5eda29fcc366 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Thu, 2 Feb 2023 17:42:50 +0100 Subject: [PATCH] fixes an issue with transient data handling --- MareSynchronos/Factories/CharacterDataFactory.cs | 15 +++++++++++---- MareSynchronos/Managers/CacheCreationService.cs | 9 ++++++--- MareSynchronos/Managers/IpcManager.cs | 7 +++++++ .../Managers/TransientResourceManager.cs | 15 +++++++++++++-- MareSynchronos/MareSynchronos.csproj | 2 +- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index d2498c8..ec44446 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -272,6 +272,12 @@ public class CharacterDataFactory previousData.CustomizePlusScale = _ipcManager.GetCustomizePlusScale(); previousData.PalettePlusPalette = _ipcManager.PalettePlusBuildPalette(); + Logger.Debug("== Static Replacements =="); + foreach (var item in previousData.FileReplacements[objectKind]) + { + Logger.Debug(item.ToString()); + } + Logger.Debug("Handling transient update for " + objectKind); _transientResourceManager.ClearTransientPaths(charaPointer, previousData.FileReplacements[objectKind].SelectMany(c => c.GamePaths).ToList()); @@ -281,15 +287,16 @@ public class CharacterDataFactory ManageSemiTransientData(objectKind, charaPointer); var resolvedTransientPaths = GetFileReplacementsFromPaths(); + Logger.Debug("== Transient Replacements =="); foreach (var replacement in resolvedTransientPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager))) { + Logger.Debug(replacement.ToString()); previousData.FileReplacements[objectKind].Add(replacement); } - foreach (var item in previousData.FileReplacements[objectKind]) - { - Logger.Debug(item.ToString()); - } + _transientResourceManager.CleanSemiTransientResources(objectKind, previousData.FileReplacements[objectKind].ToList()); + + st.Stop(); Logger.Verbose("Building " + objectKind + " Data took " + st.ElapsedMilliseconds + "ms"); diff --git a/MareSynchronos/Managers/CacheCreationService.cs b/MareSynchronos/Managers/CacheCreationService.cs index 65366fd..f157708 100644 --- a/MareSynchronos/Managers/CacheCreationService.cs +++ b/MareSynchronos/Managers/CacheCreationService.cs @@ -17,7 +17,7 @@ public class CacheCreationService : MediatorSubscriberBase, IDisposable private Dictionary _cachesToCreate = new(); private CharacterData _lastCreatedData = new(); private CancellationTokenSource cts = new(); - private List _playerRelatedObjects; + private List _playerRelatedObjects = new(); public unsafe CacheCreationService(MareMediator mediator, CharacterDataFactory characterDataFactory, IpcManager ipcManager, ApiController apiController, DalamudUtil dalamudUtil) : base(mediator) @@ -35,14 +35,15 @@ public class CacheCreationService : MediatorSubscriberBase, IDisposable Mediator.Subscribe(this, (msg) => CustomizePlusChanged((CustomizePlusMessage)msg)); Mediator.Subscribe(this, (msg) => HeelsOffsetChanged((HeelsOffsetMessage)msg)); Mediator.Subscribe(this, (msg) => PalettePlusChanged((PalettePlusMessage)msg)); + Mediator.Subscribe(this, (msg) => _cachesToCreate.Add(ObjectKind.Player, _playerRelatedObjects.First(p => p.ObjectKind == ObjectKind.Player))); - _playerRelatedObjects = new List() + _playerRelatedObjects.AddRange(new List() { new(Mediator, ObjectKind.Player, () => dalamudUtil.PlayerPointer), new(Mediator, ObjectKind.MinionOrMount, () => (IntPtr)((Character*)dalamudUtil.PlayerPointer)->CompanionObject), new(Mediator, ObjectKind.Pet, () => dalamudUtil.GetPet()), new(Mediator, ObjectKind.Companion, () => dalamudUtil.GetCompanion()), - }; + }); } private void PalettePlusChanged(PalettePlusMessage msg) @@ -103,6 +104,8 @@ public class CacheCreationService : MediatorSubscriberBase, IDisposable { Logger.Debug("Cache Creation stored until previous creation finished"); } + + Mediator.Publish(new PlayerRelatedObjectPointerUpdateMessage(_playerRelatedObjects.Select(f => f.CurrentAddress).ToArray())); } public override void Dispose() diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index b3858b9..ded2e71 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -37,6 +37,7 @@ public class IpcManager : MediatorSubscriberBase, IDisposable private readonly FuncSubscriber, string, int, PenumbraApiEc> _penumbraAddTemporaryMod; private readonly FuncSubscriber _penumbraResolvePaths; private readonly FuncSubscriber _penumbraEnabled; + private readonly EventSubscriber _penumbraModSettingChanged; private readonly EventSubscriber _penumbraGameObjectResourcePathResolved; private readonly ICallGateSubscriber _heelsGetApiVersion; @@ -84,6 +85,11 @@ public class IpcManager : MediatorSubscriberBase, IDisposable _penumbraAssignTemporaryCollection = Penumbra.Api.Ipc.AssignTemporaryCollection.Subscriber(pi); _penumbraResolvePaths = Penumbra.Api.Ipc.ResolvePlayerPaths.Subscriber(pi); _penumbraEnabled = Penumbra.Api.Ipc.GetEnabledState.Subscriber(pi); + _penumbraModSettingChanged = Penumbra.Api.Ipc.ModSettingChanged.Subscriber(pi, (change, arg1, arg, b) => + { + if (change == ModSettingChange.EnableState) + Mediator.Publish(new PenumbraModSettingChangedMessage()); + }); _penumbraGameObjectResourcePathResolved = Penumbra.Api.Ipc.GameObjectResourcePathResolved.Subscriber(pi, (ptr, arg1, arg2) => ResourceLoaded((IntPtr)ptr, arg1, arg2)); @@ -258,6 +264,7 @@ public class IpcManager : MediatorSubscriberBase, IDisposable ActionQueue.Clear(); + _penumbraModSettingChanged.Dispose(); _penumbraGameObjectResourcePathResolved.Dispose(); _penumbraDispose.Dispose(); _penumbraInit.Dispose(); diff --git a/MareSynchronos/Managers/TransientResourceManager.cs b/MareSynchronos/Managers/TransientResourceManager.cs index 21b942d..6dafc50 100644 --- a/MareSynchronos/Managers/TransientResourceManager.cs +++ b/MareSynchronos/Managers/TransientResourceManager.cs @@ -1,6 +1,7 @@ using MareSynchronos.API.Data.Enum; using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; +using MareSynchronos.Models; using MareSynchronos.Utils; using System.Collections.Concurrent; @@ -83,11 +84,21 @@ public class TransientResourceManager : MediatorSubscriberBase, IDisposable } } - public void CleanSemiTransientResources(ObjectKind objectKind) + public void CleanSemiTransientResources(ObjectKind objectKind, List? fileReplacement = null) { if (SemiTransientResources.ContainsKey(objectKind)) { - SemiTransientResources[objectKind].Clear(); + if (fileReplacement == null) + { + SemiTransientResources[objectKind].Clear(); + return; + } + + foreach (var replacement in fileReplacement.Where(p => !p.HasFileReplacement).SelectMany(p => p.GamePaths).ToList()) + { + + SemiTransientResources[objectKind].RemoveWhere(p => string.Equals(p, replacement, StringComparison.OrdinalIgnoreCase)); + } } } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index c7b0e61..a80fc2a 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.7.14 + 0.7.15 https://github.com/Penumbra-Sync/client