local mod = DBM : NewMod ( 2031 , " DBM-Raids-Legion " , 1 , 946 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240629024612 " )
mod : SetCreatureID ( 124828 )
mod : SetEncounterID ( 2092 )
mod : SetBossHPInfoToHighest ( ) --Because of heal on mythic
mod : SetUsedIcons ( 1 , 2 , 3 , 4 , 5 , 6 , 7 )
mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 248165 248317 257296 255594 257645 252516 256542 255648 257619 " ,
" SPELL_CAST_SUCCESS 248499 258039 258838 252729 252616 256388 258029 255826 " ,
" SPELL_AURA_APPLIED 248499 248396 250669 251570 255199 253021 255496 255496 255478 252729 252616 255433 255430 255429 255425 255422 255419 255418 258647 258646 257869 257931 257966 258838 " ,
" SPELL_AURA_APPLIED_DOSE 248499 258039 258838 " ,
" SPELL_AURA_REMOVED 250669 251570 255199 253021 255496 255496 255478 255433 255430 255429 255425 255422 255419 255418 248499 258039 257966 258647 258646 258838 248396 257869 " ,
" SPELL_INTERRUPT " ,
" SPELL_PERIODIC_DAMAGE 248167 " ,
" SPELL_PERIODIC_MISSED 248167 " ,
" CHAT_MSG_RAID_BOSS_EMOTE " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3 boss4 boss5 "
)
--TODO, custom warning to combine soulburst and bomb into single message instead of two messages, while still separating targets
--TODO, More info on InfoFrame?
--[[
( ability.id = 256544 or ability.id = 255826 or ability.id = 248165 or ability.id = 248317 or ability.id = 257296 or ability.id = 255594 or ability.id = 252516 or ability.id = 255648 or ability.id = 257645 or ability.id = 256542 or ability.id = 257619 or ability.id = 255935 ) and type = " begincast "
or ( ability.id = 248499 or ability.id = 258039 or ability.id = 252729 or ability.id = 252616 or ability.id = 256388 or ability.id = 258838 or ability.id = 258029 ) and type = " cast "
or ( ability.id = 250669 or ability.id = 251570 or ability.id = 255199 or ability.id = 257931 or ability.id = 257869 or ability.id = 257966 ) and type = " applydebuff " or type = " interrupt " and target.id = 124828
--]]
local warnPhase = mod : NewPhaseChangeAnnounce ( )
local specWarnGTFO = mod : NewSpecialWarningGTFO ( 248167 , nil , nil , nil , 1 , 2 )
local timerNextPhase = mod : NewStageTimer ( 74 )
local berserkTimer = mod : NewBerserkTimer ( 600 )
mod : AddInfoFrameOption ( nil , true )
--Stage One: Storm and Sky
mod : AddTimerLine ( SCENARIO_STAGE : format ( 1 ) )
local warnTorturedRage = mod : NewCountAnnounce ( 257296 , 2 )
local warnSweepingScythe = mod : NewStackAnnounce ( 248499 , 2 , nil , " Tank " )
local warnBlightOrb = mod : NewCountAnnounce ( 248317 , 2 )
local warnSoulblight = mod : NewTargetAnnounce ( 248396 , 2 , nil , false , 2 )
local warnSkyandSea = mod : NewTargetAnnounce ( 255594 , 1 )
local specWarnSweepingScythe = mod : NewSpecialWarningStack ( 248499 , nil , 3 , nil , nil , 1 , 6 )
local specWarnSweepingScytheTaunt = mod : NewSpecialWarningTaunt ( 248499 , nil , nil , nil , 1 , 2 )
local specWarnConeofDeath = mod : NewSpecialWarningDodge ( 248165 , nil , nil , nil , 1 , 2 )
local specWarnSoulblight = mod : NewSpecialWarningMoveAway ( 248396 , nil , nil , nil , 1 , 2 )
local yellSoulblight = mod : NewShortYell ( 248396 , L.Blight )
local yellSoulblightFades = mod : NewShortFadesYell ( 248396 )
local specWarnGiftofSea = mod : NewSpecialWarningYou ( 258647 , nil , nil , nil , 1 , 2 )
local yellGiftofSea = mod : NewPosYell ( 258647 , L.SeaText )
local specWarnGiftofSky = mod : NewSpecialWarningYou ( 258646 , nil , nil , nil , 1 , 2 )
local yellGiftofSky = mod : NewPosYell ( 258646 , L.SkyText )
local timerSweepingScytheCD = mod : NewCDCountTimer ( 5.6 , 248499 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON ) --5.6-15.7
local timerConeofDeathCD = mod : NewCDCountTimer ( 19.4 , 248165 , nil , nil , nil , 3 ) --19.4-24
local timerBlightOrbCD = mod : NewCDCountTimer ( 22 , 248317 , nil , nil , nil , 3 ) --22-32
local timerTorturedRageCD = mod : NewCDCountTimer ( 13 , 257296 , nil , nil , nil , 2 , nil , DBM_COMMON_L.HEALER_ICON ) --13-16
local timerSkyandSeaCD = mod : NewCDCountTimer ( 24.9 , 255594 , nil , nil , nil , 5 ) --24.9-27.8
mod : AddSetIconOption ( " SetIconGift " , 255594 , true ) --5 and 6
--Stage one Mythic
mod : AddTimerLine ( ENCOUNTER_JOURNAL_SECTION_FLAG12 ) --Mythic Stage 1
local warnSargRage = mod : NewTargetAnnounce ( 257869 , 3 )
local warnSargFear = mod : NewTargetAnnounce ( 257931 , 3 )
local specWarnSargGaze = mod : NewSpecialWarningPreWarn ( 258068 , nil , 5 , nil , nil , 1 , 2 , 4 )
local specWarnSargRage = mod : NewSpecialWarningMoveAway ( 257869 , nil , nil , nil , 3 , 2 , 4 )
local yellSargRage = mod : NewShortYell ( 257869 , 6612 )
local specWarnSargFear = mod : NewSpecialWarningMoveTo ( 257931 , nil , nil , nil , 3 , 2 , 4 )
local yellSargFear = mod : NewShortYell ( 257931 , 5782 )
local yellSargFearCombo = mod : NewComboYell ( 257931 , 5782 )
local timerSargGazeCD = mod : NewCDCountTimer ( 35.2 , 258068 , nil , nil , nil , 3 , nil , DBM_COMMON_L.HEROIC_ICON , nil , 1 , 4 )
mod : AddRangeFrameOption ( 5 , 257869 )
--Stage Two: The Protector Redeemed
mod : AddTimerLine ( SCENARIO_STAGE : format ( 2 ) )
local warnSoulburst = mod : NewTargetAnnounce ( 250669 , 2 )
local warnSoulbomb = mod : NewTargetNoFilterAnnounce ( 251570 , 3 )
local warnAvatarofAggra = mod : NewTargetNoFilterAnnounce ( 255199 , 1 )
local specWarnSoulburst = mod : NewSpecialWarningYou ( 250669 , nil , nil , nil , 1 , 2 )
local yellSoulburst = mod : NewPosYell ( 250669 , DBM_CORE_L.AUTO_YELL_CUSTOM_POSITION )
local yellSoulburstFades = mod : NewIconFadesYell ( 250669 )
local specWarnSoulbomb = mod : NewSpecialWarningYou ( 251570 , nil , nil , nil , 1 , 2 )
local specWarnSoulbombMoveTo = mod : NewSpecialWarningMoveTo ( 251570 , nil , nil , nil , 1 , 2 )
local yellSoulbomb = mod : NewPosYell ( 251570 , DBM_CORE_L.AUTO_YELL_CUSTOM_POSITION )
local yellSoulbombFades = mod : NewIconFadesYell ( 251570 , 155188 )
local specWarnEdgeofObliteration = mod : NewSpecialWarningSpell ( 255826 , nil , nil , nil , 2 , 2 )
local specWarnAvatarofAggra = mod : NewSpecialWarningYou ( 255199 , nil , nil , nil , 1 , 2 )
local timerSoulBombCD = mod : NewNextTimer ( 42 , 251570 , nil , nil , nil , 3 , nil , DBM_COMMON_L.TANK_ICON , nil , 3 , 4 )
local timerSoulBurstCD = mod : NewNextCountTimer ( " d42 " , 250669 , nil , nil , nil , 3 )
local timerEdgeofObliterationCD = mod : NewCDCountTimer ( 34 , 255826 , nil , nil , nil , 2 )
local timerAvatarofAggraCD = mod : NewCDTimer ( 59.9 , 255199 , nil , nil , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
mod : AddSetIconOption ( " SetIconOnAvatar " , 255199 , true ) --4
mod : AddSetIconOption ( " SetIconOnSoulBomb " , 251570 , true ) --3 and 7
mod : AddSetIconOption ( " SetIconOnSoulBurst " , 250669 , true ) --2
--Stage Three: The Arcane Masters
mod : AddTimerLine ( SCENARIO_STAGE : format ( 3 ) )
local warnCosmicRay = mod : NewTargetAnnounce ( 252729 , 3 )
local warnCosmicBeaconCast = mod : NewCastAnnounce ( 252616 , 2 )
local warnCosmicBeacon = mod : NewTargetAnnounce ( 252616 , 2 )
local warnDiscsofNorg = mod : NewCastAnnounce ( 252516 , 1 )
local specWarnCosmicRay = mod : NewSpecialWarningYou ( 252729 , nil , nil , nil , 1 , 2 )
local yellCosmicRay = mod : NewYell ( 252729 )
local timerCosmicRayCD = mod : NewCDTimer ( 19.9 , 252729 , nil , nil , nil , 3 ) --All adds seem to cast it at same time, so one timer for all
local timerCosmicBeaconCD = mod : NewCDTimer ( 19.9 , 252616 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON ) --All adds seem to cast it at same time, so one timer for all
local timerDiscsofNorg = mod : NewCastTimer ( 12 , 252516 , nil , nil , nil , 6 )
mod : AddSetIconOption ( " SetIconOnVulnerability " , 255418 , true , 5 ) --1-7
mod : AddNamePlateOption ( " NPAuraOnInevitability " , 253021 )
mod : AddNamePlateOption ( " NPAuraOnCosmosSword " , 255496 )
mod : AddNamePlateOption ( " NPAuraOnEternalBlades " , 255478 )
mod : AddNamePlateOption ( " NPAuraOnVulnerability " , 255418 )
--Stage Three Mythic
mod : AddTimerLine ( ENCOUNTER_JOURNAL_SECTION_FLAG12 ) --Mythic 3
local warnSargSentence = mod : NewTargetNoFilterAnnounce ( 257966 , 3 )
local warnEdgeofAnni = mod : NewCountAnnounce ( 258834 , 4 )
local warnSoulRendingScythe = mod : NewStackAnnounce ( 258838 , 2 , nil , " Tank " )
local specWarnSargSentence = mod : NewSpecialWarningYou ( 257966 , nil , nil , nil , 1 , 2 )
local yellSargSentence = mod : NewShortYell ( 257966 , L.Sentence )
local yellSargSentenceFades = mod : NewShortFadesYell ( 257966 )
local specWarnApocModule = mod : NewSpecialWarningSwitchCount ( 258029 , " Dps " , nil , nil , 3 , 2 ) --EVERYONE
local specWarnEdgeofAnni = mod : NewSpecialWarningDodge ( 258834 , nil , nil , nil , 2 , 2 )
local specWarnSoulrendingScythe = mod : NewSpecialWarningStack ( 258838 , nil , 2 , nil , nil , 1 , 2 )
local specWarnSoulrendingScytheTaunt = mod : NewSpecialWarningTaunt ( 258838 , nil , nil , nil , 1 , 2 )
local timerSoulrendingScytheCD = mod : NewCDTimer ( 8.5 , 258838 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON , nil , 2 , 3 )
local timerSargSentenceCD = mod : NewTimer ( 35.2 , " timerSargSentenceCD " , 257966 , nil , nil , 3 , DBM_COMMON_L.HEROIC_ICON )
local timerEdgeofAnniCD = mod : NewCDTimer ( 5.5 , 258834 , nil , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON )
--Stage Four: The Gift of Life, The Forge of Loss (Non Mythic)
mod : AddTimerLine ( SCENARIO_STAGE : format ( 4 ) )
local warnGiftOfLifebinder = mod : NewCastAnnounce ( 257619 , 1 )
local warnDeadlyScythe = mod : NewStackAnnounce ( 258039 , 2 , nil , " Tank " )
local specWarnEmberofRage = mod : NewSpecialWarningDodge ( 257299 , nil , nil , nil , 2 , 2 )
local specWarnDeadlyScythe = mod : NewSpecialWarningStack ( 258039 , nil , 2 , nil , nil , 1 , 2 )
local specWarnDeadlyScytheTaunt = mod : NewSpecialWarningTaunt ( 258039 , nil , nil , nil , 1 , 2 )
local specWarnReorgModule = mod : NewSpecialWarningSwitchCount ( 256389 , " RangedDps " , nil , nil , 1 , 2 ) --Ranged only?
local timerDeadlyScytheCD = mod : NewCDTimer ( 5.5 , 258039 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerReorgModuleCD = mod : NewCDCountTimer ( 48.1 , 256389 , nil , nil , nil , 1 , nil , nil , nil , not mod : IsTank ( ) and 2 or nil , 4 )
local playerAvatar = false
mod.vb . phase = 1
mod.vb . coneCount = 0
mod.vb . SkyandSeaCount = 0
mod.vb . blightOrbCount = 0
mod.vb . TorturedRage = 0
mod.vb . soulBurstIcon = 3
mod.vb . moduleCount = 0
mod.vb . EdgeofObliteration = 0
mod.vb . sentenceCount = 0
mod.vb . gazeCount = 0
mod.vb . scytheCastCount = 0
mod.vb . firstscytheSwap = false
mod.vb . rangeCheckNoTouchy = false
--P3 Mythic Timers
local torturedRage = { 40 , 40 , 50 , 30 , 35 , 10 , 8 , 35 , 10 , 8 , 35 } --3 timers from method video not logs, verify by logs to improve accuracy
local sargSentenceTimers = { 53 , 56.9 , 60 , 53 , 53 } --1 timer from method video not logs, verify by logs to improve accuracy
local apocModuleTimers = { 31 , 47 , 47 , 46.6 , 53 , 53 } --Some variation detected in logs do to delay in combat log between spawn and cast (one timer from method video)
local sargGazeTimers = { 23 , 75 , 70 , 53 , 53 } --1 timer from method video not logs, verify by logs to improve accuracy
local edgeofAnni = { 5 , 5 , 90 , 5 , 45 , 5 } --All timers from method video (6:05 P3 start, 6:10, 6:15, 7:45, 7:50, 8:35, 8:40)
--Both of these should be in fearCheck object for efficiency but with uncertainty of async, I don't want to come back and fix this later. Doing it this way ensures without a doubt it'll work by calling on load and again on combatstart
local tankStacks = { }
local function fearCheck ( self )
self : Unschedule ( fearCheck )
if DBM : UnitDebuff ( " player " , 257931 ) then
local comboActive = false
if DBM : UnitDebuff ( " player " , 250669 ) then
yellSargFearCombo : Yell ( L.Burst )
comboActive = true
elseif DBM : UnitDebuff ( " player " , 251570 ) then
yellSargFearCombo : Yell ( L.Bomb )
comboActive = true
elseif DBM : UnitDebuff ( " player " , 257966 ) then
yellSargFearCombo : Yell ( L.Sentence )
comboActive = true
elseif DBM : UnitDebuff ( " player " , 248396 ) then
yellSargFearCombo : Yell ( L.Blight )
comboActive = true
end
if comboActive then
self : Schedule ( 2 , fearCheck , self )
end
end
end
local function ToggleRangeFinder ( self , hide )
if self : IsTank ( ) or not self.Options . RangeFrame then return end --Tanks don't get rage
if not hide then
specWarnSargGaze : Show ( )
specWarnSargGaze : Play ( " range5 " )
DBM.RangeCheck : Show ( 5 )
self.vb . rangeCheckNoTouchy = true --Prevent SPELL_AURA_REMOVED of revious rage closing range finder during window we're expecting next rage
end
if hide and not DBM : UnitDebuff ( " player " , 257869 ) then
DBM.RangeCheck : Hide ( )
self.vb . rangeCheckNoTouchy = false
end
end
local function startAnnihilationStuff ( self , quiet )
self.vb . EdgeofObliteration = self.vb . EdgeofObliteration + 1
if quiet then --Second cast within 5 second period, do a quiet 2nd warn
warnEdgeofAnni : Show ( self.vb . EdgeofObliteration )
else --Special warning
specWarnEdgeofAnni : Show ( self.vb . EdgeofObliteration )
specWarnEdgeofAnni : Play ( " watchstep " )
end
local timer = edgeofAnni [ self.vb . EdgeofObliteration + 1 ]
if timer then
timerEdgeofAnniCD : Start ( timer , self.vb . EdgeofObliteration + 1 )
self : Schedule ( timer , startAnnihilationStuff , self , timer < 6 )
end
end
--[[
local function checkForMissingSentence ( self )
self : Unschedule ( checkForMissingSentence )
self.vb . sentenceCount = self.vb . sentenceCount + 1
local timer = sargSentenceTimers [ self.vb . sentenceCount + 1 ]
if timer then
timerSargSentenceCD : Start ( timer - 10 , self.vb . sentenceCount + 1 ) --Timer minus 10 or next expected sentence cast
self : Schedule ( timer , checkForMissingSentence , self ) --10 seconds after expected sentence cast
end
DBM : Debug ( " checkForMissingSentence ran, which means all sentence immuned " , 2 )
end
--]]
local function delayedBoonCheck ( self )
specWarnSoulbombMoveTo : Show ( DBM_COMMON_L.EDGE )
specWarnSoulbombMoveTo : Play ( " bombnow " ) --Detonate Soon makes more sense than "run to edge" which is still too assumptive
end
local updateInfoFrame
do
local lines = { }
local sortedLines = { }
local function addLine ( key , value )
-- sort by insertion order
lines [ key ] = value
sortedLines [ # sortedLines + 1 ] = key
end
updateInfoFrame = function ( )
table.wipe ( lines )
table.wipe ( sortedLines )
--Boss Powers first
for i = 1 , 5 do
local uId = " boss " .. i
--Primary Power
local currentPower , maxPower = UnitPower ( uId ) , UnitPowerMax ( uId )
if maxPower and maxPower ~= 0 then --Prevent division by 0 in addition to filtering non existing units that may still return false on UnitExists()
if currentPower / maxPower * 100 >= 1 then
addLine ( UnitName ( uId ) , currentPower )
end
end
--Alternate Power
local currentAltPower , maxAltPower = UnitPower ( uId , 10 ) , UnitPowerMax ( uId , 10 )
if maxAltPower and maxAltPower ~= 0 then --Prevent division by 0 in addition to filtering non existing units that may still return false on UnitExists()
if currentAltPower / maxAltPower * 100 >= 1 then
addLine ( UnitName ( uId ) , currentAltPower )
end
end
end
--Tank Debuffs
for i = 1 , # tankStacks do
local name = tankStacks [ i ]
local uId = DBM : GetRaidUnitId ( name )
if not uId then break end
local _ , _ , currentStack = DBM : UnitDebuff ( uId , 248499 , 258039 , 258838 )
if currentStack then
addLine ( name , currentStack )
end
end
return lines , sortedLines
end
end
function mod : OnCombatStart ( delay )
playerAvatar = false
table.wipe ( tankStacks )
self.vb . phase = 1
self.vb . coneCount = 0
self.vb . SkyandSeaCount = 0
self.vb . blightOrbCount = 0
self.vb . TorturedRage = 0
self.vb . soulBurstIcon = 3
self.vb . EdgeofObliteration = 0
self.vb . moduleCount = 0
self.vb . sentenceCount = 0
self.vb . gazeCount = 0
self.vb . scytheCastCount = 0
self.vb . firstscytheSwap = false
self.vb . rangeCheckNoTouchy = false
timerSweepingScytheCD : Start ( 5.5 - delay , 1 )
timerSkyandSeaCD : Start ( 10.1 - delay , 1 )
timerTorturedRageCD : Start ( 12 - delay , 1 )
timerConeofDeathCD : Start ( 30.3 - delay , 1 )
timerBlightOrbCD : Start ( 35.2 - delay , 1 )
if self : IsMythic ( ) then
timerSargGazeCD : Start ( 8.2 - delay , 1 )
self : Schedule ( 6.2 , ToggleRangeFinder , self ) --Call Show 5 seconds Before NEXT rages get applied (2 seconds before cast + 3 sec cast time)
berserkTimer : Start ( 660 - delay )
else
berserkTimer : Start ( 720 - delay )
end
if self.Options . InfoFrame then
DBM.InfoFrame : Show ( 6 , " function " , updateInfoFrame , false , false )
end
if self.Options . NPAuraOnInevitability or self.Options . NPAuraOnCosmosSword or self.Options . NPAuraOnEternalBlades or self.Options . NPAuraOnVulnerability then
DBM : FireEvent ( " BossMod_EnableHostileNameplates " )
end
end
function mod : OnCombatEnd ( )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
if self.Options . NPAuraOnInevitability or self.Options . NPAuraOnCosmosSword or self.Options . NPAuraOnEternalBlades or self.Options . NPAuraOnVulnerability then
DBM.Nameplate : Hide ( true , nil , nil , nil , true , true )
end
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 248165 then
self.vb . coneCount = self.vb . coneCount + 1
specWarnConeofDeath : Show ( )
specWarnConeofDeath : Play ( " shockwave " )
timerConeofDeathCD : Start ( nil , self.vb . coneCount + 1 )
elseif spellId == 248317 then
self.vb . blightOrbCount = self.vb . blightOrbCount + 1
warnBlightOrb : Show ( self.vb . blightOrbCount )
timerBlightOrbCD : Start ( nil , self.vb . blightOrbCount + 1 )
elseif spellId == 257296 then
self.vb . TorturedRage = self.vb . TorturedRage + 1
warnTorturedRage : Show ( self.vb . TorturedRage )
if self : IsMythic ( ) and self.vb . phase == 3 then
local timer = torturedRage [ self.vb . TorturedRage + 1 ]
if timer then
timerTorturedRageCD : Start ( timer , self.vb . TorturedRage + 1 )
end
else
timerTorturedRageCD : Start ( nil , self.vb . TorturedRage + 1 )
end
elseif spellId == 255594 then
self.vb . SkyandSeaCount = self.vb . SkyandSeaCount + 1
timerSkyandSeaCD : Start ( nil , self.vb . SkyandSeaCount + 1 )
elseif spellId == 252516 then
warnDiscsofNorg : Show ( )
timerDiscsofNorg : Start ( )
elseif spellId == 255648 then --Golganneth's Wrath
self.vb . phase = 2
self.vb . scytheCastCount = 0
self.vb . firstscytheSwap = false
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2 ) )
timerConeofDeathCD : Stop ( )
timerBlightOrbCD : Stop ( )
timerTorturedRageCD : Stop ( )
timerSweepingScytheCD : Stop ( )
timerSkyandSeaCD : Stop ( )
timerNextPhase : Start ( 16 )
timerSweepingScytheCD : Start ( 16.8 , 1 )
timerAvatarofAggraCD : Start ( 20.9 )
timerEdgeofObliterationCD : Start ( 21 , 1 )
timerSoulBombCD : Start ( 30.3 )
timerSoulBurstCD : Start ( 30.3 , 1 )
if self : IsMythic ( ) then
self : Unschedule ( ToggleRangeFinder )
self.vb . gazeCount = 0
timerSargGazeCD : Stop ( )
timerSargGazeCD : Start ( 25.7 , 1 )
self : Schedule ( 23.7 , ToggleRangeFinder , self ) --Call Show 5 seconds Before NEXT rages get applied (2 seconds before cast + 3 sec cast time)
end
elseif spellId == 257645 then --Temporal Blast (Stage 3)
timerAvatarofAggraCD : Stop ( ) --Always cancel this here, it's not canceled by argus becoming inactive and can still be cast during argus inactive transition phase
if self.vb . phase < 3 then
self : Unschedule ( ToggleRangeFinder )
self.vb . phase = 3
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 3 ) )
timerSweepingScytheCD : Stop ( )
timerTorturedRageCD : Stop ( )
timerSoulBombCD : Stop ( )
timerSoulBurstCD : Stop ( )
timerEdgeofObliterationCD : Stop ( )
timerAvatarofAggraCD : Stop ( )
timerSargGazeCD : Stop ( )
if not self : IsMythic ( ) then
timerCosmicRayCD : Start ( 30 )
timerCosmicBeaconCD : Start ( 40 )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
end
elseif spellId == 256542 then --Reap Soul
if not self : IsMythic ( ) then
self.vb . phase = 4
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 4 ) )
if self.Options . InfoFrame then
DBM.InfoFrame : Show ( 6 , " function " , updateInfoFrame , false , false )
end
end
timerCosmicRayCD : Stop ( )
timerCosmicBeaconCD : Stop ( )
timerDiscsofNorg : Stop ( )
timerSargGazeCD : Stop ( )
self : Unschedule ( ToggleRangeFinder )
timerNextPhase : Start ( 35 ) --or 53.8
elseif spellId == 257619 then --Gift of the Lifebinder (p4/p3mythic)
warnGiftOfLifebinder : Show ( )
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 248499 then
self.vb . scytheCastCount = self.vb . scytheCastCount + 1
if self.vb . scytheCastCount == 3 then
self.vb . firstscytheSwap = true
end
timerSweepingScytheCD : Start ( 5.6 , self.vb . scytheCastCount + 1 )
elseif spellId == 258039 then
timerDeadlyScytheCD : Start ( )
elseif spellId == 258838 then --Mythic Scythe
timerSoulrendingScytheCD : Start ( )
elseif spellId == 255826 then
self.vb . EdgeofObliteration = self.vb . EdgeofObliteration + 1
specWarnEdgeofObliteration : Show ( )
specWarnEdgeofObliteration : Play ( " watchstep " )
timerEdgeofObliterationCD : Start ( nil , self.vb . EdgeofObliteration + 1 )
elseif spellId == 252729 and self : AntiSpam ( 5 , 3 ) then
timerCosmicRayCD : Start ( )
elseif spellId == 252616 and self : AntiSpam ( 5 , 4 ) then
warnCosmicBeaconCast : Show ( )
timerCosmicBeaconCD : Start ( )
elseif spellId == 256388 and self : AntiSpam ( 5 , 8 ) then --Initialization Sequence
self.vb . moduleCount = self.vb . moduleCount + 1
specWarnReorgModule : Show ( self.vb . moduleCount )
specWarnReorgModule : Play ( " killmob " )
timerReorgModuleCD : Start ( nil , self.vb . moduleCount + 1 )
elseif spellId == 258029 and self : AntiSpam ( 5 , 7 ) then --Initialization Sequence (Mythic)
self.vb . moduleCount = self.vb . moduleCount + 1
specWarnApocModule : Show ( self.vb . moduleCount )
specWarnApocModule : Play ( " killmob " )
local timer = apocModuleTimers [ self.vb . moduleCount + 1 ] or 46.6
timerReorgModuleCD : Start ( timer , self.vb . moduleCount + 1 )
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 248499 then --Heroic/non mythic
local uId = DBM : GetRaidUnitId ( args.destName )
if uId and self : IsTanking ( uId ) then
local amount = args.amount or 1
--tankStacks[args.destName] = amount
if not tContains ( tankStacks , args.destName ) then
table.insert ( tankStacks , args.destName )
end
local swapAmount = ( self : IsLFR ( ) or not self.vb . firstscytheSwap ) and 3 or 2
if amount >= swapAmount then
if args : IsPlayer ( ) then
specWarnSweepingScythe : Show ( amount )
specWarnSweepingScythe : Play ( " stackhigh " )
else --Taunt as soon as stacks are clear, regardless of stack count.
local _ , _ , _ , _ , _ , expireTime = DBM : UnitDebuff ( " player " , spellId )
local remaining
if expireTime then
remaining = expireTime - GetTime ( )
end
if not UnitIsDeadOrGhost ( " player " ) and ( not remaining or remaining and remaining < 5.6 ) then
specWarnSweepingScytheTaunt : Show ( args.destName )
specWarnSweepingScytheTaunt : Play ( " tauntboss " )
else
warnSweepingScythe : Show ( args.destName , amount )
end
end
else
warnSweepingScythe : Show ( args.destName , amount )
end
end
elseif spellId == 258039 then --Heroic
local uId = DBM : GetRaidUnitId ( args.destName )
if uId and self : IsTanking ( uId ) then
local amount = args.amount or 1
--tankStacks[args.destName] = amount
if not tContains ( tankStacks , args.destName ) then
table.insert ( tankStacks , args.destName )
end
if amount >= 2 then
if args : IsPlayer ( ) then
specWarnDeadlyScythe : Show ( amount )
specWarnDeadlyScythe : Play ( " stackhigh " )
else
warnDeadlyScythe : Show ( args.destName , amount )
end
end
end
elseif spellId == 258838 then --Mythic
local uId = DBM : GetRaidUnitId ( args.destName )
if uId and self : IsTanking ( uId ) then
local amount = args.amount or 1
--tankStacks[args.destName] = amount
if not tContains ( tankStacks , args.destName ) then
table.insert ( tankStacks , args.destName )
end
if amount >= 2 then
if args : IsPlayer ( ) then
specWarnSoulrendingScythe : Show ( amount )
specWarnSoulrendingScythe : Play ( " stackhigh " )
else
warnSoulRendingScythe : Show ( args.destName , amount )
if amount >= 4 then
warnSoulRendingScythe : Play ( " swapsoon " )
end
end
end
end
elseif spellId == 248396 then
warnSoulblight : Show ( args.destName )
if args : IsPlayer ( ) then
specWarnSoulblight : Show ( )
specWarnSoulblight : Play ( " runout " )
yellSoulblight : Yell ( )
yellSoulblightFades : Countdown ( 8 , 4 )
fearCheck ( self )
end
elseif spellId == 250669 then
warnSoulburst : CombinedShow ( 0.3 , args.destName ) --2 Targets
if self.vb . soulBurstIcon > 7 then
self.vb . soulBurstIcon = 3
end
local icon = self.vb . soulBurstIcon
if args : IsPlayer ( ) then
specWarnSoulburst : Show ( )
specWarnSoulburst : Play ( " targetyou " )
specWarnSoulburst : ScheduleVoice ( self : IsMythic ( ) and 7 or 10 , " bombnow " )
yellSoulburst : Yell ( icon , L.Burst , icon )
yellSoulburstFades : Countdown ( self : IsMythic ( ) and 12 or 15 , 4 , icon )
fearCheck ( self )
end
if self.Options . SetIconOnSoulBurst then
self : SetIcon ( args.destName , icon )
end
self.vb . soulBurstIcon = self.vb . soulBurstIcon + 4 --Icons 3 and 7 used to match BW
elseif spellId == 251570 then
if args : IsPlayer ( ) then
specWarnSoulbomb : Show ( )
specWarnSoulbomb : Play ( " targetyou " ) --Would be better if bombrun was "bomb on you" and not "bomb on you, run". Since Don't want to give misinformation, generic it is
self : Schedule ( self : IsMythic ( ) and 5 or 8 , delayedBoonCheck , self )
yellSoulbomb : Yell ( 2 , L.Bomb , 2 )
yellSoulbombFades : Countdown ( self : IsMythic ( ) and 12 or 15 , 4 , 2 )
fearCheck ( self )
elseif playerAvatar then
specWarnSoulbombMoveTo : Show ( args.destName )
specWarnSoulbombMoveTo : Play ( " helpsoak " )
else
warnSoulbomb : Show ( args.destName )
end
if self.Options . SetIconOnSoulBomb then
self : SetIcon ( args.destName , 2 )
end
if self.vb . phase == 4 then
timerSoulBurstCD : Start ( 40 , 2 )
timerSoulBombCD : Start ( 80 )
timerSoulBurstCD : Start ( 80 , 1 )
else
timerSoulBurstCD : Start ( 19.8 , 2 )
timerSoulBombCD : Start ( 41.3 )
timerSoulBurstCD : Start ( 41.3 , 1 )
end
elseif spellId == 255199 then
if self.vb . phase == 2 then --Sometime gets cast once in p3, don't want to start timer if it does
timerAvatarofAggraCD : Start ( )
end
if args : IsPlayer ( ) then
specWarnAvatarofAggra : Show ( )
specWarnAvatarofAggra : Play ( " targetyou " )
playerAvatar = true
else
warnAvatarofAggra : Show ( args.destName )
end
if self.Options . SetIconOnAvatar then
self : SetIcon ( args.destName , 4 )
end
elseif spellId == 253021 then --Inevitability
if self.Options . NPAuraOnInevitability then
DBM.Nameplate : Show ( true , args.destGUID , spellId , nil , 20 )
end
elseif spellId == 255496 then --Sword of the Cosmos
if self.Options . NPAuraOnCosmosSword then
DBM.Nameplate : Show ( true , args.destGUID , spellId )
end
elseif spellId == 255478 then --Blades of the Eternal
if self.Options . NPAuraOnEternalBlades then
DBM.Nameplate : Show ( true , args.destGUID , spellId , nil , 40 )
end
elseif spellId == 252729 then
if args : IsPlayer ( ) then
specWarnCosmicRay : Show ( )
specWarnCosmicRay : Play ( " targetyou " )
yellCosmicRay : Yell ( )
else
warnCosmicRay : CombinedShow ( 0.3 , args.destName )
end
elseif spellId == 252616 then
warnCosmicBeacon : CombinedShow ( 0.3 , args.destName )
elseif spellId == 258647 then --Gift of Sea
warnSkyandSea : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnGiftofSea : Show ( )
specWarnGiftofSea : Play ( " targetyou " )
yellGiftofSea : Yell ( )
end
if self.Options . SetIconGift then
self : SetIcon ( args.destName , 6 )
end
elseif spellId == 258646 then --Gift of Sky
warnSkyandSea : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnGiftofSky : Show ( )
specWarnGiftofSky : Play ( " targetyou " )
yellGiftofSky : Yell ( )
end
if self.Options . SetIconGift then
self : SetIcon ( args.destName , 5 )
end
elseif spellId == 255433 or spellId == 255430 or spellId == 255429 or spellId == 255425 or spellId == 255422 or spellId == 255419 or spellId == 255418 then --Vulnerability
if self.Options . NPAuraOnVulnerability then
DBM.Nameplate : Show ( true , args.destGUID , spellId )
end
if self.Options . SetIconOnVulnerability then
if spellId == 255433 then --Arcane
self : ScanForMobs ( args.destGUID , 2 , 5 , 1 , nil , 15 )
elseif spellId == 255430 then --Shadow
self : ScanForMobs ( args.destGUID , 2 , 3 , 1 , nil , 15 )
elseif spellId == 255429 then --Fire
self : ScanForMobs ( args.destGUID , 2 , 2 , 1 , nil , 15 )
elseif spellId == 255425 then --Frost
self : ScanForMobs ( args.destGUID , 2 , 6 , 1 , nil , 15 )
elseif spellId == 255422 then --Nature
self : ScanForMobs ( args.destGUID , 2 , 4 , 1 , nil , 15 )
elseif spellId == 255419 then --Holy
self : ScanForMobs ( args.destGUID , 2 , 1 , 1 , nil , 15 )
elseif spellId == 255418 then --Melee
self : ScanForMobs ( args.destGUID , 2 , 7 , 1 , nil , 15 )
end
end
elseif spellId == 257869 then
warnSargRage : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnSargRage : Show ( )
specWarnSargRage : Play ( " scatter " )
yellSargRage : Yell ( )
end
elseif spellId == 257931 then
warnSargFear : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnSargFear : Show ( DBM_COMMON_L.ALLY )
specWarnSargFear : Play ( " gathershare " )
yellSargFear : Yell ( )
fearCheck ( self )
end
elseif spellId == 257966 then --Sentence of Sargeras
if self : AntiSpam ( 5 , 6 ) then
--self:Unschedule(checkForMissingSentence)
self.vb . sentenceCount = self.vb . sentenceCount + 1
local timer = sargSentenceTimers [ self.vb . sentenceCount + 1 ]
if timer then
timerSargSentenceCD : Start ( timer , self.vb . sentenceCount + 1 )
--self:Schedule(timer+10, checkForMissingSentence, self)--Check for missing sentence event 10 seconds after expected to recover timer if all immuned
end
end
warnSargSentence : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnSargSentence : Show ( )
specWarnSargSentence : Play ( " targetyou " )
yellSargSentence : Yell ( )
yellSargSentenceFades : Countdown ( 30 )
fearCheck ( self )
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 250669 then
if args : IsPlayer ( ) then
yellSoulburstFades : Cancel ( )
specWarnSoulburst : CancelVoice ( )
end
if self.Options . SetIconOnSoulBurst then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 251570 then
if args : IsPlayer ( ) then
self : Unschedule ( delayedBoonCheck )
yellSoulbombFades : Cancel ( )
end
if self.Options . SetIconOnSoulBomb then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 255199 then
if args : IsPlayer ( ) then
playerAvatar = false
end
if self.Options . SetIconOnAvatar then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 258647 then --Gift of Sea
if self.Options . SetIconGift then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 258646 then --Gift of Sky
if self.Options . SetIconGift then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 253021 then --Inevitability
if self.Options . NPAuraOnInevitability then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 255496 then --Sword of the Cosmos
if self.Options . NPAuraOnCosmosSword then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 255478 then --Blades of the Eternal
if self.Options . NPAuraOnEternalBlades then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 255433 or spellId == 255430 or spellId == 255429 or spellId == 255425 or spellId == 255422 or spellId == 255419 or spellId == 255418 then --Vulnerability
if self.Options . NPAuraOnVulnerability then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 248499 then
--tankStacks[args.destName] = nil
tDeleteItem ( tankStacks , args.destName )
elseif spellId == 258039 then --Heroic
--tankStacks[args.destName] = nil
tDeleteItem ( tankStacks , args.destName )
local uId = DBM : GetRaidUnitId ( args.destName )
if uId and self : IsTanking ( uId ) then
if not args : IsPlayer ( ) then --Removed from tank that's not you (only time it's removed is on death)
specWarnDeadlyScytheTaunt : Show ( args.destName )
specWarnDeadlyScytheTaunt : Play ( " tauntboss " )
end
end
elseif spellId == 258838 then --Mythic
--tankStacks[args.destName] = nil
tDeleteItem ( tankStacks , args.destName )
local uId = DBM : GetRaidUnitId ( args.destName )
if uId and self : IsTanking ( uId ) then
if not args : IsPlayer ( ) then --Removed from tank that's not you (only time it's removed is on death)
specWarnSoulrendingScytheTaunt : Show ( args.destName )
specWarnSoulrendingScytheTaunt : Play ( " tauntboss " )
end
end
elseif spellId == 257966 then --Sentence of Sargeras
if args : IsPlayer ( ) then
yellSargSentenceFades : Cancel ( )
end
elseif spellId == 248396 and args : IsPlayer ( ) then
yellSoulblightFades : Cancel ( )
elseif spellId == 257869 then
if args : IsPlayer ( ) and self.Options . RangeFrame and not self.vb . rangeCheckNoTouchy then
DBM.RangeCheck : Hide ( )
end
end
end
function mod : SPELL_INTERRUPT ( args )
if type ( args.extraSpellId ) == " number " and args.extraSpellId == 256544 then
self.vb . TorturedRage = 0
if self : IsMythic ( ) then
self : Unschedule ( ToggleRangeFinder ) --Redundant, for good measure
self.vb . gazeCount = 0
self.vb . EdgeofObliteration = 0
timerSoulrendingScytheCD : Start ( 3.5 )
timerEdgeofAnniCD : Start ( 5 , 1 )
self : Schedule ( 5 , startAnnihilationStuff , self )
timerSargGazeCD : Start ( 20.2 , 1 )
self : Schedule ( 18.2 , ToggleRangeFinder , self ) --Call Show 5 seconds Before NEXT rages get applied (2 seconds before cast + 3 sec cast time)
timerReorgModuleCD : Start ( 31.3 , 1 )
timerTorturedRageCD : Start ( 40 , 1 )
timerSargSentenceCD : Start ( 53 , 1 )
--self:Schedule(63, checkForMissingSentence, self)
else
if not self : IsHeroic ( ) then
timerSweepingScytheCD : Start ( 5 , 1 )
else
timerDeadlyScytheCD : Start ( 5 )
end
local currentPowerPercent = UnitPower ( " boss1 " ) / UnitPowerMax ( " boss1 " )
local remainingPercent
if currentPowerPercent then
remainingPercent = 1.0 - currentPowerPercent
end
if remainingPercent then
timerReorgModuleCD : Start ( 48.1 * remainingPercent , 1 )
end
timerTorturedRageCD : Start ( 10 , 1 )
timerSoulBurstCD : Start ( 20 , 1 ) --First one is only burst, afterwards it's bomb and burst then burst only again
timerSoulBombCD : Start ( 20 )
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId , spellName )
if spellId == 248167 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 5 ) then
specWarnGTFO : Show ( spellName )
specWarnGTFO : Play ( " runaway " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--"<47.47 22:23:32> [UNIT_SPELLCAST_SUCCEEDED] Argus the Unmaker(Sharmonk) [[boss1:Sargeras' Gaze::3-3769-1712-19636-258068-0047AD517B:258068]]", -- [96]
--"<47.64 22:23:32> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\Icons\\Sha_Ability_Rogue_BloodyEye_nightmare:20|t|cFFFF0000|Hspell:258068|h[Sargeras' Gaze]|h|r is cast upon the battle...#Argus the Unmaker#####0#0##0#22#nil#0#false#false#false#false"
--"<50.46 22:23:35> [CLEU] SPELL_AURA_APPLIED##nil#Player-1313-093344FD#Mehlas#257869#Sargeras' Rage#DEBUFF#nil", -- [137]
function mod : CHAT_MSG_RAID_BOSS_EMOTE ( msg )
if msg : find ( " spell:258068 " ) then
self.vb . gazeCount = self.vb . gazeCount + 1
if self.vb . phase == 2 then
timerSargGazeCD : Start ( 59.7 , self.vb . gazeCount + 1 )
elseif self.vb . phase == 3 then
local timer = sargGazeTimers [ self.vb . gazeCount + 1 ]
if timer then
timerSargGazeCD : Start ( timer , self.vb . gazeCount + 1 )
self : Unschedule ( ToggleRangeFinder )
self : Schedule ( 5 , ToggleRangeFinder , self , true ) --Call hide 2 seconds after rages go out, function will check player for debuff and decide
self : Schedule ( timer - 2 , ToggleRangeFinder , self ) --Call Show 5 seconds Before NEXT rages get applied (2 seconds before cast + 3 sec cast time)
end
else --Stage 1
timerSargGazeCD : Start ( 35.2 , self.vb . gazeCount + 1 )
self : Unschedule ( ToggleRangeFinder )
self : Schedule ( 5 , ToggleRangeFinder , self , true ) --Call hide 2 seconds after rages go out, function will check player for debuff and decide
self : Schedule ( 33.2 , ToggleRangeFinder , self ) --Call Show 5 seconds Before NEXT rages get applied (2 seconds before cast + 3 sec cast time)
end
end
end
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 257300 and self : AntiSpam ( 5 , 1 ) then --Ember of Rage
specWarnEmberofRage : Show ( )
specWarnEmberofRage : Play ( " watchstep " )
elseif spellId == 34098 and self.vb . phase == 2 then --ClearAllDebuffs (12 before Tempoeral Blast)
self : Unschedule ( ToggleRangeFinder )
self.vb . phase = 3
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 3 ) )
timerSweepingScytheCD : Stop ( )
timerTorturedRageCD : Stop ( )
timerSoulBombCD : Stop ( )
timerSoulBurstCD : Stop ( )
timerEdgeofObliterationCD : Stop ( )
timerSargGazeCD : Stop ( )
if not self : IsMythic ( ) then
timerCosmicRayCD : Start ( 42 )
timerCosmicBeaconCD : Start ( 52 )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
end
end
--RL can run this macro to auto release everyone in raid any time they hit it
--/run DBM:GetModByName("2031"):SendReleaseSync()
function mod : SendReleaseSync ( )
self : SendSync ( " Release " )
end
function mod : OnSync ( msg , sender )
if not self : IsInCombat ( ) then return end
if msg == " Release " and DBM : GetRaidRank ( sender ) == 2 then
RepopMe ( )
end
end