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