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.

798 lines
28 KiB

--------------------------------------------------------------------------------
-- TODO:
-- -- Stage 2
-- -- Sylvanas abilities when weakened
-- -- Mark Terror Orb with skull (Mythic)
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Sylvanas Windrunner", 2450, 2441)
if not mod then return end
mod:RegisterEnableMob(175732) -- Sylvanas Windrunner
mod:SetEncounterID(2435)
mod:SetRespawnTime(30)
mod:SetStage(1)
--------------------------------------------------------------------------------
-- Locals
--
local windrunnerCount = 1
local dominationChainsCount = 1
local veilofDarknessCount = 1
local wailingArrowCount = 1
local riveCount = 1
local bansheeWailCount = 1
local ruinCount = 1
local hauntingWaveCount = 1
local bansheesBaneCount = 1
local bansheeScreamCount = 1
local razeCount = 1
local bansheesFuryCount = 1
local rangerHeartSeekerCount = 1
local intermission = false
local bansheeShroudRemovedCount = 1
local baneArrowsCount = 1
local rangersHeartSeekerTimers = {20.5, 19.9, 16.5, 30.0, 5.9, 32.2, 16.1, 12.0, 26.2, 25.1}
local windrunnerTimers = {7.5, 51.1, 49.5, 49.0, 53.5}
local stageThreeTimersHeroic = {
[354068] = {22.1, 49.5, 49.3, 53, 47.8}, -- Banshee's Fury
[354011] = {34.2, 76.8, 73.2, 76.7}, -- Bane Arrows
[353969] = {40.3, 20.5, 50.5, 3.0, 16.5, 21.3, 32, 12.0, 14.1, 18.9, 31.7}, -- Banshee's Heartseeker
[354142] = {46, 61.4, 51, 58.4}, -- Veil of Darkness
[347609] = {78.5, 3, 3, 49.8, 3, 3, 47.6, 3, 3, 49.6, 3, 3}, -- Wailing Arrow
[354147] = {87.6, 73.6, 72.3}, -- Raze
[353952] = {98.2, 47.4, 54.9, 52.6}, -- Banshee Scream
}
local stageThreeTimersMythic = {
[354011] = {19.5, 42.5}, -- Bane Arrows
[347609] = {49.5, 63.4}, -- Wailing Arrow
[354068] = {65.5}, -- Banshee's Fury
[353952] = {27.5}, -- Banshee Scream
[354147] = {71.5}, -- Raze
[354142] = {46, 46, 46}, -- Veil of Darkness
[353969] = {37, 39.6, 5.9}, -- Banshee's Heartseeker
}
local stageThreeTimers = mod:Mythic() and stageThreeTimersMythic or stageThreeTimersHeroic
local deathKnivesCount = 1
local mercilessCount = 1
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.chains_active = "Chains Active"
L.chains_active_desc = "Show a bar for when the Chains of Domination activate"
L.chains_active_icon = 349458
L.chains_active_bartext = "%d Active" -- Chains Active
L.custom_on_nameplate_fixate = "Fixate Nameplate Icon"
L.custom_on_nameplate_fixate_desc = "Show an icon on the nameplate of Dark Sentinels that are fixed on you.\n\nRequires the use of Enemy Nameplates and a supported nameplate addon (KuiNameplates, Plater)."
L.custom_on_nameplate_fixate_icon = 358711
L.chains = "Chains" -- Short for Domination Chains
L.chain = "Chain" -- Single Domination Chain
L.darkness = "Veil" -- Short for Veil of Darkness
L.arrow = "Arrow" -- Short for Wailing Arrow
L.wave = "Wave" -- Short for Haunting Wave
L.dread = "Dread" -- Short for Crushing Dread
L.orbs = "Orbs" -- Dark Communion
L.curse = "Curse" -- Short for Curse of Lethargy
L.pools = "Pools" -- Banshee's Bane
L.scream = "Scream" -- Banshee Scream
L.knife_fling = "Knives out!" -- "Death-touched blades fling out"
end
--------------------------------------------------------------------------------
-- Initialization
--
local wailingArrowMarker = mod:AddMarkerOption(false, "player", 1, 347609, 1, 2, 3) -- Wailing Arrow
local expulsionMarker = mod:AddMarkerOption(false, "player", 1, 351562, 1, 2, 3, 4, 5, 6) -- Expulsion
function mod:GetOptions()
return {
-- General
"stages",
-- Stage One: A Cycle of Hatred
347504, -- Windrunner
347807, -- Barbed Arrow
356377, -- Desecrating Shot
347670, -- Shadow Dagger
{349458, "ME_ONLY_EMPHASIZE"}, -- Domination Chains
"chains_active",
347704, -- Veil of Darkness
{347609, "SAY", "SAY_COUNTDOWN", "ME_ONLY_EMPHASIZE"}, -- Wailing Arrow
wailingArrowMarker,
{352650, "TANK"}, -- Ranger's Heartseeker
{347607, "TANK"}, -- Banshee's Mark
-- Intermission: A Monument to our Suffering
353417, -- Rive
348109, -- Banshee Wail
-- Stage Two: The Banshee Queen
350857, -- Banshee Shroud
355540, -- Ruin
351869, -- Haunting Wave
{351180, "TANK"}, -- Lashing Wound
351117, -- Crushing Dread
351353, -- Summon Decrepit Orbs
351939, -- Curse of Lethargy
{351672, "TANK"}, -- Fury
-- Stage Three: The Freedom of Choice
353929, -- Banshee's Bane
354011, -- Bane Arrows
{353965, "TANK"}, -- Banshee's Heartseeker
354068, -- Banshee's Fury
353952, -- Banshee Scream
354147, -- Raze
-- Mythic
{358704, "SAY", "SAY_COUNTDOWN", "ME_ONLY_EMPHASIZE"}, -- Black Arrow
358711, -- Rage
"custom_on_nameplate_fixate",
356021, -- Dark Communion (Mawforged Summoner)
351591, -- Filth (Mawforged Colossus)
{351562, "SAY", "SAY_COUNTDOWN"}, -- Expulsion (Mawforged Colossus)
expulsionMarker,
358185, -- Banshee's Weapons
358181, -- Banshee's Blades
{358434, "SAY", "SAY_COUNTDOWN"}, -- Death Knives
358588, -- Merciless
},{
["stages"] = "general",
[347504] = -23057, -- Stage One: A Cycle of Hatred
[348145] = -22891, -- Intermission: A Monument to our Suffering
[350857] = -23067, -- Stage Two: The Banshee Queen
[353929] = -22890, -- Stage Three: The Freedom of Choice
[358704] = "mythic",
},{
[349458] = L.chains, -- Domination Chains (Chains)
[347704] = L.darkness, -- Veil of Darkness (Darkness)
[347609] = L.arrow, -- Wailing Arrow (Arrow)
[358704] = L.arrow, -- Black Arrow (Arrow)
[351117] = L.dread, -- Crushing Dread (Dread)
[351353] = L.orbs, -- Summon Decrepit Orbs
[356021] = L.orbs, -- Dark Communion (Orbs)
[351939] = L.curse, -- Curse of Lethargy (Curse)
[353929] = L.pools, -- Banshee's Bane (Pools)
[357720] = L.scream, -- Banshee Scream
}
end
function mod:OnBossEnable()
-- Mythic
self:Log("SPELL_AURA_APPLIED", "RageApplied", 358711) -- Dark Sentinel Fixate
self:Log("SPELL_AURA_REMOVED", "RageRemoved", 358711)
self:Log("SPELL_CAST_START", "DarkCommunion", 356021)
self:Log("SPELL_CAST_SUCCESS", "Filth", 351589)
self:Log("SPELL_AURA_APPLIED", "FilthApplied", 351591)
self:Log("SPELL_AURA_APPLIED", "ExpulsionApplied", 351562)
self:Log("SPELL_AURA_REMOVED", "ExpulsionRemoved", 351562)
self:Death("ColossusDeath", 177893) -- Mawforged Colossus
self:Log("SPELL_AURA_APPLIED", "BansheesWeaponsApplied", 358185)
self:Log("SPELL_AURA_APPLIED_DOSE", "BansheesWeaponsApplied", 358185)
self:Log("SPELL_CAST_START", "BansheesBlades", 358181)
self:Log("SPELL_AURA_APPLIED", "DeathKnivesApplied", 358434)
self:Log("SPELL_AURA_REMOVED", "DeathKnivesRemoved", 358434)
self:Log("SPELL_CAST_SUCCESS", "Merciless", 358588)
-- Stage One: A Cycle of Hatred
self:Log("SPELL_AURA_APPLIED", "Windrunner", 347504)
self:Log("SPELL_AURA_APPLIED", "BarbedArrowApplied", 347807)
self:Log("SPELL_AURA_APPLIED_DOSE", "BarbedArrowApplied", 347807)
self:Log("SPELL_DAMAGE", "DesecratingShotDamage", 356377)
self:Log("SPELL_AURA_APPLIED", "ShadowDaggerApplied", 347670)
self:Log("SPELL_CAST_START", "DominationChains", 349419)
self:Log("SPELL_AURA_APPLIED", "DominationChainsApplied", 349458)
self:Log("SPELL_CAST_START", "VeilOfDarkness", 347726, 347741, 354142) -- Stage 1, Stage 2, Stage 3
self:Log("SPELL_AURA_APPLIED", "VeilOfDarknessApplied", 347704)
self:Log("SPELL_AURA_APPLIED_DOSE", "VeilOfDarknessApplied", 347704)
self:Log("SPELL_CAST_START", "WailingArrow", 347609, 358704) -- Wailing Arrow, Black Arrow (Mythic)
self:Log("SPELL_AURA_APPLIED", "WailingArrowApplied", 347609, 358704)
self:Log("SPELL_AURA_REMOVED", "WailingArrowRemoved", 347609, 358704)
self:Log("SPELL_AURA_APPLIED", "RangersHeartseeker", 352663)
self:Log("SPELL_AURA_APPLIED", "RangersHeartseekerApplied", 352650)
self:Log("SPELL_AURA_APPLIED_DOSE", "RangersHeartseekerApplied", 352650)
self:Log("SPELL_AURA_APPLIED", "BansheesMarkApplied", 347607)
self:Log("SPELL_AURA_APPLIED_DOSE", "BansheesMarkApplied", 347607)
-- Intermission: A Monument to our Suffering
self:Log("SPELL_AURA_APPLIED", "BansheeShroudApplied", 350857)
self:Log("SPELL_CAST_SUCCESS", "Rive", 353417, 353418) -- Both used in Intermission
self:Log("SPELL_CAST_START", "BansheeWail", 348109)
-- Stage Two: The Banshee Queen
self:Log("SPELL_AURA_APPLIED", "BansheeFormApplied", 348146)
self:Log("SPELL_AURA_REMOVED", "BansheeShroudRemoved", 350857)
self:Log("SPELL_CAST_START", "Ruin", 355540)
self:Log("SPELL_CAST_SUCCESS", "HauntingWave", 351869)
self:Log("SPELL_CAST_START", "LashingStrike", 351179)
self:Log("SPELL_AURA_APPLIED", "LashingWoundApplied", 351180)
self:Log("SPELL_AURA_APPLIED_DOSE", "LashingWoundApplied", 351180)
self:Log("SPELL_CAST_SUCCESS", "CrushingDread", 351117)
self:Log("SPELL_AURA_APPLIED", "CrushingDreadApplied", 351117)
self:Death("SouljudgeDeath", 177889) -- Mawforged Souljudge
self:Log("SPELL_CAST_START", "SummonDecrepitOrbs", 351353)
self:Log("SPELL_CAST_SUCCESS", "CurseOfLethargy", 351939)
self:Log("SPELL_AURA_APPLIED", "CurseOfLethargyApplied", 351939)
self:Death("SummonerDeath", 177891) -- Mawforged Summoner
self:Log("SPELL_AURA_APPLIED", "FuryApplied", 351672)
self:Log("SPELL_AURA_APPLIED_DOSE", "FuryApplied", 351672)
-- Stage Three: The Freedom of Choice
self:Log("SPELL_CAST_START", "RaidPortalOribos", 357102)
self:Log("SPELL_AURA_APPLIED", "BansheesBaneApplied", 353929)
self:Log("SPELL_AURA_APPLIED_DOSE", "BansheesBaneApplied", 353929)
self:Log("SPELL_CAST_START", "BaneArrows", 354011)
self:Log("SPELL_AURA_APPLIED", "BansheesHeartseekerApplied", 353965)
self:Log("SPELL_AURA_APPLIED_DOSE", "BansheesHeartseekerApplied", 353965)
self:Log("SPELL_CAST_START", "BansheesHeartseeker", 353969)
self:Log("SPELL_CAST_START", "BansheesFury", 354068)
self:Log("SPELL_CAST_START", "BansheeScream", 353952)
self:Log("SPELL_CAST_START", "Raze", 354147)
--self:RegisterEvent("CHAT_MSG_RAID_BOSS_EMOTE") -- Veil of Darkness stage 3
if self:Mythic() and self:GetOption("custom_on_nameplate_fixate") then
self:ShowPlates()
end
stageThreeTimers = self:Mythic() and stageThreeTimersMythic or stageThreeTimersHeroic
end
function mod:OnEngage()
self:SetStage(1)
windrunnerCount = 1
dominationChainsCount = 1
veilofDarknessCount = 1
wailingArrowCount = 1
rangerHeartSeekerCount = 1
intermission = false
self:Bar(347504, 7.5, CL.count:format(self:SpellName(347504), windrunnerCount)) -- Windrunner
self:Bar(352650, 20.5) -- Ranger's Heartseeker
self:Bar(349458, 26, CL.count:format(L.chains, dominationChainsCount)) -- Domination Chains
self:Bar(347704, 47, CL.count:format(L.darkness, veilofDarknessCount)) -- Veil of Darkness
self:Bar(347609, 36.5, CL.count:format(L.arrow, wailingArrowCount)) -- Wailing Arrow
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss1")
end
function mod:OnBossDisable()
if self:Mythic() and self:GetOption("custom_on_nameplate_fixate") then
self:HidePlates()
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_HEALTH(event, unit)
if self:GetHealth(unit) < 83 then -- Intermission at 80%
self:Message("stages", "green", CL.soon:format(CL.intermission), false)
self:PlaySound("stages", "info")
self:UnregisterUnitEvent(event, unit)
end
end
-----------
-- Mythic
-----------
function mod:RageApplied(args)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId, nil, CL.fixate)
self:PlaySound(args.spellId, "alarm")
if self:GetOption("custom_on_nameplate_fixate") then
self:AddPlateIcon(358711, args.sourceGUID) -- 358711 = ability_fixated_state_purple
end
end
end
function mod:RageRemoved(args)
if self:Me(args.destGUID) and self:GetOption("custom_on_nameplate_fixate") then
self:RemovePlateIcon(358711, args.sourceGUID)
end
end
function mod:DarkCommunion(args)
self:Message(args.spellId, "orange", L.orbs)
self:PlaySound(args.spellId, "long")
-- self:Bar(args.spellId, 16)
end
function mod:ColossusDeath(args)
self:StopBar(351591) -- Filth
self:StopBar(351562) -- Expulsion
end
function mod:Filth(args)
self:Message(351591, "purple", CL.casting:format(args.spellName))
-- self:PlaySound(351591, "info")
-- self:Bar(351591, 20)
end
function mod:FilthApplied(args)
if self:Tank(args.destName) then
local amount = args.amount or 1
self:NewStackMessage(args.spellId, "purple", args.destName, args.amount)
if amount % 2 == 0 then
self:PlaySound(args.spellId, "warning")
end
end
end
do
local playerList = {}
local prev = 0
function mod:ExpulsionApplied(args)
local t = args.time
if t-prev > 5 then
prev = t
playerList = {}
self:Message(args.spellId, "orange", CL.casting:format(args.spellName))
-- self:Bar(args.spellId, 20)
end
local count = #playerList+1
local icon = count
playerList[count] = args.destName
playerList[args.destName] = icon -- Set raid marker
if self:Me(args.destGUID) then
self:Say(args.spellId, CL.count_rticon:format(args.spellName, count, count))
self:SayCountdown(args.spellId, 4.5, count) -- EJ says 6, spell says 4.5
self:PlaySound(args.spellId, "warning")
end
self:NewTargetsMessage(args.spellId, "orange", playerList)
self:CustomIcon(expulsionMarker, args.destName, icon)
end
end
function mod:ExpulsionRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
self:CustomIcon(expulsionMarker, args.destName)
end
function mod:BansheesWeaponsApplied(args)
local amount = args.amount or 1
self:Message(args.spellId, "purple", CL.count:format(args.spellName, amount)) -- Banshee's Weapons (1)-(4)
-- XXX Should probably add bars for Heartseeker and Blades
-- Also kind of noisy for tanks? alarm (stack) 3s warning (shot) 1.5s alarm (bane)
if amount == 3 then -- Banshee's Heartseeker next shot
self:PlaySound(args.spellId, "alarm")
elseif amount == 4 then -- Banshee's Blades next shot
self:PlaySound(args.spellId, "alarm")
end
end
function mod:BansheesBlades(args)
self:Message(args.spellId, "purple", CL.casting:format(args.spellName))
if self:Tanking("boss1") then
self:PlaySound(args.spellId, "warning")
end
end
do
local prev = 0
function mod:DeathKnivesApplied(args)
local t = args.time
if t-prev > 5 then
prev = t
self:Message(args.spellId, "orange", CL.count:format(args.spellName, deathKnivesCount))
self:Bar(args.spellId, 5, L.knife_fling)
deathKnivesCount = deathKnivesCount + 1
--self:Bar(args.spellId, 25, CL.count:format(args.spellName, deathKnivesCount))
end
if self:Me(args.destGUID)then
self:PersonalMessage(args.spellId)
self:Say(args.spellId)
self:SayCountdown(args.spellId, 5)
self:PlaySound(args.spellId, "warning")
end
end
end
function mod:DeathKnivesRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
end
function mod:Merciless(args)
self:Message(args.spellId, "orange", CL.count:format(args.spellName, mercilessCount))
self:PlaySound(args.spellId, "alert")
mercilessCount = mercilessCount + 1
--self:Bar(args.spellId, 25, CL.count:format(args.spellName, mercilessCount))
end
---------------------------------
-- Stage One: A Cycle of Hatred
---------------------------------
function mod:Windrunner(args)
self:Message(args.spellId, "yellow", CL.count:format(args.spellName, windrunnerCount))
self:PlaySound(args.spellId, "alert")
windrunnerCount = windrunnerCount + 1
if not intermission then
self:Bar(args.spellId, windrunnerTimers[windrunnerCount] or 49, CL.count:format(args.spellName, windrunnerCount))
end
end
function mod:BarbedArrowApplied(args)
if self:Me(args.destGUID) then
self:NewStackMessage(args.spellId, "blue", args.destName, args.amount)
self:PlaySound(args.spellId, "alarm")
end
end
function mod:DesecratingShotDamage(args)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId, "underyou")
self:PlaySound(args.spellId, "underyou")
end
end
function mod:ShadowDaggerApplied(args)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId)
self:PlaySound(args.spellId, "warning")
end
end
function mod:DominationChains(args)
self:Message(349458, "red", CL.count:format(L.chains, dominationChainsCount))
self:PlaySound(349458, "warning")
self:Bar("chains_active", 7.2, L.chains_active_bartext:format(CL.count:format(L.chains, dominationChainsCount)), args.spellId) -- Chains (x) Active
dominationChainsCount = dominationChainsCount + 1
if not intermission then
self:CDBar(349458, 54, CL.count:format(L.chains, dominationChainsCount))
end
end
function mod:DominationChainsApplied(args)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId, L.chain)
self:PlaySound(args.spellId, "alarm")
end
end
function mod:VeilOfDarkness(args)
self:Message(347704, "yellow", CL.count:format(L.darkness, veilofDarknessCount))
self:PlaySound(347704, "alert")
veilofDarknessCount = veilofDarknessCount + 1
if self:GetStage() == 1 and not intermission then
self:CDBar(347704, 46, CL.count:format(L.darkness, veilofDarknessCount))
elseif self:GetStage() == 3 then
self:Bar(347704, stageThreeTimers[354142][veilofDarknessCount], CL.count:format(L.darkness, veilofDarknessCount))
end
end
do
local prev = 0
function mod:VeilOfDarknessApplied(args)
if self:Me(args.destGUID) then
local t = args.time
if t-prev > 2 then
prev = t
local _, amount = self:UnitDebuff(args.destName, args.spellId) -- Checking amout as it starts with 5 in Heroic & Mythic
self:NewStackMessage(args.spellId, "blue", args.destName, amount, nil, L.darkness)
self:PlaySound(args.spellId, "warning")
end
end
end
end
do
function mod:WailingArrow(args)
self:Message(args.spellId, "yellow", CL.count:format(L.arrow, wailingArrowCount))
self:PlaySound(args.spellId, "alert")
wailingArrowCount = wailingArrowCount + 1
if not intermission and self:GetStage() == 1 then
self:Bar(args.spellId, 34, CL.count:format(L.arrow, wailingArrowCount))
elseif self:GetStage() == 3 then
self:Bar(args.spellId, stageThreeTimers[args.spellId][wailingArrowCount], CL.count:format(L.arrow, wailingArrowCount))
end
end
local wailingArrowPlayerCount = 0
local myArrow = 0
local prev = 0
function mod:WailingArrowApplied(args)
local t = args.time
if t-prev > 15 then -- New set
prev = t
wailingArrowPlayerCount = 0
end
wailingArrowPlayerCount = wailingArrowPlayerCount + 1
if self:GetStage() == 1 then -- Update the bar with exact timing
self:Bar(args.spellId, 9, CL.count:format(L.arrow, wailingArrowCount))
elseif self:GetStage() == 3 and wailingArrowPlayerCount == 1 then -- Only the first in stage 3
self:Bar(args.spellId, 9, CL.count:format(L.arrow, wailingArrowCount))
end
self:CustomIcon(wailingArrowMarker, args.destName, wailingArrowPlayerCount)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId, CL.count:format(L.arrow, wailingArrowPlayerCount))
self:PlaySound(args.spellId, "alarm")
self:Say(args.spellId, CL.count_rticon:format(L.arrow, wailingArrowPlayerCount, wailingArrowPlayerCount))
self:SayCountdown(args.spellId, 9)
self:TargetBar(args.spellId, 9, args.destName, CL.count:format(L.arrow, wailingArrowPlayerCount))
myArrow = wailingArrowPlayerCount
end
end
function mod:WailingArrowRemoved(args)
if self:Me(args.destGUID) then
self:StopBar(CL.count:format(L.arrow, wailingArrowPlayerCount), args.destName)
self:CustomIcon(wailingArrowMarker, args.destName)
self:CancelSayCountdown(args.spellId)
end
end
end
function mod:RangersHeartseeker(args)
self:Message(352650, "purple", CL.casting:format(args.spellName))
if self:Tanking("boss1") then
self:PlaySound(352650, "warning")
end
rangerHeartSeekerCount = rangerHeartSeekerCount + 1
if not intermission then
self:Bar(352650, rangersHeartSeekerTimers[rangerHeartSeekerCount])
end
end
function mod:RangersHeartseekerApplied(args)
local amount = args.amount or 1
self:Message(args.spellId, "purple", CL.count:format(args.spellName, amount))
end
function mod:BansheesMarkApplied(args)
local amount = args.amount or 1
if amount > 2 then -- 3 stacks per combo
self:NewStackMessage(args.spellId, "purple", args.destName, args.amount)
self:PlaySound(args.spellId, "alarm")
end
end
----------------------------------------------
-- Intermission: A Monument to our Suffering
----------------------------------------------
function mod:BansheeShroudApplied()
if self:GetStage() == 1 and not intermission then
self:Message("stages", "cyan", CL.intermission, false)
self:PlaySound("stages", "long")
self:StopBar(352650) -- Ranger's Heartseeker
self:StopBar(CL.count:format(self:SpellName(347504), windrunnerCount)) -- Windrunner
self:StopBar(CL.count:format(L.chains, dominationChainsCount)) -- Domination Chains
self:StopBar(CL.count:format(L.darkness, veilofDarknessCount)) -- Veil of Darkness
self:StopBar(CL.count:format(L.arrow, wailingArrowCount)) -- Wailing Arrow
intermission = true
dominationChainsCount = 1
riveCount = 1
bansheeWailCount = 1
end
end
function mod:Rive(args)
self:Message(353417, "red", CL.count:format(args.spellName, riveCount))
self:PlaySound(353417, "alert")
riveCount = riveCount + 1
if riveCount == 2 then -- Most reliable way to start intermission timers atm...
-- Start some timers
end
end
function mod:BansheeWail(args)
self:Message(args.spellId, "orange", CL.count:format(args.spellName, bansheeWailCount))
self:PlaySound(args.spellId, "alarm")
-- self:CastBar(args.spellId, 5)
bansheeWailCount = bansheeWailCount + 1
end
---------------------------------
-- Stage Two: The Banshee Queen
---------------------------------
function mod:BansheeFormApplied()
if self:GetStage() == 1 then
self:SetStage(2)
self:Message("stages", "cyan", CL.stage:format(2), false)
self:PlaySound("stages", "long")
self:StopBar(CL.count:format(L.chains, dominationChainsCount)) -- Domination Chains
self:StopBar(CL.count:format(self:SpellName(348145), riveCount)) -- Rive
self:StopBar(CL.count:format(self:SpellName(348109), bansheeWailCount)) -- Banshee Wail
veilofDarknessCount = 1
bansheeWailCount = 1
ruinCount = 1
hauntingWaveCount = 1
bansheeShroudRemovedCount = 1
end
end
function mod:BansheeShroudRemoved(args)
self:Message(args.spellId, "cyan", CL.removed:format(CL.count:format(args.spellName, bansheeShroudRemovedCount)), args.spellId)
self:PlaySound(args.spellId, "info")
self:CDBar(args.spellId, 38)
bansheeShroudRemovedCount = bansheeShroudRemovedCount + 1
end
function mod:Ruin(args)
self:Message(args.spellId, "red", CL.casting:format(CL.count:format(args.spellName, ruinCount)))
self:PlaySound(args.spellId, "warning")
ruinCount = ruinCount + 1
end
function mod:HauntingWave(args)
self:Message(args.spellId, "yellow", CL.count:format(L.wave, hauntingWaveCount))
self:PlaySound(args.spellId, "alert")
hauntingWaveCount = hauntingWaveCount + 1
end
function mod:LashingStrike(args)
self:Bar(351180, 7.5) -- Lashing Wound
end
function mod:LashingWoundApplied(args)
local amount = args.amount or 1
self:NewStackMessage(args.spellId, "purple", args.destName, amount)
if amount > 1 then
self:PlaySound(args.spellId, "alarm")
end
end
function mod:CrushingDread(args)
self:Bar(args.spellId, 11)
end
function mod:CrushingDreadApplied(args)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId, L.dread)
self:PlaySound(args.spellId, "alarm")
end
end
function mod:SouljudgeDeath()
self:StopBar(351180) -- Lashing Wound
self:StopBar(351117) -- Crushing Dread
end
function mod:SummonDecrepitOrbs(args)
self:Message(args.spellId, "orange", L.orbs)
self:PlaySound(args.spellId, "long")
self:Bar(args.spellId, 16, L.orbs)
end
function mod:CurseOfLethargy(args)
self:Bar(args.spellId, 7.5)
end
function mod:CurseOfLethargyApplied(args)
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId, L.curse)
self:PlaySound(args.spellId, "alarm")
end
end
function mod:SummonerDeath()
self:StopBar(L.orbs) -- Summon Decrepit Orbs / Dark Communion
self:StopBar(351939) -- Curse of Lethargy
end
function mod:FuryApplied(args)
local amount = args.amount or 1
if amount % 3 == 0 or amount > 10 then
self:NewStackMessage(args.spellId, "purple", args.destName, args.amount)
self:PlaySound(args.spellId, "alert")
end
end
---------------------------------------
-- Stage Three: The Freedom of Choice
---------------------------------------
function mod:RaidPortalOribos(args)
self:StopBar(L.orbs) -- Summon Decrepit Orbs / Dark Communion
self:StopBar(351939) -- Curse of Lethargy
self:StopBar(351180) -- Lashing Wound
self:StopBar(351117) -- Crushing Dread
self:StopBar(CL.count:format(L.darkness, veilofDarknessCount)) -- Veil of Darkness
self:StopBar(CL.count:format(self:SpellName(348109), bansheeWailCount)) -- Banshee Wail
self:StopBar(CL.count:format(self:SpellName(355540), ruinCount)) -- Ruin
self:StopBar(CL.count:format(L.wave, hauntingWaveCount)) -- Haunting Wave
bansheesFuryCount = 1
baneArrowsCount = 1
rangerHeartSeekerCount = 1 -- Reusing this for Banshee's Heartseeker
veilofDarknessCount = 1
wailingArrowCount = 1
razeCount = 1
bansheeScreamCount = 1
deathKnivesCount = 1
mercilessCount = 1
self:SetStage(3)
self:Message("stages", "cyan", CL.soon:format(CL.stage:format(3)), false)
self:PlaySound("stages", "long")
self:Bar("stages", 10, CL.stage:format(3), args.spellId)
self:SimpleTimer(function()
self:Bar(354068, stageThreeTimers[354068][bansheesFuryCount], CL.count:format(self:SpellName(354068), bansheesFuryCount)) -- Banshee's Fury
self:Bar(354011, stageThreeTimers[354011][baneArrowsCount], CL.count:format(self:SpellName(354011), baneArrowsCount)) -- Bane Arrows
self:CDBar(353965, stageThreeTimers[353969][rangerHeartSeekerCount]) -- Banshee's Heartseeker
self:Bar(347704, stageThreeTimers[354142][veilofDarknessCount], CL.count:format(L.darkness, veilofDarknessCount)) -- Veil of Darkness
self:Bar(347609, stageThreeTimers[347609][wailingArrowCount], CL.count:format(L.arrow, wailingArrowCount)) -- Wailing Arrow // To _SUCCESS of the first arrow
self:Bar(354147, stageThreeTimers[354147][razeCount], CL.count:format(self:SpellName(354147), razeCount)) -- Raze
self:Bar(353952, stageThreeTimers[353952][bansheeScreamCount], CL.count:format(L.scream, bansheeScreamCount)) -- Banshee Scream
end, 10)
end
function mod:BansheesBaneApplied(args)
if self:Me(args.destGUID) then
self:NewStackMessage(args.spellId, "blue", args.destName, args.amount, nil, L.pools)
self:PlaySound(args.spellId, "alarm")
end
end
function mod:BaneArrows(args)
self:Message(args.spellId, "yellow", CL.count:format(args.spellName, baneArrowsCount))
self:PlaySound(args.spellId, "alert")
baneArrowsCount = baneArrowsCount + 1
self:Bar(args.spellId, stageThreeTimers[args.spellId][baneArrowsCount], CL.count:format(args.spellName, baneArrowsCount))
end
function mod:BansheesHeartseekerApplied(args)
local amount = args.amount or 1
self:Message(args.spellId, "purple", CL.count:format(args.spellName, amount)) -- Banshee's Heartseeker (1)-(3)
end
function mod:BansheesHeartseeker(args)
if self:Tank() then
self:Message(353965, "purple", CL.casting:format(args.spellName))
if self:Tanking("boss1") then
self:PlaySound(353965, "warning")
end
end
rangerHeartSeekerCount = rangerHeartSeekerCount + 1
self:Bar(353965, stageThreeTimers[353969][rangerHeartSeekerCount])
end
function mod:BansheesFury(args)
self:Message(args.spellId, "red", CL.count:format(args.spellName, bansheesFuryCount))
self:PlaySound(args.spellId, "alert")
self:CastBar(args.spellId, 5) -- 1s precast, 4s before the explosions
bansheesFuryCount = bansheesFuryCount + 1
self:Bar(args.spellId, stageThreeTimers[args.spellId][bansheesFuryCount], CL.count:format(args.spellName, bansheesFuryCount))
end
function mod:BansheeScream(args)
self:Message(args.spellId, "orange", CL.count:format(L.scream, bansheeScreamCount))
self:PlaySound(args.spellId, "alarm")
self:CastBar(args.spellId, 5, CL.count:format(L.scream, bansheeScreamCount))
bansheeScreamCount = bansheeScreamCount + 1
self:Bar(args.spellId, stageThreeTimers[args.spellId][bansheeScreamCount], CL.count:format(L.scream, bansheeScreamCount))
end
function mod:Raze(args)
self:Message(args.spellId, "red", CL.count:format(args.spellName, razeCount))
self:PlaySound(args.spellId, "warning")
razeCount = razeCount + 1
self:Bar(args.spellId, stageThreeTimers[args.spellId][razeCount], CL.count:format(args.spellName, razeCount))
end
-- function mod:CHAT_MSG_RAID_BOSS_EMOTE(_, msg)
-- if msg:find("347704") and self:GetStage() == 3 then -- Veil of Darkness, other stages have a cast event
-- self:Message(347704, "yellow", CL.count:format(L.darkness, veilofDarknessCount))
-- self:PlaySound(347704, "alert")
-- veilofDarknessCount = veilofDarknessCount + 1
-- self:Bar(347704, 55, CL.count:format(L.darkness, veilofDarknessCount))
-- end
-- end