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.

268 lines
8.4 KiB

-- GLOBALS: BigWigsKrosusFirstBeamWasLeft, print
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Krosus", 1530, 1713)
if not mod then return end
mod:RegisterEnableMob(101002)
mod.engageId = 1842
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local normalTimers = { -- and LFR Timers
-- Fel Beam (spell id is the right one), _cast_success
[205370] = {9.5, 15, 30, 30, 23, 27, 30, 44, 14, 16, 14, 16, 22, 60},
-- Orb of Destruction, _aura_applied
[205344] = {70, 40, 60, 25, 60, 37, 15, 15, 30},
-- Burning Pitch, _cast_start
[205420] = {38, 102, 85, 90},
}
local heroicTimers = {
-- Fel Beam (spell id is the right one), _cast_success
[205370] = {11, 29, 30, 45, 16, 16, 14, 16, 27, 55, 26, 5, 21, 5, 12, 12, 5, 13},
-- Orb of Destruction, _aura_applied
[205344] = {20, 60, 23, 62, 27, 25, 15, 15, 15, 30, 55},
-- Burning Pitch, _cast_start
[205420] = {50, 85, 90, 94},
}
local mythicTimers = {
-- Fel Beam (spell id is the right one), _cast_success, didnt have enough logs to make sure they are all .0
[205370] = {9.0, 16.0, 16.0, 16.0, 14.0, 16.0, 27.0, 55.0, 26.0, 4.8, 21.3, 4.8, 12.3, 12.0, 4.8, 13.3, 19.0, 4.8, 25.3, 4.8, 25.3, 4.8},
-- Orb of Destruction, _aura_applied
[205344] = {13, 62, 27, 25, 15, 15, 15, 30, 55, 38, 30, 12, 18},
-- Burning Pitch, _cast_start
[205420] = {45, 90, 94, 78},
}
local beamCount = 1
local orbCount = 1
local burningPitchCount = 1
local slamCount = 1
local timers = mod:Mythic() and mythicTimers or mod:Heroic() and heroicTimers or normalTimers
local firstBeamLeft = true
local receivedBeamCom = nil
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.leftBeam = "Left Beam"
L.rightBeam = "Right Beam"
L.goRight = "> GO RIGHT >"
L.goLeft = "< GO LEFT <"
L.smashingBridge = "Smashing Bridge"
L.smashingBridge_desc = "Slams which break the bridge. You can use this option to emphasize or enable countdown."
L.smashingBridge_icon = 205862
L.removedFromYou = "%s removed from you" -- "Searing Brand removed from YOU!"
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
{206677, "TANK"}, -- Searing Brand
205370, -- Fel Beam
{205344, "SAY", "FLASH"}, -- Orb of Destruction
205862, -- Slam
"smashingBridge",
205420, -- Burning Pitch
208203, -- Isolated Rage
"berserk",
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_AURA_APPLIED", "SearingBrand", 206677)
self:Log("SPELL_AURA_APPLIED_DOSE", "SearingBrand", 206677)
self:Log("SPELL_AURA_REMOVED", "SearingBrandRemoved", 206677)
self:Log("SPELL_CAST_START", "FelBeamCast", 205370)
self:Log("SPELL_CAST_SUCCESS", "FelBeamSuccess", 205370)
self:Log("SPELL_AURA_APPLIED", "OrbOfDescructionApplied", 205344)
self:Log("SPELL_CAST_START", "SlamCast", 205862)
self:Log("SPELL_CAST_SUCCESS", "SlamSuccess", 205862)
self:Log("SPELL_CAST_START", "BurningPitchCast", 205420)
self:RegisterMessage("BigWigs_BossComm")
end
function mod:OnEngage()
beamCount = 1
orbCount = 1
burningPitchCount = 1
slamCount = 1
receivedBeamCom = nil
timers = self:Mythic() and mythicTimers or self:Heroic() and heroicTimers or normalTimers
self:Bar(205862, self:LFR() and 35 or 33, CL.count:format(self:SpellName(205862), slamCount))
self:Bar("smashingBridge", self:LFR() and 95 or 93, CL.count:format(L.smashingBridge, 1), L.smashingBridge_icon)
local firstBeam = timers[205370][beamCount]
self:Bar(205370, firstBeam, CL.count:format(self:SpellName(221153), beamCount)) -- "Beam"
self:Bar(205370, timers[205370][beamCount+1] + firstBeam, CL.count:format(self:SpellName(221153), beamCount+1)) -- "Beam"
self:Bar(205344, timers[205344][orbCount], CL.count:format(self:SpellName(205344), orbCount))
self:Bar(205420, timers[205420][burningPitchCount], CL.count:format(self:SpellName(205420), burningPitchCount))
end
--------------------------------------------------------------------------------
-- Event Handlers
--
local function getBeamText(count)
if receivedBeamCom then
if count % 2 == 1 then
return " " .. (firstBeamLeft and L.goRight or L.goLeft)
else
return " " .. (firstBeamLeft and L.goLeft or L.goRight)
end
end
return ""
end
do
local prev = 0
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 208203 then -- Isolated Rage
local t = GetTime()
if t-prev > 2.5 then
prev = t
self:MessageOld(spellId, "red", "alert")
end
end
end
end
function mod:SearingBrand(args)
local amount = args.amount or 1
if amount % 2 == 1 or amount > 3 then -- 1, 3, 4, 5, 6, 7, 8, ... < this is hc, might need to change for others
self:StackMessage(args.spellId, args.destName, amount, "orange")
end
end
function mod:SearingBrandRemoved(args)
if self:Me(args.destGUID) then
self:MessageOld(args.spellId, "orange", "warning", L.removedFromYou:format(args.spellName))
end
end
function mod:FelBeamCast(args)
self:MessageOld(args.spellId, "yellow", "info", args.spellName)
end
do
local spellName = mod:SpellName(221153) -- "Beam"
function mod:FelBeamSuccess(args)
beamCount = beamCount + 1
local t = timers[args.spellId][beamCount]
if t then
local text = CL.count:format(spellName, beamCount) .. getBeamText(beamCount)
self:Bar(args.spellId, t, text)
-- Additional timer to plan movement ahead
local t2 = timers[args.spellId][beamCount+1]
if t2 then
local text = CL.count:format(spellName, beamCount+1) .. getBeamText(beamCount+1)
self:Bar(args.spellId, t+t2, text)
end
end
end
end
function mod:OrbOfDescructionApplied(args)
self:TargetMessageOld(args.spellId, args.destName, "orange", "warning", CL.count:format(args.spellName, orbCount), nil, self:Ranged())
self:TargetBar(args.spellId, 5, args.destName, 230932, args.spellId) -- Orb
if self:Me(args.destGUID) then
self:Flash(args.spellId)
self:Say(args.spellId)
end
orbCount = orbCount + 1
local t = timers[args.spellId][orbCount]
if t then
self:Bar(args.spellId, t, CL.count:format(args.spellName, orbCount))
end
end
function mod:SlamCast(args)
if slamCount % 3 == 0 then
self:MessageOld("smashingBridge", "red", "alert", CL.casting:format(CL.count:format(args.spellName, slamCount)) .. " - "..L.smashingBridge, L.smashingBridge_icon)
else
self:MessageOld(args.spellId, "red", "alert", CL.casting:format(CL.count:format(args.spellName, slamCount)))
end
end
function mod:SlamSuccess(args)
self:MessageOld(args.spellId, "red", nil)
if slamCount % 3 == 0 and slamCount < 10 then
self:Bar("smashingBridge", 90, CL.count:format(L.smashingBridge, slamCount/3 + 1), L.smashingBridge_icon)
end
slamCount = slamCount + 1
if slamCount % 3 ~= 0 and slamCount < 12 then -- would mirror the smashing bridge bar otherwise
self:Bar(args.spellId, 30, CL.count:format(args.spellName, slamCount))
end
end
function mod:BurningPitchCast(args)
self:MessageOld(args.spellId, "yellow", "info")
burningPitchCount = burningPitchCount + 1
local t = timers[args.spellId][burningPitchCount]
if t then
self:Bar(args.spellId, t, CL.count:format(args.spellName, burningPitchCount))
end
end
local function fixBars(self)
-- Next Beam
local nextBeamText = CL.count:format(self:SpellName(221153), beamCount)
local nextBeamTime = self:BarTimeLeft(nextBeamText)
if nextBeamTime > 0 then
self:StopBar(nextBeamText)
self:Bar(205370, nextBeamTime, nextBeamText .. getBeamText(beamCount))
end
-- Next Beam + 1
local nextBeamText2 = CL.count:format(self:SpellName(221153), beamCount+1)
local nextBeamTime2 = self:BarTimeLeft(nextBeamText2)
if nextBeamTime2 > 0 then
self:StopBar(nextBeamText2)
self:Bar(205370, nextBeamTime2, nextBeamText2 .. getBeamText(beamCount+1))
end
end
function mod:BigWigs_BossComm(_, msg)
if msg == "firstBeamWasLeft" then
receivedBeamCom = true
firstBeamLeft = true
fixBars(mod)
elseif msg == "firstBeamWasRight" then
receivedBeamCom = true
firstBeamLeft = false
fixBars(mod)
end
end
function BigWigsKrosusFirstBeamWasLeft(wasLeft)
if wasLeft then
mod:Sync("firstBeamWasLeft")
else
mod:Sync("firstBeamWasRight")
end
end