local mod = DBM:NewMod(2463, "DBM-Sepulcher", nil, 1195) local L = mod:GetLocalizedStrings() mod:SetRevision("20220820203945") mod:SetCreatureID(180906) mod:SetEncounterID(2529) mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7) mod:SetHotfixNoticeRev(20220314000000) mod:SetMinSyncRevision(20220314000000) --mod.respawnTime = 29 mod:RegisterCombat("combat") mod.disableHealthCombat = true--Boss stays active and even heals up after combat, we don't want these events to trigger new combat --mod:DisableIEEUCombatDetection()--Not sure if required yet --mod:DisableFriendlyDetection()--Not sure if required yet mod:RegisterEventsInCombat( "SPELL_CAST_START 361676 360977 367079 359236 364979 360115 368957 368529 359235", "SPELL_CAST_SUCCESS 365294",--361602 "SPELL_AURA_APPLIED 365297 361309 368671 368969", "SPELL_AURA_REMOVED 368671 368969 360115" -- "SPELL_PERIODIC_DAMAGE 361002 360114", -- "SPELL_PERIODIC_MISSED 361002 360114" ) --TODO, enable GTFO once it's confirmed debuff doesn't actually linger when you leave pool, misleading tooltip --TODO, infoframe for reclaim absorb shield %? --TODO, is Shatter (formerly detonation) still a dps switch warning? --[[ (ability.id = 363340 or ability.id = 363408 or ability.id = 367079 or ability.id = 361676 or ability.id = 360977 or ability.id = 359236 or ability.id = 364979 or ability.id = 360115 or ability.id = 359235) and type = "begincast" or (ability.id = 365294 or ability.id = 359235 or ability.id = 361602 or ability.id = 359236) and type = "cast" or ability.id = 365297 and type = "applydebuff" or (ability.id = 364229 or ability.id = 362056) and type = "begincast" or ability.id = 368347 and type = "applydebuff" or ability.id = 360115 and type = "removebuff" --]] --Stage One: The Reclaimer local warnReclamationForm = mod:NewCastAnnounce(359235, 2) local warnSeismicTremors = mod:NewCountAnnounce(367079, 2) local warnCrushingPrism = mod:NewTargetCountAnnounce(365297, 3, nil, "RemoveMagic", nil, nil, nil, nil, true) --Stage Two: The Shimmering Cliffs local warnRelocationForm = mod:NewCastAnnounce(359236, 2) --Stage Three: local warnEternityOverdrive = mod:NewCastAnnounce(368529, 2) --Mythic local specWarnVolatileCharges = mod:NewSpecialWarningCount(368957, nil, nil, nil, 2, 6, 4) local specWarnVolatileChargeYou = mod:NewSpecialWarningCount(368969, nil, nil, nil, 1, 2, 12) local yellVolatileCharge = mod:NewYell(368969, nil, false, 2) local yellVolatileChargeFades = mod:NewShortFadesYell(368969) --Stage One: The Reclaimer local specWarnReclaim = mod:NewSpecialWarningCount(360115, nil, nil, nil, 1, 2) local specWarnSeismicTremors = mod:NewSpecialWarningCount(367079, false, nil, nil, 1, 2)--I don't even understand mechanic anymore it's been changed so much, no idea if it should be on or off by default local specWarnEarthbreakerMissiles = mod:NewSpecialWarningMoveAway(361676, nil, 183426, nil, 2, 2) local specWarnCrushingPrism = mod:NewSpecialWarningYou(365297, nil, nil, nil, 1, 2) local specWarnLightshatterBeam = mod:NewSpecialWarningMoveTo(360977, nil, 202046, nil, 1, 2) local specWarnLightshatterBeamTaunt = mod:NewSpecialWarningTaunt(360977, nil, 202046, nil, 1, 2) --local specWarnGTFO = mod:NewSpecialWarningGTFO(361002, nil, nil, nil, 1, 8) --Stage Two: The Shimmering Cliffs local specWarnShatter = mod:NewSpecialWarningDodge(362056, nil, nil, nil, 2, 2) --Stage One: The Reclaimer local timerReclaimCD = mod:NewCDCountTimer(60, 360115, nil, nil, nil, 5) local timerSeismicTremorsCD = mod:NewCDCountTimer(26.7, 367079, nil, nil, nil, 5)--Make me count timer when leaving AI local timerEarthbreakerMissilesCD = mod:NewCDCountTimer(26.1, 361676, 183426, nil, nil, 3)--shorttext "Missiles" local timerPlanetcrackerBeamCD = mod:NewCDTimer(33.2, 369210, nil, nil, nil, 3) local timerCrushingPrismCD = mod:NewCDCountTimer(26.9, 365297, nil, nil, nil, 3, nil, DBM_COMMON_L.MAGIC_ICON) --Stage Two: The Shimmering Cliffs local timerRelocationForm = mod:NewCastTimer(6, 359236, nil, nil, nil, 6) local timerShatterCD = mod:NewCDCountTimer(6, 362056, nil, nil, nil, 5, nil, DBM_COMMON_L.DAMAGE_ICON) mod:AddInfoFrameOption(360115, true) mod:AddSetIconOption("SetIconOnCrushing2", 365297, true, false, {1, 2, 3, 4, 5, 6, 7}) mod:AddNamePlateOption("NPAuraOnFractal", 368671, true) mod:GroupSpells(368957, 368969)--Combine the cast (Charges with the debuff Charge) mod.vb.chargeCount = 0 mod.vb.tremorCount = 0 mod.vb.missilesCount = 0 mod.vb.reclaimCount = 0 mod.vb.seismicIcon = 1 mod.vb.shatterCount = 0 mod.vb.crushingCast = 0 mod.vb.crushIcon = 1 local movementTimers = { [2] = { --Shatter [364979] = {30.1, 22}, --Earthbreaker Missiles [361676] = {16.1, 26.1}, --Crushing Prism [365297] = {37.3}, --Mythic Crushing Prism [3652970] = {11.1, 26, 14}, }, [4] = { --Shatter [364979] = {24, 24, 17.9}, --Earthbreaker Missiles [361676] = {12, 18, 26}, --Crushing Prism [365297] = {47.3}, --Mythic Crushing Prism [3652970] = {8.7, 18, 17.9}, }, } local p5MissileTimers = {17, 24.5, 37.2, 12.6, 25} local p5MissileMythicTimers = {17, 24.5, 37.2}--First 3 same, 4th and 5th not function mod:OnCombatStart(delay) self:SetStage(1) self.vb.crushingCast = 0 self.vb.chargeCount = 0 self.vb.tremorCount = 0 self.vb.missilesCount = 0 self.vb.reclaimCount = 0 self.vb.seismicIcon = 1 if self:IsMythic() then--Same as post reclaimm timerSeismicTremorsCD:Start(4-delay, 1) --timerPlanetcrackerBeamCD:Start(11.6-delay)--Needs checking timerCrushingPrismCD:Start(17-delay, 1) timerEarthbreakerMissilesCD:Start(11.1-delay, 1) else--Slowed down first time around timerSeismicTremorsCD:Start(8-delay, 1) if self:IsHeroic() then timerPlanetcrackerBeamCD:Start(11.6-delay) end timerCrushingPrismCD:Start(21-delay, 1) timerEarthbreakerMissilesCD:Start(43-delay, 1) end timerReclaimCD:Start(60, 1)--Seems same if self.Options.NPAuraOnFractal then DBM:FireEvent("BossMod_EnableHostileNameplates") end end function mod:OnCombatEnd() if self.Options.NPAuraOnFractal then DBM.Nameplate:Hide(true, nil, nil, nil, true, true) end end function mod:SPELL_CAST_START(args) local spellId = args.spellId if spellId == 367079 then self.vb.tremorCount = self.vb.tremorCount + 1 if self.Options.SpecWarn367079count then specWarnSeismicTremors:Show(self.vb.tremorCount)--Text alert doesn't sasy what to do, just count specWarnSeismicTremors:Play("specialsoon") else warnSeismicTremors:Show(self.vb.tremorCount) end timerSeismicTremorsCD:Start(nil, self.vb.tremorCount+1) elseif spellId == 361676 then self.vb.missilesCount = self.vb.missilesCount + 1 specWarnEarthbreakerMissiles:Show(self.vb.missilesCount) specWarnEarthbreakerMissiles:Play("scatter") if self.vb.stageTotality then local timer = self.vb.stageTotality == 5 and (self:IsMythic() and p5MissileMythicTimers[self.vb.missilesCount+1] or p5MissileTimers[self.vb.missilesCount+1]) or self.vb.phase == 1 and 26.1 or self:GetFromTimersTable(movementTimers, false, self.vb.stageTotality, 361676, self.vb.missilesCount+1) if timer then timerEarthbreakerMissilesCD:Start(timer, self.vb.missilesCount+1) end end elseif spellId == 360977 then if self:IsTanking("player", nil, nil, true, args.sourceGUID) then--Change to boss1 check if boss is always boss1, right now unsure specWarnLightshatterBeam:Show(L.Mote) specWarnLightshatterBeam:Play("defensive") end elseif spellId == 359236 then--Relocation Form self:SetStage(2)--Stage, as determined by dungeon journal self.vb.shatterCount = 0 self.vb.crushingCast = 0 self.vb.missilesCount = 0 warnRelocationForm:Show() timerRelocationForm:Start() --Stop stationary timers timerEarthbreakerMissilesCD:Stop() timerCrushingPrismCD:Stop() timerReclaimCD:Stop() timerSeismicTremorsCD:Stop() timerPlanetcrackerBeamCD:Stop()--Future proofing, you know, when phase is shorter than 12 seconds --Start mobile ones --Halondrus is a phase 1, 2, 1, 2 boss. --We want to distinguish between first phase 2 and second phase 2 (per dungeon journals termonology) --So this is first mod in wows history that is actually using a stageTotality check. if self.vb.stageTotality == 2 then--First movement timerEarthbreakerMissilesCD:Start(16.1, 1) timerShatterCD:Start(30.1, 1) timerCrushingPrismCD:Start(self:IsMythic() and 11.1 or 37.3, 1) else--Second movement (self.vb.stageTotality == 4) timerEarthbreakerMissilesCD:Start(12.1, 1) timerShatterCD:Start(30.1, 1) timerCrushingPrismCD:Start(47.3, 1) end if self:IsFated() then self:AffixEvent(0) end elseif spellId == 359235 then--Reclamation Form self:SetStage(1)--Stage, as determined by dungeon journal self.vb.crushingCast = 0 self.vb.chargeCount = 0 self.vb.tremorCount = 0 self.vb.reclaimCount = 0 self.vb.missilesCount = 0 warnReclamationForm:Show() --Stop mobile timers timerEarthbreakerMissilesCD:Stop()--Remove if not needed timerShatterCD:Stop() timerCrushingPrismCD:Stop() --Start Stationary ones if self.vb.stageTotality == 3 then--Second stationary (after first movement) timerSeismicTremorsCD:Start(10.1, 1) timerEarthbreakerMissilesCD:Start(17.8, 1) timerCrushingPrismCD:Start(23.1, 1) if self:IsHard() then timerPlanetcrackerBeamCD:Start(33.2) end timerReclaimCD:Start(68) else--Third stationary, after 2nd movement (stageTotality == 5) if self:IsHard() then timerPlanetcrackerBeamCD:Start(14.2) end timerEarthbreakerMissilesCD:Start(17.1, 1) end if self:IsFated() then self:AffixEvent(1, 2) end elseif spellId == 368529 then warnEternityOverdrive:Show() elseif spellId == 364979 then--Casts slightly faster than 362056 specWarnShatter:Show() specWarnShatter:Play("watchstep") if self.vb.stageTotality then local timer = self:GetFromTimersTable(movementTimers, false, self.vb.stageTotality, spellId, self.vb.shatterCount+1) if timer then timerShatterCD:Start(timer, self.vb.shatterCount+1) end end elseif spellId == 360115 then self.vb.reclaimCount = self.vb.reclaimCount + 1 specWarnReclaim:Show(self.vb.reclaimCount) specWarnReclaim:Play("attackshield") --Stop other stage timers timerSeismicTremorsCD:Stop() timerEarthbreakerMissilesCD:Stop() timerCrushingPrismCD:Stop() elseif spellId == 368957 then self.vb.chargeCount = self.vb.chargeCount + 1 specWarnVolatileCharges:Show(self.vb.chargeCount) specWarnVolatileCharges:Play("bombsoon") end end function mod:SPELL_CAST_SUCCESS(args) local spellId = args.spellId if spellId == 365294 then DBM:Debug("Crushing Prism unhidden from combat log. Notify DBM Authors") end end function mod:SPELL_AURA_APPLIED(args) local spellId = args.spellId if spellId == 365297 then if self:AntiSpam(5, 2) then self.vb.crushIcon = 1 self.vb.crushingCast = self.vb.crushingCast + 1 if self.vb.stageTotality then --use tabled timers during movements, regular CD during stanary subject to ICD live updates local checkedId = self:IsMythic() and 3652970 or 365297 local timer = self.vb.phase == 1 and 26 or self:GetFromTimersTable(movementTimers, false, self.vb.stageTotality, checkedId, self.vb.crushingCast+1) if timer then timerCrushingPrismCD:Start(timer, self.vb.crushingCast+1) end end end if args:IsPlayer() then specWarnCrushingPrism:Show() specWarnCrushingPrism:Play("targetyou") end if self.Options.SetIconOnCrushing2 and self.vb.crushIcon < 8 then self:SetIcon(args.destName, self.vb.crushIcon) end warnCrushingPrism:CombinedShow(0.5, self.vb.crushingCast, args.destName) self.vb.crushIcon = self.vb.crushIcon + 1 elseif spellId == 361309 and not args:IsPlayer() then--and not DBM:UnitDebuff("player", spellId) local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId) local remaining if expireTime then remaining = expireTime-GetTime() end if (not remaining or remaining and remaining < 3) and not UnitIsDeadOrGhost("player") then specWarnLightshatterBeamTaunt:Show(args.destName) specWarnLightshatterBeamTaunt:Play("tauntboss") end elseif spellId == 368671 then if self.Options.NPAuraOnFractal then DBM.Nameplate:Show(true, args.destGUID, spellId) end elseif spellId == 368969 then if args:IsPlayer() then specWarnVolatileChargeYou:Show() specWarnVolatileChargeYou:Play("bombyou") yellVolatileCharge:Yell() yellVolatileChargeFades:Countdown(spellId, 3) end end end function mod:SPELL_AURA_REMOVED(args) local spellId = args.spellId if spellId == 368671 then if self.Options.NPAuraOnFractal then DBM.Nameplate:Hide(true, args.destGUID, spellId) end elseif spellId == 368969 then if args:IsPlayer() then yellVolatileChargeFades:Cancel() end elseif spellId == 360115 then self.vb.crushingCast = 0 self.vb.chargeCount = 0 self.vb.tremorCount = 0 self.vb.missilesCount = 0 --Seems same in reclaim form 1 and 2. and NA for 3 timerSeismicTremorsCD:Start(4, 1) timerEarthbreakerMissilesCD:Start(11, 1) timerCrushingPrismCD:Start(17, 1) timerReclaimCD:Start(62, self.vb.reclaimCount+1)--My guess confirmed end end --[[ function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName) if (spellId == 361002 or spellId == 360114) and destGUID == UnitGUID("player") and not playerDebuff and self:AntiSpam(2, 4) then specWarnGTFO:Show(spellName) specWarnGTFO:Play("watchfeet") end end mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE --]]