From 069929ce24feee1edfcaaeef4c7bbfaf35086a2d Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 4 Oct 2023 20:30:04 +0200 Subject: [PATCH] Some updates. --- .../MaterialPreview/LiveMaterialPreviewer.cs | 2 +- .../Interop/MaterialPreview/MaterialInfo.cs | 10 +++++----- .../PathResolving/AnimationHookService.cs | 19 ++++++++++++------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Penumbra/Interop/MaterialPreview/LiveMaterialPreviewer.cs b/Penumbra/Interop/MaterialPreview/LiveMaterialPreviewer.cs index 3ef31382..15989638 100644 --- a/Penumbra/Interop/MaterialPreview/LiveMaterialPreviewer.cs +++ b/Penumbra/Interop/MaterialPreview/LiveMaterialPreviewer.cs @@ -81,7 +81,7 @@ public sealed unsafe class LiveMaterialPreviewer : LiveMaterialPreviewerBase for (var i = 0; i < _shaderPackage->MaterialElementCount; ++i) { // TODO fix when CS updated - ref var parameter = ref ((ShaderPackage.MaterialElement*) ((byte*)_shaderPackage + 0xA0))[i]; + ref var parameter = ref ((ShaderPackage.MaterialElement*) ((byte*)_shaderPackage + 0x98))[i]; if (parameter.CRC == parameterCrc) { if ((parameter.Offset & 0x3) != 0 diff --git a/Penumbra/Interop/MaterialPreview/MaterialInfo.cs b/Penumbra/Interop/MaterialPreview/MaterialInfo.cs index 7dd6f983..c64e4d0b 100644 --- a/Penumbra/Interop/MaterialPreview/MaterialInfo.cs +++ b/Penumbra/Interop/MaterialPreview/MaterialInfo.cs @@ -33,9 +33,9 @@ public readonly record struct MaterialInfo(ObjectIndex ObjectIndex, DrawObjectTy return type switch { DrawObjectType.Character => (nint)gameObject->GameObject.GetDrawObject(), - DrawObjectType.Mainhand => *((nint*)&gameObject->DrawData.MainHand + 1), - DrawObjectType.Offhand => *((nint*)&gameObject->DrawData.OffHand + 1), - DrawObjectType.Vfx => *((nint*)&gameObject->DrawData.UnkF0 + 1), + DrawObjectType.Mainhand => (nint)gameObject->DrawData.Weapon(DrawDataContainer.WeaponSlot.MainHand).DrawObject, + DrawObjectType.Offhand => (nint)gameObject->DrawData.Weapon(DrawDataContainer.WeaponSlot.OffHand).DrawObject, + DrawObjectType.Vfx => (nint)gameObject->DrawData.Weapon(DrawDataContainer.WeaponSlot.Unk).DrawObject, _ => nint.Zero, }; } @@ -72,7 +72,7 @@ public readonly record struct MaterialInfo(ObjectIndex ObjectIndex, DrawObjectTy if (gameObject == null) continue; - var index = (ObjectIndex) gameObject->GameObject.ObjectIndex; + var index = (ObjectIndex)gameObject->GameObject.ObjectIndex; foreach (var type in Enum.GetValues()) { @@ -93,7 +93,7 @@ public readonly record struct MaterialInfo(ObjectIndex ObjectIndex, DrawObjectTy continue; var mtrlHandle = material->MaterialResourceHandle; - var path = ResolveContext.GetResourceHandlePath((Structs.ResourceHandle*)mtrlHandle); + var path = ResolveContext.GetResourceHandlePath((Structs.ResourceHandle*)mtrlHandle); if (path == needle) result.Add(new MaterialInfo(index, type, i, j)); } diff --git a/Penumbra/Interop/PathResolving/AnimationHookService.cs b/Penumbra/Interop/PathResolving/AnimationHookService.cs index 9b089658..7fa0ed35 100644 --- a/Penumbra/Interop/PathResolving/AnimationHookService.cs +++ b/Penumbra/Interop/PathResolving/AnimationHookService.cs @@ -2,6 +2,7 @@ using Dalamud.Game.ClientState.Conditions; using Dalamud.Hooking; using Dalamud.Plugin.Services; using Dalamud.Utility.Signatures; +using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using Penumbra.Collections; using Penumbra.Api.Enums; @@ -37,6 +38,10 @@ public unsafe class AnimationHookService : IDisposable _conditions = conditions; interop.InitializeFromAttributes(this); + _loadCharacterSoundHook = + interop.HookFromAddress( + (nint)FFXIVClientStructs.FFXIV.Client.Game.Character.Character.VfxContainer.MemberFunctionPointers.LoadCharacterSound, + LoadCharacterSoundDetour); _loadCharacterSoundHook.Enable(); _loadTimelineResourcesHook.Enable(); @@ -113,9 +118,7 @@ public unsafe class AnimationHookService : IDisposable /// Characters load some of their voice lines or whatever with this function. private delegate nint LoadCharacterSound(nint character, int unk1, int unk2, nint unk3, ulong unk4, int unk5, int unk6, ulong unk7); - // TODO: Use ClientStructs - [Signature(Sigs.LoadCharacterSound, DetourName = nameof(LoadCharacterSoundDetour))] - private readonly Hook _loadCharacterSoundHook = null!; + private readonly Hook _loadCharacterSoundHook; private nint LoadCharacterSoundDetour(nint container, int unk1, int unk2, nint unk3, ulong unk4, int unk5, int unk6, ulong unk7) { @@ -194,16 +197,18 @@ public unsafe class AnimationHookService : IDisposable _animationLoadData.Value = last; } + private delegate void SomeActionLoadDelegate(ActionTimelineManager* timelineManager); + /// Seems to load character actions when zoning or changing class, maybe. [Signature(Sigs.LoadSomeAction, DetourName = nameof(SomeActionLoadDetour))] - private readonly Hook _someActionLoadHook = null!; + private readonly Hook _someActionLoadHook = null!; - private void SomeActionLoadDetour(nint gameObject) + private void SomeActionLoadDetour(ActionTimelineManager* timelineManager) { using var performance = _performance.Measure(PerformanceType.LoadAction); var last = _animationLoadData.Value; - _animationLoadData.Value = _collectionResolver.IdentifyCollection((GameObject*)gameObject, true); - _someActionLoadHook.Original(gameObject); + _animationLoadData.Value = _collectionResolver.IdentifyCollection((GameObject*)timelineManager->Parent, true); + _someActionLoadHook.Original(timelineManager); _animationLoadData.Value = last; }