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.

240 lines
7.0 KiB

--------------------------------------------------------------------------------
-- TODO List:
-- - Get/Confirm timers for all difficulties on live
-- LFR (✘) - Normal (✘) - Heroic (✔) - Mythic (✘)
--
-- - Rot: CD is 15.8s - sometimes gets delayed, then its ~24s, no idea why
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Nythendra", 1520, 1703)
if not mod then return end
mod:RegisterEnableMob(102672)
mod.engageId = 1853
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local rotCount = 1
local myInfestedStacks = 0
local infestedStacks = {}
--------------------------------------------------------------------------------
-- Initialization
--
local rotMarker = mod:AddMarkerOption(false, "player", 1, 203096, 1, 2, 3, 4, 5) -- Rot
function mod:GetOptions()
return {
--[[ General ]]--
202977, -- Infested Breath
{203096, "SAY", "SAY_COUNTDOWN", "FLASH", "PROXIMITY"}, -- Rot
rotMarker,
{204463, "SAY", "FLASH", "ICON"}, -- Volatile Rot
203552, -- Heart of the Swarm
203045, -- Infested Ground
"berserk",
--[[ Mythic ]]--
{204504, "INFOBOX"}, -- Infested
{225943, "SAY", "FLASH"}, -- Infested Mind
205070, -- Spread Infestation
},{
[202977] = "general",
[204504] = "mythic",
}
end
function mod:OnBossEnable()
--[[ General ]]--
self:RegisterUnitEvent("UNIT_SPELLCAST_START", nil, "boss1")
self:Log("SPELL_AURA_APPLIED", "Rot", 203096)
self:Log("SPELL_AURA_REMOVED", "RotRemoved", 203096)
self:Log("SPELL_AURA_APPLIED", "VolatileRot", 204463)
self:Log("SPELL_AURA_REMOVED", "VolatileRotRemoved", 204463)
self:Log("SPELL_CAST_START", "HeartOfTheSwarm", 203552)
self:Log("SPELL_AURA_APPLIED", "InfestedGroundDamage", 203045)
self:Log("SPELL_PERIODIC_DAMAGE", "InfestedGroundDamage", 203045)
self:Log("SPELL_PERIODIC_MISSED", "InfestedGroundDamage", 203045)
--[[ Mythic ]]--
self:Log("SPELL_AURA_APPLIED_DOSE", "Infested", 204504) -- also on hc, but i don't think it's relevant there
self:Log("SPELL_AURA_REMOVED", "InfestedRemoved", 204504)
self:Log("SPELL_CAST_START", "InfestedMindCast", 225943)
end
function mod:OnEngage()
rotCount = 1
myInfestedStacks = 0
infestedStacks = {}
self:Berserk(self:Normal() and 600 or 480) -- Can be delayed by 2nd phase
self:CDBar(203096, 5.8) -- Rot
self:CDBar(204463, 22.8) -- Volatile Rot
self:CDBar(202977, 37) -- Infested Breath
self:CDBar(203552, 90) -- Heart of the Swarm
if self:Mythic() then
self:OpenInfo(204504, self:SpellName(204504)) -- Infested
self:Bar(225943, 49) -- Infested Mind
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_SPELLCAST_START(_, _, _, spellId)
if spellId == 202977 then -- Infested Breath
self:MessageOld(spellId, "orange", "alarm", CL.casting:format(self:SpellName(spellId)))
self:CastBar(spellId, 8) -- 3s cast time + 5s channel
if self:BarTimeLeft(203552) > 37 then -- Heart of the Swarm
self:CDBar(spellId, 37)
end
end
end
do
local playerList, proxList, isOnMe = mod:NewTargetList(), {}, nil
function mod:Rot(args)
if self:Me(args.destGUID) then
isOnMe = true
self:Flash(args.spellId)
self:Say(args.spellId)
self:TargetBar(args.spellId, 9, args.destName)
self:OpenProximity(args.spellId, 10)
self:SayCountdown(args.spellId, 9)
end
proxList[#proxList+1] = args.destName
if not isOnMe then
self:OpenProximity(args.spellId, 10, proxList)
end
if self:GetOption(rotMarker) then
self:CustomIcon(false, args.destName, #proxList)
end
playerList[#playerList+1] = args.destName
if #playerList == 1 then
self:ScheduleTimer("TargetMessageOld", 0.1, args.spellId, playerList, "red", "warning")
rotCount = rotCount + 1
if self:BarTimeLeft(203552) > 15.9 then -- Heart of the Swarm
self:Bar(args.spellId, 15.9)
end
end
end
function mod:RotRemoved(args)
if self:Me(args.destGUID) then
isOnMe = nil
self:StopBar(args.spellName, args.destName)
self:CloseProximity(args.spellId)
self:CancelSayCountdown(args.spellId)
end
if self:GetOption(rotMarker) then
self:CustomIcon(false, args.destName)
end
tDeleteItem(proxList, args.destName)
if not isOnMe then -- Don't change proximity if it's on you and expired on someone else
if #proxList == 0 then
self:CloseProximity(args.spellId)
else
self:OpenProximity(args.spellId, 10, proxList)
end
end
end
end
function mod:VolatileRot(args)
if self:Me(args.destGUID) then
self:Say(args.spellId)
self:Flash(args.spellId)
end
self:PrimaryIcon(args.spellId, args.destName)
self:TargetMessageOld(args.spellId, args.destName, "orange", "warning", nil, nil, self:Tank())
self:TargetBar(args.spellId, 8, args.destName)
if self:BarTimeLeft(203552) > 23 then -- Heart of the Swarm
self:CDBar(args.spellId, 23)
end
end
function mod:VolatileRotRemoved(args)
self:PrimaryIcon(args.spellId)
end
function mod:HeartOfTheSwarm(args)
self:MessageOld(args.spellId, "cyan", "info", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 23.7) -- 3.7s cast time + 20s channel
-- This is basically a phase, so start timers for next "normal" phase here
self:CDBar(args.spellId, 120)
self:CDBar(203096, 36.5) -- Rot, 23.7 + 12.8
self:CDBar(204463, 52.7) -- Volatile Rot, 23.7 + 29
self:CDBar(202977, 68) -- Infested Breath, 23.7 + 44.3
if self:Mythic() then
self:CDBar(225943, 80) -- Infested Mind
end
rotCount = 1
end
do
local prev = 0
function mod:InfestedGroundDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(args.spellId, "blue", "alert", CL.underyou:format(args.spellName))
end
end
end
do
local prev = 0
function mod:Infested(args)
if self:Mythic() then
infestedStacks[args.destName] = args.amount
if self:Me(args.destGUID) then
if args.amount > 6 and args.amount < 11 then -- be careful at 7-9, at 10 you're getting mc'd
self:StackMessage(args.spellId, args.destName, args.amount, "blue", "warning")
end
myInfestedStacks = args.amount
end
local t = GetTime()
if t-prev > 2 then
prev = t
self:SetInfoByTable(args.spellId, infestedStacks)
end
end
end
end
function mod:InfestedRemoved(args)
if self:Mythic() then
infestedStacks[args.destName] = nil
if self:Me(args.destGUID) then
myInfestedStacks = 0
end
end
end
function mod:InfestedMindCast(args)
if myInfestedStacks > 9 then
self:MessageOld(args.spellId, "blue", "long", CL.you:format(args.spellName))
self:Flash(args.spellId)
self:Say(args.spellId)
else
self:MessageOld(args.spellId, "yellow", "long", CL.incoming:format(args.spellName))
end
self:CastBar(args.spellId, 3)
if self:BarTimeLeft(203552) > 36 then -- Heart of the Swarm
self:CDBar(args.spellId, 36)
end
end