local mod = DBM : NewMod ( 1713 , " DBM-Raids-Legion " , 3 , 786 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240428104720 " )
mod : SetCreatureID ( 101002 )
mod : SetEncounterID ( 1842 )
--mod:SetUsedIcons(8, 7, 6, 3, 2, 1)
mod : SetHotfixNoticeRev ( 15740 )
mod.respawnTime = 29 --or 30
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 205368 205370 205420 209017 206351 205862 205361 " ,
" SPELL_AURA_APPLIED 206677 205344 " ,
" SPELL_AURA_APPLIED_DOSE 206677 " ,
" SPELL_AURA_REMOVED 205344 " ,
" UNIT_DIED " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 "
)
--(ability.id = 205368 or ability.id = 205370 or ability.id = 205420 or ability.id = 205361) and type = "begincast"
local warnExpelOrbDestro = mod : NewTargetCountAnnounce ( 205344 , 4 )
local warnSlamSoon = mod : NewAnnounce ( " warnSlamSoon " , 4 , 205862 , nil , nil , true )
local warnSlam = mod : NewCountAnnounce ( 205862 , 2 ) --Regular slams don't need special warn, only bridge smashing ones
local specWarnSearingBrand = mod : NewSpecialWarningStack ( 206677 , nil , 4 , nil , 2 , 1 , 6 ) --Lets go with 4 for now
local specWarnSearingBrandOther = mod : NewSpecialWarningTaunt ( 206677 , nil , nil , nil , 1 , 2 )
local specWarnFelBeam = mod : NewSpecialWarningDodge ( 205368 , nil , nil , nil , 2 , 2 )
local specWarnOrbDestro = mod : NewSpecialWarningMoveAway ( 205344 , nil , nil , nil , 3 , 2 )
local yellOrbDestro = mod : NewFadesYell ( 205344 )
local specWarnBurningPitch = mod : NewSpecialWarningCount ( 205420 , nil , nil , nil , 2 , 6 )
local specWarnSlam = mod : NewSpecialWarningRun ( 205862 , nil , nil , nil , 4 , 2 )
local specWarnFelBlast = mod : NewSpecialWarningInterrupt ( 209017 , false , nil , 2 , 1 , 2 )
local specWarnFelBurst = mod : NewSpecialWarningInterrupt ( 206351 , " HasInterrupt " , nil , nil , 1 , 2 )
local timerSearingBrand = mod : NewTargetTimer ( 20 , 206677 , nil , " Tank " , nil , 5 )
local timerFelBeamCD = mod : NewNextCountTimer ( 16 , 205368 , 173303 , nil , nil , 3 ) --Short text "Beam"
local timerOrbDestroCD = mod : NewNextCountTimer ( 16 , 205344 , DBM_COMMON_L.ORB , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON , nil , 3 , 4 ) --Shor timer text "Orb"
local timerBurningPitchCD = mod : NewNextCountTimer ( 16 , 205420 , nil , nil , 2 , 5 )
local timerSlamCD = mod : NewNextCountTimer ( 30 , 205862 , nil , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON , nil , 1 , 4 )
local berserkTimer = mod : NewBerserkTimer ( 360 ) --technically not a berserk, but raid instantly wipes during final bridge smash, at 6 minutes.
mod : AddRangeFrameOption ( 5 , 206351 )
mod : AddSetIconOption ( " SetIconOnAdds " , " ej12914 " , true , 5 )
mod : AddArrowOption ( " ArrowOnBeam3 " , 205368 , true )
local burningPitchDebuff = DBM : GetSpellName ( 215944 )
local mobGUIDs = { }
--Beams (205370/205368 Combined)
local lolBeamTimers = { 5 , 15 , 30 , 30 , 23 , 27 , 30 , 44 , 14 , 16 , 14 , 16 , 22 , 60 } --LFR & Normal
local heroicBeamTimers = { 7.0 , 29.0 , 30.0 , 42.0 , 16.0 , 16.0 , 14.0 , 16.0 , 27.0 , 54.0 , 26.0 , 5 , 5 , 16 , 5 , 12 , 12 , 5 , 13 } --Complete up to berserk (not yet verified in 7.1.5)
--8.0, 29.0, 30.0, 45.0, 16.0, 16.0, 14.0, 16.0, 27.0, 55.0, 26.0, 43.0--Dec 7th. However Double beams aren't combined in these so can't really merge cleanly
local mythicBeamTimers = { 6 , 16 , 16 , 16 , 14 , 16 , 27 , 55 , 26 , 4.7 , 21.3 , 4.7 , 12.2 , 12 , 4.7 , 13.2 , 19 , 4.7 , 25.2 , 4.7 , 25.2 , 4.7 } --(up to 5:55, missing 5 seconds?)
--Orbs
local lolOrbTimers = { 70.0 , 40.0 , 60.0 , 25.0 , 60.0 , 37.0 , 15.0 , 15.0 , 30.0 } --LFR and Normal
local heroicOrbTimers = { 19.9 , 60.0 , 23.0 , 62.0 , 27.0 , 25.0 , 15.0 , 15.4 , 14.6 , 30 , 55 } --Verified Dec 7
local mythicOrbTimers = { 13 , 62 , 27 , 25 , 14.9 , 15 , 15 , 30 , 55.1 , 38 , 30 , 12 , 18 } --(up to 5:55, missing 5 seconds?)
--Pitch
local lolBurningPitchTimers = { 38.0 , 102.0 , 85.0 , 90.0 } --LFR and Normal
local heroicBurningPitchTimers = { 49.8 , 85.0 , 90.0 , 94 } --Verified Dec 7
local mythicBurningPitchTimers = { 45.0 , 90 , 93.9 , 78 }
local minAmount , maxAmount = 2 , 4
mod.vb . burningEmbers = 0
mod.vb . slamCount = 0
mod.vb . beamCount = 0
mod.vb . orbCount = 0
mod.vb . pitchCount = 0
mod.vb . firstBeam = 0 --0 Not sent, 1 Left, 2 Right
--/run DBMUpdateKrosusBeam(wasLeft)
--Global on purpose for external mod support
--DBM:GetModByName("1713"):SendBigWigsSync("firstBeamWasLeft")
_G [ " DBMUpdateKrosusBeam " ] = function ( wasLeft )
if wasLeft then
mod.vb . firstBeam = 1
if not mod : IsLFR ( ) then
mod : SendBigWigsSync ( " firstBeamWasLeft " )
end
else
mod.vb . firstBeam = 2
if not mod : IsLFR ( ) then
mod : SendBigWigsSync ( " firstBeamWasRight " )
end
end
end
function mod : OnCombatStart ( delay )
if self : IsTrivial ( ) or self : IsLFR ( ) then
minAmount , maxAmount = 8 , 16
elseif self : IsNormal ( ) then
minAmount , maxAmount = 4 , 8
elseif self : IsHeroic ( ) then
minAmount , maxAmount = 3 , 6
else --Mythic
minAmount , maxAmount = 2 , 4
end
table.wipe ( mobGUIDs )
self.vb . burningEmbers = 0
self.vb . slamCount = 0
self.vb . beamCount = 0
self.vb . orbCount = 0
self.vb . pitchCount = 0
self.vb . firstBeam = 0
warnSlamSoon : Countdown ( 90 )
timerSlamCD : Start ( - delay , 1 )
berserkTimer : Start ( - delay )
if self : IsMythic ( ) then
timerFelBeamCD : Start ( 6 - delay , 1 )
timerOrbDestroCD : Start ( 13 - delay , 1 )
timerBurningPitchCD : Start ( 45 - delay , 1 )
elseif self : IsHeroic ( ) then
timerFelBeamCD : Start ( 5 - delay , 1 )
timerOrbDestroCD : Start ( 20 - delay , 1 )
timerBurningPitchCD : Start ( 50 - delay , 1 )
else
timerFelBeamCD : Start ( 5 - delay , 1 )
timerBurningPitchCD : Start ( 38 - delay , 1 )
timerOrbDestroCD : Start ( 70 - delay , 1 )
end
end
function mod : OnCombatEnd ( )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 205368 or spellId == 205370 then --205370 left, 205368 right (right no longer is used)
self.vb . beamCount = self.vb . beamCount + 1
specWarnFelBeam : Show ( )
local nextCount = self.vb . beamCount + 1
local timerText = nextCount
if self.vb . firstBeam == 2 then --First Beam Right
if self.vb . beamCount % 2 == 0 then --Coming from left (facing boss)
specWarnFelBeam : Play ( " moveright " )
timerText = L.MoveLeft --Timer text is backwards cause it's for NEXT beam
if self.Options . ArrowOnBeam3 then
DBM.Arrow : ShowStatic ( 270 , 4 )
end
else --coming from right (facing boss)
specWarnFelBeam : Play ( " moveleft " )
timerText = L.MoveRight --Timer text is backwards cause it's for NEXT beam
if self.Options . ArrowOnBeam3 then
DBM.Arrow : ShowStatic ( 90 , 4 )
end
end
elseif self.vb . firstBeam == 1 then --First Beam Left
if self.vb . beamCount % 2 == 0 then --Coming from right (facing boss)
specWarnFelBeam : Play ( " moveleft " )
timerText = L.MoveRight --Timer text is backwards cause it's for NEXT beam
if self.Options . ArrowOnBeam3 then
DBM.Arrow : ShowStatic ( 90 , 4 )
end
else --coming from left (facing boss)
specWarnFelBeam : Play ( " moveright " )
timerText = L.MoveLeft --Timer text is backwards cause it's for NEXT beam
if self.Options . ArrowOnBeam3 then
DBM.Arrow : ShowStatic ( 270 , 4 )
end
end
else
specWarnFelBeam : Play ( " shockwave " )
end
local timers = self : IsMythic ( ) and mythicBeamTimers [ nextCount ] or self : IsHeroic ( ) and heroicBeamTimers [ nextCount ] or lolBeamTimers [ nextCount ]
if timers then
timerFelBeamCD : Start ( timers , timerText )
end
elseif spellId == 205420 then
self.vb . pitchCount = self.vb . pitchCount + 1
specWarnBurningPitch : Show ( self.vb . pitchCount )
if DBM : UnitDebuff ( " player " , burningPitchDebuff ) then
specWarnBurningPitch : Play ( " watchstep " )
else
specWarnBurningPitch : Play ( " helpsoak " )
end
local nextCount = self.vb . pitchCount + 1
local timers = self : IsMythic ( ) and mythicBurningPitchTimers [ nextCount ] or self : IsHeroic ( ) and heroicBurningPitchTimers [ nextCount ] or lolBurningPitchTimers [ nextCount ]
if timers then
timerBurningPitchCD : Start ( timers , nextCount )
end
elseif spellId == 209017 and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnFelBlast : Show ( args.sourceName )
specWarnFelBlast : Play ( " kickcast " )
elseif spellId == 206351 then
if not mobGUIDs [ args.sourceGUID ] then
mobGUIDs [ args.sourceGUID ] = true
self.vb . burningEmbers = self.vb . burningEmbers + 1
if self.Options . RangeFrame and not DBM.RangeCheck : IsShown ( ) then
DBM.RangeCheck : Show ( 5 )
end
if self.Options . SetIconOnAdds then
self : ScanForMobs ( args.sourceGUID , 0 , 8 , 8 , nil , 15 , " SetIconOnAdds " )
end
end
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnFelBurst : Show ( args.sourceName )
specWarnFelBurst : Play ( " kickcast " )
end
elseif spellId == 205862 then
self.vb . slamCount = self.vb . slamCount + 1
timerSlamCD : Start ( nil , self.vb . slamCount + 1 )
if self.vb . slamCount % 3 == 0 then
specWarnSlam : Show ( )
specWarnSlam : Play ( " justrun " )
warnSlamSoon : Countdown ( 90 )
else
warnSlam : Show ( self.vb . slamCount )
if self : IsTank ( ) then
specWarnSlam : Play ( " helpsoak " )
else
specWarnSlam : Play ( " watchstep " )
end
end
elseif spellId == 205361 then
self.vb . orbCount = self.vb . orbCount + 1
local nextCount = self.vb . orbCount + 1
local timers = self : IsMythic ( ) and mythicOrbTimers [ nextCount ] or self : IsHeroic ( ) and heroicOrbTimers [ nextCount ] or lolOrbTimers [ nextCount ]
if timers then
timerOrbDestroCD : Start ( timers , nextCount )
end
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 206677 then
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsTanking ( uId ) then
local amount = args.amount or 1
timerSearingBrand : Start ( args.destName )
if amount >= minAmount then
if args : IsPlayer ( ) then
if amount >= maxAmount then
specWarnSearingBrand : Show ( amount )
specWarnSearingBrand : Play ( " stackhigh " )
end
else
if not DBM : UnitDebuff ( " player " , args.spellName ) and not UnitIsDeadOrGhost ( " player " ) then
specWarnSearingBrandOther : Show ( args.destName )
specWarnSearingBrandOther : Play ( " tauntboss " )
end
end
end
end
elseif spellId == 205344 then
if args : IsPlayer ( ) then --Still do yell and range frame here, in case DK
specWarnOrbDestro : Show ( )
specWarnOrbDestro : Play ( " runout " )
yellOrbDestro : Yell ( 5 )
yellOrbDestro : Schedule ( 4 , 1 )
yellOrbDestro : Schedule ( 3 , 2 )
yellOrbDestro : Schedule ( 2 , 3 )
else
warnExpelOrbDestro : Show ( self.vb . orbCount , args.destName )
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 205344 then
if args : IsPlayer ( ) then
yellOrbDestro : Cancel ( )
end
end
end
function mod : UNIT_DIED ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 104262 then --Burning Ember
self.vb . burningEmbers = self.vb . burningEmbers - 1
mobGUIDs [ args.destGUID ] = nil
if self.Options . RangeFrame and self.vb . burningEmbers == 0 then
DBM.RangeCheck : Hide ( )
end
end
end
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 205383 then --Fel Beam (fires for left and right) Does not fire for double beams
DBM : Debug ( " Single Beam " , 2 )
elseif spellId == 215961 then --Double Beam (fires for the double beam sequence where you get both beams back to back. Only fires at start of it not each beam*)
DBM : Debug ( " Double Beam " , 2 )
end
end
--Listen for Krosus Assist on Bigwigs Comms to make compat with mod much easier for elvador
function mod : OnBWSync ( msg )
if msg == " firstBeamWasLeft " then
self.vb . firstBeam = 1
DBM : Debug ( " Recieved Left Beam Sync " )
elseif msg == " firstBeamWasRight " then
self.vb . firstBeam = 2
DBM : Debug ( " Recieved Right Beam Sync " )
end
end