diff --git a/Dalamud/Game/Gui/AgentUpdateFlag.cs b/Dalamud/Game/Gui/AgentUpdateFlag.cs deleted file mode 100644 index 3e2808adb..000000000 --- a/Dalamud/Game/Gui/AgentUpdateFlag.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FFXIVClientStructs.FFXIV.Client.UI.Agent; - -namespace Dalamud.Game.Gui; - -/// -/// Represents a flag set by the game used by agents to conditionally update their addons. -/// -[Flags] -public enum AgentUpdateFlag : byte -{ - /// Set when an inventory has been updated. - InventoryUpdate = 1 << 0, - - /// Set when a hotbar slot has been executed, or a Gearset or Macro has been changed. - ActionBarUpdate = 1 << 1, - - /// Set when the RetainerMarket inventory has been updated. - RetainerMarketInventoryUpdate = 1 << 2, - - // /// Unknown use case. - // NameplateUpdate = 1 << 3, - - /// Set when the player unlocked collectibles, contents or systems. - UnlocksUpdate = 1 << 4, - - /// Set when was called. - MainCommandEnabledStateUpdate = 1 << 5, - - /// Set when any housing inventory has been updated. - HousingInventoryUpdate = 1 << 6, - - /// Set when any content inventory has been updated. - ContentInventoryUpdate = 1 << 7, -} diff --git a/Dalamud/Game/Gui/GameGui.cs b/Dalamud/Game/Gui/GameGui.cs index 3d17aad86..df01dd95d 100644 --- a/Dalamud/Game/Gui/GameGui.cs +++ b/Dalamud/Game/Gui/GameGui.cs @@ -43,7 +43,6 @@ internal sealed unsafe class GameGui : IInternalDisposableService, IGameGui private readonly Hook handleImmHook; private readonly Hook setUiVisibilityHook; private readonly Hook utf8StringFromSequenceHook; - private readonly Hook raptureAtkModuleUpdateHook; [ServiceManager.ServiceConstructor] private GameGui(TargetSigScanner sigScanner) @@ -66,10 +65,6 @@ internal sealed unsafe class GameGui : IInternalDisposableService, IGameGui this.utf8StringFromSequenceHook = Hook.FromAddress(Utf8String.Addresses.Ctor_FromSequence.Value, this.Utf8StringFromSequenceDetour); - this.raptureAtkModuleUpdateHook = Hook.FromFunctionPointerVariable( - new(&RaptureAtkModule.StaticVirtualTablePointer->Update), - this.RaptureAtkModuleUpdateDetour); - this.handleItemHoverHook.Enable(); this.handleItemOutHook.Enable(); this.handleImmHook.Enable(); @@ -77,7 +72,6 @@ internal sealed unsafe class GameGui : IInternalDisposableService, IGameGui this.handleActionHoverHook.Enable(); this.handleActionOutHook.Enable(); this.utf8StringFromSequenceHook.Enable(); - this.raptureAtkModuleUpdateHook.Enable(); } // Hooked delegates @@ -94,9 +88,6 @@ internal sealed unsafe class GameGui : IInternalDisposableService, IGameGui /// public event EventHandler? HoveredActionChanged; - /// - public event Action AgentUpdate; - /// public bool GameUiHidden { get; private set; } @@ -247,7 +238,6 @@ internal sealed unsafe class GameGui : IInternalDisposableService, IGameGui this.handleActionHoverHook.Dispose(); this.handleActionOutHook.Dispose(); this.utf8StringFromSequenceHook.Dispose(); - this.raptureAtkModuleUpdateHook.Dispose(); } /// @@ -364,21 +354,6 @@ internal sealed unsafe class GameGui : IInternalDisposableService, IGameGui return thisPtr; // this function shouldn't need to return but the original asm moves this into rax before returning so be safe? } - - private void RaptureAtkModuleUpdateDetour(RaptureAtkModule* thisPtr, float delta) - { - // The game clears the AgentUpdateFlag in the original function, but it also updates agents in it too. - // We'll make a copy of the flags, so that we can fire events after the agents have been updated. - - var agentUpdateFlag = thisPtr->AgentUpdateFlag; - - this.raptureAtkModuleUpdateHook.Original(thisPtr, delta); - - if (agentUpdateFlag != RaptureAtkModule.AgentUpdateFlags.None) - { - this.AgentUpdate.InvokeSafely((AgentUpdateFlag)agentUpdateFlag); - } - } } /// @@ -402,7 +377,6 @@ internal class GameGuiPluginScoped : IInternalDisposableService, IGameGui this.gameGuiService.UiHideToggled += this.UiHideToggledForward; this.gameGuiService.HoveredItemChanged += this.HoveredItemForward; this.gameGuiService.HoveredActionChanged += this.HoveredActionForward; - this.gameGuiService.AgentUpdate += this.AgentUpdateForward; } /// @@ -414,9 +388,6 @@ internal class GameGuiPluginScoped : IInternalDisposableService, IGameGui /// public event EventHandler? HoveredActionChanged; - /// - public event Action AgentUpdate; - /// public bool GameUiHidden => this.gameGuiService.GameUiHidden; @@ -436,7 +407,6 @@ internal class GameGuiPluginScoped : IInternalDisposableService, IGameGui this.gameGuiService.UiHideToggled -= this.UiHideToggledForward; this.gameGuiService.HoveredItemChanged -= this.HoveredItemForward; this.gameGuiService.HoveredActionChanged -= this.HoveredActionForward; - this.gameGuiService.AgentUpdate -= this.AgentUpdateForward; this.UiHideToggled = null; this.HoveredItemChanged = null; @@ -488,6 +458,4 @@ internal class GameGuiPluginScoped : IInternalDisposableService, IGameGui private void HoveredItemForward(object sender, ulong itemId) => this.HoveredItemChanged?.Invoke(sender, itemId); private void HoveredActionForward(object sender, HoveredAction hoverAction) => this.HoveredActionChanged?.Invoke(sender, hoverAction); - - private void AgentUpdateForward(AgentUpdateFlag agentUpdateFlag) => this.AgentUpdate.InvokeSafely(agentUpdateFlag); } diff --git a/Dalamud/Game/Inventory/GameInventory.cs b/Dalamud/Game/Inventory/GameInventory.cs index 535b84372..5c8ed27b0 100644 --- a/Dalamud/Game/Inventory/GameInventory.cs +++ b/Dalamud/Game/Inventory/GameInventory.cs @@ -2,14 +2,16 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Dalamud.Game.Gui; using Dalamud.Game.Inventory.InventoryEventArgTypes; +using Dalamud.Hooking; using Dalamud.IoC; using Dalamud.IoC.Internal; using Dalamud.Logging.Internal; using Dalamud.Plugin.Internal; using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.UI; + namespace Dalamud.Game.Inventory; /// @@ -31,8 +33,7 @@ internal class GameInventory : IInternalDisposableService [ServiceManager.ServiceDependency] private readonly Framework framework = Service.Get(); - [ServiceManager.ServiceDependency] - private readonly GameGui gameGui = Service.Get(); + private readonly Hook raptureAtkModuleUpdateHook; private readonly GameInventoryType[] inventoryTypes; private readonly GameInventoryItem[]?[] inventoryItems; @@ -46,9 +47,18 @@ internal class GameInventory : IInternalDisposableService this.inventoryTypes = Enum.GetValues(); this.inventoryItems = new GameInventoryItem[this.inventoryTypes.Length][]; - this.gameGui.AgentUpdate += this.OnAgentUpdate; + unsafe + { + this.raptureAtkModuleUpdateHook = Hook.FromFunctionPointerVariable( + new(&RaptureAtkModule.StaticVirtualTablePointer->Update), + this.RaptureAtkModuleUpdateDetour); + } + + this.raptureAtkModuleUpdateHook.Enable(); } + private unsafe delegate void RaptureAtkModuleUpdateDelegate(RaptureAtkModule* ram, float f1); + /// void IInternalDisposableService.DisposeService() { @@ -58,7 +68,7 @@ internal class GameInventory : IInternalDisposableService this.subscribersPendingChange.Clear(); this.subscribersChanged = false; this.framework.Update -= this.OnFrameworkUpdate; - this.gameGui.AgentUpdate -= this.OnAgentUpdate; + this.raptureAtkModuleUpdateHook.Dispose(); } } @@ -309,9 +319,10 @@ internal class GameInventory : IInternalDisposableService return items; } - private void OnAgentUpdate(AgentUpdateFlag agentUpdateFlag) + private unsafe void RaptureAtkModuleUpdateDetour(RaptureAtkModule* ram, float f1) { - this.inventoriesMightBeChanged |= true; + this.inventoriesMightBeChanged |= ram->AgentUpdateFlag != 0; + this.raptureAtkModuleUpdateHook.Original(ram, f1); } /// diff --git a/Dalamud/Plugin/Services/IGameGui.cs b/Dalamud/Plugin/Services/IGameGui.cs index 6c2e0083e..e2326328a 100644 --- a/Dalamud/Plugin/Services/IGameGui.cs +++ b/Dalamud/Plugin/Services/IGameGui.cs @@ -26,12 +26,6 @@ public unsafe interface IGameGui /// public event EventHandler HoveredActionChanged; - /// - /// Fired when the game sets one or more values, - /// used by agents to conditionally update their addons. - /// - event Action AgentUpdate; - /// /// Gets a value indicating whether the game UI is hidden. /// diff --git a/lib/Lumina.Excel b/lib/Lumina.Excel index 5d01489c3..a37961c45 160000 --- a/lib/Lumina.Excel +++ b/lib/Lumina.Excel @@ -1 +1 @@ -Subproject commit 5d01489c34f33a3d645f49085d7fc0065a1ac801 +Subproject commit a37961c453463f0f60a96f27aa278ef139841857