diff --git a/Penumbra/Interop/Resolver/PathResolver.Demihuman.cs b/Penumbra/Interop/Resolver/PathResolver.Demihuman.cs new file mode 100644 index 00000000..c938bb72 --- /dev/null +++ b/Penumbra/Interop/Resolver/PathResolver.Demihuman.cs @@ -0,0 +1,88 @@ +using System; +using Dalamud.Hooking; +using Dalamud.Utility.Signatures; + +namespace Penumbra.Interop.Resolver; + +public unsafe partial class PathResolver +{ + [Signature( "48 8D 05 ?? ?? ?? ?? 45 33 C0 48 89 03 BA", ScanType = ScanType.StaticAddress )] + public IntPtr* DrawObjectDemiVTable; + + public Hook< GeneralResolveDelegate >? ResolveDemiDecalPathHook; + public Hook< EidResolveDelegate >? ResolveDemiEidPathHook; + public Hook< GeneralResolveDelegate >? ResolveDemiImcPathHook; + public Hook< MPapResolveDelegate >? ResolveDemiMPapPathHook; + public Hook< GeneralResolveDelegate >? ResolveDemiMdlPathHook; + public Hook< MaterialResolveDetour >? ResolveDemiMtrlPathHook; + public Hook< MaterialResolveDetour >? ResolveDemiPapPathHook; + public Hook< GeneralResolveDelegate >? ResolveDemiPhybPathHook; + public Hook< GeneralResolveDelegate >? ResolveDemiSklbPathHook; + public Hook< GeneralResolveDelegate >? ResolveDemiSkpPathHook; + public Hook< EidResolveDelegate >? ResolveDemiTmbPathHook; + public Hook< MaterialResolveDetour >? ResolveDemiVfxPathHook; + + private void SetupDemiHooks() + { + ResolveDemiDecalPathHook = new Hook< GeneralResolveDelegate >( DrawObjectDemiVTable[ ResolveDecalIdx ], ResolveDemiDecalDetour ); + ResolveDemiEidPathHook = new Hook< EidResolveDelegate >( DrawObjectDemiVTable[ ResolveEidIdx ], ResolveDemiEidDetour ); + ResolveDemiImcPathHook = new Hook< GeneralResolveDelegate >( DrawObjectDemiVTable[ ResolveImcIdx ], ResolveDemiImcDetour ); + ResolveDemiMPapPathHook = new Hook< MPapResolveDelegate >( DrawObjectDemiVTable[ ResolveMPapIdx ], ResolveDemiMPapDetour ); + ResolveDemiMdlPathHook = new Hook< GeneralResolveDelegate >( DrawObjectDemiVTable[ ResolveMdlIdx ], ResolveDemiMdlDetour ); + ResolveDemiMtrlPathHook = new Hook< MaterialResolveDetour >( DrawObjectDemiVTable[ ResolveMtrlIdx ], ResolveDemiMtrlDetour ); + ResolveDemiPapPathHook = new Hook< MaterialResolveDetour >( DrawObjectDemiVTable[ ResolvePapIdx ], ResolveDemiPapDetour ); + ResolveDemiPhybPathHook = new Hook< GeneralResolveDelegate >( DrawObjectDemiVTable[ ResolvePhybIdx ], ResolveDemiPhybDetour ); + ResolveDemiSklbPathHook = new Hook< GeneralResolveDelegate >( DrawObjectDemiVTable[ ResolveSklbIdx ], ResolveDemiSklbDetour ); + ResolveDemiSkpPathHook = new Hook< GeneralResolveDelegate >( DrawObjectDemiVTable[ ResolveSkpIdx ], ResolveDemiSkpDetour ); + ResolveDemiTmbPathHook = new Hook< EidResolveDelegate >( DrawObjectDemiVTable[ ResolveTmbIdx ], ResolveDemiTmbDetour ); + ResolveDemiVfxPathHook = new Hook< MaterialResolveDetour >( DrawObjectDemiVTable[ ResolveVfxIdx ], ResolveDemiVfxDetour ); + } + + private void EnableDemiHooks() + { + ResolveDemiDecalPathHook?.Enable(); + ResolveDemiEidPathHook?.Enable(); + ResolveDemiImcPathHook?.Enable(); + ResolveDemiMPapPathHook?.Enable(); + ResolveDemiMdlPathHook?.Enable(); + ResolveDemiMtrlPathHook?.Enable(); + ResolveDemiPapPathHook?.Enable(); + ResolveDemiPhybPathHook?.Enable(); + ResolveDemiSklbPathHook?.Enable(); + ResolveDemiSkpPathHook?.Enable(); + ResolveDemiTmbPathHook?.Enable(); + ResolveDemiVfxPathHook?.Enable(); + } + + private void DisableDemiHooks() + { + ResolveDemiDecalPathHook?.Disable(); + ResolveDemiEidPathHook?.Disable(); + ResolveDemiImcPathHook?.Disable(); + ResolveDemiMPapPathHook?.Disable(); + ResolveDemiMdlPathHook?.Disable(); + ResolveDemiMtrlPathHook?.Disable(); + ResolveDemiPapPathHook?.Disable(); + ResolveDemiPhybPathHook?.Disable(); + ResolveDemiSklbPathHook?.Disable(); + ResolveDemiSkpPathHook?.Disable(); + ResolveDemiTmbPathHook?.Disable(); + ResolveDemiVfxPathHook?.Disable(); + } + + private void DisposeDemiHooks() + { + ResolveDemiDecalPathHook?.Dispose(); + ResolveDemiEidPathHook?.Dispose(); + ResolveDemiImcPathHook?.Dispose(); + ResolveDemiMPapPathHook?.Dispose(); + ResolveDemiMdlPathHook?.Dispose(); + ResolveDemiMtrlPathHook?.Dispose(); + ResolveDemiPapPathHook?.Dispose(); + ResolveDemiPhybPathHook?.Dispose(); + ResolveDemiSklbPathHook?.Dispose(); + ResolveDemiSkpPathHook?.Dispose(); + ResolveDemiTmbPathHook?.Dispose(); + ResolveDemiVfxPathHook?.Dispose(); + } +} \ No newline at end of file diff --git a/Penumbra/Interop/Resolver/PathResolver.Human.cs b/Penumbra/Interop/Resolver/PathResolver.Human.cs index 1ce81342..b4bb8fcd 100644 --- a/Penumbra/Interop/Resolver/PathResolver.Human.cs +++ b/Penumbra/Interop/Resolver/PathResolver.Human.cs @@ -14,12 +14,6 @@ public unsafe partial class PathResolver // [Signature( "48 8D 1D ?? ?? ?? ?? 48 C7 41", ScanType = ScanType.StaticAddress )] // public IntPtr* DrawObjectVTable; // - // [Signature( "48 8D 05 ?? ?? ?? ?? 45 33 C0 48 89 03 BA", ScanType = ScanType.StaticAddress )] - // public IntPtr* DrawObjectDemihumanVTable; - // - // [Signature( "48 8D 05 ?? ?? ?? ?? 48 89 03 33 C0 48 89 83 ?? ?? ?? ?? 48 89 83 ?? ?? ?? ?? C7 83", ScanType = ScanType.StaticAddress )] - // public IntPtr* DrawObjectMonsterVTable; - // // public const int ResolveRootIdx = 71; public const int ResolveSklbIdx = 72; diff --git a/Penumbra/Interop/Resolver/PathResolver.Resolve.cs b/Penumbra/Interop/Resolver/PathResolver.Resolve.cs index a6124a93..3892fcbd 100644 --- a/Penumbra/Interop/Resolver/PathResolver.Resolve.cs +++ b/Penumbra/Interop/Resolver/PathResolver.Resolve.cs @@ -136,6 +136,43 @@ public unsafe partial class PathResolver private IntPtr ResolveMonsterVfxDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4, ulong unk5 ) => ResolvePathDetour( drawObject, ResolveMonsterVfxPathHook!.Original( drawObject, path, unk3, unk4, unk5 ) ); + // Demihumans + private IntPtr ResolveDemiDecalDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4 ) + => ResolvePathDetour( drawObject, ResolveDemiDecalPathHook!.Original( drawObject, path, unk3, unk4 ) ); + + private IntPtr ResolveDemiEidDetour( IntPtr drawObject, IntPtr path, IntPtr unk3 ) + => ResolvePathDetour( drawObject, ResolveDemiEidPathHook!.Original( drawObject, path, unk3 ) ); + + private IntPtr ResolveDemiImcDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4 ) + => ResolvePathDetour( drawObject, ResolveDemiImcPathHook!.Original( drawObject, path, unk3, unk4 ) ); + + private IntPtr ResolveDemiMPapDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4, uint unk5 ) + => ResolvePathDetour( drawObject, ResolveDemiMPapPathHook!.Original( drawObject, path, unk3, unk4, unk5 ) ); + + private IntPtr ResolveDemiMdlDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint modelType ) + => ResolvePathDetour( drawObject, ResolveDemiMdlPathHook!.Original( drawObject, path, unk3, modelType ) ); + + private IntPtr ResolveDemiMtrlDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4, ulong unk5 ) + => ResolvePathDetour( drawObject, ResolveDemiMtrlPathHook!.Original( drawObject, path, unk3, unk4, unk5 ) ); + + private IntPtr ResolveDemiPapDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4, ulong unk5 ) + => ResolvePathDetour( drawObject, ResolveDemiPapPathHook!.Original( drawObject, path, unk3, unk4, unk5 ) ); + + private IntPtr ResolveDemiPhybDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4 ) + => ResolvePathDetour( drawObject, ResolveDemiPhybPathHook!.Original( drawObject, path, unk3, unk4 ) ); + + private IntPtr ResolveDemiSklbDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4 ) + => ResolvePathDetour( drawObject, ResolveDemiSklbPathHook!.Original( drawObject, path, unk3, unk4 ) ); + + private IntPtr ResolveDemiSkpDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4 ) + => ResolvePathDetour( drawObject, ResolveDemiSkpPathHook!.Original( drawObject, path, unk3, unk4 ) ); + + private IntPtr ResolveDemiTmbDetour( IntPtr drawObject, IntPtr path, IntPtr unk3 ) + => ResolvePathDetour( drawObject, ResolveDemiTmbPathHook!.Original( drawObject, path, unk3 ) ); + + private IntPtr ResolveDemiVfxDetour( IntPtr drawObject, IntPtr path, IntPtr unk3, uint unk4, ulong unk5 ) + => ResolvePathDetour( drawObject, ResolveDemiVfxPathHook!.Original( drawObject, path, unk3, unk4, unk5 ) ); + // Implementation [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] diff --git a/Penumbra/Interop/Resolver/PathResolver.cs b/Penumbra/Interop/Resolver/PathResolver.cs index c634755a..d12e6d00 100644 --- a/Penumbra/Interop/Resolver/PathResolver.cs +++ b/Penumbra/Interop/Resolver/PathResolver.cs @@ -27,6 +27,7 @@ public partial class PathResolver : IDisposable SetupHumanHooks(); SetupWeaponHooks(); SetupMonsterHooks(); + SetupDemiHooks(); SetupMetaHooks(); } @@ -105,6 +106,7 @@ public partial class PathResolver : IDisposable EnableHumanHooks(); EnableWeaponHooks(); EnableMonsterHooks(); + EnableDemiHooks(); EnableMtrlHooks(); EnableDataHooks(); EnableMetaHooks(); @@ -124,6 +126,7 @@ public partial class PathResolver : IDisposable DisableHumanHooks(); DisableWeaponHooks(); DisableMonsterHooks(); + DisableDemiHooks(); DisableMtrlHooks(); DisableDataHooks(); DisableMetaHooks(); @@ -141,6 +144,7 @@ public partial class PathResolver : IDisposable DisposeHumanHooks(); DisposeWeaponHooks(); DisposeMonsterHooks(); + DisposeDemiHooks(); DisposeMtrlHooks(); DisposeDataHooks(); DisposeMetaHooks();