fix adding semi transient resources, fix unloading not unloading mods due to queue
This commit is contained in:
@@ -267,6 +267,64 @@ public class CharacterDataFactory
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (objectKind == ObjectKind.Player)
|
if (objectKind == ObjectKind.Player)
|
||||||
|
{
|
||||||
|
AddPlayerSpecificReplacements(previousData, objectKind, charaPointer, human);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objectKind == ObjectKind.Pet)
|
||||||
|
{
|
||||||
|
foreach (var item in previousData.FileReplacements[objectKind])
|
||||||
|
{
|
||||||
|
transientResourceManager.AddSemiTransientResource(objectKind, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
previousData.FileReplacements[objectKind].Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
if (!previousData.FileReplacements.ContainsKey(objectKind))
|
||||||
|
{
|
||||||
|
previousData.FileReplacements.Add(objectKind, new());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!previousData.FileReplacements[objectKind].Any(k => k.ResolvedPath.ToLowerInvariant() == item.ResolvedPath.ToLowerInvariant()))
|
||||||
|
{
|
||||||
|
if (_ipcManager.PenumbraResolvePath(item.GamePaths.First()).ToLowerInvariant() == item.GamePaths.First().ToLowerInvariant())
|
||||||
|
{
|
||||||
|
transientResourceManager.RemoveTransientResource(charaPointer, item);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.Verbose("Found semi transient resource: " + item);
|
||||||
|
previousData.FileReplacements[objectKind].Add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private unsafe void AddPlayerSpecificReplacements(CharacterData previousData, ObjectKind objectKind, IntPtr charaPointer, Human* human)
|
||||||
{
|
{
|
||||||
var weaponObject = (Weapon*)((Object*)human)->ChildObject;
|
var weaponObject = (Weapon*)((Object*)human)->ChildObject;
|
||||||
|
|
||||||
@@ -284,7 +342,7 @@ public class CharacterDataFactory
|
|||||||
foreach (var item in transientResourceManager.GetTransientResources((IntPtr)weaponObject))
|
foreach (var item in transientResourceManager.GetTransientResources((IntPtr)weaponObject))
|
||||||
{
|
{
|
||||||
Logger.Verbose("Found transient weapon resource: " + item);
|
Logger.Verbose("Found transient weapon resource: " + item);
|
||||||
AddReplacementsFromTexture(item, objectKind, previousData, 0, false);
|
AddReplacement(item, objectKind, previousData, 1, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (weaponObject->NextSibling != (IntPtr)weaponObject)
|
if (weaponObject->NextSibling != (IntPtr)weaponObject)
|
||||||
@@ -298,10 +356,10 @@ public class CharacterDataFactory
|
|||||||
transientResourceManager.RemoveTransientResource((IntPtr)offHandWeapon, item);
|
transientResourceManager.RemoveTransientResource((IntPtr)offHandWeapon, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var item in transientResourceManager.GetTransientResources((IntPtr)weaponObject))
|
foreach (var item in transientResourceManager.GetTransientResources((IntPtr)offHandWeapon))
|
||||||
{
|
{
|
||||||
Logger.Verbose("Found transient offhand weapon resource: " + item);
|
Logger.Verbose("Found transient offhand weapon resource: " + item);
|
||||||
AddReplacement(item, objectKind, previousData, 1);
|
AddReplacement(item, objectKind, previousData, 1, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,53 +388,6 @@ public class CharacterDataFactory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objectKind == ObjectKind.Pet)
|
|
||||||
{
|
|
||||||
foreach (var item in previousData.FileReplacements[objectKind])
|
|
||||||
{
|
|
||||||
transientResourceManager.AddSemiTransientResource(objectKind, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
previousData.FileReplacements[objectKind].Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
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))
|
|
||||||
{
|
|
||||||
if (!previousData.FileReplacements.ContainsKey(objectKind))
|
|
||||||
{
|
|
||||||
previousData.FileReplacements.Add(objectKind, new());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!previousData.FileReplacements[objectKind].Any(k => k.ResolvedPath.ToLowerInvariant() == item.ResolvedPath.ToLowerInvariant()))
|
|
||||||
{
|
|
||||||
if (_ipcManager.PenumbraResolvePath(item.GamePaths.First()).ToLowerInvariant() == item.GamePaths.First().ToLowerInvariant())
|
|
||||||
{
|
|
||||||
transientResourceManager.RemoveTransientResource(charaPointer, item);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.Verbose("Found semi transient resource: " + item);
|
|
||||||
previousData.FileReplacements[objectKind].Add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
transientResourceManager.PersistTransientResources(charaPointer, objectKind, CreateFileReplacement);
|
|
||||||
|
|
||||||
st.Stop();
|
|
||||||
Logger.Verbose("Building " + objectKind + " Data took " + st.Elapsed);
|
|
||||||
return previousData;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddReplacementSkeleton(ushort raceSexId, ObjectKind objectKind, CharacterData cache)
|
private void AddReplacementSkeleton(ushort raceSexId, ObjectKind objectKind, CharacterData cache)
|
||||||
{
|
{
|
||||||
string raceSexIdString = raceSexId.ToString("0000");
|
string raceSexIdString = raceSexId.ToString("0000");
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user