diff --git a/Penumbra/Interop/PathResolving/AnimationHookService.cs b/Penumbra/Interop/PathResolving/AnimationHookService.cs index ba47289f..787f13d0 100644 --- a/Penumbra/Interop/PathResolving/AnimationHookService.cs +++ b/Penumbra/Interop/PathResolving/AnimationHookService.cs @@ -3,6 +3,7 @@ using System.Threading; using Dalamud.Game.ClientState.Objects; using Dalamud.Hooking; using Dalamud.Utility.Signatures; +using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using Penumbra.Collections; using Penumbra.GameData; using Penumbra.GameData.Enums; @@ -44,6 +45,7 @@ public unsafe class AnimationHookService : IDisposable _loadCharacterVfxHook.Enable(); _loadAreaVfxHook.Enable(); _scheduleClipUpdateHook.Enable(); + _unkMountAnimationHook.Enable(); } public bool HandleFiles(ResourceType type, Utf8GamePath _, out ResolveData resolveData) @@ -98,6 +100,7 @@ public unsafe class AnimationHookService : IDisposable _loadCharacterVfxHook.Dispose(); _loadAreaVfxHook.Dispose(); _scheduleClipUpdateHook.Dispose(); + _unkMountAnimationHook.Dispose(); } /// Characters load some of their voice lines or whatever with this function. @@ -305,4 +308,18 @@ public unsafe class AnimationHookService : IDisposable return ResolveData.Invalid; } + + + private delegate void UnkMountAnimationDelegate(DrawObject* drawObject, uint unk1, byte unk2, uint unk3); + + [Signature("48 89 5C 24 ?? 48 89 6C 24 ?? 89 54 24", DetourName = nameof(UnkMountAnimationDetour))] + private readonly Hook _unkMountAnimationHook = null!; + + private void UnkMountAnimationDetour(DrawObject* drawObject, uint unk1, byte unk2, uint unk3) + { + var last = _animationLoadData.Value; + _animationLoadData.Value = _collectionResolver.IdentifyCollection(drawObject, true); + _unkMountAnimationHook.Original(drawObject, unk1, unk2, unk3); + _animationLoadData.Value = last; + } }