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.

316 lines
13 KiB

local mod = DBM:NewMod(2458, "DBM-Sepulcher", nil, 1195)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20220908201246")
mod:SetCreatureID(180773)
mod:SetEncounterID(2512)
mod:SetHotfixNoticeRev(20220301000000)
mod:SetMinSyncRevision(20220125000000)
--mod.respawnTime = 29
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 360412 361001 360176 360162 364447",
"SPELL_CAST_SUCCESS 360412 359610 361001 360404 365315 360658 364881 360906",--364425
"SPELL_SUMMON 360848 360623",
"SPELL_AURA_APPLIED 360458 364447 359610 360415 360414 364881 364962",
"SPELL_AURA_APPLIED_DOSE 364447 360415 360414",
"SPELL_AURA_REMOVED 364881 360879",
"UNIT_DIED"
)
--TODO, improvements for https://ptr.wowhead.com/spell=360403/force-field?
--TODO, https://ptr.wowhead.com/spell=364425/surge target scanable? it's instant cast...Does it need throttle?
--TODO, adjust tank swap stacks for dissonance, if it's even swapped (and not just add soft enrage)
--TODO, https://ptr.wowhead.com/spell=360654/point-defense-drone useful?
--TODO, proper energy Conversion cast and alert prio
--[[
(ability.id = 360412 or ability.id = 360162) and type = "begincast"
or (ability.id = 359610 or ability.id = 365315 or ability.id = 360658 or ability.id = 364881 or ability.id = 360906 or ability.id = 364843) and type = "cast"
or ability.id = 360879
--]]
--General
local warnPhase = mod:NewPhaseChangeAnnounce(2, nil, nil, nil, nil, nil, 2)
--Automa
mod:AddTimerLine(DBM:EJ_GetSectionInfo(24374))
local warnUnstableCore = mod:NewTargetNoFilterAnnounce(360458, 3)
local warnForceField = mod:NewSpellAnnounce(360404, 1)
--local warnSurge = mod:NewSpellAnnounce(364425, 3)--No Longer in Journal
local warnWaveofDesintegration = mod:NewCountAnnounce(361001, 4, nil, "Melee")
local warnDissonance = mod:NewStackAnnounce(364447, 2, nil, "Tank|Healer")
local warnBlast = mod:NewSpellAnnounce(360176, 3, nil, false)--Spammy
local specWarnPreFabricatedSentry = mod:NewSpecialWarningSwitch(360658, "Tank", nil, nil, 1, 2)
local specWarnDissonance = mod:NewSpecialWarningStack(364447, nil, 3, nil, nil, 1, 6)
local specWarnDissonanceTaunt = mod:NewSpecialWarningTaunt(364447, nil, nil, nil, 1, 2)
local timerSentryCD = mod:NewNextTimer(71.2, 360658, nil, nil, nil, 1, nil, DBM_COMMON_L.TANK_ICON)--Every odd Volatile
local timerWaveofDisintegrationCD = mod:NewCDTimer(12.2, 361001, nil, nil, nil, 3)--Time between first and second cast usually 14-15 then 12.2 repeating
local timerDissonanceCD = mod:NewCDTimer(12.2, 364447, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--Second is 16-18 then rest are 12.2-14
--Stage One: Systems Online!
mod:AddTimerLine(DBM:EJ_GetSectionInfo(23875))
local warnRefractedBlast = mod:NewCountAnnounce(366693, 2)
local warnDeresolution = mod:NewTargetAnnounce(359610, 3)
local specWarnDeresolution = mod:NewSpecialWarningMoveAway(359610, nil, nil, nil, 1, 2)--Change once clear how it works
local yellDeresolution = mod:NewYell(359610)
local specWarnExposedCore = mod:NewSpecialWarningMoveTo(360412, nil, nil, nil, 3, 2)
local timerVolatileMateriumCD = mod:NewNextTimer(30.6, 365315, nil, nil, nil, 1)
local timerRefractedBlastCD = mod:NewCDCountTimer(15, 366693, nil, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON)--15 but can be delayed by shit
local timerDeresolutionCD = mod:NewCDTimer(35.3, 359610, nil, nil, nil, 3)
local timerExposedCore = mod:NewCastTimer(5, 360412, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
local timerExposedCoreCD = mod:NewCDTimer(35.3, 360412, nil, nil, nil, 2)
mod:AddInfoFrameOption(360403, true)
--Stage Two: Roll Out, then Transform
mod:AddTimerLine(DBM:EJ_GetSectionInfo(23877))
local warnMatterDisoilution = mod:NewTargetNoFilterAnnounce(364881, 4)
local specWarnSplitResolution = mod:NewSpecialWarningDefensive(360162, nil, nil, nil, 1, 2)
local specWarnPneumaticImpact = mod:NewSpecialWarningTaunt(360414, nil, nil, nil, 1, 2)
local specWarnMatterDisolution = mod:NewSpecialWarningYou(364881, nil, nil, nil, 1, 2)--Initial
local specWarnMatterDisolutionOut = mod:NewSpecialWarningMoveAway(364881, nil, nil, nil, 1, 2)--Delayed
local yellMatterDisolutionFades = mod:NewShortFadesYell(364881)
local timerSplitResolutionCD = mod:NewCDTimer(30.2, 360162, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)--30.2-34 (also acts as Pneumatic Impact timer)
local timerMatterDisolutionCD = mod:NewCDTimer(20.6, 364881, nil, nil, nil, 3)
mod:GroupSpells(360412, 360403)--Exposed Core and the shield you seek need to deal with mechanic
mod.vb.refractedCount = 0
local castsPerGUID = {}
local shieldName = DBM:GetSpellInfo(360403)
function mod:OnCombatStart(delay)
self:SetStage(1)
self.vb.refractedCount = 0
--Every fucking difficulty has different timers, because why make it easy
if self:IsMythic() then
timerVolatileMateriumCD:Start(13.3-delay)
timerRefractedBlastCD:Start(21-delay, 1)
timerDeresolutionCD:Start(46.6-delay)
timerSentryCD:Start(66-delay)
--Boss Timers
timerSplitResolutionCD:Start(46.2)
-- timerMatterDisolutionCD:Start()--Not used?
else--Heroic, Normal. LFR will probably be different too
timerVolatileMateriumCD:Start(5-delay)--5-6
timerRefractedBlastCD:Start(15.3-delay, 1)
timerDeresolutionCD:Start(36.9-delay)
timerSentryCD:Start(35-delay)
end
end
function mod:OnCombatEnd()
self:UnregisterShortTermEvents()
table.wipe(castsPerGUID)
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 360412 then
timerExposedCore:Start()
-- timerExposedCoreCD:Start(self:IsMythic() and 105 or 109)--Approx, since it is dps based after all
if not DBM:UnitAura("player", 360403) then--Use unit buff or unit debuff when known
specWarnExposedCore:Show(shieldName)
specWarnExposedCore:Play("findshelter")
end
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(shieldName)
DBM.InfoFrame:Show(10, "playerbuff", shieldName)
end
timerRefractedBlastCD:Stop()
timerDeresolutionCD:Stop()
timerRefractedBlastCD:Start(self:IsMythic() and 20 or 22.4, self.vb.refractedCount+1)
timerDeresolutionCD:Start(self:IsMythic() and 24.7 or 36)
elseif spellId == 361001 then
if not castsPerGUID[args.sourceGUID] then--Shouldn't happen, but failsafe
castsPerGUID[args.sourceGUID] = {}
castsPerGUID[args.sourceGUID][1] = 1--Diss
castsPerGUID[args.sourceGUID][2] = 1--Wave
end
warnWaveofDesintegration:Show(castsPerGUID[args.sourceGUID][2])
elseif spellId == 364447 then
if not castsPerGUID[args.sourceGUID] then--Shouldn't happen, but failsafe
castsPerGUID[args.sourceGUID] = {}
castsPerGUID[args.sourceGUID][1] = 1--Diss
castsPerGUID[args.sourceGUID][2] = 1--Wave
end
castsPerGUID[args.sourceGUID][1] = castsPerGUID[args.sourceGUID][1] + 1
timerDissonanceCD:Start(castsPerGUID[args.sourceGUID][1] == 1 and 16 or 12.2, args.sourceGUID)
elseif spellId == 360176 and self:AntiSpam(3, 1) then
warnBlast:Show()
elseif spellId == 360162 then
if self:IsTanking("player", "boss1", nil, true) then
specWarnSplitResolution:Show()
specWarnSplitResolution:Play("defensive")
end
timerSplitResolutionCD:Start()
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 360412 then--Exposed Core
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
elseif spellId == 359610 then
timerDeresolutionCD:Start()
elseif spellId == 361001 then
--Cast can be interrupted and is immediately recast, we don't want to increase cast count unless a cast succeeds
castsPerGUID[args.sourceGUID][2] = castsPerGUID[args.sourceGUID][2] + 1
timerWaveofDisintegrationCD:Start(castsPerGUID[args.sourceGUID][2] == 1 and 13.3 or 11.2, args.sourceGUID)--CD adjusted from SUCCESS --> Start, timers are 14.3 and 12.2
elseif spellId == 360404 then
warnForceField:Show()
elseif spellId == 365315 then--Volatile Materium
timerVolatileMateriumCD:Stop()--Max timer, but come early if defeated fast, per March 1st hotfixes
timerVolatileMateriumCD:Start(self:IsMythic() and 40 or 60)
elseif spellId == 360658 then--Pre-Fabricated Sentry
timerSentryCD:Stop()
timerSentryCD:Start(self:IsMythic() and 100 or 81.2)--Timer based but also comes early if last one is defeated
--scan for sentry being added to boss frames, so we can grab it's guid
self:RegisterShortTermEvents(
"INSTANCE_ENCOUNTER_ENGAGE_UNIT"
)
elseif spellId == 364881 then--Matter Disolution
timerMatterDisolutionCD:Start()
elseif spellId == 360906 then--Refracted Blast
self.vb.refractedCount = self.vb.refractedCount + 1
warnRefractedBlast:Show(self.vb.refractedCount)
timerRefractedBlastCD:Start(self:IsMythic() and 20 or 15.7, self.vb.refractedCount+1)
end
end
function mod:SPELL_SUMMON(args)
local spellId = args.spellId
if (spellId == 360848 or spellId == 360623) and self:AntiSpam(5, 2) then--Not likley more than one at a time, but safetynet for drycode
specWarnPreFabricatedSentry:Show()
specWarnPreFabricatedSentry:Play("changetarget")--or bigmob
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 360458 then
warnUnstableCore:CombinedShow(1, args.destName)
elseif spellId == 364447 then
local amount = args.amount or 1
if amount >= 3 then
if args:IsPlayer() then
specWarnDissonance:Show(amount)
specWarnDissonance:Play("stackhigh")
else
local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId)
local remaining
if expireTime then
remaining = expireTime-GetTime()
end
if (not remaining or remaining and remaining < 6.1) and not UnitIsDeadOrGhost("player") then
specWarnDissonanceTaunt:Show(args.destName)
specWarnDissonanceTaunt:Play("tauntboss")
else
warnDissonance:Show(args.destName, amount)
end
end
else
warnDissonance:Show(args.destName, amount)
end
elseif spellId == 359610 then
if args:IsPlayer() then
specWarnDeresolution:Show()
specWarnDeresolution:Play("laserrun")
yellDeresolution:Yell()
else
warnDeresolution:Show(args.destName)
end
elseif spellId == 360415 or spellId == 360414 then
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then
if args:IsPlayer() then
specWarnPneumaticImpact:Cancel()
specWarnPneumaticImpact:CancelVoice()
else
specWarnPneumaticImpact:CombinedShow(0.5, args.destName)
specWarnPneumaticImpact:ScheduleVoice(0.5, "tauntboss")
end
end
elseif spellId == 364881 then
warnMatterDisoilution:CombinedShow(0.5, args.destName)
if args:IsPlayer() then
specWarnMatterDisolution:Show()
specWarnMatterDisolution:Play("targetyou")
specWarnMatterDisolutionOut:Schedule(6.5)
specWarnMatterDisolutionOut:ScheduleVoice(6.5, "runout")
yellMatterDisolutionFades:Countdown(spellId, 5)
end
elseif spellId == 364962 and self.vb.phase < 3 then
self:SetStage(3)
warnPhase:Show(DBM_CORE_L.AUTO_ANNOUNCE_TEXTS.stage:format(3))
warnPhase:Play("pthree")
--DO stage 2 timers stop? Like is this all boss does?
timerRefractedBlastCD:Stop()
timerSplitResolutionCD:Stop()
timerMatterDisolutionCD:Stop()
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 364881 then
if args:IsPlayer() then
specWarnMatterDisolutionOut:Cancel()
specWarnMatterDisolutionOut:CancelVoice()
yellMatterDisolutionFades:Cancel()
end
elseif spellId == 360879 then
self:SetStage(2)
warnPhase:Show(DBM_CORE_L.AUTO_ANNOUNCE_TEXTS.stage:format(2))
warnPhase:Play("ptwo")
timerVolatileMateriumCD:Stop()
timerSentryCD:Stop()
timerRefractedBlastCD:Stop()
timerDeresolutionCD:Stop()
timerRefractedBlastCD:Start(20.6, self.vb.refractedCount+1)
timerMatterDisolutionCD:Start(25.1)
timerSplitResolutionCD:Start(45.9)
end
end
--https://ptr.wowhead.com/npc=184540--Unknown
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 182311 or cid == 181850 then--Pre-Fabricated Sentry
timerDissonanceCD:Stop(args.destGUID)
timerWaveofDisintegrationCD:Stop(args.destGUID)
castsPerGUID[args.destGUID] = nil
end
end
--NOTE: This may actually be buggy for now since sentries can inherit the bosses guid (and thus not be unique
function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i = 1, 5 do
local unitID = "boss"..i
local unitGUID = UnitGUID(unitID)
if UnitExists(unitID) and not castsPerGUID[unitGUID] then
castsPerGUID[unitGUID] = {}
castsPerGUID[unitGUID][1] = 1--Diss
castsPerGUID[unitGUID][2] = 1--Wave
local cid = self:GetUnitCreatureId(unitID)
if cid == 182311 or cid == 181850 then--Pre-Fabricated Sentry
timerDissonanceCD:Start(11, unitGUID)
timerWaveofDisintegrationCD:Start(21, unitGUID)
--Found guid of spawned big add and started timer, kill event
self:UnregisterShortTermEvents()
end
end
end
end