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.
328 lines
14 KiB
328 lines
14 KiB
|
2 years ago
|
local mod = DBM:NewMod(2525, "DBM-Raids-Dragonflight", 2, 1208)
|
||
|
3 years ago
|
local L = mod:GetLocalizedStrings()
|
||
|
|
|
||
|
2 years ago
|
mod:SetRevision("20240426174649")
|
||
|
3 years ago
|
mod:SetCreatureID(201320)
|
||
|
|
mod:SetEncounterID(2680)
|
||
|
|
mod:SetUsedIcons(1)
|
||
|
3 years ago
|
mod:SetHotfixNoticeRev(20230517000000)
|
||
|
3 years ago
|
--mod:SetMinSyncRevision(20221215000000)
|
||
|
2 years ago
|
mod.respawnTime = 29
|
||
|
3 years ago
|
|
||
|
|
mod:RegisterCombat("combat")
|
||
|
|
|
||
|
|
mod:RegisterEventsInCombat(
|
||
|
3 years ago
|
"SPELL_CAST_START 405316 405821 406851 406333 406145 400777 410070 407596 407544",
|
||
|
|
"SPELL_CAST_SUCCESS 407641",
|
||
|
3 years ago
|
"SPELL_AURA_APPLIED 405819 407547 407597 401419 405827",
|
||
|
3 years ago
|
"SPELL_AURA_APPLIED_DOSE 405827",
|
||
|
3 years ago
|
"SPELL_AURA_REMOVED 405819 401419 405827 405091",
|
||
|
3 years ago
|
"SPELL_AURA_REMOVED_DOSE 405827",
|
||
|
3 years ago
|
"SPELL_PERIODIC_DAMAGE 403543",
|
||
|
2 years ago
|
"SPELL_PERIODIC_MISSED 403543"
|
||
|
3 years ago
|
)
|
||
|
|
|
||
|
3 years ago
|
--NOTE, in LFR (and maybe normal), tank combo is not in random order so might be able to clean up tank code there
|
||
|
3 years ago
|
--[[
|
||
|
3 years ago
|
(ability.id = 410070 or ability.id = 405316 or ability.id = 405821 or ability.id = 406851 or ability.id = 406333 or ability.id = 406145 or ability.id = 400777 or ability.id = 407547 or ability.id = 407597 or ability.id = 406165 or ability.id = 407596 or ability.id = 407544) and type = "begincast"
|
||
|
|
or ability.id = 401419 and (type = "applybuff" or type = "removebuff") or ability.id = 405825 or ability.id = 407641
|
||
|
3 years ago
|
--]]
|
||
|
|
--TODO, https://www.wowhead.com/ptr/spell=407706/molten-wrath seems passive, but still maybe have a 15 second timer with right script
|
||
|
|
local warnSearingSlam = mod:NewTargetNoFilterAnnounce(405821, 4)
|
||
|
|
local warnSiphonEnergyApplied = mod:NewTargetNoFilterAnnounce(401419, 2)
|
||
|
|
local warnSiphonEnergyRemoved = mod:NewFadesAnnounce(401419, 2)
|
||
|
3 years ago
|
local warnUnyieldingRage = mod:NewFadesAnnounce(406165, 1)
|
||
|
3 years ago
|
|
||
|
3 years ago
|
local specWarnAncientFury = mod:NewSpecialWarningSpell(405316, nil, nil, nil, 2, 2)
|
||
|
3 years ago
|
local specWarnSearingSlam = mod:NewSpecialWarningYou(405821, nil, nil, nil, 2, 2)
|
||
|
3 years ago
|
local yellSearingSlam = mod:NewShortYell(405821)
|
||
|
|
local yellSearingSlamFades = mod:NewShortFadesYell(405821)
|
||
|
|
local specWarnDoomFlame = mod:NewSpecialWarningCount(406851, nil, nil, nil, 2, 2)
|
||
|
|
local specWarnShadowlavaBlast = mod:NewSpecialWarningDodgeCount(406333, nil, nil, nil, 2, 2)
|
||
|
3 years ago
|
local specWarnChargedSmash = mod:NewSpecialWarningCount(400777, nil, nil, nil, 2, 2)
|
||
|
|
local specWarnFlamingSlash = mod:NewSpecialWarningDefensive(407547, nil, nil, nil, 1, 2)
|
||
|
|
local specWarnFlamingSlashTaunt = mod:NewSpecialWarningTaunt(407547, nil, nil, nil, 1, 2)
|
||
|
3 years ago
|
local specWarnEarthenCrush = mod:NewSpecialWarningDefensive(407597, nil, nil, nil, 1, 2)
|
||
|
|
local specWarnEarthenCrushTaunt = mod:NewSpecialWarningTaunt(407597, nil, nil, nil, 1, 2)
|
||
|
3 years ago
|
|
||
|
|
local specWarnUnleashedShadowflame = mod:NewSpecialWarningCount(410070, nil, 98565, nil, 2, 2, 4)
|
||
|
3 years ago
|
local specWarnGTFO = mod:NewSpecialWarningGTFO(403543, nil, nil, nil, 1, 8)
|
||
|
|
|
||
|
|
local timerAncientFuryCD = mod:NewCDTimer(29.9, 405316, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
|
||
|
|
local timerSearingSlamCD = mod:NewCDCountTimer(40, 405821, nil, nil, nil, 3)
|
||
|
|
local timerDoomFlameCD = mod:NewCDCountTimer(28.9, 406851, nil, nil, nil, 5)
|
||
|
|
local timerShadowlavaBlastCD = mod:NewCDCountTimer(28.9, 406333, nil, nil, nil, 3)
|
||
|
|
local timerChargedSmashCD = mod:NewCDCountTimer(40, 400777, nil, nil, nil, 3)
|
||
|
2 years ago
|
local timerVolcanicComboCD = mod:NewCDCountTimer(40, 407641, DBM_COMMON_L.TANKCOMBO.." (%s)", "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
||
|
3 years ago
|
local timerUnleashedShadowflameCD = mod:NewCDCountTimer(40, 410070, 98565, nil, nil, 2, nil, DBM_COMMON_L.MYTHIC_ICON)--"Burning Orbs"
|
||
|
3 years ago
|
--local berserkTimer = mod:NewBerserkTimer(600)
|
||
|
|
|
||
|
3 years ago
|
mod:AddInfoFrameOption(405827)
|
||
|
3 years ago
|
mod:AddSetIconOption("SetIconOnSearingSlam", 405821, false, 0, {1})
|
||
|
|
--mod:AddNamePlateOption("NPAuraOnAscension", 385541)
|
||
|
2 years ago
|
mod:AddDropdownOption("TankSwapBehavior", {"DoubleSoak", "MinMaxSoak", "OnlyIfDanger"}, "DoubleSoak", "misc", nil, 407641)
|
||
|
3 years ago
|
--mod:GroupSpells(390715, 396094)
|
||
|
|
|
||
|
|
mod.vb.slamCount = 0
|
||
|
|
mod.vb.doomCount = 0
|
||
|
|
mod.vb.blastCount = 0
|
||
|
|
mod.vb.smashCount = 0
|
||
|
|
mod.vb.tankCombo = 0--Cast
|
||
|
|
mod.vb.comboCount = 0--Combos within cast
|
||
|
3 years ago
|
mod.vb.firstHitTank = ""
|
||
|
3 years ago
|
mod.vb.shadowflameCount = 0
|
||
|
|
local overchargedStacks = {}
|
||
|
3 years ago
|
|
||
|
|
function mod:OnCombatStart(delay)
|
||
|
2 years ago
|
self:SetStage(1)
|
||
|
3 years ago
|
table.wipe(overchargedStacks)
|
||
|
3 years ago
|
self.vb.slamCount = 0
|
||
|
|
self.vb.doomCount = 0
|
||
|
|
self.vb.blastCount = 0
|
||
|
|
self.vb.smashCount = 0
|
||
|
|
self.vb.tankCombo = 0
|
||
|
|
self.vb.comboCount = 0
|
||
|
3 years ago
|
self.vb.firstHitTank = ""
|
||
|
3 years ago
|
self.vb.shadowflameCount = 0
|
||
|
3 years ago
|
timerSearingSlamCD:Start(9.1-delay, 1)
|
||
|
3 years ago
|
timerChargedSmashCD:Start(21.1-delay, 1)
|
||
|
|
timerVolcanicComboCD:Start(29.1-delay, 1)
|
||
|
3 years ago
|
timerDoomFlameCD:Start(39.1-delay, 1)
|
||
|
3 years ago
|
timerShadowlavaBlastCD:Start(95-delay, 1)
|
||
|
3 years ago
|
timerAncientFuryCD:Start(100-delay)
|
||
|
3 years ago
|
if self:IsMythic() then
|
||
|
|
timerUnleashedShadowflameCD:Start(4.2-delay, 1)
|
||
|
|
if self.Options.InfoFrame then
|
||
|
2 years ago
|
DBM.InfoFrame:SetHeader(DBM:GetSpellName(405827))
|
||
|
3 years ago
|
DBM.InfoFrame:Show(5, "table", overchargedStacks, 1)
|
||
|
|
end
|
||
|
|
self:RegisterShortTermEvents(
|
||
|
|
"SPELL_ENERGIZE 405825"
|
||
|
|
)
|
||
|
|
end
|
||
|
3 years ago
|
end
|
||
|
|
|
||
|
3 years ago
|
function mod:OnCombatEnd()
|
||
|
|
self:UnregisterShortTermEvents()
|
||
|
|
if self.Options.InfoFrame then
|
||
|
|
DBM.InfoFrame:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
3 years ago
|
|
||
|
|
function mod:SPELL_CAST_START(args)
|
||
|
|
local spellId = args.spellId
|
||
|
|
if spellId == 405316 then
|
||
|
|
specWarnAncientFury:Show()
|
||
|
|
specWarnAncientFury:Play("aesoon")
|
||
|
|
elseif spellId == 405821 then
|
||
|
|
self.vb.slamCount = self.vb.slamCount + 1
|
||
|
3 years ago
|
local timer = (self.vb.slamCount == 1) and 45.9 or (self.vb.slamCount == 2) and 32.9
|
||
|
3 years ago
|
if timer then
|
||
|
|
timerSearingSlamCD:Start(nil, self.vb.slamCount+1)
|
||
|
|
end
|
||
|
|
elseif spellId == 406851 then
|
||
|
|
self.vb.doomCount = self.vb.doomCount + 1
|
||
|
|
specWarnDoomFlame:Show(self.vb.doomCount)
|
||
|
|
specWarnDoomFlame:Play("helpsoak")
|
||
|
|
elseif spellId == 406333 or spellId == 406145 then
|
||
|
|
self.vb.blastCount = self.vb.blastCount + 1
|
||
|
|
specWarnShadowlavaBlast:Show(self.vb.blastCount)
|
||
|
|
specWarnShadowlavaBlast:Play("shockwave")
|
||
|
|
elseif spellId == 400777 then
|
||
|
|
self.vb.smashCount = self.vb.smashCount + 1
|
||
|
|
specWarnChargedSmash:Show(self.vb.smashCount)
|
||
|
3 years ago
|
specWarnChargedSmash:Play("helpsoak")
|
||
|
3 years ago
|
if self.vb.smashCount == 1 then
|
||
|
3 years ago
|
timerChargedSmashCD:Start(45.9, self.vb.smashCount+1)
|
||
|
3 years ago
|
end
|
||
|
3 years ago
|
elseif spellId == 407544 then--407544 cast start ID
|
||
|
3 years ago
|
self.vb.comboCount = self.vb.comboCount + 1
|
||
|
|
if self:IsTanking("player", "boss1", nil, true) then
|
||
|
3 years ago
|
specWarnFlamingSlash:Show()
|
||
|
|
specWarnFlamingSlash:Play("defensive")
|
||
|
3 years ago
|
else
|
||
|
|
--Other tank has this debuff already and it will NOT be gone when cast finishes, TAUNT NOW!
|
||
|
|
--This doesn't check TankSwapBehavior dropdown because this always validates that the player about to get hit by this, shouldn't be hit by it
|
||
|
|
if UnitExists("boss1target") and not UnitIsUnit("player", "boss1target") then
|
||
|
3 years ago
|
local _, _, _, _, _, expireTimeTarget = DBM:UnitDebuff("boss1target", 407547)
|
||
|
3 years ago
|
if (expireTimeTarget and expireTimeTarget-GetTime() >= 2) and self:AntiSpam(1, 1) then
|
||
|
3 years ago
|
specWarnFlamingSlashTaunt:Show(UnitName("boss1target"))
|
||
|
|
specWarnFlamingSlashTaunt:Play("tauntboss")
|
||
|
3 years ago
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
3 years ago
|
elseif spellId == 407596 then--407596 cast start ID
|
||
|
3 years ago
|
self.vb.comboCount = self.vb.comboCount + 1
|
||
|
|
if self:IsTanking("player", "boss1", nil, true) then
|
||
|
|
specWarnEarthenCrush:Show()
|
||
|
|
specWarnEarthenCrush:Play("defensive")
|
||
|
|
else
|
||
|
|
--Other tank has this debuff already and it will NOT be gone when cast finishes, TAUNT NOW!
|
||
|
|
--This doesn't check TankSwapBehavior dropdown because this always validates that the player about to get hit by this, shouldn't be hit by it
|
||
|
|
if UnitExists("boss1target") and not UnitIsUnit("player", "boss1target") then
|
||
|
3 years ago
|
local _, _, _, _, _, expireTimeTarget = DBM:UnitDebuff("boss1target", 407597)
|
||
|
3 years ago
|
if (expireTimeTarget and expireTimeTarget-GetTime() >= 2) and self:AntiSpam(1, 1) then
|
||
|
3 years ago
|
specWarnEarthenCrushTaunt:Show(UnitName("boss1target"))
|
||
|
|
specWarnEarthenCrushTaunt:Play("tauntboss")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
3 years ago
|
elseif spellId == 410070 then
|
||
|
|
self.vb.shadowflameCount = self.vb.shadowflameCount + 1
|
||
|
|
specWarnUnleashedShadowflame:Show(self.vb.shadowflameCount)
|
||
|
|
specWarnUnleashedShadowflame:Play("specialsoon")--Better voice?
|
||
|
3 years ago
|
--4.1, 45.9, 32.9
|
||
|
|
local timer = (self.vb.shadowflameCount == 1) and 45.9 or (self.vb.shadowflameCount == 2) and 32.9
|
||
|
3 years ago
|
if timer then
|
||
|
|
timerUnleashedShadowflameCD:Start(timer, self.vb.shadowflameCount+1)
|
||
|
|
end
|
||
|
3 years ago
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
||
|
|
local spellId = args.spellId
|
||
|
|
if spellId == 407641 then
|
||
|
3 years ago
|
self.vb.firstHitTank = ""
|
||
|
3 years ago
|
self.vb.tankCombo = self.vb.tankCombo + 1
|
||
|
|
self.vb.comboCount = 0
|
||
|
3 years ago
|
local timer = (self.vb.tankCombo == 1) and 14.9 or (self.vb.tankCombo == 2) and 32.9
|
||
|
|
if timer then
|
||
|
|
timerVolcanicComboCD:Start(timer, self.vb.tankCombo+1)
|
||
|
|
end
|
||
|
3 years ago
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:SPELL_AURA_APPLIED(args)
|
||
|
|
local spellId = args.spellId
|
||
|
3 years ago
|
if spellId == 405819 then--405819 confirmed on all difficulties
|
||
|
3 years ago
|
if args:IsPlayer() then
|
||
|
|
specWarnSearingSlam:Show()
|
||
|
|
specWarnSearingSlam:Play("targetyou")
|
||
|
|
yellSearingSlam:Yell()
|
||
|
|
yellSearingSlamFades:Countdown(spellId)
|
||
|
|
else
|
||
|
|
warnSearingSlam:Show(args.destName)
|
||
|
|
end
|
||
|
|
if self.Options.SetIconOnSearingSlam then
|
||
|
|
self:SetIcon(args.destName, 1)
|
||
|
|
end
|
||
|
|
elseif (spellId == 407597 or spellId == 407547) and not args:IsPlayer() then
|
||
|
|
local alertTaunt
|
||
|
3 years ago
|
if self.vb.comboCount == 1 then
|
||
|
|
self.vb.firstHitTank = args.destName
|
||
|
|
end
|
||
|
3 years ago
|
if self.Options.TankSwapBehavior == "OnlyIfDanger" then
|
||
|
|
--This means there are 0 preemtive taunts at all and you only taunt when a combo hit starts and it's not safe for the current target to take
|
||
|
|
--This uses minimum amount of taunts but poses greater risk of messup since it's reactiev only and not proactive
|
||
|
|
return
|
||
|
3 years ago
|
elseif self.Options.TankSwapBehavior == "DoubleSoak" and self.vb.comboCount == 2 and args.destName == self.vb.firstHitTank then
|
||
|
|
--This basically means the first tank took first 2 hits then 2nd tank taunts 3rd
|
||
|
3 years ago
|
alertTaunt = true
|
||
|
|
elseif self.Options.TankSwapBehavior == "MinMaxSoak" and self.vb.comboCount == 1 then
|
||
|
|
--Min Max soaking to spread combo across both tanks to mitigate having one tank eat all the damage
|
||
|
|
--Other tank got first part of combo, and you do NOT have debuff for next part of combo, make you taunt next part of combo so one tank doesn't get both debuffs
|
||
|
|
--This condition is mostly a "first combo" catch, where the SPELL_CAST_START checks would fail to assign the tanks automatically based on what they took in previous combo
|
||
|
|
local checkedSpellId
|
||
|
|
if spellId == 407597 then
|
||
|
|
checkedSpellId = 407547
|
||
|
|
else
|
||
|
|
checkedSpellId = 407597
|
||
|
|
end
|
||
|
|
if not DBM:UnitDebuff("player", checkedSpellId) then
|
||
|
|
alertTaunt = true
|
||
|
|
end
|
||
|
|
end
|
||
|
3 years ago
|
if alertTaunt and self:AntiSpam(1, 1) then
|
||
|
3 years ago
|
specWarnFlamingSlashTaunt:Show(args.destName)
|
||
|
|
specWarnFlamingSlashTaunt:Play("tauntboss")
|
||
|
3 years ago
|
end
|
||
|
|
elseif spellId == 401419 then
|
||
|
|
warnSiphonEnergyApplied:Show(args.destName)
|
||
|
|
timerSearingSlamCD:Stop()
|
||
|
|
timerChargedSmashCD:Stop()
|
||
|
|
timerVolcanicComboCD:Stop()
|
||
|
|
timerDoomFlameCD:Stop()
|
||
|
|
timerShadowlavaBlastCD:Stop()
|
||
|
|
timerAncientFuryCD:Stop()
|
||
|
3 years ago
|
timerUnleashedShadowflameCD:Stop()
|
||
|
|
elseif spellId == 405827 then
|
||
|
|
local amount = args.amount or 1
|
||
|
|
overchargedStacks[args.destName] = amount
|
||
|
|
if self.Options.InfoFrame then
|
||
|
|
DBM.InfoFrame:UpdateTable(overchargedStacks)
|
||
|
|
end
|
||
|
3 years ago
|
end
|
||
|
|
end
|
||
|
|
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
|
||
|
|
|
||
|
|
function mod:SPELL_AURA_REMOVED(args)
|
||
|
|
local spellId = args.spellId
|
||
|
3 years ago
|
if spellId == 405819 then
|
||
|
3 years ago
|
if args:IsPlayer() then
|
||
|
|
yellSearingSlamFades:Cancel()
|
||
|
|
end
|
||
|
|
if self.Options.SetIconOnSearingSlam then
|
||
|
|
self:SetIcon(args.destName, 0)
|
||
|
|
end
|
||
|
3 years ago
|
elseif spellId == 405827 then
|
||
|
|
overchargedStacks[args.destName] = nil
|
||
|
|
if self.Options.InfoFrame then
|
||
|
|
DBM.InfoFrame:UpdateTable(overchargedStacks)
|
||
|
|
end
|
||
|
3 years ago
|
elseif spellId == 401419 then
|
||
|
2 years ago
|
self:SetStage(0)--I don't nessesarily agree with this, but needed for WA compatability.
|
||
|
3 years ago
|
warnSiphonEnergyRemoved:Show(args.destName)
|
||
|
|
self.vb.slamCount = 0
|
||
|
|
self.vb.doomCount = 0
|
||
|
|
self.vb.blastCount = 0
|
||
|
|
self.vb.smashCount = 0
|
||
|
|
self.vb.tankCombo = 0
|
||
|
|
self.vb.comboCount = 0
|
||
|
3 years ago
|
self.vb.shadowflameCount = 0
|
||
|
|
if self:IsMythic() then
|
||
|
|
timerUnleashedShadowflameCD:Start(6.2, 1)
|
||
|
|
end
|
||
|
|
timerSearingSlamCD:Start(11.2, 1)
|
||
|
|
timerChargedSmashCD:Start(23.2, 1)
|
||
|
|
timerVolcanicComboCD:Start(31.2, 1)
|
||
|
|
timerDoomFlameCD:Start(41.2, 1)
|
||
|
3 years ago
|
timerShadowlavaBlastCD:Start(97, 1)
|
||
|
3 years ago
|
timerAncientFuryCD:Start(102)
|
||
|
3 years ago
|
elseif spellId == 405091 then
|
||
|
|
warnUnyieldingRage:Show()
|
||
|
3 years ago
|
end
|
||
|
|
end
|
||
|
|
|
||
|
3 years ago
|
function mod:SPELL_AURA_REMOVED_DOSE(args)
|
||
|
|
local spellId = args.spellId
|
||
|
|
if spellId == 405827 then
|
||
|
|
overchargedStacks[args.destName] = args.amount or 1
|
||
|
|
if self.Options.InfoFrame then
|
||
|
|
DBM.InfoFrame:UpdateTable(overchargedStacks)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
3 years ago
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
||
|
3 years ago
|
if spellId == 403543 and destGUID == UnitGUID("player") and self:AntiSpam(3, 2) and not DBM:UnitDebuff("player", 405819) then
|
||
|
3 years ago
|
specWarnGTFO:Show(spellName)
|
||
|
|
specWarnGTFO:Play("watchfeet")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
|
||
|
|
|
||
|
3 years ago
|
function mod:SPELL_ENERGIZE(_, _, _, _, destGUID, _, _, _, spellId, _, _, amount)
|
||
|
|
if spellId == 405825 and destGUID == UnitGUID("boss1") then
|
||
|
|
DBM:Debug("SPELL_ENERGIZE fired on Boss. Amount: "..amount)
|
||
|
|
local bossPower = UnitPower("boss1")
|
||
|
|
-- bossPower = bossPower / 1--1 energy per second, making it every ~100 seconds
|
||
|
|
local remaining = 100-bossPower
|
||
|
|
if remaining > 0 then
|
||
|
|
local elapsedTimer = 100-remaining
|
||
|
|
timerAncientFuryCD:Update(elapsedTimer, 100)
|
||
|
|
else
|
||
|
|
timerAncientFuryCD:Stop()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|