local mod = DBM : NewMod ( 2486 , " DBM-VaultoftheIncarnates " , nil , 1200 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20221106234942 " )
mod : SetCreatureID ( 187771 , 187768 , 187772 , 187767 )
mod : SetEncounterID ( 2590 )
mod : SetUsedIcons ( 1 , 2 )
mod : SetBossHPInfoToHighest ( )
mod : SetHotfixNoticeRev ( 20221014000000 )
mod : SetMinSyncRevision ( 20221008000000 )
--mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 373059 372315 372394 372322 372056 372027 372279 374038 375331 " ,
" SPELL_AURA_APPLIED 391599 371836 371591 386440 371624 386375 372056 374039 372027 386289 386370 " ,
" SPELL_AURA_APPLIED_DOSE 391599 371836 372027 372056 " ,
" SPELL_AURA_REMOVED 391599 371836 374039 " ,
" SPELL_AURA_REMOVED_DOSE 391599 371836 " ,
" SPELL_PERIODIC_DAMAGE 371514 " ,
" SPELL_PERIODIC_MISSED 371514 "
)
--TODO, conductive mark has numerous spellids and the one that's a cast looks like a hidden script. 10 to 1, it's not in combat log. (https://www.wowhead.com/beta/spell=375331/conductive-mark)
--TODO, mark some of conductive marks? On mythic it goes on 10 targets, not enough marks for all that, plus meteor axe needs 2 marks as prio
--TODO, earthen pillar targetting unclear, it probably uses RAID_BOSS_WHISPER if i had to guess, because there is no debuff
--[[
( ability.id = 373059 or ability.id = 372322 or ability.id = 372056 or ability.id = 372027 or ability.id = 372279 or ability.id = 374038 or ability.id = 375331 ) and type = " begincast "
or ( ability.id = 386440 or ability.id = 386375 or ability.id = 386370 or ability.id = 386289 ) and type = " applybuff "
or ability.id = 371624 and type = " applydebuff "
--]]
--General
local specWarnGTFO = mod : NewSpecialWarningGTFO ( 340324 , nil , nil , nil , 1 , 8 )
--local berserkTimer = mod:NewBerserkTimer(600)
--Kadros Icewrath
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 24952 ) )
local warnFrostTomb = mod : NewTargetNoFilterAnnounce ( 371591 , 4 )
local warnGlacialConvocation = mod : NewSpellAnnounce ( 386440 , 4 )
local specWarnPrimalBlizzard = mod : NewSpecialWarningCount ( 373059 , nil , nil , nil , 2 , 2 )
local specWarnPrimalBlizzardStack = mod : NewSpecialWarningStack ( 373059 , nil , 8 , nil , nil , 1 , 6 )
local specWarnFrostSpike = mod : NewSpecialWarningInterrupt ( 372315 , " HasInterrupt " , nil , nil , 1 , 2 )
local timerPrimalBlizzardCD = mod : NewCDCountTimer ( 79.4 , 373059 , nil , nil , nil , 2 ) --Can be delayed by many seconds
mod : AddInfoFrameOption ( 373059 , false )
--Dathea Stormlash
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 24958 ) )
local warnConductiveMark = mod : NewTargetAnnounce ( 371624 , 4 , nil , false ) --Even with global target filter on by default, off by default due to spam potential
--local warnChainLightning = mod:NewTargetAnnounce(374021, 2)
local warnStormingConvocation = mod : NewSpellAnnounce ( 386375 , 4 )
local specWarnConductiveMarkSpread = mod : NewSpecialWarningMoveAway ( 371624 , nil , nil , nil , 2 , 2 )
local specWarnConductiveMark = mod : NewSpecialWarningMoveTo ( 371624 , nil , nil , nil , 1 , 13 )
local yellConductiveMark = mod : NewYell ( 371624 , 28836 )
local specWarnLightningBolt = mod : NewSpecialWarningInterrupt ( 372394 , " HasInterrupt " , nil , nil , 1 , 2 )
--local specWarnChainLightning = mod:NewSpecialWarningMoveAway(374021, nil, nil, nil, 1, 2)
--local yellChainLightning = mod:NewShortYell(374021)
local timerConductiveMarkCD = mod : NewCDCountTimer ( 24.4 , 371624 , nil , nil , nil , 3 )
local timerChainLightningCD = mod : NewCDTimer ( 9.1 , 374021 , nil , " Healer " , nil , 3 ) --9.1-15.4
mod : AddRangeFrameOption ( 5 , 371624 )
--Opalfang
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 24967 ) )
local warnCrush = mod : NewStackAnnounce ( 372056 , 2 , nil , " Tank|Healer " )
local warnQuakingConvocation = mod : NewSpellAnnounce ( 386370 , 4 )
local specWarnEarthenPillar = mod : NewSpecialWarningCount ( 370991 , nil , nil , nil , 2 , 2 ) --Warn everyone for now, change if it has emotes or debuff later
local specWarnCrush = mod : NewSpecialWarningDefensive ( 372056 , nil , nil , nil , 2 , 2 )
local specWarnCrushTaunt = mod : NewSpecialWarningTaunt ( 372056 , nil , nil , nil , 1 , 2 )
local timerEarthenPillarCD = mod : NewCDCountTimer ( 40.8 , 370991 , nil , nil , nil , 3 ) --40.8--71
local timerCrushCD = mod : NewCDCountTimer ( 21.6 , 372056 , nil , " Tank|Healer " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
--Embar Firepath
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 24965 ) )
local warnMeteorAxe = mod : NewTargetNoFilterAnnounce ( 374043 , 4 )
local warnSlashingBlaze = mod : NewStackAnnounce ( 372027 , 2 , nil , " Tank|Healer " )
local warnBurningConvocation = mod : NewSpellAnnounce ( 386289 , 4 )
local specWarnMeteorAxe = mod : NewSpecialWarningYouPos ( 374043 , nil , nil , nil , 1 , 2 )
local yellMeteorAxe = mod : NewShortPosYell ( 374043 , nil , nil , nil , " YELL " )
local yellMeteorAxeFades = mod : NewIconFadesYell ( 374043 , nil , nil , nil , " YELL " )
local specWarnSlashingBlaze = mod : NewSpecialWarningDefensive ( 372027 , nil , nil , nil , 2 , 2 )
local specWarnSlashingBlazeTaunt = mod : NewSpecialWarningTaunt ( 372027 , nil , nil , nil , 1 , 2 )
local timerMeteorAxeCD = mod : NewCDCountTimer ( 39.1 , 374043 , nil , nil , nil , 3 )
local timerSlashingBlazeCD = mod : NewCDCountTimer ( 27.7 , 372027 , nil , " Tank|Healer " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
mod : AddSetIconOption ( " SetIconOnMeteorAxe " , 374043 , true , 8 , { 1 , 2 } )
local blizzardStacks = { }
local playerBlizzardHigh = false
mod.vb . blizzardCast = 0
mod.vb . markCast = 0
mod.vb . pillarCast = 0
mod.vb . crushCast = 0
mod.vb . meteorCast = 0
mod.vb . meteorTotal = 0
mod.vb . blazeCast = 0
local difficultyName = " normal " --Unused right now, mythic and normal are same with very minor variances, heroic is probably obsolete but will see on live
local allTimers = {
[ " normal " ] = { --Needs work, some of these can be lower
--Conductive Mark
-- [375331] = {15.3, 42.8, 23.2, 25.5, 20.7, 23.1, 24.3, 13.4, 23.1, 24.3, 22.0, 24.2, 24.3, 17.0, 24.3, 26.7},--Old
[ 375331 ] = { 10.5 , 42.2 , 25.8 , 24.4 , 24.5 , 25.6 , 24.4 , 25.6 , 26.9 , 25.6 , 28.0 } , --New
--Meteor Axes (excluded for now)
-- [374038] = {25.0, 38.4, 25.0, 35.1, 34.1, 43.7, 24.4, 35.2, 34.0, 43.7, 25.4, 36.4},--Old
-- [374038] = {22.3, 40.4, 40.3, 40.2, 40.3, 39.1, 40.2, 40.2, 39.0},--New
--Pillars
-- [372322] = {5.0, 28.0, 32.5, 32.8, 20.2, 31.6, 31.6, 23.1, 32.8, 20.8, 31.6, 32.9, 22.0, 32.8},--Old
[ 372322 ] = { 5.1 , 24.8 , 29.2 , 26.9 , 24.3 , 28.1 , 25.6 , 26.7 , 28.1 , 25.6 , 25.6 , 28.0 , 29.2 } , --New
--Primal Blizzard (excluded for now)
--[373059] = {40.0, 69.3, 67.6, 71.8, 69.4, 70.4},--Old
--[373059] = {36.0, 87.9, 79.4, 80.5},--New
} ,
}
local function checkMyAxe ( self )
local icon = GetRaidTargetIndex ( " player " )
if icon then
specWarnMeteorAxe : Show ( self : IconNumToTexture ( icon ) )
specWarnMeteorAxe : Play ( " mm " .. icon )
yellMeteorAxe : Yell ( icon , icon )
yellMeteorAxeFades : Countdown ( 374039 , nil , icon )
else --No icon setter?
specWarnMeteorAxe : Show ( " " )
specWarnMeteorAxe : Play ( " targetyou " )
yellMeteorAxe : Yell ( 0 , 0 )
yellMeteorAxeFades : Countdown ( 374039 , nil , 0 )
end
end
function mod : OnCombatStart ( delay )
table.wipe ( blizzardStacks )
playerBlizzardHigh = false
self.vb . blizzardCast = 0
self.vb . markCast = 0
self.vb . pillarCast = 0
self.vb . crushCast = 0
self.vb . meteorCast = 0
self.vb . blazeCast = 0
--Kadros Icewrath
timerPrimalBlizzardCD : Start ( 36 - delay , 1 )
--Dathea Stormlsh
timerChainLightningCD : Start ( 9.2 - delay )
timerConductiveMarkCD : Start ( 10.5 - delay , 1 )
--Opalfang
timerEarthenPillarCD : Start ( 5 - delay , 1 )
timerCrushCD : Start ( 17.7 - delay , 1 )
--Embar Firepath
timerSlashingBlazeCD : Start ( 9.2 - delay , 1 )
timerMeteorAxeCD : Start ( 22.3 - delay , 1 )
-- if self:IsMythic() then
-- difficultyName = "mythic"
-- elseif self:IsHeroic() then
-- difficultyName = "heroic"
-- else
difficultyName = " normal "
-- end
if self.Options . RangeFrame then
DBM.RangeCheck : Show ( 5 )
end
if self.Options . InfoFrame then
DBM.InfoFrame : SetHeader ( DBM : GetSpellInfo ( 373059 ) )
DBM.InfoFrame : Show ( self : IsMythic ( ) and 20 or 10 , " table " , blizzardStacks , 1 ) --On mythic, see everyone to coordinate clears, else just show top idiots because cleares are infinite
end
end
function mod : OnCombatEnd ( )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
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 == 373059 then
self.vb . blizzardCast = self.vb . blizzardCast + 1
specWarnPrimalBlizzard : Show ( self.vb . blizzardCast )
if self : IsHard ( ) then
specWarnPrimalBlizzard : Play ( " scatter " ) --Range 3
else
specWarnPrimalBlizzard : Play ( " aesoon " ) --Just aoe damage, spread mechanic disabled
end
timerPrimalBlizzardCD : Start ( nil , self.vb . blizzardCast + 1 )
elseif spellId == 372315 and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnFrostSpike : Show ( args.sourceName )
specWarnFrostSpike : Play ( " kickcast " )
elseif spellId == 372394 and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnLightningBolt : Show ( args.sourceName )
specWarnLightningBolt : Play ( " kickcast " )
elseif spellId == 372322 then
self.vb . pillarCast = self.vb . pillarCast + 1
specWarnEarthenPillar : Show ( self.vb . pillarCast )
specWarnEarthenPillar : Play ( " watchstep " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , false , spellId , self.vb . pillarCast + 1 ) or 40.8
timerEarthenPillarCD : Start ( timer , self.vb . pillarCast + 1 )
elseif spellId == 372056 then
self.vb . crushCast = self.vb . crushCast + 1
timerCrushCD : Start ( nil , self.vb . crushCast + 1 )
if self : IsTanking ( " player " , nil , nil , nil , args.sourceGUID ) then
specWarnCrush : Show ( )
specWarnCrush : Play ( " defensive " )
end
elseif spellId == 372027 then
self.vb . blazeCast = self.vb . blazeCast + 1
timerSlashingBlazeCD : Start ( nil , self.vb . blazeCast + 1 )
if self : IsTanking ( " player " , nil , nil , nil , args.sourceGUID ) then
specWarnSlashingBlaze : Show ( )
specWarnSlashingBlaze : Play ( " defensive " )
end
elseif spellId == 372279 then
timerChainLightningCD : Start ( )
elseif spellId == 374038 then
self.vb . meteorCast = self.vb . meteorCast + 1
self.vb . meteorTotal = 0
-- local timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.meteorCast+1) or 49.7
timerMeteorAxeCD : Start ( nil , self.vb . meteorCast + 1 )
elseif spellId == 375331 then
self.vb . markCast = self.vb . markCast + 1
specWarnConductiveMarkSpread : Show ( )
specWarnConductiveMarkSpread : Play ( " range5 " )
local timer = self : GetFromTimersTable ( allTimers , difficultyName , false , spellId , self.vb . markCast + 1 ) or 24.4
if timer then
timerConductiveMarkCD : Start ( timer , self.vb . markCast + 1 )
end
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 391599 or spellId == 371836 then --Mythic, Non Mythic
local amount = args.amount or 1
blizzardStacks [ args.destName ] = amount
if args : IsPlayer ( ) and amount >= 8 then
playerBlizzardHigh = true
specWarnPrimalBlizzardStack : Show ( amount )
specWarnPrimalBlizzardStack : Play ( " stackhigh " )
end
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( blizzardStacks )
end
elseif spellId == 371591 then
warnFrostTomb : CombinedShow ( 2 , args.destName ) --If I learned anything from jaina, loose aggregation is required
elseif spellId == 386440 then
warnGlacialConvocation : Show ( )
timerPrimalBlizzardCD : Stop ( )
elseif spellId == 371624 then
warnConductiveMark : CombinedShow ( 1 , args.destName )
if args : IsPlayer ( ) then
specWarnConductiveMark : Show ( DBM_COMMON_L.PILLAR )
specWarnConductiveMark : Play ( " movetopillar " )
yellConductiveMark : Yell ( )
end
-- elseif spellId == 374021 then
-- warnChainLightning:CombinedShow(0.3, args.destName)
-- if args:IsPlayer() then
-- specWarnChainLightning:Show()
-- specWarnChainLightning:Play("range5")
-- yellChainLightning:Yell()
-- end
elseif spellId == 386375 then
warnStormingConvocation : Show ( )
timerConductiveMarkCD : Stop ( )
timerChainLightningCD : Stop ( )
elseif spellId == 372056 and not args : IsPlayer ( ) then
local amount = args.amount or 1
local _ , _ , _ , _ , _ , expireTime = DBM : UnitDebuff ( " player " , spellId )
local remaining
if expireTime then
remaining = expireTime - GetTime ( )
end
if ( not remaining or remaining and remaining < 6.1 ) and not UnitIsDeadOrGhost ( " player " ) and not self : IsHealer ( ) then
specWarnCrushTaunt : Show ( args.destName )
specWarnCrushTaunt : Play ( " tauntboss " )
else
warnCrush : Show ( args.destName , amount )
end
elseif spellId == 386370 then
warnQuakingConvocation : Show ( )
timerEarthenPillarCD : Stop ( )
timerCrushCD : Stop ( )
elseif spellId == 374039 then
self.vb . meteorTotal = self.vb . meteorTotal + 1
if self.Options . SetIconOnMeteorAxe then
self : SetSortedIcon ( " tankroster " , self.vb . meteorTotal == 2 and 0.1 or 0.4 , args.destName , 1 , 2 , false )
end
if args : IsPlayer ( ) then
self : Schedule ( self.vb . meteorTotal == 2 and 0.2 or 0.5 , checkMyAxe , self )
end
warnMeteorAxe : CombinedShow ( self.vb . meteorTotal == 2 and 0.3 or 0.6 , args.destName )
elseif spellId == 372027 and not args : IsPlayer ( ) then
local amount = args.amount or 1
local _ , _ , _ , _ , _ , expireTime = DBM : UnitDebuff ( " player " , spellId )
local remaining
if expireTime then
remaining = expireTime - GetTime ( )
end
if ( not remaining or remaining and remaining < 6.1 ) and not UnitIsDeadOrGhost ( " player " ) and not self : IsHealer ( ) then
specWarnSlashingBlazeTaunt : Show ( args.destName )
specWarnSlashingBlazeTaunt : Play ( " tauntboss " )
else
warnSlashingBlaze : Show ( args.destName , amount )
end
elseif spellId == 386289 then
warnBurningConvocation : Show ( )
timerMeteorAxeCD : Stop ( )
timerSlashingBlazeCD : Stop ( )
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 391599 or spellId == 371836 then --Mythic, Non Mythic
blizzardStacks [ args.destName ] = nil
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( blizzardStacks )
end
if args : IsPlayer ( ) then
playerBlizzardHigh = false
end
elseif spellId == 374039 then
if self.Options . SetIconOnMeteorAxe then
self : SetIcon ( args.destName , 0 )
end
if args : IsPlayer ( ) then
yellMeteorAxeFades : Cancel ( )
end
end
end
function mod : SPELL_AURA_REMOVED_DOSE ( args )
local spellId = args.spellId
if spellId == 391599 or spellId == 371836 then
local amount = args.amount or 1
blizzardStacks [ args.destName ] = args.amount or 1
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( blizzardStacks )
end
if args : IsPlayer ( ) and amount < 8 then
playerBlizzardHigh = false
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId , spellName )
--Warn for standing in fire unless it's to clear a high blizzard
--(if you're clearing low stacks you're just taking needless damage and should be warned for it
if spellId == 371514 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 4 ) and not playerBlizzardHigh then
specWarnGTFO : Show ( spellName )
specWarnGTFO : Play ( " watchfeet " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE