From 1e9161aed582d1980b0b1aced3cdf9e6e70a91ef Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Tue, 6 Sep 2022 16:15:08 +0200 Subject: [PATCH] fix adding semi transient resources, fix unloading not unloading mods due to queue --- .../Factories/CharacterDataFactory.cs | 143 ++++++++++-------- MareSynchronos/Managers/IpcManager.cs | 7 + .../Managers/TransientResourceManager.cs | 29 +++- 3 files changed, 107 insertions(+), 72 deletions(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index c5c8c62..a00df6d 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -268,66 +268,7 @@ public class CharacterDataFactory if (objectKind == ObjectKind.Player) { - var weaponObject = (Weapon*)((Object*)human)->ChildObject; - - if ((IntPtr)weaponObject != IntPtr.Zero) - { - var mainHandWeapon = weaponObject->WeaponRenderModel->RenderModel; - - AddReplacementsFromRenderModel(mainHandWeapon, objectKind, previousData, 0); - - foreach (var item in previousData.FileReplacements[objectKind]) - { - transientResourceManager.RemoveTransientResource(charaPointer, item); - } - - foreach (var item in transientResourceManager.GetTransientResources((IntPtr)weaponObject)) - { - Logger.Verbose("Found transient weapon resource: " + item); - AddReplacementsFromTexture(item, objectKind, previousData, 0, false); - } - - if (weaponObject->NextSibling != (IntPtr)weaponObject) - { - var offHandWeapon = ((Weapon*)weaponObject->NextSibling)->WeaponRenderModel->RenderModel; - - AddReplacementsFromRenderModel(offHandWeapon, objectKind, previousData, 1); - - foreach (var item in previousData.FileReplacements[objectKind]) - { - transientResourceManager.RemoveTransientResource((IntPtr)offHandWeapon, item); - } - - foreach (var item in transientResourceManager.GetTransientResources((IntPtr)weaponObject)) - { - Logger.Verbose("Found transient offhand weapon resource: " + item); - AddReplacement(item, objectKind, previousData, 1); - } - } - } - - AddReplacementSkeleton(((HumanExt*)human)->Human.RaceSexId, objectKind, previousData); - try - { - AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->Decal->FileName()).ToString(), objectKind, previousData, 0, false); - } - catch - { - Logger.Warn("Could not get Decal data"); - } - try - { - AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->LegacyBodyDecal->FileName()).ToString(), objectKind, previousData, 0, false); - } - catch - { - Logger.Warn("Could not get Legacy Body Decal Data"); - } - - foreach (var item in previousData.FileReplacements[objectKind]) - { - transientResourceManager.RemoveTransientResource(charaPointer, item); - } + AddPlayerSpecificReplacements(previousData, objectKind, charaPointer, human); } if (objectKind == ObjectKind.Pet) @@ -340,14 +281,26 @@ public class CharacterDataFactory previousData.FileReplacements[objectKind].Clear(); } - foreach (var item in transientResourceManager.GetTransientResources(charaPointer)) + ManageSemiTransientData(previousData, objectKind, charaPointer); + + st.Stop(); + Logger.Verbose("Building " + objectKind + " Data took " + st.Elapsed); + return previousData; + } + + private unsafe void ManageSemiTransientData(CharacterData previousData, ObjectKind objectKind, IntPtr charaPointer) + { + transientResourceManager.PersistTransientResources(charaPointer, objectKind, CreateFileReplacement); + + /*foreach (var item in transientResourceManager.GetTransientResources(charaPointer)) { if (!previousData.FileReplacements[objectKind].Any(f => f.GamePaths.Any(p => p.ToLowerInvariant() == item.ToLowerInvariant()))) { Logger.Verbose("Found transient resource: " + item); AddReplacement(item, objectKind, previousData, 1, true); } - } + }*/ + foreach (var item in transientResourceManager.GetSemiTransientResources(objectKind)) { @@ -369,12 +322,70 @@ public class CharacterDataFactory } } } + } - transientResourceManager.PersistTransientResources(charaPointer, objectKind, CreateFileReplacement); + private unsafe void AddPlayerSpecificReplacements(CharacterData previousData, ObjectKind objectKind, IntPtr charaPointer, Human* human) + { + var weaponObject = (Weapon*)((Object*)human)->ChildObject; - st.Stop(); - Logger.Verbose("Building " + objectKind + " Data took " + st.Elapsed); - return previousData; + if ((IntPtr)weaponObject != IntPtr.Zero) + { + var mainHandWeapon = weaponObject->WeaponRenderModel->RenderModel; + + AddReplacementsFromRenderModel(mainHandWeapon, objectKind, previousData, 0); + + foreach (var item in previousData.FileReplacements[objectKind]) + { + transientResourceManager.RemoveTransientResource(charaPointer, item); + } + + foreach (var item in transientResourceManager.GetTransientResources((IntPtr)weaponObject)) + { + Logger.Verbose("Found transient weapon resource: " + item); + AddReplacement(item, objectKind, previousData, 1, true); + } + + if (weaponObject->NextSibling != (IntPtr)weaponObject) + { + var offHandWeapon = ((Weapon*)weaponObject->NextSibling)->WeaponRenderModel->RenderModel; + + AddReplacementsFromRenderModel(offHandWeapon, objectKind, previousData, 1); + + foreach (var item in previousData.FileReplacements[objectKind]) + { + transientResourceManager.RemoveTransientResource((IntPtr)offHandWeapon, item); + } + + foreach (var item in transientResourceManager.GetTransientResources((IntPtr)offHandWeapon)) + { + Logger.Verbose("Found transient offhand weapon resource: " + item); + AddReplacement(item, objectKind, previousData, 1, true); + } + } + } + + AddReplacementSkeleton(((HumanExt*)human)->Human.RaceSexId, objectKind, previousData); + try + { + AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->Decal->FileName()).ToString(), objectKind, previousData, 0, false); + } + catch + { + Logger.Warn("Could not get Decal data"); + } + try + { + AddReplacementsFromTexture(new Utf8String(((HumanExt*)human)->LegacyBodyDecal->FileName()).ToString(), objectKind, previousData, 0, false); + } + catch + { + Logger.Warn("Could not get Legacy Body Decal Data"); + } + + foreach (var item in previousData.FileReplacements[objectKind]) + { + transientResourceManager.RemoveTransientResource(charaPointer, item); + } } private void AddReplacementSkeleton(ushort raceSexId, ObjectKind objectKind, CharacterData cache) diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index b8a1127..b436d53 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -137,6 +137,13 @@ namespace MareSynchronos.Managers { Logger.Verbose("Disposing " + nameof(IpcManager)); + int totalSleepTime = 0; + while (actionQueue.Count > 0 && totalSleepTime < 2000) + { + System.Threading.Thread.Sleep(16); + totalSleepTime += 16; + } + _dalamudUtil.FrameworkUpdate -= HandleActionQueue; actionQueue.Clear(); diff --git a/MareSynchronos/Managers/TransientResourceManager.cs b/MareSynchronos/Managers/TransientResourceManager.cs index 03401ba..848c42d 100644 --- a/MareSynchronos/Managers/TransientResourceManager.cs +++ b/MareSynchronos/Managers/TransientResourceManager.cs @@ -88,12 +88,22 @@ namespace MareSynchronos.Managers filePath = filePath.Split("|")[2]; } - var newPath = gamePath.ToLowerInvariant().Replace("\\", "/"); + filePath = filePath.ToLowerInvariant(); - if (filePath != gamePath && !TransientResources[gameObject].Contains(newPath) && !SemiTransientResources.Any(r => r.Value.Any(f => f.GamePaths.First().ToLowerInvariant() == newPath.ToLowerInvariant()))) + var replacedGamePath = gamePath.ToLowerInvariant().Replace("\\", "/"); + + if (TransientResources[gameObject].Contains(replacedGamePath) || + SemiTransientResources.Any(r => r.Value.Any(f => f.GamePaths.First().ToLowerInvariant() == replacedGamePath + && f.ResolvedPath.ToLowerInvariant() == filePath))) { - TransientResources[gameObject].Add(newPath); - Logger.Debug($"Adding {newPath.ToLowerInvariant().Replace("\\", "/")} for {gameObject} ({filePath})"); + Logger.Debug("Not adding " + replacedGamePath + ":" + filePath); + Logger.Verbose("SemiTransientAny: " + SemiTransientResources.Any(r => r.Value.Any(f => f.GamePaths.First().ToLowerInvariant() == replacedGamePath + && f.ResolvedPath.ToLowerInvariant() == filePath)).ToString() + ", TransientAny: " + TransientResources[gameObject].Contains(replacedGamePath)); + } + else + { + TransientResources[gameObject].Add(replacedGamePath); + Logger.Debug($"Adding {replacedGamePath} for {gameObject} ({filePath})"); TransientResourceLoaded?.Invoke(gameObject); } } @@ -102,7 +112,7 @@ namespace MareSynchronos.Managers { if (TransientResources.ContainsKey(gameObject)) { - TransientResources[gameObject].RemoveWhere(f => fileReplacement.ResolvedPath == f); + TransientResources[gameObject].RemoveWhere(f => fileReplacement.ResolvedPath.ToLowerInvariant() == f.ToLowerInvariant()); } } @@ -122,7 +132,14 @@ namespace MareSynchronos.Managers Logger.Debug("Persisting " + transientResources.Count + " transient resources"); foreach (var item in transientResources) { - if (!SemiTransientResources[objectKind].Any(f => f.ResolvedPath.ToLowerInvariant() == item.ToLowerInvariant())) + var existingResource = SemiTransientResources[objectKind].Any(f => f.GamePaths.First().ToLowerInvariant() == item.ToLowerInvariant()); + if (existingResource) + { + Logger.Debug("Semi Transient resource replaced: " + item); + SemiTransientResources[objectKind].RemoveWhere(f => f.GamePaths.First().ToLowerInvariant() == item.ToLowerInvariant()); + } + + if (!SemiTransientResources[objectKind].Any(f => f.GamePaths.First().ToLowerInvariant() == item.ToLowerInvariant())) { Logger.Debug("Persisting " + item.ToLowerInvariant()); var fileReplacement = createFileReplacement(item.ToLowerInvariant(), true);