local mod = DBM : NewMod ( 1743 , " DBM-Raids-Legion " , 3 , 786 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240203194820 " )
mod : SetCreatureID ( 106643 )
mod : SetEncounterID ( 1872 )
mod : SetUsedIcons ( 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ) --During soft enrage will go over 8 debuffs, can't mark beyond that
mod : SetHotfixNoticeRev ( 16265 )
mod.respawnTime = 30
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 209590 209620 221864 209617 209595 210022 209971 " ,
" SPELL_CAST_SUCCESS 209597 210387 214295 214278 209615 210024 " ,
" SPELL_AURA_APPLIED 209615 209244 209973 209598 211261 232974 " ,
" SPELL_AURA_REFRESH 209973 " ,
" SPELL_AURA_APPLIED_DOSE 209615 209973 " ,
" SPELL_AURA_REMOVED 209973 209598 " ,
" SPELL_PERIODIC_DAMAGE 209433 " ,
" SPELL_PERIODIC_MISSED 209433 " ,
" PARTY_KILL " ,
" CHAT_MSG_MONSTER_YELL " ,
" CHAT_MSG_RAID_BOSS_EMOTE " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 "
)
mod : RegisterEvents (
" CHAT_MSG_MONSTER_SAY "
)
--(ability.id = 209595 or ability.id = 208807 or ability.id = 228877 or ability.id = 210022 or ability.id = 209168) and type = "begincast" or (ability.id = 209597 or ability.id = 210387 or ability.id = 214278 or ability.id = 214295 or ability.id = 208863) and type = "cast"
--Base
local warnTemporalisis = mod : NewSpellAnnounce ( 209595 , 3 )
----Recursive Elemental
local warnCompressedTime = mod : NewSpellAnnounce ( 209590 , 3 )
----Expedient Elemental
--Time Layer 1
local warnAblation = mod : NewStackAnnounce ( 209615 , 2 , nil , " Tank " )
--Time Layer 2
local warnPhase2 = mod : NewPhaseAnnounce ( 2 , 2 , nil , nil , nil , nil , nil , 2 )
local warnDelphuricBeam = mod : NewTargetAnnounce ( 214278 , 3 )
local warnAblatingExplosion = mod : NewTargetAnnounce ( 209973 , 3 )
--Time Layer 3
local warnPhase3 = mod : NewPhaseAnnounce ( 3 , 2 , nil , nil , nil , nil , nil , 2 )
local warnPermaliativeTorment = mod : NewTargetAnnounce ( 210387 , 3 , nil , " Healer " )
local warnConflexiveBurst = mod : NewTargetAnnounce ( 209598 , 4 )
--Base
local specWarnTimeElementals = mod : NewSpecialWarningSwitchCount ( 208887 , " -Healer " , DBM_CORE_L.AUTO_SPEC_WARN_OPTIONS . switch : format ( 208887 ) , nil , 1 , 2 )
----Recursive Elemental
local specWarnCompressedTime = mod : NewSpecialWarningDodge ( 209590 )
local specWarnRecursion = mod : NewSpecialWarningInterrupt ( 209620 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnBlast = mod : NewSpecialWarningInterrupt ( 221864 , " HasInterrupt " , nil , nil , 1 , 2 )
----Expedient Elemental
--local specWarnExoRelease = mod:NewSpecialWarningInterrupt(209568, "HasInterrupt", nil, nil, 1, 2)
local specWarnExpedite = mod : NewSpecialWarningInterrupt ( 209617 , " HasInterrupt " , nil , nil , 1 , 2 )
--Time Layer 1
local specWarnArcaneticRing = mod : NewSpecialWarningDodge ( 208807 , nil , nil , nil , 2 , 5 )
local specWarnAblation = mod : NewSpecialWarningTaunt ( 209615 , nil , nil , nil , 1 , 2 )
local specWarnSpanningSingularityPre = mod : NewSpecialWarningMoveTo ( 209168 , " RangedDps " , nil , 2 , 1 , 7 )
local specWarnSpanningSingularity = mod : NewSpecialWarningDodge ( 209168 , nil , nil , nil , 2 , 2 )
local specWarnSingularityGTFO = mod : NewSpecialWarningMove ( 209168 , " -Tank " , nil , 2 , 1 , 2 )
--Time Layer 2
local specWarnDelphuricBeam = mod : NewSpecialWarningYou ( 214278 , nil , nil , nil , 1 , 2 )
local yellDelphuricBeam = mod : NewYell ( 214278 , nil , false ) --off by default, because yells last longer than 3-4 seconds so yells from PERVIOUS beam are not yet gone when new beam is cast.
local specWarnEpochericOrb = mod : NewSpecialWarningSpell ( 210022 , " -Tank " , nil , 2 , 1 , 12 )
local specWarnAblationExplosion = mod : NewSpecialWarningTaunt ( 209615 , nil , nil , nil , 1 , 2 )
local specWarnAblationExplosionOut = mod : NewSpecialWarningMoveAway ( 209615 , nil , nil , nil , 1 , 2 )
local yellAblatingExplosion = mod : NewFadesYell ( 209973 )
--Time Layer 3
local specWarnConflexiveBurst = mod : NewSpecialWarningYou ( 209598 , nil , nil , nil , 1 , 2 )
local specWarnConflexiveBurstTank = mod : NewSpecialWarningTaunt ( 209598 , nil , nil , nil , 1 , 2 )
local specWarnAblativePulse = mod : NewSpecialWarningInterrupt ( 209971 , " Tank " , nil , 2 , 1 , 2 )
--Base
local timerRP = mod : NewRPTimer ( 68 )
local timerLeaveNightwell = mod : NewCastTimer ( 9.8 , 208863 , nil , nil , nil , 6 )
local timerTimeElementalsCD = mod : NewNextSourceTimer ( 16 , 208887 , 141872 , nil , nil , 1 ) --"Call Elemental" short text
local timerFastTimeBubble = mod : NewTimer ( 35 , " timerFastTimeBubble " , 209166 , nil , nil , 5 )
local timerSlowTimeBubble = mod : NewTimer ( 70 , " timerSlowTimeBubble " , 209165 , nil , nil , 5 )
--209166
--Time Layer 1
mod : AddTimerLine ( SCENARIO_STAGE : format ( 1 ) )
local timerArcaneticRing = mod : NewNextCountTimer ( 6 , 208807 , nil , nil , nil , 2 , nil , nil , nil , 1 , 4 )
--local timerAblationCD = mod:NewCDTimer(4.8, 209615, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
local timerSpanningSingularityCD = mod : NewNextCountTimer ( 16 , 209168 , nil , nil , nil , 3 )
--Time Layer 2
mod : AddTimerLine ( SCENARIO_STAGE : format ( 2 ) )
local timerDelphuricBeamCD = mod : NewNextCountTimer ( 16 , 214278 , nil , nil , nil , 3 )
local timerEpochericOrbCD = mod : NewNextCountTimer ( 16 , 210022 , nil , nil , nil , 2 , nil , DBM_COMMON_L.DEADLY_ICON )
local timerAblatingExplosion = mod : NewTargetTimer ( 6 , 209973 , nil , " Tank " )
local timerAblatingExplosionCD = mod : NewCDTimer ( 20 , 209973 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
--Time Layer 3
mod : AddTimerLine ( SCENARIO_STAGE : format ( 3 ) )
local timerConflexiveBurstCD = mod : NewNextCountTimer ( 100 , 209597 , nil , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON , nil , 3 , 4 )
--local timerAblativePulseCD = mod:NewCDTimer(9.6, 209971, nil, "Tank", nil, 4, nil, DBM_COMMON_L.TANK_ICON..DBM_COMMON_L.INTERRUPT_ICON)--12 now?
local timerPermaliativeTormentCD = mod : NewNextCountTimer ( 16 , 210387 , nil , " Healer " , nil , 5 , nil , DBM_COMMON_L.DEADLY_ICON )
local berserkTimer = mod : NewBerserkTimer ( 240 )
mod : AddRangeFrameOption ( 8 , 209973 )
mod : AddInfoFrameOption ( 209598 )
mod : AddSetIconOption ( " SetIconOnConflexiveBurst " , 209598 , true , 6 )
--Exists in phases 1-3
local heroicSlowElementalTimers = { 5 , 49 , 52 , 60 } --Heroic Jan 18
local normalSlowElementalTimers = { 5 , 49 , 41 } --Normal Jan 26
local lfrSlowElementalTimers = { 5 , 62 , 40 } --LFR Apr 2
local mythicP1SlowElementalTimers = { 5 , 39 , 75 } --Mythic Feb 5
local mythicP2SlowElementalTimers = { 5 , 39 , 45 , 30 , 30 , 30 } --Mythic Feb 5
local mythicP3SlowElementalTimers = { 5 , 54 , 55 , 30 } --Mythic Feb 5
local heroicFastElementalTimers = { 8 , 88 , 95 , 20 } --Heroic Jan 19
local normalFastElementalTimers = { 8 , 71 } --Normal Jan 26
--local lfrFastElementalTimers = {65}--LFR Apr 2 (currently unused since the first timer on phase change and combat start not started by this. Will be used if ever see second one spawn
local mythicP1FastElementalTimers = { 8 , 81.0 } --Mythic Feb 5
local mythicP2FastElementalTimers = { 8 , 51 } --Mythic Feb 5
local mythicP3FastElementalTimers = { 8 , 36 , 44 } --Mythic Feb 5
local heroicRingTimers = { 34 , 40 , 10 , 62 , 9 , 45 } --Heroic Jan 19
local normalRingTimers = { 34 , 30 , 75 , 50 } --Normal Feb 8
local mythicRingTimers = { 30 , 39 , 14.7 , 30 , 19 , 10 , 25 , 9 , 10 , 10 } --Mythic Feb 5 (figure out that 25 in middle of 10s)
local lfrRingTimers = { 21 , 30 , 37 , 35 }
local heroicSingularityTimers = { 10 , 22 , 36.0 , 57 , 65 } --Heroic Jan 18
local normalSingularityTimers = { 10 , 22 , 36.0 , 46 } --Normal Feb 2
local mythicSingularityTimers = { 10 , 53.7 , 49.8 , 45 } --Mythic April 20th
local lfrSingularityTimers = { 10 , 15 , 57 , 30 } --LFR April 2nd
--Only exist in phase 2
local heroicBeamTimers = { 72 , 57 , 60 } --Heroic Jan 18
local normalBeamTimers = { 72 , 26 , 40 } --Normal Feb 2
local mythicBeamTimers = { 67 , 50 , 65 } --Mythic Feb 5
local lfrBeamTimers = { 23.7 , 25.0 , 76.9 } --LFR April 2
--Exists in Phase 2 and Phase 3 (but cast start event missing in phase 3)
local heroicOrbTimers = { 27 , 76 , 37 , 70 , 15 , 15 , 15 } --Heroic Jan 18
local normalOrbTimers = { 27 , 56 , 31 } --Normal Feb 2
local mythicOrbTimers = { 24 , 85 , 60 , 20 , 10 } --Mythic Feb 5
local lfrOrbTimers = { 50 , 37 } --LFR Apr 2
--Only exist in phase 3 so first timer of course isn't variable
local heroicBurstTimers = { 58 , 52.0 , 56.0 , 65.0 , 10.0 , 10.0 , 10.0 , 10.0 } --Heroic Jan 21 (normal ones are different i'm sure, just no data to fix yet)
local normalBurstTimers = { 58 , 67 } --Normal Feb 2
local mythicBurstTimers = { 48 , 90 , 45 , 30 } --Mythic Feb 5
local heroicTormentTimers = { 33 , 61 , 37 , 60 } --Heroic Jan 21
local normalTormentTimers = { 33 , 41 } --Normal Feb 2
local mythicTormentTimers = { 74 , 75 , 25 , 20 } --Mythic Feb 5
mod.vb . firstElementals = false
mod.vb . slowElementalCount = 0
mod.vb . fastElementalCount = 0
mod.vb . slowBubbleCount = 0
mod.vb . fastBubbleCount = 0
mod.vb . tormentCastCount = 0
mod.vb . ringCastCount = 0
mod.vb . beamCastCount = 0
mod.vb . orbCastCount = 0
mod.vb . burstCastCount = 0
mod.vb . burstDebuffCount = 0
mod.vb . singularityCount = 1
mod.vb . phase = 1
mod.vb . transitionActive = false
--Saved Information for echos
mod.vb . totalRingCasts = 0
mod.vb . totalbeamCasts = 0
mod.vb . totalsingularityCasts = 1
function mod : OnCombatStart ( delay )
self.vb . slowElementalCount = 0
self.vb . fastElementalCount = 0
self.vb . slowBubbleCount = 0
self.vb . fastBubbleCount = 0
self.vb . tormentCastCount = 0
self.vb . ringCastCount = 0
self.vb . burstDebuffCount = 0
self.vb . singularityCount = 1 --First one on pull doesn't have an event so have to skip it in count
self.vb . phase = 1
self.vb . transitionActive = false
self.vb . totalRingCasts = 0
self.vb . totalbeamCasts = 0
self.vb . totalsingularityCasts = 1
timerLeaveNightwell : Start ( 4 - delay )
timerTimeElementalsCD : Start ( 5 - delay , SLOW )
--timerAblationCD:Start(8.5-delay)--Verify/tweak
if self : IsMythic ( ) then
timerTimeElementalsCD : Start ( 8 - delay , FAST )
timerSpanningSingularityCD : Start ( 53.7 - delay , 2 )
specWarnSpanningSingularityPre : Schedule ( 48.7 , DBM_COMMON_L.EDGE )
if self.Options . SpecWarn209168moveto then
specWarnSpanningSingularityPre : ScheduleVoice ( 48.7 , " runtoedge " )
end
timerArcaneticRing : Start ( 30 - delay , 1 )
elseif self : IsLFR ( ) then
timerSpanningSingularityCD : Start ( 15 - delay , 2 )
timerArcaneticRing : Start ( 21 - delay , 1 )
timerTimeElementalsCD : Start ( 65 - delay , FAST )
else
timerTimeElementalsCD : Start ( 8 - delay , FAST )
timerSpanningSingularityCD : Start ( 22 - delay , 2 )
timerArcaneticRing : Start ( 34 - delay , 1 )
end
end
function mod : OnCombatEnd ( )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 209590 then
warnCompressedTime : Show ( )
elseif spellId == 209620 then
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnRecursion : Show ( args.sourceName )
specWarnRecursion : Play ( " kickcast " )
end
elseif spellId == 221864 then
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnBlast : Show ( args.sourceName )
specWarnBlast : Play ( " kickcast " )
end
elseif spellId == 209617 then
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnExpedite : Show ( args.sourceName )
specWarnExpedite : Play ( " kickcast " )
end
elseif spellId == 209971 then
--timerAblativePulseCD:Start()
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnAblativePulse : Show ( args.sourceName )
specWarnAblativePulse : Play ( " kickcast " )
end
elseif spellId == 209595 then
warnTemporalisis : Show ( )
elseif spellId == 210022 and self : AntiSpam ( 15 , 4 ) then
self.vb . orbCastCount = self.vb . orbCastCount + 1
specWarnEpochericOrb : Show ( )
specWarnEpochericOrb : Play ( " catchballs " )
local nextCount = self.vb . orbCastCount + 1
local timer = self : IsMythic ( ) and mythicOrbTimers [ nextCount ] or self : IsNormal ( ) and normalOrbTimers [ nextCount ] or self : IsHeroic ( ) and heroicOrbTimers [ nextCount ] or self : IsLFR ( ) and lfrOrbTimers [ nextCount ]
if timer then
timerEpochericOrbCD : Start ( timer , nextCount )
end
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 209597 then
self.vb . burstCastCount = self.vb . burstCastCount + 1
local nextCount = self.vb . burstCastCount + 1
local timer = self : IsMythic ( ) and mythicBurstTimers [ nextCount ] or self : IsNormal ( ) and normalBurstTimers [ nextCount ] or self : IsHeroic ( ) and heroicBurstTimers [ nextCount ]
if timer then
timerConflexiveBurstCD : Start ( timer , nextCount )
end
elseif spellId == 210387 then
self.vb . tormentCastCount = self.vb . tormentCastCount + 1
local nextCount = self.vb . tormentCastCount + 1
local timer = self : IsMythic ( ) and mythicTormentTimers [ nextCount ] or self : IsNormal ( ) and normalTormentTimers [ nextCount ] or self : IsHeroic ( ) and heroicTormentTimers [ nextCount ]
if timer then
timerPermaliativeTormentCD : Start ( timer , nextCount )
end
elseif ( spellId == 214278 or spellId == 214295 ) and self : AntiSpam ( 10 , 2 ) then --Boss: 214278, Echo: 214295
self.vb . beamCastCount = self.vb . beamCastCount + 1
local nextCount = self.vb . beamCastCount + 1
if self.vb . phase == 2 then
self.vb . totalbeamCasts = self.vb . totalbeamCasts + 1
else
if nextCount > self.vb . totalbeamCasts then return end
end
local timer = self : IsMythic ( ) and mythicBeamTimers [ nextCount ] or self : IsNormal ( ) and normalBeamTimers [ nextCount ] or self : IsHeroic ( ) and heroicBeamTimers [ nextCount ] or self : IsLFR ( ) and lfrBeamTimers [ nextCount ]
if timer then
timerDelphuricBeamCD : Start ( timer , nextCount )
end
elseif spellId == 209615 then
--timerAblationCD:Start()
elseif spellId == 210024 and self : AntiSpam ( 15 , 4 ) then
self.vb . orbCastCount = self.vb . orbCastCount + 1
local nextCount = self.vb . orbCastCount + 1
local timer = self : IsMythic ( ) and mythicOrbTimers [ nextCount ] or self : IsNormal ( ) and normalOrbTimers [ nextCount ] or self : IsHeroic ( ) and heroicOrbTimers [ nextCount ] or self : IsLFR ( ) and lfrOrbTimers [ nextCount ]
if timer then
specWarnEpochericOrb : Schedule ( timer - 10 )
specWarnEpochericOrb : ScheduleVoice ( timer - 10 , " catchballs " )
timerEpochericOrbCD : Start ( timer - 10 , nextCount )
end
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 209615 then
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsTanking ( uId ) then
local amount = args.amount or 1
if amount >= 2 then
if not DBM : UnitDebuff ( " player " , args.spellName ) and not UnitIsDeadOrGhost ( " player " ) then
specWarnAblation : Show ( args.destName )
specWarnAblation : Play ( " tauntboss " )
else
warnAblation : Show ( args.destName , amount )
end
end
end
elseif spellId == 211261 then
warnPermaliativeTorment : CombinedShow ( 0.5 , args.destName )
elseif spellId == 209244 then --Could still use more, but this is only spell ID on heroic that was used for debuff.
warnDelphuricBeam : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnDelphuricBeam : Show ( )
specWarnDelphuricBeam : Play ( " targetyou " )
yellDelphuricBeam : Yell ( )
end
elseif spellId == 209973 then
warnAblatingExplosion : Show ( args.destName )
timerAblatingExplosion : Start ( args.destName )
timerAblatingExplosionCD : Start ( )
if args : IsPlayer ( ) then
specWarnAblationExplosionOut : Show ( )
specWarnAblationExplosionOut : Play ( " runout " )
yellAblatingExplosion : Cancel ( )
yellAblatingExplosion : Schedule ( 3 , 3 )
yellAblatingExplosion : Schedule ( 4 , 2 )
yellAblatingExplosion : Schedule ( 5 , 1 )
if self.Options . RangeFrame then
DBM.RangeCheck : Show ( 8 )
end
else
specWarnAblationExplosion : Show ( args.destName )
specWarnAblationExplosion : Play ( " tauntboss " )
end
elseif spellId == 209598 then
self.vb . burstDebuffCount = self.vb . burstDebuffCount + 1
warnConflexiveBurst : CombinedShow ( 0.5 , args.destName )
local uId = DBM : GetRaidUnitId ( args.destName )
if args : IsPlayer ( ) then
specWarnConflexiveBurst : Show ( )
specWarnConflexiveBurst : Play ( " targetyou " )
elseif self : IsTanking ( uId , " boss1 " ) then
specWarnConflexiveBurstTank : Show ( args.destName )
specWarnConflexiveBurstTank : Play ( " tauntboss " )
end
if self.Options . SetIconOnConflexiveBurst then
self : SetAlphaIcon ( 0.5 , args.destName )
end
if self.Options . InfoFrame and not DBM.InfoFrame : IsShown ( ) then
DBM.InfoFrame : SetHeader ( args.spellName )
DBM.InfoFrame : Show ( 10 , " playerdebuffremaining " , args.spellName )
end
end
end
mod.SPELL_AURA_REFRESH = mod.SPELL_AURA_APPLIED
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 209973 then
timerAblatingExplosion : Stop ( args.destName )
if args : IsPlayer ( ) then
yellAblatingExplosion : Cancel ( )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
end
elseif spellId == 209598 then
self.vb . burstDebuffCount = self.vb . burstDebuffCount - 1
if args : IsPlayer ( ) then
--Cancel yells when they are added
end
if self.Options . SetIconOnConflexiveBurst then
self : SetIcon ( args.destName , 0 )
end
if self.Options . InfoFrame and self.vb . burstDebuffCount == 0 then
DBM.InfoFrame : Hide ( )
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId )
if spellId == 209433 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 5 ) then
specWarnSingularityGTFO : Show ( )
if not self : IsTank ( ) then
specWarnSingularityGTFO : Play ( " runaway " )
end
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--Done this way because it's less ugly for 1, but 2, the other way will fail if there is ever more than 1 of SAME TYPE up at once and one of them dies.
function mod : PARTY_KILL ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 105299 then -- Recursive
self : SendSync ( " SlowAddDied " )
elseif cid == 105301 then -- Expedient
self : SendSync ( " FastAddDied " )
end
end
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 211647 then --Time Stop
self.vb . transitionActive = true
self.vb . phase = self.vb . phase + 1
--self.vb.firstElementals = false
self.vb . slowElementalCount = 0
self.vb . fastElementalCount = 0
self.vb . slowBubbleCount = 0
self.vb . fastBubbleCount = 0
self.vb . ringCastCount = 0
self.vb . beamCastCount = 0
self.vb . singularityCount = 0
self.vb . orbCastCount = 0
timerArcaneticRing : Stop ( )
timerTimeElementalsCD : Stop ( )
timerSlowTimeBubble : Stop ( )
timerFastTimeBubble : Stop ( )
timerEpochericOrbCD : Stop ( )
timerSpanningSingularityCD : Stop ( )
specWarnSpanningSingularityPre : Cancel ( )
specWarnSpanningSingularityPre : CancelVoice ( )
timerDelphuricBeamCD : Stop ( )
berserkTimer : Cancel ( )
timerLeaveNightwell : Start ( )
timerSpanningSingularityCD : Start ( 10 , 1 ) --Updated Jan 18 heroic
timerTimeElementalsCD : Start ( 14.7 , SLOW ) --Updated Jan 18 heroic
if self : IsLFR ( ) then
timerTimeElementalsCD : Start ( 74.9 , FAST ) --Updated April 2
else
timerTimeElementalsCD : Start ( 17 , FAST ) --Updated Jan 18 (17-18)
end
if self.vb . phase == 2 then
warnPhase2 : Show ( )
warnPhase2 : Play ( " ptwo " )
timerAblatingExplosionCD : Start ( 22 ) --Verfied unchanged Dec 13 Heroic
if self : IsMythic ( ) then --TODO: Fine tune these as they may be hit or miss by some seconds Hard to measure precise phase changes from WCL
timerEpochericOrbCD : Start ( 23.8 , 1 )
if self.vb . ringCastCount > 0 then
timerArcaneticRing : Start ( 41.9 , 1 ) --Verified Jan 18
end
timerDelphuricBeamCD : Start ( 67 , 1 ) --Cast SUCCESS
elseif self : IsHeroic ( ) then
timerEpochericOrbCD : Start ( 27 , 1 )
if self.vb . ringCastCount > 0 then
timerArcaneticRing : Start ( 45.7 , 1 ) --Verified Jan 18
end
timerDelphuricBeamCD : Start ( 72 , 1 ) --Cast SUCCESS
--LFR and Normal have no rings. LFR has no beams
elseif self : IsLFR ( ) then
timerEpochericOrbCD : Start ( 50 , 1 )
else --Normal
timerEpochericOrbCD : Start ( 27 , 1 )
timerDelphuricBeamCD : Start ( 72 , 1 ) --Cast SUCCESS
end
elseif self.vb . phase == 3 then
warnPhase3 : Show ( )
warnPhase3 : Play ( " pthree " )
self.vb . burstCastCount = 0
timerAblatingExplosionCD : Stop ( )
yellAblatingExplosion : Cancel ( )
--timerAblativePulseCD:Start(20.5)
if self : IsMythic ( ) then
if self.vb . orbCastCount > 0 then
timerEpochericOrbCD : Start ( 24 , 1 )
specWarnEpochericOrb : Schedule ( 24 ) --Spawning isn't in combat log in phase 3, only landing, so need to use schedule for warnings
specWarnEpochericOrb : ScheduleVoice ( 24 , " catchballs " )
end
if self.vb . ringCastCount > 0 then
timerArcaneticRing : Start ( 42 , 1 ) --Verified Jan 18
end
timerConflexiveBurstCD : Start ( 48 , 1 )
timerPermaliativeTormentCD : Start ( 73.7 , 1 ) --Updated April 21 Mythic
elseif self : IsHeroic ( ) then
if self.vb . orbCastCount > 0 then
timerEpochericOrbCD : Start ( 27 , 1 )
specWarnEpochericOrb : Schedule ( 27 ) --Spawning isn't in combat log in phase 3, only landing, so need to use schedule for warnings
specWarnEpochericOrb : ScheduleVoice ( 27 , " catchballs " )
end
timerPermaliativeTormentCD : Start ( 33 , 1 )
if self.vb . ringCastCount > 0 then
timerArcaneticRing : Start ( 45.7 , 1 ) --Verified Jan 18
end
timerConflexiveBurstCD : Start ( 57.7 , 1 )
elseif self : IsLFR ( ) then
timerDelphuricBeamCD : Start ( 23.7 , 1 ) --Special exception
else --Normal
timerPermaliativeTormentCD : Start ( 33 , 1 )
timerConflexiveBurstCD : Start ( 57.7 , 1 )
end
end
elseif spellId == 208863 then
self.vb . transitionActive = false
if self : IsMythic ( ) then
if self.vb . phase == 3 then
berserkTimer : Start ( 194 )
else
berserkTimer : Start ( 199 )
end
end
elseif spellId == 209005 and not self.vb . transitionActive then --Summon Time Elemental - Slow
self.vb . slowElementalCount = self.vb . slowElementalCount + 1
--if self.vb.firstElementals then
specWarnTimeElementals : Show ( SLOW )
specWarnTimeElementals : Play ( " bigmob " )
--end
local timer
local nextCount = self.vb . slowElementalCount + 1
if self : IsMythic ( ) then
timer = self.vb . phase == 1 and mythicP1SlowElementalTimers [ nextCount ] or self.vb . phase == 2 and mythicP2SlowElementalTimers [ nextCount ] or mythicP3SlowElementalTimers [ nextCount ]
else
timer = self : IsNormal ( ) and normalSlowElementalTimers [ nextCount ] or self : IsHeroic ( ) and heroicSlowElementalTimers [ nextCount ] or self : IsLFR ( ) and lfrSlowElementalTimers [ nextCount ]
end
if timer then
timerTimeElementalsCD : Start ( timer , SLOW )
end
elseif ( spellId == 209007 or spellId == 211616 ) and not self.vb . transitionActive then --Summon Time Elemental - Fast
self.vb . fastElementalCount = self.vb . fastElementalCount + 1
--if self.vb.firstElementals then
specWarnTimeElementals : Show ( FAST )
specWarnTimeElementals : Play ( " bigmob " )
--end
local timer
local nextCount = self.vb . fastElementalCount + 1
if self : IsMythic ( ) then
timer = self.vb . phase == 1 and mythicP1FastElementalTimers [ nextCount ] or self.vb . phase == 2 and mythicP2FastElementalTimers [ nextCount ] or mythicP3FastElementalTimers [ nextCount ]
else
timer = self : IsNormal ( ) and normalFastElementalTimers [ nextCount ] or self : IsHeroic ( ) and heroicFastElementalTimers [ nextCount ]
end
if timer then
timerTimeElementalsCD : Start ( timer , FAST )
end
elseif spellId == 208887 then --Summon Time Elementals (summons both of them, used at beginning of each phase)
DBM : Debug ( " Both elementals summoned, this event still exists, probably need custom code for certain difficulties " )
elseif ( spellId == 209168 or spellId == 233013 or spellId == 233012 or spellId == 233011 or spellId == 233009 or spellId == 233010 ) and self : AntiSpam ( 4 , 3 ) and not self.vb . transitionActive then
self.vb . singularityCount = self.vb . singularityCount + 1
specWarnSpanningSingularity : Show ( )
specWarnSpanningSingularity : Play ( " watchstep " )
local nextCount = self.vb . singularityCount + 1
if self.vb . phase == 1 then
self.vb . totalsingularityCasts = self.vb . totalsingularityCasts + 1
else
if nextCount > self.vb . totalsingularityCasts then return end --There won't be any more
end
local timer = self : IsMythic ( ) and mythicSingularityTimers [ nextCount ] or self : IsNormal ( ) and normalSingularityTimers [ nextCount ] or self : IsHeroic ( ) and heroicSingularityTimers [ nextCount ] or self : IsLFR ( ) and lfrSingularityTimers [ nextCount ]
if timer then
timerSpanningSingularityCD : Start ( timer , nextCount )
if self : IsMythic ( ) then
specWarnSpanningSingularityPre : Schedule ( timer - 5 , DBM_COMMON_L.EDGE )
if self.Options . SpecWarn209168moveto then
specWarnSpanningSingularityPre : ScheduleVoice ( timer - 5 , " runtoedge " )
end
end
end
end
end
--Phase 2 and 3 do not have event for cast. CLEU is unreliable.
--CHAT_MSG_MONSTER_YELL is faster than CHAT_MSG_RAID_BOSS_EMOTE but emote doesn't require localizing, so emote exists purely as backup.
---"<441.20 14:04:16> [CHAT_MSG_MONSTER_YELL] Let the waves of time crash over you!#Echo of Elisande#####0#0##0#962#nil#0#false#false#false#false", -- [7359]
--It's now possible to do this with secondary event but it's 2 seconds slower so it should only be used as a backup with this as ideal primary still
function mod : CHAT_MSG_MONSTER_YELL ( msg , npc , _ , _ , target )
if ( msg == L.noCLEU4EchoRings or msg : find ( L.noCLEU4EchoRings ) ) then
self : SendSync ( " ArcaneticRing " ) --Syncing to help unlocalized clients
elseif ( msg == L.noCLEU4EchoOrbs or msg : find ( L.noCLEU4EchoOrbs ) ) then
self : SendSync ( " Orbs " ) --Syncing to help unlocalized clients
end
end
function mod : CHAT_MSG_MONSTER_SAY ( msg , npc , _ , _ , target )
if ( msg == L.prePullRP or msg : find ( L.prePullRP ) ) and self : LatencyCheck ( ) then
self : SendSync ( " ElisandeRP " )
end
end
--Backup to above yell, it's 2 seconds slower but works without localizing
--"<228.48 22:48:56> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\Icons\\Spell_Mage_ArcaneOrb.blp:20|t |cFFFF0000|Hspell:228877|h[Arcanetic Rings]|h|
function mod : CHAT_MSG_RAID_BOSS_EMOTE ( msg , npc , _ , _ , target )
if msg : find ( " spell:228877 " ) and self : AntiSpam ( 5 , 1 ) then
self.vb . ringCastCount = self.vb . ringCastCount + 1
specWarnArcaneticRing : Show ( )
specWarnArcaneticRing : Play ( " watchorb " )
local nextCount = self.vb . ringCastCount + 1
if self.vb . phase == 1 then
self.vb . totalRingCasts = self.vb . totalRingCasts + 1
else
if nextCount > self.vb . totalRingCasts then return end --There won't be any more
end
local timer = self : IsMythic ( ) and mythicRingTimers [ nextCount ] or self : IsNormal ( ) and normalRingTimers [ nextCount ] or self : IsHeroic ( ) and heroicRingTimers [ nextCount ] or self : IsLFR ( ) and lfrRingTimers [ nextCount ]
if timer then
timerArcaneticRing : Start ( timer - 2 , nextCount )
end
end
end
function mod : OnSync ( msg , targetname )
if msg == " ElisandeRP " and self : AntiSpam ( 10 , 6 ) then
timerRP : Start ( )
end
if not self : IsInCombat ( ) then return end
if msg == " ArcaneticRing " and self : AntiSpam ( 5 , 1 ) then
self.vb . ringCastCount = self.vb . ringCastCount + 1
specWarnArcaneticRing : Show ( )
specWarnArcaneticRing : Play ( " watchorb " )
local nextCount = self.vb . ringCastCount + 1
if self.vb . phase == 1 then
self.vb . totalRingCasts = self.vb . totalRingCasts + 1
else
if nextCount > self.vb . totalRingCasts then return end --There won't be any more
end
local timer = self : IsMythic ( ) and mythicRingTimers [ nextCount ] or self : IsNormal ( ) and normalRingTimers [ nextCount ] or self : IsHeroic ( ) and heroicRingTimers [ nextCount ] or self : IsLFR ( ) and lfrRingTimers [ nextCount ]
if timer then
timerArcaneticRing : Start ( timer , nextCount )
end
elseif msg == " Orbs " and self : AntiSpam ( 15 , 4 ) then
specWarnEpochericOrb : Cancel ( )
specWarnEpochericOrb : CancelVoice ( )
self.vb . orbCastCount = self.vb . orbCastCount + 1
specWarnEpochericOrb : Show ( )
specWarnEpochericOrb : Play ( " catchballs " )
local nextCount = self.vb . orbCastCount + 1
local timer = self : IsMythic ( ) and mythicOrbTimers [ nextCount ] or self : IsNormal ( ) and normalOrbTimers [ nextCount ] or self : IsHeroic ( ) and heroicOrbTimers [ nextCount ] or self : IsLFR ( ) and lfrOrbTimers [ nextCount ]
if timer then
timerEpochericOrbCD : Start ( timer , nextCount )
end
elseif msg == " SlowAddDied " then
self.vb . slowBubbleCount = self.vb . slowBubbleCount + 1
timerSlowTimeBubble : Start ( 70 , self.vb . slowBubbleCount )
elseif msg == " FastAddDied " then
self.vb . fastBubbleCount = self.vb . fastBubbleCount + 1
timerFastTimeBubble : Start ( 35 , self.vb . fastBubbleCount )
end
end