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.

285 lines
10 KiB

local mod = DBM:NewMod(2409, "DBM-Party-Shadowlands", 7, 1188)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240629024545")
mod:SetCreatureID(164555, 164556)
mod:SetEncounterID(2394)
mod:SetBossHPInfoToHighest()
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 320008 320787 320141 320168 321061 320132 320823",
"SPELL_CAST_SUCCESS 324047 320132",
"SPELL_AURA_APPLIED 320786 320147 323877 342905",
"SPELL_AURA_APPLIED_DOSE 320786 320147",
"SPELL_AURA_REMOVED 320786 342905",
"SPELL_AURA_REMOVED_DOSE 320786"
-- "SPELL_PERIODIC_DAMAGE",
-- "SPELL_PERIODIC_MISSED",
-- "UNIT_DIED"
-- "UNIT_SPELLCAST_SUCCEEDED boss1 boss2"
)
--TODO, find a good stack count to warn for soaking.
--TODO, timer for any of buzz saws or warnings for them? It just seems like something that is spammed so for now they are excluded
--TODO, review some of normal warnings if they need to be special
--TODO, shadowfury has splash damage and stun, so figure out how to direct ONE player to hit millificent with it, not all of them
--[[
(ability.id = 320787 or ability.id = 320132 or ability.id = 320823 or ability.id = 320141 or ability.id = 321061) and type = "begincast"
or ability.id = 324047 and type = "cast"
or ability.id = 342905
--]]
--General
--local specWarnGTFO = mod:NewSpecialWarningGTFO(257274, nil, nil, nil, 1, 8)
local timerPhaseCD = mod:NewStageTimer(30)
--Stage One: Millhouse's Magics
mod:AddTimerLine(DBM:EJ_GetSectionInfo(22026))
local warnSummonPowerCrystal = mod:NewSpellAnnounce(320787, 3)
local warnThrowBuzzSaw = mod:NewSpellAnnounce(320168, 3, nil, false)
local warnBleeding = mod:NewStackAnnounce(320147, 2, nil, "Tank|Healer")
local specWarnDoom = mod:NewSpecialWarningSpell(320141, nil, 226243, nil, 2, 2, 4)--Mythic only
local specWarnFrostbolt = mod:NewSpecialWarningInterruptCount(320008, "HasInterrupt", nil, nil, 1, 2)
local specWarnBleeding = mod:NewSpecialWarningStack(320147, nil, 12, nil, nil, 1, 6)
local specWarnLaser = mod:NewSpecialWarningMoveTo(323877, nil, 182908, nil, 2, 8, 4)--Mythic only
local yellLaser = mod:NewYell(323877)
local timerSummonPowerCrystalCD = mod:NewCDTimer(7.4, 320787, nil, nil, nil, 5)--Usually 8 (sometimes a cast is skipped if it perfectly lines up with a laser, do to this variation
local timerDoomCD = mod:NewNextTimer(15.8, 320141, 226243, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)--Shortname Doom!!!
local timerLaserCD = mod:NewNextCountTimer(15, 323877, 182908, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)--Shortname Laser
mod:AddInfoFrameOption(320786, true)
--Stage Two: Millificent's Gadgets
mod:AddTimerLine(DBM:EJ_GetSectionInfo(21798))
--local warnMechanicalBombSquirrel = mod:NewSpellAnnounce(320825, 3)--Spammed
local specWarnAerialRocketChicken = mod:NewSpecialWarningDefensive(321061, nil, 45255, nil, 2, 2, 4)--Mythic only
local specWarnShadowfury = mod:NewSpecialWarningMoveTo(320132, nil, nil, nil, 2, 8, 4)--Mythic only
--local timerMechanicalBombSquirrelCD = mod:NewCDTimer(13, 320825, nil, nil, nil, 3)
local timerExperimentalSquirrelBombCD = mod:NewCDTimer(7.9, 320823, nil, nil, nil, 5)
local timerAerialRocketChickenCD = mod:NewNextTimer(13, 321061, 45255, nil, nil, 3)--Shortname Rocket Chicken
local timerShadowfuryCD = mod:NewNextCountTimer(13, 320132, nil, nil, nil, 3)
mod:AddRangeFrameOption(8, 320132)
local millHouse, millificent = DBM:EJ_GetSectionInfo(22027), DBM:EJ_GetSectionInfo(22031)
local VulnerabilityStacks = {}
mod.vb.furyCount = 0
mod.vb.laserCount = 0
mod.vb.interruptCount = 0
mod.vb.activeBoss = 1--1-Millhouse, 2-Millificent
function mod:OnCombatStart(delay)
table.wipe(VulnerabilityStacks)
self.vb.activeBoss = 1
--First timers triggered on chilled heart event
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(DBM:GetSpellName(320786))
DBM.InfoFrame:Show(5, "table", VulnerabilityStacks, 1)
end
end
function mod:OnCombatEnd()
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 320787 then
warnSummonPowerCrystal:Show()
timerSummonPowerCrystalCD:Start()
elseif spellId == 320008 and self.vb.activeBoss == 1 then
self.vb.interruptCount = self.vb.interruptCount + 1
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
local count = self.vb.interruptCount
specWarnFrostbolt:Show(args.sourceName, count)
if count == 1 then
specWarnFrostbolt:Play("kick1r")
elseif count == 2 then
specWarnFrostbolt:Play("kick2r")
elseif count == 3 then
specWarnFrostbolt:Play("kick3r")
elseif count == 4 then
specWarnFrostbolt:Play("kick4r")
elseif count == 5 then
specWarnFrostbolt:Play("kick5r")
else
specWarnFrostbolt:Play("kickcast")
end
end
elseif spellId == 320141 then
specWarnDoom:Show()
specWarnDoom:Play("aesoon")
-- timerDoomCD:Start()--Not cast more than once per rotation
elseif spellId == 320168 then
warnThrowBuzzSaw:Show()
-- elseif spellId == 320825 and self:AntiSpam(5, 3) then
-- warnMechanicalBombSquirrel:Show()
-- timerMechanicalBombSquirrelCD:Start()
elseif spellId == 321061 then
specWarnAerialRocketChicken:Show()
specWarnAerialRocketChicken:Play("defensive")
-- timerAerialRocketChickenCD:Start()--Not cast more than once per rotation
elseif spellId == 320132 then
self.vb.furyCount = self.vb.furyCount + 1
specWarnShadowfury:Show(millificent)
specWarnShadowfury:Play("behindboss")
local timer = self.vb.furyCount == 1 and 15 or self.vb.furyCount == 2 and 11 or 8--8 is guessed, since these timers were nerfed to match milhouse
timerShadowfuryCD:Start(timer, self.vb.furyCount+1)
if self.Options.RangeFrame then
DBM.RangeCheck:Show(8)
end
elseif spellId == 320823 then
timerExperimentalSquirrelBombCD:Start()
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 324047 then
self.vb.laserCount = self.vb.laserCount
local timer = self.vb.laserCount == 1 and 15 or self.vb.laserCount == 2 and 12 or 8--8 is guessed based on pattern of other boss
timerLaserCD:Start(timer, self.vb.laserCount+1)
elseif spellId == 320132 then
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 320786 then
local amount = args.amount or 1
VulnerabilityStacks[args.destName] = amount
--if args:IsPlayer() and (amount == 12 or amount >= 15 and amount % 2 == 1) then--12, 15, 17, 19
-- specWarnVulnerabilityStack:Show(amount)
-- specWarnVulnerabilityStack:Play("stackhigh")
--end
if self.Options.InfoFrame then
DBM.InfoFrame:UpdateTable(VulnerabilityStacks)
end
elseif spellId == 320147 then
local amount = args.amount or 1
if amount >= 12 then--Guesswork
if args:IsPlayer() then
specWarnBleeding:Show(amount)
specWarnBleeding:Play("stackhigh")
else
warnBleeding:Show(args.destName, amount)
end
end
elseif spellId == 323877 then
if args:IsPlayer() then
specWarnLaser:Show(millHouse)
specWarnLaser:Play("behindboss")
end
elseif spellId == 342905 then--Millhouse activating
self.vb.activeBoss = 1
self.vb.laserCount = 0
self.vb.interruptCount = 0
timerExperimentalSquirrelBombCD:Stop()
timerAerialRocketChickenCD:Stop()
timerShadowfuryCD:Stop()
timerSummonPowerCrystalCD:Start(5.9)
if self:IsMythic() then
timerLaserCD:Start(22, 1)
timerDoomCD:Start(45.5)
--timerPhaseCD:Start(51.2)--Boss pushes when hit with other bosses ability 3x, this is roughly 51-52 if you don't screw up
else
timerPhaseCD:Start(30)--Non mythic is just timer, no shadowfury or lasers to push boss
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 320786 then
VulnerabilityStacks[args.destName] = nil
if self.Options.InfoFrame then
DBM.InfoFrame:UpdateTable(VulnerabilityStacks)
end
elseif spellId == 342905 then--Millhouse Leaving
self.vb.activeBoss = 2
self.vb.furyCount = 0
self.vb.interruptCount = 0
timerSummonPowerCrystalCD:Stop()
timerDoomCD:Stop()
timerLaserCD:Stop()
timerExperimentalSquirrelBombCD:Start(8.5)
if self:IsMythic() then
timerShadowfuryCD:Start(18, 1)
timerAerialRocketChickenCD:Start(43)
--timerPhaseCD:Start(51.2)--Boss pushes when hit with other bosses ability 3x, this is roughly 51-52 if you don't screw up
else
--On non mythic they swap on a timer, on mythic they seem to swap based on pushing phase with damage? saw pushes between 52.8 and 65
timerPhaseCD:Start(30)
end
end
end
function mod:SPELL_AURA_REMOVED_DOSE(args)
local spellId = args.spellId
if spellId == 320786 then
VulnerabilityStacks[args.destName] = args.amount or 1
if self.Options.InfoFrame then
DBM.InfoFrame:UpdateTable(VulnerabilityStacks)
end
end
end
--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if spellId == 309991 and destGUID == UnitGUID("player") and self:AntiSpam(2, 2) 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 == 164555 then
elseif cid == 164556 then
end
end
--No longer needed now that chilled heart was added to combat log. Keeping around as backup just in case though
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if self.vb.activeBoss == 1 and (spellId == 326804 or spellId == 326684) then--Teleport (326684) no longer seems used, using Millificent's returning rocket jump ID (326804) instead
self.vb.activeBoss = 2
timerSummonPowerCrystalCD:Stop()
timerDoomCD:Stop()
timerLaserCD:Stop()
timerExperimentalSquirrelBombCD:Start(6)
if self:IsMythic() then
timerShadowfuryCD:Start(17.6)
timerAerialRocketChickenCD:Start(40.5)
end
timerPhaseCD:Start(30)
elseif self.vb.activeBoss == 2 and spellId == 326799 then--Rocket Jump (unique spell for Millificent leaving) (not to be confused with 326804)
self.vb.activeBoss = 1
timerExperimentalSquirrelBombCD:Stop()
timerAerialRocketChickenCD:Stop()
timerShadowfuryCD:Stop()
timerSummonPowerCrystalCD:Start(7)
if self:IsMythic() then
timerLaserCD:Start(18.8)
timerDoomCD:Start(42.3)
end
timerPhaseCD:Start(30)
end
end
--]]