add sync of offhand weapons

This commit is contained in:
Stanley Dimant
2022-07-02 13:07:51 +02:00
parent 0a6584bc32
commit c0e7f6914e
2 changed files with 62 additions and 9 deletions

View File

@@ -5,6 +5,7 @@ using System.Linq;
using System.Threading;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.System.Resource;
using MareSynchronos.Interop;
using MareSynchronos.Managers;
using MareSynchronos.Models;
using MareSynchronos.Utils;
@@ -125,24 +126,24 @@ namespace MareSynchronos.Factories
}
}
var weapon = (RenderModel*)human->Weapon->WeaponRenderModel->RenderModel;
var mainHandWeapon = (RenderModel*)human->Weapon->WeaponRenderModel->RenderModel;
var weaponPath = new Utf8String(weapon->ResourceHandle->FileName()).ToString();
FileReplacement weaponReplacement = CreateFileReplacement(weaponPath);
var mainHandWeaponPath = new Utf8String(mainHandWeapon->ResourceHandle->FileName()).ToString();
FileReplacement weaponReplacement = CreateFileReplacement(mainHandWeaponPath);
cache.AddFileReplacement(weaponReplacement);
Logger.Debug("Weapon " + string.Join(", ", weaponReplacement.GamePaths));
Logger.Debug("MainHand Weapon " + string.Join(", ", weaponReplacement.GamePaths));
Logger.Debug("\t\t=> " + weaponReplacement.ResolvedPath);
for (var mtrlIdx = 0; mtrlIdx < weapon->MaterialCount; mtrlIdx++)
for (var mtrlIdx = 0; mtrlIdx < mainHandWeapon->MaterialCount; mtrlIdx++)
{
var mtrl = (Material*)weapon->Materials[mtrlIdx];
var mtrl = (Material*)mainHandWeapon->Materials[mtrlIdx];
if (mtrl == null) continue;
var mtrlPath = new Utf8String(mtrl->ResourceHandle->FileName()).ToString().Split("|")[2];
var mtrlFileReplacement = CreateFileReplacement(mtrlPath);
Logger.Debug("\tWeapon Material " + string.Join(", ", mtrlFileReplacement.GamePaths));
Logger.Debug("\tMainHand Weapon Material " + string.Join(", ", mtrlFileReplacement.GamePaths));
Logger.Debug("\t\t\t=> " + mtrlFileReplacement.ResolvedPath);
cache.AddFileReplacement(mtrlFileReplacement);
@@ -155,7 +156,7 @@ namespace MareSynchronos.Factories
if (string.IsNullOrEmpty(texPath)) continue;
var texFileReplacement = CreateFileReplacement(texPath, true);
Logger.Debug("\t\tWeapon Texture " + string.Join(", ", texFileReplacement.GamePaths));
Logger.Debug("\t\tMainHand tWeapon Texture " + string.Join(", ", texFileReplacement.GamePaths));
Logger.Debug("\t\t\t\t=> " + texFileReplacement.ResolvedPath);
cache.AddFileReplacement(texFileReplacement);
@@ -165,12 +166,61 @@ namespace MareSynchronos.Factories
var texDoubleMinusFileReplacement =
CreateFileReplacement(texPath.Insert(texPath.LastIndexOf('/') + 1, "--"), true);
Logger.Debug("\t\tWeapon Texture-- " + string.Join(", ", texDoubleMinusFileReplacement.GamePaths));
Logger.Debug("\t\tMainHand Weapon Texture-- " + string.Join(", ", texDoubleMinusFileReplacement.GamePaths));
Logger.Debug("\t\t\t\t=> " + texDoubleMinusFileReplacement.ResolvedPath);
cache.AddFileReplacement(texDoubleMinusFileReplacement);
}
}
if (human->Weapon->NextSibling != (IntPtr)human->Weapon)
{
var offHandWeapon = ((Weapon*)human->Weapon->NextSibling)->WeaponRenderModel->RenderModel;
var offHandWeaponPath = new Utf8String(offHandWeapon->ResourceHandle->FileName()).ToString();
FileReplacement offHandWeaponReplacement = CreateFileReplacement(offHandWeaponPath);
cache.AddFileReplacement(offHandWeaponReplacement);
Logger.Debug("OffHand Weapon " + string.Join(", ", offHandWeaponReplacement.GamePaths));
Logger.Debug("\t\t=> " + offHandWeaponReplacement.ResolvedPath);
for (var mtrlIdx = 0; mtrlIdx < offHandWeapon->MaterialCount; mtrlIdx++)
{
var mtrl = (Material*)offHandWeapon->Materials[mtrlIdx];
if (mtrl == null) continue;
var mtrlPath = new Utf8String(mtrl->ResourceHandle->FileName()).ToString().Split("|")[2];
var mtrlFileReplacement = CreateFileReplacement(mtrlPath);
Logger.Debug("\tOffHand Weapon Material " + string.Join(", ", mtrlFileReplacement.GamePaths));
Logger.Debug("\t\t\t=> " + mtrlFileReplacement.ResolvedPath);
cache.AddFileReplacement(mtrlFileReplacement);
var mtrlResourceHandle = (MtrlResource*)mtrl->ResourceHandle;
for (var resIdx = 0; resIdx < mtrlResourceHandle->NumTex; resIdx++)
{
var texPath = new Utf8String(mtrlResourceHandle->TexString(resIdx)).ToString();
if (string.IsNullOrEmpty(texPath)) continue;
var texFileReplacement = CreateFileReplacement(texPath, true);
Logger.Debug("\t\tOffHand tWeapon Texture " + string.Join(", ", texFileReplacement.GamePaths));
Logger.Debug("\t\t\t\t=> " + texFileReplacement.ResolvedPath);
cache.AddFileReplacement(texFileReplacement);
if (texPath.Contains("/--")) continue;
var texDoubleMinusFileReplacement =
CreateFileReplacement(texPath.Insert(texPath.LastIndexOf('/') + 1, "--"), true);
Logger.Debug("\t\tOffHand Weapon Texture-- " + string.Join(", ", texDoubleMinusFileReplacement.GamePaths));
Logger.Debug("\t\t\t\t=> " + texDoubleMinusFileReplacement.ResolvedPath);
cache.AddFileReplacement(texDoubleMinusFileReplacement);
}
}
}
var tattooDecalFileReplacement =
CreateFileReplacement(new Utf8String(human->Decal->FileName()).ToString());
cache.AddFileReplacement(tattooDecalFileReplacement);

View File

@@ -12,6 +12,9 @@ namespace MareSynchronos.Interop
[StructLayout(LayoutKind.Explicit)]
public unsafe struct Weapon
{
[FieldOffset(0x18)] public IntPtr Parent;
[FieldOffset(0x20)] public IntPtr NextSibling;
[FieldOffset(0x28)] public IntPtr PreviousSibling;
[FieldOffset(0xA8)] public WeaponDrawObject* WeaponRenderModel;
}