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.

406 lines
16 KiB

local mod = DBM:NewMod(2443, "DBM-SanctumOfDomination", nil, 1193)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20220809233017")
mod:SetCreatureID(176523)
mod:SetEncounterID(2430)
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7)
mod:SetHotfixNoticeRev(20211012000000)--2021-10-12
mod:SetMinSyncRevision(20211213000000)--2021-12-13
mod.respawnTime = 29
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 357735",
"SPELL_CAST_SUCCESS 348508 355568 355778 355504",
"SPELL_SUMMON 355536",
"SPELL_AURA_APPLIED 348508 355568 355778 348456 355505 355525 352052",
-- "SPELL_AURA_APPLIED_DOSE",
"SPELL_AURA_REMOVED 348508 355568 355778 348456 355505 355506 355525",
-- "SPELL_PERIODIC_DAMAGE",
-- "SPELL_PERIODIC_MISSED",
"UNIT_DIED",
"UNIT_SPELLCAST_SUCCEEDED boss1"
)
--TODO,
--https://ptr.wowhead.com/spells/uncategorized/name:spike?filter=21;2;90100
--[[
ability.id = 357735 and type = "begincast"
or (ability.id = 348508 or ability.id = 355568 or ability.id = 355778 or ability.id = 348456 or ability.id = 355504 or ability.id = 355534) and type = "cast"
or ability.id = 355525 or ability.id = 352052
or (ability.id = 348456) and type = "applydebuff"
or (source.type = "NPC" and source.firstSeen = timestamp) or (target.type = "NPC" and target.firstSeen = timestamp)
--]]
mod:AddTimerLine(BOSS)
local warnAxe = mod:NewTargetCountAnnounce(355568, 1, nil, nil, 184055, nil, nil, nil, true)
local warnHammer = mod:NewTargetCountAnnounce(348508, 1, nil, nil, 175798, nil, nil, nil, true)
local warnScythe = mod:NewTargetCountAnnounce(355778, 1, nil, nil, 327953, nil, nil, nil, true)
local warnShadowsteelChains = mod:NewTargetNoFilterAnnounce(355505, 2, nil, nil, 246367)
local warnFlameclaspTrap = mod:NewTargetNoFilterAnnounce(348456, 2, nil, nil, 8312)
local specWarnCruciformAxe = mod:NewSpecialWarningMoveAway(355568, nil, 184055, nil, 1, 2)
local yellCruciformAxe = mod:NewShortYell(355568, 184055)
local yellCruciformAxeFades = mod:NewShortFadesYell(355568, 184055)
local specWarnCruciformAxeTaunt = mod:NewSpecialWarningTaunt(355568, nil, 184055, nil, 1, 2)--This might never target tanks, remove if it doesn't
local specWarnReverberatingHammer = mod:NewSpecialWarningMoveAway(348508, nil, 175798, nil, 1, 2)
local yellReverberatingHammer = mod:NewShortYell(348508, 175798)
local yellReverberatingHammerFades = mod:NewShortFadesYell(348508, 175798)
local specWarnReverberatingHammerTaunt = mod:NewSpecialWarningTaunt(348508, nil, 175798, nil, 1, 2)
local specWarnDualbladeScythe = mod:NewSpecialWarningMoveAway(355778, nil, 327953, nil, 1, 2)
local yellDualbladeScythe = mod:NewShortYell(355778, 327953)
local yellDualbladeScytheFades = mod:NewShortFadesYell(355778, 327953)
local specWarnDualbladeScytheTaunt = mod:NewSpecialWarningTaunt(355778, nil, 327953, nil, 1, 2)--This might never target tanks, remove if it doesn't
local specWarnSpikedBalls = mod:NewSpecialWarningSwitchCount(352052, nil, nil, nil, 1, 2)
local specWarnFlameclaspTrap = mod:NewSpecialWarningYouPos(348456, nil, 8312, nil, 1, 2)
local yellFlameclaspTrap = mod:NewShortPosYell(348456, 8312)
local yellFlameclaspTrapFades = mod:NewIconFadesYell(348456, 8312)
local specWarnShadowsteelChains = mod:NewSpecialWarningYouPos(355505, nil, 246367, nil, 1, 2)
local yellShadowsteelChains = mod:NewShortPosYell(355505, 246367)
local yellShadowsteelChainsFades = mod:NewIconFadesYell(355505, 246367)
--local specWarnExsanguinatingBite = mod:NewSpecialWarningDefensive(328857, nil, nil, nil, 1, 2)
--local specWarnGTFO = mod:NewSpecialWarningGTFO(340324, nil, nil, nil, 1, 8)
local timerCruciformAxeCD = mod:NewCDCountTimer(19.4, 355568, 184055, nil, 2, 5, nil, DBM_COMMON_L.TANK_ICON)--"Axe"
local timerCruciformAxe = mod:NewTargetTimer(6, 355568, 184055, nil, 2, 5)--"Axe"
local timerReverberatingHammerCD = mod:NewCDCountTimer(19.4, 348508, 175798, nil, 2, 5, nil, DBM_COMMON_L.TANK_ICON)--"Hammer"
local timerReverberatingHammer = mod:NewTargetTimer(6, 348508, 175798, nil, 2, 5)--"Hammer"
local timerDualbladeScytheCD = mod:NewCDCountTimer(19.4, 355778, 327953, nil, 2, 5, nil, DBM_COMMON_L.TANK_ICON)--"Scythe"
local timerDualbladeScythe = mod:NewTargetTimer(19.4, 355778, 327953, nil, 2, 5)--"Scythe"
local timerSpikedBallsCD = mod:NewCDCountTimer(40, 352052, nil, nil, 2, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
local timerFlameclaspTrapCD = mod:NewCDCountTimer(47.9, 348456, 8312, nil, nil, 3, nil, DBM_COMMON_L.HEROIC_ICON)--"Trap"
local timerShadowsteelChainsCD = mod:NewCDCountTimer(40.1, 355505, 246367, nil, nil, 3)--"Chains"
mod:AddTimerLine(DBM_COMMON_L.INTERMISSION)
--Intermission
local warnEmbers = mod:NewCountAnnounce(355534, 2, nil, nil, 264364)
local warnAddsRemaining = mod:NewAddsLeftAnnounce(355534, 1)
local timerForgeWeapon = mod:NewCastTimer(48, 355525, nil, nil, nil, 6)
local timerEmbersCD = mod:NewNextCountTimer(5, 355534, 264364, nil, nil, 3)--"Embers"
local timerAddsCD = mod:NewAddsTimer(120, 357755, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
local timerFinalScream = mod:NewCastTimer(15, 357735, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
--local berserkTimer = mod:NewBerserkTimer(600)
--mod:AddRangeFrameOption("8")
mod:AddSetIconOption("SetIconOnChains", 355505, true, false, {1, 2, 3})
mod:AddSetIconOption("SetIconOnTraps", 348456, true, false, {4, 5, 6, 7})
mod:AddNamePlateOption("NPAuraOnFinalScream", 357735)
mod.vb.ChainsIcon = 1
mod.vb.trapsIcon = 4
mod.vb.weaponCount = 0
mod.vb.ballsCount = 0
mod.vb.trapCount = 0
mod.vb.chainCount = 0
mod.vb.emberCount = 0
mod.vb.addsRemaining = 0
local function repeatEmbers(self, expected)
self.vb.emberCount = self.vb.emberCount + 1
warnEmbers:Show(self.vb.emberCount)
if self.vb.emberCount < expected then
timerEmbersCD:Start(5, self.vb.emberCount+1)
self:Schedule(5, repeatEmbers, self, expected)
end
end
function mod:OnCombatStart(delay)
self:SetStage(1)
self.vb.ChainsIcon = 1
self.vb.weaponCount = 0
self.vb.ballsCount = 0
self.vb.trapCount = 0
self.vb.chainCount = 0
if self:IsMythic() then
timerShadowsteelChainsCD:Start(8.1-delay, 1)
timerCruciformAxeCD:Start(10.7-delay, 1)
timerSpikedBallsCD:Start(16-delay, 1)
timerFlameclaspTrapCD:Start(39-delay, 1)
else
timerShadowsteelChainsCD:Start(10.8-delay, 1)
timerCruciformAxeCD:Start(16-delay, 1)
timerSpikedBallsCD:Start(20-delay, 1)
if self:IsHeroic() then
timerFlameclaspTrapCD:Start(45-delay, 1)
end
end
-- berserkTimer:Start(-delay)
if self.Options.NPAuraOnFinalScream then
DBM:FireEvent("BossMod_EnableHostileNameplates")
end
end
function mod:OnCombatEnd()
-- if self.Options.RangeFrame then
-- DBM.RangeCheck:Hide()
-- end
if self.Options.NPAuraOnFinalScream then
DBM.Nameplate:Hide(true, nil, nil, nil, true, true)
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 357735 then
if self.Options.NPAuraOnFinalScream then
DBM.Nameplate:Show(true, args.sourceGUID, spellId, nil, 15)
end
if self:AntiSpam(5, 1) then
timerFinalScream:Start()
end
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 348508 then
self.vb.weaponCount = self.vb.weaponCount + 1
timerReverberatingHammerCD:Start(self:IsMythic() and 20.1 or 24.2, self.vb.weaponCount+1)
elseif spellId == 355568 then
self.vb.weaponCount = self.vb.weaponCount + 1
timerCruciformAxeCD:Start(self:IsMythic() and 20.1 or 19.3, self.vb.weaponCount+1)
elseif spellId == 355778 then
self.vb.weaponCount = self.vb.weaponCount + 1
timerDualbladeScytheCD:Start(self:IsMythic() and 20.1 or 24.2, self.vb.weaponCount+1)
elseif spellId == 355504 then
self.vb.ChainsIcon = 1
self.vb.chainCount = self.vb.chainCount + 1
--They apply custom rule to only heroic in phase 2 and 3
local timer = (not self:IsMythic() and self.vb.phase > 1 and 48.5) or 40.1
timerShadowsteelChainsCD:Start(timer, self.vb.chainCount+1)
end
end
function mod:SPELL_SUMMON(args)
local spellId = args.spellId
if spellId == 355536 then
self.vb.addsRemaining = self.vb.addsRemaining + 1
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 355505 then
local icon = self.vb.ChainsIcon
if self.Options.SetIconOnChains then
self:SetIcon(args.destName, icon)
end
if args:IsPlayer() then
specWarnShadowsteelChains:Show(self:IconNumToTexture(icon))
specWarnShadowsteelChains:Play("mm"..icon)
yellShadowsteelChains:Yell(icon, icon)
yellShadowsteelChainsFades:Countdown(spellId, nil, icon)
end
warnShadowsteelChains:CombinedShow(0.5, args.destName)
self.vb.ChainsIcon = self.vb.ChainsIcon + 1
elseif spellId == 348508 then
if args:IsPlayer() then
specWarnReverberatingHammer:Show()
specWarnReverberatingHammer:Play("runout")
yellReverberatingHammer:Yell()
yellReverberatingHammerFades:Countdown(spellId)
elseif self:IsTank() then
specWarnReverberatingHammerTaunt:Show(args.destName)
specWarnReverberatingHammerTaunt:Play("tauntboss")
else
warnHammer:Show(self.vb.weaponCount, args.destName)
end
timerReverberatingHammer:Start(args.destName)
elseif spellId == 355568 then
if args:IsPlayer() then
specWarnCruciformAxe:Show()
specWarnCruciformAxe:Play("runout")
yellCruciformAxe:Yell()
yellCruciformAxeFades:Countdown(spellId)
elseif self:IsTank() then
specWarnCruciformAxeTaunt:Show(args.destName)
specWarnCruciformAxeTaunt:Play("tauntboss")
else
warnAxe:Show(self.vb.weaponCount, args.destName)
end
timerCruciformAxe:Start(args.destName)
elseif spellId == 355778 then
if args:IsPlayer() then
specWarnDualbladeScythe:Show()
specWarnDualbladeScythe:Play("runout")
yellDualbladeScythe:Yell()
yellDualbladeScytheFades:Countdown(spellId)
elseif self:IsTank() then
specWarnDualbladeScytheTaunt:Show(args.destName)
specWarnDualbladeScytheTaunt:Play("tauntboss")
else
warnScythe:Show(self.vb.weaponCount, args.destName)
end
timerDualbladeScythe:Start(args.destName)
elseif spellId == 348456 then
if self:AntiSpam(5, 2) then
self.vb.trapsIcon = 4
self.vb.trapCount = self.vb.trapCount + 1
local timer = (self:IsHeroic() and self.vb.phase > 1 and 47.9) or (self:IsMythic() and self.vb.phase == 1 and 53.9 or self.vb.phase == 2 and 37.9 or 39.9) or 40
timerFlameclaspTrapCD:Start(timer, self.vb.trapCount+1)
end
local icon = self.vb.trapsIcon
if self.Options.SetIconOnTraps then
self:SetIcon(args.destName, icon)
end
if args:IsPlayer() then
specWarnFlameclaspTrap:Show(self:IconNumToTexture(icon))
specWarnFlameclaspTrap:Play("mm"..icon)
yellFlameclaspTrap:Yell(icon, icon)
yellFlameclaspTrapFades:Countdown(spellId, nil, icon)
end
warnFlameclaspTrap:CombinedShow(0.5, args.destName)
self.vb.trapsIcon = self.vb.trapsIcon + 1
elseif spellId == 352052 then
self.vb.ballsCount = self.vb.ballsCount + 1
specWarnSpikedBalls:Show(self.vb.ballsCount)
specWarnSpikedBalls:Play("targetchange")
local timer = (not self:IsMythic() and self.vb.phase > 1 and 47.9) or 40.1
timerSpikedBallsCD:Start(timer, self.vb.ballsCount+1)
elseif spellId == 355525 then
self:Unschedule(repeatEmbers)
repeatEmbers(self, self:IsMythic() and 9 or 8)
timerForgeWeapon:Start()
if self:IsMythic() then--Based on vods, may be off slightly
timerAddsCD:Start(47)
end
if self:IsFated() then
self:AffixEvent(0)
end
end
end
--mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 355505 then
if args:IsPlayer() then
yellShadowsteelChainsFades:Cancel()
end
elseif spellId == 355506 then
if self.Options.SetIconOnChains then
self:SetIcon(args.destName, 0)
end
elseif spellId == 348508 then
if args:IsPlayer() then
yellReverberatingHammerFades:Cancel()
end
timerReverberatingHammer:Stop(args.destName)
elseif spellId == 355568 then
if args:IsPlayer() then
yellCruciformAxeFades:Cancel()
end
timerCruciformAxe:Stop(args.destName)
elseif spellId == 355778 then
if args:IsPlayer() then
yellDualbladeScytheFades:Cancel()
end
timerDualbladeScythe:Stop(args.destName)
elseif spellId == 348456 then
if self.Options.SetIconOnTraps then
self:SetIcon(args.destName, 0)
end
if args:IsPlayer() then
yellFlameclaspTrapFades:Cancel()
end
elseif spellId == 355525 then--Forge Weapon ending, boss returning
self:Unschedule(repeatEmbers)--For good measure, maybe down the line when people soloing, intermission will break/shorten
timerForgeWeapon:Stop()
if self.vb.phase == 1.5 then
self:SetStage(2)
if self:IsFated() then
self:AffixEvent(1, 2)
end
else
self:SetStage(3)
if self:IsFated() then
self:AffixEvent(1, 3)
end
end
self.vb.weaponCount = 0
self.vb.ballsCount = 0
self.vb.trapCount = 0
self.vb.chainCount = 0
--Technically timers between stage 2 and 3 are same (minus weapon type change)
--But I like having knobs to adjust in place if fight recieves adjustments down the line
if self.vb.phase == 2 then
if self:IsMythic() then--Timers from video, might be slightly off
timerShadowsteelChainsCD:Start(10.8, 1)
timerReverberatingHammerCD:Start(16.9, 1)
timerSpikedBallsCD:Start(19.9, 1)
timerFlameclaspTrapCD:Start(38.1, 1)
else--Blizz finally synced up all difficulties to be same for non mythic
timerShadowsteelChainsCD:Start(14.7, 1)
timerReverberatingHammerCD:Start(16.9, 1)
timerSpikedBallsCD:Start(26, 1)
if self:IsHeroic() then
timerFlameclaspTrapCD:Start(48.1, 1)
end
end
else--phase 3
if self:IsMythic() then--Timers taken from P2, might not be right at all, could't find any clean P3 pulls in vods
timerShadowsteelChainsCD:Start(10.8, 1)
timerDualbladeScytheCD:Start(16.9, 1)
timerSpikedBallsCD:Start(19.9, 1)
timerFlameclaspTrapCD:Start(38.1, 1)
else--Blizz finally synced up all difficulties to be same for non mythic
timerShadowsteelChainsCD:Start(14.6, 1)
timerDualbladeScytheCD:Start(16.9, 1)
timerSpikedBallsCD:Start(26, 1)
if self:IsHeroic() then
timerFlameclaspTrapCD:Start(48.1, 1)
end
end
end
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 179847 then--Shadowsteel Horror
self.vb.addsRemaining = self.vb.addsRemaining - 1
if self.vb.addsRemaining == 0 then
warnAddsRemaining:Show(0)
timerFinalScream:Stop()
end
if self.Options.NPAuraOnFinalScream then
DBM.Nameplate:Hide(true, args.destGUID, 357735)
end
end
end
--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if spellId == 340324 and destGUID == UnitGUID("player") and not playerDebuff and self:AntiSpam(2, 3) then
specWarnGTFO:Show(spellName)
specWarnGTFO:Play("watchfeet")
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--]]
--"<67.84 22:36:16> [UNIT_SPELLCAST_SUCCEEDED] Painsmith Raznal(Andybruwu) -[DNT] Upstairs- [[boss1:Cast-3-2012-2450-9254-355555-003A1D8DC1:355555]]", -- [1092]
--"<70.30 22:36:19> [CLEU] SPELL_AURA_APPLIED#Creature-0-2012-2450-9254-176523-00001D8D02#Painsmith Raznal#Creature-0-2012-2450-9254-176523-00001D8D02#Painsmith Raznal#355525#Forge Weapon#BUFF#nil", -- [1138]
--"<115.44 11:06:19> [UNIT_SPELLCAST_SUCCEEDED] Painsmith Raznal(Lonecrusader) -[DNT] Upstairs- [[boss1:Cast-3-4253-2450-3280-355555-002F6FFA8B:355555]]", -- [4266]
--"<119.12 11:06:23> [CLEU] SPELL_AURA_APPLIED#Creature-0-4253-2450-3280-176523-00006FF9BD#Painsmith Raznal#Creature-0-4253-2450-3280-176523-00006FF9BD#Painsmith Raznal#359033#Forge's Flames#BUFF#nil",
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 355555 then--Upstairs (Boss leaving, faster to stop timers than Forge Weapon which happens ~2-4 sec later)
self.vb.emberCount = 0
self.vb.addsRemaining = 0
if self.vb.phase == 1 then
self:SetStage(1.5)
else
self:SetStage(2.5)
end
timerReverberatingHammerCD:Stop()
timerCruciformAxeCD:Stop()
timerDualbladeScytheCD:Stop()
timerSpikedBallsCD:Stop()
timerFlameclaspTrapCD:Stop()
timerShadowsteelChainsCD:Stop()
--Timers started at forge weapon do to variation that can be observed between upstairs and forge weapon start
end
end