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 ---@field events table ---@field instruction string ---@field afflictedInstruction string SpellAlert = { ---@param id number ---@param name string ---@param events table ---@param instruction string ---@param afflictedInstruction string ---@return SpellAlert new = function(id, name, events, instruction, afflictedInstruction) 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) self.events = {} for _, event in ipairs(events) do self.events[event] = true end self.instruction = instruction self.afflictedInstruction = afflictedInstruction return self end } local alerts = { -- Garothi SpellAlert.new(244410, "Decimation", { "SPELL_CAST_SUCCESS" }, "", "Move"), SpellAlert.new(246220, "Fel Bombardment", { "SPELL_CAST_SUCCESS" }, "", "Move"), SpellAlert.new(244969, "Eradication", { "SPELL_CAST_START" }, "Run away", ""), SpellAlert.new(244106, "Carnage", { "SPELL_CAST_START" }, "Tank the boss", ""), -- Felhounds SpellAlert.new(244086, "Molten Touch", { "SPELL_CAST_SUCCESS" }, "", "Run away"), SpellAlert.new(244768, "Desolate Gaze", { "SPELL_AURA_APPLIED" }, "", "Move away"), SpellAlert.new(244057, "Enflame Corruption", { "SPELL_CAST_START", "SPELL_AURA_APPLIED" }, "Spread", "Spread!!"), SpellAlert.new(244131, "Consuming Sphere", { "SPELL_AURA_APPLIED" }, "Move", ""), SpellAlert.new(244056, "Siphon Corruption", { "SPELL_CAST_START", "SPELL_AURA_APPLIED" }, "Stack", "Stack!!"), -- Antoran High Command -- SpellAlert.new(245161, "Entropic Mine"), -- Need more info -- SpellAlert.new(245546, "Summon Reinforcements"), -- Need more info -- Portal Keeper Hasabel SpellAlert.new(244016, "Reality Tear", { "SPELL_CAST_SUCCESS" }, "", ""), SpellAlert.new(243983, "Collapsing World", { "SPELL_CAST_SUCCESS" }, "Dodge", ""), SpellAlert.new(244000, "Felstorm Barrage", { "SPELL_CAST_START" }, "Dodge", ""), -- Imonar -- SpellAlert.new(247552, "Sleep Canister"), -- Need more info SpellAlert.new(247367, "Shock Lance", { "SPELL_CAST_SUCCESS" }, "", ""), SpellAlert.new(248068, "Empowered Pulse Grenade", { "SPELL_CAST_SUCCESS" }, "", ""), -- Need more info SpellAlert.new(247376, "Pulse Grenade", { "SPELL_CAST_SUCCESS" }, "", ""), -- Need more info SpellAlert.new(247716, "Charged Blasts", { "SPELL_AURA_APPLIED" }, "", "Move!!"), SpellAlert.new(247687, "Sever", { "SPELL_CAST_SUCCESS" }, "", ""), SpellAlert.new(248070, "Empowered Shrapnel Blast", { "SPELL_CAST_START" }, "Mines", ""), SpellAlert.new(250255, "Empowered Shock Lance", { "SPELL_CAST_START" }, "", ""), -- 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"), } EventMap = {} for _, alert in ipairs(alerts) do for event, _ in pairs(alert.events) do if not EventMap[event] then EventMap[event] = {} end EventMap[event][alert.id] = alert end end