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.

360 lines
11 KiB

--------------------------------------------------------------------------------
-- TODO List:
-- - We can be a lot smarter with warnings - check which dragon is in range?
-- - Check Bellowing Roar for P3
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Dragons of Nightmare", 1520, 1704)
if not mod then return end
mod:RegisterEnableMob(
102679, -- Ysondre
102681, -- Taerar
102682, -- Lethon
102683 -- Emeriss
)
mod.engageId = 1854
mod.respawnTime = 40
--------------------------------------------------------------------------------
-- Locals
--
local dragonsOnGround = {
[102681] = nil, -- Taerar
[102682] = nil, -- Lethon
[102683] = nil, -- Emeriss
}
local markStacks = {
[203102] = 0, -- Mark of Ysondre
[203125] = 0, -- Mark of Emeriss
[203124] = 0, -- Mark of Lethon
[203121] = 0, -- Mark of Taerar
}
local mythicAdd = 1
local infectionMarkerCount = 1
--------------------------------------------------------------------------------
-- Initialization
--
local infectionMarker = mod:AddMarkerOption(false, "player", 1, 203787, 1, 2, 3, 4) -- Volatile Infection
function mod:GetOptions()
return {
--[[ General ]]--
{203028, "TANK"}, -- Corrupted Breath
-12809, -- Marks
"berserk",
--[[ Ysondre ]]--
207573, -- Call Defiled Spirit
{203770, "SAY"}, -- Defiled Vines
203147, -- Nightmare Blast
--[[ Emeriss ]]--
{203787, "PROXIMITY", "SAY"}, -- Volatile Infection
infectionMarker,
205298, -- Essence of Corruption
205300, -- Corruption
204245, -- Corruption of the Dream
--[[ Lethon ]]--
203888, -- Spihon Spirit
--???, -- Gloom
204040, -- Shadow Burst
--[[ Taerar ]]--
204100, -- Shades of Taerar
{204767, "TANK"}, -- Corrupted Breath (Shades)
205341, -- Seeping Fog
204078, -- Bellowing Roar
--[[ Mythic ]]--
-13460, -- Lumbering Mindgorger
},{
[203028] = "general",
[207573] = -12768, -- Ysondre
[203787] = -12770, -- Emeriss
[203888] = -12772, -- Lethon
[204100] = -12774, -- Taerar
[-13460] = "mythic",
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1", "boss2", "boss3", "boss4", "boss5")
--[[ General ]]--
self:Log("SPELL_AURA_APPLIED", "MarkApplied", 203102, 203125, 203124, 203121) -- Ysondre, Emeriss, Lethon, Taerar
self:Log("SPELL_AURA_APPLIED_DOSE", "MarkApplied", 203102, 203125, 203124, 203121) -- Ysondre, Emeriss, Lethon, Taerar
self:Log("SPELL_AURA_REMOVED", "MarkRemoved", 203102, 203125, 203124, 203121) -- Ysondre, Emeriss, Lethon, Taerar
self:Log("SPELL_CAST_START", "CorruptedBreath", 203028)
--[[ Ysondre ]]--
self:Log("SPELL_CAST_START", "CallDefiledSpiritCast", 207573)
self:Log("SPELL_AURA_APPLIED", "DefiledVines", 203770)
--[[ Emeriss ]]--
self:Log("SPELL_AURA_APPLIED", "VolatileInfection", 203787)
self:Log("SPELL_AURA_REMOVED", "VolatileInfectionRemoved", 203787)
self:Log("SPELL_CAST_SUCCESS", "EssenceOfCorruption", 205298)
self:Log("SPELL_CAST_START", "Corruption", 205300)
--[[ Lethon ]]--
self:Log("SPELL_CAST_SUCCESS", "SiphonSpirit", 203888)
self:Log("SPELL_AURA_APPLIED", "ShadowBurst", 204040)
--[[ Taerar ]]--
self:Log("SPELL_CAST_START", "ShadesOfTaerar", 204100)
self:Log("SPELL_CAST_START", "ShadeCorruptedBreath", 204767)
self:Log("SPELL_CAST_START", "BellowingRoar", 204078)
--[[ Mythic ]]--
self:Log("SPELL_AURA_APPLIED", "NightmareSouls", 214497) -- Add spawn
end
function mod:OnEngage()
dragonsOnGround = {
[102681] = nil, -- Taerar
[102682] = nil, -- Lethon
[102683] = nil, -- Emeriss
}
markStacks = {
[203102] = 0, -- Mark of Ysondre
[203125] = 0, -- Mark of Emeriss
[203124] = 0, -- Mark of Lethon
[203121] = 0, -- Mark of Taerar
}
mythicAdd = 1
infectionMarkerCount = 1
self:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT")
self:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
self:Bar(203028, 17) -- Corrupted Breath
self:Bar(207573, 30) -- Call Defiled Spirit
if self:Mythic() then
self:Bar(204078, 51) -- Bellowing Roar
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i = 1, 5 do
local guid = self:UnitGUID(("boss%d"):format(i))
if guid then
local id = self:MobId(guid)
if (id == 102681 or id == 102682 or id == 102683) and not dragonsOnGround[id] then
dragonsOnGround[id] = true
if id == 102681 then -- Taerar
--self:Bar(204100, ??) -- Shades of Taerar
self:StopBar(204078) -- Bellowing Roar
elseif id == 102682 then -- Lethon
self:Bar(203888, 25) -- Siphon Spirit
elseif id == 102683 then -- Emeriss
self:Bar(203787, 20) -- Volatile Infection
self:Bar(205298, 29) -- Essence of Corruption
end
end
end
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(_, unit, _, spellId)
if spellId == 204720 then -- Aerial
local id = self:MobId(self:UnitGUID(unit))
local name = self:UnitName(unit)
dragonsOnGround[id] = nil
self:StopBar(CL.other:format(name, self:SpellName(203028))) -- Corrupted Breath
if id == 102681 then -- Taerar
self:StopBar(204100) -- Shades of Taerar
self:StopBar(CL.other:format(self:SpellName(24313), self:SpellName(204767))) -- Shade: Corrupted Breath
if self:Mythic() then
self:Bar(204078, 40) -- Bellowing Roar, might be wrong
end
elseif id == 102682 then -- Lethon
self:StopBar(203888) -- Siphon Spirit
elseif id == 102683 then -- Emeriss
self:StopBar(203787) -- Volatile Infection
self:StopBar(205298) -- Essence of Corruption
end
elseif spellId == 203147 then -- Ysondre: Nightmare Blast
self:MessageOld(spellId, "red", "alert")
self:CDBar(spellId, 16)
elseif spellId == 205331 then -- Taerar: Seeping Fog
self:MessageOld(205341, "orange", "alarm")
elseif spellId == 205528 then -- Emeriss: Corruption of the Dream
self:MessageOld(204245, "yellow", "alarm")
end
end
--[[ General ]]--
function mod:MarkApplied(args)
if self:Me(args.destGUID) then
local amount = args.amount or 1
markStacks[args.spellId] = args.amount
if amount == 1 or amount > 6 then -- could need fine tuning
self:StackMessage(-12809, args.destName, amount, "red", "warning", args.spellName, args.spellId)
end
if amount > 1 then
self:StopBar(CL.count:format(args.spellName, amount-1), args.destName)
end
-- 203102 is Ysondre's on Normal & Mythic, 203125 is Emeriss' on Mythic
local _, _, duration = self:UnitDebuff("player", args.spellName, 203102, 203125)
self:TargetBar(-12809, duration or 35, args.destName, CL.count:format(args.spellName, amount), args.spellId)
end
end
function mod:MarkRemoved(args)
if self:Me(args.destGUID) then
self:MessageOld(-12809, "green", "info", CL.removed:format(args.spellName), args.spellId)
self:StopBar(CL.count:format(args.spellName, markStacks[args.spellId]), args.destName)
markStacks[args.spellId] = 0
end
end
do
local prev = 0
function mod:CorruptedBreath(args)
local t = GetTime()
self:MessageOld(args.spellId, "orange", t-prev > 0.5 and "info", CL.other:format(args.sourceName, args.spellName))
self:CDBar(args.spellId, 30, CL.other:format(args.sourceName, args.spellName))
prev = t
end
end
--[[ Ysondre ]]--
function mod:CallDefiledSpiritCast(args)
self:MessageOld(args.spellId, "red")
self:Bar(args.spellId, 33)
end
do
local scheduled, isOnMe = nil, nil
local function warn(self, spellId)
if not isOnMe then
self:MessageOld(spellId, "yellow", self:Dispeller("magic") and "alert")
end
scheduled = nil
isOnMe = nil
end
function mod:DefiledVines(args)
if not scheduled then
scheduled = self:ScheduleTimer(warn, 0.1, self, args.spellId)
end
if not isOnMe and self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue", "alarm")
self:Say(args.spellId)
isOnMe = true
end
end
end
--[[ Emeriss ]]--
do
local list = mod:NewTargetList()
function mod:VolatileInfection(args)
list[#list+1] = args.destName
if #list == 1 then
self:ScheduleTimer("TargetMessageOld", 0.1, args.spellId, list, "yellow", "alert", nil, nil, self:Dispeller("magic"))
self:Bar(args.spellId, 45)
end
if self:GetOption(infectionMarker) then
self:CustomIcon(false, args.destName, infectionMarkerCount)
infectionMarkerCount = infectionMarkerCount + 1
if infectionMarkerCount > 4 then infectionMarkerCount = 1 end
end
if self:Me(args.destGUID) then
self:Say(args.spellId)
self:OpenProximity(args.spellId, 10)
self:TargetBar(args.spellId, 90, args.destName)
end
end
end
function mod:VolatileInfectionRemoved(args)
if self:Me(args.destGUID) then
self:CloseProximity(args.spellId)
self:StopBar(args.spellId, args.destName)
end
if self:GetOption(infectionMarker) then
self:CustomIcon(false, args.destName)
end
end
function mod:EssenceOfCorruption(args)
self:MessageOld(args.spellId, "yellow", "long")
self:Bar(args.spellId, 30)
end
do
local prev = 0
function mod:Corruption(args)
local t = GetTime()
if t-prev > 1.5 then
self:MessageOld(args.spellId, "yellow", "info", CL.casting:format(args.spellName))
self:Bar(args.spellId, 15)
prev = t
end
end
end
--[[ Lethon ]]--
function mod:SiphonSpirit(args)
self:MessageOld(args.spellId, "red", "alert")
self:Bar(args.spellId, 49.5)
end
function mod:ShadowBurst(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue", "warning")
self:TargetBar(args.spellId, 10, args.destName)
end
end
--[[ Taerar ]]--
function mod:ShadesOfTaerar(args)
self:MessageOld(args.spellId, "orange", "long", CL.incoming:format(args.spellName))
self:Bar(args.spellId, 49)
end
do
local prev = 0
function mod:ShadeCorruptedBreath(args)
local t = GetTime()
if t-prev > 1.5 then
self:MessageOld(args.spellId, "yellow", t-prev > 0.5 and "long", CL.other:format(args.sourceName, args.spellName)) -- "Shade" instead of "Shade of Taerar"
self:CDBar(args.spellId, 17, CL.other:format(self:SpellName(24313), args.spellName))
prev = t
end
end
end
function mod:BellowingRoar(args)
self:MessageOld(args.spellId, "red", "alarm", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 6)
self:Bar(args.spellId, 51)
end
--[[ Mythic ]]--
function mod:NightmareSouls()
local spell = mythicAdd == 1 and 214610 or mythicAdd == 2 and 214588 or 214604 -- Dream Essence: Hinterlands / Ashenvale / Feralas
local percentage = mythicAdd == 1 and "90% - " or mythicAdd == 2 and "60% - " or "30% - "
self:MessageOld(-13460, "cyan", "long", percentage .. self:SpellName(spell), spell)
mythicAdd = mythicAdd + 1
end