local mod = DBM:NewMod(2529, "DBM-Aberrus", nil, 1208) local L = mod:GetLocalizedStrings() mod:SetRevision("20230407024435") mod:SetCreatureID(201774, 201773, 201934)--Krozgoth, Moltannia, Molgoth mod:SetEncounterID(2687) mod:SetUsedIcons(1, 2, 3, 4) mod:SetBossHPInfoToHighest() mod:SetHotfixNoticeRev(20230406000000) --mod:SetMinSyncRevision(20221215000000) --mod.respawnTime = 29 mod:RegisterCombat("combat") mod:RegisterEventsInCombat( "SPELL_CAST_START 403459 405016 407640 403699 404732 403101 404896 405437 405641 408193 405914 406783 403203 409385", "SPELL_CAST_SUCCESS 406730 409385", "SPELL_AURA_APPLIED 401809 402617 405036 405394 405642 405914", "SPELL_AURA_APPLIED_DOSE 401809 402617 405394", "SPELL_AURA_REMOVED 401809 402617 405036 405642", "SPELL_PERIODIC_DAMAGE 405084 405645", "SPELL_PERIODIC_MISSED 405084 405645" ) --[[ (ability.id = 403459 or ability.id = 405016 or ability.id = 407640 or ability.id = 403699 or ability.id = 404732 or ability.id = 403101 or ability.id = 404896 or ability.id = 403203 or ability.id = 405437 or ability.id = 405641 or ability.id = 408193 or ability.id = 405914 or ability.id = 406783) and type = "begincast" or (ability.id = 406730 or ability.id = 406780) and type = "cast" --]] --TODO, also target scan Swirling Flame? --TODO, secondary alert for Swirling Shadowflame ? --TODO, if both tank abilities in P2 are a combo, just use generic tank combo timer --General local specWarnGTFO = mod:NewSpecialWarningGTFO(405084, nil, nil, nil, 1, 8) mod:AddBoolOption("AdvancedBossFiltering", true, "misc")--May be default to off on live, but for testing purposes it needs to be forced --Krozgoth mod:AddTimerLine(DBM:EJ_GetSectionInfo(26336)) local warnCorruptingShadow = mod:NewCountAnnounce(401809, 2, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(401809)) local warnCorruptingShadowFades = mod:NewFadesAnnounce(401809, 1) local warnUmbralDetonation = mod:NewTargetCountAnnounce(405016, 3, nil, nil, nil, nil, nil, nil, true) local specWarnCoalescingVoid = mod:NewSpecialWarningCount(403459, nil, nil, nil, 2, 2)--Possibly use a run away warning if idea is to actualy move away? Something tells me falloff is just designed to scope damage to players on THIS boss only local specWarnUmbralDetonation = mod:NewSpecialWarningYou(405016, nil, nil, nil, 1, 2) local yellUmbralDetonation = mod:NewShortYell(405016) local yellUmbralDetonationFades = mod:NewShortFadesYell(405016) local specWarnShadowsConvergence = mod:NewSpecialWarningDodgeCount(407640, nil, nil, nil, 2, 2) --local specWarnPyroBlast = mod:NewSpecialWarningInterrupt(396040, "HasInterrupt", nil, nil, 1, 2) local timerCoalescingVoidCD = mod:NewCDCountTimer(21.9, 403459, nil, nil, nil, 2) local timerUmbralDetonationCD = mod:NewCDCountTimer(21.9, 405016, nil, nil, nil, 3) local timerShadowsConvergenceCD = mod:NewCDCountTimer(20.7, 407640, nil, nil, nil, 3) local timerShadowSpikeCD = mod:NewCDCountTimer(11, 403699, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON) --local berserkTimer = mod:NewBerserkTimer(600) --mod:AddInfoFrameOption(361651, true) mod:AddSetIconOption("SetIconOnUmbral", 405016, false, 0, {1, 2, 3}) --mod:AddNamePlateOption("NPAuraOnAscension", 385541) --mod:GroupSpells(390715, 396094) --Moltannia mod:AddTimerLine(DBM:EJ_GetSectionInfo(26337)) local warnBlazingHeat = mod:NewCountAnnounce(402617, 2, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(401809)) local warnBlazingHeatFades = mod:NewFadesAnnounce(402617, 1) local specWarnFieryMeteor = mod:NewSpecialWarningCount(404732, nil, nil, nil, 2, 2) local specWarnMoltenEruption = mod:NewSpecialWarningCount(403101, nil, nil, nil, 2, 2) local specWarnSwirlingFlame = mod:NewSpecialWarningDodgeCount(404896, nil, nil, nil, 2, 2) local timerFieryMeteorCD = mod:NewCDCountTimer(31.7, 404732, nil, nil, nil, 3) local timerMoltenEruptionCD = mod:NewCDCountTimer(22.3, 403101, nil, nil, nil, 5) local timerSwirlingFlameCD = mod:NewCDCountTimer(20.7, 404896, nil, nil, nil, 3) local timerFlameSlashCD = mod:NewCDCountTimer(11, 403203, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON) --Molgoth mod:AddTimerLine(DBM:EJ_GetSectionInfo(26338)) local warnShadowandFlame = mod:NewCastAnnounce(409385, 4) local warnShadowflame = mod:NewCountAnnounce(405394, 2, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(405394)) local warnBlisteringTwilight = mod:NewTargetCountAnnounce(405641, 3, nil, nil, nil, nil, nil, nil, true) local warnShadowflameBurst = mod:NewCountAnnounce(406783, 3) local specWarnGloomConflag = mod:NewSpecialWarningCount(405437, nil, nil, nil, 2, 2) local specWarnBlisteringTwilight = mod:NewSpecialWarningYou(405641, nil, nil, nil, 1, 2) local yellBlisteringTwilight = mod:NewShortYell(405641) local yellBlisteringTwilightFades = mod:NewShortFadesYell(405641) local specWarnConvergentEruption = mod:NewSpecialWarningCount(408193, nil, nil, nil, 2, 2) local specWarnWitheringVulnerability = mod:NewSpecialWarningDefensive(405914, nil, nil, nil, 1, 2) local specWarnWitheringVulnerabilityTaunt = mod:NewSpecialWarningTaunt(405914, nil, nil, nil, 1, 2) local timerShadowandFlameCD = mod:NewCDCountTimer(47.4, 409385, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON) local timerGloomConflagCD = mod:NewCDCountTimer(40, 405437, nil, nil, nil, 3) local timerBlisteringTwilightCD = mod:NewCDCountTimer(40, 405641, nil, nil, nil, 3) local timerConvergentEruptionCD = mod:NewCDCountTimer(40, 408193, nil, nil, nil, 5) local timerWitheringVulnerabilityCD = mod:NewCDCountTimer(35.3, 405914, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--35-40 local timerShadowflameBurstCD = mod:NewCDCountTimer(35.3, 406783, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--Might be redundant if always after crushing mod:AddSetIconOption("SetIconOnBlistering", 405641, false, 0, {1, 2, 3, 4}) mod:AddRangeFrameOption(6, 409385) local nearKroz, nearMolt = true, true mod.vb.coalescingCount = 0 mod.vb.umbralCount = 0 mod.vb.umbralIcon = 1 mod.vb.shadowConvergeCount = 0 mod.vb.shadowStrikeCount = 0 mod.vb.meteorCast = 0 mod.vb.swirlingCount = 0 mod.vb.moltenEruptionCast = 0 mod.vb.flameSlashCast = 0 mod.vb.witheringVulnCount = 0 mod.vb.shadowflameBurstCount = 0 mod.vb.SandFCount = 0 --As computational as this looks, it's purpose is to just filter information overload. --Basically, it solves for what should or shouldn't be shown, not what a player should or shouldn't do. local function updateBossDistance(self) if not self.Options.AdvancedBossFiltering then return end --Check if near or far from Krozgoth if self:CheckBossDistance(201774, true, 32698, 48) then if not nearKroz then nearKroz = true timerCoalescingVoidCD:SetFade(false, self.vb.coalescingCount+1) timerUmbralDetonationCD:SetFade(false, self.vb.umbralCount+1) timerShadowsConvergenceCD:SetFade(false, self.vb.shadowConvergeCount+1) timerShadowSpikeCD:SetFade(false, self.vb.shadowStrikeCount+1) end else if nearKroz then nearKroz = false timerCoalescingVoidCD:SetFade(true, self.vb.coalescingCount+1) timerUmbralDetonationCD:SetFade(true, self.vb.umbralCount+1) timerShadowsConvergenceCD:SetFade(true, self.vb.shadowConvergeCount+1) timerShadowSpikeCD:SetFade(true, self.vb.shadowStrikeCount+1) end end --Check if near or far from Moltannia if self:CheckBossDistance(201773, true, 32698, 48) then if not nearMolt then nearMolt = true timerFieryMeteorCD:SetFade(false, self.vb.meteorCast+1) timerMoltenEruptionCD:SetFade(false, self.vb.moltenEruptionCast+1) timerSwirlingFlameCD:SetFade(false, self.vb.swirlingCount+1) timerFlameSlashCD:SetFade(false, self.vb.flameSlashCast+1) end else if nearMolt then nearMolt = false timerFieryMeteorCD:SetFade(true, self.vb.meteorCast+1) timerMoltenEruptionCD:SetFade(true, self.vb.moltenEruptionCast+1) timerSwirlingFlameCD:SetFade(true, self.vb.swirlingCount+1) timerFlameSlashCD:SetFade(true, self.vb.flameSlashCast+1) end end self:Schedule(2, updateBossDistance, self) end function mod:OnCombatStart(delay) nearKroz, nearMolt = true, true self:SetStage(1) --Krozgoth self.vb.coalescingCount = 0 self.vb.umbralCount = 0 self.vb.umbralIcon = 1 self.vb.shadowConvergeCount = 0 self.vb.shadowStrikeCount = 0 if self:IsMythic() then timerShadowSpikeCD:Start(9.5-delay, 1) timerUmbralDetonationCD:Start(14.3-delay, 1) timerShadowsConvergenceCD:Start(22.8-delay, 1) timerCoalescingVoidCD:Start(36.2-delay, 1) else timerShadowSpikeCD:Start(5.9-delay, 1) timerUmbralDetonationCD:Start(19.3-delay, 1) timerShadowsConvergenceCD:Start(22.8-delay, 1) timerCoalescingVoidCD:Start(30.3-delay, 1) end --Reset Fades timerCoalescingVoidCD:SetFade(false, 1) timerUmbralDetonationCD:SetFade(false, 1) timerShadowsConvergenceCD:SetFade(false, 1) timerShadowSpikeCD:SetFade(false, 1) --Moltannia self.vb.meteorCast = 0 self.vb.moltenEruptionCast = 0 self.vb.swirlingCount = 0 self.vb.SandFCount = 0 self.vb.flameSlashCast = 0 if self:IsMythic() then timerFlameSlashCD:Start(7-delay, 1) timerSwirlingFlameCD:Start(10.7-delay, 1) timerMoltenEruptionCD:Start(16.7-delay, 1) timerFieryMeteorCD:Start(36.2-delay, 1) else timerFlameSlashCD:Start(5.9-delay, 1) timerSwirlingFlameCD:Start(9.5-delay, 1) timerMoltenEruptionCD:Start(23-delay, 1) timerFieryMeteorCD:Start(32.7-delay, 1) end --Reset Fades timerFieryMeteorCD:SetFade(false, 1) timerMoltenEruptionCD:SetFade(false, 1) timerSwirlingFlameCD:SetFade(false, 1) timerFlameSlashCD:SetFade(false, 1) -- if self.Options.NPAuraOnAscension then -- DBM:FireEvent("BossMod_EnableHostileNameplates") -- end self:Schedule(2, updateBossDistance, self) end function mod:OnCombatEnd() if self.Options.RangeFrame then DBM.RangeCheck:Hide() end -- if self.Options.InfoFrame then -- DBM.InfoFrame:Hide() -- end -- if self.Options.NPAuraOnAscension then -- DBM.Nameplate:Hide(true, nil, nil, nil, true, true) -- end end function mod:SPELL_CAST_START(args) local spellId = args.spellId --Krozgoth Spells if spellId == 403459 then self.vb.coalescingCount = self.vb.coalescingCount + 1 if nearKroz then specWarnCoalescingVoid:Show(self.vb.coalescingCount) specWarnCoalescingVoid:Play("aesoon") end timerCoalescingVoidCD:Start(self:IsMythic() and 35.3 or 21.9, self.vb.coalescingCount+1) elseif spellId == 405016 then self.vb.umbralCount = 0 self.vb.umbralIcon = 1 --14.3, 43.8, 35.4 timerUmbralDetonationCD:Start(self:IsMythic() and (self.vb.umbralCount == 1 and 43.8 or 35.3) or 21.9, self.vb.umbralCount+1) elseif spellId == 407640 then self.vb.shadowConvergeCount = self.vb.shadowConvergeCount + 1 if nearKroz then specWarnShadowsConvergence:Show() specWarnShadowsConvergence:Play("watchstep") end --22.8, 42.7, 35.3 timerShadowsConvergenceCD:Start(self:IsMythic() and (self.vb.shadowConvergeCount == 1 and 42.7 or 35.3) or 20.7, self.vb.shadowConvergeCount+1) elseif spellId == 403699 then self.vb.shadowStrikeCount = self.vb.shadowStrikeCount + 1 --if self:IsTanking("player", nil, nil, true, args.sourceGUID) then --end --9.5, 15.8, 15.8, 12.2, 15.8, 19.5, 15.8 timerShadowSpikeCD:Start(self:IsMythic() and 12.2 or 20.7, self.vb.shadowStrikeCount+1) --Moltannia Spells elseif spellId == 404732 then self.vb.meteorCast = self.vb.meteorCast + 1 if nearMolt then specWarnFieryMeteor:Show(self.vb.meteorCast) specWarnFieryMeteor:Play("helpsoak") end timerFieryMeteorCD:Start(self:IsMythic() and 35.3 or 31.7, self.vb.meteorCast+1) elseif spellId == 403101 then self.vb.moltenEruptionCast = self.vb.moltenEruptionCast + 1 if nearMolt then specWarnMoltenEruption:Show(self.vb.moltenEruptionCast) specWarnMoltenEruption:Play("helpsoak") end --16.7, 42.6, 35.4 timerMoltenEruptionCD:Start(self:IsMythic() and (self.vb.moltenEruptionCast == 1 and 41.5 or 35.3) or 31.7, self.vb.moltenEruptionCast+1) elseif spellId == 404896 then self.vb.swirlingCount = self.vb.swirlingCount + 1 if nearMolt then specWarnSwirlingFlame:Show() specWarnSwirlingFlame:Play("watchwave") end local timer = 20.7--Heroic timer, TODO, see if it's still this way if self:IsMythic() then --10.7, 14.6, 28.0, 14.6, 20.7, 14.6 timer = self.vb.swirlingCount == 2 and 27 or (self.vb.swirlingCount % 2 == 0 and 20.7 or 14.6) end timerSwirlingFlameCD:Start(timer, self.vb.swirlingCount+1) elseif spellId == 403203 then self.vb.flameSlashCast = self.vb.flameSlashCast + 1 --if self:IsTanking("player", nil, nil, true, args.sourceGUID) then --end local timer = 11--Heroic timer, TODO, see if it's still this way if self:IsMythic() then --7.0, 15.7, 26.8, 15.9, 19.5, 15.8 timer = self.vb.flameSlashCast == 2 and 26.8 or (self.vb.flameSlashCast % 2 == 0 and 19.5 or 15.8) end timerFlameSlashCD:Start(timer, self.vb.flameSlashCast+1) --Molgoth elseif spellId == 405437 then self.vb.meteorCast = self.vb.meteorCast + 1 specWarnGloomConflag:Show(self.vb.meteorCast) specWarnGloomConflag:Play("helpsoak") timerGloomConflagCD:Start(self:IsMythic() and 47.4 or 40, self.vb.meteorCast+1) elseif spellId == 405641 then self.vb.umbralCount = self.vb.umbralCount + 1 self.vb.umbralIcon = 1 timerBlisteringTwilightCD:Start(self:IsMythic() and 47.4 or 40, self.vb.umbralCount+1) elseif spellId == 408193 then self.vb.moltenEruptionCast = self.vb.moltenEruptionCast + 1 specWarnConvergentEruption:Show() specWarnConvergentEruption:Play("helpsoak") timerConvergentEruptionCD:Start(self:IsMythic() and 47.4 or 40, self.vb.moltenEruptionCast+1) elseif spellId == 405914 then self.vb.witheringVulnCount = self.vb.witheringVulnCount + 1 if self:IsTanking("player", nil, nil, true, args.sourceGUID) then specWarnWitheringVulnerability:Show() specWarnWitheringVulnerability:Play("defensive") end if self:IsMythic() then timerWitheringVulnerabilityCD:Start(23.1, self.vb.witheringVulnCount+1) else --Likely a clearer explanation for this later like a spell queue that delays it later fight if self.vb.witheringVulnCount >= 5 then timerWitheringVulnerabilityCD:Start(40, self.vb.witheringVulnCount+1) else timerWitheringVulnerabilityCD:Start(35, self.vb.witheringVulnCount+1) end end elseif spellId == 406783 then self.vb.shadowflameBurstCount = self.vb.shadowflameBurstCount + 1 warnShadowflameBurst:Show(self.vb.shadowflameBurstCount) if self:IsMythic() then timerShadowflameBurstCD:Start(23.1, self.vb.shadowflameBurstCount+1) else if self.vb.shadowflameBurstCount >= 5 then timerShadowflameBurstCD:Start(40, self.vb.shadowflameBurstCount+1) else timerShadowflameBurstCD:Start(35, self.vb.shadowflameBurstCount+1) end end elseif spellId == 409385 then self.vb.SandFCount = self.vb.SandFCount + 1 warnShadowandFlame:Show(self.vb.SandFCount) timerShadowandFlameCD:Start(nil, self.vb.SandFCount+1) if self.Options.RangeFrame then DBM.RangeCheck:Show(6) end end end function mod:SPELL_CAST_SUCCESS(args) local spellId = args.spellId if spellId == 406730 and self.vb.phase == 1 then--Crucible Instability self:SetStage(2) self.vb.bossLeft = self.vb.bossLeft - 2--Stage 1 bosses don't actually die, they fuse. This just updates mods internal count self.vb.meteorCast = 0--Reused for Gloom Conflagration self.vb.umbralCount = 0--Reused for Blistering Twilight self.vb.moltenEruptionCast = 0--Reused for Converging Eruption self.vb.witheringVulnCount = 0 self.vb.shadowflameBurstCount = 0 self:Unschedule(updateBossDistance) timerCoalescingVoidCD:Stop() timerUmbralDetonationCD:Stop() timerShadowsConvergenceCD:Stop() timerShadowSpikeCD:Stop() timerFieryMeteorCD:Stop() timerMoltenEruptionCD:Stop() timerSwirlingFlameCD:Stop() timerFlameSlashCD:Stop() timerWitheringVulnerabilityCD:Start(17.3, 1) timerShadowflameBurstCD:Start(19.4, 1) timerBlisteringTwilightCD:Start(22.2, 1) timerGloomConflagCD:Start(self:IsMythic() and 50 or 31.9, 1) timerConvergentEruptionCD:Start(self:IsMythic() and 35.8 or 46.5, 1) if self:IsMythic() then timerShadowandFlameCD:Start(29.6, 1) end elseif spellId == 409385 then if self.Options.RangeFrame then DBM.RangeCheck:Hide() end end end function mod:SPELL_AURA_APPLIED(args) local spellId = args.spellId if spellId == 401809 and args:IsPlayer() then local amount = args.amount or 1 if (amount % 3 == 0) and amount >= 18 then--Adjust as needed warnCorruptingShadow:Show(amount) end elseif spellId == 402617 and args:IsPlayer() then local amount = args.amount or 1 if (amount % 3 == 0) and amount >= 18 then--Adjust as needed warnBlazingHeat:Show(amount) end elseif spellId == 405394 and args:IsPlayer() then local amount = args.amount or 1 if (amount % 3 == 0) and amount >= 18 then--Adjust as needed warnShadowflame:Show(amount) end elseif spellId == 405036 then local icon = self.vb.umbralIcon if self.Options.SetIconOnUmbral then self:SetIcon(args.destName, icon) end if args:IsPlayer() then specWarnUmbralDetonation:Show() specWarnUmbralDetonation:Play("targetyou") yellUmbralDetonation:Yell() yellUmbralDetonationFades:Countdown(spellId) end if nearKroz then warnUmbralDetonation:CombinedShow(0.5, self.vb.umbralCount, args.destName) end self.vb.umbralIcon = self.vb.umbralIcon + 1 elseif spellId == 405642 then local icon = self.vb.umbralIcon if self.Options.SetIconOnBlistering then self:SetIcon(args.destName, icon) end if args:IsPlayer() then specWarnBlisteringTwilight:Show() specWarnBlisteringTwilight:Play("targetyou") yellBlisteringTwilight:Yell() yellBlisteringTwilightFades:Countdown(spellId) end if nearKroz then warnBlisteringTwilight:CombinedShow(0.5, self.vb.umbralCount, args.destName) end self.vb.umbralIcon = self.vb.umbralIcon + 1 elseif spellId == 405914 and not args:IsPlayer() then specWarnWitheringVulnerabilityTaunt:Show(args.destName) specWarnWitheringVulnerabilityTaunt:Play("tauntboss") end end mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED function mod:SPELL_AURA_REMOVED(args) local spellId = args.spellId if spellId == 401809 and args:IsPlayer() then warnCorruptingShadowFades:Show() elseif spellId == 402617 and args:IsPlayer() then warnBlazingHeatFades:Show() elseif spellId == 405036 then if self.Options.SetIconOnUmbral then self:SetIcon(args.destName, 0) end if args:IsPlayer() then yellUmbralDetonationFades:Cancel() end elseif spellId == 405642 then if self.Options.SetIconOnBlistering then self:SetIcon(args.destName, 0) end if args:IsPlayer() then yellBlisteringTwilightFades:Cancel() end end end function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName) if (spellId == 405084 or spellId == 405645) and destGUID == UnitGUID("player") and self:AntiSpam(3, 2) then specWarnGTFO:Show(spellName) specWarnGTFO:Play("watchfeet") end end mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE