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.

489 lines
19 KiB

local mod = DBM:NewMod(1726, "DBM-Raids-Legion", 5, 768)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240525081121")
mod:SetCreatureID(103769)
mod:SetEncounterID(1864)
mod:SetUsedIcons(6, 2, 1)
mod:SetHotfixNoticeRev(15369)
mod.respawnTime = 15
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 207830 209443 205588",
"SPELL_CAST_SUCCESS 206651 209158 224649 210264",
"SPELL_SUMMON 210264",
"SPELL_AURA_APPLIED 208431 206651 205771 209158 211802 209034 210451 224508 206005",
"SPELL_AURA_APPLIED_DOSE 206651 209158",
"SPELL_AURA_REMOVED 208431 211802 206651 209158 209034 210451 224508 206005",
"UNIT_DIED",
"UNIT_SPELLCAST_SUCCEEDED boss1"
)
--"<271.21 22:57:25> [CLEU] SPELL_PERIODIC_ENERGIZE##nil#Player-3693-07CA07EE#Jaybee#208385#Tainted Discharge#3#10", -- [5739]
--TODO, infoframe for remaining tainted discharge maybe? Has to be combined with alt power infoframe
--TODO, reverify mythic/LFR timers
--Nightmare Corruption
local warnDescentIntoMadness = mod:NewTargetAnnounce(208431, 4)
local warnDream = mod:NewYouAnnounce(206005, 1)
local warnDreamOthers = mod:NewTargetAnnounce(206005, 1)
local warnTormentingSwipe = mod:NewTargetAnnounce(224649, 2, nil, "Tank")
--Stage One: The Decent Into Madness
local warnNightmareBlades = mod:NewTargetAnnounce(206656, 2)
local warnDarkeningSoul = mod:NewStackAnnounce(206651, 3, nil, "Healer|Tank")
local warnTormentingFixation = mod:NewTargetAnnounce(205771, 4)
--Stage Two: From the Shadows
local warnPhase2 = mod:NewPhaseAnnounce(2, 2, nil, nil, nil, nil, nil, 2)
local warnBlackeningSoul = mod:NewStackAnnounce(209158, 3, nil, "Healer|Tank")
local warnNightmareInfusion = mod:NewSpellAnnounce(209443, 4, nil, "Tank")
local warnBondsOfTerror = mod:NewTargetAnnounce(209034, 2)
--Stage Three: Darkness and stuff
local warnPhase3 = mod:NewPhaseAnnounce(3, 2, nil, nil, nil, nil, nil, 2)
local warnNightmareTentacles = mod:NewSpellAnnounce("ej12977", 3, 93708)
local specWarnDescentIntoMadness = mod:NewSpecialWarningYou(208431)
local yellDescentIntoMadness = mod:NewFadesYell(208431)
local specWarnDreaming = mod:NewSpecialWarningCount(205843, nil, nil, nil, 1, 2)--Mythic
--Stage One: The Decent Into Madness
local specWarnNightmareBlades = mod:NewSpecialWarningMoveAway(206656, nil, nil, nil, 1, 2)
local specWarnCorruptionHorror = mod:NewSpecialWarningSwitchCount("ej12973", "-Healer", nil, nil, 1, 2)
local specWarnCorruptingNova = mod:NewSpecialWarningSpell(207830, nil, nil, nil, 2, 2)
local specWarnDarkeningSoulYou = mod:NewSpecialWarningStack(206651, nil, 3, nil, 2, 1, 6)
local specWarnDarkeningSoulOther = mod:NewSpecialWarningTaunt(206651, nil, nil, nil, 1, 2)
local specWarnTormentingFixation = mod:NewSpecialWarningMoveAway(205771, nil, nil, nil, 1, 2)
local specWarnNightmareInfusionOther = mod:NewSpecialWarningTaunt(209443, nil, nil, nil, 1, 2)
--Stage Two: From the Shadows
local specWarnBondsOfTerror = mod:NewSpecialWarningMoveTo(209034, nil, nil, nil, 1, 2)
local specWarnCorruptionMeteorYou = mod:NewSpecialWarningYou(206308, nil, nil, nil, 1, 2)
local yellMeteor = mod:NewFadesYell(206308)
local specWarnCorruptionMeteorAway = mod:NewSpecialWarningDodge(206308, "-Tank", nil, nil, 2, 2)--No dream, high corruption, dodge it. Subjective and defaults may be altered to off.
local specWarnCorruptionMeteorTo = mod:NewSpecialWarningMoveTo(206308, "-Tank", nil, nil, 1, 2)--Has dream, definitely should help
local specWarnBlackeningSoulYou = mod:NewSpecialWarningStack(209158, nil, 3, nil, 2, 1, 6)
local specWarnBlackeningSoulOther = mod:NewSpecialWarningTaunt(209158, nil, nil, nil, 1, 2)
local specWarnInconHorror = mod:NewSpecialWarningSwitch("ej13162", "-Healer", nil, nil, 1, 2)
--Stage One: The Decent Into Madness
mod:AddTimerLine(SCENARIO_STAGE:format(1))
local timerDarkeningSoulCD = mod:NewCDTimer(7, 206651, nil, "Healer|Tank", nil, 5, nil, DBM_COMMON_L.MAGIC_ICON..DBM_COMMON_L.TANK_ICON)
local timerNightmareBladesCD = mod:NewNextTimer(15.7, 206656, nil, "-Tank", 2, 3)
local timerLurkingEruptionCD = mod:NewCDCountTimer(20.5, 208322, nil, "-Tank", 2, 3)
local timerCorruptionHorrorCD = mod:NewNextCountTimer(82.5, 210264, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON, nil, 1, 4)
local timerCorruptingNovaCD = mod:NewNextTimer(20, 207830, nil, nil, nil, 2)
local timerTormentingSwipeCD = mod:NewCDTimer(10, 224649, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
--Stage Two: From the Shadows
mod:AddTimerLine(SCENARIO_STAGE:format(2))
local timerBondsOfTerrorCD = mod:NewCDTimer(14.1, 209034, nil, "-Tank", 2, 3)
local timerCorruptionMeteorCD = mod:NewCDCountTimer(28, 206308, 57467, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON, nil, not mod:IsTank() and 3 or nil, 4)--Short text "meteor"
local timerBlackeningSoulCD = mod:NewCDTimer(7.2, 209158, nil, "Healer|Tank", nil, 5, nil, DBM_COMMON_L.MAGIC_ICON..DBM_COMMON_L.TANK_ICON)
local timerNightmareInfusionCD = mod:NewCDTimer(61.5, 209443, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON, nil, 2, 4)--61.5-62.5
local timerCallOfNightmaresCD = mod:NewCDTimer(40, 205588, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON, nil, 1, 4)
--Stage Three: Darkness and stuff
mod:AddTimerLine(SCENARIO_STAGE:format(3))
local timerNightmareTentacleCD = mod:NewCDTimer(20, "ej12977", nil, nil, nil, 1, 93708)--226194 is an icon consideration now
mod:AddInfoFrameOption(-12970)
mod:AddBoolOption("InfoFrameFilterDream", true)
mod:AddRangeFrameOption(6, 208322)
mod:AddSetIconOption("SetIconOnBlades", 206656)
mod:AddSetIconOption("SetIconOnMeteor", 206308)
local lurkingTimers = {17, 20.5, 41, 20.5, 20.5}--{13.6, 26.3, 47.4, 20.7, 25.9} old. TODO, get more data, if all but one are 20.5, just code smarter without table
local corruptionName = DBM:EJ_GetSectionInfo(12970)
local darkSoul, blackSoul, dreamDebuff, blackened = DBM:GetSpellName(206651), DBM:GetSpellName(209158), DBM:GetSpellName(206005), DBM:GetSpellName(205612)
local bladesTarget = {}
local gatherTarget = {}
local playerName = UnitName("player")
local playerHasDream = false
mod.vb.phase = 1
mod.vb.lurkingCount = 0
mod.vb.corruptionHorror = 0
mod.vb.inconHorror = 0
mod.vb.meteorCount = 0
mod.vb.lastBonds = nil
mod.vb.dreamCount = 0
local function updateRangeFrame(self)
if not self.Options.RangeFrame then return end
if DBM:UnitDebuff("player", darkSoul) then
if self:IsEasy() then
DBM.RangeCheck:Show(15)
else
DBM.RangeCheck:Show(25)
end
elseif DBM:UnitDebuff("player", blackSoul) then
DBM.RangeCheck:Show(10)--10 for tainted discharge?
elseif self.vb.phase == 1 then--Maybe only show for ranged?
DBM.RangeCheck:Show(6)--Will be rounded up by 7.1+ restrictions
else
DBM.RangeCheck:Hide()
end
end
local function bondsWarning(self)
local previousTarget = nil
for i = 1, #gatherTarget do
local name = gatherTarget[i]
if previousTarget then
if playerName == previousTarget then
specWarnBondsOfTerror:Show(name)
specWarnBondsOfTerror:Play("linegather")
elseif playerName == name then
specWarnBondsOfTerror:Show(previousTarget)
specWarnBondsOfTerror:Play("linegather")
end
end
previousTarget = name
end
table.wipe(gatherTarget)
end
function mod:OnCombatStart(delay)
self.vb.phase = 1
self.vb.lurkingCount = 0
self.vb.corruptionHorror = 0
self.vb.inconHorror = 0
self.vb.meteorCount = 0
self.vb.dreamCount = 0
self.vb.lastBonds = nil
table.wipe(bladesTarget)
table.wipe(gatherTarget)
timerDarkeningSoulCD:Start(-delay)
timerLurkingEruptionCD:Start(13.6-delay, 1)
timerNightmareBladesCD:Start(18.5-delay)
timerCorruptionHorrorCD:Start(58.4-delay, 1)
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(corruptionName)
if self.Options.InfoFrameFilterDream then
DBM.InfoFrame:Show(8, "playerpower", 5, ALTERNATE_POWER_INDEX, dreamDebuff)
else
DBM.InfoFrame:Show(8, "playerpower", 5, ALTERNATE_POWER_INDEX)
end
end
updateRangeFrame(self)
end
function mod:OnCombatEnd()
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
self:UnregisterShortTermEvents()
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 207830 then
timerCorruptingNovaCD:Start(nil, args.sourceGUID)
if self:AntiSpam(2, 1) then
specWarnCorruptingNova:Show(args.sourceName)
specWarnCorruptingNova:Play("aesoon")
end
elseif spellId == 209443 then
if self.vb.phase == 3 then
timerNightmareInfusionCD:Start(31.5)
else
timerNightmareInfusionCD:Start()
end
local targetName, uId = self:GetBossTarget(args.sourceGUID, true)
if self:IsTanking("player", "boss1", nil, true) then
--Player is current target, just give a generic warning, since if player has dream it doesn't matter, if player doesn't, it's OTHER tanks job to fix this
warnNightmareInfusion:Show()
else
--Player has dream buff and current tank does NOT so TAUNT warning.
if playerHasDream and uId and not DBM:UnitDebuff(uId, dreamDebuff) then
specWarnNightmareInfusionOther:Show(targetName)
specWarnNightmareInfusionOther:Play("tauntboss")
end
end
elseif spellId == 205588 then
self.vb.inconHorror = self.vb.inconHorror + 1
specWarnInconHorror:Show(self.vb.inconHorror)
specWarnInconHorror:Play("killmob")
timerCallOfNightmaresCD:Start(nil, self.vb.inconHorror+1)
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 206651 then
timerDarkeningSoulCD:Start()
elseif spellId == 209158 then
timerBlackeningSoulCD:Start()
elseif spellId == 224649 then
warnTormentingSwipe:Show(args.destName)
timerTormentingSwipeCD:Start(nil, args.sourceGUID)
elseif spellId == 210264 then
self.vb.corruptionHorror = self.vb.corruptionHorror + 1
specWarnCorruptionHorror:Show(self.vb.corruptionHorror)
specWarnCorruptionHorror:Play("bigmob")
timerCorruptionHorrorCD:Start(nil, self.vb.corruptionHorror+1)
end
end
function mod:SPELL_SUMMON(args)
local spellId = args.spellId
if spellId == 210264 then
timerTormentingSwipeCD:Start(10, args.destGUID)
timerCorruptingNovaCD:Start(14.5, args.destGUID)
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 208431 then
warnDescentIntoMadness:CombinedShow(0.5, args.destName)
if args:IsPlayer() then
specWarnDescentIntoMadness:Show()
if not playerHasDream then
yellDescentIntoMadness:Schedule(19, 1)
yellDescentIntoMadness:Schedule(18, 2)
yellDescentIntoMadness:Schedule(17, 3)
end
end
elseif spellId == 206651 then
local amount = args.amount or 1
warnDarkeningSoul:Show(args.destName, amount)
if args:IsPlayer() then
if amount >= 3 then
specWarnDarkeningSoulYou:Show(amount)
specWarnDarkeningSoulYou:Play("stackhigh")
end
updateRangeFrame(self)
else
if amount >= 4 then
local filterWarning = false
if self:GetNumAliveTanks() >= 3 then
--Three (or more) Tank Strat AND at least 3 alive
for i = 1, 5 do
--Check if tanking a big add
local bossUnitID = "boss"..i
if UnitExists(bossUnitID) and self:IsTanking("player", bossUnitID, nil, true) and self:GetCIDFromGUID(UnitGUID(bossUnitID)) == 103695 then
filterWarning = true--Tanking big add, in 3 tank strat means this tank has nothing to do with boss swapping.
break
end
end
end
if not filterWarning then
specWarnDarkeningSoulOther:Show(args.destName)
specWarnDarkeningSoulOther:Play("tauntboss")
end
end
end
elseif spellId == 209158 then
local amount = args.amount or 1
warnBlackeningSoul:Show(args.destName, amount)
if args:IsPlayer() then
if amount >= 3 then
specWarnBlackeningSoulYou:Show(amount)
specWarnBlackeningSoulYou:Play("stackhigh")
end
updateRangeFrame(self)
else
if amount >= 4 then
local filterWarning = false
if self:GetNumAliveTanks() >= 3 then
--Three (or more) Tank Strat AND at least 3 alive
for i = 1, 5 do
--Check if tanking a big add
local bossUnitID = "boss"..i
if UnitExists(bossUnitID) and self:IsTanking("player", bossUnitID, nil, true) and self:GetCIDFromGUID(UnitGUID(bossUnitID)) == 103695 then
filterWarning = true--Tanking big add, in 3 tank strat means this tank has nothing to do with boss swapping.
break
end
end
end
if not filterWarning and not DBM:UnitDebuff("player", blackened) then
specWarnBlackeningSoulOther:Show(args.destName)
specWarnBlackeningSoulOther:Play("tauntboss")
end
end
end
elseif spellId == 205771 then
warnTormentingFixation:CombinedShow(1, args.destName)
if args:IsPlayer() then
specWarnTormentingFixation:Show()
specWarnTormentingFixation:Play("targetyou")
end
elseif spellId == 211802 then
warnNightmareBlades:CombinedShow(0.5, args.destName)
if not tContains(bladesTarget, args.destName) then
bladesTarget[#bladesTarget+1] = args.destName
end
if args:IsPlayer() then
specWarnNightmareBlades:Show()
specWarnNightmareBlades:Play("runout")
end
if self.Options.SetIconOnBlades then
self:SetIcon(args.destName, #bladesTarget)
end
elseif spellId == 209034 or spellId == 210451 then
warnBondsOfTerror:CombinedShow(0.5, args.destName)
self:Unschedule(bondsWarning)
if not tContains(gatherTarget, args.destName) then
gatherTarget[#gatherTarget+1] = args.destName
end
if #gatherTarget == 2 then--Know it's 2 on heroic and normal, mythic unknown LFR assumed can't be more than normal/heroic.
bondsWarning(self)
else
self:Schedule(1, bondsWarning, self)
end
elseif spellId == 224508 then
if args:IsPlayer() then
specWarnCorruptionMeteorYou:Show()
specWarnCorruptionMeteorYou:Play("targetyou")
yellMeteor:Countdown(spellId)
else
if playerHasDream then
specWarnCorruptionMeteorTo:Show(args.destName)
specWarnCorruptionMeteorTo:Play("gathershare")
else
local maxPower = UnitPowerMax("player", ALTERNATE_POWER_INDEX)
if maxPower > 0 then
local playerPower = UnitPower("player", ALTERNATE_POWER_INDEX) / maxPower * 100
if self.vb.phase == 3 and playerPower > 75 or playerPower > 55 then--Avoid it if corruption too high for it
specWarnCorruptionMeteorAway:Show()
specWarnCorruptionMeteorAway:Play("watchstep")
end
end
end
end
if self.Options.SetIconOnMeteor then
self:SetIcon(args.destName, 6)
end
elseif spellId == 206005 then
if args:IsPlayer() then
playerHasDream = true
end
if self:IsTank() then
local uId = DBM:GetRaidUnitId(args.destName)
if uId and self:IsTanking(uId) then
warnDreamOthers:CombinedShow(0.3, args.destName)
end
elseif self:IsHealer() then
local uId = DBM:GetRaidUnitId(args.destName)
if uId and self:IsHealer(uId) then
warnDreamOthers:CombinedShow(0.3, args.destName)
end
else--Just an unspecial dps
if args:IsPlayer() then
warnDream:Show()
end
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 208431 and args:IsPlayer() then
yellDescentIntoMadness:Cancel()
elseif spellId == 211802 then
bladesTarget[args.destName] = nil
if self.Options.SetIconOnBlades then
self:SetIcon(args.destName, 0)
end
elseif spellId == 206651 then
if args:IsPlayer() then
updateRangeFrame(self)
end
elseif spellId == 209158 then
if args:IsPlayer() then
updateRangeFrame(self)
end
elseif spellId == 209034 or spellId == 210451 then
elseif spellId == 224508 then
if args:IsPlayer() then
yellMeteor:Cancel()
end
if self.Options.SetIconOnMeteor then
self:SetIcon(args.destName, 0)
end
elseif spellId == 206005 then
if args:IsPlayer() then
playerHasDream = false
end
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 103695 then--Corruption Horror
timerCorruptingNovaCD:Stop(args.destGUID)
timerTormentingSwipeCD:Stop(args.destGUID)
end
end
function mod:SPELL_PERIODIC_ENERGIZE(_, _, _, _, destGUID, _, _, _, spellId)
if spellId == 208385 then
DBM:Debug("SPELL_PERIODIC_ENERGIZE fired for Tainted Discharge", 3)
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 206341 then--Corruption Meteor (casting not in combat log, targetting is finally but I trust this more for timer in case targetting can be gamed.)
self.vb.meteorCount = self.vb.meteorCount + 1
if self.vb.phase == 3 then
timerCorruptionMeteorCD:Start(35, self.vb.meteorCount+1)--35-38 in phase 3
else
timerCorruptionMeteorCD:Start(nil, self.vb.meteorCount+1)--Generally always 28
end
elseif spellId == 209000 then--Nightmare Blades (casting not in combat log)
if self.vb.phase == 3 then
timerNightmareBladesCD:Start(30)--Every 30 or so
else
timerNightmareBladesCD:Start()--Every 15.7 or so
end
elseif spellId == 209034 then--Bonds of Terror (casting not in combat log)
timerBondsOfTerrorCD:Start()
elseif spellId == 208322 then--Lurking Eruption
self.vb.lurkingCount = self.vb.lurkingCount + 1
local timers = lurkingTimers[self.vb.lurkingCount+1]
if timers then
timerLurkingEruptionCD:Start(timers, self.vb.lurkingCount+1)
else
timerLurkingEruptionCD:Start(20.5, self.vb.lurkingCount+1)
end
elseif spellId == 226193 then--Xavius Energize Phase 2
self.vb.phase = 2
warnPhase2:Show()
warnPhase2:Play("ptwo")
timerNightmareBladesCD:Stop()
timerLurkingEruptionCD:Stop()
timerCorruptionHorrorCD:Stop()
timerBlackeningSoulCD:Start(7)
timerBondsOfTerrorCD:Start(14)
timerCorruptionMeteorCD:Start(21, 1)
timerCallOfNightmaresCD:Start(23, 1)
timerNightmareInfusionCD:Start(30)
updateRangeFrame(self)
self:RegisterShortTermEvents(
"SPELL_PERIODIC_ENERGIZE 208385"
)
elseif spellId == 226185 then--Xavius Energize Phase 3
self.vb.phase = 3
warnPhase3:Show()
warnPhase3:Play("pthree")
timerBlackeningSoulCD:Stop()
timerBondsOfTerrorCD:Stop()
timerCallOfNightmaresCD:Stop()
timerCorruptionMeteorCD:Stop()
timerNightmareInfusionCD:Stop()
timerNightmareInfusionCD:Start(11)
timerBlackeningSoulCD:Start(15)
timerCorruptionMeteorCD:Start(20.5, 1)
timerNightmareBladesCD:Start(30)
self:UnregisterShortTermEvents()
elseif spellId == 226194 then--Writhing Deep
warnNightmareTentacles:Show()
timerNightmareTentacleCD:Start()
elseif spellId == 205843 and self:IsMythic() then
self.vb.dreamCount = self.vb.dreamCount + 1
local count = self.vb.dreamCount
specWarnDreaming:Show(count)
specWarnDreaming:Play(nil, "Interface\\AddOns\\DBM-VP"..DBM.Options.ChosenVoicePack2.."\\count\\"..count..".ogg")
specWarnDreaming:ScheduleVoice(1, "stepring")
end
end