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.

447 lines
17 KiB

local mod = DBM:NewMod(2564, "DBM-Raids-Dragonflight", 1, 1207)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20231107113441")
mod:SetCreatureID(209333)
mod:SetEncounterID(2820)
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8)
mod:SetHotfixNoticeRev(20231003000000)
mod:SetMinSyncRevision(20230923000000)
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 warnDoomCultivation = mod:NewCountAnnounce(421013, 3)
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 specWarnEmberCharred = mod:NewSpecialWarningYou(421038, nil, nil, nil, 1, 2)
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 = "normal"
--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 = {
["lfr"] = {--Repeats unknown, not a single person testing LFR logged it on WCL
--Controlled Burn
[421971] = {36.4, 38.3},
--Dreadfire Barrage
[424352] = {10.6, 29.8, 27.6},
--Flaming Pestilence
[421898] = {18.7, 44.0},
--Shadowflame Cleave
[422039] = {24.2, 31.8, 32.0},
[4220392] = {24.2, 31.8, 32.0},--Same as above, but so table entry isn't nil for global checks
--Tortured Scream
[422026] = {4.0, 27.0, 18.3, 29.4},
},
["normal"] = {
--Controlled Burn
[421971] = {39.9, 43.0},--Repeat: 42.2, 43.0
--Dreadfire Barrage
[424352] = {12.2, 32.4, 29.1},--Repeat: 14.5, 32.3, 29.1
--Flaming Pestilence
[421898] = {21.4, 49.2},--Repeat: 23.7, 49.2
--Shadowflame Cleave
[422039] = {27.6, 36.9},--Repeat: 29.9, 36.9
[4220392] = {27.6, 36.9},--Same as above, but so table entry isn't nil for global checks
--Tortured Scream
[422026] = {4.5, 29.2, 23.0, 30.8},--Repeat: 6.8, 29.2, 23, 30.8
},
["heroic"] = {
--Controlled Burn
[421971] = {31.5, 32.0},--Repeat: 0, 34.9 / 0, 32.9
--Dreadfire Barrage
[424352] = {9.5, 24.8, 21.5, 21.5},--Repeat: 0, 25.0, 24.1, 21.5 / 0, 24.8, 22.3, 23.5 / 0, 24.8, 22.4, 23.4
--Flaming Pestilence
[421898] = {17.2, 34.7},--Repeat: 0, 36.1 / 0, 35.3
--Shadowflame Cleave
[422039] = {22.0, 20.4, 29.5},--Repeat: 0, 21.3, 30.9, 17.3 / 0, 21.1, 29.4, 18.9
[4220392] = {0, 21.1, 29.4, 17.3},--Repeat: 0, 21.3, 30.9, 17.3 / 0, 21.1, 29.4, 18.9
--Tortured Scream
[422026] = {3.6, 22.4, 20.3, 20.0, 17.2},--Repeat: 0, 22.4, 21.9, 20.9, 17.2 / 0, 22.4, 21.2, 20.0, 18.8
},
["mythic"] = {
--Controlled Burn
[421971] = {31.8, 38.9},--Repeat: 33.5, 38.8
--Dreadfire Barrage
[424352] = {9.4, 25.9, 20.0, 18.9},--Repeat: 11.1, 26.0, 19.9, 18.9
--Flaming Pestilence
[421898] = {16.5, 44.8},--Repeat: 18.2, 44.8
--Shadowflame Cleave
[422039] = {21.2, 28.2, 30.7},--Repeat: 22.9, 28.2, 30.7
[4220392] = {21.2, 28.2, 30.7},--Same as above, but so table entry isn't nil for global checks
--Tortured Scream
[422026] = {3.5, 23.5, 16.4, 22.4, 20.1},--Repeat: 5.2, 23.6, 16.4, 22.4, 20.1
},
}
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(3.5-delay, 1)
timerDreadfireBarrageCD:Start(9.4-delay, 1)
timerFlamingPestilenceCD:Start(16.5-delay, 1)
timerShadowflameCleaveCD:Start(21.2-delay, 1)
timerControlledBurnCD:Start(31.8-delay, 1)
elseif self:IsHeroic() then
difficultyName = "heroic"
timerTorturedScreamCD:Start(3.6-delay, 1)
timerDreadfireBarrageCD:Start(9.5-delay, 1)
timerFlamingPestilenceCD:Start(17.2-delay, 1)
timerShadowflameCleaveCD:Start(22-delay, 1)
timerControlledBurnCD:Start(31.5-delay, 1)
--Normal and LFR initials are still quite different
elseif self:IsNormal() then
difficultyName = "normal"
timerTorturedScreamCD:Start(4.5-delay, 1)
timerDreadfireBarrageCD:Start(12.2-delay, 1)
timerFlamingPestilenceCD:Start(21.4-delay, 1)
timerShadowflameCleaveCD:Start(27.6-delay, 1)
timerControlledBurnCD:Start(39.9-delay, 1)
else
difficultyName = "lfr"
timerTorturedScreamCD:Start(4-delay, 1)
timerDreadfireBarrageCD:Start(10.6-delay, 1)
timerFlamingPestilenceCD:Start(18.7-delay, 1)
timerShadowflameCleaveCD:Start(24.2-delay, 1)
timerControlledBurnCD:Start(36.4-delay, 1)
end
timerDoomCultivationCD:Start(96.7-delay, 2, 1)
end
--function mod:OnCombatEnd()
-- if self.Options.RangeFrame then
-- DBM.RangeCheck: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 == 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
if self.vb.doomCount > 0 then--All sets besides initial
timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId..2, self.vb.cleaveCount+1)
else--Initial timers
timer = self:GetFromTimersTable(allTimers, difficultyName, false, spellId, self.vb.cleaveCount+1)
end
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
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
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
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(5.2, 1)
timerDreadfireBarrageCD:Start(11.1, 1)
timerFlamingPestilenceCD:Start(18.2, 1)
timerShadowflameCleaveCD:Start(22.9, 1)
timerControlledBurnCD:Start(33.5, 1)
timerDoomCultivationCD:Start(92, 2, self.vb.doomCount+1)--Recheck
elseif self:IsHeroic() then--Heroic needs rechecking
timerTorturedScreamCD:Start(4.8, 1)
timerDreadfireBarrageCD:Start(10.7, 1)
timerFlamingPestilenceCD:Start(17.8, 1)
timerShadowflameCleaveCD:Start(22.5, 1)
timerControlledBurnCD:Start(31.9, 1)
timerDoomCultivationCD:Start(93.4, 2, self.vb.doomCount+1)
elseif self:IsNormal() then
timerTorturedScreamCD:Start(6.8, 1)
timerDreadfireBarrageCD:Start(14.5, 1)
timerFlamingPestilenceCD:Start(23.1, 1)
timerShadowflameCleaveCD:Start(29.2, 1)
timerControlledBurnCD:Start(41.5, 1)
timerDoomCultivationCD:Start(98.5, 2, self.vb.doomCount+1)--Recheck
else--LFR
--None known
DBM:AddMsg("LFR timers are not known/vetted beyond this point")
--timerTorturedScreamCD:Start(4.8, 1)
--timerDreadfireBarrageCD:Start(10.7, 1)
--timerFlamingPestilenceCD:Start(17.8, 1)
--timerShadowflameCleaveCD:Start(22.5, 1)
--timerControlledBurnCD:Start(31.9, 1)
--timerDoomCultivationCD:Start(93.4, 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