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.

421 lines
16 KiB

local mod = DBM:NewMod(1896, "DBM-Raids-Legion", 2, 875)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240426185020")
mod:SetCreatureID(118460, 118462, 119072)--118460 Engine of Souls, 118462 Soul Queen Dajahna, 119072 The Desolate Host
mod:SetEncounterID(2054)
mod:SetBossHPInfoToHighest()
mod:SetUsedIcons(3, 4)
mod.respawnTime = 40
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 238570 235927 236542 236544 236072",
"SPELL_CAST_SUCCESS 236449 236131 235969 236542 236544 235907",
"SPELL_AURA_APPLIED 236459 235924 238018 236513 236138 236131 235969 236515 236361 239923 236548 235732",
"SPELL_AURA_APPLIED_DOSE 236548 236515",
"SPELL_AURA_REMOVED 236459 235924 236513 235969 235732 236072 238570",
-- "SPELL_PERIODIC_DAMAGE",
-- "SPELL_PERIODIC_MISSED",
"UNIT_DIED",
-- "CHAT_MSG_RAID_BOSS_EMOTE",
"UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3"
)
--[[
(ability.id = 238570 or ability.id = 235927 or ability.id = 236542 or ability.id = 236544) and type = "begincast" or
(ability.id = 235907 or ability.id = 236072 or ability.id = 236507 or ability.id = 235969 or ability.id = 236449 or ability.id = 236138 or ability.id = 236131) and type = "cast" or
(ability.id = 235924) and type = "applydebuff" or
ability.id = 236072 and (type = "applybuff" or type = "removebuff") or
(ability.id = 236459 or ability.id = 235969 or ability.id = 236513) and (type = "applydebuff" or type = "removedebuff" or type = "applybuff" or type = "removebuff")
--]]
--Corporeal Realm
local warnSpearofAnguish = mod:NewTargetCountAnnounce(235924, 3)
local warnCollapsingFissure = mod:NewSpellAnnounce(235907, 3)--Upgrade to special, if needed
local warnTormentingCries = mod:NewTargetAnnounce(238018, 3)--Spammy? off by default?
----Adds
local warnRupturingSlam = mod:NewSpellAnnounce(235927, 3)
local warnBonecageArmor = mod:NewTargetAnnounce(236513, 3)
--Spirit Realm
local warnSoulbind = mod:NewTargetAnnounce(236459, 4)
local warnWither = mod:NewTargetAnnounce(236138, 3, nil, "Healer", 2)
local warnShatteringScream = mod:NewTargetAnnounce(235969, 4, nil, false, 2)--This warning DOES need to be cross phase
local warnSpiritChains = mod:NewTargetAnnounce(236361, 3, nil, false, 2)
--Desolate Host
local warnTorment = mod:NewStackAnnounce(236548, 3)
--Corporeal Realm
local specWarnSpearofAnguish = mod:NewSpecialWarningYou(235924, nil, nil, nil, 1, 2)
local yellSpearofAnguish = mod:NewFadesYell(235924)
local specWarnTormentingCries = mod:NewSpecialWarningYou(238018, nil, nil, nil, 1, 2)
local yellTormentingCries = mod:NewShortYell(238018)
--Spirit Realm
local specWarnSoulbind = mod:NewSpecialWarningYou(236459, nil, nil, nil, 3, 2)
local yellSoulbind = mod:NewYell(236459)
local specWarnWither = mod:NewSpecialWarningYou(236138, nil, nil, nil, 1, 7)
local specWarnShatteringScream = mod:NewSpecialWarningMoveAway(235969, nil, nil, nil, 1, 2)
local specWarnShatteringScreamAdd = mod:NewSpecialWarningMoveTo(235969, nil, nil, nil, 3, 2)
local yellShatteringScream = mod:NewShortFadesYell(235969, nil, false)
local specWarnWailingSouls = mod:NewSpecialWarningCount(236072, nil, nil, nil, 2, 2)
--The Desolate Host
local specWarnSunderingDoomTaunt = mod:NewSpecialWarningTaunt(236542, nil, nil, nil, 1, 2)
local specWarnSunderingDoomGather = mod:NewSpecialWarningMoveTo(236542, nil, nil, nil, 1, 2)
local specWarnSunderingDoomRun = mod:NewSpecialWarningRun(236542, nil, nil, nil, 4, 2)
local specWarnDoomedSunderingTaunt = mod:NewSpecialWarningTaunt(236544, nil, nil, nil, 1, 2)
local specWarnDoomedSunderingGather = mod:NewSpecialWarningMoveTo(236544, nil, nil, nil, 1, 2)
local specWarnDoomedSunderingRun = mod:NewSpecialWarningRun(236544, nil, nil, nil, 4, 2)
mod:AddTimerLine(SCENARIO_STAGE:format(1))
--Corporeal Realm
local timerSpearofAnquishCD = mod:NewCDCountTimer(20, 235924, nil, nil, nil, 3)
--local timerCollapsingFissureCD = mod:NewAITimer(31, 235907, nil, nil, nil, 3)
local timerTormentedCriesCD = mod:NewNextCountTimer(58, 238570, nil, nil, nil, 6)
--Spirit Realm
local timerSoulbindCD = mod:NewCDCountTimer(24, 236459, nil, nil, nil, 3)
--local timerWitherCD = mod:NewCDTimer(9.4, 236138, nil, nil, nil, 3)
--local timerShatteringScreamCD = mod:NewCDTimer(12, 235969, nil, nil, nil, 3)--12 seconds, per add
local timerWailingSoulsCD = mod:NewNextCountTimer(58, 236072, nil, nil, nil, 2)
--The Desolate Host
mod:AddTimerLine(SCENARIO_STAGE:format(2))
local timerSunderingDoomCD = mod:NewCDTimer(24.4, 236542, nil, nil, nil, 5, nil, nil, nil, 1, 4)
local timerDoomedSunderingCD = mod:NewCDTimer(24.4, 236544, nil, nil, nil, 5, nil, nil, nil, 1, 4)
local berserkTimer = mod:NewBerserkTimer(480)
mod:AddSetIconOption("SoulIcon", 236459, true)
mod:AddInfoFrameOption(235621, true)
mod:AddRangeFrameOption(10, 236459)
mod:AddNamePlateOption("NPAuraOnBonecageArmor", 236513)
mod:AddBoolOption("IgnoreTemplarOn3Tank", true)
mod.vb.soulboundCast = 0
mod.vb.spearCast = 0
mod.vb.wailingSoulsCast = 0
mod.vb.tormentedCriesCast = 0
mod.vb.boneArmorCount = 0
mod.vb.phase = 1
mod.vb.soulIcon = 3
mod.vb.tankCount = 2
local spiritRealm, boneArmor = DBM:GetSpellName(235621), DBM:GetSpellName(236513)
local doBones = true
local playersInSpirit = {}
local playersNotInSpirit = {}
local spiritFilter, regularFilter
do
spiritFilter = function(uId)
if DBM:UnitDebuff(uId, spiritRealm) then
return true
end
end
regularFilter = function(uId)
if not DBM:UnitDebuff(uId, spiritRealm) then
return true
end
end
end
local updateInfoFrame
do
local corpRealm = DBM:EJ_GetSectionInfo(14856)
local lines = {}
local sortedLines = {}
local function addLine(key, value)
-- sort by insertion order
lines[key] = value
sortedLines[#sortedLines + 1] = key
end
updateInfoFrame = function()
table.wipe(lines)
table.wipe(sortedLines)
addLine(spiritRealm, #playersInSpirit)
addLine(corpRealm, #playersNotInSpirit)
if doBones then
addLine(boneArmor, mod.vb.boneArmorCount)
end
return lines, sortedLines
end
end
function mod:OnCombatStart(delay)
table.wipe(playersInSpirit)
table.wipe(playersNotInSpirit)
self.vb.soulboundCast = 0
self.vb.spearCast = 0
self.vb.wailingSoulsCast = 0
self.vb.tormentedCriesCast = 0
self.vb.boneArmorCount = 0
self.vb.phase = 1
self.vb.soulIcon = 3
self.vb.tankCount = self:GetNumAliveTanks() or 2
--timerCollapsingFissureCD:Start(9.7-delay)
timerSoulbindCD:Start(14.2-delay, 1)
if not self:IsEasy() then
doBones = true
timerSpearofAnquishCD:Start(20.7-delay, 1)
if self:IsMythic() then
berserkTimer:Start(480-delay)
end
else
doBones = false
end
--timerWitherCD:Start(32-delay)
timerWailingSoulsCD:Start(59.4-delay, 1)
timerTormentedCriesCD:Start(119-delay, 1)
if self.Options.NPAuraOnBonecageArmor then
DBM:FireEvent("BossMod_EnableHostileNameplates")
end
for uId in DBM:GetGroupMembers() do
local name = DBM:GetUnitFullName(uId)
if DBM:UnitDebuff(uId, spiritRealm) then
playersInSpirit[#playersInSpirit+1] = name
else
playersNotInSpirit[#playersNotInSpirit+1] = name
end
end
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(OVERVIEW)
DBM.InfoFrame:Show(5, "function", updateInfoFrame, false, true)
end
end
function mod:OnCombatEnd()
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
if self.Options.NPAuraOnBonecageArmor then
DBM.Nameplate:Hide(true, nil, nil, nil, true, true)
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 238570 then--Tormented Cries
self.vb.tormentedCriesCast = self.vb.tormentedCriesCast + 1
timerSpearofAnquishCD:Stop()
elseif spellId == 235927 and self.vb.tankCount < 3 then
warnRupturingSlam:Show()
elseif spellId == 236542 then--Sundering Doom (regular realm soaks)
if DBM:UnitBuff("player", spiritRealm) or DBM:UnitDebuff("player", spiritRealm) then--Figure out which it is
specWarnSunderingDoomRun:Show()
specWarnSunderingDoomRun:Play("justrun")
else
specWarnSunderingDoomGather:Show(BOSS)
specWarnSunderingDoomGather:Play("gathershare")
end
timerSunderingDoomCD:Start()
elseif spellId == 236544 then--Doomed Sunering (spirit realm soaks)
if DBM:UnitBuff("player", spiritRealm) or DBM:UnitDebuff("player", spiritRealm) then--Figure out which it is
specWarnDoomedSunderingGather:Show(BOSS)
specWarnDoomedSunderingGather:Play("gathershare")
else
specWarnDoomedSunderingRun:Show()
specWarnDoomedSunderingRun:Play("justrun")
end
timerDoomedSunderingCD:Start()
elseif spellId == 236072 then
self.vb.wailingSoulsCast = self.vb.wailingSoulsCast + 1
timerSoulbindCD:Stop()
--timerWitherCD:Stop()
specWarnWailingSouls:Show(self.vb.wailingSoulsCast)
--In normal realm, and boss is above 35%, getting adds
if not (DBM:UnitBuff("player", spiritRealm) or DBM:UnitDebuff("player", spiritRealm)) and UnitHealth("boss1") / UnitHealthMax("boss1") * 100 >= 35 then
specWarnWailingSouls:Play("killmob")
else--Down below, or boss not 35%, not getting adds
specWarnWailingSouls:Play("aesoon")
end
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 235907 then
warnCollapsingFissure:Show()
elseif spellId == 236449 then--Soulbind Cast
self.vb.soulboundCast = self.vb.soulboundCast + 1
if self.vb.phase == 2 then
if self:IsEasy() then
--["236449-Soulbind"] = "pull:12.5, 25.4, 94.7, 26.0, 75.9, 19.1, 20.3",
timerSoulbindCD:Start(24, self.vb.soulboundCast+1)
else
timerSoulbindCD:Start(19.6, self.vb.soulboundCast+1)
end
else
if self:IsEasy() then
--["236449-Soulbind"] = "pull:52.4, 84.8, 34.7, 17.4, 24.6, 24.7"
timerSoulbindCD:Start(34, self.vb.soulboundCast+1)
else
timerSoulbindCD:Start(24, self.vb.soulboundCast+1)
end
end
elseif spellId == 236542 then--Sundering Doom Finished (doomed sundering, soaked by spirit realm is next)
if DBM:UnitBuff("player", spiritRealm) or DBM:UnitDebuff("player", spiritRealm) then--Figure out which it is
specWarnDoomedSunderingTaunt:Show(BOSS)
specWarnDoomedSunderingTaunt:Play("tauntboss")
end
elseif spellId == 236544 then--Doomed Sundering Finished (sundring doom, soaked by regular realm is next)
if not (DBM:UnitBuff("player", spiritRealm) or DBM:UnitDebuff("player", spiritRealm)) then--Figure out which it is
specWarnSunderingDoomTaunt:Show(BOSS)
specWarnSunderingDoomTaunt:Play("tauntboss")
end
-- elseif spellId == 236138 or spellId == 236131 then
--timerWitherCD:Start()
-- elseif spellId == 235969 then--Shattering Scream
-- timerShatteringScreamCD:Start(nil, args.sourceGUID)
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 236459 then
warnSoulbind:CombinedShow(0.5, args.destName)
if args:IsPlayer() then
specWarnSoulbind:Show()
specWarnSoulbind:Play("targetyou")
yellSoulbind:Yell()
if self.Options.RangeFrame then
DBM.RangeCheck:Show(10)
end
end
if self.Options.SoulIcon then
self:SetIcon(args.destName, self.vb.soulIcon)
end
self.vb.soulIcon = self.vb.soulIcon + 1
if self.vb.soulIcon > 4 then
self.vb.soulIcon = 3
end
elseif spellId == 235924 then
self.vb.spearCast = self.vb.spearCast + 1
warnSpearofAnguish:Show(self.vb.spearCast, args.destName)
timerSpearofAnquishCD:Start(nil, self.vb.spearCast+1)
if args:IsPlayer() then
specWarnSpearofAnguish:Show()
specWarnSpearofAnguish:Play("runout")
yellSpearofAnguish:Countdown(6)
end
elseif spellId == 238018 then
if args:IsPlayer() then
specWarnTormentingCries:Show()
specWarnTormentingCries:Play("targetyou")
yellTormentingCries:Yell()
else
warnTormentingCries:Show(args.destName)
end
elseif spellId == 236513 then
if self.Options.NPAuraOnBonecageArmor then
if self:IsMythic() then
DBM.Nameplate:Show(true, args.destGUID, spellId, nil, 180)
else
DBM.Nameplate:Show(true, args.destGUID, spellId, nil, 60)
end
end
local cid = self:GetCIDFromGUID(args.destGUID)
if self.Options.IgnoreTemplarOn3Tank and (cid == 119938 or cid == 118715) and self.vb.tankCount >= 3 then return end--Reanimated templar
self.vb.boneArmorCount = self.vb.boneArmorCount + 1
if self:AntiSpam(4, args.destName) and self.vb.boneArmorCount == 1 then
warnBonecageArmor:Show(args.destName)
end
elseif (spellId == 236138 or spellId == 236131) then
warnWither:CombinedShow(0.3, args.destName)
if args:IsPlayer() then
specWarnWither:Show()
specWarnWither:Play("switchphase")
end
elseif spellId == 235969 then
if args:IsPlayer() and self:AntiSpam(5, 2) then
if self.vb.boneArmorCount > 0 then
specWarnShatteringScreamAdd:Show(boneArmor)
specWarnShatteringScreamAdd:Play("getboned")
else
specWarnShatteringScream:Show()
specWarnShatteringScream:Play("scatter")
end
end
if self.vb.boneArmorCount > 0 then
warnShatteringScream:CombinedShow(1, args.destName)
end
elseif spellId == 236515 and args:IsPlayer() then
yellShatteringScream:Yell(args.spellName, args.amount or 1)
elseif spellId == 236361 or spellId == 239923 then
warnSpiritChains:CombinedShow(0.3, args.destName)
elseif spellId == 236548 then
local amount = args.amount or 1
warnTorment:Cancel()
warnTorment:Schedule(0.5, args.destName, amount)
elseif spellId == 235732 then
playersInSpirit[#playersInSpirit+1] = args.destName
tDeleteItem(playersNotInSpirit, args.destName)
if args:IsPlayer() then--Only show people not in spirit realm
DBM.RangeCheck:Show(8, regularFilter)
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 236459 then
if self.Options.SoulIcon then
self:SetIcon(args.destName, 0)
end
if self.Options.RangeFrame and args:IsPlayer() then
DBM.RangeCheck:Hide()
end
elseif spellId == 235924 then
if args:IsPlayer() then
yellSpearofAnguish:Cancel()
end
elseif spellId == 236513 then--Bonecage Armor
if self.Options.NPAuraOnBonecageArmor then
DBM.Nameplate:Hide(true, args.destGUID, spellId)
end
local cid = self:GetCIDFromGUID(args.destGUID)
if self.Options.IgnoreTemplarOn3Tank and (cid == 119938 or cid == 118715) and self.vb.tankCount >= 3 then return end--Reanimated templar
self.vb.boneArmorCount = self.vb.boneArmorCount - 1
elseif spellId == 235969 and args:IsPlayer() then--Shattering Scream
yellShatteringScream:Cancel()
elseif spellId == 236072 then--Wailing Souls
self.vb.soulboundCast = 0
--timerSoulbindCD:Start(12, 1)--5-14, too variable to start timer for first cast after souls
--timerWitherCD:Start(19.7)
timerWailingSoulsCD:Start(50, 1)
elseif spellId == 235732 then
playersNotInSpirit[#playersNotInSpirit+1] = args.destName
tDeleteItem(playersInSpirit, args.destName)
if args:IsPlayer() then--Only show people in spirit realm
DBM.RangeCheck:Show(8, spiritFilter)
end
elseif spellId == 238570 then--Tormented Cries
timerTormentedCriesCD:Start(58, self.vb.tormentedCriesCast+1)
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 118462 then
timerSoulbindCD:Stop()
timerSpearofAnquishCD:Stop()
berserkTimer:Cancel()
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 239978 then
self.vb.phase = 2
timerSoulbindCD:Stop()
timerWailingSoulsCD:Stop()
timerTormentedCriesCD:Stop()
if not self:IsEasy() then
timerSpearofAnquishCD:Stop()
timerSpearofAnquishCD:Start(8, self.vb.spearCast+1)
end
timerSoulbindCD:Start(10, self.vb.soulboundCast+1)
--New Phase Timers
timerSunderingDoomCD:Start(7)
timerDoomedSunderingCD:Start(18)
end
end