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.

288 lines
8.4 KiB

--------------------------------------------------------------------------------
-- TODO List:
-- - ArcingBonds Message is experimental
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Trilliax", 1530, 1731)
if not mod then return end
mod:RegisterEnableMob(104288)
mod.engageId = 1867
mod.respawnTime = 15
--------------------------------------------------------------------------------
-- Locals
--
local phase = 1 -- 1 = Cleaner, 2 = Maniac, 3 = Caretaker
local imprintCount = 1
local bondTable = {}
local mobCollector = {}
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.yourLink = "You are linked with %s"
L.yourLinkShort = "Linked with %s"
L.imprint = "Imprint"
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
-- General
"stages",
"berserk",
206488, -- Arcane Seepage
{206641, "TANK"}, -- Arcane Slash
-- Cleaner
206788, -- Toxic Slice
{211615, "SAY", "PROXIMITY"}, -- Sterilize
206820, -- Cleansing Rage
-- Maniac
208910, -- Arcing Bonds
207630, -- Annihilation
-- Caretaker
207502, -- Succulent Feast
-- Mythic
215066, -- Dual Personalities
214670, -- Energized
215062, -- Toxic Slice
}, {
["stages"] = "general",
[206788] = -13285, -- Cleaner
[208910] = -13281, -- Maniac
[207502] = -13282, -- Caretaker
[215066] = "mythic",
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_AURA_APPLIED", "Phase", 206557, 206559, 206560)
self:Log("SPELL_AURA_APPLIED", "ArcaneSeepageDamage", 206488)
self:Log("SPELL_PERIODIC_DAMAGE", "ArcaneSeepageDamage", 206488)
self:Log("SPELL_PERIODIC_MISSED", "ArcaneSeepageDamage", 206488)
self:Log("SPELL_AURA_APPLIED", "ArcaneSlash", 206641)
self:Log("SPELL_AURA_APPLIED_DOSE", "ArcaneSlash", 206641)
self:Log("SPELL_CAST_START", "ToxicSlice", 206788) -- normal/heroic
self:Log("SPELL_AURA_APPLIED", "Sterilize", 211615) -- pre-debuff id
self:Log("SPELL_AURA_REMOVED", "SterilizeRemoved", 208499)
self:Log("SPELL_CAST_START", "CleansingRage", 206820)
self:Log("SPELL_CAST_START", "ArcingBondsCast", 208924)
self:Log("SPELL_AURA_APPLIED", "ArcingBonds", 208910, 208915)
self:Log("SPELL_AURA_APPLIED", "Annihilation", 207630)
self:Log("SPELL_CAST_START", "SucculentFeastCast", 207502)
self:Log("SPELL_AURA_APPLIED", "SucculentFeastApplied", 206838)
self:Log("SPELL_AURA_REMOVED", "SucculentFeastRemoved", 206838)
self:Log("SPELL_AURA_APPLIED", "Energized", 214670)
self:Log("SPELL_CAST_START", "ToxicSliceImprint", 215062) -- mythic imprint
self:Death("ImprintDeath", 108303)
end
function mod:OnEngage()
phase = 1
imprintCount = 1
bondTable = {}
mobCollector = {}
self:Berserk(540) -- Heroic
self:Bar(206641, 7.5) -- Arcane Slash
self:Bar(206788, 11) -- Toxic Slice
self:Bar("stages", 45, 206557, 206557) -- The Maniac
self:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT")
end
function mod:OnBossDisable()
bondTable = {}
mobCollector = {}
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 207620 then -- Annihilation
self:MessageOld(207630, "red", "long")
end
end
function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i = 1, 5 do
local unit = ("boss%d"):format(i)
local guid = self:UnitGUID(unit)
if guid and not mobCollector[guid] then
mobCollector[guid] = true
local id = self:MobId(guid)
if id == 108303 then -- Imprint
self:MessageOld(215066, "cyan", "long", self:UnitName(unit), false)
self:Bar(214670, 2.5, CL.other:format(L.imprint, self:SpellName(214670))) -- Energized
if imprintCount == 1 then
self:Bar(215062, 15.8, CL.other:format(L.imprint, self:SpellName(215062))) -- Toxic Slice
end
imprintCount = imprintCount + 1
end
end
end
end
function mod:Phase(args)
self:MessageOld("stages", "cyan", "long", args.spellName, args.spellId)
if args.spellId == 206560 then -- Cleaner
phase = 1
self:Bar("stages", 45, 206557, 206557) -- The Maniac
self:CDBar(206820, 10.5) -- Cleansing Rage
self:CDBar(206788, 13) -- Toxic Slice
self:CDBar(206641, 19) -- Arcane Slash
elseif args.spellId == 206557 then -- Maniac
phase = 2
self:Bar("stages", 40, 206559, 206559) -- The Caretaker
self:StopBar(self:SpellName(206788)) -- Toxic Slice
self:CDBar(206641, 6) -- Arcane Slash
self:Bar(207630, 20.5) -- Annihilation
elseif args.spellId == 206559 then -- Caretaker
phase = 3
self:Bar("stages", 13, 206560, 206560) -- The Cleaner
self:StopBar(self:SpellName(206641)) -- Arcane Slash
end
end
do
local prev = 0
function mod:ArcaneSeepageDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(args.spellId, "blue", "alert", CL.underyou:format(args.spellName))
end
end
end
do
local function timeToNextPhase(self)
return phase == 1 and self:BarTimeLeft(206557) or phase == 2 and self:BarTimeLeft(206559) or self:BarTimeLeft(206560)
end
function mod:ArcaneSlash(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "red", amount > 2 and "warning")
local t = phase == 2 and 7.3 or 11
if timeToNextPhase(self) > t then
self:Bar(args.spellId, t)
end
end
function mod:ToxicSlice(args)
self:MessageOld(args.spellId, "orange", "alarm", CL.incoming:format(args.spellName))
if timeToNextPhase(self) > 26 then
self:CDBar(args.spellId, 26)
end
end
end
do
local list = mod:NewTargetList()
function mod:Sterilize(args)
list[#list+1] = args.destName
if #list == 1 then
self:ScheduleTimer("TargetMessageOld", 0.1, args.spellId, list, "red", "warning")
end
if self:Me(args.destGUID) then
self:OpenProximity(args.spellId, 7)
self:TargetBar(args.spellId, 45, args.destName)
self:Say(args.spellId)
end
end
end
function mod:SterilizeRemoved(args)
if self:Me(args.destGUID) then
self:CloseProximity(211615)
end
end
function mod:CleansingRage(args)
self:MessageOld(args.spellId, "yellow", "alarm")
end
function mod:ArcingBondsCast()
bondTable = {}
end
do
local myPartnerIsNext = nil
function mod:ArcingBonds(args)
bondTable[#bondTable+1] = args.destName
local myPartner = nil
if self:Me(args.destGUID) then
if #bondTable % 2 == 0 then
myPartner = bondTable[#bondTable-1]
else
myPartnerIsNext = true
end
elseif myPartnerIsNext then
myPartnerIsNext = nil
myPartner = args.destName
end
if myPartner then
self:MessageOld(208910, "blue", "warning", L.yourLink:format(self:ColorName(myPartner)))
local _, _, _, expires = self:UnitDebuff("player", args.spellName, 208915) -- 208915 on Mythic
local remaining = expires-GetTime()
self:Bar(208910, remaining, L.yourLinkShort:format(self:ColorName(myPartner)))
myPartner = nil
myPartnerIsNext = nil
end
end
end
function mod:Annihilation(args)
self:CastBar(args.spellId, 16)
end
function mod:SucculentFeastCast(args)
self:MessageOld(args.spellId, "yellow", "info", CL.incoming:format(args.spellName))
end
function mod:SucculentFeastApplied(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(207502, args.destName, "blue", "info")
end
end
function mod:SucculentFeastRemoved(args)
if self:Me(args.destGUID) then
self:MessageOld(207502, "blue", "info", CL.removed:format(args.spellName))
end
end
function mod:Energized(args)
if not UnitIsPlayer(args.destName) then
self:MessageOld(args.spellId, "red", self:Dispeller("magic", true) and "alert", CL.on:format(args.spellName, args.destName))
self:Bar(args.spellId, 20.5, CL.other:format(L.imprint, self:SpellName(214670))) -- Energized
end
end
function mod:ToxicSliceImprint(args)
self:MessageOld(args.spellId, "orange", "alarm", CL.incoming:format(args.spellName))
self:Bar(args.spellId, 17, CL.other:format(L.imprint, args.spellName)) -- Toxic Slice
end
function mod:ImprintDeath()
self:StopBar(CL.other:format(L.imprint, self:SpellName(214670))) -- Energized
self:StopBar(CL.other:format(L.imprint, self:SpellName(215062))) -- Toxic Slice
end