diff --git a/Penumbra/Interop/PathResolving/AnimationHookService.cs b/Penumbra/Interop/PathResolving/AnimationHookService.cs index 787f13d0..e3b06de3 100644 --- a/Penumbra/Interop/PathResolving/AnimationHookService.cs +++ b/Penumbra/Interop/PathResolving/AnimationHookService.cs @@ -46,6 +46,7 @@ public unsafe class AnimationHookService : IDisposable _loadAreaVfxHook.Enable(); _scheduleClipUpdateHook.Enable(); _unkMountAnimationHook.Enable(); + _unkParasolAnimationHook.Enable(); } public bool HandleFiles(ResourceType type, Utf8GamePath _, out ResolveData resolveData) @@ -101,6 +102,7 @@ public unsafe class AnimationHookService : IDisposable _loadAreaVfxHook.Dispose(); _scheduleClipUpdateHook.Dispose(); _unkMountAnimationHook.Dispose(); + _unkParasolAnimationHook.Dispose(); } /// Characters load some of their voice lines or whatever with this function. @@ -317,9 +319,23 @@ public unsafe class AnimationHookService : IDisposable private void UnkMountAnimationDetour(DrawObject* drawObject, uint unk1, byte unk2, uint unk3) { - var last = _animationLoadData.Value; + var last = _animationLoadData.Value; _animationLoadData.Value = _collectionResolver.IdentifyCollection(drawObject, true); _unkMountAnimationHook.Original(drawObject, unk1, unk2, unk3); _animationLoadData.Value = last; } + + + private delegate void UnkParasolAnimationDelegate(DrawObject* drawObject, int unk1); + + [Signature("48 89 5C 24 ?? 48 89 74 24 ?? 89 54 24 ?? 57 48 83 EC ?? 48 8B F9", DetourName = nameof(UnkParasolAnimationDetour))] + private readonly Hook _unkParasolAnimationHook = null!; + + private void UnkParasolAnimationDetour(DrawObject* drawObject, int unk1) + { + var last = _animationLoadData.Value; + _animationLoadData.Value = _collectionResolver.IdentifyCollection(drawObject, true); + _unkParasolAnimationHook!.Original(drawObject, unk1); + _animationLoadData.Value = last; + } }