experimental first iteration of persistent transient resources on startup

This commit is contained in:
Stanley Dimant
2022-12-13 12:01:40 +01:00
parent a807a874f0
commit 9ba6827816
7 changed files with 128 additions and 47 deletions

View File

@@ -1,12 +1,12 @@
using MareSynchronos.API;
using MareSynchronos.Factories;
using MareSynchronos.Models;
using MareSynchronos.Utils;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MareSynchronos.Managers;
@@ -16,20 +16,39 @@ public class TransientResourceManager : IDisposable
{
private readonly IpcManager manager;
private readonly DalamudUtil dalamudUtil;
private readonly FileReplacementFactory fileReplacementFactory;
private readonly string configurationDirectory;
public event TransientResourceLoadedEvent? TransientResourceLoaded;
public IntPtr[] PlayerRelatedPointers = Array.Empty<IntPtr>();
private readonly string[] FileTypesToHandle = new[] { "tmb", "pap", "avfx", "atex", "sklb", "eid", "phyb", "scd", "skp" };
private string PersistentDataCache => Path.Combine(configurationDirectory, "PersistentTransientData.lst");
private ConcurrentDictionary<IntPtr, HashSet<string>> TransientResources { get; } = new();
private ConcurrentDictionary<ObjectKind, HashSet<FileReplacement>> SemiTransientResources { get; } = new();
public TransientResourceManager(IpcManager manager, DalamudUtil dalamudUtil)
public TransientResourceManager(IpcManager manager, DalamudUtil dalamudUtil, FileReplacementFactory fileReplacementFactory, string configurationDirectory)
{
manager.PenumbraResourceLoadEvent += Manager_PenumbraResourceLoadEvent;
this.manager = manager;
this.dalamudUtil = dalamudUtil;
this.fileReplacementFactory = fileReplacementFactory;
this.configurationDirectory = configurationDirectory;
dalamudUtil.FrameworkUpdate += DalamudUtil_FrameworkUpdate;
dalamudUtil.ClassJobChanged += DalamudUtil_ClassJobChanged;
if (File.Exists(PersistentDataCache))
{
var persistentEntities = File.ReadAllLines(PersistentDataCache);
SemiTransientResources.TryAdd(ObjectKind.Player, new HashSet<FileReplacement>());
foreach (var line in persistentEntities)
{
var fileReplacement = fileReplacementFactory.Create();
fileReplacement.ResolvePath(line);
if (fileReplacement.HasFileReplacement)
{
SemiTransientResources[ObjectKind.Player].Add(fileReplacement);
}
}
}
}
private void DalamudUtil_ClassJobChanged()
@@ -180,6 +199,10 @@ public class TransientResourceManager : IDisposable
}
}
if (objectKind == ObjectKind.Player && SemiTransientResources.TryGetValue(ObjectKind.Player, out var fileReplacements))
{
File.WriteAllLines(PersistentDataCache, fileReplacements.SelectMany(p => p.GamePaths).Distinct(StringComparer.OrdinalIgnoreCase));
}
TransientResources[gameObject].Clear();
}
@@ -189,6 +212,11 @@ public class TransientResourceManager : IDisposable
manager.PenumbraResourceLoadEvent -= Manager_PenumbraResourceLoadEvent;
dalamudUtil.ClassJobChanged -= DalamudUtil_ClassJobChanged;
TransientResources.Clear();
SemiTransientResources.Clear();
if (SemiTransientResources.ContainsKey(ObjectKind.Player))
{
File.WriteAllLines(PersistentDataCache, SemiTransientResources[ObjectKind.Player].SelectMany(p => p.GamePaths).Distinct(StringComparer.OrdinalIgnoreCase));
}
}
internal void AddSemiTransientResource(ObjectKind objectKind, FileReplacement item)