fix old errors and improve efficiency and resource usage

This commit is contained in:
Jrc13245
2026-02-13 16:27:29 -05:00
parent f2065abcfc
commit 33b8b58255
4 changed files with 255 additions and 229 deletions
+72 -64
View File
@@ -142,6 +142,9 @@ local globalStringInfoArray = {};
local playerName;
local playerClass;
-- Cached pet name, updated once per event dispatch.
local cachedPetName;
-- Tables to hold ordered/unordered captured data.
local orderedCaptureData = {};
local unorderedCaptureData = {};
@@ -176,12 +179,13 @@ local hasNampower = false
local hasSuperWoW = false
local hasUnitXP = false
-- Runtime detection flags for CVar-gated Nampower events.
-- Runtime detection flags for Nampower events.
-- These start false and flip true on first invocation of the corresponding handler,
-- so CHAT_MSG parsing remains active until the CVar-gated events actually fire.
-- so CHAT_MSG parsing remains active until the Nampower events actually fire.
local nampowerHealsActive = false
local nampowerAutoAttackActive = false
local nampowerEnergizeActive = false
local nampowerSpellDamageActive = false
-- Cached player GUID for Nampower event handlers (set in Init when SuperWoW/Nampower present).
local playerGUID = nil
@@ -479,9 +483,9 @@ combatEventDispatch["CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES"] = handleIncomingM
combatEventDispatch["CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES"] = handleIncomingMeleeMisses
combatEventDispatch["CHAT_MSG_COMBAT_PARTY_MISSES"] = handleIncomingMeleeMisses
-- Incoming Spell/Ability Damage + Power Losses
-- Incoming Spell/Ability Damage + Power Losses (Nampower: SPELL_DAMAGE_EVENT_OTHER)
local function handleIncomingSpellDamage(msg)
if not hasNampower then
if not nampowerSpellDamageActive then
MikCEH.ParseForIncomingSpellHitsAndMisses(msg)
end
MikCEH.ParseForPowerLosses(msg)
@@ -491,8 +495,9 @@ combatEventDispatch["CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"] = handleIncomi
combatEventDispatch["CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"] = handleIncomingSpellDamage
combatEventDispatch["CHAT_MSG_SPELL_PARTY_DAMAGE"] = handleIncomingSpellDamage
-- Incoming damage from shields
-- Incoming damage from shields (Nampower: SPELL_DAMAGE_EVENT_OTHER)
combatEventDispatch["CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS"] = function(msg)
if nampowerSpellDamageActive then return end
MikCEH.ParseForIncomingDamageShieldDamage(msg)
end
@@ -506,7 +511,7 @@ combatEventDispatch["CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF"] = handleIncomingSpel
-- Incoming Debuffs, DoTs, Power Gains
combatEventDispatch["CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"] = function(msg)
if not hasNampower then
if not nampowerSpellDamageActive then
MikCEH.ParseForIncomingDebuffs(msg)
end
if not nampowerEnergizeActive then
@@ -518,7 +523,7 @@ end
combatEventDispatch["CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"] = function(msg)
if not nampowerHealsActive then
if not MikCEH.ParseForIncomingSpellHeals(msg) then
if not hasNampower then
if not nampowerSpellDamageActive then
MikCEH.ParseForIncomingBuffs(msg)
end
MikCEH.ParseForOutgoingHoTs(msg)
@@ -541,13 +546,15 @@ combatEventDispatch["CHAT_MSG_COMBAT_SELF_MISSES"] = function(msg)
MikCEH.ParseForOutgoingMisses(msg)
end
-- Outgoing Spell/Ability Damage
-- Outgoing Spell/Ability Damage (Nampower: SPELL_DAMAGE_EVENT_SELF)
combatEventDispatch["CHAT_MSG_SPELL_SELF_DAMAGE"] = function(msg)
if nampowerSpellDamageActive then return end
MikCEH.ParseForOutgoingSpellHitsAndMisses(msg)
end
-- Outgoing damage from shields
-- Outgoing damage from shields (Nampower: SPELL_DAMAGE_EVENT_SELF)
combatEventDispatch["CHAT_MSG_SPELL_DAMAGESHIELDS_ON_SELF"] = function(msg)
if nampowerSpellDamageActive then return end
MikCEH.ParseForOutgoingDamageShieldDamage(msg)
end
@@ -571,9 +578,9 @@ combatEventDispatch["CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS"] = handleOutg
combatEventDispatch["CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS"] = handleOutgoingHoTs
combatEventDispatch["CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS"] = handleOutgoingHoTs
-- Outgoing DoTs, Power Losses
-- Outgoing DoTs, Power Losses (Nampower: SPELL_DAMAGE_EVENT_SELF with DoT flag)
local function handleOutgoingDoTs(msg)
if not hasNampower then
if not nampowerSpellDamageActive then
MikCEH.ParseForOutgoingDoTs(msg)
end
MikCEH.ParseForPowerLosses(msg)
@@ -593,8 +600,9 @@ combatEventDispatch["CHAT_MSG_COMBAT_PET_MISSES"] = function(msg)
MikCEH.ParseForOutgoingPetMisses(msg)
end
-- Outgoing Pet Spell/Ability Damage
-- Outgoing Pet Spell/Ability Damage (Nampower: SPELL_DAMAGE_EVENT_SELF with pet GUID)
combatEventDispatch["CHAT_MSG_SPELL_PET_DAMAGE"] = function(msg)
if nampowerSpellDamageActive then return end
MikCEH.ParseForOutgoingPetSpellHitsAndMisses(msg)
end
@@ -638,6 +646,7 @@ end
-- This function parses the chat message combat events using the dispatch table.
-- **********************************************************************************
function MikCEH.ParseCombatEvents(event, combatMessage)
cachedPetName = UnitName("pet");
local handler = combatEventDispatch[event]
if handler then handler(combatMessage) end
end
@@ -661,6 +670,7 @@ function MikCEH.Init()
MikCEH.nampowerHealsActive = false
MikCEH.nampowerAutoAttackActive = false
MikCEH.nampowerEnergizeActive = false
MikCEH.nampowerSpellDamageActive = false
-- Check Nampower version — v2.33.0+ required for correct event support.
if not hasNampower then
@@ -896,6 +906,9 @@ nampowerHandlers["SPELL_DAMAGE_EVENT_SELF"] = function()
return -- Not from player or pet, ignore.
end
-- Disable CHAT_MSG fallback now that we've confirmed this handler fires.
nampowerSpellDamageActive = true
local spellName = GetSpellNameFromId(spellId)
local damageType = SchoolToDamageType(spellSchool)
local targetName = GetNameFromGUID(targetGuid)
@@ -1240,6 +1253,8 @@ nampowerHandlers["SPELL_MISS_SELF"] = function()
if not IsPlayerGUID(casterGuid) then return end
nampowerSpellDamageActive = true
local spellName = GetSpellNameFromId(spellId)
local targetName = GetNameFromGUID(targetGuid)
local actionType = nampowerMissToAction[missInfo] or MikCEH.ACTIONTYPE_MISS
@@ -1382,22 +1397,13 @@ function MikCEH.SetupNampowerEvents()
SetCVar("NP_EnableSpellEnergizeEvents", "1")
end
-- Events that Nampower covers unconditionally (NOT CVar-gated) — safe to remove.
-- CVar-gated events (AUTO_ATTACK, SPELL_HEAL, SPELL_ENERGIZE) are NOT listed here;
-- their CHAT_MSG equivalents stay registered as fallback until runtime detection confirms
-- the CVar-gated Nampower events are actually firing.
-- All Nampower event equivalents now use runtime detection flags
-- (nampowerSpellDamageActive, nampowerAutoAttackActive, etc.) instead of
-- permanently unregistering CHAT_MSG events. This ensures fallback to CHAT_MSG
-- parsing if a Nampower event doesn't fire for certain targets (e.g. NPCs).
-- Only CHAT_MSG_SPELL_AURA_GONE_SELF is safe to remove (covered by BUFF/DEBUFF_REMOVED_SELF).
local nampowerCoveredEvents = {
-- Outgoing spell damage (covered by SPELL_DAMAGE_EVENT_SELF — always active)
["CHAT_MSG_SPELL_SELF_DAMAGE"] = true,
["CHAT_MSG_SPELL_DAMAGESHIELDS_ON_SELF"] = true,
-- Incoming spell damage shields (covered by SPELL_DAMAGE_EVENT_OTHER — always active)
["CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS"] = true,
-- Periodic damage (covered by SPELL_DAMAGE_EVENT_SELF with DoT flag — always active)
["CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"] = true,
-- Aura notifications (covered by BUFF/DEBUFF_ADDED/REMOVED_SELF — always active)
["CHAT_MSG_SPELL_AURA_GONE_SELF"] = true,
-- Pet spell damage (covered by SPELL_DAMAGE_EVENT_SELF with pet GUID — always active)
["CHAT_MSG_SPELL_PET_DAMAGE"] = true,
}
-- Events to keep despite Nampower — these have partial or no Nampower equivalent.
@@ -1532,7 +1538,7 @@ function MikCEH.ParseForIncomingHits(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "COMBATHITOTHEROTHER", {"%n", "%s", "%a"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, MikCEH.DAMAGETYPE_PHYSICAL, capturedData.Amount, nil, capturedData.Name);
-- Look for any partial actions and populate them into the event data.
@@ -1549,7 +1555,7 @@ function MikCEH.ParseForIncomingHits(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "COMBATHITCRITOTHEROTHER", {"%n", "%s", "%a"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_CRIT, MikCEH.DAMAGETYPE_PHYSICAL, capturedData.Amount, nil, capturedData.Name);
-- Look for any partial actions and populate them into the event data.
@@ -1659,7 +1665,7 @@ function MikCEH.ParseForIncomingMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "MISSEDOTHEROTHER", {"%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_MISS, nil, nil, nil, nil, capturedData.Name);
-- Send the event.
@@ -1673,7 +1679,7 @@ function MikCEH.ParseForIncomingMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "VSDODGEOTHEROTHER", {"%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_DODGE, nil, nil, nil, nil, capturedData.Name);
-- Send the event.
@@ -1687,7 +1693,7 @@ function MikCEH.ParseForIncomingMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "VSPARRYOTHEROTHER", {"%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_PARRY, nil, nil, nil, nil, capturedData.Name);
-- Send the event.
@@ -1701,7 +1707,7 @@ function MikCEH.ParseForIncomingMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "VSBLOCKOTHEROTHER", {"%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_BLOCK, nil, nil, nil, nil, capturedData.Name);
-- Send the event.
@@ -1715,7 +1721,7 @@ function MikCEH.ParseForIncomingMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "VSABSORBOTHEROTHER", {"%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_ABSORB, nil, nil, nil, nil, capturedData.Name);
-- Send the event.
@@ -1729,7 +1735,7 @@ function MikCEH.ParseForIncomingMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "VSIMMUNEOTHEROTHER", {"%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_IMMUNE, nil, nil, nil, nil, capturedData.Name);
-- Send the event.
@@ -1942,7 +1948,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGOTHEROTHER", {"%n", "%s", "%c", "%a"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, MikCEH.DAMAGETYPE_PHYSICAL, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Look for any partial actions and populate them into the event data.
@@ -1960,7 +1966,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGCRITOTHEROTHER", {"%n", "%s", "%a"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_CRIT, MikCEH.DAMAGETYPE_PHYSICAL, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Look for any partial actions and populate them into the event data.
@@ -1978,7 +1984,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGSCHOOLOTHEROTHER", {"%n", "%s", "%c", "%a", "%t"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Look for any partial actions and populate them into the event data.
@@ -1996,7 +2002,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGCRITSCHOOLOTHEROTHER", {"%n", "%s", "%c", "%a", "%t"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_CRIT, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Look for any partial actions and populate them into the event data.
@@ -2014,7 +2020,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLMISSOTHEROTHER", {"%n", "%s", "%c"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_MISS, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2029,7 +2035,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLDODGEDOTHEROTHER", {"%c", "%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_DODGE, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2044,7 +2050,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPARRIEDOTHEROTHER", {"%c", "%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_PARRY, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2059,7 +2065,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLBLOCKEDOTHEROTHER", {"%c", "%s", "%n"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_BLOCK, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2074,7 +2080,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLRESISTOTHEROTHER", {"%n", "%s", "%c"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_RESIST, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2089,7 +2095,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBOTHEROTHER", {"%n", "%s", "%c"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_ABSORB, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2104,7 +2110,7 @@ function MikCEH.ParseForIncomingSpellHitsAndMisses(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLIMMUNEOTHEROTHER", {"%n", "%s", "%c"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.ACTIONTYPE_IMMUNE, nil, nil, nil, capturedData.SpellName, capturedData.Name);
-- Send the event.
@@ -2347,14 +2353,14 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "HEALEDCRITOTHEROTHER", {"%n", "%s", "%c", "%a"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.HEALTYPE_CRIT, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Get overheal info.
eventData.Name = UnitName("pet")
eventData.Name = cachedPetName
MikCEH.PopulateOverhealData(eventData); -- athenne add
eventData.Name = capturedData.Name
-- Send the event.
MikCEH.SendEvent(eventData);
@@ -2366,14 +2372,14 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "HEALEDOTHEROTHER", {"%n", "%s", "%c", "%a"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.HEALTYPE_NORMAL, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Get overheal info.
eventData.Name = UnitName("pet")
eventData.Name = cachedPetName
MikCEH.PopulateOverhealData(eventData); -- athenne add
eventData.Name = capturedData.Name
-- Send the event.
MikCEH.SendEvent(eventData);
@@ -2386,11 +2392,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage)
local capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURAHEALOTHEROTHER", {"%c", "%a", "%n", "%s"});
-- If a match was found.
if (capturedData ~= nil and UnitName("pet") and string_find(combatMessage, UnitName("pet"))) then
if (capturedData ~= nil and cachedPetName and string_find(combatMessage, cachedPetName)) then
local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PET_INCOMING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, capturedData.Name);
-- Get overheal info.
eventData.Name = UnitName("pet")
eventData.Name = cachedPetName
if GetLocale() ~= "zhCN" then -- edge case for chinese client (unable to show overheal amount for hot casted on your pet by other)
MikCEH.PopulateOverhealData(eventData); -- athenne add
end
@@ -4388,18 +4394,20 @@ end
-- parameters passed.
-- **********************************************************************************
function MikCEH.GetUnorderedCaptureDataTable(c1, c2, c3, c4, c5, c6, c7, c8, c9)
-- Erase old unorderd capture data.
MikCEH.EraseTable(unorderedCaptureData);
-- Assign directly by index instead of EraseTable + table_insert.
unorderedCaptureData[1] = c1;
unorderedCaptureData[2] = c2;
unorderedCaptureData[3] = c3;
unorderedCaptureData[4] = c4;
unorderedCaptureData[5] = c5;
unorderedCaptureData[6] = c6;
unorderedCaptureData[7] = c7;
unorderedCaptureData[8] = c8;
unorderedCaptureData[9] = c9;
if (c1 ~= nil) then table_insert(unorderedCaptureData, c1); end
if (c2 ~= nil) then table_insert(unorderedCaptureData, c2); end
if (c3 ~= nil) then table_insert(unorderedCaptureData, c3); end
if (c4 ~= nil) then table_insert(unorderedCaptureData, c4); end
if (c5 ~= nil) then table_insert(unorderedCaptureData, c5); end
if (c6 ~= nil) then table_insert(unorderedCaptureData, c6); end
if (c7 ~= nil) then table_insert(unorderedCaptureData, c7); end
if (c8 ~= nil) then table_insert(unorderedCaptureData, c8); end
if (c9 ~= nil) then table_insert(unorderedCaptureData, c9); end
-- Clear any leftover slots beyond 9.
local i = 10;
while unorderedCaptureData[i] do unorderedCaptureData[i] = nil; i = i + 1; end
-- Return the populated unordered capture data table.
return unorderedCaptureData;
+169 -147
View File
@@ -11,10 +11,13 @@
-- Upvalue caches for frequently called functions.
local string_find, string_gsub = string.find, string.gsub
local table_insert, table_getn, table_remove = table.insert, table.getn, table.remove
local table_setn = table.setn
local math_ceil, math_floor, math_random = math.ceil, math.floor, math.random
local GetTime = GetTime
local getglobal = getglobal
local strlower = strlower
local tonumber = tonumber
local UnitClass = UnitClass
-- Display types for incoming, outgoing, and notification events.
MikSBT.DISPLAYTYPE_INCOMING = 1;
@@ -194,6 +197,105 @@ local ANIMATION_STYLE_RIGHT_PARABOLA = 3;
local MAX_COMBO_POINTS = 5;
-- Pre-built event type string lookup tables (eliminates string concatenation in CombatEventsHandler).
local DIRECTION_SCROLLAREA_KEY = {
[MikCEH.DIRECTIONTYPE_PLAYER_INCOMING] = "Incoming",
[MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING] = "Outgoing",
[MikCEH.DIRECTIONTYPE_PET_OUTGOING] = "Outgoing",
[MikCEH.DIRECTIONTYPE_PET_INCOMING] = "Incoming",
};
local DIRECTION_PREFIX = {
[MikCEH.DIRECTIONTYPE_PLAYER_INCOMING] = "MSBT_EVENTTYPE_INCOMING_",
[MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING] = "MSBT_EVENTTYPE_OUTGOING_",
[MikCEH.DIRECTIONTYPE_PET_OUTGOING] = "MSBT_EVENTTYPE_OUTGOING_PET_",
[MikCEH.DIRECTIONTYPE_PET_INCOMING] = "MSBT_EVENTTYPE_INCOMING_PET_",
};
-- Action type → suffix string for damage events.
local ACTION_SUFFIX = {
[MikCEH.ACTIONTYPE_MISS] = "MISS",
[MikCEH.ACTIONTYPE_DODGE] = "DODGE",
[MikCEH.ACTIONTYPE_PARRY] = "PARRY",
[MikCEH.ACTIONTYPE_BLOCK] = "BLOCK",
[MikCEH.ACTIONTYPE_RESIST] = "RESIST",
[MikCEH.ACTIONTYPE_ABSORB] = "ABSORB",
[MikCEH.ACTIONTYPE_IMMUNE] = "IMMUNE",
[MikCEH.ACTIONTYPE_EVADE] = "EVADE",
[MikCEH.ACTIONTYPE_REFLECT] = "REFLECT",
};
-- Environmental action type → localized effect name.
local ENVIRONMENTAL_NAMES = {
[MikCEH.ACTIONTYPE_DROWNING] = MikSBT.MSG_ENVIRONMENTAL_DROWNING,
[MikCEH.ACTIONTYPE_FALLING] = MikSBT.MSG_ENVIRONMENTAL_FALLING,
[MikCEH.ACTIONTYPE_FATIGUE] = MikSBT.MSG_ENVIRONMENTAL_FATIGUE,
[MikCEH.ACTIONTYPE_FIRE] = MikSBT.MSG_ENVIRONMENTAL_FIRE,
[MikCEH.ACTIONTYPE_LAVA] = MikSBT.MSG_ENVIRONMENTAL_LAVA,
[MikCEH.ACTIONTYPE_SLIME] = MikSBT.MSG_ENVIRONMENTAL_SLIME,
};
-- Class name → color prefix string for unit name coloring.
local CLASS_COLORS = {
PALADIN = "|cffF58CBA|h",
DRUID = "|cffFF7D0A|h",
HUNTER = "|cffABD473|h",
MAGE = "|cff69CCF0|h",
PRIEST = "|cffFFFFFF|h",
ROGUE = "|cffFFF569|h",
SHAMAN = "|cff0070DE|h",
WARLOCK = "|cff9482C9|h",
WARRIOR = "|cffC79C6E|h",
};
-- Notification type → suffix string.
local NOTIFICATION_SUFFIX = {
[MikCEH.NOTIFICATIONTYPE_DEBUFF] = "DEBUFF",
[MikCEH.NOTIFICATIONTYPE_BUFF] = "BUFF",
[MikCEH.NOTIFICATIONTYPE_ITEM_BUFF] = "ITEM_BUFF",
[MikCEH.NOTIFICATIONTYPE_BUFF_FADE] = "BUFF_FADE",
[MikCEH.NOTIFICATIONTYPE_COMBAT_ENTER] = "COMBAT_ENTER",
[MikCEH.NOTIFICATIONTYPE_COMBAT_LEAVE] = "COMBAT_LEAVE",
[MikCEH.NOTIFICATIONTYPE_POWER_GAIN] = "POWER_GAIN",
[MikCEH.NOTIFICATIONTYPE_POWER_LOSS] = "POWER_LOSS",
[MikCEH.NOTIFICATIONTYPE_CP_GAIN] = "CP_GAIN",
[MikCEH.NOTIFICATIONTYPE_HONOR_GAIN] = "HONOR_GAIN",
[MikCEH.NOTIFICATIONTYPE_REP_GAIN] = "REP_GAIN",
[MikCEH.NOTIFICATIONTYPE_REP_LOSS] = "REP_LOSS",
[MikCEH.NOTIFICATIONTYPE_SKILL_GAIN] = "SKILL_GAIN",
[MikCEH.NOTIFICATIONTYPE_EXPERIENCE_GAIN] = "EXPERIENCE_GAIN",
[MikCEH.NOTIFICATIONTYPE_PC_KILLING_BLOW] = "PC_KILLING_BLOW",
[MikCEH.NOTIFICATIONTYPE_NPC_KILLING_BLOW] = "NPC_KILLING_BLOW",
};
-- Pre-build all possible event type strings to avoid runtime concatenation.
-- dmgEventStr[dirType][suffix] for non-spell damage, dmgEventStrSpell[dirType][suffix] for spell damage.
local dmgEventStr = {};
local dmgEventStrSpell = {};
local healEventStr = {};
local notifEventStr = {};
do
local suffixes = {"DAMAGE", "DOT", "MISS", "DODGE", "PARRY", "BLOCK", "RESIST", "ABSORB", "IMMUNE", "EVADE", "REFLECT", "ENVIRONMENTAL"};
for dirType, prefix in pairs(DIRECTION_PREFIX) do
dmgEventStr[dirType] = {};
dmgEventStrSpell[dirType] = {};
for _, suffix in ipairs(suffixes) do
dmgEventStr[dirType][suffix] = prefix .. suffix;
dmgEventStrSpell[dirType][suffix] = prefix .. "SPELL_" .. suffix;
end
healEventStr[dirType] = {};
healEventStr[dirType]["HEAL"] = prefix .. "HEAL";
healEventStr[dirType]["HOT"] = prefix .. "HOT";
end
for notifType, suffix in pairs(NOTIFICATION_SUFFIX) do
notifEventStr[notifType] = "MSBT_EVENTTYPE_NOTIFICATION_" .. suffix;
end
notifEventStr["CP_FULL"] = "MSBT_EVENTTYPE_NOTIFICATION_CP_FULL";
end
-------------------------------------------------------------------------------------
-- Private variables.
-------------------------------------------------------------------------------------
@@ -344,8 +446,9 @@ function MikSBT.OnUpdate()
-- Clear the merged animation events array.
local numMergedEvents = table_getn(mergeData.MergedEvents);
for i = 1, numMergedEvents do
table_remove(mergeData.MergedEvents, 1);
mergeData.MergedEvents[i] = nil;
end
table_setn(mergeData.MergedEvents, 0);
-- Reset the last merged time.
@@ -506,130 +609,62 @@ function MikSBT.CombatEventsHandler(combatEvent)
-- Get a recycled table from the events recycler object.
local animationEvent = eventsRecycler:AcquireTable();
-- Initalize the event type string to the common prefix.
local eventTypeString = "MSBT_EVENTTYPE_";
-- Append the appropriate direction type to the event type string.
if (combatEvent.DirectionType == MikCEH.DIRECTIONTYPE_PLAYER_INCOMING) then
animationEvent.ScrollArea = scrollAreas.Incoming;
eventTypeString = eventTypeString .. "INCOMING_";
elseif (combatEvent.DirectionType == MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING) then
animationEvent.ScrollArea = scrollAreas.Outgoing;
eventTypeString = eventTypeString .. "OUTGOING_";
elseif (combatEvent.DirectionType == MikCEH.DIRECTIONTYPE_PET_OUTGOING) then
animationEvent.ScrollArea = scrollAreas.Outgoing;
eventTypeString = eventTypeString .. "OUTGOING_PET_";
elseif (combatEvent.DirectionType == MikCEH.DIRECTIONTYPE_PET_INCOMING) then
animationEvent.ScrollArea = scrollAreas.Incoming;
eventTypeString = eventTypeString .. "INCOMING_PET_";
-- Look up the scroll area and event type string via pre-built tables (no string concatenation).
local dirType = combatEvent.DirectionType;
local scrollAreaKey = DIRECTION_SCROLLAREA_KEY[dirType];
if (scrollAreaKey) then
animationEvent.ScrollArea = scrollAreas[scrollAreaKey];
end
local eventTypeString;
-- Check if it's a damage event.
if (combatEvent.EventType == MikCEH.EVENTTYPE_DAMAGE) then
-- Check if there is an associated spell/ability name.
if (combatEvent.EffectName ~= nil) then
eventTypeString = eventTypeString .. "SPELL_";
end
local actionType = combatEvent.ActionType;
-- Append the appropriate action type to the event type string.
if (combatEvent.ActionType == MikCEH.ACTIONTYPE_HIT) then
if (combatEvent.HitType == MikCEH.HITTYPE_OVER_TIME) then
eventTypeString = eventTypeString .. "DOT";
-- Check for environmental damage (sets EffectName as side effect).
local envName = ENVIRONMENTAL_NAMES[actionType];
if (envName) then
combatEvent.EffectName = envName;
eventTypeString = dmgEventStr[dirType] and dmgEventStr[dirType]["ENVIRONMENTAL"];
else
-- Determine the action suffix.
local suffix;
if (actionType == MikCEH.ACTIONTYPE_HIT) then
suffix = (combatEvent.HitType == MikCEH.HITTYPE_OVER_TIME) and "DOT" or "DAMAGE";
else
eventTypeString = eventTypeString .. "DAMAGE";
suffix = ACTION_SUFFIX[actionType];
end
-- Use spell or non-spell variant based on whether there is an effect name.
if (suffix) then
if (combatEvent.EffectName ~= nil) then
eventTypeString = dmgEventStrSpell[dirType] and dmgEventStrSpell[dirType][suffix];
else
eventTypeString = dmgEventStr[dirType] and dmgEventStr[dirType][suffix];
end
end
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_MISS) then
eventTypeString = eventTypeString .. "MISS";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_DODGE) then
eventTypeString = eventTypeString .. "DODGE";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_PARRY) then
eventTypeString = eventTypeString .. "PARRY";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_BLOCK) then
eventTypeString = eventTypeString .. "BLOCK";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_RESIST) then
eventTypeString = eventTypeString .. "RESIST";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_ABSORB) then
eventTypeString = eventTypeString .. "ABSORB";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_IMMUNE) then
eventTypeString = eventTypeString .. "IMMUNE";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_EVADE) then
eventTypeString = eventTypeString .. "EVADE";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_REFLECT) then
eventTypeString = eventTypeString .. "REFLECT";
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_DROWNING) then
eventTypeString = eventTypeString .. "ENVIRONMENTAL"
combatEvent.EffectName = MikSBT.MSG_ENVIRONMENTAL_DROWNING;
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_FALLING) then
eventTypeString = eventTypeString .. "ENVIRONMENTAL"
combatEvent.EffectName = MikSBT.MSG_ENVIRONMENTAL_FALLING;
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_FATIGUE) then
eventTypeString = eventTypeString .. "ENVIRONMENTAL"
combatEvent.EffectName = MikSBT.MSG_ENVIRONMENTAL_FATIGUE;
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_FIRE) then
eventTypeString = eventTypeString .. "ENVIRONMENTAL"
combatEvent.EffectName = MikSBT.MSG_ENVIRONMENTAL_FIRE;
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_LAVA) then
eventTypeString = eventTypeString .. "ENVIRONMENTAL"
combatEvent.EffectName = MikSBT.MSG_ENVIRONMENTAL_LAVA;
elseif (combatEvent.ActionType == MikCEH.ACTIONTYPE_SLIME) then
eventTypeString = eventTypeString .. "ENVIRONMENTAL"
combatEvent.EffectName = MikSBT.MSG_ENVIRONMENTAL_SLIME;
end
-- Heal event.
elseif (combatEvent.EventType == MikCEH.EVENTTYPE_HEAL) then
if (combatEvent.HealType == MikCEH.HEALTYPE_NORMAL or combatEvent.HealType == MikCEH.HEALTYPE_CRIT) then
eventTypeString = eventTypeString .. "HEAL";
elseif (combatEvent.HealType == MikCEH.HEALTYPE_OVER_TIME) then
eventTypeString = eventTypeString .. "HOT";
end
local suffix = (combatEvent.HealType == MikCEH.HEALTYPE_OVER_TIME) and "HOT" or "HEAL";
eventTypeString = healEventStr[dirType] and healEventStr[dirType][suffix];
-- Notification event.
elseif (combatEvent.EventType == MikCEH.EVENTTYPE_NOTIFICATION) then
animationEvent.ScrollArea = scrollAreas.Notification;
eventTypeString = eventTypeString .. "NOTIFICATION_";
local notifType = combatEvent.NotificationType;
-- Append the appropriate notification type to the event type string.
if (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_DEBUFF) then
eventTypeString = eventTypeString .. "DEBUFF";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_BUFF) then
eventTypeString = eventTypeString .. "BUFF";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_ITEM_BUFF) then
eventTypeString = eventTypeString .. "ITEM_BUFF";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_BUFF_FADE) then
eventTypeString = eventTypeString .. "BUFF_FADE";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_COMBAT_ENTER) then
eventTypeString = eventTypeString .. "COMBAT_ENTER";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_COMBAT_LEAVE) then
eventTypeString = eventTypeString .. "COMBAT_LEAVE";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_POWER_GAIN) then
eventTypeString = eventTypeString .. "POWER_GAIN";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_POWER_LOSS) then
eventTypeString = eventTypeString .. "POWER_LOSS";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_CP_GAIN) then
-- Check if we are at max combo points.
if (combatEvent.Amount == MAX_COMBO_POINTS) then
eventTypeString = eventTypeString .. "CP_FULL";
else
eventTypeString = eventTypeString .. "CP_GAIN";
-- Special case: combo points at max.
if (notifType == MikCEH.NOTIFICATIONTYPE_CP_GAIN and combatEvent.Amount == MAX_COMBO_POINTS) then
eventTypeString = notifEventStr["CP_FULL"];
else
eventTypeString = notifEventStr[notifType];
-- Fallback for unknown notification types.
if (not eventTypeString and notifType ~= nil) then
eventTypeString = "MSBT_EVENTTYPE_NOTIFICATION_" .. notifType;
end
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_HONOR_GAIN) then
eventTypeString = eventTypeString .. "HONOR_GAIN";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_REP_GAIN) then
eventTypeString = eventTypeString .. "REP_GAIN";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_REP_LOSS) then
eventTypeString = eventTypeString .. "REP_LOSS";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_SKILL_GAIN) then
eventTypeString = eventTypeString .. "SKILL_GAIN";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_EXPERIENCE_GAIN) then
eventTypeString = eventTypeString .. "EXPERIENCE_GAIN";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_PC_KILLING_BLOW) then
eventTypeString = eventTypeString .. "PC_KILLING_BLOW";
elseif (combatEvent.NotificationType == MikCEH.NOTIFICATIONTYPE_NPC_KILLING_BLOW) then
eventTypeString = eventTypeString .. "NPC_KILLING_BLOW";
elseif (combatEvent.NotificationType ~= nil) then
eventTypeString = eventTypeString .. combatEvent.NotificationType;
end
end
@@ -894,14 +929,14 @@ function MikSBT.MergeEvents(mergeData, numEvents)
-- Remove the processed animation events from unmerged events queue.
for x = 1, numEvents do
-- Check if the event was merged into a different animation event.
if (mergeData.UnmergedEvents[1].EventMerged) then
if (mergeData.UnmergedEvents[x] and mergeData.UnmergedEvents[x].EventMerged) then
-- Reclaim the animation event table to the events recycler.
eventsRecycler:ReclaimTable(mergeData.UnmergedEvents[1]);
eventsRecycler:ReclaimTable(mergeData.UnmergedEvents[x]);
end
-- Remove the event from the unmerged events array.
table_remove(mergeData.UnmergedEvents, 1);
mergeData.UnmergedEvents[x] = nil;
end
table_setn(mergeData.UnmergedEvents, 0);
end
@@ -1695,26 +1730,11 @@ function MikSBT.AddAnimation(animationEvent)
local unitID = animationEvent._unitID
local uName = animationEvent._unitName
if unitID then
local _, Class = UnitClass(unitID)
if Class and Class == "PALADIN" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cffF58CBA|h"..uName.."|h|r")
elseif Class and Class == "DRUID" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cffFF7D0A|h"..uName.."|h|r")
elseif Class and Class == "HUNTER" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cffABD473|h"..uName.."|h|r")
elseif Class and Class == "MAGE" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cff69CCF0|h"..uName.."|h|r")
elseif Class and Class == "PRIEST" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cffFFFFFF|h"..uName.."|h|r")
elseif Class and Class == "ROGUE" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cffFFF569|h"..uName.."|h|r")
elseif Class and Class == "SHAMAN" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cff0070DE|h"..uName.."|h|r")
elseif Class and Class == "WARLOCK" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cff9482C9|h"..uName.."|h|r")
elseif Class and Class == "WARRIOR" then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, "|cffC79C6E|h"..uName.."|h|r")
end
local _, class = UnitClass(unitID)
local colorPrefix = class and CLASS_COLORS[class]
if colorPrefix then
animationEvent.Text = string_gsub(animationEvent.Text, animationEvent.Name, colorPrefix .. uName .. "|h|r")
end
end
-- Get the next available animation display info object for the scroll area.
@@ -2229,7 +2249,7 @@ function MikSBT.GetAnimationStartingPosition(animationEvent)
-- Check if it's a sticky or a crit and sticky crits are enabled.
if (animationEvent.IsSticky or (animationEvent.IsCrit and MikSBT.CurrentProfile.UseStickyCrits)) then
-- Set the sticky to the center.
startPositionY = ceil(animationEvent.ScrollArea.DisplaySettings.ScrollHeight / 2);
startPositionY = math_ceil(animationEvent.ScrollArea.DisplaySettings.ScrollHeight / 2);
end
end
@@ -2300,8 +2320,9 @@ function MikSBT.RepositionAnimDisplayInfo(scrollArea)
-- Clear the temp non stickies table.
for x = 1, numNonStickies do
table_remove(activeNonStickies, 1);
activeNonStickies[x] = nil;
end
table_setn(activeNonStickies, 0);
end
@@ -2339,7 +2360,7 @@ function MikSBT.RepositionStickyAnimDisplayInfo(scrollArea)
-- Check if there is more than 1 active sticky animation.
if (numStickies > 1) then
-- Get the middle active sticky.
local middleSticky = floor((numStickies + 1) / 2);
local middleSticky = math_floor((numStickies + 1) / 2);
-- Set the middle sticky to the center of the scroll area.
activeStickies[middleSticky].PositionY = scrollArea.DisplaySettings.ScrollHeight / 2;
@@ -2361,7 +2382,7 @@ function MikSBT.RepositionStickyAnimDisplayInfo(scrollArea)
-- Check if there is more than 1 active sticky animation.
if (numStickies > 1) then
-- Get the middle active sticky.
local middleSticky = ceil((numStickies + 1) / 2);
local middleSticky = math_ceil((numStickies + 1) / 2);
-- Set the middle sticky to the center of the scroll area.
activeStickies[middleSticky].PositionY = scrollArea.DisplaySettings.ScrollHeight / 2;
@@ -2382,8 +2403,9 @@ function MikSBT.RepositionStickyAnimDisplayInfo(scrollArea)
-- Clear the temp stickies table.
for x = 1, numStickies do
table_remove(activeStickies, 1);
activeStickies[x] = nil;
end
table_setn(activeStickies, 0);
end
@@ -2430,8 +2452,8 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea)
animDisplayInfo.originalPositionY = animDisplayInfo.PositionY
end
if (elapsedTime - animDisplayInfo.timeLastJiggled > 0.05) then
animDisplayInfo.DecalageX = math.random(-1, 1);
animDisplayInfo.DecalageY = math.random(-1, 1);
animDisplayInfo.DecalageX = math_random(-1, 1);
animDisplayInfo.DecalageY = math_random(-1, 1);
animDisplayInfo.PositionX = animDisplayInfo.originalPositionX + animDisplayInfo.DecalageX;
animDisplayInfo.PositionY = animDisplayInfo.originalPositionY + animDisplayInfo.DecalageY;
animDisplayInfo.timeLastJiggled = elapsedTime;
@@ -2582,9 +2604,9 @@ function MikSBT.ScrollLeftParabolaUp(animDisplayInfo, scrollArea)
-- Calculate the new x position based on equation of a parabola.
-- Equation of a parabola at vertex 0,0: x = y^2 / 4a
local parabolaMaxX = ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaMaxX = math_ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaY = animDisplayInfo.PositionY - animationMidPoint;
local newX = parabolaMaxX - ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
local newX = parabolaMaxX - math_ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
-- Set the new x position.
animDisplayInfo.PositionX = newX * -1;
@@ -2607,9 +2629,9 @@ function MikSBT.ScrollLeftParabolaDown(animDisplayInfo, scrollArea)
-- Calculate the new x position based on equation of a parabola.
-- Equation of a parabola at vertex 0,0: x = y^2 / 4a
local parabolaMaxX = ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaMaxX = math_ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaY = animDisplayInfo.PositionY - animationMidPoint;
local newX = parabolaMaxX - ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
local newX = parabolaMaxX - math_ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
-- Set the new x position.
animDisplayInfo.PositionX = newX * -1;
@@ -2632,9 +2654,9 @@ function MikSBT.ScrollRightParabolaUp(animDisplayInfo, scrollArea)
-- Calculate the new x position based on equation of a parabola.
-- Equation of a parabola at vertex 0,0: x = y^2 / 4a
local parabolaMaxX = ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaMaxX = math_ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaY = animDisplayInfo.PositionY - animationMidPoint;
local newX = parabolaMaxX - ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
local newX = parabolaMaxX - math_ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
-- Set the new x position.
animDisplayInfo.PositionX = newX;
@@ -2657,9 +2679,9 @@ function MikSBT.ScrollRightParabolaDown(animDisplayInfo, scrollArea)
-- Calculate the new x position based on equation of a parabola.
-- Equation of a parabola at vertex 0,0: x = y^2 / 4a
local parabolaMaxX = ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaMaxX = math_ceil((animationMidPoint * animationMidPoint) / (4 * animationMidPoint));
local parabolaY = animDisplayInfo.PositionY - animationMidPoint;
local newX = parabolaMaxX - ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
local newX = parabolaMaxX - math_ceil((parabolaY * parabolaY) / (4 * animationMidPoint));
-- Set the new x position.
animDisplayInfo.PositionX = newX;
@@ -25,6 +25,7 @@ function MikTRO:NewRecyclerObject(maxEntries)
-- Create a table to hold the cache entries and set its max permanent size.
recyclerObject.PrimaryCache = {};
recyclerObject.PrimaryCacheSize = 0;
recyclerObject.MaxEntries = maxEntries;
-- Create some variables to hold stats.
@@ -62,10 +63,11 @@ end
function MikTRO:AcquireTable()
-- Check if there are any tables available in the primary cache and if so
-- return one.
if (table.getn(self.PrimaryCache) > 0) then
if (self.PrimaryCacheSize > 0) then
-- Increment the number of recycled tables.
self.NumRecycled = self.NumRecycled + 1;
self.PrimaryCacheSize = self.PrimaryCacheSize - 1;
return table.remove(self.PrimaryCache);
-- Check if there are any tables available in the overflow cache and if so
@@ -101,12 +103,13 @@ function MikTRO:ReclaimTable(t)
self:EraseTable(t);
-- Check if the primary cache is already full.
if (table.getn(self.PrimaryCache) >= self.MaxEntries) then
if (self.PrimaryCacheSize >= self.MaxEntries) then
-- Insert the table into the overflow cache.
table.insert(self.OverflowCache, t);
else
-- Insert the table into the primary cache.
table.insert(self.PrimaryCache, t);
self.PrimaryCacheSize = self.PrimaryCacheSize + 1;
end
-- Increment the number of reclaimed tables.
@@ -123,9 +126,6 @@ function MikTRO:EraseTable(t)
return;
end
-- Get the amount of memory used before the clear.
local currentMem = gcinfo();
-- Loop through all the keys in the table and clear it.
for key in pairs(t) do
t[key] = nil;
@@ -134,10 +134,7 @@ function MikTRO:EraseTable(t)
-- Set the length of the table to 0.
table.setn(t, 0);
-- Increment the amount of memory freed.
self.AmountMemFreed = self.AmountMemFreed + math.abs(gcinfo() - currentMem);
-- Incremnt the number of tables erased.
-- Increment the number of tables erased.
self.NumErased = self.NumErased + 1;
end
@@ -155,11 +152,11 @@ function MikTRO:PrintStats()
"|cff00ff00New Tables: %d|r |cffffff00Recycled Tables: %d|r |cff00ffffCached Tables: %d|r |cffff0000Overflow Tables: %d|r |cff888888Erased Tables: %d|r |cffff00ffMemory Saved: %d KiB|r |cffff0088Tables Lost to GC: %d",
self.NumNew,
self.NumRecycled,
table.getn(self.PrimaryCache),
self.PrimaryCacheSize,
overflowSize,
self.NumErased,
self.AmountMemFreed + ((32/1024) * self.NumRecycled),
self.NumReclaimed - self.NumRecycled - table.getn(self.PrimaryCache)));
self.NumReclaimed - self.NumRecycled - self.PrimaryCacheSize));
end
@@ -167,8 +164,5 @@ end
-- Checks if there are any tables in the overflow cache.
-- **********************************************************************************
function MikTRO:TablesInOverflow()
-- Loop through all items in the overflow cache.
for i in pairs(self.OverflowCache) do
return true;
end
return next(self.OverflowCache) ~= nil;
end
@@ -3388,8 +3388,10 @@ function MikSBTOpt.SetupVariableTriggerControls(triggerKey, showSearch)
end
-- Loop through all of the trigger events for the trigger.
for _, triggerEvent in triggerData.TriggerSettings.TriggerEvents do
triggerFrame.SelectedTriggerEvents[triggerEvent] = true;
if (triggerData.TriggerSettings.TriggerEvents) then
for _, triggerEvent in triggerData.TriggerSettings.TriggerEvents do
triggerFrame.SelectedTriggerEvents[triggerEvent] = true;
end
end
-- Populate the appropriate trigger events.
@@ -3533,7 +3535,7 @@ function MikSBTOpt.SaveTriggerConfig()
-- Save the required stance.
if UIDropDownMenu_GetSelectedValue(getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "StanceDropdown")) ~= 7 then
triggerData.TriggerSettings.Stance = UIDropDownMenu_GetSelectedValue(getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "StanceDropdown"));
if not GetShapeshiftFormInfo(triggerData.TriggerSettings.Stance) then
if triggerData.TriggerSettings.Stance > GetNumShapeshiftForms() or not GetShapeshiftFormInfo(triggerData.TriggerSettings.Stance) then
MikSBT.Print("No stance found for the selected requirement on this character, this trigger might never occur :o", 1, 1, 0);
MikSBT.Print("Also it's dangerous to go alone! take this. o-[====>", 1, 1, 0); --remind me that this is a beta release
end