--------------------------------------------------------------------------------
-- 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 \n Requires 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