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.

466 lines
18 KiB

local mod = DBM:NewMod(2482, "DBM-VaultoftheIncarnates", nil, 1200)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20230423184458")
mod:SetCreatureID(187967)
mod:SetEncounterID(2592)
mod:SetUsedIcons(1, 2, 3)
mod:SetHotfixNoticeRev(20230216000000)
mod:SetMinSyncRevision(20230216000000)
--mod.respawnTime = 29
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 371976 372082 373405 374112 373027 371983 372539",
"SPELL_CAST_SUCCESS 372238 181113",
"SPELL_SUMMON 372242 372843",
"SPELL_AURA_APPLIED 371976 372082 372030 372044 385083 373048 374104",
"SPELL_AURA_APPLIED_DOSE 372030 385083",
"SPELL_AURA_REMOVED 371976 372082 372030 373048",
"SPELL_AURA_REMOVED_DOSE 372030",
"SPELL_INTERRUPT",
-- "SPELL_PERIODIC_DAMAGE 372055",
-- "SPELL_PERIODIC_MISSED 372055",
"UNIT_DIED",
"CHAT_MSG_RAID_BOSS_EMOTE"
)
--[[
(ability.id = 371976 or ability.id = 372082 or ability.id = 373405 or ability.id = 373027 or ability.id = 371983) and type = "begincast"
or (ability.id = 372238 or ability.id = 372648) and type = "cast"
or ability.id = 181113 and source.id = 189234
or ability.id = 372539 or type = "interrupt"
or ability.id = 181089 and type = "cast"
--]]
--General
--local specWarnGTFO = mod:NewSpecialWarningGTFO(340324, nil, nil, nil, 1, 8)
--local berserkTimer = mod:NewBerserkTimer(600)
--Stage One: Ice Climbers
mod:AddTimerLine(DBM:EJ_GetSectionInfo(24883))
local warnChillingBlast = mod:NewTargetAnnounce(371976, 2)
local warnEnvelopingWebs = mod:NewTargetNoFilterAnnounce(372082, 3)
local warnWrappedInWebs = mod:NewTargetNoFilterAnnounce(372044, 4)
local warnCallSpiderlings = mod:NewCountAnnounce(372238, 2)
local warnFrostbreathArachnid = mod:NewSpellAnnounce("ej24899", 2)
local specWarnChillingBlast = mod:NewSpecialWarningMoveAway(371976, nil, nil, nil, 1, 2)
local yellChillingBlast = mod:NewYell(371976)
local yellChillingBlastFades = mod:NewShortFadesYell(371976)
local specWarnEnvelopingWebs = mod:NewSpecialWarningYouPos(372082, nil, nil, nil, 1, 2)
local yellEnvelopingWebs = mod:NewShortPosYell(372082)
local yellEnvelopingWebsFades = mod:NewIconFadesYell(372082)
local specWarnStickyWebbing = mod:NewSpecialWarningStack(372030, nil, 3, nil, nil, 1, 6)
local specWarnGossamerBurst = mod:NewSpecialWarningSpell(373405, nil, nil, nil, 2, 12)
local specWarnWebBlast = mod:NewSpecialWarningTaunt(385083, nil, nil, nil, 1, 2)
local specWarnFreezingBreath = mod:NewSpecialWarningDodge(374112, nil, nil, nil, 1, 2)
local timerChillingBlastCD = mod:NewCDCountTimer(18.5, 371976, nil, nil, nil, 3)--18.5-54.5
local timerEnvelopingWebsCD = mod:NewCDCountTimer(24, 372082, nil, nil, nil, 3)--24-46.9
local timerGossamerBurstCD = mod:NewCDCountTimer(36.9, 373405, nil, nil, nil, 2)--36.9-67.6
local timerCallSpiderlingsCD = mod:NewCDCountTimer(25.1, 372238, nil, nil, nil, 1)--17.6-37
local timerFrostbreathArachnidCD = mod:NewCDCountTimer(98.9, "ej24899", nil, nil, nil, 1)
local timerFreezingBreathCD = mod:NewCDTimer(11.1, 374112, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
local timerPhaseCD = mod:NewPhaseTimer(30)
--mod:AddRangeFrameOption("8")
mod:AddInfoFrameOption(372030, false)--Useful raid leader tool, but not needed by everyone
mod:GroupSpells(372082, 372030, 372044)--Wrapped in webs and sticking webbing with enveloping Webs
--Stage Two: Cold Peak
mod:AddTimerLine(DBM:EJ_GetSectionInfo(24885))
local warnApexofIce = mod:NewCastAnnounce(372539, 3)
local warnSuffocatinWebs = mod:NewTargetNoFilterAnnounce(373027, 3)
local specWarnSuffocatingWebs = mod:NewSpecialWarningYouPos(373027, nil, nil, nil, 1, 2)
local yellSuffocatingWebs = mod:NewShortPosYell(373027)
local yellSuffocatingWebsFades = mod:NewIconFadesYell(373027)
local specWarnRepellingBurst = mod:NewSpecialWarningSpell(371983, nil, nil, nil, 2, 12)
local timerSuffocatingWebsCD = mod:NewCDCountTimer(38.8, 373027, nil, nil, nil, 3)--38-46
local timerRepellingBurstCD = mod:NewCDCountTimer(33.9, 371983, nil, nil, nil, 2)--33-37 (unknown on normal
mod:AddSetIconOption("SetIconOnSufWeb", 373027, true, false, {1, 2, 3})
local stickyStacks = {}
mod.vb.webIcon = 1
mod.vb.blastCount = 0
mod.vb.webCount = 0
mod.vb.burstCount = 0--Both bursts
mod.vb.spiderlingsCount = 0
mod.vb.bigAddCount = 0
--P1 being one giant sequenced table is more of a lazy solution vs trying to create timer tables for EACH movement (which is how fight is actually scripted)
--The timers would be more accurate with a new table every movement, but the amount of work involved isnt worth it.
local difficultyName = "lfr"
local allTimers = {
["mythic"] = {--Very close to heroic so won't alter til transcriptor to make it lower work load
[1] = {
--Chilling Blast
[371976] = {15.5, 37.6, 37.4, 29.1, 37.2, 37.5, 21.9, 36.5, 37.3},
--Enveloping Webs
[372082] = {18.1, 26.7, 30.5, 44.8, 26.7, 30.4, 38.9, 26.4, 30.4},
--Gossamer Burst
[373405] = {31.4, 37.7, 65.5, 36.5, 59.6, 37.6},
--Call Spiderlings
[372238] = {0, 25.5, 25.5, 26.7, 38.8, 25.5, 25.5, 25.5, 20.7, 26.7, 26.7},--5th has largest variance, 14-23 because sequencing isn't right way to do this, just the lazy way
},
--[2] = {
-- --Chilling Blast
-- [371976] = {15.7, 17.0, 32.8, 32.8, 34.1, 34, 34.0, 35.2, 34.0},--Unused for now
-- --Call Spiderlings
-- [372238] = {12.8, 30.4, 30.5, 32.8, 35.2},--Unused for now
--},
},
["heroic"] = {
[1] = {
--Chilling Blast
[371976] = {15.5, 37.6, 37.4, 26.7, 37.2, 36.4, 21.9, 36.5, 37.3},--likely 36 sec cd that resets on encounter events
--Enveloping Webs
[372082] = {18.1, 26.7, 30.5, 43.8, 24.3, 26.6, 38.9, 26.4, 30.4},--likely 26sec cd that rests on encounter events
--Gossamer Burst
[373405] = {31.4, 37.7, 64.3, 36.5, 59.6, 37.6},--likely 36 sec cd that resets on encounter events
--Call Spiderlings
[372238] = {0, 25.5, 25.5, 26.7, 38.8, 25.5, 25.5, 25.5, 19.4, 26.7, 26.7},--likely 25 sec cd that resets on encounter events
},
--[2] = {
-- --Chilling Blast
-- [371976] = {15.7, 17.0, 32.8, 32.8, 34.1, 34, 34.0, 35.2, 34.0},--Unused for now
-- --Call Spiderlings
-- [372238] = {12.8, 30.4, 30.5, 32.8, 35.2},--Unused for now
--},
},
["normal"] = {--LFR and normal are NOT the same, especially abilities queued by chilling blast on normal vs LFR
[1] = {
--Chilling Blast (only normal, not cast in LFR)
[371976] = {16.1, 36.5, 37.7, 26.7, 36.4, 36.5, 23.1, 37.7, 36.4},--likely 36 sec cd that resets on encounter events
--Enveloping Webs
[372082] = {17.2, 26.7, 32.8, 43.8, 27.9, 31.5, 38.9, 28, 30.3},--likely 26sec cd that rests on encounter events
--Gossamer Burst
[373405] = {31.4, 36.5, 65.3, 34, 64.3, 34},--likely 34sec cd that resets on encounter events
--Call Spiderlings
[372238] = {2.7, 20.6, 20.7, 21.8, 20.6, 29.2, 20.7, 20.8, 20.7, 27.9, 20.6, 20.6, 20.6},--likely 20 sec cd that resets on encounter events
},
--[2] = {
-- --Chilling Blast
-- [371976] = {16.6, 32.8},--Unused for now
-- --Call Spiderlings
-- [372238] = {14.2, 25.5, 25.5},--Unused for now
--},
},
["lfr"] = {--LFR and normal are NOT the same, especially abilities queued by chilling blast on normal vs LFR and lower spiderlings CD
[1] = {
--Enveloping Webs
[372082] = {17.2, 26.7, 29.1, 43.4, 27, 27.9, 43.7, 26.7, 27.9},--likely 26sec cd that rests on encounter events
--Gossamer Burst
[373405] = {31.4, 36.5, 65.3, 34, 64.3, 34},--likely 34sec cd that resets on encounter events
--Call Spiderlings
[372238] = {2.7, 36, 30.7, 31.2, 15.8, 30.4, 30.3, 37.6, 30.3, 30.4},--likely 30 sec cd that resets on encounter events
},
--[2] = {
-- --Chilling Blast
-- [371976] = {16.6, 32.8},--Unused for now
-- --Call Spiderlings
-- [372238] = {14.2, 25.5, 25.5},--Unused for now
--},
},
}
function mod:OnCombatStart(delay)
self:SetStage(1)
table.wipe(stickyStacks)
self.vb.webIcon = 1
self.vb.blastCount = 0
self.vb.webCount = 0
self.vb.burstCount = 0
self.vb.spiderlingsCount = 0
self.vb.bigAddCount = 1--Starts at 1 because 1 is up with boss on pull
-- timerCallSpiderlingsCD:Start(1-delay, 1)--cast on engage
if not self:IsLFR() then
timerChillingBlastCD:Start(15.2-delay, 1)
end
timerEnvelopingWebsCD:Start(17.2-delay, 1)
timerGossamerBurstCD:Start(31.4-delay, 1)
timerPhaseCD:Start(42.4-delay)
timerFrostbreathArachnidCD:Start(103.1, 2)--First one engages with boss
if self:IsMythic() then
difficultyName = "mythic"
elseif self:IsHeroic() then
difficultyName = "heroic"
elseif self:IsNormal() then
difficultyName = "normal"
else
difficultyName = "lfr"
end
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(DBM:GetSpellInfo(372030))
DBM.InfoFrame:Show(20, "table", stickyStacks, 1)
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"
elseif self:IsNormal() then
difficultyName = "normal"
else
difficultyName = "lfr"
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 371976 then
self.vb.blastCount = self.vb.blastCount + 1
--Seems to be cast 3 casts per movement, minus first, first started at movement, 2nd after first with longer cd then 3rd cast shorter cd after 2nd
--Repeats on next movement
--More consistent in stage 2
if self:GetStage(2) then
timerChillingBlastCD:Start(32, self.vb.blastCount+1)
else
local timer = self:GetFromTimersTable(allTimers, difficultyName, 1, spellId, self.vb.blastCount+1)
if timer then
timerChillingBlastCD:Start(timer, self.vb.blastCount+1)
end
end
elseif spellId == 372082 then
self.vb.webIcon = 1
self.vb.webCount = self.vb.webCount + 1
local timer = self:GetFromTimersTable(allTimers, difficultyName, 1, spellId, self.vb.webCount+1)
if timer then
timerEnvelopingWebsCD:Start(timer, self.vb.webCount+1)
end
elseif spellId == 373405 then
self.vb.burstCount = self.vb.burstCount + 1
specWarnGossamerBurst:Show(self.vb.burstCount)
specWarnGossamerBurst:Play("pullin")
local timer = self:GetFromTimersTable(allTimers, difficultyName, 1, spellId, self.vb.burstCount+1)
if timer then
timerGossamerBurstCD:Start(timer, self.vb.burstCount+1)
end
elseif spellId == 374112 then
if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
specWarnFreezingBreath:Show()
specWarnFreezingBreath:Play("shockwave")
end
timerFreezingBreathCD:Start(nil, args.sourceGUID)
elseif spellId == 372539 then
warnApexofIce:Show()
self:SetStage(2)
self.vb.blastCount = 0
self.vb.burstCount = 0
self.vb.webCount = 0
self.vb.spiderlingsCount = 0
timerChillingBlastCD:Stop()
timerEnvelopingWebsCD:Stop()
timerGossamerBurstCD:Stop()
timerCallSpiderlingsCD:Stop()
timerFrostbreathArachnidCD:Stop()
elseif spellId == 373027 then
self.vb.webIcon = 1
self.vb.webCount = self.vb.webCount + 1
timerSuffocatingWebsCD:Start(nil, self.vb.webCount+1)
elseif spellId == 371983 then
self.vb.burstCount = self.vb.burstCount + 1
specWarnRepellingBurst:Show(self.vb.burstCount)
specWarnRepellingBurst:Play("carefly")
timerRepellingBurstCD:Start(nil, self.vb.burstCount+1)
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 372238 then
self.vb.spiderlingsCount = self.vb.spiderlingsCount + 1
warnCallSpiderlings:Show(self.vb.spiderlingsCount)
if self:GetStage(2) then
--Mythic sequenced, 44, 30, 35?
timerCallSpiderlingsCD:Start(self:IsNormal() and 25 or 30, self.vb.spiderlingsCount+1)
else
local timer = self:GetFromTimersTable(allTimers, difficultyName, 1, spellId, self.vb.spiderlingsCount+1)
if timer then
timerCallSpiderlingsCD:Start(timer, self.vb.spiderlingsCount+1)
end
end
elseif spellId == 181113 then--Encounter Spawn
local cid = self:GetCIDFromGUID(args.sourceGUID)
if cid == 189234 then--Frostbreath Arachnid
self.vb.bigAddCount = self.vb.bigAddCount + 1
warnFrostbreathArachnid:Show(self.vb.bigAddCount)
timerFreezingBreathCD:Start(6, args.sourceGUID)
if self.vb.bigAddCount < 3 then
timerFrostbreathArachnidCD:Start(nil, self.vb.bigAddCount+1)--98.9
end
end
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 371976 then
if args:IsPlayer() then
specWarnChillingBlast:Show()
specWarnChillingBlast:Play("scatter")
yellChillingBlast:Yell()
yellChillingBlastFades:Countdown(spellId)
end
warnChillingBlast:CombinedShow(0.3, args.destName)
elseif spellId == 372082 then
local icon = self.vb.webIcon
if self.Options.SetIconOnWeb then
self:SetIcon(args.destName, icon)
end
if args:IsPlayer() then
specWarnEnvelopingWebs:Show(self:IconNumToTexture(icon))
specWarnEnvelopingWebs:Play("mm"..icon)
yellEnvelopingWebs:Yell(icon, icon)
yellEnvelopingWebsFades:Countdown(spellId, nil, icon)
end
warnEnvelopingWebs:CombinedShow(0.5, args.destName)
self.vb.webIcon = self.vb.webIcon + 1
elseif spellId == 373048 then
local icon = self.vb.webIcon
if self.Options.SetIconOnSufWeb then
self:SetIcon(args.destName, icon)
end
if args:IsPlayer() then
specWarnSuffocatingWebs:Show(self:IconNumToTexture(icon))
specWarnSuffocatingWebs:Play("mm"..icon)
yellSuffocatingWebs:Yell(icon, icon)
yellSuffocatingWebsFades:Countdown(spellId, nil, icon)
end
warnSuffocatinWebs:CombinedShow(0.5, args.destName)
self.vb.webIcon = self.vb.webIcon + 1
elseif spellId == 372030 then
local amount = args.amount or 1
stickyStacks[args.destName] = amount
if self.Options.InfoFrame then
DBM.InfoFrame:UpdateTable(stickyStacks, 0.2)
end
if args:IsPlayer() and (amount % 3 == 0) and amount >= 3 then
specWarnStickyWebbing:Show(amount)
specWarnStickyWebbing:Play("stackhigh")
end
elseif spellId == 372044 or spellId == 374104 then--Hard version, Easy version
warnWrappedInWebs:CombinedShow(0.5, args.destName)
elseif spellId == 385083 and not args:IsPlayer() and (args.amount or 1) > 4 and not DBM:UnitDebuff("player", spellId) then
specWarnWebBlast:Show(args.destName)
specWarnWebBlast:Play("tauntboss")
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 371976 then
if args:IsPlayer() then
yellChillingBlastFades:Cancel()
end
elseif spellId == 372082 then
if self.Options.SetIconOnWeb then
self:SetIcon(args.destName, 0)
end
if args:IsPlayer() then
yellEnvelopingWebsFades:Cancel()
end
elseif spellId == 373048 then
if self.Options.SetIconOnSufWeb then
self:SetIcon(args.destName, 0)
end
if args:IsPlayer() then
yellSuffocatingWebsFades:Cancel()
end
elseif spellId == 372030 then
stickyStacks[args.destName] = nil
if self.Options.InfoFrame then
DBM.InfoFrame:UpdateTable(stickyStacks, 0.2)
end
end
end
function mod:SPELL_AURA_REMOVED_DOSE(args)
local spellId = args.spellId
if spellId == 372030 then
stickyStacks[args.destName] = args.amount or 1
if self.Options.InfoFrame then
DBM.InfoFrame:UpdateTable(stickyStacks, 0.2)
end
end
end
--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if spellId == 372055 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:SPELL_INTERRUPT(args)
if type(args.extraSpellId) == "number" and args.extraSpellId == 372539 then
--These timers can still variate due to bugs I won't document here or code around (even though I know how to)
--needless to say I hope they get fixed
timerCallSpiderlingsCD:Start(8.4, 1)
if not self:IsLFR() then
timerChillingBlastCD:Start(10.8, 1)
end
timerSuffocatingWebsCD:Start(18.1, 1)
timerRepellingBurstCD:Start(27.8, 1)
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 189234 then--Frostbreath Arachnid
timerFreezingBreathCD:Stop(args.destGUID)
end
end
--"<2.19 23:28:07> [ENCOUNTER_START] 2592#Sennarth, The Cold Breath#15#20", -- [26]
--"<45.37 23:28:50> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\ICONS\\INV_MineSpider2_Crystal.blp:20|t %s begins to ascend!
--"<146.08 23:30:31> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\ICONS\\INV_MineSpider2_Crystal.blp:20|t %s begins to ascend!
--"<245.88 23:32:10> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\ICONS\\INV_MineSpider2_Crystal.blp:20|t %s begins to ascend!
--"<300.23 23:33:05> [CLEU] SPELL_CAST_START#Creature-0-2085-2522-14007-187967-000040998B#Sennarth<12.0%-3.0%>##nil#372539#Apex of Ice#nil#nil", -- [23406]
function mod:CHAT_MSG_RAID_BOSS_EMOTE(msg)
if msg:find("INV_MineSpider2_Crystal.blp") then
-- self.vb.blastCount = 0
-- timerGossamerBurstCD:Stop()
-- timerChillingBlastCD:Stop()
if self.vb.stageTotality == 1 then--First movement
self:SetStage(1.25)--Arbritrary phase numbers since journal classifies movements as intermissions and top as true stage 2
--Stop stage 1 timers and basically restart them
--Only first movement has delay on spiderlings, other movements summon them immediately
-- timerCallSpiderlingsCD:Stop()
-- timerChillingBlastCD:Start(10, 1)
-- timerCallSpiderlingsCD:Start(20)
-- timerGossamerBurstCD:Start(27.4, self.vb.burstCount+1)
timerPhaseCD:Start(99.8)--Til next movement
elseif self.vb.stageTotality == 2 then--Second movement
self:SetStage(1.5)--Arbritrary phase numbers since journal classifies movements as intermissions and top as true stage 2
--Stop stage 1 timers and basically restart them
-- timerChillingBlastCD:Start(16, 1)
-- timerGossamerBurstCD:Start(33, self.vb.burstCount+1)
timerPhaseCD:Start(98.5)--Til next movement
else--Last movement
self:SetStage(1.75)--Arbritrary phase numbers since journal classifies movements as intermissions and top as true stage 2
--Stop them for last time, and not restart them, stage 2 soon
-- timerChillingBlastCD:Start(16, 1)
-- timerGossamerBurstCD:Start(33, self.vb.burstCount+1)
timerPhaseCD:Start(53.8)--Til Stage 2 (2nd movement has ended)
end
end
end