--------------------------------------------------------------------------------
-- Module Declaration
--
local mod , CL = BigWigs : NewBoss ( " Kel'Thuzad " , 2450 , 2440 )
if not mod then return end
mod : RegisterEnableMob ( 175559 , 176703 , 176973 , 176974 , 176929 ) -- Kel'Thuzad, Frostbound Devoted, Unstoppable Abomination, Soul Reaver, Remnant of Kel'Thuzad
mod : SetEncounterID ( 2422 )
mod : SetRespawnTime ( 30 )
mod : SetStage ( 1 )
--------------------------------------------------------------------------------
-- Locals
--
local mobCollector = { }
local glacialSpikeCollector = { }
local glacialSpikeMarks = { }
local soulShardMarks = { }
local soulShardCollector = { }
local mindControlled = false
local inPhylactery = false
local darkEvocationCount = 1
local blizzardCount = 1
local soulFractureCount = 1
local oblivionsEchoCount = 1
local frostBlastCount = 1
local glacialWrathCount = 1
local soulReaverCollector = { }
local soulReaverCount = 0
local soulReaverSpawnTime = 0
local soulReaverMarkScheduler = nil
-- local timersHeroic = { -- XXX Old timers used before hotfix, leaving it in for now to check incase.
-- [100] = { -- Mana on cast_start
-- [347292] = 62, -- Oblivion's Echo
-- },
-- [80] = {
-- [346459] = 118, -- Glacial Wrath
-- [347292] = nil, -- Oblivion's Echo
-- },
-- [60] = {
-- [346459] = nil, -- Glacial Wrath
-- [347292] = 69.7, -- Oblivion's Echo
-- [348760] = 42.5, -- Frost Blast
-- },
-- [40] = {
-- [346459] = 69, -- Glacial Wrath
-- [347292] = 42.5, -- Oblivion's Echo
-- [348760] = nil, -- Frost Blast
-- },
-- [20] = {
-- [346459] = 44.1, -- Glacial Wrath
-- [347292] = nil, -- Oblivion's Echo
-- [348760] = 69.5, -- Frost Blast
-- },
-- }
-- local timersMythic = {
-- [100] = { -- Mana on cast_start
-- [347292] = 61, -- Oblivion's Echo
-- },
-- [80] = {
-- [346459] = 113, -- Glacial Wrath
-- [347292] = nil, -- Oblivion's Echo
-- },
-- [60] = {
-- [346459] = nil, -- Glacial Wrath
-- [347292] = 69.7, -- Oblivion's Echo
-- [348760] = 39, -- Frost Blast
-- },
-- [40] = {
-- [346459] = 69, -- Glacial Wrath
-- [347292] = 50, -- Oblivion's Echo
-- [348760] = nil, -- Frost Blast
-- },
-- [20] = {
-- [346459] = 50, -- Glacial Wrath
-- [347292] = nil, -- Oblivion's Echo
-- [348760] = 69.5, -- Frost Blast
-- },
-- }
--------------------------------------------------------------------------------
-- Localization
--
local L = mod : GetLocale ( )
if L then
L.spikes = " Spikes " -- Short for Glacial Spikes
L.spike = " Spike "
L.silence = mod : SpellName ( 226452 ) -- Silence
L.miasma = " Miasma " -- Short for Sinister Miasma
L.glacial_winds = " Tornadoes "
L.foul_winds = " Pushback "
L.custom_on_nameplate_fixate = " Fixate Nameplate Icon "
L.custom_on_nameplate_fixate_desc = " Show an icon on the nameplate of Frostbound Devoted 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 = 210130
end
--------------------------------------------------------------------------------
-- Initialization
--
local soulShardMarker = mod : AddMarkerOption ( false , " npc " , 8 , - 23224 , 8 , 7 , 6 , 5 , 4 ) -- Soul Shard
local glacialWrathMarker = mod : AddMarkerOption ( false , " player " , 1 , 346459 , 1 , 2 , 3 , 4 , 5 ) -- Glacial Wrath
local soulReaverMarker = mod : AddMarkerOption ( false , " npc " , 8 , - 23435 , 8 , 7 , 6 ) -- Soul Reaver
function mod : GetOptions ( )
return {
" stages " ,
-- Stage One: Chains and Ice
354198 , -- Howling Blizzard
352530 , -- Dark Evocation
355389 , -- Relentless Haunt
" custom_on_nameplate_fixate " ,
348071 , -- Soul Fracture // Tank hit but spawns Soul Shards for DPS
{ 348978 , " TANK " } , -- Soul Exhaustion
soulShardMarker ,
348428 , -- Piercing Wail
{ 346459 , " SAY " , " SAY_COUNTDOWN " } , -- Glacial Wrath
glacialWrathMarker ,
{ 346530 , " ME_ONLY " } , -- Frozen Destruction
{ 347292 , " SAY " , " SAY_COUNTDOWN " , " ME_ONLY_EMPHASIZE " } , -- Oblivion's Echo
{ 348760 , " SAY " , " SAY_COUNTDOWN " , " FLASH " , " ME_ONLY_EMPHASIZE " } , -- Frost Blast
-- Stage Two: The Phylactery Opens
354289 , -- Sinister Miasma
352051 , -- Necrotic Surge
352293 , -- Vengeful Destruction
355137 , -- Shadow Pool
352379 , -- Freezing Blast
355055 , -- Glacial Winds
355127 , -- Foul Winds (Mythic)
352355 , -- Undying Wrath
352141 , -- Banshee's Cry (Soul Reaver)
soulReaverMarker ,
-- Stage Three: The Final Stand
354639 , -- Deep Freeze
352348 , -- Onslaught of the Damned
} , {
[ " stages " ] = " general " ,
[ 354198 ] = mod : SpellName ( - 22884 ) , -- Stage One: Chains and Ice
[ 354289 ] = mod : SpellName ( - 22885 ) , -- Stage Two: The Phylactery Opens
[ 354639 ] = mod : SpellName ( - 23201 ) -- Stage Three: The Final Stand
} , {
[ 355389 ] = CL.fixate , -- Relentless Haunt (Fixate)
[ 346459 ] = L.spikes , -- Glacial Wrath (Spikes)
[ 347292 ] = L.silence , -- Oblivion's Echo (Silence)
[ 348760 ] = CL.meteor , -- Frost Blast (Meteor)
[ 354289 ] = L.miasma , -- Necrotic Miasma (Miasma)
[ 352293 ] = self : SpellName ( 249436 ) , -- Necrotic Destruction (Destruction)
[ 355055 ] = L.glacial_winds , -- Glacial Winds (Tornadoes)
[ 355127 ] = L.foul_winds , -- Foul Winds (Pushback)
}
end
function mod : OnBossEnable ( )
-- Stage One - Thirst for Blood
self : Log ( " SPELL_CAST_START " , " HowlingBlizzard " , 354198 )
self : Log ( " SPELL_AURA_APPLIED " , " DarkEvocation " , 352530 ) -- No _SUCCESS on the channel
self : Log ( " SPELL_AURA_APPLIED " , " RelentlessHauntApplied " , 355389 )
self : Log ( " SPELL_AURA_REMOVED " , " RelentlessHauntRemoved " , 355389 )
self : Log ( " SPELL_CAST_START " , " SoulFractureStart " , 362565 )
self : Log ( " SPELL_CAST_SUCCESS " , " SoulFractureSuccess " , 362565 )
self : Log ( " SPELL_AURA_APPLIED " , " SoulExhaustionApplied " , 348978 )
self : Log ( " SPELL_CAST_SUCCESS " , " SoulShardEvent " , 181113 )
self : Log ( " SPELL_AURA_REMOVED " , " SoulExhaustionRemoved " , 348978 )
self : Log ( " SPELL_CAST_START " , " PiercingWailStart " , 348428 )
self : Log ( " SPELL_CAST_START " , " GlacialWrath " , 346459 )
self : Log ( " SPELL_SUMMON " , " GlacialWrathSummon " , 346469 )
self : Log ( " SPELL_AURA_APPLIED " , " GlacialWrathApplied " , 353808 )
self : Log ( " SPELL_AURA_REMOVED " , " GlacialWrathRemoved " , 353808 )
self : Log ( " SPELL_AURA_APPLIED " , " FrozenDestructionApplied " , 346530 )
self : Log ( " SPELL_AURA_APPLIED_DOSE " , " FrozenDestructionApplied " , 346530 )
self : Log ( " SPELL_CAST_START " , " OblivionsEcho " , 347291 )
self : Log ( " SPELL_AURA_APPLIED " , " OblivionsEchoApplied " , 347292 )
self : Log ( " SPELL_AURA_REMOVED " , " OblivionsEchoRemoved " , 347292 )
self : Log ( " SPELL_CAST_START " , " FrostBlast " , 348756 , 358999 )
self : Log ( " SPELL_CAST_SUCCESS " , " FrostBlastSuccess " , 348756 , 358999 )
self : Log ( " SPELL_AURA_APPLIED " , " FrostBlastApplied " , 348760 )
-- Stage Two: The Phylactery Opens
self : RegisterUnitEvent ( " UNIT_SPELLCAST_SUCCEEDED " , nil , " boss1 " )
self : Log ( " SPELL_AURA_APPLIED " , " PhylacteryApplied " , 348787 )
self : Log ( " SPELL_AURA_REMOVED " , " PhylacteryRemoved " , 348787 )
self : Log ( " SPELL_AURA_APPLIED " , " SinisterMiasmaApplied " , 354289 )
self : Log ( " SPELL_AURA_APPLIED_DOSE " , " SinisterMiasmaApplied " , 354289 )
self : Log ( " SPELL_AURA_APPLIED " , " NecroticSurgeApplied " , 352051 )
self : Log ( " SPELL_AURA_APPLIED_DOSE " , " NecroticSurgeApplied " , 352051 )
self : Log ( " SPELL_CAST_START " , " VengefulDestruction " , 352293 )
self : Log ( " SPELL_CAST_START " , " FreezingBlast " , 352379 )
self : Log ( " SPELL_CAST_START " , " GlacialWinds " , 355055 )
self : Log ( " SPELL_CAST_START " , " FoulWinds " , 355127 )
self : Log ( " SPELL_CAST_START " , " UndyingWrath " , 352355 )
self : Death ( " RemnantDeath " , 176929 ) -- Remnant of Kel'Thuzad
self : Log ( " SPELL_CAST_START " , " BansheesCry " , 352141 )
self : Log ( " SPELL_SUMMON " , " MarchOfTheForsakenSummon " , 352094 )
-- Stage Three: The Final Stand
self : Log ( " SPELL_CAST_START " , " OnslaughtOfTheDamned " , 352348 )
self : Log ( " SPELL_AURA_APPLIED " , " GroundDamage " , 354198 , 354639 , 355137 ) -- Howling Blizzard, Deep Freeze, Shadow Pool
self : Log ( " SPELL_PERIODIC_DAMAGE " , " GroundDamage " , 354198 , 354639 , 355137 )
self : Log ( " SPELL_PERIODIC_MISSED " , " GroundDamage " , 354198 , 354639 , 355137 )
self : Log ( " SPELL_AURA_APPLIED " , " ReturnOfTheDamned " , 348638 )
self : Log ( " SPELL_AURA_REMOVED " , " ReturnOfTheDamnedRemoved " , 348638 )
if self : GetOption ( " custom_on_nameplate_fixate " ) then
self : ShowPlates ( )
end
end
function mod : OnEngage ( )
self : SetStage ( 1 )
mobCollector = { }
glacialSpikeCollector = { }
glacialSpikeMarks = { }
soulShardMarks = { }
soulShardCollector = { }
mindControlled = false
inPhylactery = false
darkEvocationCount = 1
blizzardCount = 1
soulFractureCount = 1
oblivionsEchoCount = 1
frostBlastCount = 1
glacialWrathCount = 1
-- Soul Fracture and Ice Shards can delay casts
self : CDBar ( 348071 , self : Mythic ( ) and 10.9 or 13.8 , CL.count : format ( self : SpellName ( 348071 ) , soulFractureCount ) ) -- Soul Fracture
self : CDBar ( 347292 , 14.5 , CL.count : format ( L.silence , oblivionsEchoCount ) ) -- Oblivion's Echo
self : CDBar ( 346459 , 24.2 , CL.count : format ( L.spikes , glacialWrathCount ) ) -- Glacial Wrath
self : CDBar ( 348760 , 48.5 , CL.count : format ( CL.meteor , frostBlastCount ) ) -- Frost Blast
self : CDBar ( 352530 , 51.4 , CL.count : format ( self : SpellName ( 352530 ) , darkEvocationCount ) ) -- Dark Evocation
self : CDBar ( 354198 , 91 , CL.count : format ( self : SpellName ( 354198 ) , blizzardCount ) ) -- Howling Blizzard
self : RegisterTargetEvents ( " MarkUnits " )
end
function mod : OnBossDisable ( )
if self : GetOption ( " custom_on_nameplate_fixate " ) then
self : HidePlates ( )
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod : MarkReavers ( )
for i = 1 , # soulReaverCollector do
local guid = soulReaverCollector [ i ] . reaverGuid
if not mobCollector [ guid ] then
local unit = self : GetUnitIdByGUID ( guid )
if unit then
self : CustomIcon ( soulReaverMarker , unit , 9 - i )
mobCollector [ soulReaverCollector [ i ] . reaverGuid ] = true
end
end
end
soulReaverMarkScheduler = nil
end
function mod : MarkUnits ( event , unit , guid )
if not mobCollector [ guid ] then
if soulShardCollector [ guid ] then
self : CustomIcon ( soulShardMarker , unit , soulShardCollector [ guid ] )
mobCollector [ guid ] = true
end
if glacialSpikeCollector [ guid ] then
if glacialSpikeCollector [ guid ] > 0 then
self : CustomIcon ( glacialWrathMarker , unit , glacialSpikeCollector [ guid ] )
end
glacialSpikeCollector [ guid ] = nil
mobCollector [ guid ] = true
end
if self : MobId ( guid ) == 176974 then -- Soulreaver
if self : GetStage ( ) == 3 then -- Mark in Order
soulReaverCount = soulReaverCount + 1
local icon = soulReaverCount % 3 + 1 -- XXX FixME
self : CustomIcon ( soulReaverMarker , unit , icon )
mobCollector [ guid ] = true
elseif self : GetStage ( ) < 3 then -- Mark using logic
local tableCount = # soulReaverCollector
if soulReaverCollector [ guid ] then
if tableCount > 2 then -- Mark once 3 are found
self : MarkReavers ( )
end
elseif not soulReaverMarkScheduler then -- Mark anyways after the scheduled timer is gone
soulReaverCount = soulReaverCount + 1
local icon = 9 - ( tableCount + soulReaverCount )
self : CustomIcon ( soulReaverMarker , unit , icon )
mobCollector [ guid ] = true
else
--local range = self:GetRange(unit) -- XXX Mark based on distance from the units
--if range then
soulReaverCollector [ tableCount + 1 ] = { reaverGuid = guid , reaverRange = 2 } --{reaverGuid = guid, reaverRange = range} XXX Range API Needed
soulReaverCollector [ guid ] = true
table.sort ( soulReaverCollector , function ( t1 , t2 ) return t1.reaverRange < t2.reaverRange end )
return
--end
end
end
end
end
end
-- Stage One: Chains and Ice
function mod : HowlingBlizzard ( args )
self : Message ( args.spellId , " cyan " , CL.casting : format ( args.spellName ) )
self : PlaySound ( args.spellId , " long " )
self : CastBar ( args.spellId , 23 , CL.count : format ( args.spellName , blizzardCount ) )
blizzardCount = blizzardCount + 1
self : CDBar ( 354198 , 118.5 , CL.count : format ( self : SpellName ( 354198 ) , blizzardCount ) ) -- Howling Blizzard
end
function mod : DarkEvocation ( args )
self : Message ( args.spellId , " cyan " , CL.casting : format ( CL.count : format ( args.spellName , darkEvocationCount ) ) )
self : PlaySound ( args.spellId , " long " )
darkEvocationCount = darkEvocationCount + 1
self : CDBar ( args.spellId , 111 , CL.count : format ( args.spellName , darkEvocationCount ) )
end
function mod : RelentlessHauntApplied ( 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 ( 210130 , args.sourceGUID ) -- 210130 = ability_fixated_state_red
end
end
end
function mod : RelentlessHauntRemoved ( args )
if self : Me ( args.destGUID ) and self : GetOption ( " custom_on_nameplate_fixate " ) then
self : RemovePlateIcon ( 210130 , args.sourceGUID )
end
end
function mod : SoulFractureStart ( args )
self : Message ( 348071 , " purple " , CL.casting : format ( CL.count : format ( args.spellName , soulFractureCount ) ) )
self : PlaySound ( 348071 , " alarm " )
soulShardMarks = { }
soulShardCollector = { }
end
function mod : SoulFractureSuccess ( args )
soulFractureCount = soulFractureCount + 1
self : CDBar ( 348071 , soulFractureCount == 4 and 43.5 or 30.2 , CL.count : format ( args.spellName , soulFractureCount ) ) -- to _START XXX Check count 4
end
function mod : SoulExhaustionApplied ( args )
if self : Tank ( ) and self : Tank ( args.destName ) then
local unit = self : GetBossId ( 175559 ) -- Kel'Thuzad
if not self : Me ( args.destGUID ) and unit and not self : Tanking ( unit ) then
self : TargetMessage ( args.spellId , " purple " , args.destName , CL.count : format ( args.spellName , soulFractureCount - 1 ) )
self : PlaySound ( args.spellId , " warning " , " taunt " , args.destName ) -- Not taunted? Play warning sound.
elseif self : Me ( args.destGUID ) then
self : PersonalMessage ( args.spellId )
self : PlaySound ( args.spellId , " alarm " )
end
end
self : TargetBar ( args.spellId , 60 , args.destName , CL.count : format ( args.spellName , soulFractureCount - 1 ) )
end
function mod : SoulShardEvent ( args )
if self : GetOption ( soulShardMarker ) then
for i = 8 , 4 , - 1 do -- 8, 7, 6, 5, 4
if not soulShardCollector [ args.sourceGUID ] and not soulShardMarks [ i ] then
soulShardMarks [ i ] = args.sourceGUID
soulShardCollector [ args.sourceGUID ] = i
return
end
end
end
end
function mod : SoulExhaustionRemoved ( args )
if self : Me ( args.destGUID ) then
self : Message ( args.spellId , " green " , CL.removed : format ( args.spellName ) )
self : PlaySound ( args.spellId , " info " )
end
self : StopBar ( CL.count : format ( args.spellName , soulFractureCount - 1 ) , args.destName )
end
function mod : PiercingWailStart ( args )
local canDo , ready = self : Interrupter ( args.sourceGUID )
if canDo then
self : Message ( args.spellId , " yellow " )
if ready then
self : PlaySound ( args.spellId , " alarm " )
end
end
end
function mod : GlacialWrath ( args )
self : Message ( args.spellId , " orange " , CL.casting : format ( CL.count : format ( L.spikes , glacialWrathCount ) ) )
self : PlaySound ( args.spellId , " alert " )
glacialWrathCount = glacialWrathCount + 1
self : CDBar ( args.spellId , 113 , CL.count : format ( L.spikes , glacialWrathCount ) )
glacialSpikeCollector = { }
glacialSpikeMarks = { }
end
function mod : GlacialWrathSummon ( args )
glacialSpikeCollector [ args.destGUID ] = tremove ( glacialSpikeMarks , 1 )
end
do
local playerList = { }
local prev = 0
function mod : GlacialWrathApplied ( args )
local t = args.time -- new set of debuffs
if t - prev > 5 then
prev = t
playerList = { }
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 ( 346459 , CL.rticon : format ( L.spike , count ) )
self : SayCountdown ( 346459 , 5 , count )
self : PlaySound ( 346459 , " warning " )
end
self : NewTargetsMessage ( 346459 , " orange " , playerList , nil , L.spike )
self : CustomIcon ( glacialWrathMarker , args.destName , icon )
end
function mod : GlacialWrathRemoved ( args )
if self : Me ( args.destGUID ) then
self : CancelSayCountdown ( 346459 )
end
self : CustomIcon ( glacialWrathMarker , args.destName )
glacialSpikeMarks [ # glacialSpikeMarks + 1 ] = playerList [ args.destName ] or 0 -- _REMOVED is more reliable for spike order
end
end
do
local playerName = mod : UnitName ( " player " )
local stacks = 1
local scheduled = nil
local function FrozenDestructionStackMessage ( )
mod : NewStackMessage ( 346530 , " blue " , playerName , stacks )
mod : PlaySound ( 346530 , stacks > 4 and " warning " or " info " ) -- How many stacks is too much?
scheduled = nil
end
function mod : FrozenDestructionApplied ( args ) -- Throttle incase several die at the same time
if self : Me ( args.destGUID ) then
stacks = args.amount or 1
if not scheduled then
scheduled = self : ScheduleTimer ( FrozenDestructionStackMessage , 0.1 )
end
end
end
end
do
local playerList = { }
function mod : OblivionsEcho ( args )
playerList = { }
oblivionsEchoCount = oblivionsEchoCount + 1
self : CDBar ( 347292 , oblivionsEchoCount % 2 == 0 and 61.5 or 40.5 , CL.count : format ( L.silence , oblivionsEchoCount ) ) -- XXX Need to confirm the (3)+ casts
end
function mod : OblivionsEchoApplied ( args )
local count = # playerList + 1
playerList [ count ] = args.destName
if self : Me ( args.destGUID ) then
self : Say ( args.spellId , L.silence )
self : SayCountdown ( args.spellId , 6 )
self : PlaySound ( args.spellId , " warning " )
end
self : NewTargetsMessage ( args.spellId , " yellow " , playerList , nil , CL.count : format ( L.silence , oblivionsEchoCount - 1 ) )
end
end
function mod : OblivionsEchoRemoved ( args )
if self : Me ( args.destGUID ) then
self : CancelSayCountdown ( args.spellId )
end
end
function mod : FrostBlast ( args )
-- Fix timer
self : CDBar ( 348760 , 3 , CL.count : format ( CL.meteor , frostBlastCount ) )
end
function mod : FrostBlastSuccess ( args )
frostBlastCount = frostBlastCount + 1
if self : GetStage ( ) == 1 then
self : CDBar ( 348760 , frostBlastCount % 2 == 0 and 40 or 70 , CL.count : format ( CL.meteor , frostBlastCount ) )
elseif self : GetStage ( ) == 3 then
self : CDBar ( 348760 , 15.8 , CL.count : format ( CL.meteor , frostBlastCount ) )
end
end
function mod : FrostBlastApplied ( args )
if self : Me ( args.destGUID ) then
self : PlaySound ( args.spellId , " warning " )
self : Yell ( args.spellId , CL.meteor )
self : Flash ( args.spellId )
self : YellCountdown ( args.spellId , 6 )
else
self : PlaySound ( args.spellId , " alert " )
end
self : TargetMessage ( args.spellId , " orange " , args.destName , CL.count : format ( CL.meteor , frostBlastCount - 1 ) )
end
function mod : PhylacteryApplied ( args )
if self : Me ( args.destGUID ) then
inPhylactery = true
end
end
function mod : PhylacteryRemoved ( args )
if self : Me ( args.destGUID ) then
inPhylactery = false
end
end
function mod : SinisterMiasmaApplied ( args )
if self : Me ( args.destGUID ) then
local amount = args.amount or 1
if amount % 3 == 0 and amount > 15 then -- 15+ or every 3
self : NewStackMessage ( args.spellId , " blue " , args.destName , amount , 10 , L.miasma )
if amount > 15 then
self : PlaySound ( args.spellId , " alert " )
end
end
end
end
function mod : UNIT_SPELLCAST_SUCCEEDED ( _ , _ , _ , spellId )
if spellId == 351625 then -- Cosmetic Death
self : StopBar ( CL.count : format ( self : SpellName ( 348071 ) , soulFractureCount ) ) -- Soul Fracture
self : StopBar ( CL.count : format ( L.silence , oblivionsEchoCount ) ) -- Oblivion's Echo
self : StopBar ( CL.count : format ( L.spikes , glacialWrathCount ) ) -- Glacial Wrath
self : StopBar ( CL.count : format ( CL.meteor , frostBlastCount ) ) -- Frost Blast
self : StopBar ( CL.count : format ( self : SpellName ( 352530 ) , darkEvocationCount ) ) -- Dark Evocation
self : StopBar ( CL.count : format ( self : SpellName ( 354198 ) , blizzardCount ) ) -- Howling Blizzard
end
end
function mod : VengefulDestruction ( args )
self : Message ( args.spellId , " yellow " , CL.casting : format ( self : SpellName ( 249436 ) ) )
self : PlaySound ( args.spellId , " long " )
self : CastBar ( args.spellId , 45 , self : SpellName ( 249436 ) ) -- Destruction
self : SetStage ( 2 )
-- XXX Starts when the first person enters, should we keep this or just ditch it?
-- local remnant = self:GetBossId(176929) -- was only ever boss2, but just to make sure
-- if remnant and self:GetHealth(remnant) < 34 then -- final stage 2
-- --self:CDBar(355055, 3, L.glacial_winds) -- Glacial Winds
-- --self:CDBar(352379, 11) -- Freezing Blast
-- -- if self:Mythic() then
-- -- self:CDBar(355127, 7, L.foul_winds) -- Foul Winds
-- -- end
-- else
-- self:CDBar(352379, self:Mythic() and 3 or 7) -- Freezing Blast
-- if self:Mythic() then
-- self:CDBar(355127, 7, L.foul_winds) -- Foul Winds
-- end
-- end
end
function mod : NecroticSurgeApplied ( args )
if not self : IsEngaged ( ) then return end -- starts with stacks on mythic
if args.amount and args.amount > 4 then -- Don't show for Stage 3 (Custom message for that)
self : NewStackMessage ( args.spellId , " cyan " , args.destName , args.amount )
self : PlaySound ( args.spellId , " info " )
end
self : StopBar ( CL.cast : format ( self : SpellName ( 249436 ) ) ) -- Destruction
self : StopBar ( 352379 ) -- Freezing Blast
self : StopBar ( L.glacial_winds ) -- Glacial Winds
self : StopBar ( L.foul_winds ) -- Foul Winds
if self : GetStage ( ) == 2 then
self : SetStage ( 1 )
soulFractureCount = 1
oblivionsEchoCount = 1
glacialWrathCount = 1
frostBlastCount = 1
darkEvocationCount = 1
blizzardCount = 1
self : CDBar ( 348071 , 10 , CL.count : format ( self : SpellName ( 348071 ) , soulFractureCount ) ) -- Soul Fracture
self : CDBar ( 347292 , 14.5 , CL.count : format ( L.silence , oblivionsEchoCount ) ) -- Oblivion's Echo
self : CDBar ( 346459 , 24.2 , CL.count : format ( L.spikes , glacialWrathCount ) ) -- Glacial Wrath
self : CDBar ( 348760 , 45.5 , CL.count : format ( CL.meteor , frostBlastCount ) ) -- Frost Blast
self : CDBar ( 352530 , 35.9 , CL.count : format ( self : SpellName ( 352530 ) , darkEvocationCount ) ) -- Dark Evocation
self : CDBar ( 354198 , 89.9 , CL.count : format ( self : SpellName ( 354198 ) , blizzardCount ) ) -- Howling Blizzard
else -- Stage 3
frostBlastCount = 1 -- Frost Blast
self : CDBar ( 348760 , 11.5 , CL.count : format ( CL.meteor , frostBlastCount ) ) -- Frost Blast
self : CDBar ( 352348 , 48.5 ) -- Onslaught of the Damned
end
end
function mod : RemnantDeath ( )
self : Message ( " stages " , " cyan " , CL.stage : format ( 3 ) , false )
self : PlaySound ( " stages " , " info " )
self : SetStage ( 3 )
end
function mod : FreezingBlast ( args )
if _G.GetPlayerAuraBySpellID ( 348787 ) then -- inPhylactery doesn't work for some reason?
self : Message ( args.spellId , " orange " )
self : PlaySound ( args.spellId , " alarm " )
self : CDBar ( args.spellId , 6.1 )
end
end
function mod : GlacialWinds ( args )
if _G.GetPlayerAuraBySpellID ( 348787 ) then -- inPhylactery doesn't work for some reason?
self : Message ( args.spellId , " cyan " , L.glacial_winds )
self : CDBar ( args.spellId , 13.5 , L.glacial_winds )
self : PlaySound ( args.spellId , " info " )
end
end
function mod : FoulWinds ( args )
if _G.GetPlayerAuraBySpellID ( 348787 ) then -- inPhylactery doesn't work for some reason?
self : Message ( args.spellId , " yellow " , L.foul_winds )
self : CDBar ( args.spellId , 25.5 , L.foul_winds )
self : PlaySound ( args.spellId , " alert " )
end
end
function mod : UndyingWrath ( args )
self : Message ( args.spellId , " red " )
self : CastBar ( args.spellId , 10 )
if _G.GetPlayerAuraBySpellID ( 348787 ) then -- inPhylactery doesn't work for some reason?
self : PlaySound ( args.spellId , " warning " )
end
self : StopBar ( 352379 ) -- Freezing Blast
self : StopBar ( L.glacial_winds ) -- Glacial Winds
self : StopBar ( L.foul_winds ) -- Foul Winds
end
function mod : OnslaughtOfTheDamned ( args )
self : Message ( args.spellId , " yellow " )
self : PlaySound ( args.spellId , " alert " )
--self:CDBar(args.spellId, 48.6) XXX Does it even happen again?
end
do
local prev = 0
function mod : GroundDamage ( args )
if self : Me ( args.destGUID ) and not mindControlled then
local t = args.time
local throttle = args.spellId == 354639 and 6 or 2 -- Deep Freeze
if t - prev > throttle then
prev = t
self : PlaySound ( args.spellId , " underyou " )
self : PersonalMessage ( args.spellId , " underyou " )
end
end
end
end
function mod : ReturnOfTheDamned ( args )
if self : Me ( args.destGUID ) then
mindControlled = true
end
end
function mod : ReturnOfTheDamnedRemoved ( args )
if self : Me ( args.destGUID ) then
mindControlled = false
end
end
function mod : BansheesCry ( args )
local canDo , ready = self : Interrupter ( args.sourceGUID )
if canDo and ( self : GetStage ( ) == 3 or not inPhylactery ) then
self : Message ( args.spellId , " yellow " )
if ready then
self : PlaySound ( args.spellId , " alarm " )
end
end
end
do
local prev = 0
function mod : MarchOfTheForsakenSummon ( args )
if not self : GetOption ( soulReaverMarker ) then return end
local t = args.time
if t - prev > 5 then
prev = t
soulReaverCollector = { }
soulReaverCount = 0
soulReaverSpawnTime = GetTime ( )
if not soulReaverMarkScheduler then
soulReaverMarkScheduler = self : ScheduleTimer ( " MarkReavers " , 5 )
end
end
end
end