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.

386 lines
12 KiB

--------------------------------------------------------------------------------
-- TODO List:
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Xavius", 1520, 1726)
if not mod then return end
mod:RegisterEnableMob(103769)
mod.engageId = 1864
mod.respawnTime = 15
--------------------------------------------------------------------------------
-- Locals
--
local phase = 1
local lurkingEruptionCount = 1
local horrorCount = 1
local isInDream = false
local bladeList, bondList = mod:NewTargetList(), mod:NewTargetList()
local dreamHealers = {}
local dreamingCount = 1
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.horror = -12973
L.linked = "Bonds of Terror on YOU! - Linked with %s!"
L.dreamHealers = "Dream Healers"
end
--------------------------------------------------------------------------------
-- Initialization
--
local bladeMarker = mod:AddMarkerOption(false, "player", 1, 211802, 1, 2) -- Nightmare Blades
function mod:GetOptions()
return {
--[[ General ]]--
"berserk",
"stages",
"altpower",
208431, -- Decent Into Madness
207409, -- Madness
{206005, "INFOBOX"}, -- Dream Simulacrum
211634, -- The Infinite Dark
--[[ Corruption Horror ]]--
{224649, "TANK"}, -- Tormenting Swipe
207830, -- Corrupting Nova
--[[ Stage One: The Decent Into Madness ]]--
{206651, "TANK_HEALER"}, -- Darkening Soul
{211802, "SAY", "FLASH"}, -- Nightmare Blades
bladeMarker,
210264, -- Manifest Corruption
205771, -- Tormenting Fixation
205741, -- Lurking Eruption (Lurking Terror)
--[[ Stage Two: From the Shadows ]]--
{209034, "SAY", "FLASH", "PROXIMITY"}, -- Bonds of Terror
224508, -- Corruption Meteor
{209158, "TANK_HEALER"}, -- Blackening Soul
{209443, "TANK"}, --Nightmare Infusion
205588, -- Call of Nightmares
--[[ Stage Three: World of Darkness ]]--
226194, -- Writhing Deep
--[[ Mythic ]]--
205843, -- The Dreaming
},{
["berserk"] = "general",
[206651] = -12971, -- Stage One: The Decent Into Madness
[209034] = -13152, -- Stage Two: From the Shadows
[226194] = -13160, -- Stage Three: World of Darkness
[205843] = "mythic",
}
end
function mod:OnBossEnable()
--[[ General ]]--
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_AURA_APPLIED", "DecentIntoMadness", 208431)
self:Log("SPELL_AURA_REMOVED", "DecentIntoMadnessRemoved", 208431)
self:Log("SPELL_AURA_APPLIED", "Madness", 207409)
self:Log("SPELL_AURA_APPLIED", "DreamSimulacrum", 206005)
self:Log("SPELL_AURA_REMOVED", "DreamSimulacrumRemoved", 206005)
self:Log("SPELL_AURA_APPLIED", "TheInfiniteDark", 211634)
self:Log("SPELL_PERIODIC_MISSED", "TheInfiniteDark", 211634)
self:Log("SPELL_PERIODIC_DAMAGE", "TheInfiniteDark", 211634)
--[[ Stage One: The Decent Into Madness ]]--
self:Log("SPELL_AURA_APPLIED", "DarkeningSoul", 206651)
self:Log("SPELL_AURA_APPLIED_DOSE", "DarkeningSoul", 206651)
self:Log("SPELL_AURA_APPLIED", "NightmareBlades", 211802)
self:Log("SPELL_AURA_REMOVED", "NightmareBladesRemoved", 211802)
self:Log("SPELL_CAST_SUCCESS", "ManifestCorruption", 210264)
self:Log("SPELL_DAMAGE", "LurkingEruptionUnderYou", 205741)
self:Log("SPELL_MISSED", "LurkingEruptionUnderYou", 205741)
self:Log("SPELL_AURA_APPLIED", "TormentingFixation", 205771)
self:Log("SPELL_SUMMON", "LurkingEruption", 205741) -- Lurking Terror
--[[ Corruption Horror ]]--
self:Log("SPELL_CAST_SUCCESS", "TormentingSwipe", 224649)
self:Log("SPELL_CAST_SUCCESS", "CorruptingNova", 207830)
self:Death("HorrorDeath", 103695)
--[[ Stage Two: From the Shadows ]]--
self:Log("SPELL_AURA_APPLIED", "CorruptionMeteor", 224508)
self:Log("SPELL_AURA_APPLIED", "BondsOfTerror", 209034, 210451) -- 2 debuffs, 1st id could also be used for spellcast events
self:Log("SPELL_AURA_REMOVED", "BondsOfTerrorRemoved", 209034, 210451)
self:Log("SPELL_AURA_APPLIED", "BlackeningSoul", 209158)
self:Log("SPELL_AURA_APPLIED_DOSE", "BlackeningSoul", 209158)
self:Log("SPELL_AURA_APPLIED", "NightmareInfusion", 209443)
self:Log("SPELL_CAST_SUCCESS", "CallOfNightmares", 205588)
--[[ Stage Three: World of Darkness ]]--
self:Log("SPELL_CAST_SUCCESS", "WrithingDeep", 226194)
end
function mod:OnEngage()
phase = 1
lurkingEruptionCount = 1
horrorCount = 1
dreamingCount = 1
bladeList = self:NewTargetList()
bondList = self:NewTargetList()
dreamHealers = {}
isInDream = false
self:Bar(206651, 7.5) -- Darkening Soul
self:Bar(205741, 18) -- Lurking Eruption (Lurking Terror)
self:Bar(211802, 19.2) -- Nightmare Blades
self:Bar(210264, 59, CL.count:format(self:SpellName(210264), horrorCount)) -- Manifest Corruption
self:OpenAltPower("altpower", 208931) -- Nightmare Corruption
self:OpenInfo(206005, L.dreamHealers)
end
--------------------------------------------------------------------------------
-- Event Handlers
--
--[[ General ]]--
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 226193 then -- Xavius Energize Phase 2
phase = 2
self:MessageOld("stages", "cyan", "long", "65% - ".. CL.stage:format(2), false)
self:StopBar(206651) -- Darkening Soul
self:StopBar(211802) -- Nightmare Blades
self:StopBar(CL.count:format(self:SpellName(210264), horrorCount)) -- Manifest Corruption
self:StopBar(CL.count:format(self:SpellName(205741), lurkingEruptionCount)) -- Lurking Eruption (Lurking Terror)
self:Bar(209158, 7) -- Blackening Soul
self:Bar(205588, (100 - UnitPower("boss1")) / 2.5) -- Call of Nightmares
if not self:Easy() then
self:Bar(209034, 15.5) -- Bonds of Terror
end
self:Bar(209443, 29) -- Nightmare Infusion
elseif spellId == 226185 then -- Xavius Energize Phase 3
self:MessageOld("stages", "cyan", "long", "30% - ".. CL.stage:format(3), false)
phase = 3
self:StopBar(209034) -- Bonds of Terror
self:StopBar(205588) -- Call of Nightmares
self:Bar(224508, 20.7) -- Corruption Meteor
self:Bar(211802, 33) -- Nightmare Blades
self:Bar(226194, (100 - UnitPower("boss1")) / 4.83) -- Writhing Deep
elseif spellId == 205843 then -- The Dreaming
local percentage = dreamingCount == 1 and "97% - " or "60% - "
if self:Mythic() then
percentage = dreamingCount == 1 and "97% - " or dreamingCount == 2 and "80% - " or dreamingCount == 3 and "60% - " or "45% - "
self:CastBar(spellId, 6, CL.count:format(self:SpellName(spellId), dreamingCount))
end
self:MessageOld(spellId, "green", "long", percentage .. CL.count:format(self:SpellName(spellId), dreamingCount))
dreamingCount = dreamingCount + 1
end
end
function mod:DecentIntoMadness(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue", "alarm")
self:TargetBar(args.spellId, 20, args.destName)
end
end
function mod:DecentIntoMadnessRemoved(args)
if self:Me(args.destGUID) then
self:StopBar(args.spellId, args.destName)
end
end
function mod:Madness(args)
self:TargetMessageOld(args.spellId, args.destName, "red", "alarm", nil, nil, true)
end
function mod:DreamSimulacrum(args)
if self:Me(args.destGUID) then
isInDream = true
self:TargetMessageOld(args.spellId, args.destName, "blue", "info")
self:TargetBar(args.spellId, 180, args.destName)
end
if self:Healer(args.destName) then
dreamHealers[args.destName] = 1
self:SetInfoByTable(args.spellId, dreamHealers)
end
end
function mod:DreamSimulacrumRemoved(args)
if self:Me(args.destGUID) then
isInDream = false
self:StopBar(args.spellId, args.destName)
end
if self:Healer(args.destName) then
dreamHealers[args.destName] = nil
self:SetInfoByTable(args.spellId, dreamHealers)
end
end
do
local prev = 0
function mod:LurkingEruption(args)
local t = GetTime()
if t-prev > 5 then
prev = t
lurkingEruptionCount = lurkingEruptionCount + 1
self:Bar(args.spellId, lurkingEruptionCount % 3 == 0 and 41 or 20.5, CL.count:format(args.spellName, lurkingEruptionCount))
end
end
end
do
local prev = 0
function mod:TheInfiniteDark(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(args.spellId, "blue", "alert", CL.you:format(args.spellName))
end
end
end
--[[ Corruption Horror ]]--
function mod:TormentingSwipe(args)
self:CDBar(args.spellId, 10)
end
function mod:CorruptingNova(args)
self:Bar(args.spellId, 20.7)
self:MessageOld(args.spellId, "yellow", nil, CL.casting:format(args.spellName))
end
function mod:HorrorDeath()
self:StopBar(207830) -- Corrupting Nova
self:StopBar(224649) -- Tormenting Swipe
end
--[[ Stage One: The Decent Into Madness ]]--
function mod:DarkeningSoul(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "orange", amount > 2 and "warning")
self:CDBar(args.spellId, self:Mythic() and 8.5 or 10) -- ~10 early in the fight, ~13-17 later
end
do
local timer = nil
function mod:NightmareBlades(args)
if self:Me(args.destGUID) then
self:Flash(args.spellId)
self:Say(args.spellId)
end
bladeList[#bladeList+1] = args.destName
if self:GetOption(bladeMarker) then
self:CustomIcon(false, args.destName, #bladeList) -- 1,2
end
if #bladeList == 1 then
self:CDBar(args.spellId, phase == 1 and 15.5 or 31)
timer = self:ScheduleTimer("TargetMessageOld", 0.5, args.spellId, bladeList, "red", "alert")
else
self:CancelTimer(timer)
timer = nil
self:TargetMessageOld(args.spellId, bladeList, "red", "alert")
end
end
function mod:NightmareBladesRemoved(args)
if self:GetOption(bladeMarker) then
self:CustomIcon(false, args.destName, 0)
end
end
end
function mod:ManifestCorruption(args)
self:MessageOld(args.spellId, "yellow", "info", CL.count:format(self:SpellName(L.horror), horrorCount), false)
self:Bar(args.spellId, 82.5, CL.count:format(args.spellName, horrorCount+1))
horrorCount = horrorCount + 1
self:CDBar(207830, 17) -- Corrupting Nova
self:CDBar(224649, 10) -- Tormenting Swipe
end
function mod:LurkingEruptionUnderYou(args)
if self:Me(args.destGUID) then
self:MessageOld(args.spellId, "blue", "alert", CL.underyou:format(args.spellName))
end
end
function mod:TormentingFixation(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue", "long")
end
end
--[[ Stage Two: From the Shadows ]]--
do
local timer, isOnMe, otherPlayer = nil, nil, nil
function mod:BondsOfTerror(args)
if self:Me(args.destGUID) then
isOnMe = true
self:Say(209034)
self:Flash(209034)
else
otherPlayer = args.destName
end
bondList[#bondList+1] = args.destName
if #bondList == 1 then
self:CDBar(209034, 14.5)
timer = self:ScheduleTimer("TargetMessageOld", 0.3, 209034, bondList, "red", "alert")
else -- applied on both
if isOnMe and otherPlayer then
self:MessageOld(209034, "blue", "warning", L.linked:format(self:ColorName(otherPlayer)))
self:OpenProximity(209034, 3, otherPlayer, true)
bondList = self:NewTargetList()
else
self:CancelTimer(timer)
timer = nil
self:TargetMessageOld(209034, bondList, "red", "alert")
end
end
end
function mod:BondsOfTerrorRemoved(args)
if self:Me(args.destGUID) then
isOnMe = nil
self:CloseProximity(209034)
else
otherPlayer = nil
end
end
end
function mod:BlackeningSoul(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "orange", amount > 2 and "warning")
self:Bar(args.spellId, self:Mythic() and 8.5 or 10)
end
function mod:NightmareInfusion(args)
self:TargetMessageOld(args.spellId, args.destName, "orange", "alarm", nil, nil, true)
self:Bar(args.spellId, phase == 2 and 62 or 31.6)
end
function mod:CallOfNightmares(args)
self:MessageOld(args.spellId, "yellow", "info", args.spellName)
self:Bar(args.spellId, 40)
end
function mod:CorruptionMeteor(args)
self:TargetMessageOld(args.spellId, args.destName, "yellow", "info", nil, nil, isInDream)
self:TargetBar(args.spellId, 5, args.destName)
self:Bar(args.spellId, phase == 2 and 28 or 35.3)
end
--[[ Stage Three: World of Darkness ]]--
function mod:WrithingDeep(args)
self:MessageOld(args.spellId, "orange", "alert")
self:CDBar(args.spellId, 20.7)
end