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.

402 lines
12 KiB

4 years ago
--------------------------------------------------------------------------------
-- TODO List:
-- Normal mode wave data
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Eonar the Life-Binder", 1712, 2025)
if not mod then return end
mod:RegisterEnableMob(122500, 124445) -- Essence of Eonar, The Paraxis
mod.engageId = 2075
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local rainofFelCounter = 1
local spearCounter = 1
local finalDoomCounter = 1
local lifeForceCounter = 1
local lifeForceNeeded = mod:LFR() and 3 or 4
local shouldAnnounceEnergy = true
local engageTime = 0
local timersLFR = {
--[[ Waves ]]--
["top"] = {
{88, "destructor"},
{218, "destructor"}
},
["mid"] = {
{10, "destructor"},
{135, "destructor"},
{263, "destructor"}
},
["bot"] = {
{50, "destructor"},
{175, "destructor"}
}
}
local timersNormal = {
--[[ Rain of Fel ]]--
[248332] = {30, 31, 35, 45, 80, 50, 20, 35, 20}, -- XXX vary a lot across logs
--[[ Waves ]]--
["top"] = {
{112, "destructor"},
{236, "destructor"}
},
["mid"] = {
{6, "destructor"},
{74, "destructor"},
{165, "obfuscator"},
{285, "destructor"}
},
["bot"] = {
{44, "destructor"},
{125, nil}, -- XXX not confirmed
{205, "destructor"}
},
["air"] = {
{195, nil} -- XXX not confirmed
}
}
local timersHeroic = {
--[[ Rain of Fel ]]--
[248332] = {15, 38.5, 10, 45, 34.5, 19, 19, 29, 44.5, 35, 97, 99.5},
--[[ Spear of Doom ]] --
[248861] = {29.7, 59.6, 64.5, 40.3, 84.6, 35.2, 65.7, 35.1, 64.3},
--[[ Waves ]]-- -- XXX Check these after implementation
["top"] = {
{68, "obfuscator"},
{87, "destructor"},
{192, "small_adds"},
{320, "destructor"},
},
["mid"] = {
{6.8, "destructor"},
{114, "purifier"},
{215, "purifier"}, -- Also spawns a obfuscator
{320, "destructor"},
},
["bot"] = {
{35, "destructor"},
{190, "destructor"}, -- Also spawns a purifier
{320, "obfuscator"},
},
["air"] = {
{159, nil},
{285, nil},
}
}
local timersMythic = {
--[[ Rain of Fel ]]--
[248332] = {6, 29, 25, 48.5, 5, 20, 50.5, 25, 4.5, 46, 24, 4, 50, 50, 50},
--[[ Spear of Doom ]] --
[248861] = {15, 75, 75, 75, 25, 75, 75, 50, 50},
--[[ Final Doom ]]--
[249121] = {60.5, 120, 100.5, 104.5, 100.5}, -- they seem to vary a bit
--[[ Waves ]]--
["top"] = {
{38, "destructor"},
{145, "small_adds"},
{328, "obfuscator"},
{352, "purifier"},
{424, "destructor"},
},
["mid"] = {
{11, "destructor"},
{65, "purifier"},
{133, "purifier"},
{278, "obfuscator"},
{403, "destructor"}, -- confirm / exact time needed
},
["bot"] = {
{38, "obfuscator"},
{110, "destructor"}, -- seems to vary a bit
{208, "purifier"},
{297, "small_adds"},
{413, "obfuscator"}, -- confirm / exact time needed
},
["air"] = {
{165, nil},
{260, nil}, -- confirm / exact time needed
{360, nil}, -- confirm / exact time needed
{480, nil}, -- confirm / exact time needed
}
}
local timers = mod:Mythic() and timersMythic or mod:Heroic() and timersHeroic or mod:LFR() and timersLFR or timersNormal
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.warp_in = mod:SpellName(246888)
L.warp_in_desc = "Shows timers and messages for each wave, along with any special adds in the wave."
L.warp_in_icon = "inv_artifact_dimensionalrift"
L.lifeforce_casts = "%s (%d/%d)"
L.lane_text = "%s: %s" -- example: Top: Purifier
L.top_lane = "Top"
L.mid_lane = "Mid"
L.bot_lane = "Bot"
L.purifier = "Purifier" -- Fel-Powered Purifier
L.destructor = "Destructor" -- Fel-Infused Destructor
L.obfuscator = "Obfuscator" -- Fel-Charged Obfuscator
L.bats = "Fel Bats"
L.small_adds = CL.small_adds
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
"warp_in",
"infobox",
250048, -- Life Force
248861, -- Spear of Doom
{248332, "SAY", "SAY_COUNTDOWN", "FLASH"}, -- Rain of Fel
249121, -- Final Doom
249934, -- Purge
{250693, "SAY", "SAY_COUNTDOWN", "FLASH"}, -- Arcane Buildup
{250691, "SAY", "SAY_COUNTDOWN", "FLASH"}, -- Burning Embers
250140, -- Foul Steps
},{
["warp_in"] = "general",
[249121] = "mythic",
}
end
function mod:OnBossEnable()
self:Log("SPELL_CAST_START", "LifeForce", 250048)
self:Log("SPELL_CAST_SUCCESS", "LifeForceSuccess", 250048)
self:RegisterEvent("CHAT_MSG_RAID_BOSS_EMOTE") -- Spear of Doom
self:Log("SPELL_AURA_APPLIED", "RainofFel", 248332)
self:Log("SPELL_AURA_REMOVED", "RainofFelRemoved", 248332)
--[[ Mythic ]]--
self:Log("SPELL_CAST_START", "FinalDoom", 249121)
self:Log("SPELL_CAST_START", "Purge", 249934)
self:Log("SPELL_AURA_APPLIED", "ArcaneBuildup", 250693) -- Feedback - Arcane Singularity
self:Log("SPELL_AURA_REMOVED", "ArcaneBuildupRemoved", 250693)
self:Log("SPELL_AURA_APPLIED", "BurningEmbers", 250691) -- Feedback - Burning Embers
self:Log("SPELL_AURA_REMOVED", "BurningEmbersRemoved", 250691)
self:Log("SPELL_AURA_APPLIED", "FoulSteps", 250140) -- Feedback - Foul Steps
self:Log("SPELL_AURA_APPLIED_DOSE", "FoulSteps", 250140)
end
function mod:OnEngage()
timers = self:Mythic() and timersMythic or self:Heroic() and timersHeroic or self:LFR() and timersLFR or timersNormal
rainofFelCounter = 1
spearCounter = 1
finalDoomCounter = 1
lifeForceCounter = 1
lifeForceNeeded = self:LFR() and 3 or 4
shouldAnnounceEnergy = true
engageTime = GetTime()
self:StartWaveTimer("top", 1) -- Top wave spawns
self:StartWaveTimer("mid", 1) -- Middle wave spawns
self:StartWaveTimer("bot", 1) -- Bottom wave spawns
if not self:LFR() then
self:StartWaveTimer("air", 1) -- Air wave spawns
self:Bar(248332, timers[248332][rainofFelCounter]) -- Rain of Fel
end
if self:Heroic() or self:Mythic() then
self:CDBar(248861, timers[248861][spearCounter]) -- Spear of Doom
end
if self:Mythic() then
self:CDBar(249121, timers[249121][finalDoomCounter], CL.count:format(self:SpellName(249121), finalDoomCounter)) -- Final Doom
end
self:RegisterUnitEvent("UNIT_POWER_FREQUENT", nil, "boss2")
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss2")
self:OpenInfo("infobox", self.displayName)
self:SetInfo("infobox", 1, self:SpellName(7850)) -- Health
self:SetInfo("infobox", 2, "100%")
self:SetInfoBar("infobox", 1, 1, 0, .7, 0, 0.3) -- green
self:SetInfo("infobox", 3, self:SpellName(185188)) -- Energy
self:SetInfo("infobox", 4, 0)
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:StartWaveTimer(lane, count)
local wavetimer = timers and timers[lane][count]
if not wavetimer then
-- No wave info
return
end
local time, addType = unpack(wavetimer)
local length = floor(time - (GetTime() - engageTime))
local laneText, icon = nil, nil
if lane == "top" then
laneText = L.top_lane
icon = "misc_arrowlup"
elseif lane == "mid" then
laneText = L.mid_lane
icon = "misc_arrowright"
elseif lane == "bot" then
laneText = L.bot_lane
icon = "misc_arrowdown"
elseif lane == "air" then
laneText = L.bats
icon = "inv_batpet"
end
local addTypeText = L[addType]
local barText = addTypeText and L.lane_text:format(laneText, addTypeText) or laneText
self:Bar("warp_in", length, barText, icon)
self:DelayedMessage("warp_in", length, "yellow", barText, icon, "alert")
self:ScheduleTimer("StartWaveTimer", length, lane, count+1)
end
function mod:UNIT_HEALTH(_, unit)
local hp = UnitHealth(unit)
local max = UnitHealthMax(unit)
local percent = hp/max
self:SetInfo("infobox", 2, ("%s/%s (%.0f%%)"):format(self:AbbreviateNumber(hp), self:AbbreviateNumber(max), percent*100))
self:SetInfoBar("infobox", 1, percent, 0, .7, 0, 0.3) -- green
end
function mod:UNIT_POWER_FREQUENT(_, unit)
local power = UnitPower(unit, 10) -- Enum.PowerType.Alternate = 10
if power >= 80 and shouldAnnounceEnergy then
shouldAnnounceEnergy = nil
self:MessageOld(250048, "cyan", "info", CL.soon:format(L.lifeforce_casts:format(self:SpellName(250048), lifeForceCounter, lifeForceNeeded))) -- Life Force (n/4) soon!
end
self:SetInfo("infobox", 4, ("%.0f"):format(power))
self:SetInfoBar("infobox", 3, power/100, .7, .7, 0, 0.3) -- yellow
end
function mod:LifeForce(args)
self:MessageOld(args.spellId, "green", "long", CL.casting:format(L.lifeforce_casts:format(args.spellName, lifeForceCounter, lifeForceNeeded)))
lifeForceCounter = lifeForceCounter + 1
end
function mod:LifeForceSuccess()
shouldAnnounceEnergy = true
end
function mod:CHAT_MSG_RAID_BOSS_EMOTE(_, msg)
if msg:find("248861") then -- Spear of Doom
self:MessageOld(248861, "red", "warning")
spearCounter = spearCounter + 1
self:CDBar(248861, timers[248861][spearCounter])
end
end
do
local playerList, prev = mod:NewTargetList(), 0
function mod:RainofFel(args)
playerList[#playerList+1] = args.destName
if self:Me(args.destGUID) then
self:Say(args.spellId)
self:Flash(args.spellId)
self:SayCountdown(args.spellId, 5)
self:PlaySound(args.spellId, "alarm")
end
self:TargetsMessage(args.spellId, "red", playerList, 6)
if #playerList == 1 then
local t = GetTime()
if t-prev > 5 then -- prevent a wrong bar if Rain of Fel gets delayed late
prev = t
rainofFelCounter = rainofFelCounter + 1
self:Bar(args.spellId, timers[args.spellId][rainofFelCounter])
end
end
end
function mod:RainofFelRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
end
end
function mod:FinalDoom(args)
self:MessageOld(args.spellId, "red", "warning", CL.count:format(args.spellName, finalDoomCounter))
self:CastBar(args.spellId, 50, CL.count:format(args.spellName, finalDoomCounter))
finalDoomCounter = finalDoomCounter + 1
self:Bar(args.spellId, timers[args.spellId][finalDoomCounter], CL.count:format(args.spellName, finalDoomCounter))
end
function mod:Purge(args)
self:StopBar(CL.cast:format(CL.count:format(self:SpellName(249121), finalDoomCounter-1)))
self:MessageOld(249121, "green", "info", CL.interrupted:format(self:SpellName(249121))) -- Final Doom
self:CastBar(args.spellId, 30)
end
function mod:ArcaneBuildup(args)
if self:Me(args.destGUID) then
self:PlaySound(args.spellId, "alarm")
self:PersonalMessage(args.spellId)
self:Say(args.spellId)
self:Flash(args.spellId)
self:SayCountdown(args.spellId, 5)
self:CastBar(args.spellId, 5, CL.you:format(args.spellName))
self:ScheduleTimer("Bar", 5, args.spellId, 20, CL.you:format(args.spellName))
end
end
function mod:ArcaneBuildupRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
end
function mod:BurningEmbers(args)
if self:Me(args.destGUID) then
self:PlaySound(args.spellId, "alarm")
self:PersonalMessage(args.spellId)
self:Say(args.spellId)
self:Flash(args.spellId)
self:SayCountdown(args.spellId, 5)
self:CastBar(args.spellId, 5, CL.you:format(args.spellName))
self:ScheduleTimer("Bar", 5, args.spellId, 25, CL.you:format(args.spellName))
end
end
function mod:BurningEmbersRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
end
function mod:FoulSteps(args)
local amount = args.amount or 1
if self:Me(args.destGUID) and amount % 3 == 0 then
self:StackMessage(args.spellId, args.destName, amount, "blue", amount > 5 and "alarm")
end
end