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