You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4796 lines
127 KiB

local E = select(2, ...):unpack()
local P, CM, CD = E.Party, E.Comm, E.Cooldowns
local pairs, type, tonumber, unpack, tinsert, wipe, strmatch, min, max, abs = pairs, type, tonumber, unpack, table.insert, table.wipe, string.match, math.min, math.max, math.abs
local GetTime, UnitBuff, UnitTokenFromGUID, UnitHealth, UnitHealthMax, UnitLevel, UnitChannelInfo, UnitAffectingCombat = GetTime, UnitBuff, UnitTokenFromGUID, UnitHealth, UnitHealthMax, UnitLevel, UnitChannelInfo, UnitAffectingCombat
local GetSpellTexture = C_Spell and C_Spell.GetSpellTexture or GetSpellTexture
local AuraUtil_ForEachAura = AuraUtil and AuraUtil.ForEachAura
local C_Timer_After, C_Timer_NewTimer, C_Timer_NewTicker = C_Timer.After, C_Timer.NewTimer, C_Timer.NewTicker
local band = bit.band
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local COMBATLOG_OBJECT_TYPE_GUARDIAN = COMBATLOG_OBJECT_TYPE_GUARDIAN
local COMBATLOG_OBJECT_REACTION_FRIENDLY = COMBATLOG_OBJECT_REACTION_FRIENDLY
local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
local COMBATLOG_OBJECT_AFFILIATION_MINE = COMBATLOG_OBJECT_AFFILIATION_MINE
local COMBATLOG_OBJECT_TYPE_PET = COMBATLOG_OBJECT_TYPE_PET
local BOOKTYPE_CATEGORY = E.BOOKTYPE_CATEGORY
local groupInfo = P.groupInfo
local userGUID = E.userGUID
local isUserDisabled
local isHighlightEnabled
local totemGUIDS = {}
local petGUIDS = {}
local diedHostileGUIDS = {}
local dispelledHostileGUIDS = {}
E.auraMultString = {}
function CD:Enable()
if self.enabled then
return
end
self:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED')
self:RegisterEvent('UNIT_PET')
self:SetScript("OnEvent", function(self, event, ...)
self[event](self, ...)
end)
self.enabled = true
end
function CD:Disable()
if not self.enabled then
return
end
self:UnregisterEvent('COMBAT_LOG_EVENT_UNFILTERED')
self:UnregisterEvent('UNIT_PET')
wipe(totemGUIDS)
wipe(petGUIDS)
wipe(diedHostileGUIDS)
wipe(dispelledHostileGUIDS)
self.enabled = false
end
function CD:UpdateCombatLogVar()
isUserDisabled = P.isUserDisabled
isHighlightEnabled = E.db.highlight.glowBuffs
end
local function GetHolyWordReducedTime(info, reducedTime)
local naaruRank = info.talentData[196985]
if naaruRank then
reducedTime = reducedTime + reducedTime * (E.isDF and 0.1 * naaruRank or .33)
end
if info.auras.isApotheosisActive then
reducedTime = reducedTime * 4
end
if info.talentData[453677] then
reducedTime = reducedTime * (P.isPvP and 1.05 or 1.1)
end
return reducedTime
end
local priestHolyWordSpells = {
[88625] = true,
[34861] = true,
[2050] = true,
[265202] = true,
}
local function UpdateCdByReducer(info, t, isHolyPriest)
local talent, pvpMult, duration, target, aura = t[1], t[2], t[3], t[4], t[5]
if aura and not info.auras[aura] then
return
end
local talentRank = P:IsSpecOrTalentForPvpStatus(talent, info, true)
if talentRank then
if type(target) == "table" then
for targetID, reducedTime in pairs(target) do
local icon = info.spellIcons[targetID]
if icon and icon.active then
if type(reducedTime) == "table" then
if reducedTime[1] > 999 then
reducedTime = info.talentData[ reducedTime[1] ] and reducedTime[2] or reducedTime[3]
if type(reducedTime) == "table" then
reducedTime = reducedTime[talentRank] or reducedTime[1]
end
else
reducedTime = reducedTime[talentRank] or reducedTime[1]
end
end
if reducedTime then
reducedTime = P.isPvP and pvpMult * reducedTime or reducedTime
P:UpdateCooldown(icon, isHolyPriest and priestHolyWordSpells[targetID] and GetHolyWordReducedTime(info, reducedTime) or reducedTime)
end
end
end
elseif target then
local icon = info.spellIcons[target]
if icon and icon.active then
duration = type(duration) == "table" and (duration[talentRank] or duration[1]) or duration
if duration then
duration = P.isPvP and pvpMult * duration or duration
P:UpdateCooldown(icon, isHolyPriest and priestHolyWordSpells[target] and GetHolyWordReducedTime(info, duration) or duration)
end
end
elseif talent == 382523 then
duration = type(duration) == "table" and (duration[talentRank] or duration[1]) or duration
duration = P.isPvP and pvpMult * duration or duration
for spellID, icon in pairs(info.spellIcons) do
if icon.active and spellID ~= 1856 and (icon.isBookType) then
P:UpdateCooldown(icon, duration)
end
end
end
end
end
local wotlkcReadinessExcluded = {
[23989] = true,
[19574] = true,
[53480] = true,
[54044] = true,
[53490] = true,
[53517] = true,
[26090] = true,
}
local function ResetCdByCast(info, reset)
for i = 1, #reset do
local resetID = reset[i]
if i > 1 then
if type(resetID) == "table" then
ResetCdByCast(info, resetID)
elseif resetID == "*" then
for id, icon in pairs(info.spellIcons) do
if icon.active and icon.isBookType and not wotlkcReadinessExcluded[id] then
P:ResetCooldown(icon)
end
end
else
local icon = info.spellIcons[resetID]
if icon and icon.active then
if resetID == 6143 then
if info.active[resetID] and resetID == info.active[resetID].castedLink then
local linkedIcon = info.spellIcons[543]
if linkedIcon and linkedIcon.active then
P:ResetCooldown(linkedIcon)
end
P:ResetCooldown(icon)
end
elseif resetID ~= 120 or not info.talentData[417493] then
P:ResetCooldown(icon)
end
end
end
elseif resetID and not P:IsTalentForPvpStatus(resetID, info) then
return
end
end
end
local function ProcessSpell(spellID, guid)
if E.spell_dispel_cdstart[spellID] then
return
end
local info = groupInfo[guid]
if not info then
return
end
if P.isInShadowlands and guid ~= userGUID and not CM.syncedGroupMembers[guid] then
local covenantID = E.covenant_abilities[spellID]
if covenantID then
P.loginsessionData[guid] = P.loginsessionData[guid] or {}
local currID = P.loginsessionData[guid].covenantID
if covenantID ~= currID then
if currID then
local currSpellID = E.covenant_to_spellid[currID]
P.loginsessionData[guid][currSpellID] = nil
info.talentData[currSpellID] = nil
if currID == 3 then
info.talentData[319217] = nil
end
end
local covenantSpellID = E.covenant_to_spellid[covenantID]
P.loginsessionData[guid][covenantSpellID] = "C"
P.loginsessionData[guid].covenantID = covenantID
info.talentData[covenantSpellID] = "C"
info.shadowlandsData.covenantID = covenantID
if spellID == 319217 then
info.talentData[spellID] = 0
end
P:UpdateUnitBar(guid)
else
if spellID == 319217 and not info.talentData[spellID] then
info.talentData[spellID] = 0
P:UpdateUnitBar(guid)
end
end
end
end
local mergedID = E.spell_merged[spellID]
local linked = E.spell_linked[mergedID or spellID]
if linked then
for _, linkedID in pairs(linked) do
local icon = info.spellIcons[linkedID]
if icon then
if isHighlightEnabled and mergedID and linkedID == mergedID then
icon.buff = spellID
end
P:StartCooldown(icon, (E.isWOTLKC or E.isCata) and (spellID == 6552 and 10 or (spellID == 72 and 12)) or icon.duration)
if E.preMoP then
info.active[linkedID].castedLink = mergedID or spellID
end
end
end
return
end
local mergedIcon = mergedID and (info.spellIcons[mergedID] or info.spellIcons[ E.spell_merged[mergedID] ])
local icon = info.spellIcons[spellID] or mergedIcon
if icon and icon.duration > 0 then
if isHighlightEnabled and mergedIcon then
icon.buff = spellID
end
if E.spell_auraremoved_cdstart_preactive[spellID] then
local statusBar = icon.statusBar
if icon.active then
if statusBar then
P.OmniCDCastingBarFrame_OnEvent(statusBar.CastingBar, 'UNIT_SPELLCAST_STOP')
end
icon.cooldown:Clear()
end
if statusBar then
if E.db.extraBars[statusBar.key].useIconAlpha then
icon:SetAlpha(E.db.icons.activeAlpha)
end
statusBar.BG:SetVertexColor(0.7, 0.7, 0.7)
else
icon:SetAlpha(E.db.icons.activeAlpha)
end
info.preactiveIcons[spellID] = icon
if not P:HighlightIcon(icon) then
icon.icon:SetVertexColor(0.4, 0.4, 0.4)
end
if spellID == 5384 then
info.bar:RegisterUnitEvent('UNIT_AURA', info.unit)
end
return
end
local updateSpell = E.spell_merged_updateoncast[spellID]
if updateSpell then
local cd = updateSpell[1] or icon.duration
if mergedID == 272651 and P.isPvP and info.talentData[356962] then
cd = cd / 2
end
local iconID = info.talentData[ updateSpell[3] ] and updateSpell[4] or updateSpell[2]
if iconID then
icon.icon:SetTexture(iconID)
end
P:StartCooldown(icon, cd)
return
end
P:StartCooldown(icon, icon.duration)
end
local shared = E.spellcast_shared_cdstart[spellID]
if shared then
local now = GetTime()
for i = 1, #shared, 2 do
local sharedID = shared[i]
local sharedCD = shared[i+1]
local sharedIcon = info.spellIcons[sharedID]
if sharedIcon then
local active = sharedIcon.active and info.active[sharedID]
if not active or (active.startTime + active.duration - now < sharedCD) then
P:StartCooldown(sharedIcon, sharedCD)
end
if not E.preMoP then
break
end
end
end
return
end
local reset = E.spellcast_cdreset[spellID]
if reset then
if type(reset[1]) == "table" then
for i = 1, #reset do
local t = reset[i]
ResetCdByCast(info, t)
end
else
ResetCdByCast(info, reset)
end
end
local reducer = E.spellcast_cdr[spellID]
if reducer then
local isHolyPriest = info.class == "PRIEST"
if type(reducer[1]) == "table" then
for i = 1, #reducer do
local t = reducer[i]
UpdateCdByReducer(info, t, spellID ~= 88625 and isHolyPriest)
end
else
UpdateCdByReducer(info, reducer, spellID ~= 88625 and isHolyPriest)
end
end
if not E.isBFA then return end
local azerite = E.spellcast_cdr_azerite[spellID]
if azerite and info.talentData[azerite.azerite] then
for k, reducedTime in pairs(azerite.target) do
local targetIcon = info.spellIcons[k]
if targetIcon then
if targetIcon.active then
P:UpdateCooldown(targetIcon, reducedTime)
end
break
end
end
end
end
local mt = {
__index = function(t, k)
t[k] = {}
return t[k]
end
}
local registeredEvents = setmetatable({}, mt)
local registeredHostileEvents = setmetatable({}, mt)
local registeredUserEvents = setmetatable({}, mt)
local function RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
if isHighlightEnabled and destGUID == srcGUID then
local icon = info.glowIcons[spellID]
if icon then
P:RemoveHighlight(icon)
end
end
end
for k in pairs(E.spell_highlighted) do
registeredEvents['SPELL_AURA_REMOVED'][k] = RemoveHighlightByCLEU
end
function CD:RegisterRemoveHighlightByCLEU(spellID)
local func = registeredEvents['SPELL_AURA_REMOVED'][spellID]
if not func then
registeredEvents['SPELL_AURA_REMOVED'][spellID] = RemoveHighlightByCLEU
elseif func ~= RemoveHighlightByCLEU then
registeredEvents['SPELL_AURA_REMOVED'][spellID] = function(...)
func(...)
RemoveHighlightByCLEU(...)
end
end
end
E.spell_aura_freespender = {
[219788] = "Ossuary",
[454871] = "BloodDraw",
[135286] = "ToothandClaw",
[201671] = "GoryFur",
[260242] = "PreciseShot",
[448814] = "FuriousAssault",
[392883] = "VivaciousVivification",
[451462] = "OrderedElements",
[327510] = "ShiningLight",
[387079] = "TormentedCrescendo",
[387356] = "CrashingChaos",
[387157] = "RitualOfRuin",
[5302] = "Revenge",
[52437] = "SuddenDeath",
[32216] = "Victorious",
[439601] = "StormofSwords",
}
registeredEvents['SPELL_AURA_APPLIED'][393039] = function(info, _,_,_,_,_,_, amount) info.auras["TheEmperorsCapacitor"] = amount or 1 end
registeredEvents['SPELL_AURA_APPLIED_DOSE'][393039] = registeredEvents['SPELL_AURA_APPLIED'][393039]
registeredEvents['SPELL_AURA_REMOVED'][393039] = function(info) info.auras["TheEmperorsCapacitor"] = nil end
for k, v in pairs(E.spell_aura_freespender) do
registeredEvents['SPELL_AURA_REMOVED'][k] = E.spell_highlighted[k] and function(info, srcGUID, spellID, destGUID)
info.auras[v] = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end or function(info)
info.auras[v] = nil
end
registeredEvents['SPELL_AURA_APPLIED'][k] = function(info)
info.auras[v] = k
end
end
local function ForceUpdatePeriodicSync(id)
local cooldownInfo = CM.cooldownSyncIDs[id]
if cooldownInfo then
if cooldownInfo[1] == 0 then
cooldownInfo[1] = 1
end
cooldownInfo[2] = -0.1
CM:ForceSyncCooldowns()
end
end
for id in pairs(E.sync_reset) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = function(_, srcGUID)
if srcGUID == userGUID then
ForceUpdatePeriodicSync(id)
end
end
registeredUserEvents['SPELL_CAST_SUCCESS'][id] = function()
ForceUpdatePeriodicSync(id)
end
end
local playerInterrupts = {
47528,
183752,
106839,
93985,
97547,
351338,
147362,
187707,
2139,
116705,
96231,
31935,
220543,
1766,
57994,
132409,
6552,
386071,
}
local function AppendInterruptExtras(info, _, spellID, _,_,_, extraSpellId, extraSpellName, _,_, destRaidFlags)
local icon = info.spellIcons[E.spell_merged[spellID] or spellID]
local statusBar = icon and icon.type == "interrupt" and icon.statusBar
if statusBar then
local frame = icon:GetParent():GetParent()
if frame.index == 1 then
if frame.db.showInterruptedSpell then
local extraSpellTexture = GetSpellTexture(extraSpellId)
if extraSpellTexture then
icon.icon:SetTexture(extraSpellTexture)
icon.tooltipID = extraSpellId
if not E.db.icons.showTooltip and icon.isPassThrough then
icon:EnableMouse(true)
end
end
end
if frame.db.showRaidTargetMark then
local mark = E.RAID_TARGET_MARKERS[destRaidFlags]
if mark then
statusBar.CastingBar.Text:SetFormattedText("%s %s", statusBar.name, mark)
end
end
end
end
end
for _, id in pairs(playerInterrupts) do
registeredEvents['SPELL_INTERRUPT'][id] = AppendInterruptExtras
end
local function StartCdOnAuraRemoved(info, srcGUID, spellID, destGUID)
if srcGUID == destGUID then
spellID = E.spell_auraremoved_cdstart_preactive[spellID]
local icon = info.spellIcons[spellID]
if icon then
local statusBar = icon.statusBar
if statusBar then
P:SetExStatusBarColor(icon, statusBar.key)
end
info.preactiveIcons[spellID] = nil
icon.icon:SetVertexColor(1, 1, 1)
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
P:StartCooldown(icon, icon.duration)
end
end
if E.sync_reset[spellID] and srcGUID == userGUID then
ForceUpdatePeriodicSync(spellID)
end
end
for k, v in pairs(E.spell_auraremoved_cdstart_preactive) do
if v > 0 then
registeredEvents['SPELL_AURA_REMOVED'][k] = StartCdOnAuraRemoved
end
end
local function ProcessSpellOnAuraApplied(_, srcGUID, spellID)
spellID = E.spell_auraapplied_processspell[spellID]
ProcessSpell(spellID, srcGUID)
end
for k in pairs(E.spell_auraapplied_processspell) do
if k == 454871 then
registeredEvents['SPELL_AURA_APPLIED'][k] = function(info, srcGUID, spellID)
info.auras[k] = true
spellID = E.spell_auraapplied_processspell[spellID]
ProcessSpell(spellID, srcGUID)
end
else
registeredEvents['SPELL_AURA_APPLIED'][k] = ProcessSpellOnAuraApplied
end
end
for id in pairs(E.spell_dispel_cdstart) do
registeredEvents['SPELL_DISPEL'][id] = function(info)
local icon = info.spellIcons[id]
if icon then
P:StartCooldown(icon, icon.duration)
end
end
end
registeredEvents['SPELL_ENERGIZE'][378849] = function(info)
local icon = info.spellIcons[47528]
if icon and icon.active then
P:UpdateCooldown(icon, 3)
end
end
registeredEvents['SPELL_CAST_SUCCESS'][219809] = function(info)
local numShields = info.auras.numBoneShields
if not numShields or numShields == 1 then
return
end
local consumed = min(5, numShields)
local icon = info.spellIcons[221699]
if icon and icon.active then
P:UpdateCooldown(icon, 2 * consumed)
end
if info.talentData[377637] then
icon = info.spellIcons[49028]
if icon and icon.active then
P:UpdateCooldown(icon, 5 * consumed)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][194844] = registeredEvents['SPELL_CAST_SUCCESS'][219809]
local function ReduceBloodTapDancingRuneWeaponCD(info, _,_,_,_,_,_, amount)
local numShields = info.auras.numBoneShields
if not numShields then
return
end
amount = amount or 0
info.auras.numBoneShields = amount
local consumed = numShields - amount
if consumed ~= 1 then
return
end
local icon = info.spellIcons[221699]
if icon and icon.active then
P:UpdateCooldown(icon, 2)
end
if info.talentData[377637] then
icon = info.spellIcons[49028]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
end
registeredEvents['SPELL_AURA_REMOVED_DOSE'][195181] = ReduceBloodTapDancingRuneWeaponCD
registeredEvents['SPELL_AURA_REMOVED'][195181] = ReduceBloodTapDancingRuneWeaponCD
registeredEvents['SPELL_AURA_APPLIED_DOSE'][195181] = function(info, _,_,_,_,_,_, amount)
if amount and (info.spellIcons[221699] or info.spellIcons[49028]) then
info.auras.numBoneShields = amount
end
end
local runicPowerSpenders = {
[49998] = 45,
[47541] = 30,
}
registeredEvents['SPELL_AURA_APPLIED'][81256] = function(info)
info.auras.isDancingRuneWeapon = true
end
registeredEvents['SPELL_AURA_REMOVED'][81256] = function(info, srcGUID, spellID, destGUID)
info.auras.isDancingRuneWeapon = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
local function ReduceVampiricBloodCD(info, _, spellID)
if info.talentData[205723] then
local icon = info.spellIcons[55233]
if icon and icon.active then
local usedRP = runicPowerSpenders[spellID]
if spellID == 49998 then
--[[
if info.talentData[374277] then
usedRP = usedRP - 5
end
]]
if info.auras["Ossuary"] then
usedRP = usedRP - 5
end
if info.auras["BloodDraw"] then
usedRP = usedRP - 10
end
elseif spellID == 47541 then
if info.auras["Ossuary"] then
usedRP = usedRP - 5
end
end
P:UpdateCooldown(icon, usedRP/10 * 2)
end
end
end
for id in pairs(runicPowerSpenders) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = ReduceVampiricBloodCD
end
registeredEvents['SPELL_DAMAGE'][436304] = function(info)
local icon = info.spellIcons[48743]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
registeredEvents['PARTY_KILL']['DEATHKNIGHT'] = function(info, _,_, destGUID)
local unit = UnitTokenFromGUID(destGUID)
if unit then
if abs(info.level - UnitLevel(unit)) <= 8 then
local icon = info.talentData[276079] and info.spellIcons[49576]
if icon and icon.active then
P:ResetCooldown(icon)
end
icon = info.talentData[434136] and info.spellIcons[48792]
if icon and icon.active then
P:UpdateCooldown(icon, 3)
end
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][212800] = function(info)
if info.talentData[205411] then
local icon = info.spellIcons[198589]
if icon and ( not icon.active ) then
P:StartCooldown(icon, icon.duration/2)
end
end
end
registeredEvents['SPELL_HEAL'][203794] = function(info)
local talentRank = info.talentData[218612]
if talentRank then
local icon = info.spellIcons[203720]
if icon and icon.active then
P:UpdateCooldown(icon, talentRank == 2 and .5 or .25)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][162264] = function(info, srcGUID, spellID, destGUID)
if info.talentData[390142] then
local icon = info.spellIcons[195072]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_ENERGIZE'][391345] = function(info, _,_,_,_,_, amount)
local icon = info.spellIcons[212084]
if icon and icon.active then
P:UpdateCooldown(icon, icon.duration * amount/100)
end
end
local demonHunterSigils = {
[204596] = 204598,
[207684] = 207685,
[202137] = 204490,
[202138] = 204843,
[390163] = 389860,
}
local function ReduceSigilsCD(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if info.talentData[389718] then
if timestamp > (info.auras.time_cycleofbinding or 0) then
for castID in pairs(demonHunterSigils) do
local icon = info.spellIcons[castID]
if icon and icon.active then
P:UpdateCooldown(icon, 2)
end
end
info.auras.time_cycleofbinding = timestamp + 0.1
end
end
end
for _, auraID in pairs(demonHunterSigils) do
if ( auraID == 389860 or auraID == 204598 ) then
registeredEvents['SPELL_DAMAGE'][auraID] = ReduceSigilsCD
else
registeredEvents['SPELL_AURA_APPLIED'][auraID] = ReduceSigilsCD
registeredEvents['SPELL_AURA_REFRESH'][auraID] = ReduceSigilsCD
end
end
registeredEvents['SPELL_AURA_REMOVED'][50334] = function(info, srcGUID, spellID, destGUID)
info.auras["berserkRavage"] = nil
info.auras["berserkPersistence"] = nil
info.auras["isBerserkUnchecdAggression"] = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][50334] = function(info)
if info.talentData[343240] then
local icon = info.spellIcons[6795]
if icon and icon.active then
P:ResetCooldown(icon)
end
info.auras["berserkRavage"] = true
end
if info.talentData[377779] then
local icon = info.spellIcons[22842]
if icon and icon.active then
for i = 1, (icon.maxcharges or 1) do
P:ResetCooldown(icon)
end
end
info.auras["berserkPersistence"] = true
end
if info.talentData[377623] then
info.auras["isBerserkUnchecdAggression"] = true
end
end
registeredEvents['SPELL_AURA_REMOVED'][102558] = registeredEvents['SPELL_AURA_REMOVED'][50334]
registeredEvents['SPELL_AURA_APPLIED'][102558] = registeredEvents['SPELL_AURA_APPLIED'][50334]
registeredEvents['SPELL_CAST_SUCCESS'][157982] = function(info)
if info.talentData[392162] then
for _, icon in pairs(info.spellIcons) do
if icon and icon.active and icon.isBookType and icon.spellD ~= 740 then
P:UpdateCooldown(icon, 4)
end
end
end
end
registeredEvents['SPELL_INTERRUPT'][97547] = function(info, _, spellID, _,_,_, extraSpellId, extraSpellName, _,_, destRaidFlags)
if info.talentData[202918] then
local icon = info.spellIcons[78675]
if icon and icon.active then
P:UpdateCooldown(icon, 15)
end
end
AppendInterruptExtras(info, nil, spellID, nil,nil,nil, extraSpellId, extraSpellName, nil,nil, destRaidFlags)
end
local savageMomentumIDs = {
5217,
61336,
1850,
252216,
}
registeredEvents['SPELL_INTERRUPT'][93985] = function(info, _, spellID, _,_,_, extraSpellId, extraSpellName, _,_, destRaidFlags)
if P.isPvP and info.talentData[205673] then
for i = 1, 4 do
local id = savageMomentumIDs[i]
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, 10)
end
end
end
AppendInterruptExtras(info, nil, spellID, nil,nil,nil, extraSpellId, extraSpellName, nil,nil, destRaidFlags)
end
registeredEvents['SPELL_AURA_REMOVED'][319454] = function(info, srcGUID, spellID, destGUID)
if info.auras.isHeartOfTheWild then
local icon = info.spellIcons[22842]
if icon then
local active = icon.active and info.active[22842]
if active and active.charges then
if active.charges == 0 then
active.charges = nil
icon.active = 0
else
P:ResetCooldown(icon)
end
P:SetCooldownElements(info, icon, nil)
end
icon.maxcharges = nil
icon.count:SetText("")
end
info.auras.isHeartOfTheWild = nil
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][319454] = function(info)
if info.spec ~= 104 then
local icon = info.spellIcons[22842]
if icon then
local active = icon.active and info.active[22842]
if active then
active.charges = 1
icon.active = 1
icon.count:SetText(1)
P:SetCooldownElements(info, icon, 1)
else
icon.count:SetText(2)
end
icon.maxcharges = 2
end
info.auras.isHeartOfTheWild = true
end
end
registeredEvents['SPELL_PERIODIC_HEAL'][33763] = function(info, srcGUID, _, destGUID, _,_,_,_,_, criticalHeal, _, timestamp)
if criticalHeal and srcGUID == destGUID and info.talentData[393641] then
local icon = info.spellIcons[132158]
if icon and icon.active then
if timestamp > (info.auras.time_druid4pccdr or 0) then
P:UpdateCooldown(icon, 2)
info.auras.time_druid4pccdr = timestamp + 1.5
end
end
end
end
registeredEvents['SPELL_HEAL'][33778] = registeredEvents['SPELL_PERIODIC_HEAL'][33763]
local ReduceIncarnTree_OnDelayEnd = function(srcGUID)
local info = groupInfo[srcGUID]
if info then
local icon = info.spellIcons[33891]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
end
registeredEvents['SPELL_SUMMON'][102693] = function(info, srcGUID)
if info.talentData[393371] and not CM.syncedGroupMembers[srcGUID] then
local icon = info.spellIcons[33891]
if icon then
C_Timer_After(15, function() ReduceIncarnTree_OnDelayEnd(srcGUID) end)
end
end
end
local guardianRageSpenders = {
[22842] = 10,
[192081] = 40,
[20484] = 30,
[6807] = 40,
[400254] = 40,
[441605] = 40,
}
local function ReduceGuardianIncarnationCD(info, srcGUID, spellID)
if info.talentData[393414] then
local icon = info.spellIcons[102558]
if icon and icon.active then
local rCD = guardianRageSpenders[spellID] / 25
if spellID == 22842 then
if info.talentData[441689] then
AuraUtil_ForEachAura(info.unit, "HELPFUL", nil, function(_,_,_,_,_,_,_,_,_, id)
if id == 768 then
rCD = 1.6
return true
end
end)
end
elseif spellID == 6807 or spellID == 400254 or spellID == 441605 then
if info.auras["ToothandClaw"] then
return
end
if info.auras["isBerserkUnchecdAggression"] then
rCD = rCD * .5
end
elseif spellID == 192081 then
if info.auras["berserkPersistence"] then
rCD = rCD * .5
end
if info.auras["GoryFur"] then
rCD = rCD * .75
end
end
P:UpdateCooldown(icon, rCD)
end
end
if spellID == 22842 and srcGUID == userGUID then
ForceUpdatePeriodicSync(spellID)
end
end
for id in pairs(guardianRageSpenders) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = ReduceGuardianIncarnationCD
end
registeredEvents['SPELL_AURA_APPLIED'][117679] = function(info)
info.auras.isTreeOfLife = true
end
registeredEvents['SPELL_AURA_REMOVED'][117679] = function(info, srcGUID, spellID, destGUID)
info.auras.isTreeOfLife = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_CAST_SUCCESS'][33891] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if not info.auras.isTreeOfLife then
local icon = info.spellIcons[33891]
if icon then
C_Timer_After(0.1, function()
P:StartCooldown(icon, icon.duration)
if info.talentData[434249] then
P:UpdateCooldown(icon, min(timestamp - (info.auras.time_treeOfLife or 0), 15))
info.auras.time_treeOfLife = timestamp
end
end)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][132158] = function(info, srcGUID, spellID, destGUID, _,_,_,_,_,_,_, timestamp)
if srcGUID == destGUID then
spellID = E.spell_auraremoved_cdstart_preactive[spellID]
local icon = info.spellIcons[spellID]
if icon then
local statusBar = icon.statusBar
if statusBar then
P:SetExStatusBarColor(icon, statusBar.key)
end
info.preactiveIcons[spellID] = nil
icon.icon:SetVertexColor(1, 1, 1)
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
P:StartCooldown(icon, icon.duration)
if info.talentData[434249] then
P:UpdateCooldown(icon, min(timestamp - (info.auras.time_naturesswiftness or 0), 15))
info.auras.time_naturesswiftness = timestamp
end
end
end
if E.sync_reset[spellID] then
if srcGUID == userGUID then
ForceUpdatePeriodicSync(spellID)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][391528] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if info.talentData[434249] then
local icon = info.spellIcons[391528]
if icon and icon.active then
P:UpdateCooldown(icon, min(timestamp - (info.auras.time_convoke or 0), 15))
info.auras.time_convoke = timestamp
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][194223] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if info.talentData[434249] then
local icon = info.spellIcons[194223]
if icon and icon.active then
P:UpdateCooldown(icon, min(timestamp - (info.auras.time_celestialalignment or 0), 15))
info.auras.time_celestialalignment = timestamp
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][383410] = registeredEvents['SPELL_CAST_SUCCESS'][194223]
registeredEvents['SPELL_CAST_SUCCESS'][102560] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if info.talentData[434249] then
local icon = info.spellIcons[102560]
if icon and icon.active then
P:UpdateCooldown(icon, min(timestamp - (info.auras.time_chosenofelune or 0), 15))
info.auras.time_chosenofelune = timestamp
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][390414] = registeredEvents['SPELL_CAST_SUCCESS'][102560]
registeredEvents['SPELL_CAST_SUCCESS'][205636] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if info.spec == 102 and info.talentData[434249] then
local icon = info.spellIcons[205636]
if icon and icon.active then
P:UpdateCooldown(icon, min(timestamp - (info.auras.time_forceofnature or 0), 15))
info.auras.time_forceofnature = timestamp
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][16979] = function(info)
if info.talentData[443046] then
local icon = info.spellIcons[102401]
if icon and icon.active then
P:UpdateCooldown(icon, 3)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][102383] = registeredEvents['SPELL_CAST_SUCCESS'][16979]
E.majorMovementAbilities = {
[381732] = { 48265, 444347 },
[381741] = { 195072, 189110 },
[381746] = { 1850, 252216 },
[381748] = 358267,
[381749] = 186257,
[381750] = { 1953, 212653 },
[381751] = { 109132, 115008 },
[381752] = 190784,
[381753] = 73325,
[381754] = 2983,
[381756] = { 79206, 58875, 192063 },
[381757] = 48020,
[381758] = 6544,
}
E.majorMovementAbilitiesByIDs = {}
for buffID, spellID in pairs(E.majorMovementAbilities) do
if type(spellID) == "table" then
for _, id in pairs(spellID) do
E.majorMovementAbilitiesByIDs[id] = buffID
end
else
E.majorMovementAbilitiesByIDs[spellID] = buffID
end
end
local updateCDonBronzeRemoval = {
[381732] = true,
[381741] = true,
[381748] = true,
[381750] = true,
[381751] = true,
[381752] = true,
[381753] = true,
[381758] = true,
}
registeredEvents['SPELL_AURA_REMOVED'][381748] = function(_,_, spellID, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo and destInfo.auras["blessingOfTheBronze"] then
if ( updateCDonBronzeRemoval[spellID] ) then
local id = E.majorMovementAbilities[spellID]
if type(id) == "table" then
for _, target in pairs(id) do
local icon = destInfo.spellIcons[target]
if icon and icon.active then
P:UpdateCooldown(icon, 0, 1/0.85)
end
end
else
local icon = destInfo.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, 0, 1/0.85)
end
end
end
destInfo.auras["blessingOfTheBronze"] = nil
end
end
registeredEvents['SPELL_AURA_REMOVED'][381732] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381741] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381746] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381749] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381750] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381751] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381752] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381753] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381754] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381756] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381757] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_REMOVED'][381758] = registeredEvents['SPELL_AURA_REMOVED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381748] = function(_,_, spellID, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo and not destInfo.auras["blessingOfTheBronze"] then
local id = E.majorMovementAbilities[spellID]
if type(id) == "table" then
for _, target in pairs(id) do
local icon = destInfo.spellIcons[target]
if icon and icon.active then
P:UpdateCooldown(icon, 0, 0.85)
end
end
else
local icon = destInfo.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, 0, 0.85)
end
end
destInfo.auras["blessingOfTheBronze"] = true
end
end
registeredEvents['SPELL_AURA_APPLIED'][381732] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381741] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381746] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381749] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381750] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381751] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381752] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381753] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381754] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381756] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381757] = registeredEvents['SPELL_AURA_APPLIED'][381748]
registeredEvents['SPELL_AURA_APPLIED'][381758] = registeredEvents['SPELL_AURA_APPLIED'][381748]
E.auraMultString[381748] = "blessingOfTheBronze"
E.auraMultString[381732] = "blessingOfTheBronze"
E.auraMultString[381741] = "blessingOfTheBronze"
E.auraMultString[381746] = "blessingOfTheBronze"
E.auraMultString[381749] = "blessingOfTheBronze"
E.auraMultString[381750] = "blessingOfTheBronze"
E.auraMultString[381751] = "blessingOfTheBronze"
E.auraMultString[381752] = "blessingOfTheBronze"
E.auraMultString[381753] = "blessingOfTheBronze"
E.auraMultString[381754] = "blessingOfTheBronze"
E.auraMultString[381756] = "blessingOfTheBronze"
E.auraMultString[381757] = "blessingOfTheBronze"
E.auraMultString[381758] = "blessingOfTheBronze"
registeredEvents['SPELL_AURA_REMOVED'][375234] = function(info, srcGUID, spellID, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
destInfo.auras["timeSpiral"] = nil
end
if spellID == 375234 then
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
end
registeredEvents['SPELL_AURA_REMOVED'][375226] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375229] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375230] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375238] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375240] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375252] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375253] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375254] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375255] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375256] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375257] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_REMOVED'][375258] = registeredEvents['SPELL_AURA_REMOVED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375234] = function(_,_,_, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
destInfo.auras["timeSpiral"] = true
end
end
registeredEvents['SPELL_AURA_APPLIED'][375226] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375229] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375230] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375238] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375240] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375252] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375253] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375254] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375255] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375256] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375257] = registeredEvents['SPELL_AURA_APPLIED'][375234]
registeredEvents['SPELL_AURA_APPLIED'][375258] = registeredEvents['SPELL_AURA_APPLIED'][375234]
E.auraMultString[375234] = "timeSpiral"
E.auraMultString[375226] = "timeSpiral"
E.auraMultString[375229] = "timeSpiral"
E.auraMultString[375230] = "timeSpiral"
E.auraMultString[375238] = "timeSpiral"
E.auraMultString[375240] = "timeSpiral"
E.auraMultString[375252] = "timeSpiral"
E.auraMultString[375253] = "timeSpiral"
E.auraMultString[375254] = "timeSpiral"
E.auraMultString[375255] = "timeSpiral"
E.auraMultString[375256] = "timeSpiral"
E.auraMultString[375257] = "timeSpiral"
E.auraMultString[375258] = "timeSpiral"
local empoweredSpells = {
357208,
359073,
}
registeredEvents['SPELL_PERIODIC_DAMAGE'][356995] = function(info)
if info.talentData[375777] then
for _, id in pairs(empoweredSpells) do
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, .5)
end
end
end
end
local ReduceEmpowredSpellCD_OnDelayEnd = function(srcGUID)
local info = groupInfo[srcGUID]
if info then
local reducedTime = info.auras.numhits_Pyre * 0.4
for _, id in pairs(empoweredSpells) do
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, reducedTime)
end
end
info.auras.numhits_Pyre = 0
info.callbackTimers[357212] = nil
end
end
registeredEvents['SPELL_DAMAGE'][357212] = function(info, srcGUID)
if info.talentData[375777] then
if info.active[357208] or info.active[359073] then
info.auras.numhits_Pyre = info.auras.numhits_Pyre or 0
if info.auras.numhits_Pyre <= 5 then
info.auras.numhits_Pyre = info.auras.numhits_Pyre + 1
if info.auras.numhits_Pyre == 1 then
info.callbackTimers[357212] = E.TimerAfter(0.1, ReduceEmpowredSpellCD_OnDelayEnd, srcGUID)
end
end
end
end
end
registeredEvents['SPELL_SUMMON'][368415] = function(info)
local icon = info.spellIcons[368412]
if icon then
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_AURA_APPLIED'][370818] = function(info)
info.auras["snapFire"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][370818] = function(info)
info.auras["snapFire"] = nil
end
E.auraMultString[370818] = "snapFire"
registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226] = function(info, _, spellID)
local icon = info.spellIcons[E.spell_merged[spellID] or spellID]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_EMPOWER_INTERRUPT'][382731] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][355936] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][382614] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][357208] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][382266] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][396286] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][408092] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][359073] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
registeredEvents['SPELL_EMPOWER_INTERRUPT'][382411] = registeredEvents['SPELL_EMPOWER_INTERRUPT'][367226]
local UpdateAllBars_OnDelayEnd = function() P:UpdateAllBars() end
registeredEvents['SPELL_CAST_SUCCESS'][408233] = function(info, _,_, destGUID)
info = info or groupInfo[destGUID]
if info then
C_Timer_After(0.5, UpdateAllBars_OnDelayEnd)
end
end
registeredUserEvents['SPELL_CAST_SUCCESS'][408233] = registeredEvents['SPELL_CAST_SUCCESS'][408233]
registeredEvents['SPELL_AURA_APPLIED'][385646] = function(info)
local icon = info.spellIcons[186387] or info.spellIcons[213691]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_REMOVED'][360952] = function(info, srcGUID, spellID, destGUID)
if info.talentData[389880] then
local icon = info.spellIcons[259495]
if icon and icon.active then
for i = 1, (icon.maxcharges or 1) do
P:ResetCooldown(icon)
end
end
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][459859] = function(info)
info.auras["bombardier"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][459859] = function(info)
info.auras["bombardier"] = nil
end
E.auraMultString[459859] = "bombardier"
registeredEvents['SPELL_AURA_APPLIED'][194594] = function(info)
info.auras.isLockAndLoad = true
end
local RemoveLockAndLoad_OnDelayEnd = function(srcGUID)
local info = groupInfo[srcGUID]
if info then
info.auras.isLockAndLoad = nil
end
end
registeredEvents['SPELL_AURA_REMOVED'][194594] = function(_, srcGUID)
C_Timer_After(0.1, function() RemoveLockAndLoad_OnDelayEnd(srcGUID) end)
end
registeredEvents['SPELL_AURA_APPLIED'][288613] = function(info)
info.auras.isTrueshot = true
local icon = info.spellIcons[257044]
if icon and icon.active then
P:UpdateCooldown(icon, 0, 0.3)
end
end
registeredEvents['SPELL_AURA_REMOVED'][288613] = function(info, srcGUID, spellID, destGUID)
info.auras.isTrueshot = nil
local icon = info.spellIcons[257044]
if icon and icon.active then
P:UpdateCooldown(icon, 0, 1/0.3)
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
--[[
registeredEvents['SPELL_CAST_SUCCESS'][288613] = function(info)
if info.talentData[260404] and info.spellIcons[288613] then
info.auras.usedFocus_trueshot = 0
end
end
]]
registeredEvents['SPELL_CAST_SUCCESS'][109304] = function(info)
if info.talentData[270581] and info.spellIcons[109304] then
info.auras.usedFocus_exhilaration = 0
end
end
local focusSpenders = {
[34026] = 30,
[320976] = 10,
[53351] = 10,
[2643] = 40,
[257620] = 30,
[1513] = 25,
[19434] = 35,
[195645] = 20,
[193455] = 35,
[212431] = 20,
[186270] = 30,
[265189] = 30,
[259387] = 30,
[212436] = 30,
[259495] = 10,
[269751] = 15,
[185358] = 40,
[342049] = 40,
[186387] = 10,
[392060] = 15,
[203155] = 40,
[208652] = 30,
[205691] = 60,
[982] = { [255]=10,["d"]=35 },
[120360] = { [254]=30,["d"]=60 },
[459796] = 30,
[430703] = 10,
}
local function ReduceNaturalMendingCD(info, _, spellID)
local exhilarationIcon = info.spellIcons[109304]
local naturalMendingRank = exhilarationIcon and exhilarationIcon.active and info.talentData[270581]
local trueShotIcon = info.spellIcons[288613]
local isTrueshotOnCD = trueShotIcon and trueShotIcon.active and info.talentData[260404]
if naturalMendingRank or isTrueshotOnCD then
local rCD = focusSpenders[spellID]
if type(rCD) == "table" then
rCD = rCD[info.spec] or rCD.d
end
if info.spec == 255 then
if spellID == 186270 then
if info.auras["FuriousAssault"] then
return
end
elseif spellID == 212431 then
if info.auras.bombardier then
return
end
end
elseif info.spec == 254 then
if spellID == 19434 then
if info.auras.isLockAndLoad then
return
end
if info.auras.isTrueshot and info.talentData[389449] then
rCD = rCD / 2
end
elseif spellID == 185358 or spellID == 342049 then
if info.talentData[321293] then
rCD = rCD - 20
end
if info.auras["PreciseShot"] then
rCD = rCD / (spellID == 342049 and 4 or 2)
end
elseif spellID == 257620 then
if info.auras["PreciseShot"] then
rCD = rCD / 2
end
end
if isTrueshotOnCD then
local focus = (info.auras.usedFocus_trueshot or 0) + rCD
if focus >= 50 then
P:UpdateCooldown(trueShotIcon, 2.5)
focus = focus - 50
end
info.auras.usedFocus_trueshot = focus
end
end
if naturalMendingRank then
local focus = (info.auras.usedFocus_exhilaration or 0) + rCD
if focus >= 10 then
local rem = focus%10
focus = focus - rem
P:UpdateCooldown(exhilarationIcon, focus/10)
focus = rem
end
info.auras.usedFocus_exhilaration = focus
end
end
end
for id in pairs(focusSpenders) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = ReduceNaturalMendingCD
end
registeredEvents['SPELL_DAMAGE'][203413] = function(info, _,_,_, critical, _,_,_,_,_,_, timestamp)
if critical then
local talentRank = info.talentData[385718]
if talentRank then
if timestamp > (info.auras.time_ruthlessmarauder or 0) then
local icon = info.spellIcons[269751]
if icon and icon.active then
P:UpdateCooldown(icon, reducedTime or (0.5 * talentRank))
end
info.auras.time_ruthlessmarauder = timestamp + 0.1
end
end
end
end
registeredEvents['SPELL_AURA_REMOVED_DOSE'][408518] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if P.isPvP and info.talentData[248443] then
local icon = info.spellIcons[186265]
if icon and icon.active then
if timestamp > (info.auras.time_rangersfinesse or 0) then
P:UpdateCooldown(icon, 20)
info.auras.time_rangersfinesse = timestamp + 1
end
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][19801] = function(info, srcGUID)
if info.talentData[459991] then
local icon = info.spellIcons[19801]
if icon then
info.auras.devilsaurTranquilizer = true
C_Timer_After(0.5, function()
local info = groupInfo[srcGUID]
if info then
if info.auras.devilsaurTranquilizer == 1 then
local icon = info.spellIcons[19801]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
info.auras.devilsaurTranquilizer = nil
end
end)
end
end
end
registeredEvents['SPELL_DISPEL'][19801] = function(info, _,_,_,_,_,_,_,_,_,_,_, extraSchool)
if info.auras.devilsaurTranquilizer == true then
info.auras.devilsaurTranquilizer = band(extraSchool, 1)
elseif info.auras.devilsaurTranquilizer then
info.auras.devilsaurTranquilizer = info.auras.devilsaurTranquilizer * band(extraSchool, 1)
end
end
local function ClearSrcBlackArrow_OnDurationEnd(srcGUID, spellID, destGUID)
if diedHostileGUIDS[destGUID] and diedHostileGUIDS[destGUID][srcGUID] and diedHostileGUIDS[destGUID][srcGUID][spellID] then
diedHostileGUIDS[destGUID][srcGUID][spellID] = nil
end
end
registeredEvents['SPELL_CAST_SUCCESS'][430703] = function(info, srcGUID, spellID, destGUID)
if info.talentData[430719] and info.spellIcons[spellID] then
diedHostileGUIDS[destGUID] = diedHostileGUIDS[destGUID] or {}
diedHostileGUIDS[destGUID][srcGUID] = diedHostileGUIDS[destGUID][srcGUID] or {}
diedHostileGUIDS[destGUID][srcGUID][spellID] = E.TimerAfter(18, ClearSrcBlackArrow_OnDurationEnd, srcGUID, spellID, destGUID)
end
ReduceNaturalMendingCD(info, nil, spellID)
end
registeredEvents['SPELL_DAMAGE'][450412] = function(info)
local c = info.auras.numCDR_sentinelwatch
if c then
local icon = info.spellIcons[288613] or info.spellIcons[360952]
if icon and icon.active then
P:UpdateCooldown(icon, 1)
c = c - 1
info.auras.numCDR_sentinelwatch = c > 0 and c or nil
end
end
end
registeredEvents['SPELL_AURA_REMOVED_DOSE'][450387] = function(info, _, spellID, _,_,_,_, amount)
local c = info.auras.numCDR_sentinelwatch
if c then
local icon = info.spellIcons[288613] or info.spellIcons[360952]
if icon and icon.active then
P:UpdateCooldown(icon, 1)
c = c - 1
info.auras.numCDR_sentinelwatch = c > 0 and c or nil
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][288613] = function(info, _, spellID)
if info.talentData[260404] and info.spellIcons[spellID] then
info.auras.usedFocus_trueshot = 0
end
if info.spellIcons[spellID] and info.talentData[451546] then
info.auras.numCDR_sentinelwatch = 30
end
end
registeredEvents['SPELL_CAST_SUCCESS'][360952] = function(info, _, spellID)
if info.spellIcons[spellID] and info.talentData[451546] then
info.auras.numCDR_sentinelwatch = 30
end
end
local mageLossOfControlAbilities = {
[122] = true,
[120] = true,
[157997] = true,
[113724] = true,
[31661] = true,
[383121] = true,
[389794] = true,
}
registeredEvents['SPELL_AURA_REMOVED'][263725] = function(info)
info.auras.isClearcasting = nil
end
registeredEvents['SPELL_AURA_APPLIED'][263725] = function(info)
if info.talentData[387807] then
info.auras.isClearcasting = true
end
end
registeredEvents['SPELL_CAST_SUCCESS'][5143] = function(info)
if not info.auras.isClearcasting then
return
end
for id in pairs(mageLossOfControlAbilities) do
local icon = info.spellIcons[id]
if icon and icon.active and (id ~= 120 or info.talentData[386763]) then
P:UpdateCooldown(icon, 2)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][108853] = function(info)
if info.talentData[387807] then
for id in pairs(mageLossOfControlAbilities) do
local icon = info.spellIcons[id]
if icon and icon.active and (id ~= 120 or info.talentData[386763]) then
P:UpdateCooldown(icon, 2)
end
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][319836] = registeredEvents['SPELL_CAST_SUCCESS'][108853]
local frozenDebuffs = {
[122] = true,
[386770] = true,
[157997] = true,
[82691] = true,
[228358] = true,
[228600] = true,
[33395] = true,
}
registeredEvents['SPELL_AURA_REMOVED'][44544] = function(info)
info.auras.hasFingerOfFrost = nil
end
registeredEvents['SPELL_AURA_APPLIED'][44544] = function(info)
info.auras.hasFingerOfFrost = true
end
registeredEvents['SPELL_CAST_SUCCESS'][30455] = function(info, _,_, destGUID)
if info.talentData[387807] then
if info.auras.hasFingerOfFrost then
for id in pairs(mageLossOfControlAbilities) do
local icon = info.spellIcons[id]
if icon and icon.active and (id ~= 120 or (info.talentData[386763] and not info.talentData[417493])) then
P:UpdateCooldown(icon, 2)
end
end
else
local unit = UnitTokenFromGUID(destGUID)
if unit then
AuraUtil_ForEachAura(unit, "HARMFUL", nil, function(_,_,_,_,_,_,_,_,_, id)
if frozenDebuffs[id] then
for id in pairs(mageLossOfControlAbilities) do
local icon = info.spellIcons[id]
if icon and icon.active and (id ~= 120 or (info.talentData[386763] and not info.talentData[417493])) then
P:UpdateCooldown(icon, 2)
end
end
return true
end
end)
end
end
end
end
local fireMageDirectDamageIDs = {
133,
11366,
319836,
108853,
2948,
}
local function ReduceDirectDamageCD(info, _, spellID, _, critical, _,_,_,_,_,_, timestamp)
local icon = info.spellIcons[190319]
if icon and icon.active then
local cdr = 0
if critical and info.talentData[155148] then
cdr = cdr + 1
end
if info.auras.isCombustion and info.talentData[416506] then
cdr = cdr + 1.25
end
if cdr > 0 then
P:UpdateCooldown(icon, cdr)
end
end
if info.talentData[342344] then
icon = info.spellIcons[257541]
if icon and icon.active then
if timestamp > (info.auras.time_phoenixflames or 0) then
P:UpdateCooldown(icon, 1)
info.auras.time_phoenixflames = timestamp + 0.1
end
end
end
end
for _, id in pairs(fireMageDirectDamageIDs) do
registeredEvents['SPELL_DAMAGE'][id] = ReduceDirectDamageCD
end
--[[
registeredEvents['SPELL_CAST_SUCCESS'][257541] = function(info, _,_, destGUID)
info.auras.phoenixFlameTargetGUID = destGUID
end
]]
registeredEvents['SPELL_DAMAGE'][257542] = function(info, _,_, destGUID, critical)
if destGUID == info.auras.phoenixFlameTargetGUID then
local icon = info.spellIcons[190319]
if icon and icon.active then
local cdr
if critical and info.talentData[155148] then
cdr = 1
end
if info.auras.isCombustion and info.talentData[416506] then
cdr = (cdr or 0) + 1.25
end
if cdr then
P:UpdateCooldown(icon, cdr)
end
end
info.auras.phoenixFlameTargetGUID = nil
end
end
registeredEvents['SPELL_CAST_SUCCESS'][2120] = function(info)
info.auras.numHits_flamestrike = 0
end
registeredEvents['SPELL_DAMAGE'][2120] = function(info, _,_,_, critical)
if critical then
local icon = info.spellIcons[190319]
if icon and icon.active and info.auras.numHits_flamestrike <= 5 then
local cdr
if info.talentData[155148] then
cdr = 0.2
end
if info.auras.isCombustion and info.talentData[416506] then
cdr = (cdr or 0) + 0.25
end
if cdr then
P:UpdateCooldown(icon, cdr)
end
info.auras.numHits_flamestrike = info.auras.numHits_flamestrike + 1
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][190319] = function(info) info.auras.isCombustion = true end
registeredEvents['SPELL_AURA_REMOVED'][190319] = function(info) info.auras.isCombustion = nil end
registeredEvents['SPELL_CAST_SUCCESS'][382445] = function(info)
for id in pairs(info.active) do
local icon = info.spellIcons[id]
if icon and icon.active and icon.isBookType and id ~= 382440 and (id ~= 120 or not info.talentData[417493]) then
P:UpdateCooldown(icon, 3)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][342246] = function(info, srcGUID, spellID, destGUID)
if info.talentData[342249] then
local icon = info.spellIcons[1953] or info.spellIcons[212653]
if icon and icon.active then
P:ResetCooldown(icon)
local talentRank = info.talentData[382268]
if talentRank then
P:UpdateCooldown(icon, 2 * talentRank)
end
end
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_INTERRUPT'][2139] = function(info, _, spellID, _,_,_, extraSpellId, extraSpellName, _,_, destRaidFlags)
if info.talentData[382297] then
local icon = info.spellIcons[spellID]
if icon and icon.active then
P:UpdateCooldown(icon, 4)
end
end
AppendInterruptExtras(info, nil, spellID, nil,nil,nil, extraSpellId, extraSpellName, nil,nil, destRaidFlags)
end
registeredEvents['SPELL_CAST_SUCCESS'][2139] = function(info, _, spellID, destGUID)
if info.talentData[382297] then
local icon = info.spellIcons[spellID]
if icon and icon.active then
local unit = UnitTokenFromGUID(destGUID)
if unit then
local _,_,_,_,_,_, notInterruptable, channelID = UnitChannelInfo(unit)
if notInterruptable ~= false then
return
end
if channelID == 47758 then
P:UpdateCooldown(icon, 4)
end
end
end
end
end
registeredEvents['SPELL_DAMAGE'][190357] = function(info)
if info.talentData[236662] then
local icon = info.spellIcons[84714]
if icon and icon.active then
P:UpdateCooldown(icon, .5)
end
end
end
local reduceBlinkCD = function(srcGUID)
local info = groupInfo[srcGUID]
if info and info.auras.numEtherealBlinkSlow then
local icon = info.spellIcons[1953] or info.spellIcons[212653]
if icon and icon.active and info.auras.numEtherealBlinkSlow > 0 then
P:UpdateCooldown(icon, min(5, info.auras.numEtherealBlinkSlow))
end
info.auras.numEtherealBlinkSlow = nil
end
end
registeredEvents['SPELL_CAST_SUCCESS'][1953] = function(info, srcGUID)
if P.isPvP and info.talentData[410939] and (info.spellIcons[1953] or info.spellIcons[212653]) then
info.auras.numEtherealBlinkSlow = 0
C_Timer_After(0.3, function() reduceBlinkCD(srcGUID) end)
end
end
registeredEvents['SPELL_CAST_SUCCESS'][212653] = registeredEvents['SPELL_CAST_SUCCESS'][1953]
registeredEvents['SPELL_AURA_APPLIED'][31589] = function(info)
if info.auras.numEtherealBlinkSlow then
info.auras.numEtherealBlinkSlow = info.auras.numEtherealBlinkSlow + 1
end
end
registeredEvents['SPELL_AURA_REFRESH'][31589] = registeredEvents['SPELL_AURA_APPLIED'][31589]
registeredEvents['SPELL_MISSED'][31589] = registeredEvents['SPELL_AURA_APPLIED'][31589]
registeredEvents['SPELL_CAST_SUCCESS'][120] = function(info)
if info.talentData[417493] then
info.auras.numHits_coneOfCold = 0
end
end
registeredEvents['SPELL_DAMAGE'][120] = function(info)
if info.talentData[417493] then
info.auras.numHits_coneOfCold = (info.auras.numHits_coneOfCold or 0) + 1
if info.auras.numHits_coneOfCold == 3 then
local icon = info.spellIcons[153595]
if icon and icon.active then
P:ResetCooldown(icon)
end
icon = info.spellIcons[84714]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][438611] = function(info)
info.auras.excessFrost = true
end
registeredEvents['SPELL_CAST_SUCCESS'][44614] = function(info)
if info.auras.excessFrost then
local icon = info.spellIcons[153595]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][257541] = function(info, _,_, destGUID)
if info.auras.excessFrost then
local icon = info.spellIcons[153561]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
info.auras.phoenixFlameTargetGUID = destGUID
end
registeredEvents['SPELL_AURA_REMOVED'][438611] = function(info)
info.auras.excessFrost = nil
end
registeredEvents['SPELL_AURA_APPLIED'][190446] = function(info)
local icon = info.spellIcons[44614]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_APPLIED'][458411] = function(info)
local icon = info.spellIcons[84714]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
if E.DF then
local fireMageFrostSpellIDs = {
120,
122,
113724,
157997,
}
registeredEvents['SPELL_AURA_APPLIED'][87023] = function(info)
for _, id in pairs(fireMageFrostSpellIDs) do
local icon = info.spellIcons[id]
if icon and icon.active then
P:ResetCooldown(icon)
if id == 122 and info.talentData[205036] then
P:ResetCooldown(icon)
end
end
end
end
end
local monkBrews = {
115203,
322507,
119582,
115399,
}
registeredEvents['SWING_DAMAGE']['MONK'] = function(info, _,_, destGUID)
if info.talentData[418359] then
local rt = info.auras.bonedustTargetGUID and info.auras.bonedustTargetGUID[destGUID] and 1.5 or 0.5
for i = 1, 5 do
local id = monkBrews[i]
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, rt)
end
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][228563] = function(info)
info.auras.isBlackoutCombo = true
end
registeredEvents['SPELL_AURA_REMOVED'][228563] = function(info)
info.auras.isBlackoutCombo = nil
end
registeredEvents['SPELL_AURA_REMOVED'][387184] = function(info, srcGUID, spellID, destGUID)
info.auras["isWeaponsOfOrder"] = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][387184] = function(info)
info.auras["isWeaponsOfOrder"] = true
end
registeredEvents['SPELL_AURA_APPLIED'][393786] = function(info)
local active = info.active[387184]
if active then
active.numHits = (active.numHits or 0) + 1
if active.numHits <= 5 then
local icon = info.spellIcons[387184]
if icon and icon.active then
P:UpdateCooldown(icon, 4)
end
end
end
end
local stunDebuffs = {
108194,
221562,
91800,
91797,
287254,
210141,
377048,
179057,
211881,
205630,
208618,
200166,
213491,
5211,
203123,
163505,
202244,
372245,
24394,
357021,
389831,
119381,
202346,
853,
255941,
385149,
64044,
200200,
408,
1833,
305485,
118905,
77505,
118345,
30283,
89766,
22703,
213688,
171017,
171018,
385954,
46968,
132168,
132169,
199085,
20549,
255723,
287712,
}
for _, id in pairs(stunDebuffs) do
registeredHostileEvents['SPELL_AURA_APPLIED'][id] = function(destInfo)
if P.isPvP and destInfo.talentData[353584] and destInfo.spellIcons[119996] then
local c = destInfo.auras.isStunned
c = c and c + 1 or 1
destInfo.auras.isStunned = c
end
end
registeredHostileEvents['SPELL_AURA_REMOVED'][id] = function(destInfo)
local c = destInfo.auras.isStunned
if c then
destInfo.auras.isStunned = max(c - 1, 0)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][119996] = function(info, _, spellID)
local icon = info.spellIcons[spellID]
if icon and not info.auras.isEscapeFromReality then
P:StartCooldown(icon, P.isPvP and info.talentData[353584] and (not info.auras.isStunned or info.auras.isStunned < 1) and icon.duration - 15 or icon.duration )
end
end
registeredEvents['SPELL_AURA_REMOVED'][394112] = function(info)
if info and info.auras.isEscapeFromReality then
info.auras.isEscapeFromReality = nil
local icon = info.spellIcons[119996]
if icon and not icon.active then
P:StartCooldown(icon, 35)
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][394112] = function(info)
if info.spellIcons[119996] then
info.auras.isEscapeFromReality = true
end
end
registeredEvents['SPELL_HEAL'][191894] = function(info)
if info.talentData[388031] then
local icon = info.spellIcons[322118] or info.spellIcons[325197]
if icon and icon.active then
P:UpdateCooldown(icon, .5)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][393099] = function(info)
info.auras.isForbiddenTechnique = nil
local icon = info.spellIcons[322109]
if icon then
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_AURA_APPLIED'][393099] = function(info)
info.auras.isForbiddenTechnique = true
end
registeredEvents['SPELL_CAST_SUCCESS'][322109] = function(info)
local icon = info.spellIcons[322109]
if icon and not info.auras.isForbiddenTechnique then
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_DAMAGE'][322109] = function(info, _,_,_,_, destFlags, _, overkill)
if overkill > -1 and P:IsTalentForPvpStatus(345829, info) and band(destFlags, COMBATLOG_OBJECT_TYPE_PLAYER) > 0 then
local icon = info.spellIcons[122470]
if icon and icon.active then
P:UpdateCooldown(icon, 60)
end
end
end
local function ReduceBrewCD(destInfo, _,_, missType, _,_, timestamp)
local talentRank = destInfo.talentData[386937]
if talentRank and (missType == "DODGE" or missType == "MISS" ) then
local talentValue = talentRank == 2 and 1 or .5
for i = 1, 5 do
local id = monkBrews[i]
local icon = destInfo.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, talentValue)
end
end
end
end
registeredHostileEvents['SWING_MISSED']['MONK'] = function(destInfo,_,spellID,_,_,_,timestamp) ReduceBrewCD(destInfo,nil,nil,spellID,nil,nil,timestamp) end
registeredHostileEvents['RANGE_MISSED']['MONK'] = ReduceBrewCD
registeredHostileEvents['SPELL_MISSED']['MONK'] = ReduceBrewCD
registeredEvents['SPELL_AURA_APPLIED'][388203] = function(info)
local icon = info.spellIcons[388193]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_APPLIED'][137639] = function(info)
info.auras.isSEF = true
if info.talentData[451463] then
info.auras.isSEFwithOrderedElements = true
end
end
registeredEvents['SPELL_AURA_REMOVED'][137639] = function(info, srcGUID, spellID, destGUID)
info.auras.isSEF = nil
info.auras.isSEFwithOrderedElements = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
local wwChiSpenders = {
[113656] = 3,
[392983] = 2,
[116847] = 1,
[107428] = 2,
[100784] = 1,
[101546] = 2,
}
local function ReduceSEFSerenityCD(info, _, spellID)
if info.talentData[280197] then
local icon = info.spellIcons[137639]
if icon and icon.active then
local e = wwChiSpenders[spellID]
if info.auras["OrderedElements"] then
e = e - 1
end
e = (info.auras.spentChi_spiritualFocus or 0) + e
if e >= 2 then
local rem = e%2
P:UpdateCooldown(icon, (e-rem)/4)
e = rem
end
info.auras.spentChi_spiritualFocus = e
end
end
end
for id in pairs(wwChiSpenders) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = ReduceSEFSerenityCD
end
registeredEvents['SPELL_AURA_REMOVED'][116680] = function(info, srcGUID, spellID, destGUID)
info.auras["thunderousFocusTeaPVP"] = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][116680] = function(info)
if P.isPvP and info.talentData[353936] then
info.auras["thunderousFocusTeaPVP"] = true
end
end
E.auraMultString[116680] = "thunderousFocusTeaPVP"
registeredEvents['SPELL_HEAL'][116670] = function(info, _,_,_,_,_,_,_,_, criticalHeal)
if info.talentData[388551] and criticalHeal then
local icon = info.spellIcons[115310] or info.spellIcons[388615]
if icon and icon.active then
P:UpdateCooldown(icon, 1)
end
end
end
registeredEvents['SPELL_DAMAGE'][185099] = function(info, _,_,_, critical)
if info.talentData[388551] then
local icon = info.spellIcons[115310] or info.spellIcons[388615]
if icon and icon.active then
P:UpdateCooldown(icon, 1)
end
end
if critical then
if info.talentData[392993] then
local icon = info.spellIcons[113656]
if icon and icon.active then
P:UpdateCooldown(icon, 4)
end
end
end
end
registeredEvents['SPELL_DAMAGE'][121253] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
local talentRank = info.talentData[387219]
if talentRank then
local icon = info.spellIcons[132578]
if icon and icon.active then
if timestamp > (info.auras.time_shuffle or 0) then
P:UpdateCooldown(icon, .25 * talentRank)
info.auras.time_shuffle = timestamp + .1
end
end
end
end
registeredEvents['SPELL_DAMAGE'][107270] = registeredEvents['SPELL_DAMAGE'][121253]
registeredEvents['SPELL_DAMAGE'][205523] = registeredEvents['SPELL_DAMAGE'][121253]
local bmEnergySpenders = {
[117952] = 20,
[116095] = 15,
[322101] = 15,
[115078] = 20,
[322729] = 25,
[100780] = 25,
[116670] = 30,
[121253] = 40,
[115175] = 15,
[218164] = 10,
}
local wwEnergySpenders = {
[117952] = 20,
[116095] = 15,
[115078] = 20,
[100780] = 60,
[116670] = 30,
[115175] = 15,
[218164] = 10,
}
registeredEvents['SPELL_CAST_SUCCESS'][387184] = function(info)
info.auras.usedenergy_woosef = 0
end
registeredEvents['SPELL_CAST_SUCCESS'][137639] = registeredEvents['SPELL_CAST_SUCCESS'][387184]
local function ReduceWoOSEFCD(info, _, spellID)
if info.talentData[450989] then
if info.spec == 268 then
local icon = info.spellIcons[387184]
if icon and icon.active then
local e = bmEnergySpenders[spellID]
if spellID == 116670 and info.auras["VivaciousVivification"] then
e = e/4
end
e = (info.auras.usedenergy_woosef or 0) + e
if e >= 50 then
local rem = e%50
e = e - rem
P:UpdateCooldown(icon, e/50)
e = rem
end
info.auras.usedenergy_woosef = e
end
elseif info.spec == 269 then
local icon = info.spellIcons[137639]
if icon and icon.active then
local e = wwEnergySpenders[spellID]
if spellID == 100780 then
if info.talentData[397768] then
e = e - 5
end
elseif spellID == 117952 then
if info.auras["TheEmperorsCapacitor"] then
e = e * (1 - .05 * info.auras["TheEmperorsCapacitor"])
end
elseif spellID == 116670 then
if info.auras["VivaciousVivification"] then
e = e/4
end
end
e = (info.auras.usedenergy_woosef or 0) + e
if e >= 50 then
local rem = e%50
e = e - rem
P:UpdateCooldown(icon, e/50)
e = rem
end
info.auras.usedenergy_woosef = e
end
end
end
end
for id in pairs(bmEnergySpenders) do
if ( id == 115175 ) then
registeredEvents['SPELL_PERIODIC_HEAL'][115175] = ReduceWoOSEFCD
elseif ( id == 117952 ) then
registeredEvents['SPELL_PERIODIC_DAMAGE'][117952] = ReduceWoOSEFCD
else
registeredEvents['SPELL_CAST_SUCCESS'][id] = ReduceWoOSEFCD
end
end
registeredEvents['SPELL_INTERRUPT'][116705] = function(info, _, spellID, _,_,_, extraSpellId, extraSpellName, _,_, destRaidFlags)
if info.talentData[450631] then
local icon = info.spellIcons[115078]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
AppendInterruptExtras(info, nil, spellID, nil,nil,nil, extraSpellId, extraSpellName, nil,nil, destRaidFlags)
end
registeredEvents['SPELL_HEAL'][633] = function(info, _,_, destGUID, _,_, amount, overhealing)
local icon = info.spellIcons[633]
if icon then
P:StartCooldown(icon, icon.duration)
if info.talentData[326734] then
local unit = UnitTokenFromGUID(destGUID)
if unit then
local maxHP = UnitHealthMax(unit)
if maxHP > 0 then
local actualhealing = amount - overhealing
local reducedMult = min(actualhealing / maxHP * 6/7, 0.6)
if reducedMult > 0 then
if icon.active then
P:UpdateCooldown(icon, icon.duration * reducedMult)
end
end
end
end
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][327193] = function(info, srcGUID, spellID, destGUID)
info.auras["momentOfGlory"] = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][327193] = function(info)
local icon = info.spellIcons[31935]
if icon then
if icon.active then
P:ResetCooldown(icon)
end
info.auras["momentOfGlory"] = true
end
end
E.auraMultString[327193] = "momentOfGlory"
registeredEvents['SPELL_CAST_SUCCESS'][31935] = function(info)
local icon = info.spellIcons[31935]
if icon then
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_AURA_APPLIED'][383329] = function(info)
local icon = info.spellIcons[24275]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_APPLIED'][383283] = function(info)
local icon = info.spellIcons[255937]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_APPLIED'][85416] = function(info)
local icon = info.spellIcons[31935]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
local function RemoveHandOfHindrance_OnDurationEnd(srcGUID)
local info = groupInfo[srcGUID]
if info and info.callbackTimers[183218] then
info.callbackTimers[183218] = nil
end
end
registeredEvents['SPELL_AURA_REMOVED'][183218] = function(info, _, spellID)
if info.callbackTimers[spellID] then
local icon = info.spellIcons[spellID]
if icon and icon.active then
P:UpdateCooldown(icon, 15)
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][183218] = function(info, srcGUID, spellID)
if P.isPvP then
info.callbackTimers[spellID] = E.TimerAfter(9.95, RemoveHandOfHindrance_OnDurationEnd, srcGUID)
end
end
local forbearanceIDs = E.isBCC and {
[1022] = 0,
[5599] = 0,
[10278] = 0,
[498] = 60,
[5573] = 60,
[642] = 60,
[1020] = 60,
[31884] = 60,
} or (E.isWOTLKC and {
[1022] = 0,
[633] = 0,
[498] = 120,
[642] = 120,
[31884] = 30,
}) or (E.isCata and {
[1022] = 0,
[642] = 60,
[633] = 0,
}) or {
[1022] = 0,
[204018] = 0,
[642] = 30,
[633] = 0,
}
registeredEvents['SPELL_AURA_REMOVED'][25771] = function(_,_,_, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
if destInfo.auras.isForbearanceOnUsableShown then
for id in pairs(forbearanceIDs) do
local icon = destInfo.preactiveIcons[id]
if icon then
icon.icon:SetVertexColor(1, 1, 1)
destInfo.preactiveIcons[id] = nil
end
end
destInfo.auras.isForbearanceOnUsableShown = nil
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][25771] = function(_,_,_, destGUID)
if ( E.db.icons.showForbearanceCounter ) then
local destInfo = groupInfo[destGUID]
if destInfo then
for id in pairs(forbearanceIDs) do
local icon = destInfo.spellIcons[id]
if icon then
if ( not icon.isHighlighted ) then
icon.icon:SetVertexColor(0.4, 0.4, 0.4)
end
destInfo.preactiveIcons[id] = icon
destInfo.auras.isForbearanceOnUsableShown = true
end
end
end
end
end
registeredUserEvents['SPELL_AURA_APPLIED'][25771] = registeredEvents['SPELL_AURA_APPLIED'][25771]
registeredUserEvents['SPELL_AURA_REMOVED'][25771] = registeredEvents['SPELL_AURA_REMOVED'][25771]
local holyPowerSpenders = {
85673,
156322,
427453,
53600,
391054,
85222,
415091,
2812,
85256,
383328,
215661,
53385,
343527,
384052
}
local righteousProtectorTargetIDs = {
31884,
389539,
86659,
228049
}
local function HolyPowerSpenderCDR(info, _, spellID, _,_,_,_,_,_,_,_, timestamp)
if spellID == 391054 and info.spec ~= 66 then
return
end
local HP = spellID == 427453 and 5 or 3
local talentRank = info.talentData[234299]
if talentRank then
if timestamp > (info.auras.time_FoJ or 0) then
local icon = info.spellIcons[853]
if icon and icon.active then
P:UpdateCooldown(icon, HP * talentRank)
end
info.auras.time_FoJ = timestamp + 1
end
end
if info.talentData[414720] and spellID ~= 2812 then
local icon = info.spellIcons[633]
if icon and icon.active then
P:UpdateCooldown(icon, HP * 1.5)
end
return
end
if info.spec ~= 66 then return end
HP = 3
talentRank = info.talentData[385422]
if talentRank then
local icon = info.spellIcons[642]
if icon and icon.active then
P:UpdateCooldown(icon, HP/3 * talentRank)
end
icon = info.spellIcons[31850]
if icon and icon.active then
P:UpdateCooldown(icon, HP/3 * talentRank)
end
end
if spellID == 427453 then return end
if info.talentData[392928] then
local icon = info.spellIcons[633]
if icon and icon.active then
P:UpdateCooldown(icon, HP)
end
end
if info.talentData[204074] then
for _, id in pairs(righteousProtectorTargetIDs) do
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, P.isPvP and 1.0 or 1.5)
end
end
end
end
for _, id in pairs(holyPowerSpenders) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = HolyPowerSpenderCDR
end
registeredEvents['SPELL_DAMAGE'][31935] = function(info)
local talentRank = info.talentData[378279]
if talentRank then
local icon = info.spellIcons[86659] or info.spellIcons[228049]
if icon and icon.active then
P:UpdateCooldown(icon, 0.5 * talentRank)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][432496] = function(info, srcGUID, _, destGUID)
if srcGUID == destGUID then
local icon = info.spellIcons[633]
if icon and icon.active then
P:UpdateCooldown(icon, 15)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][432502] = registeredEvents['SPELL_AURA_REMOVED'][432496]
registeredEvents['SPELL_AURA_REFRESH'][432496] = registeredEvents['SPELL_AURA_REMOVED'][432496]
registeredEvents['SPELL_AURA_REFRESH'][432502] = registeredEvents['SPELL_AURA_REMOVED'][432496]
registeredEvents['SPELL_AURA_REMOVED'][54149] = function(info)
info.auras["hasInfusionOfLight"] = nil
end
registeredEvents['SPELL_AURA_APPLIED'][54149] = function(info)
info.auras["hasInfusionOfLight"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][200183] = function(info, srcGUID, spellID, destGUID)
info.auras.isApotheosisActive = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][200183] = function(info)
info.auras.isApotheosisActive = true
end
registeredEvents['SPELL_CAST_SUCCESS'][32379] = function(info, _,_, destGUID, _,_,_,_,_,_,_, timestamp)
if info.talentData[321291] and info.spellIcons[32379] then
if timestamp > (info.auras.time_shadowworddeath_reset or 0) then
local unit = UnitTokenFromGUID(destGUID)
if unit then
local maxHP = UnitHealthMax(unit)
if maxHP > 0 then
info.auras.isDeathTargetUnder20 = UnitHealth(unit) / maxHP <= .2
end
end
end
end
end
registeredEvents['SPELL_DAMAGE'][32379] = function(info, _,_,_,_,_,_, overkill, _,_,_, timestamp)
if info.talentData[321291] then
if overkill == -1 and info.auras.isDeathTargetUnder20 then
local icon = info.spellIcons[32379]
if icon and icon.active then
P:ResetCooldown(icon)
end
info.auras.time_shadowworddeath_reset = timestamp + 10
end
info.auras.isDeathTargetUnder20 = nil
end
end
registeredEvents['SPELL_AURA_APPLIED'][392511] = function(info)
--[[
local icon = info.spellIcons[32379]
if icon and icon.active then
P:ResetCooldown(icon)
end
]]
info.auras["deathSpeaker"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][392511] = function(info)
info.auras["deathSpeaker"] = nil
end
E.auraMultString[392511] = "deathSpeaker"
local onGSRemoval = function(srcGUID, spellID, destGUID)
local info = groupInfo[srcGUID]
if info then
if info.auras.isSavedByGS then
info.auras.isSavedByGS = nil
else
local icon = info.spellIcons[47788]
if icon and info.talentData[200209] or info.talentData[63231] then
P:StartCooldown(icon, 60)
end
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
end
registeredEvents['SPELL_AURA_REMOVED'][47788] = function(info, srcGUID, spellID, destGUID)
local icon = info.spellIcons[47788]
if icon then
C_Timer_After(0.1, function() onGSRemoval(srcGUID, spellID, destGUID) end)
end
end
registeredEvents['SPELL_HEAL'][48153] = function(info)
if info.spellIcons[47788] then
info.auras.isSavedByGS = true
end
end
registeredEvents['SPELL_AURA_REMOVED'][194249] = function(info, srcGUID, spellID, destGUID)
if info.callbackTimers.isVoidForm then
if srcGUID ~= userGUID then
info.callbackTimers.isVoidForm:Cancel()
end
info.callbackTimers.isVoidForm = nil
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_REMOVED'][391109] = registeredEvents['SPELL_AURA_REMOVED'][194249]
local removeVoidForm
removeVoidForm = function(srcGUID, spellID, destGUID)
local info = groupInfo[srcGUID]
if info and info.callbackTimers.isVoidForm then
local duration, expTime = P:GetBuffDuration(info.unit, spellID)
if duration and duration > 0 then
duration = expTime - GetTime()
if duration > 0 then
info.callbackTimers.isVoidForm = C_Timer_NewTimer(duration + 1, function() removeVoidForm(srcGUID, spellID, destGUID) end)
end
return
end
info.callbackTimers.isVoidForm = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
end
registeredEvents['SPELL_AURA_APPLIED'][194249] = function(info, srcGUID, spellID, destGUID)
if P.isPvP and info.talentData[199259] and info.spellIcons[228260] then
info.auras.isPvpAndDrivenToMadness = true
info.callbackTimers.isVoidForm = srcGUID == userGUID or C_Timer_NewTimer(20.1, function() removeVoidForm(srcGUID, spellID, destGUID) end)
else
info.auras.isPvpAndDrivenToMadness = nil
end
end
registeredEvents['SPELL_AURA_APPLIED'][391109] = function(info, srcGUID, spellID, destGUID)
if P.isPvP and info.talentData[199259] and info.spellIcons[391109] then
info.auras.isPvpAndDrivenToMadness = true
info.callbackTimers.isVoidForm = srcGUID == userGUID or C_Timer_NewTimer(20.1, function() removeVoidForm(srcGUID, spellID, destGUID) end)
else
info.auras.isPvpAndDrivenToMadness = nil
end
end
local function ReduceVoidEruptionCD(destInfo, _,_,_,_,_, timestamp, _,_, missType)
if missType and missType ~= "ABSORB" then
return
end
if destInfo.auras.isPvpAndDrivenToMadness and not destInfo.callbackTimers.isVoidForm then
local icon = destInfo.spellIcons[228260] or destInfo.spellIcons[391109]
if icon and icon.active then
if timestamp > (destInfo.auras.time_driventomadness or 0) then
P:UpdateCooldown(icon, 3)
destInfo.auras.time_driventomadness = timestamp + 1
end
end
end
end
registeredHostileEvents['SWING_DAMAGE']['PRIEST'] = ReduceVoidEruptionCD
registeredHostileEvents['RANGE_DAMAGE']['PRIEST'] = ReduceVoidEruptionCD
registeredHostileEvents['SPELL_DAMAGE']['PRIEST'] = ReduceVoidEruptionCD
registeredHostileEvents['SWING_MISSED']['PRIEST'] = function(destInfo,_,missType,_,_,_,timestamp) ReduceVoidEruptionCD(destInfo,nil,nil,nil,nil,nil,timestamp,nil,nil,missType) end
registeredHostileEvents['RANGE_MISSED']['PRIEST'] = function(destInfo,_,_,missType,_,_,timestamp) ReduceVoidEruptionCD(destInfo,nil,nil,nil,nil,nil,timestamp,nil,nil,missType) end
registeredHostileEvents['SPELL_MISSED']['PRIEST'] = registeredHostileEvents['RANGE_MISSED']['PRIEST']
registeredEvents['SPELL_AURA_APPLIED'][322431] = function(info)
local icon = info.spellIcons[316262]
if icon then
local statusBar = icon.statusBar
if icon.active then
if statusBar then
P.OmniCDCastingBarFrame_OnEvent(statusBar.CastingBar, 'UNIT_SPELLCAST_STOP')
end
icon.cooldown:Clear()
end
if statusBar then
statusBar.BG:SetVertexColor(0.7, 0.7, 0.7)
end
info.preactiveIcons[316262] = icon
if not icon.isHighlighted then
icon.icon:SetVertexColor(0.4, 0.4, 0.4)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][322431] = function(info)
local icon = info.spellIcons[316262]
if icon then
local statusBar = icon.statusBar
if statusBar then
P:SetExStatusBarColor(icon, statusBar.key)
end
info.preactiveIcons[316262] = nil
icon.icon:SetVertexColor(1, 1, 1)
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_DAMAGE'][47666] = function(info)
local talentRank = info.talentData[421558]
if ( talentRank ) then
local icon = info.spellIcons[421453]
if ( icon and icon.active ) then
P:UpdateCooldown(icon, talentRank)
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][372760] = function(info, srcGUID, spellID, destGUID)
info.auras.hasDivineWord = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
registeredEvents['SPELL_AURA_APPLIED'][372760] = function(info)
info.auras.hasDivineWord = true
end
registeredEvents['SPELL_AURA_APPLIED'][375981] = function(info)
local icon = info.spellIcons[8092]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_APPLIED'][458650] = function(info)
info.auras["saveTheDay"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][458650] = function(info)
info.auras["saveTheDay"] = nil
end
E.auraMultString[458650] = "saveTheDay"
registeredEvents['SPELL_AURA_APPLIED'][428933] = function(info)
info.auras.premonitionOfInsight = true
end
registeredEvents['SPELL_AURA_REMOVED'][428933] = function(info, srcGUID, spellID, destGUID)
info.auras.premonitionOfInsight = nil
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
E.auraMultString[428933] = "premonitionOfInsight"
registeredEvents['SPELL_AURA_APPLIED'][114255] = function(info)
info.auras.surgeOfLight = true
end
registeredEvents['SPELL_AURA_REMOVED'][114255] = function(info)
info.auras.surgeOfLight = nil
end
registeredEvents['SPELL_HEAL'][2061] = function(info, _,_,_,_,_, amount, _,_, critical, _, ts)
if info.talentData[453828] and info.auras.surgeOfLight then
local icon = info.spellIcons[34861]
if icon and icon.active then
P:UpdateCooldown(icon, 4)
end
end
if info.talentData[453678] then
local icon = info.spellIcons[2050]
if icon and icon.active then
amount = critical and amount / (P.isPvP and 1.5 or 2) or amount
if ts - (info.auras.time_flashHeal or 0) < 0.3 and amount / (info.auras.lastFlashHealAmount or 0) < .5 then
P:UpdateCooldown(icon, GetHolyWordReducedTime(info, 6 * (P.isPvP and .175 or .35)))
end
info.auras.time_flashHeal = ts
info.auras.lastFlashHealAmount = amount
end
end
end
registeredEvents['SPELL_HEAL'][596] = function(info, srcGUID, _, destGUID, _,_, amount, _,_, critical, _, ts)
if info.talentData[453678] and srcGUID == destGUID then
local icon = info.spellIcons[34861]
if icon and icon.active then
amount = critical and amount / (P.isPvP and 1.5 or 2) or amount
if ts - (info.auras.time_prayerHeal or 0) < 0.3 and amount / (info.auras.lastPrayerhHealAmount or 0) < .5 then
P:UpdateCooldown(icon, GetHolyWordReducedTime(info, 6 * (P.isPvP and .175 or .35)))
end
info.auras.time_prayerHeal = ts
info.auras.lastPrayerhHealAmount = amount
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][36554] = function(info, _, spellID, destGUID, _, destFlags)
local icon = info.spellIcons[spellID]
if icon and icon.active then
if info.talentData[197899] then
if P.isPvP and band(destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 then
P:UpdateCooldown(icon, icon.duration * .67)
end
elseif info.talentData[381630] then
local unit = UnitTokenFromGUID(destGUID)
if unit then
if P:GetDebuffDuration(unit, 703) then
P:UpdateCooldown(icon, icon.duration * .33)
end
end
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][57934] = function(info, srcGUID, spellID, destGUID)
local icon = info.spellIcons[spellID] or info.spellIcons[221622]
if icon then
local statusBar = icon.statusBar
if statusBar then
P:SetExStatusBarColor(icon, statusBar.key)
end
info.preactiveIcons[spellID] = nil
icon.icon:SetVertexColor(1, 1, 1)
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
end
local function StartTricksCD(info, srcGUID, spellID, destGUID)
local icon = info.spellIcons[57934]
if icon and srcGUID == destGUID then
local statusBar = icon.statusBar
if statusBar then
P:SetExStatusBarColor(icon, statusBar.key)
end
info.preactiveIcons[57934] = nil
icon.icon:SetVertexColor(1, 1, 1)
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_AURA_APPLIED'][59628] = StartTricksCD
registeredEvents['SPELL_AURA_APPLIED'][221630] = StartTricksCD
registeredEvents['SPELL_AURA_APPLIED'][375939] = function(info)
info.auras.targetLastedSepsisFullDuration = true
end
registeredEvents['SPELL_AURA_REMOVED'][385408] = function(info)
if not info.auras.targetLastedSepsisFullDuration then
local icon = info.spellIcons[385408]
if icon and icon.active then
P:UpdateCooldown(icon, 30)
end
end
info.auras.targetLastedSepsisFullDuration = nil
end
local outlawRestlessBladesIDs = {
13750,
315341,
13877,
271877,
196937,
195457,
381989,
51690,
315508,
2983,
1856,
}
local floatLikeAButterfly = {
5277,
1966,
}
local subtletyDeepeningShadowsIDs = {
185313, 0.5,
280719, 1.0,
}
local function ConsumedComboPoints(info, _, spellID)
local numCP
local animacharge = info.auras.consumedAnimacharge
local isKidnyShot = spellID == 408
if isKidnyShot then
numCP = 5
elseif animacharge then
numCP = 7
else
numCP = info.talentData[193531] and 6 or 5
end
if info.spec == 260 then
if not isKidnyShot and not animacharge and info.talentData[394321] then
numCP = numCP + 1
end
local et = 0
if info.auras.isTrueBearing then
et = numCP * 0.5
end
local rt = numCP + et
for _, id in pairs(outlawRestlessBladesIDs) do
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, rt)
end
end
if info.talentData[354897] then
rt = P.isPvP and (numCP/2 + et) / 2 or (numCP/2 + et)
for _, id in pairs(floatLikeAButterfly) do
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, rt)
end
end
end
else
if not isKidnyShot and not animacharge and info.talentData[394320] then
numCP = numCP + 1
end
for i = 1, 4, 2 do
local id = subtletyDeepeningShadowsIDs[i]
if id == 280719 or info.talentData[185314] then
local reducedTime = subtletyDeepeningShadowsIDs[i + 1] * numCP
local icon = info.spellIcons[id]
if icon and icon.active and (spellID ~= 280719 or spellID ~= id) then
P:UpdateCooldown(icon, reducedTime)
end
end
end
end
end
local comboPointSpenders = {
2098,
196819,
462140,
462241,
315496,
408,
315341,
319175,
1943,
280719,
51690,
}
for _, id in pairs(comboPointSpenders) do
if id == 196819 or id == 2098 or id == 462140 or id == 462241 then
registeredEvents['SPELL_DAMAGE'][id] = ConsumedComboPoints
else
registeredEvents['SPELL_CAST_SUCCESS'][id] = ConsumedComboPoints
end
end
local RemoveEchoingRepromand_OnDelayEnd = function(srcGUID)
local info = groupInfo[srcGUID]
if info then
info.auras.consumedAnimacharge = nil
end
end
local function RemoveEchoingRepromand(info, srcGUID)
info.auras.consumedAnimacharge = true
C_Timer_After(0.1, function() RemoveEchoingRepromand_OnDelayEnd(srcGUID) end)
end
registeredEvents['SPELL_AURA_REMOVED'][354838] = RemoveEchoingRepromand
registeredEvents['SPELL_AURA_REMOVED'][323560] = RemoveEchoingRepromand
registeredEvents['SPELL_AURA_REMOVED'][323559] = RemoveEchoingRepromand
registeredEvents['SPELL_AURA_REMOVED'][193359] = function(info)
info.auras.isTrueBearing = nil
end
registeredEvents['SPELL_AURA_APPLIED'][193359] = function(info)
info.auras.isTrueBearing = true
end
registeredEvents['SPELL_DAMAGE'][457157] = function(info)
local icon = info.spellIcons[36554]
if icon and icon.active then
P:UpdateCooldown(icon, 3)
end
end
registeredEvents['SPELL_AURA_APPLIED'][457333] = function(info)
info.auras["deathsArrival"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][457333] = function(info)
info.auras["deathsArrival"] = nil
end
registeredEvents['SPELL_AURA_APPLIED'][457343] = function(info)
info.auras["deathsArrival"] = true
end
registeredEvents['SPELL_AURA_REMOVED'][457343] = function(info)
info.auras["deathsArrival"] = nil
end
E.auraMultString[457333] = "deathsArrival"
E.auraMultString[457343] = "deathsArrival"
registeredEvents['SPELL_CAST_SUCCESS'][21169] = function(info)
local icon = info.spellIcons[20608]
if icon then
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_SUMMON'][192058] = function(info, srcGUID, spellID, destGUID)
if info.talentData[265046] or info.talentData[445027] then
local icon = info.spellIcons[spellID]
if icon then
local capGUID = info.auras.capTotemGUID
if capGUID then
totemGUIDS[capGUID] = nil
end
totemGUIDS[destGUID] = srcGUID
info.auras.capTotemGUID = destGUID
end
end
end
registeredEvents['SPELL_SUMMON'][383013] = function(info, srcGUID, spellID, destGUID)
if info.talentData[445027] then
local icon = info.spellIcons[spellID]
if icon then
local poiGUID = info.auras.poisonCleansingTotemGUID
if poiGUID then
totemGUIDS[poiGUID] = nil
end
totemGUIDS[destGUID] = srcGUID
info.auras.poisonCleansingTotemGUID = destGUID
end
end
end
registeredEvents['SPELL_SUMMON'][51485] = function(info, srcGUID, spellID, destGUID)
if info.talentData[445027] then
local icon = info.spellIcons[spellID]
if icon then
local earGUID = info.auras.earthgrabTotemGUID
if earGUID then
totemGUIDS[earGUID] = nil
end
totemGUIDS[destGUID] = srcGUID
info.auras.earthgrabTotemGUID = destGUID
end
end
end
registeredEvents['SPELL_HEAL'][31616] = function(info)
local icon = info.spellIcons[30884]
if icon then
P:StartCooldown(icon, icon.duration)
end
end
registeredEvents['SPELL_AURA_APPLIED'][344179] = function(info)
local icon = info.auras.feralSpiritIcon
if icon and icon.active then
P:UpdateCooldown(icon, 2)
end
end
registeredEvents['SPELL_AURA_APPLIED_DOSE'][344179] = function(info, _,_,_,_,_,_, amount)
if amount == 2 then
local icon = info.auras.feralSpiritIcon
if icon and icon.active then
P:UpdateCooldown(icon, 2)
end
end
end
registeredEvents['SPELL_AURA_REFRESH'][344179] = registeredEvents['SPELL_AURA_APPLIED'][344179]
registeredEvents['SPELL_CAST_SUCCESS'][51533] = function(info)
info.auras.feralSpiritIcon = (info.talentData[384447] or (P.isInShadowlands and info.talentData[335897])) and info.spellIcons[51533]
end
registeredEvents['SPELL_PERIODIC_DAMAGE'][188389] = function(info, _,_,_, critical)
if critical then
if info.talentData[378310] then
local icon = info.spellIcons[198067] or info.spellIcons[192249]
if icon and icon.active then
P:UpdateCooldown(icon, 1)
end
end
end
end
local RemoveSurgeOfPower_OnDelayEnd = function(srcGUID)
local info = groupInfo[srcGUID]
if info then
info.auras.isSurgeOfPower = nil
end
end
registeredEvents['SPELL_AURA_REMOVED'][285514] = function(info, srcGUID)
if info.spellIcons[198067] or info.spellIcons[192249] then
C_Timer_After(0.1, function() RemoveSurgeOfPower_OnDelayEnd(srcGUID) end)
end
end
registeredEvents['SPELL_AURA_APPLIED'][285514] = function(info)
if info.spellIcons[198067] or info.spellIcons[192249] then
info.auras.isSurgeOfPower = true
end
end
registeredEvents['SPELL_CAST_SUCCESS'][51505] = function(info)
if info.auras.isSurgeOfPower then
local icon = info.spellIcons[198067] or info.spellIcons[192249]
if icon and icon.active then
P:UpdateCooldown(icon, 4)
end
info.auras.isSurgeOfPower = nil
end
end
local elementalShamanNatureAbilities = {
5394,
383013,
383017,
383019,
192077,
192058,
355580,
204331,
204336,
2484,
51485,
8143,
108270,
57994,
191634,
51490,
204406,
378779,
108271,
2825,
51514,
356736,
79206,
378773,
305483,
108281,
198103,
192063,
108287,
108285,
378081,
443454,
192249,
51886,
375982,
}
local numElementalShamanNatureAbilities = #elementalShamanNatureAbilities
local function ReduceNatureAbilitiesCD(info)
if info.talentData[381936] then
for i = 1, numElementalShamanNatureAbilities do
local id = elementalShamanNatureAbilities[i]
local icon = info.spellIcons[id]
if icon and icon.active then
P:UpdateCooldown(icon, 1)
end
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][188443] = ReduceNatureAbilitiesCD
registeredEvents['SPELL_CAST_SUCCESS'][188196] = ReduceNatureAbilitiesCD
registeredEvents['SPELL_CAST_SUCCESS'][452201] = ReduceNatureAbilitiesCD
local shamanTotems = {
5394,
383013,
383017,
383019,
192222,
157153,
198838,
51485,
192077,
192058,
355580,
204331,
204336,
2484,
8143,
108270,
444995,
}
local function CacheLastTotemUsed(info, _, spellID)
if info.talentData[108285] then
info.auras.lastTotemUsed = info.auras.lastTotemUsed or {}
if info.auras.lastTotemUsed[1] ~= spellID then
tinsert(info.auras.lastTotemUsed, 1, spellID)
for i = 3, #info.auras.lastTotemUsed do
info.auras.lastTotemUsed[i] = nil
end
end
end
end
for _, id in pairs(shamanTotems) do
registeredEvents['SPELL_CAST_SUCCESS'][id] = CacheLastTotemUsed
end
registeredEvents['SPELL_CAST_SUCCESS'][108285] = function(info)
local lastTotemUsed = info.auras.lastTotemUsed
if lastTotemUsed then
for i = 1, info.talentData[383012] and 2 or 1 do
local id = lastTotemUsed[i]
local icon = info.spellIcons[id]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
end
end
registeredEvents['SPELL_SUMMON'][445624] = function(info)
local icon = info.spellIcons[198067] or info.spellIcons[192249]
if icon and icon.active then
P:UpdateCooldown(icon, 10)
end
end
registeredEvents['SPELL_AURA_REMOVED'][453406] = function(info)
info.auras.whirlingEarth = nil
end
registeredEvents['SPELL_AURA_APPLIED'][453406] = function(info)
info.auras.whirlingEarth = true
end
registeredEvents['SPELL_CAST_SUCCESS'][197214] = function(info, _, spellID)
if info.auras.whirlingEarth then
local icon = info.spellIcons[spellID]
if icon and icon.active then
P:UpdateCooldown(icon, 12)
end
end
end
local function ReduceUnendingResolveCD(destInfo, destName, _, amount, _,_, timestamp, spellSchool, _, missType)
if missType and missType ~= "ABSORB" then
return
end
if P.isPvP and destInfo.talentData[409835] and spellSchool and band(spellSchool,1) > 0 then
local icon = destInfo.spellIcons[48020]
if icon and icon.active then
if timestamp > (destInfo.auras.time_impishinstinct or 0) then
P:UpdateCooldown(icon, 3)
destInfo.auras.time_impishinstinct = timestamp + 5
end
end
end
local talentRank = destInfo.talentData[389359]
if talentRank then
local icon = destInfo.spellIcons[104773]
if icon and icon.active then
if timestamp > (destInfo.auras.time_resolutebarrier or 0) then
local maxHP = UnitHealthMax(destName)
if maxHP > 0 and (amount / maxHP) > 0.05 then
P:UpdateCooldown(icon, 10)
destInfo.auras.time_resolutebarrier = timestamp + 30 - (5 * talentRank)
end
end
end
end
end
registeredHostileEvents['SWING_DAMAGE']['WARLOCK'] = function(destInfo,destName,amount,_,_,_,timestamp,school) ReduceUnendingResolveCD(destInfo,destName,nil,amount,nil,nil,timestamp,school) end
registeredHostileEvents['RANGE_DAMAGE']['WARLOCK'] = ReduceUnendingResolveCD
registeredHostileEvents['SPELL_DAMAGE']['WARLOCK'] = ReduceUnendingResolveCD
registeredHostileEvents['SWING_MISSED']['WARLOCK'] = function(destInfo,destName,missType,_,_,_,timestamp,amountMissed) ReduceUnendingResolveCD(destInfo,destName,nil,amountMissed,nil,nil,timestamp,1,nil,missType) end
registeredHostileEvents['RANGE_MISSED']['WARLOCK'] = function(destInfo,destName,_,missType,_,_,timestamp,spellSchool,amountMissed) ReduceUnendingResolveCD(destInfo,destName,nil,amountMissed,nil,nil,timestamp,spellSchool,nil,missType) end
registeredHostileEvents['SPELL_MISSED']['WARLOCK'] = registeredHostileEvents['RANGE_MISSED']['WARLOCK']
registeredEvents['SPELL_AURA_APPLIED'][457555] = function(info)
local icon = info.spellIcons[6353]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
registeredEvents['SPELL_AURA_APPLIED'][32216] = function(info)
local icon = info.spellIcons[202168]
if icon and icon.active then
P:ResetCooldown(icon)
info.auras["Victorious"] = true
end
end
local rageSpenders = {
[184367] = { 4.0, { 1719, 228920, 227847 } },
[280735] = { 2.0, { 1719, 228920, 227847 }, { 316402, 0 } },
[12294] = { 1.5, { 262161, 167105, 228920, 227847 } },
[845] = { 1.0, { 262161, 167105, 228920, 227847 }, nil, { "StormofSwords", 0 } },
[772] = { 1.0, { 262161, 167105, 228920, 227847 } },
[394062] = { 2.0, { 401150, 871 } },
[190456] = { 3.5, { 401150, 871 } },
[6572] = { 2.0, { 401150, 871}, { 390675, 1 }, { "Revenge", 0 } },
[6343] = { { [71]=1, [72]=1 }, { 262161, 167105, 227847, 1719, 228920 } },
[1680] = { { [73]=2 }, { 401150, 871 } },
[163201] = { { [73]=4, [71]=2 }, { 262161, 167105, 227847, 401150, 871 }, { 316402, 0 }, { "SuddenDeath", 0 } },
[281000] = { { [73]=4, [71]=2 }, { 262161, 167105, 227847, 401150, 871 }, { 316402, 0 }, { "SuddenDeath", 0 } },
[1464] = { { [73]=2, [71]=1 }, { 262161, 167105, 227847, 401150, 871, 1719, 228920 } },
[2565] = { { [73]=3, ["d"]=1.5 }, { 262161, 167105, 227847, 401150, 871, 1719, 228920 } },
[202168] = { { [73]=1, ["d"]=0.5 }, { 262161, 167105, 227847, 401150, 871, 1719, 228920 }, nil, { "Victorious", 0 } },
[1715] = { { [73]=1, ["d"]=0.5 }, { 262161, 167105, 227847, 401150, 871, 1719, 228920 } },
}
for id, t in pairs(rageSpenders) do
local duration, target, modif, aura = t[1], t[2], t[3], t[4]
registeredEvents['SPELL_CAST_SUCCESS'][id] = function(info)
if id == 280735 or id == 163201 or id == 281000 then
registeredEvents['SPELL_CAST_SUCCESS'][5308](info)
elseif id == 6343 then
if info.talentData[385840] then
local active = info.active[1160]
if active then
active.numHits = 0
end
end
end
if not info.talentData[152278] then return end
local rCD
if type(duration) == "table" then
rCD = duration[info.spec] or duration.d
if not rCD then return end
else
rCD = duration
end
if aura then
for i = 1, #aura, 2 do
local buff, rt = aura[i], aura[i+1]
if info.auras[buff] then
if rt == 0 then return end
rCD = rCD + rt
end
end
end
if modif then
for i = 1, #modif, 2 do
local tal, rt = modif[i], modif[i+1]
if info.talentData[tal] then
if rt == 0 then return end
rCD = rCD + rt
end
end
end
--[[
if info.spec == 72 and P.isPvP then
rCD = rCD * 1.33
end
]]
for _, spellID in pairs(target) do
local icon = info.spellIcons[spellID]
if icon and icon.active and (spellID ~= 228920 or info.spec == 72) then
P:UpdateCooldown(icon, rCD)
end
end
end
end
registeredEvents['SPELL_DAMAGE'][46968] = function(info)
if info.talentData[275339] then
local active = info.active[46968]
if active then
active.numHits = (active.numHits or 0) + 1
if active.numHits == 3 then
local icon = info.spellIcons[46968]
if icon and icon.active then
P:UpdateCooldown(icon, 15)
end
end
end
end
end
registeredEvents['SPELL_DAMAGE'][6343] = function(info)
if info.talentData[385840] then
local active = info.active[1160]
if active then
active.numHits = (active.numHits or 0) + 1
if active.numHits <= 3 then
local icon = info.spellIcons[1160]
if icon and icon.active then
P:UpdateCooldown(icon, 1.5)
end
end
end
end
end
--[[
registeredEvents['SPELL_CAST_SUCCESS'][6343] = function(info)
if info.talentData[385840] then
local active = info.active[1160]
if active then
active.numHits = 0
end
end
end
]]
local RemoveMarkedForExecution_OnDelayEnd = function(srcGUID)
local info = groupInfo[srcGUID]
if info then
info.auras.hasMarkedForExecution = nil
end
end
registeredEvents['SPELL_AURA_REMOVED'][445584] = function(info, srcGUID)
if info.talentData[444780] then
C_Timer_After(0.1, function() RemoveMarkedForExecution_OnDelayEnd(srcGUID) end)
end
end
registeredEvents['SPELL_AURA_APPLIED'][445584] = function(info)
if info.talentData[444780] then
info.auras.hasMarkedForExecution = 1
end
end
registeredEvents['SPELL_AURA_APPLIED_DOSE'][445584] = function(info, _,_,_,_,_,_, overkill)
if info.talentData[444780] then
info.auras.hasMarkedForExecution = overkill
end
end
registeredEvents['SPELL_CAST_SUCCESS'][5308] = function(info)
local amount = info.auras.hasMarkedForExecution
if amount and type(amount) == "number" and amount > 0 then
local icon = info.spellIcons[227847]
if icon and icon.active then
P:UpdateCooldown(icon, amount * 5)
end
end
end
registeredEvents['SPELL_AURA_APPLIED_DOSE'][440989] = function(info, _,_,_,_,_,_, overkill)
if info.talentData[429636] then
info.auras.colossalMightStacks = overkill
end
end
registeredEvents['SPELL_AURA_REFRESH'][440989] = function(info, _,_,_,_,_,_, overkill)
if info.talentData[429636] and info.auras.colossalMightStacks >= 10 then
if info.auras.colossalMightStacks == 10 then
info.auras.colossalMightStacks = 11
else
local icon = info.spellIcons[436358]
if icon and icon.active then
P:UpdateCooldown(icon, 2)
end
end
end
end
registeredEvents['SPELL_EMPOWER_INTERRUPT'][436344] = function(info, _, spellID)
local icon = info.spellIcons[spellID]
if icon and icon.active then
P:ResetCooldown(icon)
end
end
local function UpdateSpellRR(info, spellID, modRate, icon, now)
icon = icon or info.spellIcons[spellID]
if icon then
local newRate = icon.modRate * modRate
local active = icon.active and info.active[spellID]
if active then
now = now or GetTime()
local elapsed = (now - active.startTime) * modRate
local newTime = now - elapsed
local newCd = active.duration * modRate
icon.cooldown:SetCooldown(newTime, newCd, newRate)
active.startTime = newTime
active.duration = newCd
active.modRate = newRate
local statusBar = icon.statusBar
if statusBar then
P.OmniCDCastingBarFrame_OnEvent(statusBar.CastingBar, E.db.extraBars[statusBar.key].reverseFill and 'UNIT_SPELLCAST_CHANNEL_UPDATE' or 'UNIT_SPELLCAST_CAST_UPDATE')
end
end
info.spellModRates[spellID] = newRate
icon.modRate = newRate
end
end
local function UpdateCDRR(info, modRate, excludeID, forcedIDs)
local now = GetTime()
for spellID, icon in pairs(info.spellIcons) do
if icon and (icon.isBookType and spellID ~= excludeID or (forcedIDs and forcedIDs[spellID])) then
UpdateSpellRR(info, spellID, modRate, icon, now)
end
end
end
local evokerRacials = {
[368970] = true,
[357214] = true,
[369536] = true,
}
registeredEvents['SPELL_AURA_REMOVED'][404977] = function(info, srcGUID, spellID, destGUID)
info = info or groupInfo[srcGUID]
if info then
if info.callbackTimers[spellID] then
UpdateCDRR(info, 11, nil, evokerRacials)
if srcGUID ~= userGUID then
info.callbackTimers[spellID]:Cancel()
end
info.callbackTimers[spellID] = nil
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
end
registeredEvents['SPELL_AURA_APPLIED'][404977] = function(info, srcGUID, spellID, destGUID)
info.callbackTimers[spellID] = srcGUID == userGUID or C_Timer_NewTimer(info.talentData[412723] and 3.05 or 2.05, function() registeredEvents['SPELL_AURA_REMOVED'][404977](nil, srcGUID, spellID, destGUID) end)
UpdateCDRR(info, 1/11, nil, evokerRacials)
end
registeredEvents['SPELL_AURA_APPLIED'][431698] = function(info, srcGUID, spellID)
local rr = 1/1.3
UpdateCDRR(info, rr, nil, evokerRacials)
info.auras.modrate_temporalburst = rr
info.callbackTimers[spellID] = srcGUID == userGUID or C_Timer_NewTimer(30.1, function() registeredEvents['SPELL_AURA_REMOVED'][431698](nil, srcGUID, spellID) end)
end
registeredEvents['SPELL_AURA_REMOVED_DOSE'][431698] = function(info, _, spellID, _,_,_,_, amount)
if info.auras.modrate_temporalburst then
local rr = 1/(1 + (amount/100))
UpdateCDRR(info, 1/info.auras.modrate_temporalburst * rr, nil, evokerRacials)
info.auras.modrate_temporalburst = rr
end
end
registeredEvents['SPELL_AURA_REMOVED'][431698] = function(info, srcGUID, spellID)
info = info or groupInfo[srcGUID]
if info and info.auras.modrate_temporalburst then
UpdateCDRR(info, 1/info.auras.modrate_temporalburst, nil, evokerRacials)
info.auras.modrate_temporalburst = nil
if info.callbackTimers[spellID] then
if srcGUID ~= userGUID then
info.callbackTimers[spellID]:Cancel()
end
info.callbackTimers[spellID] = nil
end
end
end
registeredEvents['SPELL_AURA_REMOVED'][378441] = function(info, srcGUID, spellID, destGUID)
info = info or groupInfo[srcGUID]
if info then
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
info = groupInfo[destGUID]
if info and info.callbackTimers[spellID] then
if destGUID ~= userGUID then
info.callbackTimers[spellID]:Cancel()
end
info.callbackTimers[spellID] = nil
UpdateCDRR(info, .01, spellID, evokerRacials)
end
end
registeredEvents['SPELL_AURA_APPLIED'][378441] = function(info, srcGUID, spellID, destGUID)
info = groupInfo[destGUID]
if info then
info.callbackTimers[spellID] = destGUID == userGUID or C_Timer_NewTimer(4.1, function() registeredEvents['SPELL_AURA_REMOVED'][spellID](nil, srcGUID, spellID, destGUID) end)
UpdateCDRR(info, 100, spellID, evokerRacials)
end
end
registeredUserEvents['SPELL_AURA_REMOVED'][378441] = registeredEvents['SPELL_AURA_REMOVED'][378441]
registeredUserEvents['SPELL_AURA_APPLIED'][378441] = registeredEvents['SPELL_AURA_APPLIED'][378441]
local OnFlowStateTimerEnd
OnFlowStateTimerEnd = function(srcGUID, spellID)
local info = groupInfo[srcGUID]
if info and info.callbackTimers[spellID] then
UpdateCDRR(info, info.auras.flowStateRankValue, nil, evokerRacials)
info.auras.flowStateRankValue = nil
info.callbackTimers[spellID] = nil
end
end
registeredEvents['SPELL_AURA_REMOVED'][390148] = function(info, srcGUID, spellID)
if info.callbackTimers[spellID] then
if srcGUID ~= userGUID then
info.callbackTimers[spellID]:Cancel()
end
UpdateCDRR(info, info.auras.flowStateRankValue, nil, evokerRacials)
info.callbackTimers[spellID] = nil
info.auras.flowStateRankValue = nil
end
end
registeredEvents['SPELL_AURA_REFRESH'][390148] = function(info, srcGUID, spellID)
if info.callbackTimers[spellID] and srcGUID ~= userGUID then
info.callbackTimers[spellID]:Cancel()
info.callbackTimers[spellID] = C_Timer_NewTimer(10.1, function() OnFlowStateTimerEnd(srcGUID, spellID) end)
end
end
registeredEvents['SPELL_AURA_APPLIED'][390148] = function(info, srcGUID, spellID)
if not info.auras.flowStateRankValue then
local talentValue = info.talentData[385696] == 2 and 1.1 or 1.05
info.auras.flowStateRankValue = talentValue
info.callbackTimers[spellID] = srcGUID == userGUID or C_Timer_NewTimer(10.1, function() OnFlowStateTimerEnd(srcGUID, spellID) end)
UpdateCDRR(info, 1/talentValue, nil, evokerRacials)
end
end
registeredEvents['SPELL_AURA_REMOVED'][329042] = function(info, srcGUID, spellID, destGUID)
info = info or groupInfo[srcGUID]
if info then
if info.callbackTimers[spellID] then
UpdateCDRR(info, 5, spellID)
if srcGUID ~= userGUID then
info.callbackTimers[spellID]:Cancel()
end
info.callbackTimers[spellID] = nil
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
end
end
registeredEvents['SPELL_AURA_APPLIED'][329042] = function(info, srcGUID, spellID, destGUID)
if srcGUID == destGUID then
info.callbackTimers[spellID] = srcGUID == userGUID or C_Timer_NewTimer(10.1, function() registeredEvents['SPELL_AURA_REMOVED'][329042](nil, srcGUID, spellID, destGUID) end)
UpdateCDRR(info, 0.2, spellID)
end
end
registeredEvents['SPELL_AURA_REMOVED'][388010] = function(_, srcGUID, spellID, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
if destInfo.callbackTimers[spellID] then
if destGUID ~= userGUID then
destInfo.callbackTimers[spellID]:Cancel()
end
destInfo.callbackTimers[spellID] = nil
UpdateCDRR(destInfo, 1.3)
end
RemoveHighlightByCLEU(destInfo, srcGUID, spellID, destGUID)
end
end
registeredEvents['SPELL_AURA_APPLIED'][388010] = function(_, srcGUID, spellID, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
destInfo.callbackTimers[spellID] = destGUID == userGUID or C_Timer_NewTimer(30.5, function() registeredEvents['SPELL_AURA_REMOVED'][388010](nil, srcGUID, spellID, destGUID) end)
UpdateCDRR(destInfo, 1/1.3)
end
end
registeredUserEvents['SPELL_AURA_REMOVED'][388010] = registeredEvents['SPELL_AURA_REMOVED'][388010]
registeredUserEvents['SPELL_AURA_APPLIED'][388010] = registeredEvents['SPELL_AURA_APPLIED'][388010]
local mageBarriers = {
11426,
235450,
235313,
}
for _, id in pairs(mageBarriers) do
registeredEvents['SPELL_AURA_REMOVED'][id] = function(info, srcGUID, spellID, destGUID)
if info.auras.rr_mageBarrier then
UpdateSpellRR(info, spellID, 1.3)
info.auras.rr_mageBarrier = nil
end
RemoveHighlightByCLEU(info, srcGUID, spellID, destGUID)
if info.talentData[455428] then
local icon = info.spellIcons[spellID]
if icon and icon.active then
P:UpdateCooldown(icon, 4)
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][id] = function(info, _, spellID)
if info.talentData[382800] then
UpdateSpellRR(info, spellID, 1/1.3)
info.auras.rr_mageBarrier = true
end
end
end
local mwHotJSTargetIDs = {
116849,
116680,
}
registeredEvents['SPELL_AURA_APPLIED'][443421] = function(info)
for _, id in pairs(mwHotJSTargetIDs) do
UpdateSpellRR(info, id, 1/1.75)
end
info.auras.rr_HotJS = true
end
registeredEvents['SPELL_AURA_REMOVED'][443421] = function(info)
if info.auras.rr_HotJS then
for _, id in pairs(mwHotJSTargetIDs) do
UpdateSpellRR(info, id, 1.75)
end
info.auras.rr_HotJS = nil
end
end
local wwHotJSTargetIDs = {
113656,
392983,
152175,
}
registeredEvents['SPELL_AURA_APPLIED'][456368] = function(info, srcGUID)
for _, id in pairs(wwHotJSTargetIDs) do
UpdateSpellRR(info, id, 1/1.75)
end
C_Timer_After(8, function()
local info = groupInfo[srcGUID]
if info and info.auras.rr_HotJS then
for _, id in pairs(wwHotJSTargetIDs) do
UpdateSpellRR(info, id, 1.75)
end
info.auras.rr_HotJS = nil
end
end)
info.auras.rr_HotJS = true
end
local holyPowerGenerators = {
375576,
}
registeredEvents['SPELL_AURA_REMOVED'][385126] = function(info, srcGUID, spellID, destGUID)
if info.auras.rr_sealoforder then
for i = 1, #holyPowerGenerators do
local id = holyPowerGenerators[i]
UpdateSpellRR(info, id, 1.1)
end
info.auras.rr_sealoforder = nil
end
end
registeredEvents['SPELL_AURA_APPLIED'][385126] = function(info, srcGUID, spellID, destGUID)
if info.talentData[385129] then
for i = 1, #holyPowerGenerators do
local id = holyPowerGenerators[i]
UpdateSpellRR(info, id, 1/1.1)
end
info.auras.rr_sealoforder = true
end
end
local symbolOfHopeIDs = {
[71]=118038, [72]=184364, [73]=871,
[65]=498, [66]=31850, [70]=403876,
[253]=109304, [254]=109304, [255]=109304,
[259]=185311, [260]=185311, [261]=185311,
[256]=19236, [257]=19236, [258]=19236,
[250]=48792, [251]=48792, [252]=48792,
[262]=108271, [263]=108271, [264]=108271,
[62]=55342, [63]=55342, [64]=55342,
[265]=104773, [266]=104773, [267]=104773,
[268]=115203, [269]=115203, [270]=115203,
[102]=22812, [103]=22812, [104]=22812, [105]=22812,
[577]=198589, [581]=204021,
[1467]=363916, [1468]=363916, [1473]=363916,
}
registeredEvents['SPELL_AURA_REMOVED'][265144] = function(_,_,_, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
local id = symbolOfHopeIDs[destInfo.spec]
if id then
local rr = destInfo.auras.rr_symbolofhope
if rr then
UpdateSpellRR(destInfo, id, 1/rr)
destInfo.auras.rr_symbolofhope = nil
end
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][265144] = function(info, _,_, destGUID)
local destInfo = groupInfo[destGUID]
if destInfo then
local id = symbolOfHopeIDs[destInfo.spec]
if id then
local _,_,_, startTimeMS, endTimeMS = UnitChannelInfo(info and info.unit or "player")
if startTimeMS and endTimeMS then
local channelTime = (endTimeMS - startTimeMS) / 1000
local rr = 1 / ((30 + channelTime) / channelTime)
UpdateSpellRR(destInfo, id, rr)
destInfo.auras.rr_symbolofhope = rr
end
end
end
end
registeredUserEvents['SPELL_AURA_REMOVED'][265144] = registeredEvents['SPELL_AURA_REMOVED'][265144]
registeredUserEvents['SPELL_AURA_APPLIED'][265144] = registeredEvents['SPELL_AURA_APPLIED'][265144]
registeredEvents['SPELL_AURA_REMOVED'][381684] = function(info)
if info.auras.rr_brimmingwithlife then
UpdateSpellRR(info, 20608, 1.75)
end
end
registeredEvents['SPELL_AURA_APPLIED'][381684] = function(info)
local icon = info.spellIcons[20608]
if icon then
UpdateSpellRR(info, 20608, 1/1.75)
info.auras.rr_brimmingwithlife = true
end
end
registeredEvents['SPELL_HEAL'][214200] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
local icon = info.spellIcons[214198]
if icon then
if timestamp > (info.auras.time_expellight or 0) then
P:StartCooldown(icon, icon.duration)
info.auras.time_expellight = timestamp + 10
end
end
end
registeredEvents['SPELL_DAMAGE'][443124] = function(info, _,_,_,_, destFlags, _, overkill)
if ( overkill > -1 ) then
local icon = info.spellIcons[443124]
if ( icon and icon.active ) then
P:UpdateCooldown(icon, 60)
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][450157] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if ( info.spellIcons[443556] ) then
info.auras.time_twinFang = timestamp
end
end
registeredEvents['SPELL_AURA_REMOVED'][450157] = function(info)
info.auras.twinFang = nil
end
registeredEvents['SPELL_CAST_SUCCESS'][443556] = function(info, _,_,_,_,_,_,_,_,_,_, timestamp)
if ( info.auras.time_twinFang ) then
local icon = info.spellIcons[443556]
if ( icon ) then
info.auras.twinFang = true
C_Timer_After(0, function()
if ( not info.auras.twinFang ) then
P:StartCooldown(icon, icon.duration)
P:UpdateCooldown(icon, timestamp - info.auras.time_twinFang)
end
end)
end
end
end
registeredEvents['SPELL_AURA_APPLIED'][113942] = function(info, srcGUID, spellID)
local icon = info.spellIcons[spellID]
if not icon and P.spell_enabled[spellID] then
info.sessionItemData[0] = true
P:UpdateUnitBar(srcGUID)
icon = info.spellIcons[spellID]
end
if icon then
if AuraUtil_ForEachAura then
AuraUtil_ForEachAura(info.unit, "HARMFUL", nil, function(_,_,_,_, duration, _,_,_,_, id)
if id == spellID then
if duration > 0 then
icon.duration = duration
end
P:StartCooldown(icon, icon.duration)
return true
end
end)
else
for i = 1, 50 do
local _,_,_,_, duration, _,_,_,_, id = UnitDebuff(info.unit, i)
if not id then return end
if id == spellID then
if duration > 0 then
icon.duration = duration
end
P:StartCooldown(icon, icon.duration)
break
end
end
end
end
end
local consumables = {
323436,
6262,
}
E.consumableIDs = {}
for _, v in pairs(consumables) do
E.consumableIDs[v] = 3
end
local startCdOutOfCombat = function(guid)
local info = groupInfo[guid]
if not info or UnitAffectingCombat(info.unit) then
return
end
for i = 1, #consumables do
local spellID = consumables[i]
local icon = info.preactiveIcons[spellID]
if icon then
local statusBar = icon.statusBar
if statusBar then
P:SetExStatusBarColor(icon, statusBar.key)
end
info.preactiveIcons[spellID] = nil
icon.icon:SetVertexColor(1, 1, 1)
P:StartCooldown(icon, icon.duration)
ForceUpdatePeriodicSync(spellID)
end
end
if info.callbackTimers.inCombatTicker then
info.callbackTimers.inCombatTicker:Cancel()
info.callbackTimers.inCombatTicker = nil
end
end
local function StartConsumablesCD(info, srcGUID, spellID)
local icon = info.spellIcons[spellID]
if not icon and spellID == 6262 and P.spell_enabled[spellID] then
info.sessionItemData[5512] = true
P:UpdateUnitBar(srcGUID)
icon = info.spellIcons[spellID]
end
if icon then
if spellID == 323436 or spellID == 6262 then
local stacks = icon.count:GetText()
stacks = tonumber(stacks)
stacks = (stacks and stacks > 0 and stacks or 3) - 1
icon.count:SetText(stacks)
if spellID == 6262 then
info.auras.healthStoneStacks = stacks
else
info.auras.purifySoulStacks = stacks
end
end
if info.callbackTimers.inCombatTicker then
info.callbackTimers.inCombatTicker:Cancel()
info.callbackTimers.inCombatTicker = nil
end
if UnitAffectingCombat(info.unit) then
local statusBar = icon.statusBar
if icon.active then
if statusBar then
P.OmniCDCastingBarFrame_OnEvent(statusBar.CastingBar, 'UNIT_SPELLCAST_STOP')
end
icon.cooldown:Clear()
end
if not info.preactiveIcons[spellID] then
if statusBar then
statusBar.BG:SetVertexColor(0.7, 0.7, 0.7)
end
info.preactiveIcons[spellID] = icon
icon.icon:SetVertexColor(0.4, 0.4, 0.4)
end
info.callbackTimers.inCombatTicker = C_Timer_NewTicker(1, function() startCdOutOfCombat(icon.guid) end, 900)
else
info.preactiveIcons[spellID] = nil
icon.icon:SetVertexColor(1, 1, 1)
P:StartCooldown(icon, icon.duration)
end
end
if spellID == 6262 and srcGUID == userGUID then
ForceUpdatePeriodicSync(spellID)
end
end
for i = 1, #consumables do
local spellID = consumables[i]
if spellID == 323436 then
registeredEvents['SPELL_HEAL'][spellID] = function(info, srcGUID)
if not info.auras.ignorePurifySoul then
info.auras.ignorePurifySoul = true
C_Timer_After(0.1, function() info.auras.ignorePurifySoul = false end)
StartConsumablesCD(info, srcGUID, spellID)
end
end
registeredEvents['SPELL_CAST_SUCCESS'][spellID] = registeredEvents['SPELL_HEAL'][spellID]
else
registeredEvents['SPELL_CAST_SUCCESS'][spellID] = StartConsumablesCD
end
end
if ( E.isCata ) then
registeredEvents['SPELL_DAMAGE'][78674] = function(info)
if info.talentData[62971] then
local icon = info.spellIcons[48505]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][5185] = function(info)
if info.talentData[54825] then
local icon = info.spellIcons[17116]
if icon and icon.active then
P:UpdateCooldown(icon, 10)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][2060] = function(info)
if info.talentData[92297] then
local icon = info.spellIcons[89485]
if icon and icon.active then
P:UpdateCooldown(icon, 5)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][585] = function(info)
if info.talentData[92297] then
local icon = info.spellIcons[47540]
if icon and icon.active then
P:UpdateCooldown(icon, 0.5)
end
end
end
registeredEvents['SPELL_PERIODIC_DAMAGE'][15407] = function(info, _,_,_, critical)
if critical then
local rt = info.talentData[87099] and 5 or (info.talentData[87100] and 10)
if rt then
local icon = info.spellIcons[34433]
if icon and icon.active then
P:UpdateCooldown(icon, rt)
end
end
end
end
registeredEvents['SPELL_INTERRUPT'][1766] = function(info, _, spellID, _,_,_, extraSpellId, extraSpellName, _,_, destRaidFlags)
if info.talentData[56805] then
local icon = info.spellIcons[spellID]
if icon and icon.active then
P:UpdateCooldown(icon, 6)
end
end
AppendInterruptExtras(info, nil, spellID, nil,nil,nil, extraSpellId, extraSpellName, nil,nil, destRaidFlags)
end
local arenaUnits = { "arena1", "arena2", "arena3", "arena4", "arena5", "target" }
registeredEvents['SPELL_CAST_SUCCESS'][1766] = function(info, _, spellID, destGUID)
if info.talentData[56805] then
local icon = info.spellIcons[spellID]
if icon and icon.active then
for i = 1, #arenaUnits do
local unit = arenaUnits[i]
local guid = UnitGUID(unit)
if guid == destGUID then
local _,_,_,_,_,_, notInterruptable, channelID = UnitChannelInfo(unit)
if notInterruptable ~= false then
return
end
if channelID == 47758 then
P:UpdateCooldown(icon, 6)
end
end
end
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][403] = function(info)
local icon = info.spellIcons[16166]
if icon and icon.active then
local rt = info.talentData[86183] and 1 or (info.talentData[86184] and 2) or (info.talentData[86185] and 3)
if rt then
P:UpdateCooldown(icon, rt)
end
end
end
registeredEvents['SPELL_CAST_SUCCESS'][421] = function(info)
local icon = info.spellIcons[16166]
if icon and icon.active then
local rt = info.talentData[86183] and 1 or (info.talentData[86184] and 2) or (info.talentData[86185] and 3)
if rt then
P:UpdateCooldown(icon, rt)
end
end
end
end
setmetatable(registeredEvents, nil)
setmetatable(registeredUserEvents, nil)
setmetatable(registeredHostileEvents, nil)
function P:SetDisabledColorScheme(destInfo)
if not destInfo.isDisabledColor then
destInfo.isDisabledColor = true
for id, icon in pairs(destInfo.spellIcons) do
local statusBar = icon.statusBar
if statusBar then
if icon.active then
local castingBar = statusBar.CastingBar
castingBar:SetStatusBarColor(0.3, 0.3, 0.3)
castingBar.BG:SetVertexColor(0.3, 0.3, 0.3)
castingBar.Text:SetVertexColor(0.3, 0.3, 0.3)
end
statusBar.BG:SetVertexColor(0.3, 0.3, 0.3)
statusBar.Text:SetTextColor(0.3, 0.3, 0.3)
end
icon.icon:SetDesaturated(true)
icon.icon:SetVertexColor(0.3, 0.3, 0.3)
if icon.glowBorder then
icon.Glow:Hide()
end
if ( E.summonedBuffDuration[id] and destInfo.glowIcons[id] ) then
self:RemoveHighlight(icon)
end
end
for key, frame in pairs(self.extraBars) do
if frame.shouldRearrangeInterrupts then
P:SetExIconLayout(key, true)
end
end
end
end
local function UpdateDeadStatus(destInfo)
if E.preMoP and UnitHealth(destInfo.unit) > 1 then
return
end
destInfo.isDead = true
destInfo.isDeadOrOffline = true
P:SetDisabledColorScheme(destInfo)
destInfo.bar:RegisterUnitEvent('UNIT_HEALTH', destInfo.unit)
end
if E.isClassic then
local spellNameToID = E.spellNameToID
local spell_enabled = P.spell_enabled
local spell_modifiers = E.spell_modifiers
function CD:COMBAT_LOG_EVENT_UNFILTERED()
local _, event, _, srcGUID, _, srcFlags, _, destGUID, destName, destFlags, _,_, spellName, _, amount, overkill, _, resisted, _,_, critical = CombatLogGetCurrentEventInfo()
if band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) == 0 then
local destInfo = groupInfo[destGUID]
if destInfo and event == 'UNIT_DIED' then
UpdateDeadStatus(destInfo)
end
return
end
local spellID = spellNameToID[spellName]
if not spellID then
return
end
srcGUID = petGUIDS[srcGUID] or srcGUID
local info = groupInfo[srcGUID]
if not info then
return
end
if spellID == 17116 or spellID == 16188 then
spellID = info.class == "DRUID" and 17116 or 16188
end
if event == 'SPELL_CAST_SUCCESS' then
if spell_enabled[spellID] or spell_modifiers[spellID] then
ProcessSpell(spellID, srcGUID)
end
end
local func = registeredEvents[event] and registeredEvents[event][spellID]
if func then
func(info, srcGUID, spellID, destGUID, critical, destFlags, amount, overkill, destName, resisted)
end
end
elseif E.preMoP then
function CD:COMBAT_LOG_EVENT_UNFILTERED()
local _, event, _, srcGUID, _, srcFlags, _, destGUID, destName, destFlags, _, spellID, _,_, amount, overkill, _, resisted, _,_, critical = CombatLogGetCurrentEventInfo()
if band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) == 0 then
local destInfo = groupInfo[destGUID]
if destInfo and event == 'UNIT_DIED' then
UpdateDeadStatus(destInfo)
end
return
end
if band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER) > 0 then
if band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) > 0 and isUserDisabled then
local func = registeredUserEvents[event] and registeredUserEvents[event][spellID]
if func and destGUID ~= userGUID then
func(nil, srcGUID, spellID, destGUID)
end
return
end
local info = groupInfo[srcGUID]
if not info then
return
end
local func = registeredEvents[event] and registeredEvents[event][spellID]
if func then
func(info, srcGUID, spellID, destGUID, critical, destFlags, amount, overkill, destName, resisted, destRaidFlags)
end
end
end
else
function CD:COMBAT_LOG_EVENT_UNFILTERED()
local timestamp, event, _, srcGUID, _, srcFlags, _, destGUID, destName, destFlags, destRaidFlags, spellID, _, spellSchool, amount, overkill, school, resisted, _,_, critical = CombatLogGetCurrentEventInfo()
local info = groupInfo[srcGUID]
if info then
if srcGUID == userGUID and isUserDisabled then
local func = registeredUserEvents[event] and registeredUserEvents[event][spellID]
if func and destGUID ~= userGUID then
func(nil, srcGUID, spellID, destGUID, critical, destFlags, amount, overkill, destName, resisted, destRaidFlags, timestamp)
end
else
local func = registeredEvents[event] and (registeredEvents[event][spellID] or registeredEvents[event][info.class])
if func then
func(info, srcGUID, spellID, destGUID, critical, destFlags, amount, overkill, destName, resisted, destRaidFlags, timestamp, school)
end
end
return
end
local ownerGUID = totemGUIDS[srcGUID]
info = groupInfo[ownerGUID]
if info then
if event == 'SPELL_AURA_APPLIED' then
if spellID == 118905 then
local icon = info.spellIcons[192058]
local active = icon and icon.active and info.active[192058]
if active then
if info.talentData[265046] then
active.numHits = (active.numHits or 0) + 1
if active.numHits > 4 then
return
end
P:UpdateCooldown(icon, 5)
end
if info.talentData[445027] and timestamp > (info.auras.time_capTotem or 0) then
P:UpdateCooldown(icon, 5)
info.auras.time_capTotem = timestamp + 20
end
end
elseif spellID == 64695 then
local icon = info.spellIcons[51485]
if icon and icon.active then
if timestamp > (info.auras.time_earthgrabTotem or 0) then
P:UpdateCooldown(icon, 5)
info.auras.time_earthgrabTotem = timestamp + 20
end
end
end
elseif event == 'SPELL_DISPEL' then
if spellID == 383015 then
local icon = info.spellIcons[383013]
if icon and icon.active then
if timestamp > (info.auras.time_poisonCleansingTotem or 0) then
P:UpdateCooldown(icon, 5)
info.auras.time_poisonCleansingTotem = timestamp + 20
end
end
end
end
return
end
ownerGUID = petGUIDS[srcGUID]
info = groupInfo[ownerGUID]
if info then
if event == 'SPELL_INTERRUPT' then
AppendInterruptExtras(info, nil, spellID, nil,nil,nil, amount, overkill, nil,nil, destRaidFlags)
end
return
end
if band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) == 0 then
info = groupInfo[destGUID]
if info then
local func = registeredHostileEvents[event] and (registeredHostileEvents[event][spellID] or registeredHostileEvents[event][info.class])
if func then
func(info, destName, spellID, amount, overkill, destGUID, timestamp, spellSchool, school)
elseif event == 'UNIT_DIED' then
UpdateDeadStatus(info)
end
elseif event == 'UNIT_DIED' then
if destGUID == userGUID then
E.Libs.CBH:Fire("OnDisabledUserDied")
return
end
local watched = diedHostileGUIDS[destGUID]
if watched then
for guid, t in pairs(watched) do
local info = groupInfo[guid]
if info then
for id in pairs(t) do
local icon = info.spellIcons[id]
if icon and icon.active then
if id == 370965 or id == 430703 then
P:UpdateCooldown(icon, 12)
else
P:ResetCooldown(icon)
end
end
end
end
end
diedHostileGUIDS[destGUID] = nil
end
end
end
end
end
function CD:UNIT_PET(unit)
local unitPet = E.UNIT_TO_PET[unit]
if not unitPet then
return
end
local guid = UnitGUID(unit)
local info = groupInfo[guid]
if info and (info.class == "WARLOCK" or info.spec == 252) then
local petGUID = info.petGUID
if petGUID then
petGUIDS[petGUID] = nil
end
petGUID = UnitGUID(unitPet)
if petGUID then
info.petGUID = petGUID
petGUIDS[petGUID] = guid
end
end
end
E.ProcessSpell = ProcessSpell
CD.totemGUIDS = totemGUIDS
CD.petGUIDS = petGUIDS
CD.diedHostileGUIDS = diedHostileGUIDS
CD.dispelledHostileGUIDS = dispelledHostileGUIDS