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

627 lines
28 KiB

local mod = DBM:NewMod(1743, "DBM-Nighthold", nil, 786)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20220610054336")
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_RESFRESH = 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