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