local mod = DBM:NewMod(2530, "DBM-Aberrus", nil, 1208) local L = mod:GetLocalizedStrings() mod:SetRevision("20230706053014") mod:SetCreatureID(200912, 200913, 200918) mod:SetEncounterID(2693) mod:SetUsedIcons(1, 2, 3) mod:SetBossHPInfoToHighest() mod:SetHotfixNoticeRev(20230619000000) mod:SetMinSyncRevision(20230512000000) --mod.respawnTime = 29 mod:RegisterCombat("combat") mod:SetWipeTime(25) mod:RegisterEventsInCombat( "SPELL_CAST_START 406358 404472 407733 404713 405042 405492 405375 406227 407552 405391 407775 412117", "SPELL_AURA_APPLIED 406313 407302 407327 407617 405392", "SPELL_AURA_APPLIED_DOSE 406313 407302 407327", "SPELL_AURA_REMOVED 407327", "UNIT_DIED", "INSTANCE_ENCOUNTER_ENGAGE_UNIT", "UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3" ) --[[ (ability.id = 412117 or ability.id = 406358 or ability.id = 407733 or ability.id = 404472 or ability.id = 404713 or ability.id = 405042 or ability.id = 405492 or ability.id = 407775 or ability.id = 405375 or ability.id = 406227 or ability.id = 407552 or ability.id = 405391) and type = "begincast" or (source.type = "NPC" and source.firstSeen = timestamp) and (source.id = 200912 or source.id = 200913 or source.id = 200918) or (target.type = "NPC" and target.firstSeen = timestamp) and (target.id = 200912 or target.id = 200913 or target.id = 200918) --]] --TODO, what do you actually do with Temporal Anomaly, soak it? --NOTE, Rending Charge is a private aura --General --local specWarnGTFO = mod:NewSpecialWarningGTFO(370648, nil, nil, nil, 1, 8) local timerInfusedStrikes = mod:NewBuffFadesTimer(20, 407302, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON..DBM_COMMON_L.HEALER_ICON)--Track the aura that needs to fall off before tanks "clear" again --local berserkTimer = mod:NewBerserkTimer(600) --Neldris mod:AddTimerLine(DBM:EJ_GetSectionInfo(26001)) local warnInfusedStrikes = mod:NewStackAnnounce(406311, 2, nil, "Tank|Healer") local warnRendingCharge = mod:NewIncomingCountAnnounce(406358, 3) local specWarnMassiveSlam = mod:NewSpecialWarningDodgeCount(404472, nil, nil, nil, 2, 2) local specWarnBellowingRoar = mod:NewSpecialWarningCount(404713, nil, nil, nil, 2, 2) local timerRendingChargeCD = mod:NewCDCountTimer(34.2, 406358, nil, nil, nil, 3, nil, DBM_COMMON_L.BLEED_ICON) local timerMassiveSlamCD = mod:NewCDCountTimer(39, 404472, nil, nil, nil, 3) local timerBellowingRoarCD = mod:NewCDCountTimer(23.1, 404713, nil, nil, nil, 2) mod:AddPrivateAuraSoundOption(406317, true, 406358, 1) --Thadrion mod:AddTimerLine(DBM:EJ_GetSectionInfo(26322)) local warnUnstableEssence = mod:NewCastAnnounce(407327, 3) local warnUnstableEssenceTargets = mod:NewTargetAnnounce(407327, 2) local specWarnUnstableEssence = mod:NewSpecialWarningYou(407327, nil, nil, nil, 1, 2) local yellUnstableEssence = mod:NewShortYell(407327, DBM_CORE_L.AUTO_YELL_ANNOUNCE_TEXT.shortyell) local specWarnVolatileSpew = mod:NewSpecialWarningDodgeCount(405492, nil, nil, nil, 2, 2) local specWarnViolentEruption = mod:NewSpecialWarningCount(405375, nil, nil, nil, 2, 2) local timerUnstableEssenceCD = mod:NewCDCountTimer(29.2, 407327, nil, nil, nil, 3, nil, DBM_COMMON_L.MAGIC_ICON) local timerVolatileSpewCD = mod:NewCDCountTimer(26, 405492, nil, nil, nil, 3) local timerViolentEruptionCD = mod:NewCDCountTimer(68.3, 405375, nil, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON) mod:AddSetIconOption("SetIconOnEssence", 407327, false, 0, {1, 2, 3, 4, 5, 6, 7, 8}) --Rionthus mod:AddTimerLine(DBM:EJ_GetSectionInfo(26329)) local warnTemporalAnomaly = mod:NewCastAnnounce(407552, 3) local warnTemporalAnomalyAbsorbed = mod:NewTargetNoFilterAnnounce(407552, 2) local warnDisintegrate = mod:NewTargetAnnounce(405392, 2) local specWarnDeepBreath = mod:NewSpecialWarningDodgeCount(406227, nil, 18357, nil, 2, 2) local specWarnDisintegrate = mod:NewSpecialWarningMoveAway(405392, nil, nil, nil, 1, 2) local yellDisintegrate = mod:NewShortYell(405392) local timerDeepBreathCD = mod:NewCDCountTimer(42.7, 406227, 18357, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON)--"Breath" local timerTemporalAnomalyCD = mod:NewCDCountTimer(43.7, 407552, nil, nil, nil, 5) local timerDisintegrateCD = mod:NewCDCountTimer(43.7, 405392, nil, nil, nil, 3) mod.vb.rendingCount = 0 mod.vb.massiveSlamCount = 0 mod.vb.roarCount = 0 mod.vb.essenceCount = 0 mod.vb.volatileSpewCount = 0 mod.vb.eruptionCount = 0 mod.vb.breathCount = 0 mod.vb.disintegrateCount = 0 mod.vb.anomalyCount = 0 local essenceMarks = {} local bossActive = {} local allTimers = { --Volatile Spew [405492] = {5.6, 21.8, 36.4, 30.3, 30, 30.4, 33.2, 31.1, 35.2, 30.4},--Confirmed up to 5th cast --Unstable Essence [405042] = {16.5, 37.6, 27.5, 35.2, 27.9, 38, 27.5, 38.9, 28}, } function mod:OnCombatStart(delay) self:SetStage(1) table.wipe(bossActive) --Neldris self.vb.rendingCount = 0 self.vb.massiveSlamCount = 0 self.vb.roarCount = 0 if self:IsMythic() then timerBellowingRoarCD:Start(6-delay, 1) timerRendingChargeCD:Start(14-delay, 1) timerMassiveSlamCD:Start(24-delay, 1) else timerBellowingRoarCD:Start(10.9-delay, 1) timerRendingChargeCD:Start(19.4-delay, 1) timerMassiveSlamCD:Start(35.2-delay, 1) end --Thadrion table.wipe(essenceMarks) self.vb.essenceCount = 0 self.vb.volatileSpewCount = 0 self.vb.eruptionCount = 0 --Rionthus self.vb.breathCount = 0 self.vb.disintegrateCount = 0 self.vb.anomalyCount = 0 self:EnablePrivateAuraSound(406317, "targetyou", 2)--Rending Charge end function mod:SPELL_CAST_START(args) local spellId = args.spellId if spellId == 406358 then self.vb.rendingCount = self.vb.rendingCount + 1 warnRendingCharge:Show(self.vb.rendingCount) local timer if self:IsMythic() then --14, 37, 18, 37, 18 if self.vb.rendingCount % 2 == 0 then timer = 18 else timer = 37 end else timer = self.vb.rendingCount == 1 and 33.7 or 38.2 end timerRendingChargeCD:Start(timer, self.vb.rendingCount+1) elseif spellId == 407733 or spellId == 404472 or spellId == 412117 then--2nd and later casts, first cast self.vb.massiveSlamCount = self.vb.massiveSlamCount + 1 specWarnMassiveSlam:Show(self.vb.massiveSlamCount) specWarnMassiveSlam:Play("shockwave") local timer if self:IsMythic() then --Mythic only uses 407733 and instead is simple alternation --24, 17.9, 37, 18, 36.9 --Doesn't need energy calculation, it's always same rotation since it's engage boss if self.vb.massiveSlamCount % 2 == 0 then timer = 36.9 else timer = 17.9 end else --Every slam is two slams, where first one is 404472 or 412117 and secondary slam 9.7 seconds later is 407733 --so if ID not secondary cast, start 9.7 timer, else start long timer for next set of two timer = spellId == 407733 and 29.1 or 9.7 end timerMassiveSlamCD:Start(timer, self.vb.massiveSlamCount+1) elseif spellId == 404713 then self.vb.roarCount = self.vb.roarCount + 1 specWarnBellowingRoar:Show(self.vb.roarCount) specWarnBellowingRoar:Play("carefly") local timer if self:IsMythic() then --Doesn't need energy calculation, it's always same rotation since it's engage boss if self.vb.roarCount % 2 == 0 then timer = 25 else timer = 30 end else timer = self.vb.roarCount == 1 and 57.1 or 38.9 end timerBellowingRoarCD:Start(timer, self.vb.roarCount+1) elseif spellId == 405042 then self.vb.essenceCount = self.vb.essenceCount + 1 warnUnstableEssence:Show(self.vb.essenceCount) local timer if self:IsMythic() then local unit = self:GetUnitIdFromGUID(args.sourceGUID) if UnitPower(unit) < 30 then--It's 7 energy cast timer = 20.9 else--It's 55 Energy cast, so next one will be after full rotationof ultimate timer = 33.9 end else timer = self:GetFromTimersTable(allTimers, false, false, spellId, self.vb.essenceCount+1) or 27.5 end timerUnstableEssenceCD:Start(timer, self.vb.essenceCount+1) elseif spellId == 405492 then self.vb.volatileSpewCount = self.vb.volatileSpewCount + 1 specWarnVolatileSpew:Show(self.vb.volatileSpewCount) specWarnVolatileSpew:Play("watchstep") local timer if self:IsMythic() then local unit = self:GetUnitIdFromGUID(args.sourceGUID) if UnitPower(unit) < 50 then--It's 30 energy cast timer = 19.9 else--It's 75 Energy cast, so next one will be after full rotationof ultimate timer = 34.9 end else timer = self:GetFromTimersTable(allTimers, false, false, spellId, self.vb.volatileSpewCount+1) or 30.3 end timerVolatileSpewCD:Start(timer, self.vb.volatileSpewCount+1) elseif spellId == 405375 or spellId == 407775 then self.vb.eruptionCount = self.vb.eruptionCount + 1 specWarnViolentEruption:Show(self.vb.eruptionCount) specWarnViolentEruption:Play("aesoon") timerViolentEruptionCD:Start(self:IsMythic() and 54.9 or 66, self.vb.eruptionCount+1) elseif spellId == 406227 and self:AntiSpam(5, 2) then self.vb.breathCount = self.vb.breathCount + 1 specWarnDeepBreath:Show(self.vb.breathCount) specWarnDeepBreath:Play("breathsoon") timerDeepBreathCD:Start(self:IsMythic() and 55 or 43.7, self.vb.breathCount+1) elseif spellId == 407552 then self.vb.anomalyCount = self.vb.anomalyCount + 1 warnTemporalAnomaly:Show(self.vb.anomalyCount) timerTemporalAnomalyCD:Start(self:IsMythic() and 55 or 43.7, self.vb.anomalyCount+1) elseif spellId == 405391 then self.vb.disintegrateCount = self.vb.disintegrateCount + 1 timerDisintegrateCD:Start(self:IsMythic() and 55 or 43.3, self.vb.disintegrateCount+1) end end function mod:SPELL_AURA_APPLIED(args) local spellId = args.spellId if spellId == 406313 and not args:IsPlayer() then local amount = args.amount or 1 if amount % 3 == 0 then--Guessed, Filler warnInfusedStrikes:Show(args.destName, amount) end elseif spellId == 407302 and self:AntiSpam(3, 1) then timerInfusedStrikes:Restart() elseif spellId == 407327 then local amount = args.amount or 1 if amount == 1 then warnUnstableEssenceTargets:CombinedShow(1, args.destName) if args:IsPlayer() then specWarnUnstableEssence:Show() specWarnUnstableEssence:Play("targetyou") end if self.Options.SetIconOnEssence then for i = 1, 8, 1 do if not essenceMarks[i] then essenceMarks[i] = args.destGUID self:SetIcon(args.destName, i) return end end end else if args:IsPlayer() and amount > 10 then local icon = GetRaidTargetIndex("player") local text = amount if icon then text = "{rt"..icon.."} "..amount.." {rt"..icon.."}" end yellUnstableEssence:Yell(text) end end elseif spellId == 407617 then warnTemporalAnomalyAbsorbed:Show(args.destName) elseif spellId == 405392 then warnDisintegrate:CombinedShow(0.5, args.destName) if args:IsPlayer() then specWarnDisintegrate:Show() specWarnDisintegrate:Play("range5") yellDisintegrate:Yell() end end end mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED function mod:SPELL_AURA_REMOVED(args) local spellId = args.spellId if spellId == 407327 then if self.Options.SetIconOnEssence then for i = 1, 8, 1 do if essenceMarks[i] == args.destGUID then essenceMarks[i] = nil self:SetIcon(args.destName, 0) return end end end end end function mod:UNIT_DIED(args) local cid = self:GetCIDFromGUID(args.destGUID) if cid == 200912 then--Neldris timerRendingChargeCD:Stop() timerMassiveSlamCD:Stop() timerBellowingRoarCD:Stop() elseif cid == 200918 then--Rionthus timerDeepBreathCD:Stop() timerTemporalAnomalyCD:Stop() timerDisintegrateCD:Stop() elseif cid == 200913 then--Thadrion timerUnstableEssenceCD:Stop() timerVolatileSpewCD:Stop() timerViolentEruptionCD:Stop() end end function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT() for i = 1, 3 do local unitID = "boss"..i local GUID = UnitGUID(unitID) if GUID and not bossActive[GUID] then bossActive[GUID] = true local cid = self:GetCIDFromGUID(GUID) if cid == 200918 then--Rionthus self:SetStage(3)--Rare exception of stage not matching journal but it should have if self:IsMythic() then --Boss gains 2 energy per second, but +5 seconds after hitting 100 before restarting --Temporal Anomaly is cast at 17 mythic --Disintegrate is cast at 41 mythic --Only acception for energy rules for casts is if the cast is within first 5 seconds of spawn --it'll be delayed and cast after 5 second no cast window, as long as a new spells energy window hasn't activated (else cast is skipped) --(this exception is not really coded in at moment) local bossPower = UnitPower(unitID) if bossPower < 17 then--Temporal Anomaly first --Next cast at 17 energy local tempTimer = (17 - bossPower) / 2 timerTemporalAnomalyCD:Start(tempTimer, 1) --Next cast at 41 energy local disTimer = (41 - bossPower) / 2 timerDisintegrateCD:Start(disTimer, 1) --Next cast at 100 energy local deepTimer = (100 - bossPower) / 2 timerDeepBreathCD:Start(deepTimer, 1) elseif bossPower < 41 then--Disintegrate first --Next cast at 41 energy local disTimer = (41 - bossPower) / 2 timerDisintegrateCD:Start(disTimer, 1) --Next cast at 100 energy local deepTimer = (100 - bossPower) / 2 timerDeepBreathCD:Start(deepTimer, 1) --Next cast at 17 energy after energy reset local tempTimer = (117 - bossPower) / 2 timerTemporalAnomalyCD:Start(tempTimer + 5, 1) else--Deep Breath first --Next cast at 100 energy local deepTimer = (100 - bossPower) / 2 timerDeepBreathCD:Start(deepTimer, 1) --Next cast at 17 energy after energy reset local tempTimer = (117 - bossPower) / 2 timerTemporalAnomalyCD:Start(tempTimer + 5, 1) --Next cast at 41 energy after energy reset local disTimer = (141 - bossPower) / 2 timerDisintegrateCD:Start(disTimer + 5, 1) end else timerDisintegrateCD:Start(6.2, 1) timerTemporalAnomalyCD:Start(16.8, 1) timerDeepBreathCD:Start(30.4, 1) end elseif cid == 200913 then--Thadrion self:SetStage(2)--Rare exception of stage not matching journal but it should have if self:IsMythic() then --Boss gains 2 energy per second, but +5 seconds after hitting 100 before restarting --Volatile Spew is cast at 30 and 75 Energy on mythic --Unstable Essence is cast at 7 energy and 55 Energy on Mythic --Only acception for energy rules for casts is if the cast is within first 5 seconds of spawn --it'll be delayed and cast after 5 second no cast window, as long as a new spells energy window hasn't activated (else cast is skipped) --(this exception is not really coded in at moment) local bossPower = UnitPower(unitID) if bossPower < 7 then--Unstable might be first, but this probably won't happen until 11.x timerUnstableEssenceCD:Start(5, 1)--Min CD of 5 rule will be applied anyways so no need to calculate it --Next cast at 30 energy local spewTimer = (30 - bossPower) / 2 timerVolatileSpewCD:Start(spewTimer, 1) --Next cast at 100 energy local violentTimer = (100 - bossPower) / 2 timerViolentEruptionCD:Start(violentTimer, 1) elseif bossPower < 30 then--Volatile Spew will be first (and will be cast twice before special) --Next cast at 30 energy local spewTimer = (30 - bossPower) / 2 timerVolatileSpewCD:Start(spewTimer, 1) --Next cast is at 55 energy local unstableTimer = (55 - bossPower) / 2 timerUnstableEssenceCD:Start(unstableTimer, 1) --Next cast at 100 energy local violentTimer = (100 - bossPower) / 2 timerViolentEruptionCD:Start(violentTimer, 1) elseif bossPower < 55 then--Unstable will be first --Next cast is at 55 energy local unstableTimer = (55 - bossPower) / 2 timerUnstableEssenceCD:Start(unstableTimer, 1) --Next cast at 75 energy local spewTimer = (75 - bossPower) / 2 timerVolatileSpewCD:Start(spewTimer, 1) --Next cast at 100 energy local violentTimer = (100 - bossPower) / 2 timerViolentEruptionCD:Start(violentTimer, 1) elseif bossPower < 75 then--Volatile Spew will be first (but only cast once) --Next cast at 75 energy local spewTimer = (75 - bossPower) / 2 timerVolatileSpewCD:Start(spewTimer, 1) --Next cast at 100 energy local violentTimer = (100 - bossPower) / 2 timerViolentEruptionCD:Start(violentTimer, 1) --Next cast is at 7 energy so we have to calculate to (100 energy + 7) / 2 then + 5 seconds outside energy calculation local unstableTimer = (107 - bossPower) / 2 timerUnstableEssenceCD:Start(unstableTimer + 5, 1) else--He's just gonna ultimate first --Next cast at 100 energy local violentTimer = (100 - bossPower) / 2 timerViolentEruptionCD:Start(violentTimer, 1) --Next cast is at 7 energy so we have to calculate to (100 energy + 7) / 2 then + 5 seconds outside energy calculation local unstableTimer = (107 - bossPower) / 2 timerUnstableEssenceCD:Start(unstableTimer + 5, 1) --Next cast at 30 energy local spewTimer = (130 - bossPower) / 2 timerVolatileSpewCD:Start(spewTimer + 5, 1) end else --Always comes out at 29 power, first power update will fire at 31 timerVolatileSpewCD:Start(5.3, 1)--Used at 41 and 80 Power first time (then after first rotation switches to 26/??) timerUnstableEssenceCD:Start(16.5, 1)--Used at 61-63 Power (also at 11 power but boss never starts at low) timerViolentEruptionCD:Start(38.4, 1)--Used at 100 Power (then can switch to cooldown code after) end end end end end --Slightly faster than CLEU -- "<289.58 23:45:20> [UNIT_SPELLCAST_SUCCEEDED] Rionthus(80.8%-100.0%){Target:Andykay} -Deep Breath- [[boss2:Cast-3-2083-2569-2683-405814-01031E2802:405814]]", -- "<289.62 23:45:20> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\\\Icons\\\\Ability_Evoker_DeepBreath.blp:20|tRionthus prepares to take in a |cFFFF0000|Hspell:406227|h[Deep Breath]|h|r! -- "<290.65 23:45:21> [CLEU] SPELL_CAST_START#Creature-0-2083-2569-2683-200918-00001E266C#Rionthus(80.4%-100.0%)##nil#406227#Deep Breath#nil#nil", function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId) if spellId == 405814 and self:AntiSpam(5, 2) then--Deep Breath self.vb.breathCount = self.vb.breathCount + 1 specWarnDeepBreath:Show(self.vb.breathCount) specWarnDeepBreath:Play("breathsoon") timerDeepBreathCD:Start(self:IsMythic() and 55 or 43.1, self.vb.breathCount+1) end end