local mod = DBM:NewMod(2470, "DBM-Sepulcher", nil, 1195) local L = mod:GetLocalizedStrings() mod:SetRevision("20220304060202") mod:SetCreatureID(183501) mod:SetEncounterID(2553) mod:SetUsedIcons(1, 2, 3, 5, 6, 7, 8) mod:SetHotfixNoticeRev(20220303000000) mod:SetMinSyncRevision(20220123000000) --mod.respawnTime = 29 mod:RegisterCombat("combat") mod:RegisterEventsInCombat( "SPELL_CAST_START 363485 365682 362841 362801 362849 364040", "SPELL_CAST_SUCCESS 362885 364040 366752 362721 363258 364465 364030 367711", "SPELL_AURA_APPLIED 365577 365681 365701 362615 362614 362803 362882", "SPELL_AURA_APPLIED_DOSE 365681", "SPELL_AURA_REMOVED 365577 365701 363034 363139 362615 362614 362803", -- "SPELL_PERIODIC_DAMAGE", -- "SPELL_PERIODIC_MISSED", "UNIT_DIED", "UNIT_SPELLCAST_SUCCEEDED boss1" ) --TODO, what to really do with https://ptr.wowhead.com/spell=365745/rotary-body-armor --TODO, how does Gunship/hyperlight barrage work? Probably https://ptr.wowhead.com/spell=364376/hyperlight-barrage 3 sec periodic trigger --TODO, possibly sequence out timers for certain things, like P2 Glpyh might actually be 40, 42, 37 --[[ (ability.id = 363485 or ability.id = 362841 or ability.id = 362801 or ability.id = 362849) and type = "begincast" or (ability.id = 367711 or ability.id = 362885 or ability.id = 366752 or ability.id = 364040 or ability.id = 362721 or ability.id = 363258 or ability.id = 364465) and type = "cast" or (ability.id = 363034 or ability.id = 363139) and type = "removebuff" or (ability.id = 365682 or ability.id = 364040) and type = "begincast" or ability.id = 364030 and type = "cast" --]] --Forerunner Relic mod:AddTimerLine(DBM:EJ_GetSectionInfo(24215)) local specWarnForerunnerRings = mod:NewSpecialWarningDodgeCount(363520, nil, nil, nil, 2, 2) local timerForerunnerRingsCD = mod:NewNextCountTimer(30, 363520, nil, nil, nil, 3) --Stage One: Cartel Xy mod:AddTimerLine(DBM:EJ_GetSectionInfo(24588)) local warnDimensionalTear = mod:NewTargetNoFilterAnnounce(362615, 3, nil, nil, 67833) local warnStasisTrap = mod:NewTargetNoFilterAnnounce(362882, 2)--Failing to dodge it local specWarnDimensionalTear = mod:NewSpecialWarningYouPos(362615, nil, 67833, nil, 1, 2) local yellDimensionalTear = mod:NewPosYell(362615, 67833) local yellDimensionalTearFades = mod:NewIconFadesYell(362615, 67833) local specWarnCartelElite = mod:NewSpecialWarningSwitch(363485, "-Healer", nil, nil, 1, 2, 4) local specWarnGlyphofRelocation = mod:NewSpecialWarningMoveAway(362803, nil, nil, nil, 1, 2) local yellGlyphofRelocation = mod:NewYell(362803) local yellGlyphofRelocationFades = mod:NewShortFadesYell(362803) local specWarnGlyphofRelocationTaunt = mod:NewSpecialWarningTaunt(362803, nil, nil, nil, 1, 2) local specWarnStasisTrap = mod:NewSpecialWarningDodge(362882, nil, nil, nil, 2, 2) local yellStasisTrap = mod:NewYell(362882)--Failing to dodge it local specWarnHyperlightSpark = mod:NewSpecialWarningCount(362849, nil, nil, nil, 2, 2) local timerDimensionalTearCD = mod:NewNextTimer(8, 362615, 327770, nil, nil, 3) local timerCartelEliteCD = mod:NewCDTimer(28.8, 363485, nil, nil, nil, 1, nil, DBM_COMMON_L.MYTHIC_ICON) local timerGlyphofRelocationCD = mod:NewCDCountTimer(60, 362801, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON) local timerGlyphExplostion = mod:NewTargetTimer(5, 362803, nil, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON) local timerStasisTrapCD = mod:NewCDTimer(30, 362882, nil, nil, nil, 3)--28-32. it attemts to average 30 but has ~2 in either direction for some reason local timerHyperlightSparknovaCD = mod:NewCDCountTimer(30, 362849, nil, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON)--28-34 --local berserkTimer = mod:NewBerserkTimer(600) mod:AddSetIconOption("SetIconOnWormhole", 362615, true, false, {1, 2}) mod:AddSetIconOption("SetIconGlyphofRelocation", 362803, false, false, {3}) --mod:AddRangeFrameOption("8") --mod:AddInfoFrameOption(328897, true) --Stage Two: Secrets of the Relic mod:AddTimerLine(DBM:EJ_GetSectionInfo(24589)) local warnDecipherRelic = mod:NewSpellAnnounce(363139, 2) local warnDecipherRelicOver = mod:NewEndAnnounce(363139, 2) --Xy Reinforcements local warnRiftBlasts = mod:NewSpellAnnounce(362841, 2) local warnMassiveBlast = mod:NewStackAnnounce(365681, 2, nil, "Tank|Healer") local warnHyperlightAscension = mod:NewCastAnnounce(364040, 3) local specWarnFracturingRiftBlasts = mod:NewSpecialWarningDodge(362841, false, nil, nil, 2, 2, 4)--Mythic only, kinda spammy so off by default local specWarnMassiveBlast = mod:NewSpecialWarningDefensive(365681, nil, nil, nil, 1, 2) local specWarnMassiveBlastTaunt = mod:NewSpecialWarningTaunt(365681, nil, nil, nil, 1, 2) local specWarnDebilitatingRay = mod:NewSpecialWarningInterruptCount(364030, "HasInterrupt", nil, nil, 1, 2) local timerRiftBlastsCD = mod:NewCDTimer(6, 362841, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)--Initial ones only on phasing, after that they can get kinda desynced plus very frequent local timerMassiveBlastCD = mod:NewCDTimer(11.5, 365681, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--11.5-12.2 --local timerDebilitatingRayCD = mod:NewAITimer(28.8, 364030, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON) mod:AddSetIconOption("SetIconOnHyperlightAdds", 364021, true, true, {4, 5, 6, 7, 8}) mod:AddNamePlateOption("NPAuraOnDecipherRelic", 363139, true) mod:AddNamePlateOption("NPAuraOnOverseersOrders", 365701, true) mod:AddNamePlateOption("NPAuraOnAscension", 364040, true) mod:GroupSpells(362801, 362803)--Group relocation with explosion mod:GroupSpells(362885, 362885)--Group statis trap cast with stasis trap debuff local castsPerGUID = {} mod.vb.tearIcon = 1 mod.vb.sparkCount = 0 mod.vb.ringCount = 0 mod.vb.glyphCount = 0 local difficultyName = "None" --This table may seem excessive, especially in phasess where they are all same (why not just go if phase 2 = then timer == 37) --The reason being they aren't ALWAYS the same, case and point glyph in stage 1, rings in stage 4 heroic --Want to be able to update timers faster on fly if fight continues to get hotfixes, this gives most rapidly changable knobs local allTimers = { ["easy"] = {--Normal, and LFR [1] = {--Unchanged --Rings [364465] = 30, --Glyph of Relocation [362801] = 60,--Don't even know if it's still 60 anymore, they buffed it. --Stasis Trap [362885] = 30, --Hyperlight Sparknova [362849] = 30, }, [2] = {--Gets a little slower --Rings [364465] = 37.4, --Glyph of Relocation [362801] = 37.4, --Stasis Trap [362885] = 37.4, --Hyperlight Sparknova [362849] = 37.4, }, [3] = {--Gets even slower --Rings [364465] = 37.4, --Glyph of Relocation [362801] = 37.4, --Stasis Trap [362885] = 37.4, --Hyperlight Sparknova [362849] = 37.4, }, [4] = { --Rings [364465] = 42.8, --Glyph of Relocation [362801] = 42.8, --Stasis Trap [362885] = 42.8, --Hyperlight Sparknova [362849] = 42.8, }, }, ["heroic"] = { [1] = {--Unchanged --Rings [364465] = 30, --Glyph of Relocation [362801] = 60,--Don't even know if it's still 60 anymore, they buffed it. --Stasis Trap [362885] = 30, --Hyperlight Sparknova [362849] = 30, }, [2] = {--Gets a little slower --Rings [364465] = 33.3, --Glyph of Relocation [362801] = 33.3, --Stasis Trap [362885] = 33.3, --Hyperlight Sparknova [362849] = 33.3, }, [3] = {--Gets even slower --Rings [364465] = 33.3, --Glyph of Relocation [362801] = 33.3, --Stasis Trap [362885] = 33.3, --Hyperlight Sparknova [362849] = 33.3, }, [4] = { --Rings [364465] = 40, --Glyph of Relocation [362801] = 40,--assumed not confirmed --Stasis Trap [362885] = 40, --Hyperlight Sparknova [362849] = 38.6,--Shorter than others? }, }, ["mythic"] = { [1] = {--Original --Rings [364465] = 30, --Glyph of Relocation [362801] = 60, --Stasis Trap [362885] = 30, --Hyperlight Sparknova [362849] = 30, }, [2] = {--Assumed unchanged, hotfixes said non mythic --Rings [364465] = 30, --Glyph of Relocation [362801] = 30, --Stasis Trap [362885] = 30, --Hyperlight Sparknova [362849] = 30, }, [3] = {--Assumed unchanged, hotfixes said non mythic --Rings [364465] = 30, --Glyph of Relocation [362801] = 30, --Stasis Trap [362885] = 30, --Hyperlight Sparknova [362849] = 30, }, [4] = {--Assumed has original change to 33 that was applied to all difficulties --Rings [364465] = 33, --Glyph of Relocation [362801] = 33, --Stasis Trap [362885] = 33, --Hyperlight Sparknova [362849] = 33, }, }, } function mod:OnCombatStart(delay) self:SetStage(1) self.vb.sparkCount = 0 self.vb.ringCount = 0 self.vb.glyphCount = 0 --For the time being, initial pull timers stil same on all difficulties --This will probably be changed soon enough :D timerDimensionalTearCD:Start(7.9-delay) timerHyperlightSparknovaCD:Start(14-delay, 1) timerStasisTrapCD:Start(21-delay) timerForerunnerRingsCD:Start(26-delay, 1) if self:IsMythic() then difficultyName = "mythic" timerCartelEliteCD:Start(13.4-delay) timerRiftBlastsCD:Start(13.6-delay) timerGlyphofRelocationCD:Start(44.4-delay, 1)--Only different on pull, it's 40 on phase changes like other modes else if self:IsHeroic() then difficultyName = "heroic" else difficultyName = "easy" end timerGlyphofRelocationCD:Start(39.9-delay, 1) end -- if self.Options.InfoFrame then -- DBM.InfoFrame:SetHeader(DBM:GetSpellInfo(328897)) -- DBM.InfoFrame:Show(10, "table", ExsanguinatedStacks, 1) -- end if self.Options.NPAuraOnDecipherRelic or self.Options.NPAuraOnOverseersOrder or self.Options.NPAuraOnAscension then DBM:FireEvent("BossMod_EnableHostileNameplates") end end function mod:OnCombatEnd() table.wipe(castsPerGUID) -- if self.Options.InfoFrame then -- DBM.InfoFrame:Hide() -- end if self.Options.NPAuraOnDecipherRelic or self.Options.NPAuraOnOverseersOrder or self.Options.NPAuraOnAscension then DBM.Nameplate:Hide(true, nil, nil, nil, true, true) end end function mod:OnTimerRecovery() if self:IsMythic() then difficultyName = "mythic" elseif self:IsHeroic() then difficultyName = "heroic" else difficultyName = "easy" end end function mod:SPELL_CAST_START(args) local spellId = args.spellId if spellId == 363485 then DBM:AddMsg("The Cartel Elite added to combat log, notify DBM authors") elseif spellId == 365682 then if self:IsTanking("player", nil, nil, nil, args.sourseGUID) then specWarnMassiveBlast:Show() specWarnMassiveBlast:Play("defensive") end timerMassiveBlastCD:Start(11.5, args.sourceGUID) elseif spellId == 362841 and self:AntiSpam(3, 1) then if self.Options.SpecWarn362841dodge then specWarnFracturingRiftBlasts:Show() specWarnFracturingRiftBlasts:Play("farfromline") else warnRiftBlasts:Show() end -- timerRiftBlastsCD:Start() elseif spellId == 362801 then self.vb.glyphCount = self.vb.glyphCount + 1 local timer = allTimers[difficultyName][self.vb.phase][spellId] if timer then timerGlyphofRelocationCD:Start(timer, self.vb.glyphCount+1) end elseif spellId == 362849 then self.vb.sparkCount = self.vb.sparkCount + 1 specWarnHyperlightSpark:Show(self.vb.sparkCount) specWarnHyperlightSpark:Play("aesoon") local timer = allTimers[difficultyName][self.vb.phase][spellId] if timer then timerHyperlightSparknovaCD:Start(timer, self.vb.sparkCount+1) end elseif spellId == 364040 then if self:AntiSpam(2, 2) then warnHyperlightAscension:Show() end if self.Options.NPAuraOnAscension then DBM.Nameplate:Show(true, args.sourceGUID, spellId, nil, 10) end end end function mod:SPELL_CAST_SUCCESS(args) local spellId = args.spellId if (spellId == 362885 or spellId == 366752) and self:AntiSpam(10, 3) then--362885 verified on heroic specWarnStasisTrap:Show() specWarnStasisTrap:Play("watchstep") local timer = allTimers[difficultyName][self.vb.phase][362885] if timer then timerStasisTrapCD:Start(timer) end elseif spellId == 364040 then if self.Options.NPAuraOnAscension then DBM.Nameplate:Hide(true, args.sourceGUID, spellId) end elseif spellId == 362721 then self.vb.tearIcon = 1 elseif spellId == 363258 then--Decipher Relic, Slightly faster than SPELL_CAST_START/APPLIED warnDecipherRelic:Show() --Stop timers timerForerunnerRingsCD:Stop() timerCartelEliteCD:Stop() timerRiftBlastsCD:Stop() timerDimensionalTearCD:Stop() timerGlyphofRelocationCD:Stop() timerHyperlightSparknovaCD:Stop() timerStasisTrapCD:Stop() --Only scan for acolytes and mark them with skull and cross, then stop scanning if self.Options.SetIconOnHyperlightAdds then self:ScanForMobs(184140, 0, 8, 2, {184140, 184143}, 12, "SetIconOnHyperlightAdds") end --Secondary scan that's marking Debilitators with 6 5 and 4 if self.Options.SetIconOnHyperlightAdds then self:ScanForMobs(183707, 0, 6, 3, nil, 12, "SetIconOnHyperlightAdds") end elseif spellId == 364465 then self.vb.ringCount = self.vb.ringCount + 1 specWarnForerunnerRings:Show(self.vb.ringCount) specWarnForerunnerRings:Play("watchwave") local timer = allTimers[difficultyName][self.vb.phase][spellId] if timer then timerForerunnerRingsCD:Start(timer, self.vb.ringCount+1) end elseif spellId == 364030 then if not castsPerGUID[args.sourceGUID] then--Shouldn't happen, but failsafe castsPerGUID[args.sourceGUID] = 0 end castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1 local count = castsPerGUID[args.sourceGUID] -- timerDebilitatingRayCD:Start(17, count, args.sourceGUID) if self:CheckInterruptFilter(args.sourceGUID, false, false) then specWarnDebilitatingRay:Show(args.sourceName, count) if count == 1 then specWarnDebilitatingRay:Play("kick1r") elseif count == 2 then specWarnDebilitatingRay:Play("kick2r") elseif count == 3 then specWarnDebilitatingRay:Play("kick3r") elseif count == 4 then specWarnDebilitatingRay:Play("kick4r") elseif count == 5 then specWarnDebilitatingRay:Play("kick5r") else specWarnDebilitatingRay:Play("kickcast") end end elseif spellId == 367711 then--Decipher Relic (Stage 4 version) self:SetStage(4) self.vb.sparkCount = 0 self.vb.ringCount = 0 self.vb.glyphCount = 0 warnDecipherRelic:Show() --Stop timers timerForerunnerRingsCD:Stop() timerCartelEliteCD:Stop() timerRiftBlastsCD:Stop() timerDimensionalTearCD:Stop() timerGlyphofRelocationCD:Stop() timerHyperlightSparknovaCD:Stop() timerStasisTrapCD:Stop() if self:IsMythic() then --Assuming they are still using march 1st version of hotfixes until seeing otherwise timerHyperlightSparknovaCD:Start(15.5, 1) timerDimensionalTearCD:Start(22) timerStasisTrapCD:Start(23) timerForerunnerRingsCD:Start(28, 1) timerGlyphofRelocationCD:Start(44, 1) --TODO: Could be changed since other stuff was, review! timerCartelEliteCD:Start(12) timerRiftBlastsCD:Start(12.2) elseif self:IsHeroic() then --Timers on non mythic even more altered on P4 start with march 3rd hotfixes timerHyperlightSparknovaCD:Start(18.6, 1) timerStasisTrapCD:Start(28) timerDimensionalTearCD:Start(33.3) timerForerunnerRingsCD:Start(36, 1) timerGlyphofRelocationCD:Start(53.3, 1) else--Normal, LFR --Timers on non mythic even more altered on P4 start with march 3rd hotfixes timerHyperlightSparknovaCD:Start(20, 1) timerStasisTrapCD:Start(30) timerDimensionalTearCD:Start(35.7) timerForerunnerRingsCD:Start(38.5, 1) timerGlyphofRelocationCD:Start(57.1, 1) end end end function mod:SPELL_AURA_APPLIED(args) local spellId = args.spellId if spellId == 365577 then if self.Options.NPAuraOnDecipherRelic then DBM.Nameplate:Show(true, args.sourceGUID, spellId, nil, 25) end elseif spellId == 365701 then if self.Options.NPAuraOnOverseersOrders then DBM.Nameplate:Show(true, args.sourceGUID, spellId) end elseif spellId == 365681 then local uId = DBM:GetRaidUnitId(args.destName) if self:IsTanking(uId) then local amount = args.amount or 1 if amount >= 2 then if not args:IsPlayer() then --Because multiple adds up on diff CDs, can't do fancy debuff remaining checks, it just needs to be gone if not DBM:UnitDebuff("player", spellId) and not UnitIsDeadOrGhost("player") then specWarnMassiveBlastTaunt:Show(args.destName) specWarnMassiveBlastTaunt:Play("tauntboss") else warnMassiveBlast:Show(args.destName, amount) end end else warnMassiveBlast:Show(args.destName, amount) end end elseif spellId == 362615 or spellId == 362614 then local icon = self.vb.tearIcon if self.Options.SetIconOnWormhole then self:SetIcon(args.destName, icon) end if args:IsPlayer() then specWarnDimensionalTear:Show(self:IconNumToTexture(icon)) specWarnDimensionalTear:Play("mm"..icon) yellDimensionalTear:Yell(icon, icon, icon) yellDimensionalTearFades:Countdown(spellId, 7, icon) end warnDimensionalTear:CombinedShow(1, args.destName) self.vb.tearIcon = self.vb.tearIcon + 1 elseif spellId == 362803 then if self.Options.SetIconGlyphofRelocation then self:SetIcon(args.destName, 3) end if args:IsPlayer() then specWarnGlyphofRelocation:Show(self.vb.destructionCount) specWarnGlyphofRelocation:Play("runout") yellGlyphofRelocation:Yell() yellGlyphofRelocationFades:Countdown(spellId) else specWarnGlyphofRelocationTaunt:Show(args.destName) specWarnGlyphofRelocationTaunt:Play("tauntboss") end timerGlyphExplostion:Start(args.destName) elseif spellId == 362882 then warnStasisTrap:CombinedShow(1, args.destName) if args:IsPlayer() then yellStasisTrap:Yell() end end end function mod:SPELL_AURA_REMOVED(args) local spellId = args.spellId if spellId == 365577 then if self.Options.NPAuraOnDecipherRelic then DBM.Nameplate:Hide(true, args.sourceGUID, spellId) end elseif spellId == 365701 then if self.Options.NPAuraOnOverseersOrders then DBM.Nameplate:Hide(true, args.sourceGUID, spellId) end elseif spellId == 363034 or spellId == 363139 then--Decipher Relic 1 min (boss casts) self:SetStage(0) self.vb.sparkCount = 0 self.vb.ringCount = 0 self.vb.glyphCount = 0 warnDecipherRelicOver:Show() if self:IsMythic() then --Restart Timers (exactly same as pull) timerDimensionalTearCD:Start(8) timerHyperlightSparknovaCD:Start(14, 1) timerStasisTrapCD:Start(21) timerForerunnerRingsCD:Start(26, 1) timerGlyphofRelocationCD:Start(40, 1) --Mythic Only timerCartelEliteCD:Start(12) timerRiftBlastsCD:Start(12.2) elseif self:IsHeroic() then --Initial timers are slowed now as of march 3rd hotfixe timerDimensionalTearCD:Start(8.8) timerHyperlightSparknovaCD:Start(15.5, 1) timerStasisTrapCD:Start(23.3) timerForerunnerRingsCD:Start(28.8, 1) timerGlyphofRelocationCD:Start(44.4, 1) else--Normal and LFR? --Initial timers are even more slowed as of march 3rd hotfixe timerDimensionalTearCD:Start(10) timerHyperlightSparknovaCD:Start(17.5, 1) timerStasisTrapCD:Start(26.2) timerForerunnerRingsCD:Start(32.5, 1) timerGlyphofRelocationCD:Start(50, 1) end elseif spellId == 362615 or spellId == 362614 then if self.Options.SetIconOnWormhole then self:SetIcon(args.destName, 0) end if args:IsPlayer() then yellDimensionalTearFades:Cancel() end elseif spellId == 362803 then if self.Options.SetIconGlyphofRelocation then self:SetIcon(args.destName, 0) end if args:IsPlayer() then yellGlyphofRelocationFades:Cancel() end timerGlyphExplostion:Stop(args.destName) end end function mod:UNIT_DIED(args) local cid = self:GetCIDFromGUID(args.destGUID) if cid == 184140 or cid == 184143 then--Xy Acolyte, Xy Archon timerMassiveBlastCD:Stop(args.destGUID) if self.Options.NPAuraOnAscension then DBM.Nameplate:Hide(true, args.destGUID, 364040) end -- elseif cid == 183707 then--Cartel Xy Debilitator end end --[[ function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName) if spellId == 340324 and destGUID == UnitGUID("player") and not playerDebuff and self:AntiSpam(2, 5) then specWarnGTFO:Show(spellName) specWarnGTFO:Play("watchfeet") end end mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE --]] --"<19.51 22:08:21> [UNIT_SPELLCAST_SUCCEEDED] Artificer Xy'mox(Bookaine) -Hyperlight Reinforcements- boss1:Cast-3-4170-2481-12807-364046-006FB27045:364046 function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId) if spellId == 365428 then specWarnCartelElite:Show() specWarnCartelElite:Play("killmob") --timerCartelEliteCD:Start() end end