mirror of
https://github.com/brues-code/Vanilla_MikScrollingBattleText.git
synced 2026-11-02 01:36:55 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user