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.

424 lines
14 KiB

local mod = DBM:NewMod(2009, "DBM-Raids-Legion", 1, 946)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240426185020")
mod:SetCreatureID(124158)--or 124158 or 125692
mod:SetEncounterID(2082)
--mod:SetBossHPInfoToHighest()
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8)
mod:SetHotfixNoticeRev(16961)
mod.respawnTime = 34.5
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 247376 247923 248068 248070 248254",
"SPELL_CAST_SUCCESS 247367 247552 247687 250255 254244",
"SPELL_AURA_APPLIED 247367 247565 247687 250255 250006 247641 255029",
"SPELL_AURA_APPLIED_DOSE 247367 247687 250255",
"SPELL_AURA_REMOVED 248233 250135 250006 255029",
-- "SPELL_PERIODIC_DAMAGE",
-- "SPELL_PERIODIC_MISSED",
"RAID_BOSS_WHISPER",
"RAID_TARGET_UPDATE",
"UNIT_SPELLCAST_SUCCEEDED boss1"
)
--TODO, Announce stacks of Gathering Power if relevant
--[[
(ability.id = 247376 or ability.id = 248068 or ability.id = 247923 or ability.id = 248070 or ability.id = 248254) and type = "begincast"
or (ability.id = 247367 or ability.id = 250255 or ability.id = 247552 or ability.id = 247687 or ability.id = 254244) and type = "cast"
or (ability.id = 248233 or ability.id = 250135) and (type = "applybuff" or type = "removebuff")
--]]
local warnPhase = mod:NewPhaseChangeAnnounce(2, nil, nil, nil, nil, nil, 2)
local berserkTimer = mod:NewBerserkTimer(420)
mod:AddRangeFrameOption("5/10")
--Stage One: Attack Force
local warnShocklance = mod:NewStackAnnounce(247367, 2, nil, "Tank")
local warnSleepCanister = mod:NewTargetAnnounce(247552, 2)
local warnSlumberGas = mod:NewTargetAnnounce(247565, 3)
local specWarnShocklance = mod:NewSpecialWarningTaunt(247367, nil, nil, nil, 1, 2)
local specWarnSleepCanister = mod:NewSpecialWarningYou(247552, nil, nil, nil, 1, 2)
local yellSleepCanister = mod:NewPosYell(247552, DBM_CORE_L.AUTO_YELL_CUSTOM_POSITION)
local yellSleepCanisterStun = mod:NewYell(255029, L.DispelMe)--Auto yell when safe to dispel (no players within 10 yards)
local specWarnSleepCanisterNear = mod:NewSpecialWarningClose(247552, nil, nil, nil, 1, 2)
local specWarnPulseGrenade = mod:NewSpecialWarningDodge(247376, nil, nil, nil, 1, 2)
local yellStasisTrap = mod:NewYell(247641, L.DispelMe)
local timerShocklanceCD = mod:NewCDTimer(4, 247367, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--4-5.1
local timerSleepCanisterCD = mod:NewCDTimer(11.3, 247552, nil, nil, nil, 3, nil, DBM_COMMON_L.MAGIC_ICON)--11.3-13.4
local timerPulseGrenadeCD = mod:NewCDTimer(17, 247376, nil, nil, nil, 3, nil, nil, nil, 1, 4)--17?
mod:AddSetIconOption("SetIconOnSleepCanister", 247552, true)
--Stage Two: Contract to Kill
local warnSever = mod:NewStackAnnounce(247687, 2, nil, "Tank")
local specWarnSever = mod:NewSpecialWarningTaunt(247687, nil, nil, nil, 1, 2)
local specWarnChargedBlastsUnknown = mod:NewSpecialWarningSpell(247716, nil, nil, nil, 2, 2)
local specWarnShrapnalBlast = mod:NewSpecialWarningDodge(247923, nil, nil, nil, 1, 2)
local timerSeverCD = mod:NewCDTimer(7.2, 247687, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
local timerChargedBlastsCD = mod:NewCDTimer(18.2, 247716, nil, nil, nil, 3, nil, nil, nil, 3, 4)
local timerShrapnalBlastCD = mod:NewCDCountTimer(13.3, 247923, nil, nil, nil, 3)
--Stage Three/Five: The Perfect Weapon
local warnEmpoweredPulseGrenade = mod:NewTargetAnnounce(250006, 3)
local specWarnEmpPulseGrenade = mod:NewSpecialWarningMoveAway(250006, nil, nil, nil, 1, 2)
local yellEmpPulseGrenade = mod:NewYell(250006)
mod:AddSetIconOption("SetIconOnEmpPulse2", 250006, false)
mod:AddInfoFrameOption(250006, true)
mod.vb.phase = 1
mod.vb.shrapnalCast = 0
mod.vb.empoweredPulseActive = 0
mod.vb.sleepCanisterIcon = 1
local mythicP5ShrapnalTimers = {15, 15.8, 14.5, 12, 10}--Doesn't seem right, seems health based?
local empoweredPulseTargets = {}
local debuffFilter
local playerSleepDebuff = false
do
debuffFilter = function(uId)
if DBM:UnitDebuff(uId, 250006) then
return true
end
end
end
local function updateRangeFrame(self)
if not self.Options.RangeFrame then return end
if playerSleepDebuff then
DBM.RangeCheck:Show(10)--There are no 15 yard items that are actually 15 yard, this will round to 18 :\
elseif DBM:UnitDebuff("player", 250006) then
DBM.RangeCheck:Show(5)
elseif self.vb.empoweredPulseActive > 0 then--Spread for Horn of Valor
DBM.RangeCheck:Show(5, debuffFilter)
else
DBM.RangeCheck:Hide()
end
end
local updateInfoFrame
do
local lines = {}
local sortedLines = {}
local function addLine(key, value)
-- sort by insertion order
lines[key] = value
sortedLines[#sortedLines + 1] = key
end
updateInfoFrame = function()
table.wipe(lines)
table.wipe(sortedLines)
for i = 1, #empoweredPulseTargets do
local name = empoweredPulseTargets[i]
addLine(name, i)
end
if #empoweredPulseTargets == 0 then--None found, hide infoframe because all broke
DBM.InfoFrame:Hide()
end
return lines, sortedLines
end
end
function mod:OnCombatStart(delay)
table.wipe(empoweredPulseTargets)
self.vb.phase = 1
self.vb.shrapnalCast = 0
self.vb.empoweredPulseActive = 0
self.vb.sleepCanisterIcon = 1
timerShocklanceCD:Start(4.2-delay)
timerSleepCanisterCD:Start(7-delay)
if not self:IsLFR() then--Don't seem to be in LFR
if self:IsMythic() then
timerPulseGrenadeCD:Start(12.5-delay)--14.2
berserkTimer:Start(480-delay)--8min
else
timerPulseGrenadeCD:Start(14.2-delay)--14.2
end
end
end
function mod:OnCombatEnd()
table.wipe(empoweredPulseTargets)
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 247376 or spellId == 248068 then
if spellId == 247376 then--Non Empowered
specWarnPulseGrenade:Show()
specWarnPulseGrenade:Play("watchstep")
timerPulseGrenadeCD:Start()
else--Empowered
if self.vb.phase == 5 then--Only happens on mythic and only phase where empowered isn't long cd
timerPulseGrenadeCD:Start(13.3)
else
timerPulseGrenadeCD:Start(25.5)
end
end
elseif spellId == 247923 or spellId == 248070 then
self.vb.shrapnalCast = self.vb.shrapnalCast + 1
specWarnShrapnalBlast:Show()
specWarnShrapnalBlast:Play("watchstep")
if self:IsMythic() then
if self.vb.phase == 2 then
timerShrapnalBlastCD:Start(16.4, self.vb.shrapnalCast+1)
elseif self.vb.phase == 3 then
timerShrapnalBlastCD:Start(14, self.vb.shrapnalCast+1)--14-15.8
elseif self.vb.phase == 4 then
timerShrapnalBlastCD:Start(26.7, self.vb.shrapnalCast+1)
elseif self.vb.phase == 5 then
local timer = mythicP5ShrapnalTimers[self.vb.shrapnalCast+1]
if timer then
timerShrapnalBlastCD:Start(timer, self.vb.shrapnalCast+1)
end
end
elseif spellId == 248070 then--Empowered (p3)
timerShrapnalBlastCD:Start(17, self.vb.shrapnalCast+1)--17-23
else
timerShrapnalBlastCD:Start(nil, self.vb.shrapnalCast+1)--13
end
elseif spellId == 248254 then
specWarnChargedBlastsUnknown:Show()
specWarnChargedBlastsUnknown:Play("farfromline")
if self:IsMythic() and self.vb.phase < 4 then
timerChargedBlastsCD:Start(13.4)
else
timerChargedBlastsCD:Start()--18.2
end
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 247367 or spellId == 250255 then
if spellId == 247367 or self:IsMythic() then
timerShocklanceCD:Start()
else--Empowered seems less often
timerShocklanceCD:Start(9.7)
end
elseif spellId == 247552 or spellId == 254244 then
if self:IsMythic() then
timerSleepCanisterCD:Start(11.3)
else
timerSleepCanisterCD:Start()--10.7
end
elseif spellId == 247687 then
timerSeverCD:Start()
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 247367 or spellId == 250255 then
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then
local amount = args.amount or 1
if spellId == 247367 and amount >= 4 then
local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId)
local remaining
if expireTime then
remaining = expireTime-GetTime()
end
if not UnitIsDeadOrGhost("player") and (not remaining or remaining and remaining < 4) then
specWarnShocklance:Show(args.destName)
specWarnShocklance:Play("tauntboss")
else
warnShocklance:Show(args.destName, amount)
end
else
warnShocklance:Show(args.destName, amount)
end
end
elseif spellId == 247687 then
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then
local amount = args.amount or 1
if amount >= 2 then
local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId)
local remaining
if expireTime then
remaining = expireTime-GetTime()
end
if not UnitIsDeadOrGhost("player") and (not remaining or remaining and remaining < 7) then
specWarnSever:Show(args.destName)
specWarnSever:Play("tauntboss")
else
warnSever:Show(args.destName, amount)
end
else
warnSever:Show(args.destName, amount)
end
end
elseif spellId == 255029 then--Sleep Canister Stun Effect
if args:IsPlayer() then
if self:CheckNearby(11) then
yellSleepCanisterStun:Yell()
end
elseif self:CheckNearby(10, args.destName) then--Warn nearby again
specWarnSleepCanisterNear:CombinedShow(0.3, args.destName)
specWarnSleepCanisterNear:Play("runaway")
end
elseif spellId == 247565 then
warnSlumberGas:CombinedShow(0.3, args.destName)
if args:IsPlayer() then
playerSleepDebuff = false
updateRangeFrame(self)
end
elseif spellId == 250006 then
self.vb.empoweredPulseActive = self.vb.empoweredPulseActive + 1
warnEmpoweredPulseGrenade:CombinedShow(0.3, args.destName)
if args:IsPlayer() then
specWarnEmpPulseGrenade:Show()
specWarnEmpPulseGrenade:Play("range5")
yellEmpPulseGrenade:Yell()
end
updateRangeFrame(self)
if not tContains(empoweredPulseTargets, args.destName) then
table.insert(empoweredPulseTargets, args.destName)
end
if self.Options.SetIconOnEmpPulse2 and #empoweredPulseTargets < 7 then
self:SetIcon(args.destName, #empoweredPulseTargets+2)
end
if self.Options.InfoFrame then
if #empoweredPulseTargets == 1 then
DBM.InfoFrame:SetHeader(args.spellName)
DBM.InfoFrame:Show(5, "function", updateInfoFrame, false, true, true)--No sort function, use icons, no onupdate
else
DBM.InfoFrame:Update()
end
end
elseif spellId == 247641 and args:IsPlayer() and (self:IsTank() or self:UnitClass() == "ROGUE") then
yellStasisTrap:Yell()
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if (spellId == 248233 or spellId == 250135) and not args:IsDestTypePlayer() then--Conflagration
self.vb.phase = self.vb.phase + 1
self.vb.shrapnalCast = 0
warnPhase:Show(DBM_CORE_L.AUTO_ANNOUNCE_TEXTS.stage:format(self.vb.phase))
if self.vb.phase == 2 then
warnPhase:Play("ptwo")
timerSeverCD:Start(6.6)--6.6-8.2
timerChargedBlastsCD:Start(8.4)
timerShrapnalBlastCD:Start(12, 1)
elseif self.vb.phase == 3 then
warnPhase:Play("pthree")
if self:IsMythic() then
timerShocklanceCD:Start(4)--NOT empowered
timerSleepCanisterCD:Start(7.9)
timerPulseGrenadeCD:Start(12.6)--Empowered
timerShrapnalBlastCD:Start(13.9, 1)--Empowered
else
timerShocklanceCD:Start(5)--Empowered
timerPulseGrenadeCD:Start(6.3)--Empowered
timerShrapnalBlastCD:Start(15.4, 1)--Empowered
end
elseif self.vb.phase == 4 then--Mythic Only
warnPhase:Play("pfour")
timerSeverCD:Start(7.5)
timerChargedBlastsCD:Start(9)
timerSleepCanisterCD:Start(12.5)
timerShrapnalBlastCD:Start(12.7, 1)--Empowered
elseif self.vb.phase == 5 then--Mythic Only (Identical to non mythic 3?)
warnPhase:Play("pfive")
timerShocklanceCD:Start(5)--Empowered
timerPulseGrenadeCD:Start(7)--Empowered
timerSleepCanisterCD:Start(12.9)
timerShrapnalBlastCD:Start(15.5, 1)--Empowered
end
elseif spellId == 250006 then
self.vb.empoweredPulseActive = self.vb.empoweredPulseActive - 1
tDeleteItem(empoweredPulseTargets, args.destName)
updateRangeFrame(self)
if self.Options.SetIconOnEmpPulse2 then
self:SetIcon(args.destName, 0)
end
if self.Options.InfoFrame then
DBM.InfoFrame:Update()
end
elseif spellId == 255029 then
if self.Options.SetIconOnSleepCanister then
self:SetIcon(args.destName, 0)
end
end
end
--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId)
if spellId == 228007 and destGUID == UnitGUID("player") and self:AntiSpam(2, 4) then
specWarnGTFO:Show()
specWarnGTFO:Play("runaway")
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--]]
function mod:RAID_BOSS_WHISPER(msg)
if msg:find("spell:254244") then
specWarnSleepCanister:Show()
specWarnSleepCanister:Play("runout")
playerSleepDebuff = true
updateRangeFrame(self)
end
end
function mod:RAID_TARGET_UPDATE()
if self.Options.InfoFrame then
DBM.InfoFrame:Update()
end
end
do
local playerName = UnitName("player")
local sleepCanister = DBM:GetSpellName(254244)
function mod:OnTranscriptorSync(msg, targetName)
if msg:find("spell:254244") then
targetName = Ambiguate(targetName, "none")
if self:AntiSpam(4, targetName) then
warnSleepCanister:CombinedShow(0.3, targetName)
if targetName == playerName then
local icon = self.vb.sleepCanisterIcon
yellSleepCanister:Yell(icon, sleepCanister, icon)
elseif self:CheckNearby(10, targetName) then
specWarnSleepCanisterNear:CombinedShow(0.3, targetName)
specWarnSleepCanisterNear:Play("runaway")
end
end
if self.Options.SetIconOnSleepCanister then
self:SetIcon(targetName, self.vb.sleepCanisterIcon)
end
self.vb.sleepCanisterIcon = self.vb.sleepCanisterIcon + 1
if self.vb.sleepCanisterIcon == 3 then
self.vb.sleepCanisterIcon = 1
end
end
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 248995 or spellId == 248194 then
timerSeverCD:Stop()
timerChargedBlastsCD:Stop()
timerShrapnalBlastCD:Stop()
timerPulseGrenadeCD:Stop()
timerSleepCanisterCD:Stop()
timerShocklanceCD:Stop()
warnPhase:Play("phasechange")
end
end