local mod = DBM : NewMod ( 2499 , " DBM-VaultoftheIncarnates " , nil , 1200 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20221220184541 " )
--mod:SetCreatureID(181224)--way too many CIDs to guess right now
mod : SetEncounterID ( 2607 )
mod : SetUsedIcons ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 )
mod : SetHotfixNoticeRev ( 20221220000000 )
mod : SetMinSyncRevision ( 20221217000000 )
--mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 377612 388643 377658 377594 385065 385553 397382 397468 387261 385574 389870 385068 395885 386410 382434 390463 " ,
" SPELL_CAST_SUCCESS 381615 396037 399713 181089 381249 378829 382434 " ,
" SPELL_AURA_APPLIED 381615 388631 395906 388115 396037 385541 397382 397387 388691 391990 394574 394576 391991 394579 394575 394582 391993 394584 377467 395929 391285 399713 391281 " ,
-- "SPELL_AURA_APPLIED_DOSE",
" SPELL_AURA_REMOVED 381615 396037 385541 397382 397387 388691 377467 399713 " ,
" SPELL_PERIODIC_DAMAGE 395929 " ,
" SPELL_PERIODIC_MISSED 395929 " ,
" UNIT_DIED " ,
" CHAT_MSG_RAID_BOSS_EMOTE " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 "
)
--TODO, initial CD timers for spawning in adds, if timers are used for the mythic only stuff
--TODO, track and alert high stacks of https://www.wowhead.com/beta/spell=385560/windforce-strikes on Oathsworn?
--TODO, determine number adds and spawn behavior for auto marking Stormseeker Acolyte for interrupt assignments?
--TODO, use specWarnScatteredCharge once coding is verified it's being avoided for now to avoid SW spam
--TODO, a note that using the emote is able to detect whether dragon is breathing YOUR Platform, but it also requires localizing so many language won't get most important warning of intermission
--[[
( ability.id = 377612 or ability.id = 388643 or ability.id = 377658 or ability.id = 377594
or ability.id = 385065 or ability.id = 397382 or ability.id = 397468 or ability.id = 387261 or ability.id = 385574 or ability.id = 389870
or ability.id = 385068 or ability.id = 395885 or ability.id = 386410 or ability.id = 382434 or ability.id = 390463 ) and type = " begincast "
or ( ability.id = 381615 or ability.id = 396037 or ability.id = 378829 or ability.id = 399713 or ability.id = 382434 or ability.id = 390463 or ability.id = 381249 ) and type = " cast "
or ability.id = 388431 or ability.id = 396734
or ability.id = 181089 and type = " cast "
or ( ability.id = 391281 or ability.id = 391402 or ability.id = 389214 ) and type = " applybuff "
--]]
--General
local warnPhase = mod : NewPhaseChangeAnnounce ( 2 , nil , nil , nil , nil , nil , 2 )
local specWarnGTFO = mod : NewSpecialWarningGTFO ( 388115 , nil , nil , nil , 1 , 8 )
local timerPhaseCD = mod : NewPhaseTimer ( 30 )
--local berserkTimer = mod:NewBerserkTimer(600)
--mod:AddRangeFrameOption("8")
--Stage One: The Winds of Change
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25244 ) )
local warnStaticCharge = mod : NewTargetNoFilterAnnounce ( 381615 , 3 )
local warnLightningStrike = mod : NewSpellAnnounce ( 376126 , 3 )
--local specWarnInfusedStrikes = mod:NewSpecialWarningStack(361966, nil, 8, nil, nil, 1, 6)
local specWarnHurricaneWing = mod : NewSpecialWarningCount ( 377612 , nil , nil , nil , 2 , 2 )
local specWarnStaticCharge = mod : NewSpecialWarningYouPos ( 381615 , nil , 37859 , nil , 1 , 2 )
local yellStaticCharge = mod : NewShortPosYell ( 381615 , 37859 )
local yellStaticChargeFades = mod : NewIconFadesYell ( 381615 , 37859 )
local specWarnVolatileCurrent = mod : NewSpecialWarningMoveAwayCount ( 388643 , nil , nil , nil , 2 , 2 )
local specWarnElectrifiedJaws = mod : NewSpecialWarningDefensive ( 377658 , nil , nil , nil , 1 , 2 )
local specWarnElectrifiedJawsOther = mod : NewSpecialWarningTaunt ( 377658 , nil , nil , nil , 1 , 2 )
local specWarnLightingBreath = mod : NewSpecialWarningDodgeCount ( 388643 , nil , nil , nil , 2 , 2 )
local timerHurricaneWingCD = mod : NewCDCountTimer ( 35 , 377612 , nil , nil , nil , 2 )
local timerStaticChargeCD = mod : NewCDCountTimer ( 35 , 381615 , nil , nil , nil , 3 )
local timerStaticCharge = mod : NewCastTimer ( 35 , 381615 , nil , nil , nil , 2 , nil , DBM_COMMON_L.HEALER_ICON )
local timerVolatileCurrentCD = mod : NewCDCountTimer ( 47 , 388643 , nil , nil , nil , 3 ) --More data needed
local timerElectrifiedJawsCD = mod : NewCDCountTimer ( 25 , 377658 , nil , " Tank|Healer " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerLightningBreathCD = mod : NewCDCountTimer ( 35 , 377594 , nil , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON )
mod : AddSetIconOption ( " SetIconOnStaticCharge " , 381615 , true , 0 , { 1 , 2 , 3 } )
--Intermission: The Primalist Strike
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25683 ) )
--Raszageth
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25402 ) )
local warnLightningDevastation = mod : NewCastAnnounce ( 385065 , 3 ) --NOT on our platform
local specWarnStormNova = mod : NewSpecialWarningSpell ( 382434 , nil , nil , nil , 2 , 2 )
local specWarnLightningDevastation = mod : NewSpecialWarningDodgeCount ( 385065 , nil , nil , nil , 3 , 2 ) --On our platform!
local timerStormNovaCD = mod : NewCDTimer ( 5 , 382434 , nil , nil , nil , 2 )
local timerStormNova = mod : NewCastTimer ( 5 , 382434 , nil , nil , nil , 5 )
local timerLightningDevastationCD = mod : NewCDTimer ( 13.3 , 385065 , nil , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON )
--Primalist Forces
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25638 ) )
local warnSurgingBlast = mod : NewTargetAnnounce ( 396037 , 3 )
local warnShatteringShroud = mod : NewTargetNoFilterAnnounce ( 397382 , 4 )
local warnShatteringShroudFaded = mod : NewFadesAnnounce ( 397382 , 1 )
local warnBlazingroar = mod : NewCastAnnounce ( 397468 , 4 )
local specWarnSurgingBlast = mod : NewSpecialWarningMoveAway ( 396037 , nil , 37859 , nil , 1 , 2 )
local yellSurgingBlast = mod : NewShortYell ( 396037 , 37859 )
local yellSurgingBlastFades = mod : NewShortFadesYell ( 396037 , 37859 )
local specWarnStormBolt = mod : NewSpecialWarningInterruptCount ( 385553 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnShatteringShroud = mod : NewSpecialWarningYou ( 397382 , nil , nil , nil , 1 , 2 , 4 )
local specWarnFlameShield = mod : NewSpecialWarningSwitch ( 397387 , nil , nil , nil , 1 , 2 , 4 )
local timerSurgingBlastCD = mod : NewAITimer ( 35 , 396037 , 37859 , nil , nil , 3 , nil , DBM_COMMON_L.HEROIC_ICON )
local timerShatteringShroudCD = mod : NewAITimer ( 35 , 397382 , nil , nil , nil , 3 , nil , DBM_COMMON_L.MYTHIC_ICON )
local timerFlameShieldCD = mod : NewAITimer ( 35 , 397387 , nil , nil , nil , 5 , nil , DBM_COMMON_L.MYTHIC_ICON )
mod : AddSetIconOption ( " SetIconOnShatteringShroud " , 397382 , true , 0 , { 1 , 2 , 3 } )
mod : AddNamePlateOption ( " NPAuraOnAscension " , 385541 )
mod : AddNamePlateOption ( " NPAuraOnFlameShield " , 397387 )
--Stage Two: Surging Power
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25312 ) )
local warnStormsurge = mod : NewEndAnnounce ( 387261 , 1 )
local warnInversion = mod : NewTargetAnnounce ( 394584 , 4 )
local warnFocusedCharge = mod : NewYouAnnounce ( 394582 , 1 )
local warnScatteredCharge = mod : NewYouAnnounce ( 394583 , 4 )
local warnFulminatingCharge = mod : NewTargetNoFilterAnnounce ( 378829 , 3 )
local specWarnStormsurge = mod : NewSpecialWarningMoveAwayCount ( 387261 , nil , nil , nil , 2 , 2 ) --Maybe shorttext 28089?
local specWarnPositiveCharge = mod : NewSpecialWarningYou ( 391990 , nil , nil , nil , 1 , 13 ) --Split warning so user can custom sounds
local specWarnNegativeCharge = mod : NewSpecialWarningYou ( 391991 , nil , nil , nil , 1 , 13 ) --between positive and negative
local yellStormCharged = mod : NewShortPosYell ( 391989 , DBM_CORE_L.AUTO_YELL_CUSTOM_POSITION )
local specWarnInversion = mod : NewSpecialWarningMoveAway ( 394584 , nil , nil , nil , 3 , 13 , 4 )
local yellInversion = mod : NewShortYell ( 394584 )
local yellInversionFades = mod : NewShortFadesYell ( 394584 )
--local specWarnScatteredCharge = mod:NewSpecialWarningMoveAway(394583, nil, nil, nil, 1, 2)
local specWarnTempestWing = mod : NewSpecialWarningCount ( 385574 , nil , nil , nil , 2 , 2 ) --Dodge?
local specWarnFulminatingCharge = mod : NewSpecialWarningYouPos ( 378829 , nil , nil , nil , 1 , 2 )
local yellFulminatingCharge = mod : NewShortPosYell ( 378829 )
local yellFulminatingChargeFades = mod : NewIconFadesYell ( 378829 )
local timerStormsurgeCD = mod : NewCDCountTimer ( 35 , 387261 , nil , nil , nil , 2 ) --Maybe shorttext 28089?
local timerTempestWingCD = mod : NewCDCountTimer ( 35 , 385574 , nil , nil , nil , 3 )
local timerFulminatingChargeCD = mod : NewCDCountTimer ( 35 , 378829 , nil , nil , nil , 3 )
mod : AddSetIconOption ( " SetIconOnFulminatingCharge " , 378829 , true , 0 , { 1 , 2 , 3 } )
mod : AddInfoFrameOption ( 387261 , true )
mod : GroupSpells ( 391989 , 391990 , 391991 , 394584 ) --Group positive and negative spellIds under parent category "Stormcharged"
--Intermission: The Vault Falters
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25812 ) )
--Colossal Stormfiend
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25816 ) )
local specWarnStormBreak = mod : NewSpecialWarningDodge ( 389870 , nil , nil , nil , 2 , 2 )
local specWarnBallLightning = mod : NewSpecialWarningDodge ( 385068 , nil , nil , nil , 2 , 2 )
local timerLightningStrikeCD = mod : NewCDTimer ( 31.6 , 376126 , nil , nil , nil , 3 )
local timerStormBreakCD = mod : NewCDTimer ( 23.1 , 389870 , nil , nil , nil , 3 )
local timerBallLightningCD = mod : NewCDTimer ( 23.1 , 385068 , nil , nil , nil , 3 )
--Stage Three: Storm Incarnate
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 25477 ) )
local warnMagneticCharge = mod : NewTargetNoFilterAnnounce ( 399713 , 3 )
local specWarnStormEater = mod : NewSpecialWarningCount ( 395885 , nil , nil , nil , 2 , 2 , 4 )
local specWarnThunderousBlast = mod : NewSpecialWarningDefensive ( 386410 , nil , nil , nil , 1 , 2 )
local specWarnMeltedArmor = mod : NewSpecialWarningTaunt ( 391285 , nil , nil , nil , 1 , 2 )
local specWarnMagneticCharge = mod : NewSpecialWarningYouPos ( 399713 , nil , nil , nil , 1 , 2 )
local yellMagneticCharge = mod : NewShortPosYell ( 399713 )
local yellMagneticChargeFades = mod : NewIconFadesYell ( 399713 )
local timerStormEaterCD = mod : NewAITimer ( 35 , 395885 , nil , nil , nil , 2 , nil , DBM_COMMON_L.MYTHIC_ICON )
local timerMagneticChargeCD = mod : NewCDCountTimer ( 35 , 399713 , nil , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON )
local timerThunderousBlastCD = mod : NewCDCountTimer ( 35 , 386410 , nil , " Tank|Healer " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
mod : AddSetIconOption ( " SetIconOnMagneticCharge " , 399713 , true , 0 , { 4 , 5 , 6 } )
mod : GroupSpells ( 386410 , 391285 ) --Thunderous Blast and associated melted armor debuff
--P1
mod.vb . energyCount = 0 --Reused for the 100 energy special in stage 1/2 and mythic storm eater mechanic in stage 3
mod.vb . chargeCount = 0 --Static Charge/Fulminating Charge
mod.vb . chargeIcon = 1 --Static Charge/Fulminating Charge
mod.vb . currentCount = 0
mod.vb . tankCount = 0 --Electrified Jaws/Thunderous Blast
mod.vb . breathCount = 0 --Reused in P1.5 intermission
mod.vb . strikeCount = 0
--P2
mod.vb . shroudIcon = 1
mod.vb . wingCount = 0
--P2.5
mod.vb . stormSurgeCount = 0
--P3
mod.vb . magneticCount = 0
mod.vb . magneticIcon = 4
local castsPerGUID = { }
local difficultyName = " normal "
local allTimers = {
[ " mythic " ] = { --Just duplicate of normal for now
[ 1 ] = { --Timers from vod so not 100% accurate
--Static Charge
[ 381615 ] = { 15 , 35 , 37 , 33 , 35 , 37 , 33 } ,
--Volatile Current
[ 388643 ] = { 28 , 53 , 46 , 59 , 46 } ,
--Lightning Breath
[ 377594 ] = { 20 , 25 , 19 , 26 , 24 , 20 , 16 , 18 , 27 , 24 , 20 } ,
--Hurricane Wing
[ 377612 ] = { 35 , 35 , 35 , 35 , 35 , 35 } ,
--Electrified Jaws
[ 377658 ] = { 5 , 27 , 23 , 30 , 17 , 30 , 28 , 30 , 19 , 28 } ,
} ,
[ 2 ] = { --Heroic timers, not mythic
--Volatile Current
[ 388643 ] = { 60 , 49.9 } ,
--Electrified Jaws
[ 377658 ] = { 30 , 24.9 , 22.9 , 30 , 25 , 25 , 37 } ,
--Stormsurge
[ 387261 ] = { 0 , 80 , 80 , 80 } , --First cast immediately
--Fulminating Charge
[ 378829 ] = { 44 , 85.9 } ,
--Tempest Wing
[ 385574 ] = { 35 , 35 , 49.9 , 24.9 , 55 } ,
} ,
[ 3 ] = { --Heroic timers, not mythic
--Storm Eater (Mythic Only)
[ 395885 ] = { } ,
--Lightning Breath
[ 377594 ] = { 28.7 , 41 , 41.9 } ,
--Tempest Wing
[ 385574 ] = { 60.7 , 58.9 , 26.9 } ,
--Fulminating Charge
[ 378829 ] = { 35.7 , 60 } ,
--Thunderous blast
[ 386410 ] = { 16.7 , 30 , 30 , 30 , 30 } ,
--Magnetic Charge (Heroic/Mythic Only)
[ 399713 ] = { } ,
} ,
} ,
[ " heroic " ] = { --Just duplicate of normal for now
[ 1 ] = {
--Static Charge
[ 381615 ] = { 15.0 , 35.0 , 36.9 , 34.1 , 33.9 } ,
--Volatile Current
[ 388643 ] = { 80.0 , 55.0 } , -- Volatile Current
--Lightning Breath
[ 377594 ] = { 23.4 , 39.0 , 53.1 , 51.0 } , -- Lightning Breath
--Hurricane Wing
[ 377612 ] = { 35 , 35 , 35 , 35 , 35 } , -- Hurricane Wing
--Electrified Jaws
[ 377658 ] = { 6.5 , 24.9 , 25.0 , 30.0 , 18.0 , 27.0 , 30.0 } , -- Electrified Jaws
} ,
[ 2 ] = {
--Volatile Current
[ 388643 ] = { 57 , 57 } , --Different from normal
--Electrified Jaws
[ 377658 ] = { 29.9 , 24.4 , 22.9 , 30.7 , 24.2 , 25.8 } , --Same as normal
--Stormsurge
[ 387261 ] = { 0 , 80 , 80 , 80 } , --Same as normal, First cast immediately
--Fulminating Charge
[ 378829 ] = { 45 , 82.5 } , --Same as normal
--Tempest Wing
[ 385574 ] = { 35 , 30 , 55 , 19.5 } , --Different from normal
} ,
[ 3 ] = { --IFFY, vod that changed angles and PoV many times was used for these
--Storm Eater (Mythic Only)
[ 395885 ] = { } ,
--Lightning Breath
[ 377594 ] = { 43 , 33 , 54 } ,
--Tempest Wing
[ 385574 ] = { 76 , 65 } ,
--Fulminating Charge
[ 378829 ] = { 53 , 60 } ,
--Thunderous blast
[ 386410 ] = { 32 , 31 , 30 , 29 } ,
--Magnetic Charge (Heroic/Mythic Only)
[ 399713 ] = { 38 , 63 , 33 } ,
} ,
} ,
[ " normal " ] = {
[ 1 ] = {
--Static Charge
[ 381615 ] = { 15 , 35 , 40 , 30 } ,
--Volatile Current
[ 388643 ] = { 85 , 47 } ,
--Lightning Breath
[ 377594 ] = { 23 , 39 , 53 } ,
--Hurricane Wing
[ 377612 ] = { 35 , 35 , 35 } ,
--Electrified Jaws
[ 377658 ] = { 5 , 25 , 25 , 27 , 21 , 27 } ,
} ,
[ 2 ] = {
--Volatile Current
[ 388643 ] = { 60 , 49.9 } ,
--Electrified Jaws
[ 377658 ] = { 30 , 24.9 , 22.9 , 30 , 25 , 25 , 37 } ,
--Stormsurge
[ 387261 ] = { 0 , 80 , 80 , 80 } , --First cast immediately
--Fulminating Charge
[ 378829 ] = { 44 , 85.9 } ,
--Tempest Wing
[ 385574 ] = { 35 , 35 , 49.9 , 24.9 , 55 } ,
} ,
[ 3 ] = {
--Storm Eater (Mythic Only)
[ 395885 ] = { } ,
--Lightning Breath
[ 377594 ] = { 28.7 , 41 , 41.9 } ,
--Tempest Wing
[ 385574 ] = { 60.7 , 58.9 , 26.9 } ,
--Fulminating Charge
[ 378829 ] = { 35.7 , 60 } ,
--Thunderous blast
[ 386410 ] = { 16.7 , 30 , 30 , 30 , 30 } ,
--Magnetic Charge (Heroic/Mythic Only)
[ 399713 ] = { } ,
} ,
} ,
}
local function breathCorrect ( self )
DBM : Debug ( " Boss skipped a breath, scheduling next one " )
self : Unschedule ( breathCorrect )
self.vb . breathCount = self.vb . breathCount + 1
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , 377594 , self.vb . breathCount + 1 )
if timer then
timerLightningBreathCD : Start ( timer - 4 , self.vb . breathCount + 1 )
self : Schedule ( timer , breathCorrect , self )
end
end
local function warnDeepBreath ( self , myPlatform )
if myPlatform then
specWarnLightningDevastation : Show ( self.vb . breathCount )
specWarnLightningDevastation : Play ( " breathsoon " )
else --No emote, on other platform
warnLightningDevastation : Show ( )
end
end
function mod : OnCombatStart ( delay )
table.wipe ( castsPerGUID )
self : SetStage ( 1 )
self.vb . energyCount = 0
self.vb . chargeCount = 0
self.vb . currentCount = 0
self.vb . tankCount = 0
self.vb . breathCount = 0
self.vb . strikeCount = 0
self.vb . stormSurgeCount = 0
timerElectrifiedJawsCD : Start ( 5 - delay , 1 )
timerStaticChargeCD : Start ( 15 - delay , 1 )
timerLightningBreathCD : Start ( 23 - delay , 1 )
timerHurricaneWingCD : Start ( 35 - delay , 1 )
timerVolatileCurrentCD : Start ( 85 - delay , 1 )
if self.Options . NPAuraOnAscension or self.Options . NPAuraOnFlameShield then
DBM : FireEvent ( " BossMod_EnableHostileNameplates " )
end
if self : IsMythic ( ) then
difficultyName = " mythic "
elseif self : IsHeroic ( ) then
difficultyName = " heroic "
else
difficultyName = " normal "
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 . NPAuraOnAscension or self.Options . NPAuraOnFlameShield then
DBM.Nameplate : Hide ( true , nil , nil , nil , true , true )
end
end
function mod : OnTimerRecovery ( )
if self : IsMythic ( ) then
difficultyName = " mythic "
elseif self : IsHeroic ( ) then
difficultyName = " heroic "
else
difficultyName = " normal "
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 377612 then
self.vb . energyCount = self.vb . energyCount + 1
specWarnHurricaneWing : Show ( self.vb . energyCount )
specWarnHurricaneWing : Play ( " pushbackincoming " )
specWarnHurricaneWing : ScheduleVoice ( 1.5 , " movecenter " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . energyCount + 1 ) or 35
if timer then
timerHurricaneWingCD : Start ( timer , self.vb . energyCount + 1 )
end
elseif spellId == 388643 then
self.vb . currentCount = self.vb . currentCount + 1
specWarnVolatileCurrent : Show ( self.vb . currentCount )
specWarnVolatileCurrent : Play ( " scatter " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . currentCount + 1 )
if timer then
timerVolatileCurrentCD : Start ( timer , self.vb . currentCount + 1 )
end
elseif spellId == 377658 then
self.vb . tankCount = self.vb . tankCount + 1
if self : IsTanking ( " player " , " boss1 " , nil , true ) then
specWarnElectrifiedJaws : Show ( )
specWarnElectrifiedJaws : Play ( " defensive " )
end
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . tankCount + 1 )
if timer then
timerElectrifiedJawsCD : Start ( timer , self.vb . tankCount + 1 )
end
elseif spellId == 377594 then
self : Unschedule ( breathCorrect )
self.vb . breathCount = self.vb . breathCount + 1
specWarnLightingBreath : Show ( self.vb . breathCount )
specWarnLightingBreath : Play ( " breathsoon " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . breathCount + 1 )
if timer then
timerLightningBreathCD : Start ( timer , self.vb . breathCount + 1 )
self : Schedule ( timer + 4 , breathCorrect , self )
end
elseif spellId == 385065 then
self.vb . breathCount = self.vb . breathCount + 1
timerLightningDevastationCD : Start ( self.vb . phase == 1.5 and 13.3 or 32.7 )
self : Schedule ( 0.5 , warnDeepBreath , self , false )
elseif spellId == 397382 then
self.vb . shroudIcon = 1
timerShatteringShroudCD : Start ( nil , args.sourceGUID )
elseif spellId == 397468 then
warnBlazingroar : Show ( )
elseif spellId == 387261 then
self.vb . stormSurgeCount = self.vb . stormSurgeCount + 1
specWarnStormsurge : Show ( self.vb . energyCount )
specWarnStormsurge : Play ( " scatter " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . stormSurgeCount + 1 ) or 80
if timer then
timerStormsurgeCD : Start ( timer , self.vb . stormSurgeCount + 1 )
end
if self.Options . InfoFrame then
DBM.InfoFrame : SetHeader ( args.spellName )
DBM.InfoFrame : Show ( 2 , " enemyabsorb " , nil , args.amount , " boss1 " )
end
elseif spellId == 385574 then
self.vb . wingCount = self.vb . wingCount + 1
specWarnTempestWing : Show ( self.vb . wingCount )
specWarnTempestWing : Play ( " pushbackincoming " )
specWarnTempestWing : ScheduleVoice ( 1.5 , " movecenter " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . wingCount + 1 )
if timer then
timerTempestWingCD : Start ( timer , self.vb . wingCount + 1 )
end
elseif spellId == 389870 and self : AntiSpam ( 5 , 1 ) then
specWarnStormBreak : Show ( )
specWarnStormBreak : Play ( " watchstep " )
timerStormBreakCD : Start ( )
elseif spellId == 385068 and self : AntiSpam ( 5 , 2 ) then
specWarnBallLightning : Show ( )
specWarnBallLightning : Play ( " watchorb " )
timerBallLightningCD : Start ( )
elseif spellId == 395885 then
self.vb . energyCount = self.vb . energyCount + 1
specWarnStormEater : Show ( self.vb . energyCount )
specWarnStormEater : Play ( " specialsoon " ) --Clarify voice when number of soakers and need to soak better understood
timerStormEaterCD : Start ( ) --Temp
-- local timer = self:GetFromTimersTable(allTimers, difficultyName, self.vb.phase, spellId, self.vb.energyCount+1)
-- if timer then
-- timerStormEaterCD:Start(timer, self.vb.energyCount+1)
-- end
elseif spellId == 386410 then
self.vb . tankCount = self.vb . tankCount + 1
if self : IsTanking ( " player " , " boss1 " , nil , true ) then
specWarnThunderousBlast : Show ( )
specWarnThunderousBlast : Play ( " defensive " )
end
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . tankCount + 1 ) or 30
if timer then
timerThunderousBlastCD : Start ( timer , self.vb . tankCount + 1 )
end
elseif spellId == 382434 or spellId == 390463 then
specWarnStormNova : Show ( )
specWarnStormNova : Play ( " carefly " )
timerStormNova : Start ( )
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 381615 and self : AntiSpam ( 5 , 3 ) then
self.vb . chargeIcon = 1
self.vb . chargeCount = self.vb . chargeCount + 1
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . chargeCount + 1 )
if timer then
timerStaticChargeCD : Start ( timer , self.vb . chargeCount + 1 )
end
timerStaticCharge : Start ( 8 )
elseif spellId == 396037 then
timerSurgingBlastCD : Start ( nil , args.sourceGUID )
elseif spellId == 378829 then
self.vb . chargeIcon = 1
self.vb . chargeCount = self.vb . chargeCount + 1
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . chargeCount + 1 )
if timer then
timerFulminatingChargeCD : Start ( timer , self.vb . chargeCount + 1 )
end
elseif spellId == 399713 then
self.vb . magneticIcon = 4
self.vb . magneticCount = self.vb . magneticCount + 1
local timer = self : GetFromTimersTable ( allTimers , difficultyName , self.vb . phase , spellId , self.vb . magneticCount + 1 )
if timer then
timerMagneticChargeCD : Start ( timer , self.vb . magneticCount + 1 )
end
elseif spellId == 382434 then --First intermission Starts (Storm Nova)
self : SetStage ( 1.5 )
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 1.5 ) )
warnPhase : Play ( " phasechange " )
self.vb . breathCount = 0 --Reused for Lightning Devastation
--
timerLightningDevastationCD : Start ( 13.5 , 1 )
timerPhaseCD : Start ( self : IsHard ( ) and 93.6 or 100 )
elseif spellId == 381249 and self.vb . phase == 1.5 then --Pre stage 2 trigger (Electric Scales)
self : SetStage ( 2 )
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2 ) )
warnPhase : Play ( " ptwo " )
self.vb . energyCount = 0
self.vb . currentCount = 0
self.vb . tankCount = 0
self.vb . strikeCount = 0
self.vb . wingCount = 0
self.vb . chargeCount = 0
timerLightningDevastationCD : Stop ( )
timerPhaseCD : Stop ( )
timerStormsurgeCD : Start ( 8.5 , 1 )
timerElectrifiedJawsCD : Start ( 38.5 , 1 )
timerTempestWingCD : Start ( 43.5 , 1 )
timerFulminatingChargeCD : Start ( 53.5 , 1 )
timerVolatileCurrentCD : Start ( self : IsHard ( ) and 65.5 or 68.5 , 1 ) --Only difference on heroic, we'll see on mythic
timerPhaseCD : Start ( self : IsHard ( ) and 193 or 211 )
elseif spellId == 390463 then --Second Intermission Ends Storm Nova
self : SetStage ( 3 )
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 3 ) )
warnPhase : Play ( " pthree " )
self.vb . energyCount = 0 --Used for Mythic Storm-Eater
self.vb . chargeCount = 0 --Fulminating
self.vb . tankCount = 0 --Thunderous Blast
self.vb . breathCount = 0 --Lightning Breath
self.vb . strikeCount = 0 --Lightning Strike
self.vb . wingCount = 0
self.vb . magneticCount = 0
if self : IsHard ( ) then
if self : IsMythic ( ) then
timerStormEaterCD : Start ( 3 )
end
timerThunderousBlastCD : Start ( 21.8 , 1 )
timerLightningBreathCD : Start ( 31.3 , 1 )
timerFulminatingChargeCD : Start ( 40.9 , 1 )
timerTempestWingCD : Start ( 65.9 , 1 )
timerMagneticChargeCD : Start ( 25.9 )
else
timerThunderousBlastCD : Start ( 22.5 , 1 )
timerLightningBreathCD : Start ( 34.5 , 1 )
timerFulminatingChargeCD : Start ( 41.5 , 1 )
timerTempestWingCD : Start ( 66.4 , 1 )
end
elseif spellId == 181089 and self.vb . phase == 2 and self.vb . stormSurgeCount > 0 then --Encounter event
--This is now only used for 2.5 since other stages have earlier events to use
--But we need to be very specific WHEN to use this event since it fires 7x on fight
self : SetStage ( 2.5 )
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2.5 ) )
warnPhase : Play ( " phasechange " )
self.vb . breathCount = 0 --Reused for Lightning Devastation
timerStormsurgeCD : Stop ( )
timerTempestWingCD : Stop ( )
timerFulminatingChargeCD : Stop ( )
timerVolatileCurrentCD : Stop ( )
timerElectrifiedJawsCD : Stop ( )
timerLightningStrikeCD : Start ( 6.2 )
timerLightningDevastationCD : Start ( 25 , 1 )
--Old method using this event for all stae change
--[[self:SetStage(0.5)
if self.vb . phase == 1.5 then
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 1.5 ) )
warnPhase : Play ( " phasechange " )
self.vb . breathCount = 0 --Reused for Lightning Devastation
timerHurricaneWingCD : Stop ( )
timerStaticChargeCD : Stop ( )
timerVolatileCurrentCD : Stop ( )
timerElectrifiedJawsCD : Stop ( )
timerLightningBreathCD : Stop ( )
self : Unschedule ( breathCorrect )
--
timerLightningDevastationCD : Start ( 7.3 , 1 )
elseif self.vb . phase == 2 then
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2 ) )
warnPhase : Play ( " ptwo " )
self.vb . energyCount = 0
self.vb . currentCount = 0
self.vb . tankCount = 0
self.vb . strikeCount = 0
self.vb . wingCount = 0
self.vb . chargeCount = 0
--
timerLightningDevastationCD : Stop ( )
--
timerElectrifiedJawsCD : Start ( 29.9 , 1 )
timerTempestWingCD : Start ( 35 , 1 )
timerFulminatingChargeCD : Start ( 44 , 1 )
timerVolatileCurrentCD : Start ( self : IsHard ( ) and 57 or 60 , 1 ) --Only difference on heroic, we'll see on mythic
elseif self.vb . phase == 2.5 then
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2.5 ) )
warnPhase : Play ( " phasechange " )
self.vb . breathCount = 0 --Reused for Lightning Devastation
timerStormsurgeCD : Stop ( )
timerTempestWingCD : Stop ( )
timerFulminatingChargeCD : Stop ( )
timerVolatileCurrentCD : Stop ( )
timerElectrifiedJawsCD : Stop ( )
timerLightningDevastationCD : Start ( 25 , 1 )
-- timerStormBreakCD:Start(3)
-- timerBallLightningCD:Start(3)
else --P3
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 3 ) )
warnPhase : Play ( " pthree " )
--
self.vb . energyCount = 0 --Used for Mythic Storm-Eater
self.vb . chargeCount = 0 --Fulminating
self.vb . tankCount = 0 --Thunderous Blast
self.vb . breathCount = 0 --Lightning Breath
self.vb . strikeCount = 0 --Lightning Strike
self.vb . wingCount = 0
self.vb . magneticCount = 0
--
timerLightningDevastationCD : Stop ( )
if self : IsHard ( ) then
if self : IsMythic ( ) then
timerStormEaterCD : Start ( 3 )
end
timerThunderousBlastCD : Start ( 32 , 1 )
timerLightningBreathCD : Start ( 43 , 1 )
timerFulminatingChargeCD : Start ( 53 , 1 )
timerTempestWingCD : Start ( 76 , 1 )
if self : IsHard ( ) then
timerMagneticChargeCD : Start ( 38 )
end
else
timerStormEaterCD : Start ( 3 )
timerThunderousBlastCD : Start ( 16.7 , 1 )
timerLightningBreathCD : Start ( 28.7 , 1 )
timerFulminatingChargeCD : Start ( 35.7 , 1 )
timerTempestWingCD : Start ( 60 , 1 )
end
end --]]
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 381615 then
local icon = self.vb . chargeIcon
if self.Options . SetIconOnStaticCharge then
self : SetIcon ( args.destName , icon )
end
if args : IsPlayer ( ) then
specWarnStaticCharge : Show ( self : IconNumToTexture ( icon ) )
specWarnStaticCharge : Play ( " mm " .. icon )
yellStaticCharge : Yell ( icon , icon )
yellStaticChargeFades : Countdown ( spellId , nil , icon )
end
warnStaticCharge : CombinedShow ( 0.5 , args.destName )
self.vb . chargeIcon = self.vb . chargeIcon + 1
elseif spellId == 395906 and not args : IsPlayer ( ) then
specWarnElectrifiedJawsOther : Show ( args.destName )
specWarnElectrifiedJawsOther : Play ( " tauntboss " )
elseif ( spellId == 388115 or spellId == 395929 ) and args : IsPlayer ( ) and self : AntiSpam ( 2 , 4 ) then
specWarnGTFO : Show ( args.spellName )
specWarnGTFO : Play ( " watchfeet " )
elseif spellId == 396037 then
if args : IsPlayer ( ) then
specWarnSurgingBlast : Show ( )
specWarnSurgingBlast : Play ( " runout " )
yellSurgingBlast : Yell ( )
yellSurgingBlastFades : Countdown ( spellId )
end
warnSurgingBlast : CombinedShow ( 0.5 , args.destName )
elseif spellId == 385541 then
if self.Options . NPAuraOnAscension then
DBM.Nameplate : Show ( true , args.destGUID , spellId )
end
elseif spellId == 397387 then
specWarnFlameShield : Show ( args.destName )
specWarnFlameShield : Play ( " targetchange " )
timerFlameShieldCD : Start ( nil , args.sourceGUID )
if self.Options . NPAuraOnFlameShield then
DBM.Nameplate : Show ( true , args.destGUID , spellId )
end
elseif spellId == 397382 then
local icon = self.vb . shroudIcon
if self.Options . SetIconOnShatteringShroud then
self : SetIcon ( args.destName , icon )
end
if args : IsPlayer ( ) then
specWarnShatteringShroud : Show ( )
specWarnShatteringShroud : Play ( " targetyou " )
end
warnShatteringShroud : CombinedShow ( 0.5 , args.destName )
self.vb . shroudIcon = self.vb . shroudIcon + 1
elseif spellId == 388691 then
if self.Options . InfoFrame then
DBM.InfoFrame : SetHeader ( args.spellName )
DBM.InfoFrame : Show ( 2 , " enemyabsorb " , nil , args.amount or UnitGetTotalAbsorbs ( " boss1 " ) , " boss1 " )
end
elseif args : IsSpellID ( 391990 , 394574 , 394576 ) then --All variants of positive
if args : IsPlayer ( ) then
specWarnPositiveCharge : Show ( )
specWarnPositiveCharge : Play ( " positive " )
yellStormCharged : Yell ( 6 , " " ) --Blue Square
end
elseif args : IsSpellID ( 391991 , 394579 , 394575 ) then --All variants of positive
if args : IsPlayer ( ) then
specWarnNegativeCharge : Show ( )
specWarnNegativeCharge : Play ( " negative " )
yellStormCharged : Yell ( 7 , " " ) --Red X
end
elseif spellId == 394582 and args : IsPlayer ( ) then
warnFocusedCharge : Show ( )
elseif spellId == 394583 and args : IsPlayer ( ) then
warnScatteredCharge : Show ( )
elseif spellId == 394584 then
warnInversion : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnInversion : Show ( )
specWarnInversion : Play ( " polarityshift " )
yellInversion : Yell ( )
yellInversionFades : Countdown ( spellId )
end
elseif spellId == 377467 then
local icon = self.vb . chargeIcon
if self.Options . SetIconOnFulminatingCharge then
self : SetIcon ( args.destName , icon )
end
if args : IsPlayer ( ) then
specWarnFulminatingCharge : Show ( self : IconNumToTexture ( icon ) )
specWarnFulminatingCharge : Play ( " mm " .. icon )
yellFulminatingCharge : Yell ( icon , icon )
yellFulminatingChargeFades : Countdown ( spellId , nil , icon )
end
warnFulminatingCharge : CombinedShow ( 0.5 , args.destName )
self.vb . chargeIcon = self.vb . chargeIcon + 1
elseif spellId == 399713 then
local icon = self.vb . magneticIcon
if self.Options . SetIconOnMagneticCharge then
self : SetIcon ( args.destName , icon )
end
if args : IsPlayer ( ) then
specWarnMagneticCharge : Show ( self : IconNumToTexture ( icon ) )
specWarnMagneticCharge : Play ( " mm " .. icon )
yellMagneticCharge : Yell ( icon , icon )
yellMagneticChargeFades : Countdown ( spellId , nil , icon )
end
warnMagneticCharge : CombinedShow ( 0.5 , args.destName )
self.vb . magneticIcon = self.vb . magneticIcon + 1
elseif spellId == 391285 and not args : IsPlayer ( ) then
specWarnMeltedArmor : Show ( args.destName )
specWarnMeltedArmor : Play ( " tauntboss " )
elseif spellId == 391281 and self : AntiSpam ( 5 , 5 ) then --Colossal Stormfiends being engaged
timerBallLightningCD : Start ( 8.4 )
timerStormBreakCD : Start ( 21.8 )
elseif spellId == 391402 then
warnLightningStrike : Show ( )
timerLightningStrikeCD : Start ( ) --31.6
end
end
--mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 381615 then
if self.Options . SetIconOnStaticCharge then
self : SetIcon ( args.destName , 0 )
end
if args : IsPlayer ( ) then
yellStaticChargeFades : Cancel ( )
end
elseif spellId == 396037 then
if args : IsPlayer ( ) then
yellSurgingBlastFades : Cancel ( )
end
elseif spellId == 385541 then
if self.Options . NPAuraOnAscension then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 397387 then
if self.Options . NPAuraOnFlameShield then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 397382 then
if self.Options . SetIconOnShatteringShroud then
self : SetIcon ( args.destName , 0 )
end
if args : IsPlayer ( ) then
warnShatteringShroudFaded : Show ( )
end
elseif spellId == 388691 then
warnStormsurge : Show ( )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
elseif spellId == 394584 then
if args : IsPlayer ( ) then
yellInversionFades : Cancel ( )
end
elseif spellId == 377467 then
if self.Options . SetIconOnFulminatingCharge then
self : SetIcon ( args.destName , 0 )
end
if args : IsPlayer ( ) then
yellFulminatingChargeFades : Cancel ( )
end
elseif spellId == 399713 then
if self.Options . SetIconOnMagneticCharge then
self : SetIcon ( args.destName , 0 )
end
if args : IsPlayer ( ) then
yellMagneticChargeFades : Cancel ( )
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId , spellName )
if spellId == 395929 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 4 ) then
specWarnGTFO : Show ( spellName )
specWarnGTFO : Play ( " watchfeet " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
function mod : UNIT_DIED ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 194999 then --Volatile Spark
castsPerGUID [ args.destGUID ] = nil
elseif cid == 193760 then --Surging Ruiner
timerSurgingBlastCD : Stop ( args.destGUID )
-- elseif cid == 194991 then--Oathsworn Vanguard
elseif cid == 194990 then --Stormseeker Acolyte
castsPerGUID [ args.destGUID ] = nil
elseif cid == 199547 then --Frostforged Zealot
timerShatteringShroudCD : Stop ( args.destGUID )
elseif cid == 199549 then --Flamesworn Herald
timerFlameShieldCD : Stop ( args.destGUID )
elseif cid == 197145 then --Colossal Stormfiend
end
end
--"<330.41 11:01:55> [CHAT_MSG_RAID_BOSS_EMOTE] Raszageth takes a deep breath...#Raszageth###Raszageth##0#0##0#1502#nil#0#false#false#false#false", -- [17507]
function mod : CHAT_MSG_RAID_BOSS_EMOTE ( msg , npc , _ , _ , target )
-- if not msg:find("ICON") and npc = target then--This needs vetting, if p2 and p3 mythic have no emotes missing icons, this will work without localizing
if msg : find ( L.BreathEmote ) or msg == L.BreathEmote then
self : Unschedule ( warnDeepBreath )
warnDeepBreath ( self , true )
end
end
--Purely for earlier timer canceling, new timers not started on USCS if it can be helped, otherwise timers can't be updated easily from WCLs
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 396734 and self.vb . phase == 1 then --Storm Shroud
timerHurricaneWingCD : Stop ( )
timerStaticChargeCD : Stop ( )
timerVolatileCurrentCD : Stop ( )
timerElectrifiedJawsCD : Stop ( )
timerLightningBreathCD : Stop ( )
self : Unschedule ( breathCorrect )
timerStormNovaCD : Start ( 13.4 )
elseif spellId == 398466 then --[DNT] Clear Raszageth Auras on Players (Intermission 2 end)
timerStormBreakCD : Stop ( )
timerBallLightningCD : Stop ( )
timerLightningStrikeCD : Stop ( )
timerLightningDevastationCD : Stop ( )
timerStormNovaCD : Start ( 4.8 )
end
end