using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using OtterGui.Services; using Penumbra.GameData; using Penumbra.Interop.PathResolving; namespace Penumbra.Interop.Hooks.Animation; /// Called for some animations when mounted or mounting. public sealed unsafe class SomeMountAnimation : FastHook { private readonly GameState _state; private readonly CollectionResolver _collectionResolver; public SomeMountAnimation(HookManager hooks, GameState state, CollectionResolver collectionResolver) { _state = state; _collectionResolver = collectionResolver; Task = hooks.CreateHook("Some Mount Animation", Sigs.UnkMountAnimation, Detour, !HookOverrides.Instance.Animation.SomeMountAnimation); } public delegate void Delegate(DrawObject* drawObject, uint unk1, byte unk2, uint unk3); [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] private void Detour(DrawObject* drawObject, uint unk1, byte unk2, uint unk3) { Penumbra.Log.Excessive($"[Some Mount Animation] Invoked on {(nint)drawObject:X} with {unk1}, {unk2}, {unk3}."); var last = _state.SetAnimationData(_collectionResolver.IdentifyCollection(drawObject, true)); Task.Result.Original(drawObject, unk1, unk2, unk3); _state.RestoreAnimationData(last); } }