diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index d2687ad..3678393 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -188,6 +188,17 @@ public class CharacterDataFactory AddReplacementsFromTexture(texPath, objectKind, cache, inheritanceLevel + 1); } + + try + { + var shpkPath = "shader/sm5/shpk/" + new Utf8String(mtrlResourceHandle->ShpkString).ToString(); + Logger.Verbose("Checking File Replacement for Shader " + shpkPath); + AddReplacementsFromShader(shpkPath, objectKind, cache, inheritanceLevel + 1); + } + catch + { + Logger.Verbose("Could not find shpk for Material " + fileName); + } } private void AddReplacement(string varPath, ObjectKind objectKind, CharacterData cache, int inheritanceLevel = 0, bool doNotReverseResolve = false) @@ -208,6 +219,23 @@ public class CharacterDataFactory cache.AddFileReplacement(objectKind, variousReplacement); } + private void AddReplacementsFromShader(string shpkPath, ObjectKind objectKind, CharacterData cache, int inheritanceLevel = 0) + { + if (string.IsNullOrEmpty(shpkPath)) return; + + if (cache.FileReplacements.ContainsKey(objectKind)) + { + if (cache.FileReplacements[objectKind].Any(c => c.GamePaths.Contains(shpkPath, StringComparer.Ordinal))) + { + return; + } + } + + var shpkFileReplacement = CreateFileReplacement(shpkPath, true); + DebugPrint(shpkFileReplacement, objectKind, "Shader", inheritanceLevel); + cache.AddFileReplacement(objectKind, shpkFileReplacement); + } + private void AddReplacementsFromTexture(string texPath, ObjectKind objectKind, CharacterData cache, int inheritanceLevel = 0, bool doNotReverseResolve = true) { if (string.IsNullOrEmpty(texPath)) return; diff --git a/MareSynchronos/FileCache/PeriodicFileScanner.cs b/MareSynchronos/FileCache/PeriodicFileScanner.cs index 9867b77..bfd4d62 100644 --- a/MareSynchronos/FileCache/PeriodicFileScanner.cs +++ b/MareSynchronos/FileCache/PeriodicFileScanner.cs @@ -202,7 +202,7 @@ public class PeriodicFileScanner : IDisposable } Logger.Debug("Getting files from " + penumbraDir + " and " + _pluginConfiguration.CacheFolder); - string[] ext = { ".mdl", ".tex", ".mtrl", ".tmb", ".pap", ".avfx", ".atex", ".sklb", ".eid", ".phyb", ".scd", ".skp" }; + string[] ext = { ".mdl", ".tex", ".mtrl", ".tmb", ".pap", ".avfx", ".atex", ".sklb", ".eid", ".phyb", ".scd", ".skp", ".shpk" }; var scannedFiles = new ConcurrentDictionary(Directory.EnumerateFiles(penumbraDir, "*.*", SearchOption.AllDirectories) .Select(s => s.ToLowerInvariant()) diff --git a/MareSynchronos/Managers/TransientResourceManager.cs b/MareSynchronos/Managers/TransientResourceManager.cs index f6fb4d8..5cba470 100644 --- a/MareSynchronos/Managers/TransientResourceManager.cs +++ b/MareSynchronos/Managers/TransientResourceManager.cs @@ -21,7 +21,7 @@ public class TransientResourceManager : IDisposable public event TransientResourceLoadedEvent? TransientResourceLoaded; public IntPtr[] PlayerRelatedPointers = Array.Empty(); - private readonly string[] FileTypesToHandle = new[] { "tmb", "pap", "avfx", "atex", "sklb", "eid", "phyb", "scd", "skp" }; + private readonly string[] FileTypesToHandle = new[] { "tmb", "pap", "avfx", "atex", "sklb", "eid", "phyb", "scd", "skp", "shpk" }; private string PersistentDataCache => Path.Combine(configurationDirectory, "PersistentTransientData.lst"); private ConcurrentDictionary> TransientResources { get; } = new();