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.

250 lines
7.7 KiB

--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Gorothi Worldbreaker", 1712, 1992)
if not mod then return end
mod:RegisterEnableMob(122450) -- Garothi Worldbreaker
mod.engageId = 2076
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local stage = 1
local nextApocalypseDriveWarning = 0
local annihilatorHaywired = nil
local decimationCasted = 0
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.cannon_ability = mod:SpellName(52541) -- Cannon Assault
L.cannon_ability_desc = "Display Messages and Bars related to the 2 cannons on the Gorothi Worldbreaker's back."
L.cannon_ability_icon = 57610 -- Cannon icon
L.missileImpact = "Annihilation Impact"
L.missileImpact_desc = "Show a timer for the Annihilation missiles landing."
L.missileImpact_icon = 208426
L.decimationImpact = "Decimation Impact"
L.decimationImpact_desc = "Show a timer for the Decimation missiles landing."
L.decimationImpact_icon = 170318
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
{246220, "TANK", "SAY", "SAY_COUNTDOWN"}, -- Fel Bombardment
240277, -- Apocalypse Drive
244969, -- Eradication
244106, -- Carnage
"cannon_ability", -- Cannon Assault
{244410, "SAY", "SAY_COUNTDOWN"}, -- Decimation
"decimationImpact",
244761, -- Annihilation
"missileImpact",
247044, -- Shrapnel
},{
[246220] = "general",
[244410] = -15915, -- Decimator
[244761] = -15917, -- Annihilator
[247044] = "mythic",
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_CAST_SUCCESS", "Annihilation", 244294) -- normal and empowered
self:Log("SPELL_CAST_SUCCESS", "Decimation", 244399, 245294, 246919) -- normal, empowered, haywire (mythic)
self:Log("SPELL_AURA_APPLIED", "DecimationApplied", 244410, 246919)
self:Log("SPELL_AURA_APPLIED", "FelBombardment", 246220) -- Fel Bombardment pre-debuff
self:Log("SPELL_AURA_REMOVED", "FelBombardmentRemoved", 246220) -- Fel Bombardment pre-debuff
self:Log("SPELL_CAST_START", "ApocalypseDrive", 240277)
self:Log("SPELL_CAST_SUCCESS", "ApocalypseDriveSuccess", 240277)
self:Death("WeaponDeath", 122778, 122773) -- Interupts Apocalypse Drive, id: Annihilator, Decimator
self:Log("SPELL_CAST_START", "Eradication", 244969)
self:Log("SPELL_CAST_SUCCESS", "Carnage", 244106)
--[[ Mythic ]] --
self:Log("SPELL_AURA_APPLIED", "Haywire", 246897, 246965) -- Decimator Hayware, Annihilator Hayware
self:Log("SPELL_CAST_START", "Shrapnel", 247044)
end
function mod:OnEngage()
stage = 1
annihilatorHaywired = nil
decimationCasted = 0
self:Bar("cannon_ability", 8, L.cannon_ability, L.cannon_ability_icon)
self:Bar(246220, 9.4) -- Fel Bombardment
nextApocalypseDriveWarning = self:Easy() and 62 or 67 -- happens at 60% (65% hc/my)
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss1")
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_HEALTH(event, unit)
local hp = UnitHealth(unit) / UnitHealthMax(unit) * 100
if hp < nextApocalypseDriveWarning then
self:MessageOld(240277, "cyan", "info", CL.soon:format(self:SpellName(240277))) -- Apocalypse Drive
if stage == 1 then
nextApocalypseDriveWarning = self:Easy() and 22 or 37 -- happens at 20% (35% hc/my)
else
self:UnregisterUnitEvent(event, unit)
end
end
end
do
-- Blizzard didn't give us a cast event for the haywire Annihilator.
-- It sill fires Cannon Chooser in USCS, so we wait for a bit and check if
-- Decimation got cast and if not it must've been Annihilation!
local function checkForDecimation()
if GetTime()-decimationCasted > 1 then
mod:Annihilation()
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 245124 and annihilatorHaywired then -- Cannon Chooser
self:SimpleTimer(checkForDecimation, 0.1)
end
end
end
function mod:Annihilation()
self:MessageOld(244761, "red", "alert")
self:CDBar("missileImpact", 6.2, L.missileImpact, L.missileImpact_icon)
self:Bar(244761, (self:Mythic() or stage == 1) and 31.6 or 15.8) -- Annihilation
if stage == 1 or self:Mythic() then
self:Bar(244410, 15.8) -- Decimation
end
end
do
local isOnMe = false
local function warn()
if not isOnMe then
mod:MessageOld(244410, "yellow")
end
end
function mod:Decimation(args)
self:Bar(244410, (self:Mythic() or stage == 1) and 31.6 or 15.8) -- Decimation
self:CDBar("decimationImpact", args.spellId == 246919 and 7 or 10, L.decimationImpact, L.decimationImpact_icon) -- 246919 = haywire (mythic)
if stage == 1 or self:Mythic() then
self:Bar(244761, 15.8) -- Annihilation
end
decimationCasted = GetTime()
isOnMe = false
self:SimpleTimer(warn, 0.3)
end
function mod:DecimationApplied(args)
if self:Me(args.destGUID) then
isOnMe = true
self:PlaySound(244410, "warning")
self:PersonalMessage(244410)
self:Say(244410)
if args.spellId ~= 246919 then -- Haywire Decimation
self:SayCountdown(244410, 5)
end
end
end
end
function mod:FelBombardment(args)
if self:Me(args.destGUID) then
self:Say(args.spellId)
self:SayCountdown(args.spellId, 7)
self:TargetBar(args.spellId, 7, args.destName)
self:PlaySound(args.spellId, "warning")
else
self:PlaySound(args.spellId, "alarm", nil, args.destName) -- Different sound for when tanking/offtanking
end
self:TargetMessage(args.spellId, "purple", args.destName)
self:Bar(args.spellId, self:Mythic() and 15.8 or 20.7)
end
function mod:FelBombardmentRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
self:StopBar(args.spellId, args.destName)
end
end
function mod:ApocalypseDrive(args)
self:StopBar(L.cannon_ability)
self:StopBar(244410) -- Decimation
self:StopBar(244761) -- Annihilation
self:StopBar(246220) -- Fel Bombardment
self:MessageOld(args.spellId, "red", "long", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 20)
end
function mod:ApocalypseDriveSuccess(args)
self:MessageOld(args.spellId, "orange", "alarm")
end
function mod:WeaponDeath(args)
stage = stage + 1
self:MessageOld(240277, "green", "info", CL.interrupted:format(self:SpellName(240277)))
self:StopBar(CL.cast:format(self:SpellName(240277)))
self:Bar(244969, 10) -- Eradication
self:Bar(246220, 23.1) -- Fel Bombardment
if args.mobId == 122778 then -- Annihilator death
if stage == 2 then
self:Bar(244410, 21.9) -- Decimation
end
elseif args.mobId == 122773 then -- Decimator death
if stage == 2 then
self:Bar(244761, 21.9) -- Annihilation
end
end
end
function mod:Eradication(args)
self:StopBar(args.spellId)
self:MessageOld(args.spellId, "orange", "warning", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 5.5)
end
function mod:Carnage(args)
self:MessageOld(args.spellId, "orange", "alarm")
end
--[[ Mythic ]]--
function mod:Haywire(args)
stage = stage + 1
self:MessageOld(240277, "green", "long", CL.interrupted:format(self:SpellName(240277)))
self:StopBar(CL.cast:format(self:SpellName(240277)))
self:Bar(244969, 9.5) -- Eradication
self:Bar("cannon_ability", 22, L.cannon_ability, L.cannon_ability_icon)
self:Bar(246220, 23.4) -- Fel Bombardment
if args.spellId == 246965 then
annihilatorHaywired = true
end
end
function mod:Shrapnel(args)
self:CDBar(args.spellId, 4.5)
end