local mod = DBM:NewMod(1655, "DBM-Party-Legion", 2, 762) local L = mod:GetLocalizedStrings() mod:SetRevision("20240714045506") mod:SetCreatureID(103344) mod:SetEncounterID(1837) mod:SetHotfixNoticeRev(20240329000000) mod:SetMinSyncRevision(20231029000000) --mod.respawnTime = 29 mod.sendMainBossGUID = true mod:RegisterCombat("combat") mod:RegisterEventsInCombat( "SPELL_CAST_START 204666 204646 204574 204667 204611 212786" ) --[[ (ability.id = 204666 or ability.id = 204574 or ability.id = 204667 or ability.id = 204611 or ability.id = 212786) and type = "begincast" or type = "dungeonencounterstart" or type = "dungeonencounterend" or ability.id = 204646 and type = "begincast" --]] --NOTE: this boss has some serious spell queuing issues that causes wild variation in timers and ability orders --As such, it will use aggressive on the fly timer correction that may feel jarring to users that don't recognize it's happening til they realize it is and why local warnShatteredEarth = mod:NewCountAnnounce(204666, 2) local warnThrowTarget = mod:NewTargetNoFilterAnnounce(204658, 2)--This is target the tank is THROWN at. local warnUproot = mod:NewCountAnnounce(212786, 2) local specWarnRoots = mod:NewSpecialWarningDodgeCount(204574, nil, nil, nil, 2, 2) local yellThrow = mod:NewYell(204658, 2764)--yell so others can avoid splash damage. I don't think target can avoid local specWarnBreath = mod:NewSpecialWarningDodgeCount(204667, nil, nil, nil, 2, 2) local timerShatteredEarthCD = mod:NewCDCountTimer(31.6, 204666, nil, nil, nil, 2)--34-60 (basically same as OG) local timerCrushingGripCD = mod:NewCDCountTimer(27.9, 204611, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON, nil, mod:IsTank() and 2 or nil, 4)--27.9-36 (basically same as OG) local timerRootsCD = mod:NewCDCountTimer(18.2, 204574, nil, nil, nil, 3)--18.2-35.1 (basically same as OG) local timerBreathCD = mod:NewCDCountTimer(26.5, 204667, nil, nil, nil, 5)--26-35 (basically same as OG) local timerUprootCD = mod:NewCDCountTimer(32.4, 212786, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)--32.7-37.6 (Probably also OG timer, but didn't have it in OG mod) mod.vb.shatteredCount = 0 mod.vb.crushingCount = 0 mod.vb.rootsCount = 0 mod.vb.breathCount = 0 mod.vb.uprootCount = 0 --Nightmare Breath triggers 7.2 iCD (formerly 9.7) (except on roots it's 3) --Crushing Grip triggers 6 ICD (well technically it triggers 1, and second Id triggers 5 more) --Uproot triggers 3.6 ICD --Strangling Roots triggers 2.4 ICD --Shattering Earth triggers 7.2 ICD (except on roots it's 3) --Shattering Roots itself is unaffected by ICDs of other spells local function updateAllTimers(self, ICD, special) DBM:Debug("updateAllTimers running", 3) if timerShatteredEarthCD:GetRemaining(self.vb.shatteredCount+1) < ICD then local elapsed, total = timerShatteredEarthCD:GetTime(self.vb.shatteredCount+1) local extend = ICD - (total-elapsed) DBM:Debug("timerShatteredEarthCD extended by: "..extend, 2) timerShatteredEarthCD:Update(elapsed, total+extend, self.vb.shatteredCount+1) end if timerCrushingGripCD:GetRemaining(self.vb.crushingCount+1) < ICD then local elapsed, total = timerCrushingGripCD:GetTime(self.vb.crushingCount+1) local extend = ICD - (total-elapsed) DBM:Debug("timerCrushingGripCD extended by: "..extend, 2) timerCrushingGripCD:Update(elapsed, total+extend, self.vb.crushingCount+1) end --Roots is 2.4 IDC except when it's crushing grip then it's doubled to 4.8 if special or (ICD == 6 and (timerRootsCD:GetRemaining(self.vb.rootsCount+1) < 4.8)) then local elapsed, total = timerRootsCD:GetTime(self.vb.rootsCount+1) local extend = special and 2.4 or 4.8 - (total-elapsed) DBM:Debug("timerRootsCD extended by: "..extend, 2) timerRootsCD:Update(elapsed, total+extend, self.vb.rootsCount+1) end if timerBreathCD:GetRemaining(self.vb.breathCount+1) < ICD then local elapsed, total = timerBreathCD:GetTime(self.vb.breathCount+1) local extend = ICD - (total-elapsed) DBM:Debug("timerBreathCD extended by: "..extend, 2) timerBreathCD:Update(elapsed, total+extend, self.vb.breathCount+1) end if timerUprootCD:GetRemaining(self.vb.uprootCount+1) < (special and 3 or ICD) then local elapsed, total = timerUprootCD:GetTime(self.vb.uprootCount+1) local extend = (special and 3 or ICD) - (total-elapsed) DBM:Debug("timerUprootCD extended by: "..extend, 2) timerUprootCD:Update(elapsed, total+extend, self.vb.uprootCount+1) end end --AKA Crushing Grip secondary mechanic function mod:ThrowTarget(targetname, uId) if not targetname then return end warnThrowTarget:Show(targetname) if targetname == UnitName("player") then --Can this be dodged? personal warning? yellThrow:Yell() end end function mod:OnCombatStart(delay) self.vb.shatteredCount = 0 self.vb.crushingCount = 0 self.vb.rootsCount = 0 self.vb.breathCount = 0 self.vb.uprootCount = 0 timerShatteredEarthCD:Start(7.1-delay, 1)--7.1, 8.1, 8.5 timerRootsCD:Start(10.1-delay, 1)--12.2, 15.8, 12.2, 12.9 timerBreathCD:Start(self:IsMythicPlus() and 22.7 or 18.2-delay, 1)--18.2--23 but it's SUPER SUPER rarely under 22.7 that it's better to be rare super wrong than rarely right with 18 --Uproot and Crushing can swap places pull to pull then stay that way rest of fight timerCrushingGripCD:Start(27.9-delay, 1)--27.9, 34, 34.8 (34 if it's after uproot) timerUprootCD:Start(30.4-delay, 1)--31.1, 30.4, 34 (30-31 if it's first) end function mod:SPELL_CAST_START(args) local spellId = args.spellId if spellId == 204646 then--Secondary cast of Crushing Grip self:BossTargetScanner(103344, "ThrowTarget", 0.1, 12, true, nil, nil, nil, true)--Filters tank, elseif spellId == 204666 then self.vb.shatteredCount = self.vb.shatteredCount + 1 warnShatteredEarth:Show(self.vb.shatteredCount) --35.2, 44.9 / 51.8, 36.3 / 52.2, 60.7 timerShatteredEarthCD:Start(nil, self.vb.shatteredCount+1) updateAllTimers(self, 7.2, true) elseif spellId == 204574 then self.vb.rootsCount = self.vb.rootsCount + 1 specWarnRoots:Show(self.vb.rootsCount) specWarnRoots:Play("watchstep") --25.5, 29.1, 35.1 / 28.7, 32.7, 27.9, 23 / 27.9, 32.7, 31.6, 27.9 timerRootsCD:Start(nil, self.vb.rootsCount+1) updateAllTimers(self, 2.4) elseif spellId == 204667 then self.vb.breathCount = self.vb.breathCount + 1 specWarnBreath:Show(self.vb.breathCount) specWarnBreath:Play("breathsoon") --32.7, 27.9 / 29.1, 32.7, 36.4 / 29.1, 32.8, 27.9 timerBreathCD:Start(nil, self.vb.breathCount+1) updateAllTimers(self, 7.2, true) elseif spellId == 204611 then--Primary Crushnig Grip Cast self.vb.crushingCount = self.vb.crushingCount + 1 --32.7, 35.1 / 33.5, 36.4 / 32.7, 27.9, 32.7 timerCrushingGripCD:Start(nil, self.vb.crushingCount+1) updateAllTimers(self, 6) elseif spellId == 212786 then self.vb.uprootCount = self.vb.uprootCount + 1 warnUproot:Show(self.vb.uprootCount) --32.7, 35.1 / 33.5, 34.5 / 32.7, 37.6, 33.9 timerUprootCD:Start(nil, self.vb.uprootCount+1) updateAllTimers(self, 3.6) end end