You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

906 lines
37 KiB

3 years ago
local mod = DBM:NewMod(2499, "DBM-VaultoftheIncarnates", nil, 1200)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20230706053014")
mod:SetCreatureID(189492)
3 years ago
mod:SetEncounterID(2607)
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8)
mod:SetHotfixNoticeRev(20230117000000)
mod:SetMinSyncRevision(20221217000000)
3 years ago
--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 390463",
"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 389214 389878 394583 391402",
"SPELL_AURA_APPLIED_DOSE 389878",
"SPELL_AURA_REMOVED 381615 396037 385541 397382 397387 388691 377467 399713 391990 394574 394576 391991 394579 394575 394584",
"SPELL_PERIODIC_DAMAGE 395929",
"SPELL_PERIODIC_MISSED 395929",
"UNIT_DIED",
"CHAT_MSG_RAID_BOSS_EMOTE",
"UNIT_SPELLCAST_SUCCEEDED boss1"
3 years ago
)
--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
--[[
(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 = 388691 and type = "removebuff"
or (ability.id = 391281 or ability.id = 391402 or ability.id = 389214 or ability.id = 397387) and type = "applybuff"
or (ability.id = 394584 or ability.id = 397382) and type = "applydebuff"
or ability.id = 382530 and (type = "applybuff" or type = "removebuff")
--]]
--General
local warnPhase = mod:NewPhaseChangeAnnounce(2, nil, nil, nil, nil, nil, 2)
3 years ago
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)
3 years ago
local specWarnHurricaneWing = mod:NewSpecialWarningCount(377612, nil, nil, nil, 2, 13)
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, 384738, nil, 2, 2)--"Sparks"
local specWarnElectrifiedJaws = mod:NewSpecialWarningDefensive(395906, nil, nil, nil, 1, 2)
local specWarnElectrifiedJawsOther = mod:NewSpecialWarningTaunt(395906, nil, nil, nil, 1, 2)
local specWarnLightingBreath = mod:NewSpecialWarningDodgeCount(377594, nil, 18357, nil, 2, 2)
3 years ago
local timerHurricaneWingCD = mod:NewCDCountTimer(35, 377612, nil, nil, nil, 2)
local timerStaticChargeCD = mod:NewCDCountTimer(35, 381615, 167180, nil, nil, 3)--"Bombs"
local timerStaticCharge = mod:NewCastTimer(35, 381615, 167180, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON)--"Bombs"
local timerVolatileCurrentCD = mod:NewCDCountTimer(47, 388643, 384738, nil, nil, 3)
local timerElectrifiedJawsCD = mod:NewCDCountTimer(25, 395906, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
local timerLightningBreathCD = mod:NewCDCountTimer(35, 377594, 18357, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON)
3 years ago
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:NewCountAnnounce(385065, 3, nil, nil, 125030)--NOT on our platform
local specWarnStormNova = mod:NewSpecialWarningSpell(382434, nil, nil, nil, 2, 2)
local specWarnLightningDevastation = mod:NewSpecialWarningDodgeCount(385065, nil, 125030, nil, 3, 2)--On our platform!
3 years ago
local timerStormNovaCD = mod:NewCDTimer(5, 382434, nil, nil, nil, 2)
local timerStormNova = mod:NewCastTimer(5, 382434, nil, nil, nil, 5)
local timerLightningDevastationCD = mod:NewCDCountTimer(13.3, 385065, 125030, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON)
mod:AddBoolOption("SetBreathToBait", false)
--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)--Redundant, it casts at same time as flame shield
3 years ago
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:NewCDTimer(12.4, 396037, 37859, false, nil, 3, nil, DBM_COMMON_L.HEROIC_ICON)
local timerShatteringShroudCD = mod:NewCDSourceTimer(35, 397382, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)
local timerFlameShieldCD = mod:NewCDSourceTimer(35, 397387, nil, nil, nil, 5, nil, DBM_COMMON_L.MYTHIC_ICON)
mod:AddSetIconOption("SetIconOnShatteringShroud2", 397382, false, 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(377467, 3, nil, nil, 345338)
3 years ago
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:NewIconRepeatYell(391989)
local specWarnInversion = mod:NewSpecialWarningMoveAway(394584, nil, nil, nil, 3, 13, 4)
local yellInversion = mod:NewIconRepeatYell(394584)
--local specWarnScatteredCharge = mod:NewSpecialWarningMoveAway(394583, nil, nil, nil, 1, 2)
local specWarnTempestWing = mod:NewSpecialWarningCount(385574, nil, 63533, nil, 2, 2)--"Storm Wave"
local specWarnFulminatingCharge = mod:NewSpecialWarningYouPos(377467, nil, 221175, nil, 1, 2)--"Charge" shortname
local yellFulminatingCharge = mod:NewShortPosYell(377467, 221175)--"Charge" shortname
local yellFulminatingChargeFades = mod:NewIconFadesYell(377467, 221175)--"Charge" shortname
local timerStormsurgeCD = mod:NewCDCountTimer(35, 387261, nil, nil, nil, 2)--Maybe shorttext 28089?
local timerTempestWingCD = mod:NewCDCountTimer(35, 385574, 63533, nil, nil, 3)
local timerFulminatingChargeCD = mod:NewCDCountTimer(35, 377467, 345338, nil, nil, 3)--shortname "Charges"
local timerInversionCD = mod:NewCDCountTimer(6, 394584, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)
mod:AddSetIconOption("SetIconOnFulminatingCharge", 377467, 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 warnFuse = mod:NewStackAnnounce(389878, 2, nil, "Tank|Healer")
local warnStormBreak = mod:NewCountAnnounce(389870, 3, nil, nil, 7794)--Shortname Teleport
local specWarnBallLightning = mod:NewSpecialWarningDodge(385068, nil, nil, nil, 2, 2)
local timerLightningStrikeCD = mod:NewCDTimer(31.6, 376126, nil, nil, nil, 3)
local timerStormBreakCD = mod:NewCDCountTimer(23.1, 389870, 7794, nil, nil, 3)
local timerBallLightningCD = mod:NewCDCountTimer(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:NewSpecialWarningSpell(395885, nil, nil, nil, 2, 2, 4)
local specWarnThunderousBlast = mod:NewSpecialWarningDefensive(386410, nil, 309024, nil, 1, 2)--"Blast"
local specWarnThunderstruckArmor = mod:NewSpecialWarningTaunt(391285, nil, nil, nil, 1, 2)
local specWarnMagneticCharge = mod:NewSpecialWarningYou(399713, nil, nil, nil, 1, 2)
local yellMagneticCharge = mod:NewShortYell(399713)
local yellMagneticChargeFades = mod:NewShortFadesYell(399713)
local timerStormEaterCD = mod:NewCDTimer(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, 309024, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
mod:AddSetIconOption("SetIconOnMagneticCharge", 399713, true, 0, {4})
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
mod.vb.frostAddCount = 0
mod.vb.fireAddCount = 0
--P2
mod.vb.shroudIcon = 1
mod.vb.wingCount = 0
--P2.5
mod.vb.stormSurgeCount = 0
mod.vb.ballCount = 0
--P3
mod.vb.magneticCount = 0
local castsPerGUID = {}
local playerPolarity = nil
local difficultyName = "normal"
local allTimers = {
["mythic"] = {
[1] = {
--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] = {
--Volatile Current
[388643] = {67.5, 60, 40},
--Electrified Jaws
[377658] = {44.5, 26.9, 21, 29.9, 25, 25},
--Stormsurge
[387261] = {14.5, 80, 80},
--Fulminating Charge
[378829] = {57.5, 87},
--Tempest Wing
[385574] = {49.5, 29.9, 54, 20},
},
[3] = {
--Lightning Breath
[377594] = {38.1, 41.4, 44, 29.9, 43},
--Tempest Wing
[385574] = {70.6, 70, 19.9},
--Fulminating Charge
[378829] = {43.2, 61.4, 66.9},
--Thunderous blast
[386410] = {28.6, 29, 32, 58.9, 30},
--Magnetic Charge (Heroic/Mythic Only)
[399713] = {32.7, 29.9, 32.9, 33},
},
},
["heroic"] = {
[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] = {61.5, 57},--Different from normal
--Electrified Jaws
[377658] = {38.5, 24.4, 22.9, 30, 24.2, 25.8},--Same as normal
--Stormsurge
[387261] = {8.5, 80, 80},
--Fulminating Charge
[378829] = {53.5, 82.5},--Same as normal
--Tempest Wing
[385574] = {43.5, 30, 55, 19.5},--Different from normal
},
[3] = {--IFFY, vod that changed angles and PoV many times was used for these
--Lightning Breath
[377594] = {43, 33, 54},
--Tempest Wing
[385574] = {76, 65},
--Fulminating Charge
[378829] = {53, 60},
--Thunderous blast
[386410] = {32, 29.9, 30, 29},
--Magnetic Charge (Heroic/Mythic Only)
[399713] = {38, 63, 33},
},
},
["normal"] = {--LFR uses same timers
[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] = {--Started at electric Scales
--Volatile Current
[388643] = {68.5, 49.9},
--Electrified Jaws
[377658] = {38.5, 24.9, 22.9, 30, 25, 25, 37},
--Stormsurge
[387261] = {8.5, 80, 80},
--Fulminating Charge
[378829] = {53.5, 85.9},
--Tempest Wing
[385574] = {43.5, 35, 49.9, 24.9, 55},
},
[3] = {
--Lightning Breath
[377594] = {28.7, 41, 41.9},--Even if pull stretches on, boss doesn't cast more than 3
--Tempest Wing
[385574] = {60.7, 58.9, 26.9, 31},
--Fulminating Charge
[378829] = {35.7, 60, 60},
--Thunderous blast
[386410] = {16.7, 30, 30, 30, 30, 30},
},
},
}
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")
if self.vb.phase == 1.5 then--Only fade in first intermission, raid isn't split in second one
timerLightningDevastationCD:SetSTFade(true, self.vb.breathCount+1)--If it's on this platform this time, next one isn't so we fade timer for next one
end
else--No emote, on other platform
warnLightningDevastation:Show(self.vb.breathCount)
end
end
local function yellRepeater(self, text, repeatTotal, inversion)
repeatTotal = repeatTotal + 1
-- if repeatTotal < 3 then
if inversion then
yellInversion:Yell(text)
else
yellStormCharged:Yell(text)
end
self:Schedule(1.5, yellRepeater, self, text, repeatTotal, inversion)
-- 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(self:IsMythic() and 20 or 23-delay, 1)
timerHurricaneWingCD:Start(35-delay, 1)
timerVolatileCurrentCD:Start(self:IsMythic() and 28 or self:IsHeroic() and 80 or 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
3 years ago
end
function mod:OnCombatEnd()
3 years ago
-- 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
3 years ago
function mod:OnTimerRecovery()
if self:IsMythic() then
difficultyName = "mythic"
elseif self:IsHeroic() then
difficultyName = "heroic"
else
difficultyName = "normal"
end
if DBM:UnitDebuff("player", 391990, 394574, 394576) then--Positive
playerPolarity = 1
elseif DBM:UnitDebuff("player", 391991, 394579, 394575) then--Negative
playerPolarity = 2
end
end
3 years ago
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")
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
local timer = self.vb.phase == 1.5 and (self:IsMythic() and 9.7 or self:IsHeroic() and 12.1 or 13.3) or (self:IsMythic() and 29 or self:IsHeroic() and 31.5 or 32.7)
if self.Options.SetBreathToBait then
timer = timer - 1.5--Sets timer for baiting breath instead of breath activation
end
timerLightningDevastationCD:Start(timer, self.vb.breathCount+1)
self:Unschedule(warnDeepBreath)
self:Schedule(0.5, warnDeepBreath, self, false)
elseif spellId == 397382 then
self.vb.shroudIcon = 1
--Time between casts not known yet, fix when groups suck really bad
--timerShatteringShroudCD:Start(nil, castsPerGUID[args.sourceGUID])
----If not on our side, fade the timer
--if not self:CheckBossDistance(args.sourceGUID, true, 35278, 80) then
-- timerShatteringShroudCD:SetSTFade(true, castsPerGUID[args.sourceGUID])
--else
elseif spellId == 397468 then
-- warnBlazingroar:Show()
--TODO, add cast bar though
elseif spellId == 387261 then
self.vb.stormSurgeCount = self.vb.stormSurgeCount + 1
specWarnStormsurge:Show(self.vb.stormSurgeCount)
specWarnStormsurge:Play("scatter")
local timer = self:GetFromTimersTable(allTimers, difficultyName, self.vb.phase, spellId, self.vb.stormSurgeCount+1)
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
if self:IsMythic() then
timerInversionCD:Start(8)
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 then
if not castsPerGUID[args.sourceGUID] then
castsPerGUID[args.sourceGUID] = 0
end
castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
if self:AntiSpam(2, 1) then--Aggregate similtanious teleports
warnStormBreak:Show(castsPerGUID[args.sourceGUID])
timerStormBreakCD:Start(nil, castsPerGUID[args.sourceGUID]+1)
end
elseif spellId == 385068 and self:AntiSpam(5, 2) then
self.vb.ballCount = self.vb.ballCount + 1
specWarnBallLightning:Show(self.vb.ballCount)
specWarnBallLightning:Play("watchorb")
--8.4, 26.7, 23, 23. sometimes 3rd one also delayed more but first one consistently is
if self.vb.ballCount == 1 then
timerBallLightningCD:Start(26.7, self.vb.ballCount+1)
else
timerBallLightningCD:Start(23, self.vb.ballCount+1)
end
elseif spellId == 395885 then
specWarnStormEater:Show()
specWarnStormEater:Play("helpsoak")--Clarify voice when number of soakers and need to soak better understood
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()
3 years ago
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.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 finished)
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
if self.Options.SetBreathToBait then
timerLightningDevastationCD:Start(self:IsMythic() and 11.3 or 11.7, 1)
else
timerLightningDevastationCD:Start(self:IsMythic() and 12.8 or 13.2, 1)
end
timerPhaseCD:Start(self:IsMythic() and 93.3 or 100)
elseif spellId == 381249 and self:GetStage(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()
if self:IsMythic() then--Post Dec 22nd hotfix, Mythic stage 2 now starts 6 seconds slower than other difficulties to allow more time to wrap up intermission
timerStormsurgeCD:Start(14.5, 1)
timerElectrifiedJawsCD:Start(44.5, 1)
timerTempestWingCD:Start(49.5, 1)
timerFulminatingChargeCD:Start(57.5, 1)
timerVolatileCurrentCD:Start(67.5, 1)
-- timerPhaseCD:Start(190)--Basically ends on 3rd stormsurge being removed
else
timerStormsurgeCD:Start(8.5, 1)
timerElectrifiedJawsCD:Start(38.5, 1)
timerTempestWingCD:Start(43.5, 1)
timerFulminatingChargeCD:Start(52.5, 1)
timerVolatileCurrentCD:Start(self:IsHeroic() and 65.5 or 68.5, 1)--Only difference on heroic
timerPhaseCD:Start(self:IsHeroic() and 193 or 211)
end
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:IsMythic() then
timerStormEaterCD:Start(21.7)--Cast only once, then persistent aura
timerThunderousBlastCD:Start(28.6, 1)
timerMagneticChargeCD:Start(32.7)
timerLightningBreathCD:Start(38.1, 1)
timerFulminatingChargeCD:Start(43.2, 1)
timerTempestWingCD:Start(70.6, 1)
elseif self:IsHeroic() then
timerThunderousBlastCD:Start(21.8, 1)
timerMagneticChargeCD:Start(25.9)
timerLightningBreathCD:Start(31.3, 1)
timerFulminatingChargeCD:Start(40.9, 1)
timerTempestWingCD:Start(65.9, 1)
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:GetStage(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
self.vb.ballCount = 0
timerStormsurgeCD:Stop()
timerTempestWingCD:Stop()
timerFulminatingChargeCD:Stop()
timerVolatileCurrentCD:Stop()
timerElectrifiedJawsCD:Stop()
timerLightningStrikeCD:Start(4.8)
if self.Options.SetBreathToBait then
timerLightningDevastationCD:Start(22.8, 1)
else
timerLightningDevastationCD:Start(24.3, 1)
end
3 years ago
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
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then--Filter idiots in front of boss that aren't tank.
specWarnElectrifiedJawsOther:Show(args.destName)
specWarnElectrifiedJawsOther:Play("tauntboss")
end
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")
--Time between casts not known yet, fix when groups suck really bad
--timerFlameShieldCD:Start(nil, castsPerGUID[args.sourceGUID])
--if not self:CheckBossDistance(args.sourceGUID, true, 35278, 80) then
-- --Not our platform, set fade, which fades out timer and disables countdowns for it
-- timerFlameShieldCD:SetSTFade(true, castsPerGUID[args.sourceGUID])
--end
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.SetIconOnShatteringShroud2 then
self:SetIcon(args.destName, icon)
end
if args:IsPlayer() then
specWarnShatteringShroud:Show()
specWarnShatteringShroud:Play("targetyou")
end
if not self:CheckBossDistance(args.sourceGUID, true, 35278, 80) then
warnShatteringShroud:CombinedShow(0.5, args.destName)
end
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
self:Unschedule(yellRepeater)
yellRepeater(self, 6, 0)
playerPolarity = 1--Positive
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
self:Unschedule(yellRepeater)
yellRepeater(self, 7, 0)
playerPolarity = 2--Negative
end
elseif spellId == 394584 then
warnInversion:CombinedShow(0.3, args.destName)
if self:AntiSpam(4, 5) then
timerInversionCD:Start(6)
end
if args:IsPlayer() then
specWarnInversion:Show()
specWarnInversion:Play("polarityshift")
self:Unschedule(yellRepeater)
--Invert the yell based on player debuff
if playerPolarity then
yellRepeater(self, playerPolarity == 1 and 7 or 8, 0, true)
end
end
elseif spellId == 394582 and args:IsPlayer() and self:AntiSpam(3, 6) then
warnFocusedCharge:Show()
elseif spellId == 394583 and args:IsPlayer() then
warnScatteredCharge:Show()
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
if self.Options.SetIconOnMagneticCharge then
self:SetIcon(args.destName, 4)
end
if args:IsPlayer() then
specWarnMagneticCharge:Show()
specWarnMagneticCharge:Play("targetyou")
yellMagneticCharge:Yell()
yellMagneticChargeFades:Countdown(spellId)
end
warnMagneticCharge:Show(args.destName)
elseif spellId == 391285 and not args:IsPlayer() then
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then--Filter idiots in front of boss that aren't tank.
specWarnThunderstruckArmor:Show(args.destName)
specWarnThunderstruckArmor:Play("tauntboss")
end
elseif spellId == 391281 and self:AntiSpam(5, 7) then--Crackling Energy/Colossal Stormfiends being engaged
timerBallLightningCD:Start(8.4, 1)
timerStormBreakCD:Start(21.8, 1)
elseif spellId == 391402 then
warnLightningStrike:Show()
timerLightningStrikeCD:Start(self:IsMythic() and 29.1 or self:IsHeroic() and 31.5 or 32.8)
elseif spellId == 389214 then--Overload
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 199547 then--Frostforged Zealot
self.vb.frostAddCount = self.vb.frostAddCount + 1
castsPerGUID[args.destGUID] = self.vb.frostAddCount
timerShatteringShroudCD:Start(7.4, castsPerGUID[args.destGUID])--7.4-8.2
if not self:CheckBossDistance(args.destGUID, true, 35278, 80) then
timerShatteringShroudCD:SetSTFade(true, castsPerGUID[args.destGUID])
end
elseif cid == 199549 then--Flamesworn Herald
self.vb.fireAddCount = self.vb.fireAddCount + 1
castsPerGUID[args.destGUID] = self.vb.fireAddCount
timerFlameShieldCD:Start(6.4, castsPerGUID[args.destGUID])--6.4-7.6
if not self:CheckBossDistance(args.destGUID, true, 35278, 80) then
timerFlameShieldCD:SetSTFade(true, castsPerGUID[args.destGUID])
end
end
elseif spellId == 389878 then
warnFuse:Cancel()
warnFuse:Schedule(2, args.destName, args.amount or 1)
3 years ago
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
3 years ago
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.SetIconOnShatteringShroud2 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 == 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
elseif spellId == 394584 or args:IsSpellID(391990, 394574, 394576) or args:IsSpellID(391991, 394579, 394575) then--All variants of positive, negative, and inversion
if args:IsPlayer() then
self:Unschedule(yellRepeater)
playerPolarity = nil
end
3 years ago
end
end
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if spellId == 395929 and destGUID == UnitGUID("player") and self:AntiSpam(2, 4) then
3 years ago
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(castsPerGUID[args.destGUID])
castsPerGUID[args.destGUID] = nil
elseif cid == 199549 then--Flamesworn Herald
timerFlameShieldCD:Stop(castsPerGUID[args.destGUID])
castsPerGUID[args.destGUID] = nil
elseif cid == 197145 or cid == 200943 then--Colossal Stormfiend
castsPerGUID[args.destGUID] = nil
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 and (self:GetStage(1.5) or self:GetStage(2.5)) 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
3 years ago
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 396734 and self:GetStage(1) then--Storm Shroud
timerHurricaneWingCD:Stop()
timerStaticChargeCD:Stop()
timerVolatileCurrentCD:Stop()
timerElectrifiedJawsCD:Stop()
timerLightningBreathCD:Stop()
self:Unschedule(breathCorrect)
3 years ago
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)
3 years ago
end
end