From 86b71cec9f74b9b2439770d848d55986fe220c39 Mon Sep 17 00:00:00 2001 From: Brues <5278969+brues-code@users.noreply.github.com> Date: Wed, 28 Oct 2026 17:17:12 -0500 Subject: [PATCH] Filter UNIT_HEALTH/UNIT_MANA with RegisterUnitEvent and drop the throttle Register UNIT_HEALTH for player, target and pet and UNIT_MANA for player only, so raid members' updates never reach Lua. The shared 150ms throttle was compensating for that traffic and let any unit's event consume the window, delaying or dropping the player's own threshold crossings. --- .../MikCombatEventHelper.lua | 51 ++++++++----------- README.md | 2 +- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/MikScrollingBattleText/MikCombatEventHelper.lua b/MikScrollingBattleText/MikCombatEventHelper.lua index 02c8f95..93eeace 100644 --- a/MikScrollingBattleText/MikCombatEventHelper.lua +++ b/MikScrollingBattleText/MikCombatEventHelper.lua @@ -190,10 +190,6 @@ local combatlogDeathsActive = false -- Cached player GUID for combat log event handlers (set in Init via ClassicAPI's UnitGUID). local playerGUID = nil --- Event throttling for trigger checks. -local TRIGGER_THROTTLE_INTERVAL = 0.15 -local lastTriggerCheckTime = 0 - -- Combat log event frame and dispatch table (initialized in SetupCombatLogEvents). local combatLogEventFrame = nil local combatLogHandlers = {} @@ -240,7 +236,11 @@ function MikCEH.RegisterEvents() -- Register the events we are interested in receiving. for k, v in listenEvents do MCEHEventFrame:RegisterEvent(v); - end + end + + -- Unit events only for the units the triggers watch, so raid members' updates never reach Lua. + MCEHEventFrame:RegisterUnitEvent("UNIT_HEALTH", "player", "target", "pet"); + MCEHEventFrame:RegisterUnitEvent("UNIT_MANA", "player"); end @@ -251,7 +251,10 @@ function MikCEH.UnregisterEvents() -- Register the events we are interested in receiving. for k, v in listenEvents do MCEHEventFrame:UnregisterEvent(v); - end + end + + MCEHEventFrame:UnregisterEvent("UNIT_HEALTH"); + MCEHEventFrame:UnregisterEvent("UNIT_MANA"); end @@ -302,8 +305,6 @@ function MikCEH.OnLoad() table_insert(listenEvents, "PLAYER_REGEN_ENABLED"); -- Leave Combat table_insert(listenEvents, "PLAYER_REGEN_DISABLED"); -- Enter Combat table_insert(listenEvents, "PLAYER_COMBO_POINTS"); -- Combo Point Gains - table_insert(listenEvents, "UNIT_HEALTH"); -- Health changes. - table_insert(listenEvents, "UNIT_MANA"); -- Mana changes. table_insert(listenEvents, "PLAYER_TARGET_CHANGED"); -- Target changes. table_insert(listenEvents, "RAID_ROSTER_UPDATE"); -- Roster cache invalidation. @@ -362,33 +363,23 @@ function MikCEH.OnEvent() MikCEH.SendEvent(eventData); end - -- Health changes (throttled to reduce CPU in heavy combat) + -- Health changes (registered for player, target and pet only). elseif (event == "UNIT_HEALTH") then - local now = GetTime() - if (now - lastTriggerCheckTime >= TRIGGER_THROTTLE_INTERVAL) then - lastTriggerCheckTime = now - if (arg1 == "player") then - MikCEH.ParseSelfHealthTriggers(); - elseif (arg1 == "target") then - if (not UnitIsFriend("player", "target")) then - MikCEH.ParseEnemyHealthTriggers(); - else - MikCEH.ParseFriendlyHealthTriggers(); - end - elseif (arg1 == "pet") then - MikCEH.ParsePetHealthTriggers(); + if (arg1 == "player") then + MikCEH.ParseSelfHealthTriggers(); + elseif (arg1 == "target") then + if (not UnitIsFriend("player", "target")) then + MikCEH.ParseEnemyHealthTriggers(); + else + MikCEH.ParseFriendlyHealthTriggers(); end + elseif (arg1 == "pet") then + MikCEH.ParsePetHealthTriggers(); end - -- Mana changes (throttled) + -- Mana changes (registered for player only). elseif (event == "UNIT_MANA") then - local now = GetTime() - if (now - lastTriggerCheckTime >= TRIGGER_THROTTLE_INTERVAL) then - lastTriggerCheckTime = now - if (arg1 == "player") then - MikCEH.ParseSelfManaTriggers(); - end - end + MikCEH.ParseSelfManaTriggers(); -- Roster changes — invalidate name→unitID cache. elseif (event == "RAID_ROSTER_UPDATE" or event == "PARTY_MEMBERS_CHANGED") then diff --git a/README.md b/README.md index aaf9bcf..17a3042 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ SuperWoW, UnitXP SP3 and Nampower integration has been removed in favor of Class - **Upvalue caching**: Frequently called standard library functions (`string.find`, `string.gsub`, `table.insert`, `table.getn`, `GetTime`, etc.) are cached as local variables - **Dispatch table**: Combat event routing uses O(1) table lookup instead of an if/elseif chain - **SpellId icon cache**: SpellIds from combat log events resolve icons directly through ClassicAPI and are cached, bypassing Babble-Spell dictionary lookups and tooltip scanning -- **Event throttling**: UNIT_HEALTH and UNIT_MANA trigger checks are throttled to 150ms intervals +- **Unit event filtering**: `UNIT_HEALTH` (player, target, pet) and `UNIT_MANA` (player) use ClassicAPI's `RegisterUnitEvent`, so other units' updates never reach Lua - **Table pooling**: Animation event tables come from a ClassicAPI object pool (`CreateUnsecuredObjectPool`) and are reused, so 1.12's stop-the-world GC runs less often ## Architecture