fix adding semi transient resources, fix unloading not unloading mods due to queue

This commit is contained in:
Stanley Dimant
2022-09-06 16:15:08 +02:00
parent 99df88bb3b
commit 1e9161aed5
3 changed files with 107 additions and 72 deletions

View File

@@ -268,66 +268,7 @@ public class CharacterDataFactory
if (objectKind == ObjectKind.Player) if (objectKind == ObjectKind.Player)
{ {
var weaponObject = (Weapon*)((Object*)human)->ChildObject; AddPlayerSpecificReplacements(previousData, objectKind, charaPointer, human);
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);
}
} }
if (objectKind == ObjectKind.Pet) if (objectKind == ObjectKind.Pet)
@@ -340,14 +281,26 @@ public class CharacterDataFactory
previousData.FileReplacements[objectKind].Clear(); 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()))) if (!previousData.FileReplacements[objectKind].Any(f => f.GamePaths.Any(p => p.ToLowerInvariant() == item.ToLowerInvariant())))
{ {
Logger.Verbose("Found transient resource: " + item); Logger.Verbose("Found transient resource: " + item);
AddReplacement(item, objectKind, previousData, 1, true); AddReplacement(item, objectKind, previousData, 1, true);
} }
} }*/
foreach (var item in transientResourceManager.GetSemiTransientResources(objectKind)) 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(); if ((IntPtr)weaponObject != IntPtr.Zero)
Logger.Verbose("Building " + objectKind + " Data took " + st.Elapsed); {
return previousData; 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) private void AddReplacementSkeleton(ushort raceSexId, ObjectKind objectKind, CharacterData cache)

View File

@@ -137,6 +137,13 @@ namespace MareSynchronos.Managers
{ {
Logger.Verbose("Disposing " + nameof(IpcManager)); Logger.Verbose("Disposing " + nameof(IpcManager));
int totalSleepTime = 0;
while (actionQueue.Count > 0 && totalSleepTime < 2000)
{
System.Threading.Thread.Sleep(16);
totalSleepTime += 16;
}
_dalamudUtil.FrameworkUpdate -= HandleActionQueue; _dalamudUtil.FrameworkUpdate -= HandleActionQueue;
actionQueue.Clear(); actionQueue.Clear();

View File

@@ -88,12 +88,22 @@ namespace MareSynchronos.Managers
filePath = filePath.Split("|")[2]; 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("Not adding " + replacedGamePath + ":" + filePath);
Logger.Debug($"Adding {newPath.ToLowerInvariant().Replace("\\", "/")} for {gameObject} ({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); TransientResourceLoaded?.Invoke(gameObject);
} }
} }
@@ -102,7 +112,7 @@ namespace MareSynchronos.Managers
{ {
if (TransientResources.ContainsKey(gameObject)) 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"); Logger.Debug("Persisting " + transientResources.Count + " transient resources");
foreach (var item in transientResources) 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()); Logger.Debug("Persisting " + item.ToLowerInvariant());
var fileReplacement = createFileReplacement(item.ToLowerInvariant(), true); var fileReplacement = createFileReplacement(item.ToLowerInvariant(), true);