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.

266 lines
12 KiB

local creatureID
local addAOESpellId, addDebuffSpellId, tankSpellId, shockwaveSpellId, rallySpellId, crySpellId
if UnitFactionGroup("player") == "Alliance" then--TODO, might have to change this to check party leader not player, due to cross faction groups.
creatureID = 203679--Anduin Lothar
addAOESpellId, addDebuffSpellId, tankSpellId, shockwaveSpellId, rallySpellId, crySpellId = 417018, 417030, 418059, 418054, 418047, 418062
else--Horde
creatureID = 203678--Grommash Hellscream
addAOESpellId, addDebuffSpellId, tankSpellId, shockwaveSpellId, rallySpellId, crySpellId = 407122, 407121, 410254, 408227, 418046, 410496
end
local mod = DBM:NewMod(2533, "DBM-Party-Dragonflight", 9, 1209)--Alliance ID used, horde is 2534
local L = mod:GetLocalizedStrings()
mod.statTypes = "normal,heroic,mythic,challenge"--No Follower dungeon
mod:SetRevision("20240714045506")
mod:SetCreatureID(creatureID)
mod:SetEncounterID(2672)
--mod:SetUsedIcons(1, 2, 3)
mod:SetHotfixNoticeRev(20231102000000)
mod:SetMinSyncRevision(20231102000000)
--mod.respawnTime = 29
mod.sendMainBossGUID = true
mod:RegisterCombat("combat")
mod:RegisterEvents(
"SPELL_CAST_SUCCESS 418054 408227 419602 419609"--418062 410496
)
mod:RegisterEventsInCombat(
"SPELL_CAST_START 417018 407122 410234 418059 410254 418056 408228 418047 418046",
"SPELL_AURA_APPLIED 417030 407121",
-- "SPELL_AURA_APPLIED_DOSE",
-- "SPELL_AURA_REMOVED",
"SPELL_DAMAGE 418052 410496",
"SPELL_MISSED 418052 410496",
"UNIT_DIED"
-- "UNIT_SPELLCAST_SUCCEEDED boss1"
)
--[[
(ability.id = 417018 or ability.id = 407122 or ability.id = 410234 or ability.id = 418059 or ability.id = 410254 or ability.id = 418056 or ability.id = 408228 or ability.id = 418047 or ability.id = 418046) and type = "begincast"
or (ability.id = 418062 or ability.id = 410496 or ability.id = 418054 or ability.id = 408227) and type = "cast"
or type = "dungeonencounterstart" or type = "dungeonencounterend"
or (ability.id = 418052 or ability.id = 410496)
or (ability.id = 417030 or ability.id = 407121 or ability.id = 407122 or ability.id = 410234) and type = "begincast"
--]]
--NOTE: Serrated and fireball abilities are spammed, so no timer or alert
--TODO, Blizzard decided to remove Cry from combat log on live because, reasons. Now we have to parse all damage on fight to see CD
--TODO, GTFO for add aoe? Logs I had nobody took damage from it so couldn't do yet
--TODO, targetscan/detect bladestorm target?
--The Infinite Battlefield
mod:AddTimerLine(DBM:EJ_GetSectionInfo(26514))
local warnAddAoE = mod:NewSpellAnnounce(addAOESpellId, 3)
local warnAddDebuff = mod:NewTargetNoFilterAnnounce(addDebuffSpellId, 3, nil, false)
--local specWarnManaBomb = mod:NewSpecialWarningMoveAway(386181, nil, nil, nil, 1, 2)
--local yellManaBomb = mod:NewYell(386181)
--local yellManaBombFades = mod:NewShortFadesYell(386181)
--local specWarnGTFO = mod:NewSpecialWarningGTFO(386201, nil, nil, nil, 1, 8)
local timerAddAoECD = mod:NewCDNPTimer(12.1, addAOESpellId, nil, nil, nil, 3)
--mod:AddInfoFrameOption(391977, true)
--Boss (Anduin Lothar / Grommash Hellscream
mod:AddTimerLine(DBM_COMMON_L.BOSS)
local warnBladestorm = mod:NewCountAnnounce(410235, 3, nil, nil, nil, nil, nil, 2)
local warnRally = mod:NewCountAnnounce(rallySpellId, 2)
local warnCry = mod:NewCountAnnounce(crySpellId, 2)
local warnShockwave = mod:NewCountAnnounce(shockwaveSpellId, 3)--2nd and 3rd cast
local specWarnBladestorm = mod:NewSpecialWarningDodgeCount(410235, "Melee", nil, nil, 2, 2)
local specWarnTankBuster = mod:NewSpecialWarningDefensive(tankSpellId, nil, nil, nil, 1, 2)
local specWarnShockwave = mod:NewSpecialWarningDodgeCount(shockwaveSpellId, nil, nil, nil, 2, 2)--First cast in set
local timerRP = mod:NewRPTimer(8)
local timerBladestormCD = mod:NewCDCountTimer(35.1, 410235, nil, nil, nil, 3)
local timerTankBusterCD = mod:NewCDCountTimer(19.6, tankSpellId, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)
local timerShockwaveCD = mod:NewCDCountTimer(35.1, shockwaveSpellId, nil, nil, nil, 3)
local timerRallyCD = mod:NewCDCountTimer(20.8, rallySpellId, nil, nil, nil, 5)--For the X
local timerCryCD = mod:NewCDCountTimer(10, crySpellId, nil, nil, nil, 2)
--Write the custom WA keys into the spell headers
mod:JustSetCustomKeys(rallySpellId, L.customWAMessage:format(418047, 418046))
mod:JustSetCustomKeys(crySpellId, L.customWAMessage:format(418062, 410496))
mod:JustSetCustomKeys(shockwaveSpellId, L.customWAMessage:format(418054, 408227))
mod:JustSetCustomKeys(tankSpellId, L.customWAMessage:format(418059, 410254))
mod.vb.bladestormCount = 0
mod.vb.shockwaveSet = 0
mod.vb.shockwaveCount = 0
mod.vb.tankBusterCount = 0
mod.vb.rallyCount = 0
mod.vb.cryCount = 0
local function checkWhichBoss(self)
local cid = self:GetUnitCreatureId("boss1")
if cid then
--Only do swaps if they differ from last check or load
if cid ~= creatureID then--cid mismatch, correct it on engage
creatureID = cid
self:SetCreatureID(cid)
--This hot swaps the Ids without changing option key, which is always tied to own faction
--This ensures objects return the faction Ids for what you're fighting, (which is tied to group leader and not your own faction)
--This also ensures LW parity for option keys/weak auras
if cid == 203679 then--Anduin Lothar
addAOESpellId, addDebuffSpellId, tankSpellId, shockwaveSpellId, rallySpellId, crySpellId = 417018, 417030, 418059, 418054, 418047, 418062
else--Grommash Hellscream
addAOESpellId, addDebuffSpellId, tankSpellId, shockwaveSpellId, rallySpellId, crySpellId = 407122, 407121, 410254, 408227, 418046, 410496
end
warnRally:UpdateKey(rallySpellId)
warnCry:UpdateKey(crySpellId)
warnShockwave:UpdateKey(shockwaveSpellId)
warnAddAoE:UpdateKey(addAOESpellId)
warnAddDebuff:UpdateKey(addDebuffSpellId)
specWarnTankBuster:UpdateKey(tankSpellId)
specWarnShockwave:UpdateKey(shockwaveSpellId)
timerTankBusterCD:UpdateKey(tankSpellId, 1)
timerShockwaveCD:UpdateKey(shockwaveSpellId, 1)
timerRallyCD:UpdateKey(rallySpellId, 1)
timerCryCD:UpdateKey(crySpellId, 1)
timerAddAoECD:UpdateKey(addAOESpellId)
end
end
end
--Shockwave triggers 10.2 ICD on everything
--Bladestorm triggers a 12.1 ICD only on tank buster (even if no other abilities are in between), it triggers 8.5 on Rally ability
--Cry is unaffected by ICDs, it's off GCD and just always every 10 sec
local function updateAllTimers(self, ICD, isBladeStorm)
DBM:Debug("updateAllTimers running", 3)
if timerTankBusterCD:GetRemaining(self.vb.tankBusterCount+1) < (isBladeStorm and 12.1 or ICD) then
local elapsed, total = timerTankBusterCD:GetTime(self.vb.tankBusterCount+1)
local extend = ICD - (total-elapsed)
DBM:Debug("timerTankBusterCD extended by: "..extend, 2)
timerTankBusterCD:Update(elapsed, total+extend, self.vb.tankBusterCount+1)
end
if timerRallyCD:GetRemaining(self.vb.rallyCount+1) < ICD then
local elapsed, total = timerRallyCD:GetTime(self.vb.rallyCount+1)
local extend = ICD - (total-elapsed)
DBM:Debug("timerRallyCD extended by: "..extend, 2)
timerRallyCD:Update(elapsed, total+extend, self.vb.rallyCount+1)
end
--Needs more data, but unlikely any spell as higher spell queue priority than bladestorm so I don't think it applies
-- if timerBladestormCD:GetRemaining(self.vb.bladestormCount+1) < ICD then
-- local elapsed, total = timerBladestormCD:GetTime(self.vb.bladestormCount+1)
-- local extend = ICD - (total-elapsed)
-- DBM:Debug("timerBladestormCD extended by: "..extend, 2)
-- timerBladestormCD:Update(elapsed, total+extend, self.vb.bladestormCount+1)
-- end
--Needs more data, but hasn't been witnessed
-- if timerShockwaveCD:GetRemaining(self.vb.shockwaveSet+1) < ICD then
-- local elapsed, total = timerShockwaveCD:GetTime(self.vb.shockwaveSet+1)
-- local extend = ICD - (total-elapsed)
-- DBM:Debug("timerShockwaveCD extended by: "..extend, 2)
-- timerShockwaveCD:Update(elapsed, total+extend, self.vb.shockwaveSet+1)
-- end
end
function mod:OnCombatStart(delay)
self.vb.bladestormCount = 0
self.vb.shockwaveSet = 0
self.vb.shockwaveCount = 0
self.vb.tankBusterCount = 0
self.vb.rallyCount = 0
self.vb.cryCount = 0
timerTankBusterCD:Start(6-delay, 1)--Mortal Strikes/Decapitate
timerShockwaveCD:Start(9.4-delay, 1)--Shockwave
timerCryCD:Start(10.3-delay, 1)--Battle Cry/War Cry
timerRallyCD:Start(19.9-delay, 1)--For the alliance/horde
timerBladestormCD:Start(21.5-delay, 1)
self:Schedule(1.5, checkWhichBoss, self)
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 417018 or spellId == 407122 then--Blizzard / Rain of Fire
warnAddAoE:Show()
timerAddAoECD:Start(nil, args.sourceGUID)
elseif spellId == 410234 then--Same spell in both
self.vb.bladestormCount = self.vb.bladestormCount + 1
if self.Options.SpecWarn410234dodgecount then
specWarnBladestorm:Show(self.vb.bladestormCount)
specWarnBladestorm:Play("whirlwind")
else
warnBladestorm:Show(self.vb.bladestormCount)
warnBladestorm:Play("whirlwind")
end
timerBladestormCD:Start(nil, self.vb.bladestormCount+1)
updateAllTimers(self, 8.5, true)
elseif spellId == 418059 or spellId == 410254 then--Mortal Strikes / Decapitate
self.vb.tankBusterCount = self.vb.tankBusterCount + 1
if self:IsTanking("player", "boss1", nil, true) then
specWarnTankBuster:Show()
specWarnTankBuster:Play("defensive")
end
timerTankBusterCD:Start(nil, self.vb.tankBusterCount+1)
elseif spellId == 418056 or spellId == 408228 then--Shockwave / Shockwave (formerly Death Wish)
self.vb.shockwaveCount = self.vb.shockwaveCount + 1
if self.vb.shockwaveCount == 1 then
self.vb.shockwaveSet = self.vb.shockwaveSet + 1
specWarnShockwave:Show(self.vb.shockwaveSet)
specWarnShockwave:Play("shockwave")
else
warnShockwave:Show(self.vb.shockwaveSet)
if self.vb.shockwaveCount == 3 then
--Timer moved to other event
-- timerShockwaveCD:Start(nil, self.vb.shockwaveSet+1)
self.vb.shockwaveCount = 0
end
end
elseif spellId == 418047 or spellId == 418046 then--For the alliance, for the horde
self.vb.rallyCount = self.vb.rallyCount + 1
warnRally:Show(self.vb.rallyCount)
timerRallyCD:Start(nil, self.vb.rallyCount+1)
end
end
--"<271.38 19:13:43> [CLEU] SPELL_AURA_APPLIED#Creature-0-4225-2579-2224-203679-0000344AB7#Anduin Lothar#Creature-0-4225-2579-2224-203679-0000344AB7#Anduin Lothar#419609#Battle Senses#BUFF#nil", -- [1659]
--"<271.38 19:13:43> [CLEU] SPELL_CAST_SUCCESS#Creature-0-4225-2579-2224-203679-0000344AB7#Anduin Lothar##nil#419609#Battle Senses#nil#nil", -- [1660]
--"<277.32 19:13:49> [ENCOUNTER_START] 2672#Time-Lost Battlefield#8#5", -- [1690]
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 419602 or spellId == 419609 then
timerRP:Start(6)
elseif spellId == 418054 or spellId == 408227 then
--Timer now started here now that it's being used as an update timer method earlier
timerShockwaveCD:Start(nil, self.vb.shockwaveSet+1)
updateAllTimers(self, 10.2, false)
-- elseif spellId == 418062 or spellId == 410496 then--Battle Cry, War Cry
-- self.vb.cryCount = self.vb.cryCount + 1
-- warnCry:Show(self.vb.cryCount)
-- timerCryCD:Start(nil, self.vb.cryCount+1)
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 417030 or spellId == 407121 then--Fireball / Immolate
warnAddDebuff:Show(args.destName)
end
end
function mod:SPELL_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if (spellId == 418052 or spellId == 410496) and self:AntiSpam(5, 1) then--BattleCry Buff, Warcry Buff
self.vb.cryCount = self.vb.cryCount + 1
warnCry:Show(self.vb.cryCount)
timerCryCD:Start(nil, self.vb.cryCount+1)
-- elseif spellId == 386201 and destGUID == UnitGUID("player") and self:AntiSpam(3, 2) then
-- specWarnGTFO:Show(spellName)
-- specWarnGTFO:Play("watchfeet")
end
end
mod.SPELL_MISSED = mod.SPELL_DAMAGE
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 206351 or cid == 203857 then--Alliance Conjuror / Horde Warlock
timerAddAoECD:Stop(args.destGUID)
-- elseif cid == 206352 or cid == 203799 then--Alliance Archer/Horde Axe Thrower
end
end