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.
405 lines
15 KiB
405 lines
15 KiB
local mod = DBM:NewMod(2564, "DBM-Raids-Dragonflight", 1, 1207)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20240208053057")
|
|
mod:SetCreatureID(209333)
|
|
mod:SetEncounterID(2820)
|
|
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8)
|
|
mod:SetHotfixNoticeRev(20231116000000)
|
|
mod:SetMinSyncRevision(20231116000000)
|
|
mod.respawnTime = 29
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEventsInCombat(
|
|
"SPELL_CAST_START 421898 421971 424352 422026 422039 421013 425816 425819",
|
|
-- "SPELL_CAST_SUCCESS",
|
|
"SPELL_SUMMON 425366",
|
|
"SPELL_AURA_APPLIED 422466 421972 426106 421038 421840 425820",
|
|
"SPELL_AURA_APPLIED_DOSE 422466 426106 421038",
|
|
"SPELL_AURA_REMOVED 421972 421840",
|
|
-- "SPELL_AURA_REMOVED_DOSE",
|
|
"SPELL_PERIODIC_DAMAGE 422023 424970",
|
|
"SPELL_PERIODIC_MISSED 422023 424970",
|
|
"UNIT_DIED"
|
|
)
|
|
|
|
--[[
|
|
(ability.id = 421898 or ability.id = 421971 or ability.id = 424352 or ability.id = 422026 or ability.id = 422039 or ability.id = 421013) and type = "begincast"
|
|
or ability.id = 421840
|
|
--]]
|
|
--TODO, maybe nameplate aura timers for https://www.wowhead.com/ptr-2/spell=422053/shadow-spines if it's not spam cast?
|
|
--Stage One: Garden of Despair
|
|
mod:AddTimerLine(DBM:EJ_GetSectionInfo(27467))
|
|
local warnFlamingPestilence = mod:NewCountAnnounce(421898, 3)
|
|
local warnShadowSpines = mod:NewCountAnnounce(422053, 2, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(422053))
|
|
local warnControlledBurn = mod:NewTargetCountAnnounce(421972, 3, nil, nil, 167180, nil, nil, nil, true)
|
|
local warnDreadfireBarrage = mod:NewStackAnnounce(424352, 2, nil, "Tank|Healer")
|
|
local warnFlamingSap = mod:NewTargetAnnounce(425820, 2)
|
|
|
|
local specWarnControlledBurn = mod:NewSpecialWarningYou(421972, nil, 37859, nil, 1, 2)
|
|
local yellControlledBurn = mod:NewShortPosYell(421972, 37859)--Shortname "Bomb"
|
|
local yellControlledBurnFades = mod:NewIconFadesYell(421972)
|
|
local specWarnDreadfireBarrage = mod:NewSpecialWarningTaunt(424352, nil, 120360, nil, 1, 2)
|
|
local specWarnTorturedScream = mod:NewSpecialWarningCount(422026, nil, 31295, nil, 2, 2)
|
|
local specWarnShadowflameCleave = mod:NewSpecialWarningDodgeCount(422039, nil, nil, nil, 2, 2)
|
|
local specWarnBlazingPollen = mod:NewSpecialWarningInterruptCount(425816, "HasInterrupt", nil, nil, 1, 2, 4)
|
|
local specWarnFlamingSap = mod:NewSpecialWarningMoveAway(425820, nil, nil, nil, 1, 2, 4)
|
|
local yellFlamingSap = mod:NewShortYell(425820)
|
|
local specWarnGTFO = mod:NewSpecialWarningGTFO(422023, nil, nil, nil, 1, 8)
|
|
|
|
local timerFlamingPestilenceCD = mod:NewCDCountTimer(34.7, 421898, DBM_COMMON_L.ADDS.." (%s)", nil, nil, 1)
|
|
local timerControlledBurnCD = mod:NewCDCountTimer(49, 421972, 167180, nil, nil, 3)--Shortname "Bombs"
|
|
local timerDreadfireBarrageCD = mod:NewCDCountTimer(21.5, 424352, 120360, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--Shortname Barrage
|
|
local timerTorturedScreamCD = mod:NewCDCountTimer(11.8, 422026, 31295, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON)--Scream shorttext
|
|
local timerShadowflameCleaveCD = mod:NewCDCountTimer(49, 422039, DBM_COMMON_L.FRONTAL.." (%s)", nil, nil, 3)
|
|
local timerBlazingPollenCD = mod:NewCDNPTimer(11.8, 425816, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Nameplate only timer
|
|
local timerFlamingSapCD = mod:NewCDNPTimer(11.8, 425820, nil, nil, nil, 3, nil, DBM_COMMON_L.HEALER_ICON)
|
|
--local berserkTimer = mod:NewBerserkTimer(600)
|
|
|
|
mod:AddSetIconOption("SetIconOnControlledBurn", 421972, true, 0, {1, 2, 3, 4})
|
|
mod:AddSetIconOption("SetIconOnBlazingTaintedTreant", -28350, true, 5, {8, 7, 6, 5})
|
|
--Intermission: Frenzied Growth
|
|
mod:AddTimerLine(DBM:EJ_GetSectionInfo(27475))
|
|
local warnEmberCharred = mod:NewCountAnnounce(421038, 2, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(421038))
|
|
local warnUprootedAgony = mod:NewSpellAnnounce(421840, 1)
|
|
local warnUprootedAgonyOver = mod:NewEndAnnounce(421840, 2)
|
|
|
|
local specWarnDoomCultivation = mod:NewSpecialWarningDodgeCount(421013, "Melee", nil, nil, 2, 2)--Prevent melee dying if they tunnel boss too long
|
|
|
|
local timerUprootAgonyCD = mod:NewBuffActiveTimer(20, 421840, nil, nil, nil, 5, nil, DBM_COMMON_L.DAMAGE_ICON)
|
|
local timerDoomCultivationCD = mod:NewStageCountCycleTimer(49, 421013, nil, nil, nil, 6)
|
|
|
|
--p1
|
|
mod.vb.pestilanceCount = 0
|
|
mod.vb.burnCount = 0
|
|
mod.vb.burnIcon = 1
|
|
mod.vb.barrageCount = 0
|
|
mod.vb.screamCount = 0
|
|
mod.vb.cleaveCount = 0
|
|
--p2
|
|
mod.vb.doomCount = 0
|
|
local castsPerGUID = {}
|
|
local addUsedMarks = {}
|
|
local difficultyName = "easy"
|
|
--Timers Table Notes
|
|
--If initial and loop timers were close enough, they were combined and minned since 1-2sec variation is acceptable
|
|
--If the initial and repeat timers were radically different (consistently) like with Shadowflame heroic, two entries are used to separate them
|
|
local allTimers = {
|
|
["easy"] = {
|
|
--Controlled Burn
|
|
[421971] = {33.2, 37.8},
|
|
--Dreadfire Barrage
|
|
[424352] = {9.9, 27.7, 27.7},
|
|
--Flaming Pestilence
|
|
[421898] = {16.5, 42.2},
|
|
--Shadowflame Cleave
|
|
[422039] = {22.1, 26.6, 26.6},
|
|
--Tortured Scream
|
|
[422026] = {3.2, 25.5, 25.5, 26.6},
|
|
},
|
|
["heroic"] = {
|
|
--Controlled Burn
|
|
[421971] = {30, 32.0},
|
|
--Dreadfire Barrage
|
|
[424352] = {8.9, 25, 25, 25},
|
|
--Flaming Pestilence
|
|
[421898] = {17.2, 38},
|
|
--Shadowflame Cleave
|
|
[422039] = {20, 23.9, 24},
|
|
--Tortured Scream
|
|
[422026] = {3, 22.9, 23, 24},
|
|
},
|
|
["mythic"] = {
|
|
--Controlled Burn
|
|
[421971] = {34, 33.9},
|
|
--Dreadfire Barrage
|
|
[424352] = {8.9, 20.0, 20.0, 13.9, 18.0},
|
|
--Flaming Pestilence
|
|
[421898] = {14.9, 42.0},
|
|
--Shadowflame Cleave
|
|
[422039] = {20, 23.9, 27.0},
|
|
--Tortured Scream
|
|
[422026] = {2.9, 23.0, 28.0, 21.9},
|
|
},
|
|
}
|
|
|
|
function mod:OnCombatStart(delay)
|
|
table.wipe(castsPerGUID)
|
|
table.wipe(addUsedMarks)
|
|
self:SetStage(1)
|
|
self.vb.pestilanceCount = 0
|
|
self.vb.burnCount = 0
|
|
self.vb.burnIcon = 1
|
|
self.vb.barrageCount = 0
|
|
self.vb.screamCount = 0
|
|
self.vb.cleaveCount = 0
|
|
self.vb.doomCount = 0
|
|
--Mythic and heroic initials very close
|
|
if self:IsMythic() then
|
|
difficultyName = "mythic"
|
|
timerTorturedScreamCD:Start(2.9-delay, 1)
|
|
timerDreadfireBarrageCD:Start(8.9-delay, 1)
|
|
timerFlamingPestilenceCD:Start(14.9-delay, 1)
|
|
timerShadowflameCleaveCD:Start(20-delay, 1)
|
|
timerControlledBurnCD:Start(34-delay, 1)
|
|
elseif self:IsHeroic() then
|
|
difficultyName = "heroic"
|
|
timerTorturedScreamCD:Start(3-delay, 1)
|
|
timerDreadfireBarrageCD:Start(8.9-delay, 1)
|
|
timerFlamingPestilenceCD:Start(15-delay, 1)
|
|
timerShadowflameCleaveCD:Start(20-delay, 1)
|
|
timerControlledBurnCD:Start(30-delay, 1)
|
|
else--Normal and LFR seem synced now
|
|
difficultyName = "easy"
|
|
timerTorturedScreamCD:Start(3.2-delay, 1)
|
|
timerDreadfireBarrageCD:Start(9.9-delay, 1)
|
|
timerFlamingPestilenceCD:Start(16.5-delay, 1)
|
|
timerShadowflameCleaveCD:Start(22.1-delay, 1)
|
|
timerControlledBurnCD:Start(33.2-delay, 1)
|
|
end
|
|
timerDoomCultivationCD:Start(92.2-delay, 2, 1)--Technically this variates too based on difficult, but meh, 2-3 sec at most
|
|
end
|
|
|
|
function mod:OnTimerRecovery()
|
|
if self:IsMythic() then
|
|
difficultyName = "mythic"
|
|
elseif self:IsHeroic() then
|
|
difficultyName = "heroic"
|
|
else
|
|
difficultyName = "easy"
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
local spellId = args.spellId
|
|
if spellId == 421898 then
|
|
self.vb.pestilanceCount = self.vb.pestilanceCount + 1
|
|
warnFlamingPestilence:Show(self.vb.pestilanceCount)
|
|
local timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.pestilanceCount+1)
|
|
if timer then
|
|
timerFlamingPestilenceCD:Start(timer, self.vb.pestilanceCount+1)
|
|
end
|
|
elseif spellId == 421971 then
|
|
self.vb.burnCount = self.vb.burnCount + 1
|
|
self.vb.burnIcon = 1
|
|
local timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.burnCount+1)
|
|
if timer then
|
|
timerControlledBurnCD:Start(timer, self.vb.burnCount+1)
|
|
end
|
|
elseif spellId == 424352 then
|
|
self.vb.barrageCount = self.vb.barrageCount + 1
|
|
local timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.barrageCount+1)
|
|
if timer then
|
|
timerDreadfireBarrageCD:Start(timer, self.vb.barrageCount+1)
|
|
end
|
|
elseif spellId == 422026 then
|
|
self.vb.screamCount = self.vb.screamCount + 1
|
|
specWarnTorturedScream:Show(self.vb.screamCount)
|
|
specWarnTorturedScream:Play("aesoon")
|
|
local timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.screamCount+1)
|
|
if timer then
|
|
timerTorturedScreamCD:Start(timer, self.vb.screamCount+1)
|
|
end
|
|
elseif spellId == 422039 then
|
|
self.vb.cleaveCount = self.vb.cleaveCount + 1
|
|
specWarnShadowflameCleave:Show(self.vb.cleaveCount)
|
|
specWarnShadowflameCleave:Play("shockwave")
|
|
local timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.cleaveCount+1)
|
|
if timer then
|
|
timerShadowflameCleaveCD:Start(timer, self.vb.cleaveCount+1)
|
|
end
|
|
elseif spellId == 421013 then
|
|
self:SetStage(2)
|
|
self.vb.doomCount = self.vb.doomCount + 1
|
|
specWarnDoomCultivation:Show(self.vb.doomCount)
|
|
specWarnDoomCultivation:Play("runout")
|
|
timerFlamingPestilenceCD:Stop()
|
|
timerControlledBurnCD:Stop()
|
|
timerDreadfireBarrageCD:Stop()
|
|
timerTorturedScreamCD:Stop()
|
|
timerShadowflameCleaveCD:Stop()
|
|
elseif spellId == 425816 then
|
|
-- timerBlazingPollenCD:Start(nil, args.sourceGUID)
|
|
-- timerFlamingSapCD:Start(nil, args.sourceGUID)
|
|
if not castsPerGUID[args.sourceGUID] then--Shouldn't happen, but just in case
|
|
castsPerGUID[args.sourceGUID] = 0
|
|
if self.Options.SetIconOnBlazingTaintedTreant then
|
|
for i = 8, 5, -1 do
|
|
if not addUsedMarks[i] then
|
|
addUsedMarks[i] = args.sourceGUID
|
|
self:ScanForMobs(args.sourceGUID, 2, i, 1, nil, 12, "SetIconOnBlazingTaintedTreant")
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
|
|
local count = castsPerGUID[args.sourceGUID]
|
|
if self:CheckInterruptFilter(args.sourceGUID, false, false) then--Count interrupt, so cooldown is not checked
|
|
specWarnBlazingPollen:Show(args.sourceName, count)
|
|
if count < 6 then
|
|
specWarnBlazingPollen:Play("kick"..count.."r")
|
|
else
|
|
specWarnBlazingPollen:Play("kickcast")
|
|
end
|
|
end
|
|
elseif spellId == 425819 then
|
|
--timerFlamingSapCD:Start(nil, args.sourceGUID)
|
|
end
|
|
end
|
|
|
|
--[[
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
|
local spellId = args.spellId
|
|
if spellId == 334945 then
|
|
|
|
end
|
|
end
|
|
--]]
|
|
|
|
--https://www.wowhead.com/ptr-2/spell=418491/everweaving-threads
|
|
function mod:SPELL_SUMMON(args)
|
|
local spellId = args.spellId
|
|
if spellId == 425366 then--Tainted Treant
|
|
if not castsPerGUID[args.destGUID] then
|
|
--timerBlazingPollenCD:Start(nil, args.destGUID)
|
|
castsPerGUID[args.destGUID] = 0
|
|
if self.Options.SetIconOnBlazingTaintedTreant then
|
|
for i = 8, 5, -1 do
|
|
if not addUsedMarks[i] then
|
|
addUsedMarks[i] = args.destGUID
|
|
self:ScanForMobs(args.destGUID, 2, i, 1, nil, 12, "SetIconOnBlazingTaintedTreant")
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 422466 then
|
|
if args:IsPlayer() and self:AntiSpam(3, 1) then
|
|
warnShadowSpines:Show(args.amount or 1)
|
|
end
|
|
elseif spellId == 421972 then
|
|
local icon = self.vb.burnIcon
|
|
if self.Options.SetIconOnControlledBurn then
|
|
self:SetIcon(args.destName, icon)
|
|
end
|
|
if args:IsPlayer() then
|
|
specWarnControlledBurn:Show()
|
|
specWarnControlledBurn:Play("bombyou")
|
|
yellControlledBurn:Yell(icon, icon)
|
|
yellControlledBurnFades:Countdown(spellId, nil, icon)
|
|
end
|
|
warnControlledBurn:CombinedShow(0.5, self.vb.burnCount, args.destName)
|
|
self.vb.burnIcon = self.vb.burnIcon + 1
|
|
elseif spellId == 426106 then
|
|
local amount = args.amount or 1
|
|
--Applies 5 stacks at a time (then just refreshes after that)
|
|
--so this should effectively warn once per barrage
|
|
if amount % 5 == 0 then
|
|
if args:IsPlayer() then--This basically can swap every 1-2 stacks based on it's cooldown.
|
|
warnDreadfireBarrage:Show(args.destName, amount)
|
|
else
|
|
local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId)
|
|
local remaining
|
|
if expireTime then
|
|
remaining = expireTime-GetTime()
|
|
end
|
|
if (not remaining or remaining and remaining < 22) and not UnitIsDeadOrGhost("player") and not self:IsHealer() then
|
|
specWarnDreadfireBarrage:Show(args.destName)
|
|
specWarnDreadfireBarrage:Play("tauntboss")
|
|
else
|
|
warnDreadfireBarrage:Show(args.destName, amount)
|
|
end
|
|
end
|
|
end
|
|
elseif spellId == 421038 then
|
|
if args:IsPlayer() then
|
|
warnEmberCharred:Show(args.amount or 1)
|
|
end
|
|
elseif spellId == 421840 then
|
|
warnUprootedAgony:Show()
|
|
timerUprootAgonyCD:Start()
|
|
elseif spellId == 425820 then
|
|
warnFlamingSap:CombinedShow(0.3, args.destName)
|
|
if args:IsPlayer() then
|
|
specWarnFlamingSap:Show()
|
|
specWarnFlamingSap:Play("range5")
|
|
yellFlamingSap:Yell()
|
|
end
|
|
end
|
|
end
|
|
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 421972 then
|
|
if self.Options.SetIconOnControlledBurn then
|
|
self:SetIcon(args.destName, 0)
|
|
end
|
|
elseif spellId == 421840 then
|
|
self:SetStage(1)
|
|
warnUprootedAgonyOver:Show()
|
|
self.vb.pestilanceCount = 0
|
|
self.vb.burnCount = 0
|
|
self.vb.barrageCount = 0
|
|
self.vb.screamCount = 0
|
|
self.vb.cleaveCount = 0
|
|
timerUprootAgonyCD:Stop()
|
|
if self:IsMythic() then
|
|
timerTorturedScreamCD:Start(4.3, 1)
|
|
timerDreadfireBarrageCD:Start(10.4, 1)
|
|
timerFlamingPestilenceCD:Start(16.4, 1)
|
|
timerShadowflameCleaveCD:Start(21.4, 1)
|
|
timerControlledBurnCD:Start(35.4, 1)
|
|
timerDoomCultivationCD:Start(94.1, 2, self.vb.doomCount+1)--Recheck multiple times
|
|
elseif self:IsHeroic() then
|
|
timerTorturedScreamCD:Start(4.5, 1)
|
|
timerDreadfireBarrageCD:Start(10.5, 1)
|
|
timerFlamingPestilenceCD:Start(16.5, 1)
|
|
timerShadowflameCleaveCD:Start(21.5, 1)
|
|
timerControlledBurnCD:Start(31.5, 1)
|
|
timerDoomCultivationCD:Start(93.4, 2, self.vb.doomCount+1)
|
|
else--LFR and normal
|
|
timerTorturedScreamCD:Start(4.4, 1)
|
|
timerDreadfireBarrageCD:Start(11, 1)
|
|
timerFlamingPestilenceCD:Start(17.7, 1)
|
|
timerShadowflameCleaveCD:Start(23.2, 1)
|
|
timerControlledBurnCD:Start(34.3, 1)
|
|
timerDoomCultivationCD:Start(94.4, 2, self.vb.doomCount+1)
|
|
end
|
|
end
|
|
end
|
|
--mod.SPELL_AURA_REMOVED_DOSE = mod.SPELL_AURA_REMOVED
|
|
|
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
|
if spellId == 422023 and destGUID == UnitGUID("player") and self:AntiSpam(2, 4) then
|
|
specWarnGTFO:Show(spellName)
|
|
specWarnGTFO:Play("watchfeet")
|
|
elseif spellId == 424970 and not DBM:UnitDebuff("player", 421038) 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
|
|
|
|
--https://www.wowhead.com/ptr-2/npc=210231/tainted-lasher
|
|
--https://www.wowhead.com/ptr-2/npc=211904/tainted-treant
|
|
function mod:UNIT_DIED(args)
|
|
local cid = self:GetCIDFromGUID(args.destGUID)
|
|
if cid == 211904 then--Tainted Treant
|
|
timerBlazingPollenCD:Stop(args.destGUID)
|
|
timerFlamingSapCD:Stop(args.destGUID)
|
|
for i = 8, 5, -1 do
|
|
if addUsedMarks[i] == args.destGUID then
|
|
addUsedMarks[i] = nil
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|