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
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
|
|
|