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