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.
360 lines
14 KiB
360 lines
14 KiB
local mod = DBM:NewMod(2527, "DBM-Raids-Dragonflight", 2, 1208)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20240714045321")
|
|
mod:SetCreatureID(201579)
|
|
mod:SetEncounterID(2683)
|
|
mod:SetUsedIcons(1, 2, 3, 8)
|
|
mod:SetHotfixNoticeRev(20230619000000)
|
|
--mod:SetMinSyncRevision(20221215000000)
|
|
mod.respawnTime = 29
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEventsInCombat(
|
|
"SPELL_CAST_START 408358 402989 403740 403671 409093 402344 404846",
|
|
"SPELL_AURA_APPLIED 408839 407879 408955 402994 411633 406712 411149",
|
|
"SPELL_AURA_APPLIED_DOSE 408839 408955",
|
|
"SPELL_AURA_REMOVED 408839 407879 402994 411149",
|
|
"SPELL_PERIODIC_DAMAGE 411633 406712",
|
|
"SPELL_PERIODIC_MISSED 411633 406712",
|
|
"UNIT_POWER_UPDATE boss1"
|
|
)
|
|
|
|
--[[
|
|
(ability.id = 408358 or ability.id = 402989 or ability.id = 403740 or ability.id = 403671 or ability.id = 409093 or ability.id = 402344 or ability.id = 404846) and type = "begincast"
|
|
or ability.id = 407879 and (type = "applybuff" or type = "removebuff")
|
|
--]]
|
|
--TODO, dynamic energy calculation for accurate Catastrophic timer needs verification
|
|
--TODO, the way timers are sequenced assumes doing fight with no mistakes. If tantrums are triggered, it can make timers wrong rest of fight.
|
|
--However, doing timers the way they are done is most accurate if people don't do fight wrong., so may just tell users "do fight correctly 5head" that complain instead of using complicated updateAllTimers methods just to work around player mistakes
|
|
--TODO, fine tune personal stack alerts
|
|
local warnHeatStacks = mod:NewCountAnnounce(408839, 2, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(408839))
|
|
local warnMoltenSpittle = mod:NewTargetCountAnnounce(402994, 2, nil, nil, 307031)
|
|
local warnIncineratingMaws = mod:NewStackAnnounce(404846, 2, nil, "Tank|Healer")
|
|
|
|
local specWarnCatastrophicEruption = mod:NewSpecialWarningSpell(408358, nil, nil, nil, 3, 2)
|
|
local specWarnHeatStacks = mod:NewSpecialWarningStack(408839, nil, 35, nil, nil, 1, 6)
|
|
local specWarnBlazingTantrum = mod:NewSpecialWarningMove(407879, "Tank", nil, nil, 1, 2)
|
|
local specWarnIgnitingRoar = mod:NewSpecialWarningCount(403740, nil, 188832, nil, 2, 2)
|
|
local specWarnOverpoweringStomp = mod:NewSpecialWarningCount(403671, nil, 149213, nil, 2, 2)
|
|
local specWarnMoltenSpittle = mod:NewSpecialWarningYou(402994, nil, 80801, nil, 1, 2)
|
|
local yellMoltenSpittle = mod:NewShortPosYell(402994, "%s", nil, nil, "YELL")
|
|
local yellMoltenSpittleFades = mod:NewIconFadesYell(402994, nil, nil, nil, "YELL")
|
|
local specWarnBlazingBreath = mod:NewSpecialWarningDodgeCount(409093, nil, 18357, nil, 2, 2)
|
|
local specWarnIncineratingMaws = mod:NewSpecialWarningStack(404846, nil, 2, nil, nil, 1, 6)
|
|
local specWarnIncineratingMawsSwap = mod:NewSpecialWarningTaunt(404846, nil, nil, nil, 1, 2)
|
|
local specWarnGTFO = mod:NewSpecialWarningGTFO(411633, nil, nil, nil, 1, 8)
|
|
|
|
local timerCatastrophicCD = mod:NewCDTimer(28.9, 408358, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
|
|
local timerMoltenSpittleCD = mod:NewCDCountTimer(29.9, 402994, 307031, nil, nil, 3)--"Lava Pools"
|
|
local timerIngitingRoarCD = mod:NewCDCountTimer(28.9, 403740, 188832, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON)--"Roar"
|
|
local timerOverpoweringStompCD = mod:NewCDCountTimer(101.7, 403671, 149213, nil, nil, 2)--"Knockback"
|
|
local timerBlazingBreathCD = mod:NewCDCountTimer(29.9, 409093, 18357, nil, nil, 3)
|
|
local timerIncineratingMawsCD = mod:NewCDCountTimer(20, 404846, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
|
|
--local berserkTimer = mod:NewBerserkTimer(600)
|
|
|
|
mod:AddInfoFrameOption(408839, true)
|
|
mod:AddSetIconOption("SetIconOnMoltenSpittle", 402994, true, 0, {1, 2, 3, 8})
|
|
mod:AddNamePlateOption("NPAuraOnTantrum", 407879)
|
|
|
|
local heatStacks = {}
|
|
mod.vb.spitCount = 0
|
|
mod.vb.roarCount = 0
|
|
mod.vb.stompCount = 0
|
|
mod.vb.breathCount = 0
|
|
mod.vb.mawCount = 0
|
|
mod.vb.spitIcon = 1
|
|
|
|
function mod:OnCombatStart(delay)
|
|
table.wipe(heatStacks)
|
|
self.vb.spitCount = 0
|
|
self.vb.roarCount = 0
|
|
self.vb.stompCount = 0
|
|
self.vb.breathCount = 0
|
|
self.vb.mawCount = 0
|
|
self.vb.spitIcon = 1
|
|
if self:IsEasy() then
|
|
timerIngitingRoarCD:Start(8.8-delay, 1)
|
|
timerMoltenSpittleCD:Start(16.6-delay, 1)
|
|
timerIncineratingMawsCD:Start(22.2-delay, 1)
|
|
timerBlazingBreathCD:Start(33.3-delay, 1)
|
|
timerOverpoweringStompCD:Start(76.6,-delay, 1)
|
|
elseif self:IsHeroic() then
|
|
timerIngitingRoarCD:Start(6.2-delay, 1)
|
|
timerMoltenSpittleCD:Start(16.2-delay, 1)
|
|
timerIncineratingMawsCD:Start(24.9-delay, 1)
|
|
timerBlazingBreathCD:Start(31.2-delay, 1)
|
|
timerOverpoweringStompCD:Start(89.9-delay, 1)
|
|
else--Mythic
|
|
timerIngitingRoarCD:Start(5.5-delay, 1)
|
|
timerMoltenSpittleCD:Start(14.4-delay, 1)
|
|
timerIncineratingMawsCD:Start(22.2-delay, 1)
|
|
timerBlazingBreathCD:Start(28-delay, 1)
|
|
timerOverpoweringStompCD:Start(43-delay, 1)
|
|
end
|
|
timerCatastrophicCD:Start(335-delay)
|
|
if self.Options.NPAuraOnTantrum then
|
|
DBM:FireEvent("BossMod_EnableHostileNameplates")
|
|
end
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:SetHeader(DBM:GetSpellName(408839))
|
|
DBM.InfoFrame:Show(30, "table", heatStacks, 1)
|
|
end
|
|
end
|
|
|
|
function mod:OnCombatEnd()
|
|
table.wipe(heatStacks)
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:Hide()
|
|
end
|
|
if self.Options.NPAuraOnTantrum then
|
|
DBM.Nameplate:Hide(true, nil, nil, nil, true, true)
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
local spellId = args.spellId
|
|
if spellId == 408358 then
|
|
specWarnCatastrophicEruption:Show()
|
|
specWarnCatastrophicEruption:Play("stilldanger")
|
|
timerIngitingRoarCD:Stop()
|
|
timerMoltenSpittleCD:Stop()
|
|
timerIncineratingMawsCD:Stop()
|
|
timerBlazingBreathCD:Stop()
|
|
timerOverpoweringStompCD:Stop()
|
|
elseif spellId == 402989 then
|
|
self.vb.spitCount = self.vb.spitCount + 1
|
|
self.vb.spitIcon = 1
|
|
--16.6, 40.0, 41.1, 32.2, 40.0, 41.1, 32.3, 40.0, 41.1
|
|
if self:IsEasy() then
|
|
if self.vb.spitCount % 3 == 1 then
|
|
timerMoltenSpittleCD:Start(40, self.vb.spitCount+1)
|
|
elseif self.vb.spitCount % 3 == 0 then
|
|
timerMoltenSpittleCD:Start(32, self.vb.spitCount+1)
|
|
else
|
|
timerMoltenSpittleCD:Start(41, self.vb.spitCount+1)
|
|
end
|
|
elseif self:IsHeroic() then
|
|
--16.2, 29.9, 32.4, 37.5, 29.9, 32.5, 37.5, 29.9, 32.4
|
|
if self.vb.spitCount % 3 == 0 then
|
|
timerMoltenSpittleCD:Start(37.5, self.vb.spitCount+1)
|
|
elseif self.vb.spitCount % 3 == 1 then
|
|
timerMoltenSpittleCD:Start(29.9, self.vb.spitCount+1)
|
|
else--2/3
|
|
timerMoltenSpittleCD:Start(32.4, self.vb.spitCount+1)
|
|
end
|
|
else--Mythic
|
|
--14.4, 40.0, 26.6, 40.0, 26.6, 40, 26.7
|
|
if self.vb.spitCount % 2 == 0 then
|
|
timerMoltenSpittleCD:Start(26.6, self.vb.spitCount+1)
|
|
else
|
|
timerMoltenSpittleCD:Start(40, self.vb.spitCount+1)
|
|
end
|
|
end
|
|
elseif spellId == 403740 then
|
|
self.vb.roarCount = self.vb.roarCount + 1
|
|
specWarnIgnitingRoar:Show(self.vb.roarCount)
|
|
specWarnIgnitingRoar:Play("aesoon")
|
|
if self:IsEasy() then
|
|
--8.8, 40.0, 44.4, 28.9, 40.0, 44.5, 28.9, 40.0, 44.4
|
|
if self.vb.roarCount % 3 == 0 then
|
|
timerIngitingRoarCD:Start(28.8, self.vb.roarCount+1)
|
|
elseif self.vb.roarCount % 3 == 2 then
|
|
timerIngitingRoarCD:Start(44.4, self.vb.roarCount+1)
|
|
else--3 == 1
|
|
timerIngitingRoarCD:Start(40, self.vb.roarCount+1)
|
|
end
|
|
elseif self:IsHeroic() then
|
|
--6.2, 49.9, 49.9, 49.9, 49.9, 49.9, 49.9, 49.9
|
|
timerIngitingRoarCD:Start(49.9, self.vb.roarCount+1)
|
|
else--Mythic
|
|
--5.0, 41.8, 24.8, 41.8, 24.8, 41.8, ...
|
|
if self.vb.roarCount % 2 == 0 then
|
|
timerIngitingRoarCD:Start(24.8, self.vb.roarCount+1)
|
|
else
|
|
timerIngitingRoarCD:Start(41.8, self.vb.roarCount+1)
|
|
end
|
|
end
|
|
elseif spellId == 403671 then
|
|
self.vb.stompCount = self.vb.stompCount + 1
|
|
specWarnOverpoweringStomp:Show(self.vb.stompCount)
|
|
specWarnOverpoweringStomp:Play("carefly")
|
|
timerOverpoweringStompCD:Start(self:IsMythic() and 66.6 or self:IsEasy() and 113.3 or 100, self.vb.stompCount+1)
|
|
elseif spellId == 409093 or spellId == 402344 then--409093 confirmed for heroic/normal, 402344 unknown
|
|
self.vb.breathCount = self.vb.breathCount + 1
|
|
specWarnBlazingBreath:Show(self.vb.breathCount)
|
|
specWarnBlazingBreath:Play("breathsoon")
|
|
if self:IsEasy() then
|
|
--33.3, 27.7, 42.2, 43.3, 27.8, 42.2, 43.4, 27.8, 42.2
|
|
--33.3, 27.7, 42.2, 43.3, 27.7, 42.2
|
|
if self.vb.breathCount % 3 == 0 then
|
|
timerBlazingBreathCD:Start(43.3, self.vb.breathCount+1)
|
|
elseif self.vb.breathCount % 3 == 2 then
|
|
timerBlazingBreathCD:Start(42.2, self.vb.breathCount+1)
|
|
else
|
|
timerBlazingBreathCD:Start(27.7, self.vb.breathCount+1)
|
|
end
|
|
elseif self:IsHeroic() then
|
|
--31.2, 35, 64.9, 34.9, 65, 34.9
|
|
if self.vb.breathCount % 2 == 0 then
|
|
timerBlazingBreathCD:Start(64.9, self.vb.breathCount+1)
|
|
else
|
|
timerBlazingBreathCD:Start(34.9, self.vb.breathCount+1)
|
|
end
|
|
else
|
|
--28.8, 35.5, 31, 35.5, 31.1, ...
|
|
if self.vb.breathCount % 2 == 0 then
|
|
timerBlazingBreathCD:Start(31, self.vb.breathCount+1)
|
|
else
|
|
timerBlazingBreathCD:Start(35.5, self.vb.breathCount+1)
|
|
end
|
|
end
|
|
elseif spellId == 404846 then
|
|
self.vb.mawCount = self.vb.mawCount + 1
|
|
if self:IsEasy() then
|
|
--22.2, 22.3, 22.2, 22.2, 22.2, 24.8, 21.8, 22.3, 22.2, 22.2, 24.5, 22.2, 22.3, 22.2
|
|
if self.vb.mawCount % 5 == 0 then
|
|
timerIncineratingMawsCD:Start(24.4, self.vb.mawCount+1)
|
|
else
|
|
timerIncineratingMawsCD:Start(22.2, self.vb.mawCount+1)
|
|
end
|
|
elseif self:IsMythic() then
|
|
--22.2, 14.4, 24.4, 27.8, 14.4, 24.4, 27.7, 14.4
|
|
if self.vb.mawCount % 3 == 0 then
|
|
timerIncineratingMawsCD:Start(27.8, self.vb.breathCount+1)
|
|
elseif self.vb.mawCount % 3 == 2 then
|
|
timerIncineratingMawsCD:Start(24.4, self.vb.breathCount+1)
|
|
else
|
|
timerIncineratingMawsCD:Start(14.4, self.vb.breathCount+1)
|
|
end
|
|
else--Heroic
|
|
timerIncineratingMawsCD:Start(25, self.vb.mawCount+1)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 408839 then
|
|
local amount = args.amount or 1
|
|
heatStacks[args.destName] = amount
|
|
if args:IsPlayer() then
|
|
if amount >= 35 then--Emphasize at higher stacks
|
|
specWarnHeatStacks:Show(amount)
|
|
specWarnHeatStacks:Play("stackhigh")
|
|
elseif amount % 4 == 0 then--(4, 8, 12, 16) Otherwise, don't spam elevated warning
|
|
warnHeatStacks:Show(amount)
|
|
end
|
|
end
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:UpdateTable(heatStacks)
|
|
end
|
|
elseif spellId == 407879 then
|
|
if self:AntiSpam(3, 1) then
|
|
specWarnBlazingTantrum:Show()
|
|
specWarnBlazingTantrum:Play("moveboss")
|
|
end
|
|
if self.Options.NPAuraOnTantrum then
|
|
DBM.Nameplate:Show(true, args.destGUID, spellId)
|
|
end
|
|
elseif spellId == 408955 then
|
|
local amount = args.amount or 1
|
|
if amount % 3 == 0 then--Boss applies 3 stacks per cast
|
|
if args:IsPlayer() then
|
|
if amount >= 6 then--Only big alert if other tank misses a swap
|
|
specWarnIncineratingMaws:Show(amount)
|
|
specWarnIncineratingMaws:Play("stackhigh")
|
|
else
|
|
warnIncineratingMaws:Show(args.destName, amount)
|
|
end
|
|
else
|
|
local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId)
|
|
local remaining
|
|
if expireTime then
|
|
remaining = expireTime-GetTime()
|
|
end
|
|
local timerLeft = timerIncineratingMawsCD:GetRemaining(self.vb.mawCount+1) or 14.4
|
|
if (not remaining or remaining and remaining < timerLeft) and not UnitIsDeadOrGhost("player") and not self:IsHealer() then
|
|
specWarnIncineratingMawsSwap:Show(args.destName)
|
|
specWarnIncineratingMawsSwap:Play("tauntboss")
|
|
else
|
|
warnIncineratingMaws:Show(args.destName, amount)
|
|
end
|
|
end
|
|
end
|
|
elseif spellId == 402994 then
|
|
local icon = self.vb.spitIcon
|
|
if self.Options.SetIconOnMoltenSpittle then
|
|
self:SetIcon(args.destName, icon)
|
|
end
|
|
if args:IsPlayer() then
|
|
specWarnMoltenSpittle:Show()
|
|
specWarnMoltenSpittle:Play("targetyou")
|
|
local text = L.pool:format(icon, icon)--<icon> Pool 1,2,3
|
|
yellMoltenSpittle:Say(text)--Non soak uses white text per conventions
|
|
yellMoltenSpittleFades:CountdownSay(spellId, nil, icon)--Non soak uses white text per conventions
|
|
end
|
|
warnMoltenSpittle:CombinedShow(0.3, self.vb.spitCount, args.destName)
|
|
self.vb.spitIcon = self.vb.spitIcon + 1
|
|
elseif spellId == 411149 then--Mythic specific extra id
|
|
if self.Options.SetIconOnMoltenSpittle then
|
|
self:SetIcon(args.destName, 8)
|
|
end
|
|
if args:IsPlayer() then
|
|
specWarnMoltenSpittle:Show()
|
|
specWarnMoltenSpittle:Play("gathershare")
|
|
--Might need to be 4, 8, i forget arg order
|
|
yellMoltenSpittle:Yell(L.soakpool)
|
|
yellMoltenSpittleFades:Countdown(spellId, nil, 8)--Soak version uses red text per conventions
|
|
end
|
|
warnMoltenSpittle:CombinedShow(0.3, self.vb.spitCount, args.destName)
|
|
elseif (spellId == 406712 or spellId == 411633) and args:IsPlayer() and self:AntiSpam(3, 2) then
|
|
specWarnGTFO:Show(args.spellName)
|
|
specWarnGTFO:Play("watchfeet")
|
|
end
|
|
end
|
|
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 408839 then
|
|
heatStacks[args.destName] = nil
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:UpdateTable(heatStacks)
|
|
end
|
|
elseif spellId == 407879 then
|
|
if self.Options.NPAuraOnTantrum then
|
|
DBM.Nameplate:Hide(true, args.destGUID, spellId)
|
|
end
|
|
elseif spellId == 402994 or spellId == 411149 then
|
|
if self.Options.SetIconOnMoltenSpittle then
|
|
self:SetIcon(args.destName, 0)
|
|
end
|
|
if args:IsPlayer() then
|
|
yellMoltenSpittleFades:Cancel()
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local lastPower = 0
|
|
function mod:UNIT_POWER_UPDATE(uId)
|
|
local bossPower = UnitPower(uId) --Get Boss Power
|
|
if bossPower-lastPower > 2 then--Boss gained an energy spike, because he should only gain 1 energy per second
|
|
--So update timer
|
|
DBM:Debug("Power gain detected. Updating Cata timer.")
|
|
timerCatastrophicCD:RemoveTime(17)
|
|
end
|
|
lastPower = bossPower
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
|
if (spellId == 406712 or spellId == 411633) and destGUID == UnitGUID("player") and self:AntiSpam(3, 2) then
|
|
specWarnGTFO:Show(spellName)
|
|
specWarnGTFO:Play("watchfeet")
|
|
end
|
|
end
|
|
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
|
|
|