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.
This commit is contained in:
Brues
2026-10-28 17:17:12 -05:00
parent c187c92106
commit 86b71cec9f
2 changed files with 22 additions and 31 deletions
+21 -30
View File
@@ -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
+1 -1
View File
@@ -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