This commit is contained in:
defnotken
2026-01-02 09:29:04 -06:00
parent 3487891185
commit bb365442cf
2 changed files with 147 additions and 88 deletions

View File

@@ -142,29 +142,23 @@ public class PlayerDataFactory
ct.ThrowIfCancellationRequested();
fragment.FileReplacements =
[.. new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance).Where(p => p.HasFileReplacement)];
fragment.FileReplacements.RemoveWhere(c => c.GamePaths.Any(g => !CacheMonitor.AllowedFileExtensions.Any(e => g.EndsWith(e, StringComparison.OrdinalIgnoreCase))));
var fileReplacementsTask = Task.Run(() =>
{
var replacements = new HashSet<FileReplacement>(
resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)),
FileReplacementComparer.Instance)
.Where(p => p.HasFileReplacement)
.ToHashSet();
replacements.RemoveWhere(c => c.GamePaths.Any(g =>
!CacheMonitor.AllowedFileExtensions.Any(e =>
g.EndsWith(e, StringComparison.OrdinalIgnoreCase))));
return replacements;
}, ct);
ct.ThrowIfCancellationRequested();
if (logDebug)
{
_logger.LogDebug("== Static Replacements ==");
foreach (var replacement in fragment.FileReplacements.Where(i => i.HasFileReplacement).OrderBy(i => i.GamePaths.First(), StringComparer.OrdinalIgnoreCase))
{
_logger.LogDebug("=> {repl}", replacement);
ct.ThrowIfCancellationRequested();
}
}
else
{
foreach (var replacement in fragment.FileReplacements.Where(i => i.HasFileReplacement))
{
ct.ThrowIfCancellationRequested();
}
}
Task<string>? getHeelsOffset = null;
Task<string>? getGlamourerData = null;
Task<string?>? getCustomizeData = null;
@@ -185,38 +179,32 @@ public class PlayerDataFactory
getCustomizeData = _ipcManager.CustomizePlus.GetScaleAsync(playerRelatedObject.Address);
}
fragment.FileReplacements = await fileReplacementsTask.ConfigureAwait(false);
if (logDebug)
{
_logger.LogDebug("== Static Replacements ==");
foreach (var replacement in fragment.FileReplacements.Where(i => i.HasFileReplacement).OrderBy(i => i.GamePaths.First(), StringComparer.OrdinalIgnoreCase))
{
_logger.LogDebug("=> {repl}", replacement);
ct.ThrowIfCancellationRequested();
}
}
else
{
foreach (var replacement in fragment.FileReplacements.Where(i => i.HasFileReplacement))
{
ct.ThrowIfCancellationRequested();
}
}
var staticReplacements = fragment.FileReplacements.ToHashSet();
Task<(IReadOnlyDictionary<string, string[]> ResolvedPaths, HashSet<FileReplacement>? ClearedReplacements)> transientTask = Task.Run(async () =>
{
await _transientResourceManager.WaitForRecording(ct).ConfigureAwait(false);
HashSet<FileReplacement>? clearedReplacements = null;
if (objectKind == ObjectKind.Pet)
{
foreach (var item in staticReplacements.Where(i => i.HasFileReplacement).SelectMany(p => p.GamePaths))
{
if (_transientResourceManager.AddTransientResource(objectKind, item))
{
_logger.LogDebug("Marking static {item} for Pet as transient", item);
}
}
_logger.LogTrace("Clearing {count} Static Replacements for Pet", staticReplacements.Count);
clearedReplacements = staticReplacements;
}
ct.ThrowIfCancellationRequested();
_logger.LogDebug("Handling transient update for {obj}", playerRelatedObject);
_transientResourceManager.ClearTransientPaths(objectKind, [.. staticReplacements.SelectMany(c => c.GamePaths)]);
var transientPaths = ManageSemiTransientData(objectKind);
IReadOnlyDictionary<string, string[]> resolved = await GetFileReplacementsFromPaths(playerRelatedObject, transientPaths, new HashSet<string>(StringComparer.Ordinal)).ConfigureAwait(false);
return (resolved, clearedReplacements);
}, ct);
Task<(IReadOnlyDictionary<string, string[]> ResolvedPaths, HashSet<FileReplacement>? ClearedReplacements)> transientTask = ProcessTransientDataAsync(
objectKind,
playerRelatedObject,
staticReplacements,
ct);
ct.ThrowIfCancellationRequested();
@@ -278,12 +266,17 @@ public class PlayerDataFactory
var toCompute = fragment.FileReplacements.Where(f => !f.IsFileSwap).ToArray();
_logger.LogDebug("Getting Hashes for {amount} Files", toCompute.Length);
var computedPaths = _fileCacheManager.GetFileCachesByPaths(toCompute.Select(c => c.ResolvedPath).ToArray());
foreach (var file in toCompute)
await Task.Run(() =>
{
ct.ThrowIfCancellationRequested();
file.Hash = computedPaths[file.ResolvedPath]?.Hash ?? string.Empty;
}
var computedPaths = _fileCacheManager.GetFileCachesByPaths(toCompute.Select(c => c.ResolvedPath).ToArray());
foreach (var file in toCompute)
{
ct.ThrowIfCancellationRequested();
file.Hash = computedPaths[file.ResolvedPath]?.Hash ?? string.Empty;
}
}, ct).ConfigureAwait(false);
var removed = fragment.FileReplacements.RemoveWhere(f => !f.IsFileSwap && string.IsNullOrEmpty(f.Hash));
if (removed > 0)
{
@@ -507,6 +500,48 @@ public class PlayerDataFactory
}
}
private async Task<(IReadOnlyDictionary<string, string[]> ResolvedPaths, HashSet<FileReplacement>? ClearedReplacements)> ProcessTransientDataAsync(
ObjectKind objectKind,
GameObjectHandler playerRelatedObject,
HashSet<FileReplacement> staticReplacements,
CancellationToken ct)
{
await _transientResourceManager.WaitForRecording(ct).ConfigureAwait(false);
HashSet<FileReplacement>? clearedReplacements = null;
var gamePaths = staticReplacements
.Where(i => i.HasFileReplacement)
.SelectMany(p => p.GamePaths)
.ToList();
if (objectKind == ObjectKind.Pet)
{
foreach (var item in gamePaths)
{
if (_transientResourceManager.AddTransientResource(objectKind, item))
{
_logger.LogDebug("Marking static {item} for Pet as transient", item);
}
}
_logger.LogTrace("Clearing {count} Static Replacements for Pet", staticReplacements.Count);
clearedReplacements = staticReplacements;
}
ct.ThrowIfCancellationRequested();
_transientResourceManager.ClearTransientPaths(objectKind, gamePaths);
var transientPaths = ManageSemiTransientData(objectKind);
IReadOnlyDictionary<string, string[]> resolved = await GetFileReplacementsFromPaths(
playerRelatedObject,
transientPaths,
new HashSet<string>(StringComparer.Ordinal)).ConfigureAwait(false);
return (resolved, clearedReplacements);
}
private async Task<IReadOnlyDictionary<string, string[]>> GetFileReplacementsFromPaths(GameObjectHandler handler, HashSet<string> forwardResolve, HashSet<string> reverseResolve)
{