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.

341 lines
14 KiB

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
--]]