local mod = DBM : NewMod ( 1706 , " DBM-Raids-Legion " , 3 , 786 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240428104720 " )
mod : SetCreatureID ( 102263 )
mod : SetEncounterID ( 1849 )
mod : DisableESCombatDetection ( ) --Remove if blizz fixes trash firing ENCOUNTER_START
mod : SetUsedIcons ( 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 )
--mod:SetHotfixNoticeRev(12324)
mod.respawnTime = 30
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 204275 204372 204316 204471 " ,
" SPELL_CAST_SUCCESS 204316 " ,
" SPELL_SUMMON 204292 " ,
" SPELL_AURA_APPLIED 204531 204459 204697 204744 " ,
" SPELL_AURA_REMOVED 204459 204697 " ,
" SPELL_PERIODIC_DAMAGE 204744 " ,
" SPELL_PERIODIC_MISSED 204744 " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 " ,
" UNIT_SPELLCAST_INTERRUPTED boss1 "
)
--TODO, Mythic Transform casts still push timers back by 3-6 seconds. timer correction gets even more tedius with that so feeling lazy about that for now.
--I believe he'll just use whatever abilities he's ready to use after his stun is gone. So maybe just extend timers that expire during stun, or just leave be.
--[[
( ability.id = 204372 or ability.id = 204316 or ability.id = 204471 ) and type = " begincast " or
ability.id = 204292 and type = " summon " or
ability.id = 204459
--]]
local warnBrokenShard = mod : NewSpellAnnounce ( 204292 , 2 , nil , false , 2 )
local warnVulnerable = mod : NewTargetAnnounce ( 204459 , 1 )
local warnRed = mod : NewSpellAnnounce ( 214661 , 2 )
local warnGreen = mod : NewSpellAnnounce ( 214652 , 2 )
local warnBlue = mod : NewSpellAnnounce ( 204292 , 2 )
local specWarnTether = mod : NewSpecialWarningYou ( 204531 , nil , nil , nil , 1 , 12 )
local specWarnArcanoslash = mod : NewSpecialWarningDefensive ( 204275 , " Tank " , nil , nil , 1 , 2 )
local specWarnCallofScorp = mod : NewSpecialWarningSwitch ( 204372 , " Tank " , nil , nil , 1 , 2 ) --Determine common strat for dps switching
local specWarnFocusedBlast = mod : NewSpecialWarningDodge ( 204471 , nil , nil , nil , 2 , 2 )
local specWarnShockwave = mod : NewSpecialWarningMoveTo ( 204316 , nil , nil , nil , 3 , 2 )
local specWarnVulnerableStarted = mod : NewSpecialWarningSwitch ( 204459 , false , nil , nil , 1 )
local specWarnVulnerableOver = mod : NewSpecialWarningEnd ( 204459 , false , nil , nil , 1 ) --Special warning because anything that came off cd during stun, is being cast immediately
local specWarnToxicChit = mod : NewSpecialWarningMove ( 204744 , nil , nil , nil , 1 , 2 )
local timerArcanoslashCD = mod : NewCDTimer ( 9.6 , 204275 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerCallofScorpidCD = mod : NewCDTimer ( 20.3 , 204372 , 88879 , nil , nil , 1 , nil , nil , nil , 2 , 4 ) --20-22 Unless delayed by shockwave/stun then as high as 40
local timerShockwaveCD = mod : NewCDTimer ( 57.9 , 204316 , nil , nil , nil , 2 , nil , DBM_COMMON_L.DEADLY_ICON , nil , 1 , 4 ) --58-60
local timerFocusedBlastCD = mod : NewCDTimer ( 30.4 , 204471 , nil , nil , nil , 3 , nil , nil , nil , 3 , 4 ) --30-34 (32.8 NEW data)
local timerVulnerable = mod : NewBuffFadesTimer ( 15 , 204459 , nil , nil , nil , 6 )
mod : AddSetIconOption ( " SetIconOnVolatileScorpion " , 204697 , true , 5 )
mod : AddInfoFrameOption ( 204284 )
mod.vb . volatileScorpCount = 0
local shardName , goodDebuff = DBM : GetSpellName ( 204292 ) , DBM : GetSpellName ( 204284 )
function mod : OnCombatStart ( delay )
self.vb . volatileScorpCount = 0
timerArcanoslashCD : Start ( 5 - delay )
timerFocusedBlastCD : Start ( 13 - delay )
timerCallofScorpidCD : Start ( - delay ) --21.7
timerShockwaveCD : Start ( 56.2 - delay ) --56.9
-- if self:IsMythic() then
-- timerVolatileFragments:Start(28-delay)
-- end
end
function mod : OnCombatEnd ( )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 204275 and self : AntiSpam ( 5 , 1 ) then
if self : IsTanking ( " player " , " boss1 " , nil , true ) then
specWarnArcanoslash : Show ( )
specWarnArcanoslash : Play ( " defensive " )
end
timerArcanoslashCD : Start ( )
elseif spellId == 204372 then
timerCallofScorpidCD : Start ( )
if self.Options . SpecWarn204372switch and self : AntiSpam ( 3.5 , 2 ) then --Even if enabled, only special warn once every 3.5 seconds
specWarnCallofScorp : Show ( )
specWarnCallofScorp : Play ( " killmob " )
end
elseif spellId == 204316 then
specWarnShockwave : Show ( shardName )
specWarnShockwave : Play ( " findshelter " )
--specWarnShockwave:CancelVoice()--In case boss stutter cases or starts cast over
--specWarnShockwave:ScheduleVoice(3.5, "safenow")
timerShockwaveCD : Start ( )
local scorptAdjust = 11
local blastElapsed , blastTotal = timerFocusedBlastCD : GetTime ( )
local blastRemaining = blastTotal - blastElapsed
if blastRemaining < 11 then --delayed by shockwave
scorptAdjust = 14 --Blast will always come before scorpid, if blast takes 11 second spot, scorpid is pushed to 14sec spot
timerFocusedBlastCD : Stop ( )
if blastTotal == 0 then --Just in case timer expired just before cast
DBM : Debug ( " experimental timer extend firing for Focused Blast. Extend amount: " .. 11 , 2 )
timerFocusedBlastCD : Start ( 11 )
else
local extend = 11 - blastTotal
DBM : Debug ( " experimental timer extend firing for Focused Blast. Extend amount: " .. extend , 2 )
timerFocusedBlastCD : Update ( blastElapsed , blastTotal + extend )
end
end
local elapsed , total = timerCallofScorpidCD : GetTime ( )
local remaining = total - elapsed
if remaining < scorptAdjust then --delayed by shockwave
timerCallofScorpidCD : Stop ( )
if total == 0 then --Just in case timer expired just before cast
DBM : Debug ( " experimental timer extend firing for call of scorpid. Extend amount: " .. scorptAdjust , 2 )
timerCallofScorpidCD : Start ( scorptAdjust )
else
local extend = scorptAdjust - remaining
DBM : Debug ( " experimental timer extend firing for call of scorpid. Extend amount: " .. extend , 2 )
timerCallofScorpidCD : Update ( elapsed , total + extend )
end
end
if self.Options . InfoFrame then
DBM.InfoFrame : SetHeader ( DBM_COMMON_L.NO_DEBUFF : format ( goodDebuff ) )
DBM.InfoFrame : Show ( 5 , " playergooddebuff " , goodDebuff )
end
elseif spellId == 204471 then
specWarnFocusedBlast : Show ( )
specWarnFocusedBlast : Play ( " watchstep " )
timerFocusedBlastCD : Start ( )
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 204316 and self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
function mod : SPELL_SUMMON ( args )
local spellId = args.spellId
if spellId == 204292 then
warnBrokenShard : Show ( )
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 204531 then
if args : IsPlayer ( ) then
specWarnTether : Show ( )
specWarnTether : Play ( " breakchain " )
end
elseif spellId == 204459 then
if self.Options . SpecWarn204459switch then
specWarnVulnerableStarted : Show ( )
else
warnVulnerable : Show ( args.destName )
end
timerVulnerable : Start ( )
timerFocusedBlastCD : Stop ( )
timerCallofScorpidCD : Stop ( )
local shockwaveElapsed , shockwaveTotal = timerShockwaveCD : GetTime ( )
local shockwaveRemaining = shockwaveTotal - shockwaveElapsed
if shockwaveRemaining < 14 then
--Shockwave immediately coming out of stun
--Shockwave will trigger new timers for scorpid and focused blast
timerShockwaveCD : Stop ( )
timerShockwaveCD : Start ( 15 )
DBM : Debug ( " experimental timer extend firing for shockwave. Extend amount: 14. Blast and scorpid will be delayed " , 2 )
else
--Focused blast coming out of stun followed by scorpid
timerFocusedBlastCD : Start ( 18 )
timerCallofScorpidCD : Start ( 21 )
DBM : Debug ( " Shockwaves cd is long enough to allow Focused Blast to proceed next " , 2 )
end
elseif spellId == 204697 then --Red scorpion
if self.Options . SpecWarn204372switch and self : AntiSpam ( 3.5 , 2 ) then --Even if enabled, only special warn once every 3.5 seconds
specWarnCallofScorp : Show ( )
specWarnCallofScorp : Play ( " killmob " )
end
self.vb . volatileScorpCount = self.vb . volatileScorpCount + 1
if self.Options . SetIconOnVolatileScorpion then
local icon = 9 - self.vb . volatileScorpCount
self : ScanForMobs ( args.destGUID , 2 , icon , 1 , nil , 10 , " SetIconOnVolatileScorpion " )
end
elseif spellId == 204744 and args : IsPlayer ( ) and self : AntiSpam ( 2 , 3 ) then
specWarnToxicChit : Show ( )
specWarnToxicChit : Play ( " runaway " )
end
end
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 204459 then
specWarnVulnerableOver : Show ( )
elseif spellId == 204697 then --Red scorpion
self.vb . volatileScorpCount = self.vb . volatileScorpCount - 1
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId )
if spellId == 204744 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 3 ) then
specWarnToxicChit : Show ( )
specWarnToxicChit : Play ( " runaway " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 214800 then --Transform(Red)
warnRed : Show ( )
-- timerAcidicFragments:Start()
elseif spellId == 215042 then --Transform(Green)
warnGreen : Show ( )
-- timerCrystallineFragments:Start()
elseif spellId == 215055 then --Transform(Blue)
warnBlue : Show ( )
-- timerVolatileFragments:Start()
end
end
--Shockwave does NOT go on cooldown if he doesn't finish cast. This happens if he gets stunned before cast finishes
function mod : UNIT_SPELLCAST_INTERRUPTED ( uId , _ , spellId )
if spellId == 204316 then --Shockwave
timerShockwaveCD : Stop ( )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
end