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.

423 lines
17 KiB

local mod = DBM:NewMod(2529, "DBM-Aberrus", nil, 1208)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20230317031013")
mod:SetCreatureID(201774, 201773, 201934)--Krozgoth, Moltannia, Molgoth
mod:SetEncounterID(2687)
mod:SetUsedIcons(1, 2, 3, 4)
mod:SetBossHPInfoToHighest()
mod:SetHotfixNoticeRev(20230316000000)
--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",
"SPELL_CAST_SUCCESS 406730 406780",
"SPELL_AURA_APPLIED 401809 402617 405036 405394 406780 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:NewCDTimer(11, 403699, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
--local berserkTimer = mod:NewBerserkTimer(600)
--mod:AddInfoFrameOption(361651, true)
--mod:AddRangeFrameOption(5, 390715)
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:NewCDTimer(11, 403203, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
--Molgoth
mod:AddTimerLine(DBM:EJ_GetSectionInfo(26338))
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 specWarnCrushingVulnerability = mod:NewSpecialWarningDefensive(405914, nil, nil, nil, 1, 2)
local specWarnCrushingVulnerabilityTaunt = mod:NewSpecialWarningTaunt(405914, nil, nil, nil, 1, 2)
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 timerCrushingVulnerabilityCD = 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})
local nearKroz, nearMolt = true, true
mod.vb.coalescingCount = 0
mod.vb.umbralCount = 0
mod.vb.umbralIcon = 1
mod.vb.shadowConvergeCount = 0
mod.vb.meteorCast = 0
mod.vb.swirlingCount = 0
mod.vb.moltenEruptionCast = 0
mod.vb.crushingVulnCount = 0
mod.vb.shadowflameBurstCount = 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)
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)
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)
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)
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
timerShadowSpikeCD:Start(5.9-delay)
timerUmbralDetonationCD:Start(19.3-delay, 1)
timerShadowsConvergenceCD:Start(23-delay, 1)
timerCoalescingVoidCD:Start(30.3-delay, 1)
--Reset Fades
timerCoalescingVoidCD:SetFade(false, 1)
timerUmbralDetonationCD:SetFade(false, 1)
timerShadowsConvergenceCD:SetFade(false, 1)
timerShadowSpikeCD:SetFade(false)
--Moltannia
self.vb.meteorCast = 0
self.vb.moltenEruptionCast = 0
self.vb.swirlingCount = 0
timerFlameSlashCD:Start(5.9-delay)
timerSwirlingFlameCD:Start(9.5-delay, 1)
timerMoltenEruptionCD:Start(23-delay, 1)
timerFieryMeteorCD:Start(32.7-delay, 1)
--Reset Fades
timerFieryMeteorCD:SetFade(false, 1)
timerMoltenEruptionCD:SetFade(false, 1)
timerSwirlingFlameCD:SetFade(false, 1)
timerFlameSlashCD:SetFade(false)
-- 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(nil, self.vb.coalescingCount+1)
elseif spellId == 405016 then
self.vb.umbralCount = 0
self.vb.umbralIcon = 1
timerUmbralDetonationCD:Start(nil, self.vb.umbralCount+1)
elseif spellId == 407640 then
self.vb.shadowConvergeCount = self.vb.shadowConvergeCount + 1
if nearKroz then
specWarnShadowsConvergence:Show()
specWarnShadowsConvergence:Play("watchstep")
end
timerShadowsConvergenceCD:Start(nil, self.vb.shadowConvergeCount+1)
elseif spellId == 403699 then
--if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
--end
timerShadowSpikeCD:Start()
--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(nil, 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
timerMoltenEruptionCD:Start(nil, self.vb.moltenEruptionCast+1)
elseif spellId == 404896 then
self.vb.swirlingCount = self.vb.swirlingCount + 1
if nearMolt then
specWarnSwirlingFlame:Show()
specWarnSwirlingFlame:Play("watchwave")
end
timerSwirlingFlameCD:Start(nil, self.vb.swirlingCount+1)
elseif spellId == 403203 then
--if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
--end
timerFlameSlashCD:Start()
--Molgoth
elseif spellId == 405437 then
self.vb.meteorCast = self.vb.meteorCast + 1
specWarnGloomConflag:Show(self.vb.meteorCast)
specWarnGloomConflag:Play("helpsoak")
timerGloomConflagCD:Start(nil, self.vb.meteorCast+1)
elseif spellId == 405641 then
self.vb.umbralCount = self.vb.umbralCount + 1
self.vb.umbralIcon = 1
timerBlisteringTwilightCD:Start(nil, self.vb.umbralCount+1)
elseif spellId == 408193 then
self.vb.moltenEruptionCast = self.vb.moltenEruptionCast + 1
specWarnConvergentEruption:Show()
specWarnConvergentEruption:Play("helpsoak")
timerConvergentEruptionCD:Start()
elseif spellId == 405914 then
self.vb.crushingVulnCount = self.vb.crushingVulnCount + 1
if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
specWarnCrushingVulnerability:Show()
specWarnCrushingVulnerability:Play("defensive")
end
--Likely a clearer explanation for this later like a spell queue that delays it later fight
if self.vb.crushingVulnCount >= 5 then
timerCrushingVulnerabilityCD:Start(40, self.vb.crushingVulnCount+1)
else
timerCrushingVulnerabilityCD:Start(35, self.vb.crushingVulnCount+1)
end
elseif spellId == 406783 then
self.vb.shadowflameBurstCount = self.vb.shadowflameBurstCount + 1
warnShadowflameBurst:Show(self.vb.shadowflameBurstCount)
if self.vb.shadowflameBurstCount >= 5 then
timerShadowflameBurstCD:Start(40, self.vb.shadowflameBurstCount+1)
else
timerShadowflameBurstCD:Start(35, self.vb.shadowflameBurstCount+1)
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.crushingVulnCount = 0
self.vb.shadowflameBurstCount = 0
self:Unschedule(updateBossDistance)
timerCoalescingVoidCD:Stop()
timerUmbralDetonationCD:Stop()
timerShadowsConvergenceCD:Stop()
timerShadowSpikeCD:Stop()
timerFieryMeteorCD:Stop()
timerMoltenEruptionCD:Stop()
timerSwirlingFlameCD:Stop()
timerFlameSlashCD:Stop()
timerCrushingVulnerabilityCD:Start(17.3, 1)
timerShadowflameBurstCD:Start(19.4, 1)
timerBlisteringTwilightCD:Start(22.2, 1)
timerGloomConflagCD:Start(31.9, 1)
timerConvergentEruptionCD:Start(46.5, 1)
elseif spellId == 406780 and self.vb.phase == 1 then--Shadowflame on boss (backup)
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.crushingVulnCount = 0
self.vb.shadowflameBurstCount = 0
self:Unschedule(updateBossDistance)
timerCoalescingVoidCD:Stop()
timerUmbralDetonationCD:Stop()
timerShadowsConvergenceCD:Stop()
timerShadowSpikeCD:Stop()
timerFieryMeteorCD:Stop()
timerMoltenEruptionCD:Stop()
timerSwirlingFlameCD:Stop()
timerFlameSlashCD:Stop()
timerCrushingVulnerabilityCD:Start(3.6, 1)
timerShadowflameBurstCD:Start(5.6, 1)
timerBlisteringTwilightCD:Start(8.4, 1)
timerGloomConflagCD:Start(18.2, 1)
timerConvergentEruptionCD:Start(32.8, 1)
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
specWarnCrushingVulnerabilityTaunt:Show(args.destName)
specWarnCrushingVulnerabilityTaunt: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