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