CLEUEventInfo = { ["GENERIC"] = { ["timestamp"] = 1, ["subevent"] = 2, ["hideCaster"] = 3, ["sourceGUID"] = 4, ["sourceName"] = 5, ["sourceFlags"] = 6, ["sourceRaidFlags"] = 7, ["destGUID"] = 8, ["destName"] = 9, ["destFlags"] = 10, ["destRaidFlags"] = 11, }, ["GENERIC_SPELL"] = { ["spellId"] = 12, ["spellName"] = 13, ["spellSchool"] = 14, }, ["GENERIC_DAMAGE"] = { ["amount"] = 15, ["overkill"] = 16, ["school"] = 17, ["resisted"] = 18, ["blocked"] = 19, ["absorbed"] = 20, ["critical"] = 21, ["glancing"] = 22, ["crushing"] = 23, ["isOffHand"] = 24, }, ["GENERIC_MISSED"] = { ["missType"] = 15, ["isOffHand"] = 16, ["amountMissed"] = 17, ["critical"] = 18, }, ["GENERIC_HEAL"] = { ["amount"] = 15, ["overhealing"] = 16, ["absorbed"] = 17, ["critical"] = 18, }, ["GENERIC_HEAL_ABSORBED"] = { ["extraGUID"] = 15, ["extraName"] = 16, ["extraFlags"] = 17, ["extraRaidFlags"] = 18, ["extraSpellID"] = 19, ["extraSpellName"] = 20, ["extraSchool"] = 21, ["absorbedAmount"] = 22, ["totalAmount"] = 23, }, ["GENERIC_ENERGIZE"] = { ["amount"] = 15, ["overEnergize"] = 16, ["powerType"] = 17, }, ["GENERIC_DRAIN"] = { ["amount"] = 15, ["powerType"] = 16, ["extraAmount"] = 17, }, ["GENERIC_LEECH"] = { ["amount"] = 15, ["powerType"] = 16, ["extraAmount"] = 17, }, ["GENERIC_INTERRUPT"] = { ["extraSpellId"] = 15, ["extraSpellName"] = 16, ["extraSchool"] = 17, }, ["GENERIC_DISPEL"] = { ["extraSpellId"] = 15, ["extraSpellName"] = 16, ["extraSchool"] = 17, ["auraType"] = 18, }, ["GENERIC_DISPEL_FAILED"] = { ["extraSpellId"] = 15, ["extraSpellName"] = 16, ["extraSchool"] = 17, }, ["GENERIC_STOLEN"] = { ["extraSpellId"] = 15, ["extraSpellName"] = 16, ["extraSchool"] = 17, ["auraType"] = 18, }, ["GENERIC_EXTRA_ATTACKS"] = { ["amount"] = 15, }, ["GENERIC_AURA_APPLIED"] = { ["auraType"] = 15, ["amount"] = 16, }, ["GENERIC_AURA_REMOVED"] = { ["auraType"] = 15, ["amount"] = 16, }, ["GENERIC_AURA_APPLIED_DOSE"] = { ["auraType"] = 15, ["amount"] = 16, }, ["GENERIC_AURA_REMOVED_DOSE"] = { ["auraType"] = 15, ["amount"] = 16, }, ["GENERIC_AURA_REFRESH"] = { ["auraType"] = 15, }, ["GENERIC_AURA_BROKEN"] = { ["auraType"] = 15, }, ["GENERIC_AURA_BROKEN_SPELL"] = { ["extraSpellId"] = 15, ["extraSpellName"] = 16, ["extraSchool"] = 17, ["auraType"] = 18, }, ["GENERIC_CAST_START"] = { }, ["GENERIC_CAST_SUCCESS"] = { }, ["GENERIC_CAST_FAILED"] = { }, } CLEUEventInfo["SWING_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] CLEUEventInfo["SWING_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] CLEUEventInfo["SWING_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] CLEUEventInfo["SWING_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] CLEUEventInfo["SWING_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] CLEUEventInfo["SWING_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] CLEUEventInfo["SWING_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] CLEUEventInfo["SWING_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] CLEUEventInfo["SWING_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] CLEUEventInfo["SWING_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] CLEUEventInfo["SWING_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] CLEUEventInfo["SWING_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] CLEUEventInfo["SWING_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] CLEUEventInfo["SWING_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] CLEUEventInfo["SWING_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] CLEUEventInfo["SWING_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] CLEUEventInfo["SWING_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] CLEUEventInfo["SWING_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] CLEUEventInfo["SWING_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] CLEUEventInfo["SWING_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] CLEUEventInfo["SWING_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] CLEUEventInfo["SWING_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] CLEUEventInfo["RANGE_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] CLEUEventInfo["RANGE_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] CLEUEventInfo["RANGE_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] CLEUEventInfo["RANGE_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] CLEUEventInfo["RANGE_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] CLEUEventInfo["RANGE_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] CLEUEventInfo["RANGE_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] CLEUEventInfo["RANGE_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] CLEUEventInfo["RANGE_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] CLEUEventInfo["RANGE_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] CLEUEventInfo["RANGE_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] CLEUEventInfo["RANGE_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] CLEUEventInfo["RANGE_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] CLEUEventInfo["RANGE_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] CLEUEventInfo["RANGE_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] CLEUEventInfo["RANGE_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] CLEUEventInfo["RANGE_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] CLEUEventInfo["RANGE_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] CLEUEventInfo["RANGE_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] CLEUEventInfo["RANGE_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] CLEUEventInfo["RANGE_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] CLEUEventInfo["RANGE_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] CLEUEventInfo["SPELL_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] CLEUEventInfo["SPELL_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] CLEUEventInfo["SPELL_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] CLEUEventInfo["SPELL_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] CLEUEventInfo["SPELL_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] CLEUEventInfo["SPELL_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] CLEUEventInfo["SPELL_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] CLEUEventInfo["SPELL_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] CLEUEventInfo["SPELL_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] CLEUEventInfo["SPELL_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] CLEUEventInfo["SPELL_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] CLEUEventInfo["SPELL_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] CLEUEventInfo["SPELL_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] CLEUEventInfo["SPELL_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] CLEUEventInfo["SPELL_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] CLEUEventInfo["SPELL_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] CLEUEventInfo["SPELL_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] CLEUEventInfo["SPELL_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] CLEUEventInfo["SPELL_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] CLEUEventInfo["SPELL_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] CLEUEventInfo["SPELL_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] CLEUEventInfo["SPELL_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] CLEUEventInfo["SPELL_PERIODIC_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] CLEUEventInfo["SPELL_PERIODIC_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] CLEUEventInfo["SPELL_PERIODIC_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] CLEUEventInfo["SPELL_PERIODIC_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] CLEUEventInfo["SPELL_PERIODIC_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] CLEUEventInfo["SPELL_PERIODIC_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] CLEUEventInfo["SPELL_PERIODIC_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] CLEUEventInfo["SPELL_PERIODIC_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] CLEUEventInfo["SPELL_PERIODIC_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] CLEUEventInfo["SPELL_PERIODIC_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] CLEUEventInfo["SPELL_PERIODIC_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] CLEUEventInfo["SPELL_PERIODIC_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] CLEUEventInfo["SPELL_PERIODIC_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] CLEUEventInfo["SPELL_PERIODIC_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] CLEUEventInfo["SPELL_PERIODIC_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] CLEUEventInfo["SPELL_PERIODIC_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] ---@class CLEUParser CLEUParser = { ---@param ... any ---@return number, nil|string GetTimestamp = function(...) local val = select(CLEUEventInfo["GENERIC"]["timestamp"], ...) if val == nil then return 0, "Timestamp is nil or missing" end if type(val) ~= "number" then return 0, "Timestamp is not a number" end return val, nil end, ---@param ... any ---@return string, nil|string GetSubevent = function(...) local val = select(CLEUEventInfo["GENERIC"]["subevent"], ...) if val == nil then return "", "Subevent is nil or missing" end if type(val) ~= "string" then return "", "Subevent is not a string" end return val, nil end, ---@param ... any ---@return boolean, nil|string GetHideCaster = function(...) local val = select(CLEUEventInfo["GENERIC"]["hideCaster"], ...) if val == nil then return false, "HideCaster is nil or missing" end if type(val) ~= "boolean" then return false, "HideCaster is not a boolean" end return val, nil end, ---@param ... any ---@return string, nil|string GetSourceGUID = function(...) local val = select(CLEUEventInfo["GENERIC"]["sourceGUID"], ...) if val == nil then return "", "SourceGUID is nil or missing" end if type(val) ~= "string" then return "", "SourceGUID is not a string" end return val, nil end, ---@param ... any ---@return string, nil|string GetSourceName = function(...) local val = select(CLEUEventInfo["GENERIC"]["sourceName"], ...) if val == nil then return "", "SourceName is nil or missing" end if type(val) ~= "string" then return "", "SourceName is not a string" end return val, nil end, ---@param ... any ---@return number, nil|string GetSourceFlags = function(...) local val = select(CLEUEventInfo["GENERIC"]["sourceFlags"], ...) if val == nil then return 0, "SourceFlags is nil or missing" end if type(val) ~= "number" then return 0, "SourceFlags is not a number" end return val, nil end, ---@param ... any ---@return number, nil|string GetSourceRaidFlags = function(...) local val = select(CLEUEventInfo["GENERIC"]["sourceRaidFlags"], ...) if val == nil then return 0, "SourceRaidFlags is nil or missing" end if type(val) ~= "number" then return 0, "SourceRaidFlags is not a number" end return val, nil end, ---@param ... any ---@return string, nil|string GetDestGUID = function(...) local val = select(CLEUEventInfo["GENERIC"]["destGUID"], ...) if val == nil then return "", "DestGUID is nil or missing" end if type(val) ~= "string" then return "", "DestGUID is not a string" end return val, nil end, ---@param ... any ---@return string, nil|string GetDestName = function(...) local val = select(CLEUEventInfo["GENERIC"]["destName"], ...) if val == nil then return "", "DestName is nil or missing" end if type(val) ~= "string" then return "", "DestName is not a string" end return val, nil end, ---@param ... any ---@return number, nil|string GetDestFlags = function(...) local val = select(CLEUEventInfo["GENERIC"]["destFlags"], ...) if val == nil then return 0, "DestFlags is nil or missing" end if type(val) ~= "number" then return 0, "DestFlags is not a number" end return val, nil end, ---@param ... any ---@return number, nil|string GetDestRaidFlags = function(...) local val = select(CLEUEventInfo["GENERIC"]["destRaidFlags"], ...) if val == nil then return 0, "DestRaidFlags is nil or missing" end if type(val) ~= "number" then return 0, "DestRaidFlags is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| ---@param ... any ---@return number, nil|string GetSpellId = function(...) local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellId"], ...) if val == nil then return 0, "SpellId is nil or missing" end if type(val) ~= "number" then return 0, "SpellId is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| ---@param ... any ---@return string, nil|string GetSpellName = function(...) local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellName"], ...) if val == nil then return "", "SpellName is nil or missing" end if type(val) ~= "string" then return "", "SpellName is not a string" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| ---@param ... any ---@return number, nil|string GetSpellSchool = function(...) local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellSchool"], ...) if val == nil then return 0, "SpellSchool is nil or missing" end if type(val) ~= "number" then return 0, "SpellSchool is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| --- |_HEAL| --- |_ENERGIZE| --- |_DRAIN| --- |_LEECH| --- |_EXTRA_ATTACKS| --- |_AURA_APPLIED| --- |_AURA_REMOVED| --- |_AURA_APPLIED_DOSE| --- |_AURA_REMOVED_DOSE| ---@param ... any ---@return number, nil|string GetAmount = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["amount"], ...) if val == nil then return 0, "Amount is nil or missing" end if type(val) ~= "number" then return 0, "Amount is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| ---@param ... any ---@return number, nil|string GetOverkill = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["overkill"], ...) if val == nil then return 0, "Overkill is nil or missing" end if type(val) ~= "number" then return 0, "Overkill is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| ---@param ... any ---@return number, nil|string GetSchool = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["school"], ...) if val == nil then return 0, "School is nil or missing" end if type(val) ~= "number" then return 0, "School is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| --- --- Apparently this is allowed to be nil? ---@param ... any ---@return boolean, nil|string GetResisted = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["resisted"], ...) if val == nil then return false, "Resisted is nil or missing" end if type(val) ~= "boolean" then return false, "Resisted is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| --- --- Apparently this is allowed to be nil? ---@param ... any ---@return boolean, nil|string GetBlocked = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["blocked"], ...) if val == nil then return false, "Blocked is nil or missing" end if type(val) ~= "boolean" then return false, "Blocked is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| --- |_HEAL| --- --- Apparently this is allowed to be nil? ---@param ... any ---@return boolean, nil|string GetAbsorbed = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["absorbed"], ...) if val == nil then return false, "Absorbed is nil or missing" end if type(val) ~= "boolean" then return false, "Absorbed is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| --- |_MISSED| --- |_HEAL| ---@param ... any ---@return boolean, nil|string GetCritical = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["critical"], ...) if val == nil then return false, "Critical is nil or missing" end if type(val) ~= "boolean" then return false, "Critical is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| ---@param ... any ---@return boolean, nil|string GetGlancing = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["glancing"], ...) if val == nil then return false, "Glancing is nil or missing" end if type(val) ~= "boolean" then return false, "Glancing is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| ---@param ... any ---@return boolean, nil|string GetCrushing = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["crushing"], ...) if val == nil then return false, "Crushing is nil or missing" end if type(val) ~= "boolean" then return false, "Crushing is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DAMAGE| --- |_MISSED| ---@param ... any ---@return boolean, nil|string GetIsOffHand = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return false, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["isOffHand"], ...) if val == nil then return false, "IsOffHand is nil or missing" end if type(val) ~= "boolean" then return false, "IsOffHand is not a boolean" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_MISSED| --- --- return type is unconfirmed! ---@param ... any ---@return string, nil|string GetMissType = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return "", string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["missType"], ...) if val == nil then return "", "MissType is nil or missing" end if type(val) ~= "string" then return "", "MissType is not a string" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_MISSED| ---@param ... any ---@return number, nil|string --- --- return type is unconfirmed! GetAmountMissed = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["amountMissed"], ...) if val == nil then return 0, "AmountMissed is nil or missing" end if type(val) ~= "number" then return 0, "AmountMissed is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL| --- --- return type is unconfirmed! ---@param ... any ---@return number, nil|string GetOverhealing = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["overhealing"], ...) if val == nil then return 0, "Overhealing is nil or missing" end if type(val) ~= "number" then return 0, "Overhealing is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| ---@param ... any ---@return string, nil|string GetExtraGUID = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return "", string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraGUID"], ...) if val == nil then return "", "ExtraGUID is nil or missing" end if type(val) ~= "string" then return "", "ExtraGUID is not a string" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| ---@param ... any ---@return string, nil|string GetExtraName = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return "", string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraName"], ...) if val == nil then return "", "ExtraName is nil or missing" end if type(val) ~= "string" then return "", "ExtraName is not a string" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| ---@param ... any ---@return number, nil|string GetExtraFlags = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraFlags"], ...) if val == nil then return 0, "ExtraFlags is nil or missing" end if type(val) ~= "number" then return 0, "ExtraFlags is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| ---@param ... any ---@return number, nil|string GetExtraRaidFlags = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraRaidFlags"], ...) if val == nil then return 0, "ExtraRaidFlags is nil or missing" end if type(val) ~= "number" then return 0, "ExtraRaidFlags is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| --- --- WARNING! Different from "GetExtraSpellId" (capital ID!)
--- This is the doing of Blizzard, not me.
---@see CLEUParser.GetExtraSpellId ---@param ... any ---@return number, nil|string GetExtraSpellID = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraSpellID"], ...) if val == nil then return 0, "ExtraSpellID is nil or missing" end if type(val) ~= "number" then return 0, "ExtraSpellID is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| --- |_INTERRUPT| --- |_DISPEL| --- |_DISPEL_FAILED| --- |_STOLEN| --- |_AURA_BROKEN_SPELL| ---@param ... any ---@return string, nil|string GetExtraSpellName = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return "", string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraSpellName"], ...) if val == nil then return "", "extraSpellName is nil or missing" end if type(val) ~= "string" then return "", "extraSpellName is not a string" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| --- |_INTERRUPT| --- |_DISPEL| --- |_DISPEL_FAILED| --- |_STOLEN| --- |_AURA_BROKEN_SPELL| ---@param ... any ---@return number, nil|string GetExtraSchool = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraSchool"], ...) if val == nil then return 0, "ExtraSchool is nil or missing" end if type(val) ~= "number" then return 0, "ExtraSchool is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_HEAL_ABSORBED| ---@param ... any ---@return number, nil|string GetAbsorbedAmount = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["absorbedAmount"], ...) if val == nil then return 0, "AbsorbedAmount is nil or missing" end if type(val) ~= "number" then return 0, "AbsorbedAmount is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_ENERGIZE| ---@param ... any ---@return number, nil|string GetOverEnergize = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["overEnergize"], ...) if val == nil then return 0, "OverEnergize is nil or missing" end if type(val) ~= "number" then return 0, "OverEnergize is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_ENERGIZE| --- |_DRAIN| --- |_LEECH| --- --- return type is unconfirmed! ---@param ... any ---@return number, nil|string GetPowerType = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["powerType"], ...) if val == nil then return 0, "PowerType is nil or missing" end if type(val) ~= "number" then return 0, "PowerType is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DRAIN| --- |_LEECH| ---@param ... any ---@return number, nil|string GetExtraAmount = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraAmount"], ...) if val == nil then return 0, "ExtraAmount is nil or missing" end if type(val) ~= "number" then return 0, "ExtraAmount is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_INTERRUPT| --- |_DISPEL| --- |_DISPEL_FAILED| --- |_STOLEN| --- |_AURA_BROKEN_SPELL| --- --- WARNING! Different from "GetExtraSpellID" (capital ID!)
--- This is the doing of Blizzard, not me.
---@see CLEUParser.GetExtraSpellID ---@param ... any ---@return number, nil|string GetExtraSpellId = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["extraSpellId"], ...) if val == nil then return 0, "ExtraSpellId is nil or missing" end if type(val) ~= "number" then return 0, "ExtraSpellId is not a number" end return val, nil end, --- Specific to subevents prefixed by: --- |Prefix| --- |-----| --- |RANGE| --- |SWING| --- |SPELL| --- |SPELL_PERIODIC| --- |SPELL_BUILDING| --- --- And suffixed by: --- |Suffix| --- |------| --- |_DISPEL| --- |_STOLEN| --- |_AURA_APPLIED| --- |_AURA_REMOVED| --- |_AURA_APPLIED_DOSE| --- |_AURA_REMOVED_DOSE| --- |_AURA_REFRESH| --- |_AURA_BROKEN| --- |_AURA_BROKEN_SPELL| ---@param ... any ---@return number, nil|string GetExtraAuraType = function(...) local subevent, err = CLEUParser.GetSubevent(...) if err then return 0, string.format("Failed getting subevent due to: %s", err) end local val = select(CLEUEventInfo[subevent]["auraType"], ...) if val == nil then return 0, "AuraType is nil or missing" end if type(val) ~= "number" then return 0, "AuraType is not a number" end return val, nil end, } local function varargToString(...) local output = {} for i = 1, select("#", ...) do table.insert(output, tostring(select(i, ...))) end return table.concat(output, ", ") end -- C:\Users\Administrator\Seafile\Backup-WoW\Ruski\WTF\Account\phatphuckdave\SavedVariables\WeakAuras.lua -- /dump WeakAurasSaved.Cyka.CLEUExample if not WeakAurasSaved then WeakAurasSaved = {} end if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end if not WeakAurasSaved.Cyka.CLEUExample then WeakAurasSaved.Cyka.CLEUExample = {} end ---@param spellName string ---@param spellId number ---@param subevent string ---@param ... any aura_env.LogSpell = function(spellName, spellId, subevent, ...) local slug = string.format("%d-%s", spellId, subevent) if not WeakAurasSaved.Cyka.CLEUExample[slug] then WeakAurasSaved.Cyka.CLEUExample[slug] = varargToString(spellName, spellId, subevent, ...) end end local SoundFileRoot = "Interface\\Sounds\\spellAlert\\" ---@class SpellAlert ---@field id number ---@field soundFile string SpellAlert = { ---@param id number ---@param name string ---@return SpellAlert new = function(id, name) local self = setmetatable({}, { __index = SpellAlert }) self.id = id name = string.gsub(name, " ", "_") name = string.lower(name) self.soundFile = string.format("%s%s.ogg", SoundFileRoot, name) return self end } -- [230094] = "Nullification, 230094, SPELL_CAST_SUCCESS, 1709744064.211, SPELL_CAST_SUCCESS, false, Creature-0-67-1651-0-115765-000039BF96, Abstract Nullifier, 68168, 0, Player-67-00341022, Lanarhodess, 1298, 0, 230094, Nullification, 1", -- [230083] = "Nullification, 230083, SPELL_AURA_REMOVED, 1709744064.303, SPELL_AURA_REMOVED, false, Creature-0-67-1651-0-115765-000039BF96, Abstract Nullifier, 68168, 0, Player-67-003521C2, Bonkleta, 1297, 0, 230083, Nullification, 1, DEBUFF", -- [227267] = "Summon Volatile Energy, 227267, SPELL_SUMMON, 1709744153.649, SPELL_SUMMON, false, Creature-0-67-1651-0-114247-000039BF70, The Curator, 68168, 0, Creature-0-67-1651-0-114249-00003A1923, Volatile Energy, 2632, 0, 227267, Summon Volatile Energy, 64", local alerts = { -- Garothi SpellAlert.new(244410, "Decimation"), SpellAlert.new(246220, "Fel Bombardment"), SpellAlert.new(244969, "Eradication"), SpellAlert.new(244106, "Carnage"), -- Felhounds SpellAlert.new(244086, "Molten Touch"), SpellAlert.new(244768, "Desolate Gaze"), SpellAlert.new(244057, "Enflame Corruption"), SpellAlert.new(244131, "Consuming Sphere"), SpellAlert.new(244056, "Siphon Corruption"), -- Antoran High Command SpellAlert.new(245161, "Entropic Mine"), SpellAlert.new(245546, "Summon Reinforcements"), -- Portal Keeper Hasabel SpellAlert.new(244016, "Reality Tear"), SpellAlert.new(243983, "Collapsing World"), SpellAlert.new(244000, "Felstorm Barrage"), -- Imonar SpellAlert.new(247552, "Sleep Canister"), SpellAlert.new(247367, "Shock Lance"), SpellAlert.new(248068, "Empowered Pulse Grenade"), SpellAlert.new(247376, "Pulse Grenade"), SpellAlert.new(247716, "Charged Blasts"), SpellAlert.new(247687, "Sever"), SpellAlert.new(248070, "Empowered Shrapnel Blast"), SpellAlert.new(250255, "Empowered Shock Lance"), -- Kin'garoth SpellAlert.new(254919, "Forging Strike"), SpellAlert.new(254926, "Reverberating Strike"), SpellAlert.new(246840, "Ruiner"), SpellAlert.new(246779, "Diabolic Bomb"), SpellAlert.new(246706, "Demolish"), SpellAlert.new(246664, "Annihilation"), -- Varimathras SpellAlert.new(243960, "Shadow Strike"), SpellAlert.new(243961, "Misery"), SpellAlert.new(244042, "Marked Prey"), SpellAlert.new(244093, "Necrotic Embrace"), SpellAlert.new(248732, "Echoes of Doom"), SpellAlert.new(243999, "Dark Fissure"), -- Coven SpellAlert.new(253189, "Shivan Pact"), SpellAlert.new(244899, "Fiery Strike"), SpellAlert.new(245627, "Whirling Saber"), SpellAlert.new(245281, "Shadow Blades"), SpellAlert.new(245586, "Chilled Blood"), -- Aggramar SpellAlert.new(254452, "Ravenous Blaze"), SpellAlert.new(244693, "Wake of Flame"), SpellAlert.new(244291, "Foe Braker"), SpellAlert.new(244033, "Flame Rend"), SpellAlert.new(247079, "Empowered Flame Rend"), SpellAlert.new(245983, "Flare"), SpellAlert.new(246037, "Empowered Flare"), -- Argus SpellAlert.new(256457, "Cone of Death"), SpellAlert.new(248396, "Soulblight"), SpellAlert.new(257296, "Tortured Rage"), SpellAlert.new(251570, "Soulbomb"), -- Mythic+ -- Black Rook Hold SpellAlert.new(225573, "Dark Mending"), SpellAlert.new(200105, "Sacrifice Soul"), SpellAlert.new(225732, "Strike Down"), SpellAlert.new(194996, "Soul Echoes"), SpellAlert.new(195254, "Swirling Scythe"), SpellAlert.new(194956, "Reap Soul"), SpellAlert.new(200248, "Arcane Blitz"), SpellAlert.new(200345, "Arrow Barrage"), SpellAlert.new(200291, "Knife Dance"), SpellAlert.new(200261, "Bonebreaking Strike"), SpellAlert.new(197418, "Vengeful Shear"), SpellAlert.new(201139, "Brutal Assault"), SpellAlert.new(198245, "Brutal Haymaker"), SpellAlert.new(198079, "Hateful Gaze"), -- Cathedral of Eternal Night SpellAlert.new(241937, "Shadow Wall"), SpellAlert.new(238543, "Demonic Mending"), SpellAlert.new(242792, "Vile Roots"), SpellAlert.new(236627, "Floral Fulmination"), SpellAlert.new(239217, "Blinding Glare"), SpellAlert.new(237726, "Scornful Gaze"), SpellAlert.new(190620, "Felblaze Orb"), SpellAlert.new(239268, "Venom Storm"), SpellAlert.new(234107, "Chaotic Energy"), SpellAlert.new(236543, "Felsoul Cleave"), SpellAlert.new(238315, "Shadow Sweep"), SpellAlert.new(243168, "Demonic Upheaval"), -- Court of Stars SpellAlert.new(210261, "Sound Alarm"), SpellAlert.new(215204, "Hinder"), SpellAlert.new(209027, "Quelling Strike"), SpellAlert.new(209516, "Mana Fang"), SpellAlert.new(209485, "Drain Magic"), SpellAlert.new(209404, "Seal Magic"), SpellAlert.new(209495, "Charged Smash"), SpellAlert.new(225100, "Charging Station"), SpellAlert.new(219488, "Streetsweeper"), SpellAlert.new(212784, "Eye Storm"), SpellAlert.new(211464, "Fel Detonation"), SpellAlert.new(207980, "Disintegration Beam"), SpellAlert.new(207979, "Shockwave"), SpellAlert.new(209628, "Piercing Gale"), SpellAlert.new(209676, "Slicing Maelstrom"), -- Darkheart Thicket SpellAlert.new(200631, "Unnerving Screech"), SpellAlert.new(200580, "Maddening Roar"), SpellAlert.new(191326, "Breath of Corruption"), SpellAlert.new(201400, "Dread Inferno"), SpellAlert.new(200238, "Feed on the Weak"), -- Eye of Azshara SpellAlert.new(195172, "Mighty Slam"), SpellAlert.new(195129, "Thundering Stomp"), SpellAlert.new(195046, "Rejuvenating Waters"), SpellAlert.new(162135, "Bellowing Roar"), SpellAlert.new(197105, "Polymorh Fish"), SpellAlert.new(193597, "Static Nova"), SpellAlert.new(193611, "Focused Lightning"), SpellAlert.new(196129, "Spray Sand"), SpellAlert.new(196144, "Sandstorm"), SpellAlert.new(196296, "Roiling Storm"), SpellAlert.new(196290, "Chaotic Tempest"), SpellAlert.new(191848, "Rampage"), -- Halls of Valor SpellAlert.new(198605, "Thunderstrike"), SpellAlert.new(198888, "Lightning Breath"), SpellAlert.new(191284, "Horn of Valor"), SpellAlert.new(198934, "Rune of Healing"), SpellAlert.new(215433, "Holy Radiance"), SpellAlert.new(199210, "Penetrating Shot"), SpellAlert.new(191976, "Arcing Bolt"), SpellAlert.new(192305, "Eye of the Storm"), SpellAlert.new(192307, "Sanctify"), SpellAlert.new(192048, "Expel Light"), SpellAlert.new(192018, "Shield of Light"), SpellAlert.new(196512, "Claw Frenzy"), SpellAlert.new(199652, "Sever"), SpellAlert.new(199726, "Unruly Yell"), SpellAlert.new(199674, "Wicked Dagger"), SpellAlert.new(193826, "Ragnarok"), SpellAlert.new(198263, "Radiant Tempest"), SpellAlert.new(198072, "Spear of Light"), SpellAlert.new(197961, "Runic Band"), SpellAlert.new(198750, "Surge"), -- Maw of Souls SpellAlert.new(193364, "Screams of the Dead"), SpellAlert.new(194442, "Six Pound Barrel"), SpellAlert.new(194615, "Sea Legs"), SpellAlert.new(192019, "Lantern of Darkness"), SpellAlert.new(194099, "Bile Breath"), SpellAlert.new(198405, "Bone Chilling Scream"), SpellAlert.new(194325, "Fragment"), SpellAlert.new(194216, "Cosmic Scythe"), SpellAlert.new(195293, "Debilitating Shout"), SpellAlert.new(185539, "Rapid Rupture"), SpellAlert.new(198495, "Torrent"), SpellAlert.new(202098, "Brackwater Barrage"), -- Neltharion's Lair SpellAlert.new(202181, "Stone Gaze"), SpellAlert.new(226296, "Piercing Shards"), SpellAlert.new(188169, "Razor Shards"), SpellAlert.new(198496, "Sunder"), SpellAlert.new(199176, "Spiked Tongue"), SpellAlert.new(193585, "Bound"), SpellAlert.new(200700, "Landslide"), SpellAlert.new(200732, "Molten Crash"), -- The Arcway SpellAlert.new(211771, "Prophecies of Doom"), SpellAlert.new(211037, "Celerity Zone"), SpellAlert.new(195791, "Quarantine"), SpellAlert.new(226285, "Demonic Ascension"), SpellAlert.new(197810, "Wicked Slam"), SpellAlert.new(211217, "Arcane Slicer"), SpellAlert.new(211115, "Phase Breach"), SpellAlert.new(196392, "Overcharge Mana"), SpellAlert.new(200040, "Nether Venom"), SpellAlert.new(200227, "Tangled Web"), SpellAlert.new(220871, "Unstable Mana"), -- Vault of the Wardens SpellAlert.new(193069, "Nightmares"), SpellAlert.new(197799, "Unleash Fury"), SpellAlert.new(191735, "Deafening Screech"), SpellAlert.new(190836, "Hatred"), SpellAlert.new(202913, "Fel Mortar"), SpellAlert.new(200898, "Teleport"), SpellAlert.new(199917, "Shadow Crash"), SpellAlert.new(202658, "Drain"), SpellAlert.new(194945, "Lingering Gaze"), SpellAlert.new(196249, "Meteor"), SpellAlert.new(192631, "Lava Wreath"), SpellAlert.new(197513, "Detonating Moonglaive"), SpellAlert.new(189469, "Turn Kick"), -- Upper Karazhan SpellAlert.new(230083, "Nullification"), SpellAlert.new(227267, "Summon Volatile Energy"), SpellAlert.new(227254, "Evocation"), SpellAlert.new(229662, "Fel Breath"), SpellAlert.new(36247, "Fel Fireball"), SpellAlert.new(227628, "Piercing Missiles"), SpellAlert.new(227615, "Inferno Bolt"), SpellAlert.new(227592, "Frostbite"), SpellAlert.new(228269, "Flame Wreath"), SpellAlert.new(227779, "Ceaseless Winter"), SpellAlert.new(229706, "Leech Life"), SpellAlert.new(229714, "Consume Magic"), SpellAlert.new(229159, "Chaotic Shadows"), SpellAlert.new(229083, "Burning Blast"), SpellAlert.new(229151, "Disintegrate"), -- Lower Karazhan SpellAlert.new(228221, "Severe Dusting"), SpellAlert.new(228225, "Sultry Heat"), SpellAlert.new(232153, "Kara Kazham"), SpellAlert.new(227987, "Dinner Bell"), SpellAlert.new(228025, "Heat Wave"), SpellAlert.new(227568, "Burning Leg Sweep"), SpellAlert.new(227776, "Magic Magnificent"), SpellAlert.new(227966, "Flashlight"), SpellAlert.new(228279, "Shadow Rejuvenation"), SpellAlert.new(228278, "Demoralizing Shout"), SpellAlert.new(228277, "Shackles of Servitude"), SpellAlert.new(226316, "Shadow Bolt Volley"), SpellAlert.new(227508, "Mass Repentance"), SpellAlert.new(227793, "Sacred Ground"), SpellAlert.new(227463, "Whirling Edge"), SpellAlert.new(227646, "Iron Whirlwind"), SpellAlert.new(227672, "Will Breaker"), SpellAlert.new(227404, "Intangible Presence"), SpellAlert.new(227493, "Mortal Strike"), SpellAlert.new(228852, "Shared Suffering"), SpellAlert.new(228837, "Bellowing Roar"), } aura_env.EventMap = { ["SPELL_CAST_SUCCESS"] = { alerts[230094], -- Nullification } }