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.

456 lines
19 KiB

local mod = DBM:NewMod(2523, "DBM-Aberrus", nil, 1208)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20230601065204")
mod:SetCreatureID(201668)
mod:SetEncounterID(2684)
mod:SetUsedIcons(6)
mod:SetHotfixNoticeRev(20230530000000)
mod:SetMinSyncRevision(20230513000000)
--mod.respawnTime = 29
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 407207 403272 406222 403057 407790 407796 407936 407917 405436 405434 405433 404038 409313 401022",
"SPELL_CAST_SUCCESS 402902 401480 407917 409241 410968",
"SPELL_AURA_APPLIED 401998 405484 407728 407919",--407182 410966
"SPELL_AURA_APPLIED_DOSE",
"SPELL_AURA_REMOVED 405484 407088 407919",--407182 410966
"SPELL_AURA_REMOVED_DOSE 407088",
"SPELL_PERIODIC_DAMAGE 409058 404277 409183",
"SPELL_PERIODIC_MISSED 409058 404277 409183",
-- "UNIT_DIED"
"UNIT_SPELLCAST_SUCCEEDED boss1"
)
--[[
(ability.id = 401022 or ability.id = 409313 or ability.id = 401480 or ability.id = 403272 or ability.id = 406222 or ability.id = 407790 or ability.id = 403057
or ability.id = 401101 or ability.id = 405436 or ability.id = 405434 or ability.id = 405433 or ability.id = 405433 or ability.id = 404038 or ability.id = 403528 or ability.id = 407796
or ability.id = 407936 or ability.id = 407917 or ability.id = 407207) and type = "begincast"
or (ability.id = 401480 or ability.id = 410968 or ability.id = 409241 or ability.id = 402902) and type = "cast"
or ability.id = 407088 and (type = "applybuff" or type = "removebuff")
or ability.id = 405484 and type = "applydebuff"
or ability.id = 410966 and type = "applydebuff"
--]]
--TODO, delete redundant/incorrect events when real events known
--TODO, Add shatter? https://www.wowhead.com/ptr/spell=401825/shatter
--TODO, revisit heroic timers since it was so bugged that normal is trusted more than heroic was, for now
local warnPhase = mod:NewPhaseChangeAnnounce(2, nil, nil, nil, nil, nil, nil, 2)
--Stage One: The Earth Warder
mod:AddTimerLine(DBM:EJ_GetSectionInfo(26192))
local warnTwistedEarth = mod:NewCountAnnounce(402902, 2)
--local warnVolcanicHeart = mod:NewTargetCountAnnounce(410953, 2, nil, nil, nil, nil, nil, nil, true)
local warnRushingDarkness = mod:NewIncomingCountAnnounce(407221, 2)
local warnRushingDarknessWallTarget = mod:NewTargetCountAnnounce(407221, 2, nil, nil, nil, nil, nil, nil, true)
local warnVolcanicHeart = mod:NewIncomingCountAnnounce(410953, 3)
--local specWarnVolcanicHeart = mod:NewSpecialWarningMoveAway(410953, nil, nil, nil, 1, 2)
--local yellVolcanicHeart = mod:NewShortPosYell(410953)
--local yellVolcanicHeartFades = mod:NewIconFadesYell(410953)
local specWarnTwistedEarth = mod:NewSpecialWarningDodgeCount(402902, false, nil, 2, 2, 2)--Twisted earth spawn+Dodge for Volcanic Blast
local specWarnEchoingFissure = mod:NewSpecialWarningDodgeCount(402116, nil, 381446, nil, 2, 2)
local specWarnRushingDarkness = mod:NewSpecialWarningDodgeCount(407221, nil, nil, nil, 2, 2)
local yellRushingDarkness = mod:NewYell(407221, L.WallBreaker)
local yellRushingDarknessFades = mod:NewIconFadesYell(407221)
local specWarnCalamitousStrike = mod:NewSpecialWarningDefensive(406222, nil, nil, nil, 1, 2)
local specWarnCalamitousStrikeSwap = mod:NewSpecialWarningTaunt(406222, nil, nil, nil, 1, 2)
--local specWarnPyroBlast = mod:NewSpecialWarningInterrupt(396040, "HasInterrupt", nil, nil, 1, 2)
local specWarnGTFO = mod:NewSpecialWarningGTFO(409058, nil, nil, nil, 1, 8)
local timerVolcanicHeartCD = mod:NewCDCountTimer(26.2, 410953, nil, nil, nil, 3)
local timerTwistedEarthCD = mod:NewCDCountTimer(26.2, 402902, nil, nil, nil, 3)
local timerEchoingFissureCD = mod:NewCDCountTimer(36.3, 402116, 381446, nil, nil, 2)
local timerRushingDarknessCD = mod:NewCDCountTimer(36.3, 407221, nil, nil, nil, 3)
local timerCalamitousStrikeCD = mod:NewCDCountTimer(36.3, 406222, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
--local berserkTimer = mod:NewBerserkTimer(600)
mod:AddPrivateAuraSoundOption(407182, true, 407221, 1)--Rushing Darkness
mod:AddPrivateAuraSoundOption(410966, true, 410953, 3)--Volcanic Heart
--mod:AddRangeFrameOption(5, 390715)
--mod:AddSetIconOption("SetIconOnVolcanicHeart", 410953, true, 0, {1, 2, 3})
mod:AddSetIconOption("SetIconOnRushingDarkness", 407221, true, 0, {6})
--mod:AddNamePlateOption("NPAuraOnAscension", 385541)
--Stage Two: Corruption Takes Hold
mod:AddTimerLine(DBM:EJ_GetSectionInfo(26421))
----Voice From Beyond
--mod:AddTimerLine(DBM:EJ_GetSectionInfo(26456))
local warnCorruption = mod:NewTargetCountAnnounce(401010, 3)--Class Call Parent
local warnShadowShadowStrike = mod:NewCastAnnounce(407796, 2, nil, nil, "Tank|Healer")
local warnHidden = mod:NewAddsLeftAnnounce(407036, 1)--Announces how many are still hidden, but also kinda acts as a "one has also become unhidden" alert
local specWarnRazetheEarth = mod:NewSpecialWarningDodge(409313, nil, nil, nil, 2, 2)
local specWarnCorruption = mod:NewSpecialWarningYou(401010, nil, nil, nil, 1, 2)
local yellCorruption = mod:NewShortYell(401010)
local specWarnUmbralAnnihilation = mod:NewSpecialWarningCount(404038, nil, nil, nil, 2, 2)
local specWarnSweepingShadows = mod:NewSpecialWarningDodgeCount(403846, nil, nil, nil, 2, 2)
local specWarnSunderShadow = mod:NewSpecialWarningDefensive(407790, nil, nil, nil, 1, 2)
local specWarnSunderShadowSwap = mod:NewSpecialWarningTaunt(407790, nil, nil, nil, 1, 2)
local timerCorruptionCD = mod:NewCDCountTimer(43.4, 401010, nil, nil, nil, 5)--Parent
local timerUmbralAnnihilationCD = mod:NewCDCountTimer(29.1, 404038, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
local timerSunderShadowCD = mod:NewCDCountTimer(27.9, 407790, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
--Stage Three: Reality Fractures
mod:AddTimerLine(DBM:EJ_GetSectionInfo(26422))
local warnSunderReality = mod:NewCastAnnounce(407936, 2, nil, nil, nil, 109401)
local warnEbonDestruction = mod:NewCountAnnounce(407917, 4)
local specWarnEbonDestructionMove = mod:NewSpecialWarningMoveTo(407917, nil, 64584, nil, 3, 2)
local timerSunderRealityCD = mod:NewCDCountTimer(29.1, 407936, 109401, nil, nil, 5)--"Portals"
local timerEbonDestructionCD = mod:NewCDCountTimer(29.2, 407917, 64584, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)--"Big Bang"
mod:AddInfoFrameOption(407919, true)
--General
mod.vb.tankCount = 0
--P1
mod.vb.volcanicCount = 0
mod.vb.twistedEarthCount = 0
mod.vb.fissureCount = 0
mod.vb.RushingDarknessCount = 0
--mod.vb.volcIcon = 1
--mod.vb.rushingIcon = 4
--P2
mod.vb.corruptionCount = 0
mod.vb.annihilatingCount = 0
--P3
mod.vb.sunderRealityCount = 0
mod.vb.ebonCount = 0
local realityName = DBM:GetSpellInfo(407919)
local playerReality = false
local mythicTwistedP1Timers = {2, 20.6, 19.4, 18.2, 18.2, 18.2, 19.5, 17.0}
local mythicTwistedP2Timers = {41.6, 18.2, 12.1, 29.2, 13.4, 14.6}
local volcanicP2Timers = {21.3, 15.7, 17.0, 17.0, 17.3, 16.7, 18, 14.5}
local function checkRealityOnSelf(self)
if not playerReality then
specWarnEbonDestructionMove:Show(realityName)
specWarnEbonDestructionMove:Play("findshelter")
end
end
--Work around for stage 2 bug where sometimes cast success event is missing
local function fixBrokenHeartTimer(self)
self.vb.volcanicCount = self.vb.volcanicCount + 1
local timer = volcanicP2Timers[self.vb.volcanicCount+1]
if timer then
timerVolcanicHeartCD:Start(timer-5, self.vb.volcanicCount+1)
end
end
--[[
local function checkForSkippedDarkness(self)
if self.vb.RushingDarknessCount == 0 then--first one skipped (which is like 95% of pulls)
self.vb.RushingDarknessCount = self.vb.RushingDarknessCount + 1
timerRushingDarknessCD:Start(12, 2)
end
end
--]]
function mod:RushingDarknessTarget(targetname, uId)
if not targetname then return end
warnRushingDarknessWallTarget:Show(self.vb.RushingDarknessCount, targetname)
if targetname == UnitName("player") then
yellRushingDarkness:Yell(6, 6)
yellRushingDarknessFades:Countdown(5, nil, 6)
end
if self.Options.SetIconOnRushingDarkness then
self:SetIcon(targetname, 6, 5)
end
end
function mod:OnCombatStart(delay)
self:SetStage(1)
self.vb.tankCount = 0
self.vb.volcanicCount = 0
self.vb.twistedEarthCount = 0
self.vb.fissureCount = 0
self.vb.RushingDarknessCount = 0
self.vb.corruptionCount = 0
self.vb.annihilatingCount = 0
self.vb.sunderRealityCount = 0
self.vb.ebonCount = 0
playerReality = false
-- timerTwistedEarthCD:Start(2-delay)--Used 2 sec into pull
timerRushingDarknessCD:Start(10.5-delay, 1)
timerVolcanicHeartCD:Start(15.6-delay, 1)
timerCalamitousStrikeCD:Start(self:IsMythic() and 25.1 or 24.1-delay, 1)--Delayed by extra wall on mythic
timerEchoingFissureCD:Start(33.6-delay, 1)
self:EnablePrivateAuraSound(407182, "targetyou", 2)--Rushing Darkness
self:EnablePrivateAuraSound(410966, "runout", 2)--Volcanic Heart
end
function mod:OnCombatEnd()
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 403272 then
self.vb.fissureCount = self.vb.fissureCount + 1
specWarnEchoingFissure:Show(self.vb.fissureCount)
specWarnEchoingFissure:Play("justrun")
timerEchoingFissureCD:Start(nil, self.vb.fissureCount+1)
elseif spellId == 406222 or spellId == 401022 then
self.vb.tankCount = self.vb.tankCount + 1
if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
specWarnCalamitousStrike:Show()
specWarnCalamitousStrike:Play("carefly")
end
timerCalamitousStrikeCD:Start(self:GetStage(1) and 36.3 or 29, self.vb.tankCount+1)
elseif spellId == 407790 then
self.vb.tankCount = self.vb.tankCount + 1
if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
specWarnSunderShadow:Show()
specWarnSunderShadow:Play("defensive")
end
timerSunderShadowCD:Start(nil, self.vb.tankCount+1)
elseif args:IsSpellID(405436, 405434, 405433, 404038) then--10, 7.5, 5, 2.5 (405433 used on heroic AND normal, others used?)
self.vb.annihilatingCount = self.vb.annihilatingCount + 1
specWarnUmbralAnnihilation:Show(self.vb.annihilatingCount)
specWarnUmbralAnnihilation:Play("aesoon")
if self.vb.annihilatingCount >= 5 then--Still true?
timerUmbralAnnihilationCD:Start(10.9, self.vb.annihilatingCount+1)
else
timerUmbralAnnihilationCD:Start(29.2, self.vb.annihilatingCount+1)
end
elseif spellId == 407796 then
warnShadowShadowStrike:Show()
elseif spellId == 407936 then
self.vb.sunderRealityCount = self.vb.sunderRealityCount + 1
warnSunderReality:Show()
timerSunderRealityCD:Start(29.1, self.vb.sunderRealityCount+1)
elseif spellId == 407917 then
self.vb.ebonCount = self.vb.ebonCount + 1
warnEbonDestruction:Show(self.vb.ebonCount)
timerEbonDestructionCD:Start(nil, self.vb.ebonCount+1)
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(DBM_COMMON_L.NO_DEBUFF:format(realityName))
DBM.InfoFrame:Show(5, "playergooddebuff", 407919)
end
self:Unschedule(checkRealityOnSelf)
checkRealityOnSelf(self)
self:Schedule(4, checkRealityOnSelf, self)
elseif spellId == 407207 then
-- self:Unschedule(checkForSkippedDarkness)
self.vb.RushingDarknessCount = self.vb.RushingDarknessCount + 1
warnRushingDarkness:Show(self.vb.RushingDarknessCount)
-- self.vb.rushingIcon = 4
--As of May 23rd reset, stage 3 has a new darkness cast that causes the 17 second time between darkness 1 and 2 in stage 3
--As of May 30th reset, stage 3 no longer has new darkness that causes the 17 second time between darkness 1 and 2 in stage 3
--timerRushingDarknessCD:Start(self:GetStage(1) and 35.9 or ((self.vb.RushingDarknessCount == 1) and 17 or 29), self.vb.RushingDarknessCount+1)
timerRushingDarknessCD:Start(self:GetStage(1) and 35.9 or 29, self.vb.RushingDarknessCount+1)
if self:IsMythic() and self:GetStage(1) then--Mythic P1 only wall breaker strat used by all top guilds (which means everyone else will use it too and expect it in DBM)
self:BossTargetScanner(args.sourceGUID, "RushingDarknessTarget", 0.2, 8, true, nil, nil, nil, true)
end
elseif spellId == 409313 then--Intermission 1.5
specWarnRazetheEarth:Show()
specWarnRazetheEarth:Play("watchstep")
timerTwistedEarthCD:Stop()
timerEchoingFissureCD:Stop()
timerRushingDarknessCD:Stop()
timerCalamitousStrikeCD:Stop()
timerVolcanicHeartCD:Stop()
timerCorruptionCD:Start(14, 1)--Time to first debuffs
elseif spellId == 403057 then--Surrender To Corruption
self:SetStage(2)
warnPhase:Show(DBM_CORE_L.AUTO_ANNOUNCE_TEXTS.stage:format(2))
warnPhase:Play("ptwo")
self.vb.twistedEarthCount = 0
self.vb.volcanicCount = 0
self.vb.RushingDarknessCount = 0
timerSunderShadowCD:Start(14.8, 1)
timerVolcanicHeartCD:Start(20.7, 1)
timerUmbralAnnihilationCD:Start(25.1, 1)
timerRushingDarknessCD:Start(30.9, 1)
if self:IsHard() then
timerTwistedEarthCD:Start(self:IsMythic() and 41.5 or 71.5, 1)
end
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 407917 then
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
elseif spellId == 410968 then--Event is bugged, doesn't always fire
-- self.vb.volcIcon = 1
self.vb.volcanicCount = self.vb.volcanicCount + 1
warnVolcanicHeart:Show(self.vb.volcanicCount)
if self:GetStage(1) then
timerVolcanicHeartCD:Start(17, self.vb.volcanicCount+1)
else
--21.3, 15.7, 17.0, 17.0, 17.3, 16.7, 19.4, 14.5
self:Unschedule(fixBrokenHeartTimer)
local timer = volcanicP2Timers[self.vb.volcanicCount+1]
if timer then
timerVolcanicHeartCD:Start(timer, self.vb.volcanicCount+1)
self:Schedule(timer+5, fixBrokenHeartTimer, self)--Should only be needed for 5-6th cast, but letting it run for all for good measure
end
end
elseif args:IsSpellID(402902, 401480, 409241) and self:AntiSpam(5, 1) then--2 and 3 confirmed, 1 unknown
self.vb.twistedEarthCount = self.vb.twistedEarthCount + 1
if self.Options[specWarnTwistedEarth.option] then
specWarnTwistedEarth:Show(self.vb.twistedEarthCount)
specWarnTwistedEarth:Play("watchstep")
else
warnTwistedEarth:Show(self.vb.twistedEarthCount)
end
if self:IsMythic() then
if self.vb.phase == 1 then
local timer = mythicTwistedP1Timers[self.vb.twistedEarthCount+1]
if timer then
timerTwistedEarthCD:Start(timer, self.vb.twistedEarthCount+1)
end
else
local timer = mythicTwistedP2Timers[self.vb.twistedEarthCount+1]
if timer then
timerTwistedEarthCD:Start(timer, self.vb.twistedEarthCount+1)
end
end
else--Heroic
if self.vb.phase == 1 then
if spellId == 401480 then--first cast
timerTwistedEarthCD:Start(40, 2)
else
--2, 40, 36.4, 36.4
if self.vb.twistedEarthCount < 4 then--2 and 3
timerTwistedEarthCD:Start(36.4, self.vb.twistedEarthCount+1)
end
end
else
--71.5, 58.2
if self.vb.twistedEarthCount == 2 then
timerTwistedEarthCD:Start(58.2, self.vb.twistedEarthCount+1)
end
end
end
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 401998 and not args:IsPlayer() then
specWarnCalamitousStrikeSwap:Show(args.destName)
specWarnCalamitousStrikeSwap:Play("tauntboss")
--elseif spellId == 407182 then
-- local icon = self.vb.rushingIcon
-- if self.Options.SetIconOnRushingDarkness then
-- self:SetIcon(args.destName, icon)
-- end
-- if args:IsPlayer() then
-- specWarnRushingDarkness:Show()
-- specWarnRushingDarkness:Play("targetyou")
-- yellRushingDarkness:Yell(icon, icon)
-- yellRushingDarknessFades:Countdown(spellId, nil, icon)
-- end
-- warnRushingDarkness:CombinedShow(0.3, self.vb.RushingDarknessCount, args.destName)
-- self.vb.rushingIcon = self.vb.rushingIcon + 1
--elseif spellId == 410966 then
-- local icon = self.vb.volcIcon
-- if self.Options.SetIconOnVolcanicHeart then
-- self:SetIcon(args.destName, icon)
-- end
-- if args:IsPlayer() then
-- specWarnVolcanicHeart:Show()--DBM_COMMON_L.BREAK_LOS
-- if self:IsMythic() then
-- --Raid wide, must break LOS
-- specWarnVolcanicHeart:Play("breaklos")
-- else
-- --5 yard range, just spread
-- specWarnVolcanicHeart:Play("range5")
-- end
-- yellVolcanicHeart:Yell(icon, icon)
-- yellVolcanicHeartFades:Countdown(spellId, nil, icon)
-- end
-- warnVolcanicHeart:CombinedShow(0.3, self.vb.volcanicCount, args.destName)
-- self.vb.volcIcon = self.vb.volcIcon + 1
elseif spellId == 405484 then
if self:AntiSpam(5, 3) then
self.vb.corruptionCount = self.vb.corruptionCount + 1
timerCorruptionCD:Start(self.vb.corruptionCount == 1 and 45.4 or 43.4, self.vb.corruptionCount+1)
end
warnCorruption:CombinedShow(0.3, self.vb.corruptionCount, args.destName)
if args:IsPlayer() then
specWarnCorruption:Show()
specWarnCorruption:Play("targetyou")
yellCorruption:Yell()
end
elseif spellId == 407728 and not args:IsPlayer() then
specWarnSunderShadowSwap:Show(args.destName)
specWarnSunderShadowSwap:Play("tauntboss")
elseif spellId == 407919 and args:IsPlayer() then
playerReality = true
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 407088 and self:GetStage(3, 1) then
self:SetStage(3)
warnPhase:Show(DBM_CORE_L.AUTO_ANNOUNCE_TEXTS.stage:format(3))
warnPhase:Play("pthree")
self.vb.RushingDarknessCount = 0
self.vb.tankCount = 0
timerCorruptionCD:Stop()
timerUmbralAnnihilationCD:Stop()
timerSunderShadowCD:Stop()
timerRushingDarknessCD:Stop()
timerVolcanicHeartCD:Stop()
self:Unschedule(fixBrokenHeartTimer)
-- timerRushingDarknessCD:Start(10.8, 1)
-- self:Schedule(15.8, checkForSkippedDarkness, self)
timerSunderRealityCD:Start(19.5, 1)
timerRushingDarknessCD:Start(27, 1)
timerCalamitousStrikeCD:Start(36, 1)
timerEbonDestructionCD:Start(40.2, 1)
--elseif spellId == 407182 then
-- if self.Options.SetIconOnRushingDarkness then
-- self:SetIcon(args.destName, 0)
-- end
-- if args:IsPlayer() then
-- yellRushingDarknessFades:Cancel()
-- end
--elseif spellId == 410966 then
-- if self.Options.SetIconOnVolcanicHeart then
-- self:SetIcon(args.destName, 0)
-- end
-- if args:IsPlayer() then
-- yellVolcanicHeartFades:Cancel()
-- end
elseif spellId == 407919 and args:IsPlayer() then
playerReality = false
end
end
function mod:SPELL_AURA_REMOVED_DOSE(args)
local spellId = args.spellId
if spellId == 407088 then
warnHidden:Show(args.amount or 1)
end
end
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if (spellId == 409058 or spellId == 404277 or spellId == 409183) and destGUID == UnitGUID("player") and self:AntiSpam(2, 4) then
specWarnGTFO:Show(spellName)
specWarnGTFO:Play("watchfeet")
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 199233 then
warnHidden:Show()
end
end