From 180a2f5a76f0ce9e0c2f4d5c0a0acd4f3620ccd1 Mon Sep 17 00:00:00 2001 From: 4Luke4 Date: Fri, 5 Jun 2026 22:20:05 +0200 Subject: [PATCH] Add deferred lists-resolved hook --- EEex/copy/EEex_scripts/EEex_Opcode.lua | 17 +++++++++++++++++ EEex/copy/EEex_scripts/EEex_Opcode_Patch.lua | 20 ++++++++++++++++++++ EEex/loader/InfinityLoader.db | 4 ++++ 3 files changed, 41 insertions(+) diff --git a/EEex/copy/EEex_scripts/EEex_Opcode.lua b/EEex/copy/EEex_scripts/EEex_Opcode.lua index 40ea87a0..b183b2b5 100644 --- a/EEex/copy/EEex_scripts/EEex_Opcode.lua +++ b/EEex/copy/EEex_scripts/EEex_Opcode.lua @@ -6,11 +6,22 @@ EEex_Opcode_ListsResolvedListeners = {} function EEex_Opcode_AddListsResolvedListener(func) + -- This legacy listener is called immediately after each engine effect-list + -- resolution. High-volume callers, such as item comparison, should use + -- EEex_Opcode_AddDeferredListsResolvedListener() instead. -- [EEex.dll] EEex.Opcode_LuaHook_AfterListsResolved_Enabled = true table.insert(EEex_Opcode_ListsResolvedListeners, func) end +EEex_Opcode_DeferredListsResolvedListeners = {} + +function EEex_Opcode_AddDeferredListsResolvedListener(func) + -- [EEex.dll] + EEex.Opcode_LuaHook_DeferredAfterListsResolved_Enabled = true + table.insert(EEex_Opcode_DeferredListsResolvedListeners, func) +end + ----------------------- -- Private Functions -- ----------------------- @@ -129,6 +140,12 @@ function EEex_Opcode_LuaHook_AfterListsResolved(sprite) end end +function EEex_Opcode_LuaHook_DeferredAfterListsResolved(sprite) + for _, func in ipairs(EEex_Opcode_DeferredListsResolvedListeners) do + EEex_Utility_TryIgnore(func, sprite) + end +end + --[[ +--------------------------------------------------------------------------------+ | Opcode #214 | diff --git a/EEex/copy/EEex_scripts/EEex_Opcode_Patch.lua b/EEex/copy/EEex_scripts/EEex_Opcode_Patch.lua index 871cb2f6..1bb668bf 100644 --- a/EEex/copy/EEex_scripts/EEex_Opcode_Patch.lua +++ b/EEex/copy/EEex_scripts/EEex_Opcode_Patch.lua @@ -81,6 +81,26 @@ ]]} ) + --[[ + +--------------------------------------------------------------------------------------------------+ + | Flush coalesced lists-resolved listeners near the end of the sprite's real AI processing pass | + +--------------------------------------------------------------------------------------------------+ + | [EEex.dll] EEex::Opcode_Hook_FlushDeferredAfterListsResolved(pSprite: CGameSprite*) | + +--------------------------------------------------------------------------------------------------+ + --]] + + EEex_HookBeforeRestoreWithLabels(EEex_Label("Hook-CGameSprite::ProcessAI()-BeforeReturn"), 0, 8, 8, { + {"hook_integrity_watchdog_ignore_registers", { + EEex_HookIntegrityWatchdogRegister.RAX, EEex_HookIntegrityWatchdogRegister.RCX, EEex_HookIntegrityWatchdogRegister.RDX, + EEex_HookIntegrityWatchdogRegister.R8, EEex_HookIntegrityWatchdogRegister.R9, EEex_HookIntegrityWatchdogRegister.R10, + EEex_HookIntegrityWatchdogRegister.R11 + }}}, + {[[ + mov rcx, rsi ; pSprite + call #L(EEex::Opcode_Hook_FlushDeferredAfterListsResolved) + ]]} + ) + -------------------------------------- -- Opcode Changes -- -------------------------------------- diff --git a/EEex/loader/InfinityLoader.db b/EEex/loader/InfinityLoader.db index 0b182a93..55e9d91e 100644 --- a/EEex/loader/InfinityLoader.db +++ b/EEex/loader/InfinityLoader.db @@ -2372,6 +2372,10 @@ Operations=ADD 51 Pattern=0FB7974C4B0000 Operations=ADD 121 +[Hook-CGameSprite::ProcessAI()-BeforeReturn] +Pattern=4C8BBC24680100004C8BAC2460010000 +Operations=ADD 0 + [Hook-CGameSprite::ProcessEffectList()-AfterListsResolved-1] Pattern=837D8C00 Operations=ADD 20