From dd1586d5d6deb08c3d6a55fc10b60271fbf05fda Mon Sep 17 00:00:00 2001 From: KazWolfe Date: Tue, 23 May 2023 11:41:59 -0700 Subject: [PATCH] 6.4 Patch Rollup (#1206) Fix Dalamud for 6.4, hopefully. --- Dalamud.CorePlugin/Dalamud.CorePlugin.csproj | 2 +- Dalamud/Dalamud.csproj | 2 +- .../ClientState/Aetherytes/AetheryteList.cs | 30 +++---- .../ClientState/ClientStateAddressResolver.cs | 14 --- Dalamud/Game/Gui/ChatGuiAddressResolver.cs | 2 +- Dalamud/Game/Gui/GameGui.cs | 85 +++++++------------ Dalamud/Game/Gui/GameGuiAddressResolver.cs | 8 +- Dalamud/Game/Internal/DalamudAtkTweaks.cs | 2 +- .../Game/Libc/LibcFunctionAddressResolver.cs | 4 +- .../Network/GameNetworkAddressResolver.cs | 2 +- Dalamud/Interface/Internal/UiDebug.cs | 6 +- lib/FFXIVClientStructs | 2 +- 12 files changed, 52 insertions(+), 107 deletions(-) diff --git a/Dalamud.CorePlugin/Dalamud.CorePlugin.csproj b/Dalamud.CorePlugin/Dalamud.CorePlugin.csproj index aea9fe452..25919af07 100644 --- a/Dalamud.CorePlugin/Dalamud.CorePlugin.csproj +++ b/Dalamud.CorePlugin/Dalamud.CorePlugin.csproj @@ -28,7 +28,7 @@ - + all diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj index 8f9b99af6..61730b5ca 100644 --- a/Dalamud/Dalamud.csproj +++ b/Dalamud/Dalamud.csproj @@ -68,7 +68,7 @@ - + diff --git a/Dalamud/Game/ClientState/Aetherytes/AetheryteList.cs b/Dalamud/Game/ClientState/Aetherytes/AetheryteList.cs index 46b285c68..9f8a62faf 100644 --- a/Dalamud/Game/ClientState/Aetherytes/AetheryteList.cs +++ b/Dalamud/Game/ClientState/Aetherytes/AetheryteList.cs @@ -1,10 +1,9 @@ -using System; using System.Collections; using System.Collections.Generic; -using System.Runtime.InteropServices; using Dalamud.IoC; using Dalamud.IoC.Internal; +using FFXIVClientStructs.FFXIV.Client.Game.UI; using Serilog; namespace Dalamud.Game.ClientState.Aetherytes; @@ -15,28 +14,23 @@ namespace Dalamud.Game.ClientState.Aetherytes; [PluginInterface] [InterfaceVersion("1.0")] [ServiceManager.BlockingEarlyLoadedService] -public sealed partial class AetheryteList : IServiceType +public sealed unsafe partial class AetheryteList : IServiceType { [ServiceManager.ServiceDependency] private readonly ClientState clientState = Service.Get(); - private readonly ClientStateAddressResolver address; - private readonly UpdateAetheryteListDelegate updateAetheryteListFunc; + + private readonly Telepo* telepoInstance = Telepo.Instance(); [ServiceManager.ServiceConstructor] private AetheryteList() { - this.address = this.clientState.AddressResolver; - this.updateAetheryteListFunc = Marshal.GetDelegateForFunctionPointer(this.address.UpdateAetheryteList); - - Log.Verbose($"Teleport address 0x{this.address.Telepo.ToInt64():X}"); + Log.Verbose($"Teleport address 0x{((nint)this.telepoInstance).ToInt64():X}"); } - private delegate void UpdateAetheryteListDelegate(IntPtr telepo, byte arg1); - /// /// Gets the amount of Aetherytes the local player has unlocked. /// - public unsafe int Length + public int Length { get { @@ -45,21 +39,19 @@ public sealed partial class AetheryteList : IServiceType this.Update(); - if (TelepoStruct->TeleportList.First == TelepoStruct->TeleportList.Last) + if (this.telepoInstance->TeleportList.First == this.telepoInstance->TeleportList.Last) return 0; - return (int)TelepoStruct->TeleportList.Size(); + return (int)this.telepoInstance->TeleportList.Size(); } } - private unsafe FFXIVClientStructs.FFXIV.Client.Game.UI.Telepo* TelepoStruct => (FFXIVClientStructs.FFXIV.Client.Game.UI.Telepo*)this.address.Telepo; - /// /// Gets a Aetheryte Entry at the specified index. /// /// Index. /// A at the specified index. - public unsafe AetheryteEntry? this[int index] + public AetheryteEntry? this[int index] { get { @@ -71,7 +63,7 @@ public sealed partial class AetheryteList : IServiceType if (this.clientState.LocalPlayer == null) return null; - return new AetheryteEntry(TelepoStruct->TeleportList.Get((ulong)index)); + return new AetheryteEntry(this.telepoInstance->TeleportList.Get((ulong)index)); } } @@ -81,7 +73,7 @@ public sealed partial class AetheryteList : IServiceType if (this.clientState.LocalPlayer == null) return; - this.updateAetheryteListFunc(this.address.Telepo, 0); + this.telepoInstance->UpdateAetheryteList(); } } diff --git a/Dalamud/Game/ClientState/ClientStateAddressResolver.cs b/Dalamud/Game/ClientState/ClientStateAddressResolver.cs index 34ae44e04..369e620be 100644 --- a/Dalamud/Game/ClientState/ClientStateAddressResolver.cs +++ b/Dalamud/Game/ClientState/ClientStateAddressResolver.cs @@ -62,11 +62,6 @@ public sealed class ClientStateAddressResolver : BaseAddressResolver /// public IntPtr ConditionFlags { get; private set; } - /// - /// Gets the address of the Telepo instance. - /// - public IntPtr Telepo { get; private set; } - // Functions /// @@ -80,11 +75,6 @@ public sealed class ClientStateAddressResolver : BaseAddressResolver /// public IntPtr GamepadPoll { get; private set; } - /// - /// Gets the address of the method which updates the list of available teleport locations. - /// - public IntPtr UpdateAetheryteList { get; private set; } - /// /// Scan for and setup any configured address pointers. /// @@ -115,9 +105,5 @@ public sealed class ClientStateAddressResolver : BaseAddressResolver this.TargetManager = sig.GetStaticAddressFromSig("48 8B 05 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? FF 50 ?? 48 85 DB"); this.GamepadPoll = sig.ScanText("40 ?? 57 41 ?? 48 81 EC ?? ?? ?? ?? 44 0F ?? ?? ?? ?? ?? ?? ?? 48 8B"); - - this.Telepo = sig.GetStaticAddressFromSig("48 8D 0D ?? ?? ?? ?? 48 8B 12"); - - this.UpdateAetheryteList = sig.ScanText("E8 ?? ?? ?? ?? 48 89 46 68 4C 8D 45 50"); } } diff --git a/Dalamud/Game/Gui/ChatGuiAddressResolver.cs b/Dalamud/Game/Gui/ChatGuiAddressResolver.cs index a94dec1a7..4686d5725 100644 --- a/Dalamud/Game/Gui/ChatGuiAddressResolver.cs +++ b/Dalamud/Game/Gui/ChatGuiAddressResolver.cs @@ -96,7 +96,7 @@ public sealed class ChatGuiAddressResolver : BaseAddressResolver // PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 FA F2 B0 FF 8B C8 EB 1D 0F B6 42 14 8B 4A"); // PopulateItemLinkObject = sig.ScanText( "48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 ?? ?? B0 FF 8B C8 EB 1D 0F B6 42 14 8B 4A"); 5.0 - this.PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 ?? ?? ?? FF 8B C8 EB 1D 0F B6 42 14 8B 4A"); + this.PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 ?? ?? ?? FF 8B C8 EB 1D 0F B6 42 14 8B 4A"); this.InteractableLinkClicked = sig.ScanText("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 80 BB ?? ?? ?? ?? ?? 0F 85 ?? ?? ?? ?? 80 BB") + 9; } diff --git a/Dalamud/Game/Gui/GameGui.cs b/Dalamud/Game/Gui/GameGui.cs index d3b479642..59c136416 100644 --- a/Dalamud/Game/Gui/GameGui.cs +++ b/Dalamud/Game/Gui/GameGui.cs @@ -11,9 +11,14 @@ using Dalamud.Utility; using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.UI; +using FFXIVClientStructs.FFXIV.Common.Component.BGCollision; using FFXIVClientStructs.FFXIV.Component.GUI; using ImGuiNET; using Serilog; +using SharpDX; + +using Vector2 = System.Numerics.Vector2; +using Vector3 = System.Numerics.Vector3; namespace Dalamud.Game.Gui; @@ -28,7 +33,6 @@ public sealed unsafe class GameGui : IDisposable, IServiceType private readonly GameGuiAddressResolver address; private readonly GetMatrixSingletonDelegate getMatrixSingleton; - private readonly ScreenToWorldNativeDelegate screenToWorldNative; private readonly Hook setGlobalBgmHook; private readonly Hook handleItemHoverHook; @@ -66,9 +70,7 @@ public sealed unsafe class GameGui : IDisposable, IServiceType this.handleImmHook = Hook.FromAddress(this.address.HandleImm, this.HandleImmDetour); this.getMatrixSingleton = Marshal.GetDelegateForFunctionPointer(this.address.GetMatrixSingleton); - - this.screenToWorldNative = Marshal.GetDelegateForFunctionPointer(this.address.ScreenToWorld); - + this.toggleUiHideHook = Hook.FromAddress(this.address.ToggleUiHide, this.ToggleUiHideDetour); this.utf8StringFromSequenceHook = Hook.FromAddress(this.address.Utf8StringFromSequence, this.Utf8StringFromSequenceDetour); @@ -79,9 +81,6 @@ public sealed unsafe class GameGui : IDisposable, IServiceType [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate IntPtr GetMatrixSingletonDelegate(); - [UnmanagedFunctionPointer(CallingConvention.ThisCall)] - private unsafe delegate bool ScreenToWorldNativeDelegate(float* camPos, float* clipPos, float rayDistance, float* worldPos, int* unknown); - // Hooked delegates [UnmanagedFunctionPointer(CallingConvention.ThisCall)] @@ -246,18 +245,15 @@ public sealed unsafe class GameGui : IDisposable, IServiceType var matrixSingleton = this.getMatrixSingleton(); // Read current ViewProjectionMatrix plus game window size - var viewProjectionMatrix = default(SharpDX.Matrix); + var viewProjectionMatrix = default(Matrix); float width, height; - unsafe - { - var rawMatrix = (float*)(matrixSingleton + 0x1b4).ToPointer(); + var rawMatrix = (float*)(matrixSingleton + 0x1b4).ToPointer(); - for (var i = 0; i < 16; i++, rawMatrix++) - viewProjectionMatrix[i] = *rawMatrix; + for (var i = 0; i < 16; i++, rawMatrix++) + viewProjectionMatrix[i] = *rawMatrix; - width = *rawMatrix; - height = *(rawMatrix + 1); - } + width = *rawMatrix; + height = *(rawMatrix + 1); viewProjectionMatrix.Invert(); @@ -277,38 +273,19 @@ public sealed unsafe class GameGui : IDisposable, IServiceType var clipPos = camPosOne - camPos; clipPos.Normalize(); - bool isSuccess; - unsafe + // This array is larger than necessary because it contains more info than we currently use + var worldPosArray = default(RaycastHit); + + // Theory: this is some kind of flag on what type of things the ray collides with + var unknown = stackalloc int[3] { - var camPosArray = camPos.ToArray(); - var clipPosArray = clipPos.ToArray(); + 0x4000, + 0x4000, + 0x0, + }; - // This array is larger than necessary because it contains more info than we currently use - var worldPosArray = stackalloc float[32]; - - // Theory: this is some kind of flag on what type of things the ray collides with - var unknown = stackalloc int[3] - { - 0x4000, - 0x4000, - 0x0, - }; - - fixed (float* pCamPos = camPosArray) - { - fixed (float* pClipPos = clipPosArray) - { - isSuccess = this.screenToWorldNative(pCamPos, pClipPos, rayDistance, worldPosArray, unknown); - } - } - - worldPos = new Vector3 - { - X = worldPosArray[0], - Y = worldPosArray[1], - Z = worldPosArray[2], - }; - } + var isSuccess = BGCollisionModule.Raycast2(camPos.ToSystem(), clipPos.ToSystem(), rayDistance, &worldPosArray, unknown); + worldPos = worldPosArray.Point; return isSuccess; } @@ -317,7 +294,7 @@ public sealed unsafe class GameGui : IDisposable, IServiceType /// Gets a pointer to the game's UI module. /// /// IntPtr pointing to UI module. - public unsafe IntPtr GetUIModule() + public IntPtr GetUIModule() { var framework = FFXIVClientStructs.FFXIV.Client.System.Framework.Framework.Instance(); if (framework == null) @@ -336,9 +313,9 @@ public sealed unsafe class GameGui : IDisposable, IServiceType /// Name of addon to find. /// Index of addon to find (1-indexed). /// IntPtr.Zero if unable to find UI, otherwise IntPtr pointing to the start of the addon. - public unsafe IntPtr GetAddonByName(string name, int index = 1) + public IntPtr GetAddonByName(string name, int index = 1) { - var atkStage = FFXIVClientStructs.FFXIV.Component.GUI.AtkStage.GetSingleton(); + var atkStage = AtkStage.GetSingleton(); if (atkStage == null) return IntPtr.Zero; @@ -360,7 +337,7 @@ public sealed unsafe class GameGui : IDisposable, IServiceType /// A pointer to the agent interface. public IntPtr FindAgentInterface(string addonName) { - var addon = this.GetAddonByName(addonName, 1); + var addon = this.GetAddonByName(addonName); return this.FindAgentInterface(addon); } @@ -369,7 +346,7 @@ public sealed unsafe class GameGui : IDisposable, IServiceType /// /// The addon address. /// A pointer to the agent interface. - public unsafe IntPtr FindAgentInterface(void* addon) => this.FindAgentInterface((IntPtr)addon); + public IntPtr FindAgentInterface(void* addon) => this.FindAgentInterface((IntPtr)addon); /// /// Find the agent associated with an addon, if possible. @@ -430,9 +407,9 @@ public sealed unsafe class GameGui : IDisposable, IServiceType /// A value indicating whether or not the game is on the title screen. internal bool IsOnTitleScreen() { - var charaSelect = this.GetAddonByName("CharaSelect", 1); - var charaMake = this.GetAddonByName("CharaMake", 1); - var titleDcWorldMap = this.GetAddonByName("TitleDCWorldMap", 1); + var charaSelect = this.GetAddonByName("CharaSelect"); + var charaMake = this.GetAddonByName("CharaMake"); + var titleDcWorldMap = this.GetAddonByName("TitleDCWorldMap"); if (charaMake != nint.Zero || charaSelect != nint.Zero || titleDcWorldMap != nint.Zero) return false; diff --git a/Dalamud/Game/Gui/GameGuiAddressResolver.cs b/Dalamud/Game/Gui/GameGuiAddressResolver.cs index fda4acb99..e45b07487 100644 --- a/Dalamud/Game/Gui/GameGuiAddressResolver.cs +++ b/Dalamud/Game/Gui/GameGuiAddressResolver.cs @@ -47,11 +47,6 @@ internal sealed class GameGuiAddressResolver : BaseAddressResolver /// public IntPtr GetMatrixSingleton { get; private set; } - /// - /// Gets the address of the native ScreenToWorld method. - /// - public IntPtr ScreenToWorld { get; private set; } - /// /// Gets the address of the native ToggleUiHide method. /// @@ -66,13 +61,12 @@ internal sealed class GameGuiAddressResolver : BaseAddressResolver protected override void Setup64Bit(SigScanner sig) { this.SetGlobalBgm = sig.ScanText("4C 8B 15 ?? ?? ?? ?? 4D 85 D2 74 58"); - this.HandleItemHover = sig.ScanText("E8 ?? ?? ?? ?? 48 8B 5C 24 ?? 48 89 AE ?? ?? ?? ??"); + this.HandleItemHover = sig.ScanText("E8 ?? ?? ?? ?? 48 8B 5C 24 ?? 48 89 AE ?? ?? ?? ?? 48 89 AE ?? ?? ?? ??"); this.HandleItemOut = sig.ScanText("48 89 5C 24 ?? 57 48 83 EC 20 48 8B FA 48 8B D9 4D"); this.HandleActionHover = sig.ScanText("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 83 F8 0F"); this.HandleActionOut = sig.ScanText("48 89 5C 24 ?? 57 48 83 EC 20 48 8B DA 48 8B F9 4D 85 C0 74 1F"); this.HandleImm = sig.ScanText("E8 ?? ?? ?? ?? 84 C0 75 10 48 83 FF 09"); this.GetMatrixSingleton = sig.ScanText("E8 ?? ?? ?? ?? 48 8D 4C 24 ?? 48 89 4c 24 ?? 4C 8D 4D ?? 4C 8D 44 24 ??"); - this.ScreenToWorld = sig.ScanText("48 83 EC 48 48 8B 05 ?? ?? ?? ?? 4D 8B D1"); this.ToggleUiHide = sig.ScanText("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 0F B6 B9 ?? ?? ?? ?? B8 ?? ?? ?? ??"); this.Utf8StringFromSequence = sig.ScanText("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8D 41 22 66 C7 41 ?? ?? ?? 48 89 01 49 8B D8"); } diff --git a/Dalamud/Game/Internal/DalamudAtkTweaks.cs b/Dalamud/Game/Internal/DalamudAtkTweaks.cs index 9ed5d7ab9..60e61b2f7 100644 --- a/Dalamud/Game/Internal/DalamudAtkTweaks.cs +++ b/Dalamud/Game/Internal/DalamudAtkTweaks.cs @@ -56,7 +56,7 @@ internal sealed unsafe partial class DalamudAtkTweaks : IServiceType var uiModuleRequestMainCommandAddress = sigScanner.ScanText("40 53 56 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 48 8B 01 8B DA 48 8B F1 FF 90 ?? ?? ?? ??"); this.hookUiModuleRequestMainCommand = Hook.FromAddress(uiModuleRequestMainCommandAddress, this.UiModuleRequestMainCommandDetour); - var atkUnitBaseReceiveGlobalEventAddress = sigScanner.ScanText("48 89 5C 24 ?? 48 89 7C 24 ?? 55 41 56 41 57 48 8B EC 48 83 EC 50 44 0F B7 F2 "); + var atkUnitBaseReceiveGlobalEventAddress = sigScanner.ScanText("48 89 5C 24 ?? 48 89 7C 24 ?? 55 41 56 41 57 48 8B EC 48 83 EC 50 44 0F B7 F2"); this.hookAtkUnitBaseReceiveGlobalEvent = Hook.FromAddress(atkUnitBaseReceiveGlobalEventAddress, this.AtkUnitBaseReceiveGlobalEventDetour); this.locDalamudPlugins = Loc.Localize("SystemMenuPlugins", "Dalamud Plugins"); diff --git a/Dalamud/Game/Libc/LibcFunctionAddressResolver.cs b/Dalamud/Game/Libc/LibcFunctionAddressResolver.cs index 4189bc280..89b721a87 100644 --- a/Dalamud/Game/Libc/LibcFunctionAddressResolver.cs +++ b/Dalamud/Game/Libc/LibcFunctionAddressResolver.cs @@ -22,7 +22,7 @@ public sealed class LibcFunctionAddressResolver : BaseAddressResolver /// protected override void Setup64Bit(SigScanner sig) { - this.StdStringFromCstring = sig.ScanText("48895C2408 4889742410 57 4883EC20 488D4122 66C741200101 488901 498BD8"); - this.StdStringDeallocate = sig.ScanText("80792100 7512 488B5108 41B833000000 488B09 E9??????00 C3"); + this.StdStringFromCstring = sig.ScanText("48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 48 8D 41 22 66 C7 41 20 01 01 48 89 01 49 8B D8"); + this.StdStringDeallocate = sig.ScanText("80 79 21 00 75 12 48 8B 51 08 41 B8 33 00 00 00 48 8B 09 E9 ?? ?? ?? 00 C3"); } } diff --git a/Dalamud/Game/Network/GameNetworkAddressResolver.cs b/Dalamud/Game/Network/GameNetworkAddressResolver.cs index 5be85bd35..c698ee813 100644 --- a/Dalamud/Game/Network/GameNetworkAddressResolver.cs +++ b/Dalamud/Game/Network/GameNetworkAddressResolver.cs @@ -22,7 +22,7 @@ public sealed class GameNetworkAddressResolver : BaseAddressResolver { // ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 7A FF 0F B7 57 02 8D 42 89 3D 5F 02 00 00 0F 87 60 01 00 00 4C 8D 05"); // ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 73 FF 0F B7 57 02 8D 42 ?? 3D ?? ?? 00 00 0F 87 60 01 00 00 4C 8D 05"); - this.ProcessZonePacketDown = sig.ScanText("48 89 5C 24 ?? 56 48 83 EC 50 8B F2"); + this.ProcessZonePacketDown = sig.ScanText("40 53 56 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 ?? 8B F2"); this.ProcessZonePacketUp = sig.ScanText("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 41 56 41 57 48 83 EC 70 8B 81 ?? ?? ?? ??"); } } diff --git a/Dalamud/Interface/Internal/UiDebug.cs b/Dalamud/Interface/Internal/UiDebug.cs index 75c94a61d..3b3c4e003 100644 --- a/Dalamud/Interface/Internal/UiDebug.cs +++ b/Dalamud/Interface/Internal/UiDebug.cs @@ -19,7 +19,6 @@ internal unsafe class UiDebug { private const int UnitListCount = 18; - private readonly GetAtkStageSingleton getAtkStageSingleton; private readonly bool[] selectedInList = new bool[UnitListCount]; private readonly string[] listNames = new string[UnitListCount] { @@ -52,9 +51,6 @@ internal unsafe class UiDebug /// public UiDebug() { - var sigScanner = Service.Get(); - var getSingletonAddr = sigScanner.ScanText("E8 ?? ?? ?? ?? 41 B8 01 00 00 00 48 8D 15 ?? ?? ?? ?? 48 8B 48 20 E8 ?? ?? ?? ?? 48 8B CF"); - this.getAtkStageSingleton = Marshal.GetDelegateForFunctionPointer(getSingletonAddr); } private delegate AtkStage* GetAtkStageSingleton(); @@ -445,7 +441,7 @@ internal unsafe class UiDebug { var foundSelected = false; var noResults = true; - var stage = this.getAtkStageSingleton(); + var stage = AtkStage.GetSingleton(); var unitManagers = &stage->RaptureAtkUnitManager->AtkUnitManager.DepthLayerOneList; diff --git a/lib/FFXIVClientStructs b/lib/FFXIVClientStructs index a00585972..af97552fa 160000 --- a/lib/FFXIVClientStructs +++ b/lib/FFXIVClientStructs @@ -1 +1 @@ -Subproject commit a00585972e44ccc6799091f8f53020b7f8c16f1d +Subproject commit af97552fa584073be9c2dba1830ec08a71b7dd93