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.

988 lines
36 KiB

--------------------------------------------------------------------------------
-- TODO List:
-- - Soul Siphon CD
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Gul'dan", 1530, 1737)
if not mod then return end
mod:RegisterEnableMob(104154)
mod.engageId = 1866
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local mobCollector = {}
local phase = 1
local obeliskCounter = 1
local bondsCount = 1
local liquidHellfireCount = 1
local handOfGuldanCount = 1
local blackHarvestCount = 1
local stormCount = 1
local flamesCount = 1
local eyeCount = 1
local eyeOnMe = false
local severCount = 1
local crashCounter = 1
local orbCounter = 1
local visionCounter = 1
local essenceCount = 1
local timeStopCheck = nil
local liquidHellfireEmpowered = false
local eyeEmpowered = false
local bondsEmpowered = false
local expectedBonds = mod:Mythic() and 4 or 3
local parasiteSayTimers = {}
local effluxCount = 1
local effluxTimers = {11.0, 14.0, 20.0, 12.0, 12.3, 12.0}
local normalTimers = {
-- Black Harvest (206744 _start), after 227427 _applied
[206744] = {71.2, 82.8, 100}, -- not sure if complete
-- Empowered Eye of Gul'dan P3 (211152 _start), after 227427 _applied
[211152] = {42.7, 71.4, 71.4, 28.6, 114.3}, -- not sure if complete
}
local heroicTimers = {
-- Hand of Gul'dan P2
[212258] = {13.5, 48.9, 138.9},
-- Storm of the Destroyer (167819 _start), after 227427 _applied
[167935] = {84.1, 68.8, 61.2, 76.5}, -- timers should be complete
-- Black Harvest (206744 _start), after 227427 _applied
[206744] = {64.1, 72.5, 87.6}, -- timers should be complete
-- Empowered Eye of Gul'dan P3 (211152 _start), after 227427 _applied
[211152] = {39.1, 62.5, 62.5, 25, 100}, -- timers should be complete
-- Flames of Sargeras (When applied).
[221606] = {27.6, 7.8, 8.8, 34.7, 7.8, 8.8, 34.7, 7.8, 8.7, 34.8, 7.7, 8.8, 36.0, 7.7, 8.8}
}
local mythicTimers = {
-- Hand of Gul'dan "P2"
[212258] = {16.6, 165},
-- Storm of the Destroyer (167819 _start), after 227427 _applied
[167935] = {72.6, 57.9, 51.6, 64.7, 57.4},
-- Black Harvest (206744 _start), after 227427 _applied
[206744] = {55.7, 61.0, 75.3, 86.8},
-- Empowered Eye of Gul'dan P3 (211152 _start), after 227427 _applied
[211152] = {35.1, 52.6, 53.3, 20.4, 84.2, 52.6},
-- Flames of Sargeras (When applied).
[221606] = {25.7, 6.4, 7.4, 29.4, 6.4, 7.4, 29.4, 6.4, 7.4, 29.4, 6.4, 7.4, 29.5, 7.4, 7.4, 28.4, 6.4, 7.4, 28.4, 6.4, 7.4},
-- Violent Winds
[218144] = {11.5, 43.4, 66, 75.4}
}
local timers = mod:Mythic() and mythicTimers or mod:Heroic() and heroicTimers or normalTimers
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
-- HORDE: Have you forgotten your humiliation on the Broken Shore? How your mighty warchief was stuck in the belly like a helpless piglet? Will you die slowly as he did, consumed by fel corruption and squealing for a merciful end?
-- ALLIANCE: Have you forgotten your humiliation on the Broken Shore? How your precious high king was bent and broken before me? Will you beg for your lives as he did, whimpering like some worthless dog?
L.warmup_trigger = "Have you forgotten"
L.empowered = "(E) %s" -- (E) Eye of Gul'dan
L.gains = "Gul'dan gains %s"
L.p2_start = "You failed, heroes! The ritual is upon us! But first, I'll indulge myself a bit... and finish you!"
L.p4_mythic_start_yell = "Time to return the demon hunter's soul to his body... and deny the Legion's master a host!"
L.nightorb = "{227283}"
L.nightorb_desc = "Summons a Nightorb, killing it will spawn a Time Zone."
L.nightorb_icon = "inv_icon_shadowcouncilorb_purple"
L.timeStopZone = "Time Stop Zone"
L.manifest = "{221149}"
L.manifest_desc = "Summons a Soul Fragment of Azzinoth, killing it will spawn a Demonic Essence."
L.manifest_icon = "inv_weapon_glave_01"
L.winds = "{218144}" -- Violent Winds
L.winds_desc = "Gul'dan summons Violent Winds to push the players off the platform."
L.winds_icon = 218144
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
--[[ General ]]--
"warmup",
"stages",
"berserk",
--[[ Essence of Aman'Thul ]]--
210339, -- Time Dilation
{217830, "SAY"}, -- Scattering Field
{210296, "TANK"}, -- Resonant Barrier
--[[ Stage One ]]--
{206219, "SAY", "FLASH"}, -- Liquid Hellfire
206514, -- Fel Efflux
212258, -- Hand of Gul'dan
--[[ Inquisitor Vethriz ]]--
207938, -- Shadowblink
212568, -- Drain
206840, -- Gaze of Vethriz
--[[ Fel Lord Kuraz'mal ]]--
{206675, "TANK"}, -- Shatter Essence
229945, -- Fel Obelisk
--[[ D'zorykx the Trapper ]]--
208545, -- Anguished Spirits
206883, -- Soul Vortex
{206896, "TANK"}, -- Torn Soul
--[[ Stage Two ]]--
{209011, "SAY", "FLASH"}, -- Bonds of Fel
{209270, "PROXIMITY"}, -- Eye of Gul'dan
208672, -- Carrion Wave
--[[ Stage Three ]]--
206939, -- Well of Souls
221891, -- Soul Siphon
208802, -- Soul Corrosion
167935, -- Storm of the Destroyer
206744, -- Black Harvest
{221606, "SAY", "FLASH"}, -- Flames of Sargeras
{211152, "PROXIMITY"}, -- Empowered Eye of Gul'dan
221781, -- Desolate Ground
{227556, "TANK"}, -- Fury of the Fel XXX untested
--[[ Mythic ]] --
"winds", -- Violent Winds
211439, -- Will of the Demon Within
220957, -- Soulsever
227071, -- Flame Crash
{206847, "FLASH", "SAY"}, -- Parasitic Wound
{206983, "FLASH", "SAY"}, -- Shadowy Gaze
"manifest", -- Manifest Azzinoth
221336, -- Chaos Seed
221408, -- Bulwark of Azzinoth
221486, -- Purify Essence
"nightorb", -- Summon Nightorb
227008, -- Visions of the Dark Titan
227009, -- Wounded
{206310, "EMPHASIZE"}, -- Time Stop
}, {
["warmup"] = "general",
[210339] = -14886, -- Essence of Aman'Thul
[206219] = -14885, -- Stage One
[207938] = -14897, -- Inquisitor Vethriz
[206675] = -14894, -- Fel Lord Kuraz'mal
[208545] = -14902, -- D'zorykx the Trapper
[209011] = -14062, -- Stage Two
[206939] = -14090, -- Stage Three
["winds"] = "mythic",
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1", "boss2", "boss3", "boss4", "boss5")
self:RegisterEvent("CHAT_MSG_MONSTER_YELL")
self:RegisterEvent("RAID_BOSS_EMOTE")
--[[ Essence of Aman'Thul ]]--
self:Log("SPELL_AURA_APPLIED", "TimeDilation", 210339)
self:Log("SPELL_AURA_APPLIED", "ScatteringField", 217830)
self:Log("SPELL_AURA_APPLIED", "ResonantBarrier", 210296)
self:Log("SPELL_AURA_APPLIED", "EyeOfAmanThul", 206516)
self:Log("SPELL_AURA_REMOVED", "EyeOfAmanThulRemoved", 206516)
--[[ Stage One ]]--
self:Log("SPELL_CAST_START", "LiquidHellfire", 206219, 206220) -- Normal, Empowered
self:Log("SPELL_CAST_START", "HandOfGuldan", 212258)
self:Log("SPELL_CAST_START", "FelEfflux", 206514)
self:Log("SPELL_AURA_APPLIED", "FelEffluxDamage", 206515)
self:Log("SPELL_PERIODIC_DAMAGE", "FelEffluxDamage", 206515)
self:Log("SPELL_PERIODIC_MISSED", "FelEffluxDamage", 206515)
--[[ Inquisitor Vethriz ]]--
self:Log("SPELL_CAST_SUCCESS", "Shadowblink", 207938)
self:Log("SPELL_AURA_APPLIED", "Drain", 212568)
self:Log("SPELL_CAST_START", "GazeOfVethrizCast", 206840)
self:Log("SPELL_DAMAGE", "GazeOfVethrizDamage", 217770)
self:Log("SPELL_MISSED", "GazeOfVethrizDamage", 217770)
--[[ Fel Lord Kuraz'mal ]]--
self:Log("SPELL_CAST_START", "ShatterEssence", 206675)
--[[ D'zorykx the Trapper ]]--
self:Log("SPELL_CAST_START", "AnguishedSpirits", 208545)
self:Log("SPELL_CAST_START", "SoulVortex", 206883)
self:Log("SPELL_AURA_APPLIED", "TornSoul", 206896)
self:Log("SPELL_AURA_APPLIED_DOSE", "TornSoul", 206896)
self:Log("SPELL_AURA_REMOVED", "TornSoulRemoved", 206896)
--[[ Stage Two ]]--
self:Log("SPELL_CAST_START", "BondsOfFelCast", 206222, 206221) -- Normal, Empowered
self:Log("SPELL_AURA_APPLIED", "BondsOfFel", 209011, 206384) -- Normal, Empowered
self:Log("SPELL_CAST_START", "EyeOfGuldan", 209270, 211152) -- Normal, Empowered
self:Log("SPELL_AURA_APPLIED", "EyeOfGuldanApplied", 209454, 221728) -- Normal, Empowered
self:Log("SPELL_AURA_REMOVED", "EyeOfGuldanRemoved", 209454, 221728) -- Normal, Empowered
self:Log("SPELL_DAMAGE", "EyeofGuldandDamage", 209518, 211132) -- Normal, Empowered
self:Log("SPELL_MISSED", "EyeofGuldandDamage", 209518, 211132) -- Normal, Empowered
self:Log("SPELL_CAST_START", "Duplicate", 209291)
self:Log("SPELL_CAST_START", "CarrionWave", 208672)
--[[ Stage Three ]]--
self:Log("SPELL_CAST_SUCCESS", "Phase3Start", 227427) -- The Eye of Aman'Thul
self:Log("SPELL_AURA_APPLIED", "FuryOfTheFel", 227556) -- XXX untested
self:Log("SPELL_AURA_APPLIED_DOSE", "FuryOfTheFel", 227556) -- XXX untested
self:Log("SPELL_CAST_START", "StormOfTheDestroyer", 167819, 167935, 177380, 152987)
self:Log("SPELL_AURA_APPLIED", "SoulSiphon", 221891)
self:Log("SPELL_AURA_APPLIED", "SoulCorrosion", 208802)
self:Log("SPELL_AURA_APPLIED_DOSE", "SoulCorrosion", 208802)
self:Log("SPELL_CAST_START", "BlackHarvest", 206744)
self:Log("SPELL_AURA_APPLIED", "FlamesOfSargerasSoon", 221606)
self:Log("SPELL_AURA_APPLIED", "DesolateGroundDamage", 221781)
self:Log("SPELL_PERIODIC_DAMAGE", "DesolateGroundDamage", 221781)
self:Log("SPELL_PERIODIC_MISSED", "DesolateGroundDamage", 221781)
self:Log("SPELL_DAMAGE", "DesolateGroundDamage", 221781)
self:Log("SPELL_MISSED", "DesolateGroundDamage", 221781)
self:Death("Deaths", 104537, 104534, 111070, 104154) -- Fel Lord Kuraz'mal, D'zorykx the Trapper, Fragment of Azzinoth, Gul'dan
-- Mythic
self:Log("SPELL_CAST_START", "WilloftheDemonWithin", 211439)
self:Log("SPELL_AURA_APPLIED", "ParasiticWound", 206847)
self:Log("SPELL_AURA_REMOVED", "ParasiticWoundRemoved", 206847)
self:Log("SPELL_AURA_APPLIED", "ShadowyGaze", 206983)
self:Log("SPELL_AURA_APPLIED", "ShearedSoul", 206458)
self:Log("SPELL_AURA_APPLIED", "Wounded", 227009)
self:Log("SPELL_CAST_START", "Soulsever", 220957)
self:Log("SPELL_AURA_APPLIED", "TimeStop", 206310)
self:Log("SPELL_AURA_REMOVED", "TimeStopRemoved", 206310)
self:Log("SPELL_CAST_START", "VisionsoftheDarkTitan", 227008)
self:Log("SPELL_CAST_SUCCESS", "VisionsoftheDarkTitanSuccess", 227008)
-- Shard of Azzinoth
self:Log("SPELL_CAST_SUCCESS", "ChaosSeed", 221336)
self:Log("SPELL_CAST_START", "BulwarkofAzzinoth", 221408)
self:Log("SPELL_CAST_START", "PurifiedEssence", 221486)
self:Log("SPELL_CAST_SUCCESS", "PurifiedEssenceSuccess", 221486)
self:Death("NightorbDeath", 111054)
end
function mod:OnEngage()
phase = 1
bondsCount = 1
liquidHellfireCount = 1
handOfGuldanCount = 1
blackHarvestCount = 1
stormCount = 1
flamesCount = 1
eyeCount = 1
eyeOnMe = false
obeliskCounter = 1
essenceCount = 1
timeStopCheck = nil
mobCollector = {}
effluxCount = 1
liquidHellfireEmpowered = false
bondsEmpowered = false
eyeEmpowered = false
expectedBonds = self:Mythic() and 4 or 3
timers = self:Mythic() and mythicTimers or self:Heroic() and heroicTimers or normalTimers
self:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT")
self:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
if self:Mythic() then
phase = 2 -- Mythic skips the P1 of heroic
self:Bar(209011, 6.8, CL.count:format(self:SpellName(209011), bondsCount)) -- Bonds of Fel
self:Bar(212258, timers[212258][handOfGuldanCount], CL.count:format(self:SpellName(212258), handOfGuldanCount)) -- Hand of Gul'dan
self:Bar(209270, 26.3, CL.count:format(self:SpellName(209270), eyeCount)) -- Eye of Guldan
self:Bar(206219, 36.6, CL.count:format(self:SpellName(206219), liquidHellfireCount)) -- Liquid Hellfire
else
self:Bar("stages", 35, 206516) -- Eye of Aman'Thul
self:Bar(212258, 7) -- Hand of Gul'dan
self:Bar(206514, effluxTimers[effluxCount])
self:Berserk(720)
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:CHAT_MSG_MONSTER_YELL(event, msg)
if msg:find(L.p2_start) and not self:Mythic() then -- Stage Two: The Ritual of Aman'Thul Start
self:StopBar(CL.count:format(self:SpellName(206219), liquidHellfireCount)) -- Liquid Hellfire
self:StopBar(206514) -- Fel Efflux
phase = 2
liquidHellfireCount=1
handOfGuldanCount=1
eyeCount = 1
bondsCount = 1
self:MessageOld("stages", "cyan", "long", CL.stage:format(phase), false)
-- Timers Stage 2
self:CDBar("stages", 14.5, 226141) -- Arcanetic Eruption timer / (spell icon/name: Knockback)
self:CDBar("stages", 18.1, 206516) -- Eye of Aman'Thul // Boss Attackable
self:Bar(209011, self:Easy() and 22.8 or 24.8, CL.count:format(self:SpellName(209011), bondsCount)) -- Bonds of Fel
if not self:Easy() then
self:Bar(212258, 31.5, CL.count:format(self:SpellName(212258), handOfGuldanCount)) -- Hand of Guldan
end
self:Bar(209270, self:Easy() and 50.4 or 47, CL.count:format(self:SpellName(209270), eyeCount)) -- Eye of Gul'dan
self:Bar(206219, self:Easy() and 79.6 or 58.1, CL.count:format(self:SpellName(206219), liquidHellfireCount)) -- Liquid Hellfire
elseif msg == L.p4_mythic_start_yell and self:Mythic() then -- Mythic Stage 4
phase = 4
self:MessageOld("stages", "cyan", "long", CL.stage:format(phase), false)
self:Bar(211439, 39) -- Will of the Demon Within
elseif msg:find(L.warmup_trigger, nil, true) then
self:Bar("warmup", UnitFactionGroup("player") == "Alliance" and 62 or 66, CL.active, "achievement_thenighthold_guldan")
end
end
function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i=1, 5 do
local guid = self:UnitGUID(("boss%d"):format(i))
if guid and not mobCollector[guid] then
mobCollector[guid] = true
if self:MobId(guid) == 104537 then
self:MessageOld("stages", "cyan", nil, self:SpellName(-14894), false)
self:CDBar(206675, self:Mythic() and 20 or 18.3)
self:CDBar(229945, self:Mythic() and 10 or 10) -- Fel Obelisk
elseif self:MobId(guid) == 104536 then
self:MessageOld("stages", "cyan", nil, self:SpellName(-14897), false)
elseif self:MobId(guid) == 104534 then
self:MessageOld("stages", "cyan", nil, self:SpellName(-14902), false)
elseif (self:MobId(guid) == 105295 or self:MobId(guid) == 107232 or self:MobId(guid) == 107233 or self:MobId(guid) == 112249) then -- Dreadlords
self:MessageOld("stages", "cyan", nil, self:SpellName(209142), false) -- Dreadlord
elseif self:MobId(guid) == 111070 then -- Soul Fragment of Azzinoth
self:Bar(221336, 3.3) -- Chaos Seed
end
end
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 210273 then -- Fel Obelisk
obeliskCounter = obeliskCounter+1
self:MessageOld(229945, "yellow", "alarm")
self:Bar(229945, self:Mythic() and ((obeliskCounter % 2 == 0) and 5 or 16) or 23) -- Fel Obelisk
elseif spellId == 227035 then -- Parasitic Wound
self:Bar(206847, 36.0)
elseif spellId == 221149 or spellId == 227277 then -- Manifest Azzinoth
self:MessageOld("manifest", "yellow", "alert", 221149, L.manifest_icon)
self:CDBar(221408, 15.0) -- Bulwark of Azzinoth
self:Bar("manifest", 41.0, 221149, L.manifest_icon) -- Glaive Icon
elseif spellId == 227071 then -- Flame Crash
crashCounter = crashCounter + 1
self:Bar(spellId, crashCounter == 5 and 50 or crashCounter == 8 and 50 or 20, CL.count:format(self:SpellName(spellId), crashCounter))
elseif spellId == 227283 then -- Nightorb
orbCounter = orbCounter + 1
self:MessageOld("nightorb", "yellow", "alert", spellId, L.nightorb_icon)
if orbCounter ~= 5 then
self:Bar("nightorb", orbCounter == 3 and 60 or orbCounter == 4 and 40 or 45, CL.count:format(self:SpellName(spellId), orbCounter), L.nightorb_icon)
end
end
end
function mod:RAID_BOSS_EMOTE(event, msg)
if msg:find("206221", nil, true) and not bondsEmpowered then -- Gains Empowered Bonds of Fel
bondsEmpowered = true
self:MessageOld(209011, "cyan", nil, L.gains:format(self:SpellName(206221)))
local oldText = CL.count:format(self:SpellName(209011), bondsCount)
self:Bar(209011, self:BarTimeLeft(oldText), CL.count:format(L.empowered:format(self:SpellName(209011)), bondsCount)) -- (E) Bonds of Fel
self:StopBar(oldText) -- Bonds of Fel
elseif msg:find("206220", nil, true) and not liquidHellfireEmpowered then -- Empowered Liquid Hellfire
liquidHellfireEmpowered = true -- Fires every cast, not just on gaining empowered
self:MessageOld(206219, "cyan", nil, L.gains:format(self:SpellName(206220)))
local oldText = CL.count:format(self:SpellName(206219), liquidHellfireCount)
self:Bar(206219, self:BarTimeLeft(oldText), CL.count:format(L.empowered:format(self:SpellName(206219)), liquidHellfireCount)) -- (E) Liquid Hellfire
self:StopBar(oldText) -- Liquid Hellfire
elseif msg:find("211152", nil, true) and not eyeEmpowered then -- Empowered Eye of Gul'dan
eyeEmpowered = true
self:MessageOld(211152, "cyan", nil, L.gains:format(self:SpellName(211152)))
local oldText = CL.count:format(self:SpellName(209270), eyeCount)
self:Bar(211152, self:BarTimeLeft(oldText), CL.count:format(L.empowered:format(self:SpellName(209270)), eyeCount)) -- (E) Eye of Guldan
self:StopBar(oldText) -- Eye of Gul'dan
end
end
--[[ Essence of Aman'Thul ]]--
function mod:TimeDilation(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue")
end
end
do
local list = mod:NewTargetList()
function mod:ScatteringField(args)
list[#list+1] = args.destName
if #list == 1 then
self:ScheduleTimer("TargetMessageOld", 0.5, args.spellId, list, "green", "info", nil, nil, true)
end
if self:Me(args.sourceGUID) then
self:Say(args.spellId)
end
end
end
function mod:ResonantBarrier(args)
self:TargetMessageOld(args.spellId, args.destName, "green")
self:TargetBar(args.spellId, 6, args.destName)
end
function mod:EyeOfAmanThul(args)
self:MessageOld("stages", "cyan", "long", args.spellName, args.spellId)
if self:Easy() then
self:Bar(206514, 9.8) -- Fel Efflux
end
end
function mod:EyeOfAmanThulRemoved(args) -- Phase 2 start
if phase ~= 2 then -- Boss say message is faster, don't trigger if we already are in phase 2
self:StopBar(CL.count:format(self:SpellName(206219), liquidHellfireCount)) -- Liquid Hellfire
self:StopBar(206514) -- Fel Efflux
phase = 2
handOfGuldanCount = 1
liquidHellfireCount = 1
bondsCount = 1
eyeCount = 1
self:MessageOld("stages", "cyan", "long", CL.stage:format(2), args.spellId)
self:Bar(209011, self:Easy() and 7.5 or 9.5, CL.count:format(self:SpellName(209011), bondsCount)) -- Bonds of Fel
if not self:Easy() then
self:Bar(212258, 13.5, CL.count:format(self:SpellName(212258), handOfGuldanCount)) -- Hand of Gul'dan
end
self:Bar(206219, self:Easy() and 45 or 23.5, CL.count:format(self:SpellName(206219), liquidHellfireCount)) -- Liquid Hellfire
self:Bar(209270, self:Easy() and 32.4 or 29, CL.count:format(self:SpellName(209270), eyeCount)) -- Eye of Gul'dan
end
end
function mod:Deaths(args)
if args.mobId == 104537 then -- Fel Lord Kuraz'mal
self:StopBar(206675) -- Shatter Essence
self:StopBar(229945) -- Fel Obelisk
elseif args.mobId == 104534 then -- D'zorykx the Trapper
self:StopBar(206883) -- Soul Vortex
self:StopBar(CL.cast:format(self:SpellName(206883))) -- Soul Vortex cast
elseif args.mobId == 111070 then -- Azzinoth
self:StopBar(221336) -- Chaos Seed
elseif args.mobId == 104154 and self:Mythic() then -- Guldan
self:StopBar(CL.count:format(self:SpellName(221606), flamesCount % 3 == 0 and 3 or flamesCount % 3)) -- Flames Bar
self:StopBar(206744) -- Black Harvest
self:StopBar(167935) -- Storm of the Destroyer
self:StopBar(CL.count:format(L.empowered:format(self:SpellName(209270)), eyeCount)) -- Eye of Guldan
end
end
--[[ Stage One ]]--
function mod:LiquidHellfire(args)
local spellName = self:SpellName(206219)
self:MessageOld(206219, "orange", "alarm", CL.incoming:format(CL.count:format(args.spellName, liquidHellfireCount)))
liquidHellfireCount = liquidHellfireCount + 1
if self:Mythic() and liquidHellfireCount == 3 then -- Empowered spells are set in Mythic
liquidHellfireEmpowered = true
end
if liquidHellfireEmpowered then
spellName = L.empowered:format(spellName)
end
local t = 0
if phase == 1 then
t = liquidHellfireCount == 2 and 15 or (self:Easy() and liquidHellfireCount > 3 and 32.5) or 25
elseif self:Mythic() then
t = (liquidHellfireCount == 5 or liquidHellfireCount == 7) and 66 or 33
elseif self:Easy() then
t = liquidHellfireCount == 5 and 82.5 or 41.2
else
t = liquidHellfireCount == 5 and 73.2 or 36.6
end
self:Bar(206219, t, CL.count:format(spellName, liquidHellfireCount)) -- gets skipped once
end
function mod:FelEfflux(args)
effluxCount=effluxCount+1
self:MessageOld(args.spellId, "red", "alert")
if self:Easy() then
self:CDBar(args.spellId, 15.6) -- easy: pull, 11, 14, EyeOfAmanThul, 10, 15.6, 16.8, 15.6,...
else
self:Bar(args.spellId, effluxTimers[effluxCount] or 12)
end
end
do
local prev = 0
function mod:FelEffluxDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(206514, "blue", "alarm", CL.underyou:format(args.spellName))
end
end
end
function mod:HandOfGuldan(args)
self:MessageOld(args.spellId, "yellow", "info")
handOfGuldanCount = handOfGuldanCount + 1
if phase == 1 and handOfGuldanCount < 4 then
self:Bar(args.spellId, handOfGuldanCount == 2 and 14 or 10, CL.count:format(args.spellName, handOfGuldanCount))
elseif phase == 2 then
local timer = timers[args.spellId][handOfGuldanCount]
if timer then
self:Bar(args.spellId, timer, CL.count:format(args.spellName, handOfGuldanCount))
end
end
end
--[[ Inquisitor Vethriz ]]--
function mod:Shadowblink(args)
self:MessageOld(args.spellId, "yellow", "info")
end
function mod:Drain(args)
if self:Dispeller("magic") or self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "orange", "alarm")
end
end
function mod:GazeOfVethrizCast(args)
self:MessageOld(args.spellId, "yellow", "info")
end
do
local prev = 0
function mod:GazeOfVethrizDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(206840, "blue", "alarm", CL.underyou:format(args.spellName))
end
end
end
--[[ Fel Lord Kuraz'mal ]]--
function mod:ShatterEssence(args)
self:MessageOld(args.spellId, "red", "warning", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 3)
self:Bar(args.spellId, self:Mythic() and 21 or 52)
end
--[[ D'zorykx the Trapper ]]--
function mod:AnguishedSpirits(args)
self:MessageOld(args.spellId, "yellow", "alert", CL.incoming:format(args.spellName))
end
function mod:SoulVortex(args)
self:MessageOld(args.spellId, "orange", "long")
self:CastBar(args.spellId, 9) -- actual cast + pull in
self:Bar(args.spellId, 21.1)
end
function mod:TornSoul(args)
if self:Tank(args.destName) then
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "orange", amount > 1 and "warning") -- check sound amount
self:TargetBar(args.spellId, 30, args.destName)
end
end
function mod:TornSoulRemoved(args)
self:StopBar(args.spellId, args.destName)
end
--[[ Stage Two ]]--
function mod:BondsOfFelCast(args)
local spellName = self:SpellName(209011)
self:MessageOld(209011, "yellow", "info", CL.casting:format(CL.count:format(args.spellName, bondsCount)))
bondsCount = bondsCount + 1
if self:Mythic() then -- Only the first cast is not empowered
bondsEmpowered = true
end
if bondsEmpowered then
spellName = L.empowered:format(spellName)
end
self:Bar(209011, self:Mythic() and 40 or self:Heroic() and 44.5 or 50, CL.count:format(spellName, bondsCount))
end
do
local list, scheduled = mod:NewTargetList(), nil
function mod:BondsOfFel(args)
list[#list+1] = args.destName
if #list == 1 then
scheduled = self:ScheduleTimer("TargetMessageOld", 1, 209011, list, "red", "warning", CL.count:format(self:SpellName(209011), bondsCount-1), nil, true) -- Have the bonds number in the list warning also
end
if self:Me(args.destGUID) then
self:Say(209011, CL.count:format(args.spellName, #list))
self:Flash(209011)
end
if #list == expectedBonds then
self:CancelTimer(scheduled)
self:TargetMessageOld(209011, list, "red", "warning", CL.count:format(self:SpellName(209011), bondsCount-1), nil, true) -- Have the bonds number in the list warning also
end
end
end
function mod:EyeOfGuldan(args)
local spellName = self:SpellName(209270)
self:MessageOld(args.spellId, "orange", "alert", CL.count:format(args.spellName, eyeCount))
eyeCount = eyeCount + 1
if self:Mythic() and eyeCount == 6 then -- Empowered Eye next in Mythic
eyeEmpowered = true
end
if eyeEmpowered then
spellName = L.empowered:format(spellName)
end
local timer = nil
if phase == 2 then
timer = self:LFR() and 64 or self:Normal() and 60 or (self:Mythic() and (eyeCount == 7 and 80 or 48)) or 53.3
else
timer = timers[211152][eyeCount]
end
if timer or self:Easy() then -- message for incomplete easy timers
self:Bar(args.spellId, timer, CL.count:format(spellName, eyeCount))
end
end
function mod:EyeOfGuldanApplied(args)
if self:Me(args.destGUID) then
eyeOnMe = true
local spellId = args.spellId == 209454 and 209270 or 211152
local spellName = args.spellId == 209454 and args.spellName or L.empowered:format(args.spellName)
self:MessageOld(spellId, "blue", "alert", CL.you:format(spellName))
self:OpenProximity(spellId, 8)
end
end
function mod:EyeOfGuldanRemoved(args)
if self:Me(args.destGUID) then
eyeOnMe = false
self:CloseProximity(args.spellId == 209454 and 209270 or 211152)
end
end
do
local prev = 0
function mod:EyeofGuldandDamage(args)
if self:Me(args.destGUID) then
local spellId = args.spellId == 209518 and 209270 or 211152
local spellName = args.spellId == 209518 and args.spellName or L.empowered:format(args.spellName)
local t = GetTime()
if t-prev < 0.5 then -- Warn if you take more than one tick
self:MessageOld(spellId, "blue", "alert", CL.underyou:format(spellName))
elseif eyeOnMe == false then -- Always warn if you arn't fixated
self:MessageOld(spellId, "blue", "alert", CL.underyou:format(spellName))
end
prev = t
end
end
end
do
local prev = 0
function mod:Duplicate(args)
local t = GetTime()
if t-prev > 1.5 then
prev = t
self:MessageOld(209270, "cyan", "info", args.spellId)
end
end
end
function mod:CarrionWave(args)
if self:Interrupter(args.sourceGUID) then
self:MessageOld(args.spellId, "yellow", "long")
self:Bar(args.spellId, 6.1)
end
end
--[[ Stage Three ]]--
function mod:FuryOfTheFel(args)
local amount = args.amount or 1
self:MessageOld(args.spellId, "green", "info", CL.count:format(args.spellName, amount))
end
function mod:Phase3Start(args) -- The Eye of Aman'thul applied (227427)
self:StopBar(CL.count:format(self:SpellName(212258), handOfGuldanCount)) -- Hand of Gul'dan
self:StopBar(CL.count:format(L.empowered:format(self:SpellName(209011)), bondsCount)) -- Empowered Bonds of Fel
self:StopBar(CL.count:format(L.empowered:format(self:SpellName(206219)), liquidHellfireCount)) -- Empowered Liquid Hellfire
self:StopBar(CL.count:format(L.empowered:format(self:SpellName(209270)), eyeCount)) -- Empowered Eye of Gul'dan
eyeCount = 1
phase = 3
self:MessageOld("stages", "cyan", "long", CL.stage:format(3), args.spellId)
self:Bar("stages", 8, args.spellName, args.spellId) -- Eye of Aman'Thul
self:CDBar("winds", 11.5, CL.count:format(self:SpellName(218144), blackHarvestCount), 218144) -- Violent Winds, using blackHarvestCount, only once below Mythic.
self:Bar(206939, 15.2) -- Well of Souls
self:Bar(221606, self:Mythic() and 24.5 or self:Heroic() and 27.5 or 29.3) -- Flames of Sargeras
self:Bar(211152, timers[211152][eyeCount], CL.count:format(L.empowered:format(self:SpellName(209270)), eyeCount)) -- Empowered Eye of Gul'dan
self:Bar(206744, timers[206744][blackHarvestCount], CL.count:format(self:SpellName(206744), blackHarvestCount)) -- Black Harvest
self:Bar(167935, self:Easy() and 94 or timers[167935][stormCount]) -- Storm of the Destroyer
end
function mod:StormOfTheDestroyer(args)
self:MessageOld(167935, "red", "long")
if args.spellId == 167819 then -- First Storm
stormCount = stormCount + 1
if self:Easy() then
self:Bar(167935, stormCount == 2 and 78.5 or 70)
else
local timer = timers[167935][stormCount]
if timer then
self:Bar(167935, timer) -- timers should be complete
end
end
end
end
do
local list = mod:NewTargetList()
function mod:SoulSiphon(args)
list[#list+1] = args.destName
if #list == 1 then
self:ScheduleTimer("TargetMessageOld", 1, args.spellId, list, "red")
end
end
end
function mod:SoulCorrosion(args)
if self:Me(args.destGUID) then
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "blue", amount > 2 and "info") -- check sound amount
end
end
function mod:BlackHarvest(args)
self:MessageOld(args.spellId, "orange", "alert", CL.count:format(args.spellName, blackHarvestCount))
blackHarvestCount = blackHarvestCount + 1
local timer = timers[args.spellId][blackHarvestCount]
if timer or self:Easy() then -- message for incomplete easy timers
self:CDBar(args.spellId, timer, CL.count:format(args.spellName, blackHarvestCount))
end
-- Violet Winds timers
if self:Mythic() then
local windsTimer = timers[218144][blackHarvestCount]
if windsTimer then
self:Bar("winds", windsTimer, CL.count:format(self:SpellName(218144), blackHarvestCount), 218144)
end
end
end
do
local prev = 0
function mod:DesolateGroundDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(args.spellId, "blue", "alarm", CL.underyou:format(args.spellName))
end
end
end
do
local prev = 0
function mod:FlamesOfSargerasSoon(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue", "warning")
self:Say(args.spellId)
self:Flash(args.spellId)
self:TargetBar(args.spellId, 6, args.destName)
elseif self:Tank(args.destName) and self:Tank() then -- Tank taunt mechanic in P3
self:TargetMessageOld(args.spellId, args.destName, "blue", "warning")
end
local t = GetTime()
if t-prev > 5 then
prev = t
flamesCount = flamesCount + 1
if self:Easy() then
self:Bar(args.spellId, flamesCount == 9 and 41 or flamesCount % 2 == 0 and 19 or 39.6)
else
local timer = timers[args.spellId][flamesCount]
if timer then
self:Bar(args.spellId, timer, CL.count:format(args.spellName, flamesCount % 3 == 0 and 3 or flamesCount % 3))
end
end
end
end
end
-- Mythic Only
function mod:WilloftheDemonWithin(args)
if phase ~= 4 then -- Fallback for missing the p4 yell
phase = 4
self:MessageOld("stages", "cyan", "long", CL.stage:format(phase), false)
end
self:MessageOld(args.spellId, "yellow", "warning")
self:CastBar(args.spellId, 4)
severCount = 1
crashCounter = 1
orbCounter = 1
visionCounter = 1
self:Bar(206847, 8.6) -- Parasitic Wound
self:Bar(220957, 19.6, CL.count:format(self:SpellName(220957), severCount)) -- Soulsever
self:Bar("manifest", 26.6, 221149, L.manifest_icon) -- Manifest Azzinoth
self:Bar(227071, 29.6, CL.count:format(self:SpellName(227071), crashCounter)) -- Flame Crash
self:Bar("nightorb", 39.6, CL.count:format(self:SpellName(227283), orbCounter), L.nightorb_icon) -- Summon Nightorb
self:Bar(227008, 96.2, CL.count:format(self:SpellName(227008), visionCounter)) -- Visions of the Dark Titan
end
do
local playerList = mod:NewTargetList()
function mod:ParasiticWound(args)
local _, _, _, expires = self:UnitDebuff(args.destName, args.spellName, args.spellId)
local remaining = expires-GetTime()
if self:Me(args.destGUID) then
self:Flash(args.spellId)
self:Say(args.spellId)
for i = 1, 3 do
if remaining-i > 0 then
parasiteSayTimers[#parasiteSayTimers+1] = self:ScheduleTimer("Say", remaining-i, 206847, i, true)
end
end
end
playerList[#playerList+1] = args.destName
if #playerList == 1 then
self:ScheduleTimer("TargetMessageOld", 0.1, args.spellId, playerList, "orange", "alarm", nil, nil, true)
end
end
end
function mod:ParasiticWoundRemoved(args) -- Stop Parasite Say Messages
if self:Me(args.destGUID) then
for _,timer in pairs(parasiteSayTimers) do
self:CancelTimer(timer)
end
parasiteSayTimers = {}
end
end
function mod:TimeStop(args) -- Stop Parasite Say Messages
if self:Me(args.destGUID) then
for _,timer in pairs(parasiteSayTimers) do
self:CancelTimer(timer)
end
parasiteSayTimers = {}
end
end
function mod:TimeStopRemoved(args) -- Resume Parasite Say Messages
if self:Me(args.destGUID) then
local debuff, _, _, expires = self:UnitDebuff("player", self:SpellName(206847))
if not debuff then return end
local remaining = floor(expires - GetTime())
for i = 1, 3 do
if remaining-i > 0 then
parasiteSayTimers[#parasiteSayTimers+1] = self:ScheduleTimer("Say", remaining-i, 206847, i, true)
end
end
end
end
do
-- 4 Fixates, 2 players, avoid double names in list.
local playerList, first = mod:NewTargetList(), ""
function mod:ShadowyGaze(args)
if #playerList == 0 then -- First fixate
first = args.destName
playerList[#playerList+1] = args.destName
self:ScheduleTimer("TargetMessageOld", 0.1, args.spellId, playerList, "red", "info")
end
if args.destName ~= first and #playerList < 2 then -- Second Fixate
playerList[#playerList+1] = args.destName
end
end
end
function mod:Soulsever(args)
severCount = severCount + 1
self:MessageOld(args.spellId, "orange", self:Tank() and "warning", args.spellName)
self:Bar(args.spellId, severCount == 5 and 50 or severCount == 8 and 50 or 20, CL.count:format(args.spellName, severCount))
end
function mod:ShearedSoul(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(220957, args.destName, "blue", "alert")
end
end
do
local timeStop = mod:SpellName(206310)
local function checkForTimeStop(self)
if UnitIsDead("player") then
-- Nothing
elseif not self:UnitDebuff("player", timeStop) then
self:MessageOld(206310, "blue", "warning", CL.no:format(timeStop))
timeStopCheck = self:ScheduleTimer(checkForTimeStop, 1.5, self)
else
self:MessageOld(206310, "green", nil, CL.you:format(timeStop))
end
end
function mod:PurifiedEssence(args)
self:MessageOld(args.spellId, "red", "alarm", CL.cast:format(CL.count:format(args.spellName, essenceCount)))
essenceCount = essenceCount + 1
self:CastBar(args.spellId, 4, CL.count:format(args.spellName, essenceCount))
if not timeStopCheck then
checkForTimeStop(self)
end
end
function mod:PurifiedEssenceSuccess()
if timeStopCheck then
self:CancelTimer(timeStopCheck)
timeStopCheck = nil
end
end
function mod:VisionsoftheDarkTitan(args)
visionCounter = visionCounter+1
self:MessageOld(args.spellId, "red", "alarm", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 9)
if visionCounter ~= 4 then
self:Bar(args.spellId, visionCounter == 3 and 150 or 90, CL.count:format(args.spellName, visionCounter))
end
if not timeStopCheck then
checkForTimeStop(self)
end
end
function mod:VisionsoftheDarkTitanSuccess()
if timeStopCheck then
self:CancelTimer(timeStopCheck)
timeStopCheck = nil
end
end
end
function mod:Wounded(args)
self:MessageOld(args.spellId, "cyan", "long")
self:Bar(args.spellId, 15)
self:StopBar(CL.cast:format(self:SpellName(227008))) -- Visions of the Dark Titan
end
-- Shard of Azzinoth
function mod:ChaosSeed(args)
self:Bar(args.spellId, 10.9)
end
function mod:BulwarkofAzzinoth(args)
self:MessageOld(args.spellId, "orange", "alert")
end
function mod:NightorbDeath()
self:Bar(206310, 10, CL.count:format(L.timeStopZone, orbCounter-1))
end