support for decals and legacy tattoo mods

This commit is contained in:
Stanley Dimant
2022-07-02 02:50:14 +02:00
parent fa9be47d1d
commit 6994112b03
2 changed files with 86 additions and 8 deletions

View File

@@ -4,13 +4,13 @@ using System.Diagnostics;
using System.Linq;
using System.Threading;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using FFXIVClientStructs.FFXIV.Client.System.Resource;
using MareSynchronos.Managers;
using MareSynchronos.Models;
using MareSynchronos.Utils;
using Penumbra.GameData.ByteString;
using Penumbra.Interop.Structs;
using Human = MareSynchronos.Interop.Human;
namespace MareSynchronos.Factories
{
@@ -27,10 +27,10 @@ namespace MareSynchronos.Factories
_ipcManager = ipcManager;
}
private FileReplacement CreateFileReplacement(string path)
private FileReplacement CreateFileReplacement(string path, bool doNotReverseResolve = false)
{
var fileReplacement = new FileReplacement(_ipcManager.PenumbraModDirectory()!);
if (!path.Contains(".tex", StringComparison.OrdinalIgnoreCase))
if (!doNotReverseResolve)
{
fileReplacement.GamePaths =
_ipcManager.PenumbraReverseResolvePath(path, _dalamudUtil.PlayerName).ToList();
@@ -70,10 +70,10 @@ namespace MareSynchronos.Factories
GlamourerString = _ipcManager.GlamourerGetCharacterCustomization(_dalamudUtil.PlayerCharacter),
ManipulationString = _ipcManager.PenumbraGetMetaManipulations(_dalamudUtil.PlayerName)
};
var model = (CharacterBase*)((Character*)_dalamudUtil.PlayerPointer)->GameObject.GetDrawObject();
for (var mdlIdx = 0; mdlIdx < model->SlotCount; ++mdlIdx)
var drawObject = (Human*)((Character*)_dalamudUtil.PlayerPointer)->GameObject.GetDrawObject();
for (var mdlIdx = 0; mdlIdx < drawObject->CharacterBase.SlotCount; ++mdlIdx)
{
var mdl = (RenderModel*)model->ModelArray[mdlIdx];
var mdl = (RenderModel*)drawObject->CharacterBase.ModelArray[mdlIdx];
if (mdl == null || mdl->ResourceHandle == null || mdl->ResourceHandle->Category != ResourceCategory.Chara)
{
continue;
@@ -107,7 +107,7 @@ namespace MareSynchronos.Factories
if (string.IsNullOrEmpty(texPath)) continue;
var texFileReplacement = CreateFileReplacement(texPath);
var texFileReplacement = CreateFileReplacement(texPath, true);
Logger.Debug("\t\tTexture " + string.Join(", ", texFileReplacement.GamePaths));
Logger.Debug("\t\t\t\t=> " + texFileReplacement.ResolvedPath);
@@ -116,7 +116,7 @@ namespace MareSynchronos.Factories
if (texPath.Contains("/--")) continue;
var texDoubleMinusFileReplacement =
CreateFileReplacement(texPath.Insert(texPath.LastIndexOf('/') + 1, "--"));
CreateFileReplacement(texPath.Insert(texPath.LastIndexOf('/') + 1, "--"), true);
Logger.Debug("\t\tTexture-- " + string.Join(", ", texDoubleMinusFileReplacement.GamePaths));
Logger.Debug("\t\t\t\t=> " + texDoubleMinusFileReplacement.ResolvedPath);
@@ -125,6 +125,18 @@ namespace MareSynchronos.Factories
}
}
var tattooDecalFileReplacement =
CreateFileReplacement(new Utf8String(drawObject->Decal->FileName()).ToString());
cache.AddFileReplacement(tattooDecalFileReplacement);
Logger.Debug("Decal " + string.Join(", ", tattooDecalFileReplacement.GamePaths));
Logger.Debug("\t\t=> " + tattooDecalFileReplacement.ResolvedPath);
var legacyDecalFileReplacement =
CreateFileReplacement(new Utf8String(drawObject->LegacyBodyDecal->FileName()).ToString());
cache.AddFileReplacement(legacyDecalFileReplacement);
Logger.Debug("Legacy Decal " + string.Join(", ", legacyDecalFileReplacement.GamePaths));
Logger.Debug("\t\t=> " + legacyDecalFileReplacement.ResolvedPath);
st.Stop();
Logger.Verbose("Building Character Data took " + st.Elapsed);