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.

393 lines
15 KiB

4 years ago
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Artificer Xy'mox v2", 2481, 2470)
if not mod then return end
mod:RegisterEnableMob(183501) -- Artificer Xy'mox -- New Model
mod:SetEncounterID(2553)
mod:SetRespawnTime(25)
--------------------------------------------------------------------------------
-- Locals
--
local ringCount = 1
local wormholeCount = 1
local glyphCount = 1
local sparkCount = 1
local trapCount = 1
local nextStageWarning = 77
local mobCollector = {}
local mobCount = {}
--------------------------------------------------------------------------------
-- Timers
--
local timersMythic = {
[1] = {
[362803] = {40, 37}, -- Glyph of Relocation
[364465] = {28.5, 33}, -- Forerunner Rings
[362849] = {15.5, 33, 33}, -- Hyperlight Sparknova
[362885] = {23, 33, 33}, -- Stasis Trap
},
[2] = {
[362803] = {40, 42, 42}, -- Glyph of Relocation
[364465] = {26, 40, 40, 40}, -- Forerunner Rings
[362849] = {14, 33, 30, 31, 31}, -- Hyperlight Sparknova
[362885] = {20, 31, 31, 30, 30}, -- Stasis Trap
},
[3] = {
[362803] = {40, 41, 41}, -- Glyph of Relocation
[364465] = {26, 53, 53}, -- Forerunner Rings
[362849] = {14, 30, 30, 30}, -- Hyperlight Sparknova
[362885] = {21, 30, 32, 28, 30}, -- Stasis Trap
},
[4] = {
[362803] = {44.5, 44.5}, -- Glyph of Relocation
[364465] = {29, 68.8}, -- Forerunner Rings
[362849] = {15.5, 33.3, 33.3}, -- Hyperlight Sparknova
[362885] = {23.3, 33.3, 34.4}, -- Stasis Trap
}
}
4 years ago
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.sparknova = "Sparknova" -- Hyperlight Sparknova
L.relocation = "Tank Bomb" -- Glyph of Relocation
L.relocation_count = "%s S%d (%d)" -- Tank Bomb S1 (1) // Tank Bomb (stage)(count)
L.wormholes = "Wormholes" -- Dimensional Tear
L.wormhole = "Wormhole"
L.rings = "Rings S%d" -- Rings S1 // Forerunner Rings Stage 1/2/3/4
4 years ago
end
--------------------------------------------------------------------------------
-- Initialization
--
local interdimensionalWormholesMarker = mod:AddMarkerOption(false, "player", 1, 362721, 1, 2) -- Dimensional Tear
local acolyteMarker = mod:AddMarkerOption(false, "npc", 8, -24270, 8, 7) -- Xy Acolyte
local spellslingerMarker = mod:AddMarkerOption(false, "npc", 1, -24271, 1, 2, 3) -- Xy Spellslinger
local overseerMarker = mod:AddMarkerOption(false, "npc", 8, -24450, 8, 7) -- Cartel Overseer
4 years ago
function mod:GetOptions()
return {
"stages",
364465, -- Forerunner Rings
4 years ago
{362721, "SAY", "SAY_COUNTDOWN"}, -- Dimensional Tear
4 years ago
interdimensionalWormholesMarker,
{362803, "SAY", "SAY_COUNTDOWN"}, -- Glyph of Relocation
362885, -- Stasis Trap
362849, -- Hyperlight Sparknova
365681, -- Massive Blast
364040, -- Hyperlight Ascension
acolyteMarker,
364030, -- Debilitating Ray
spellslingerMarker,
363485, -- The Cartel Elite
overseerMarker,
-- 365701, -- Overseer's Orders
},{
[365681] = CL.intermission,
[363485] = CL.mythic,
},{
[364465] = L.rings:format(1), -- Forerunner Rings (Rings)
4 years ago
[362721] = L.wormholes, -- Dimensional Tear (Wormholes)
4 years ago
[362803] = L.relocation, -- Glyph of Relocation (Tank Bomb)
[362849] = L.sparknova, -- Hyperlight Sparknova (Sparknova)
[362885] = CL.traps, -- Stasis Trap (Traps)
[363485] = CL.adds,
4 years ago
}
end
function mod:OnBossEnable()
4 years ago
self:Log("SPELL_CAST_SUCCESS", "DecipherRelicSuccess", 367711) -- Stage 4
4 years ago
self:Log("SPELL_AURA_APPLIED", "DecipherRelic", 363139)
self:Log("SPELL_AURA_REMOVED", "DecipherRelicRemoved", 363139)
self:Log("SPELL_CAST_SUCCESS", "ForerunnerRings", 364465)
self:Log("SPELL_CAST_START", "HyperlightAscension", 364040)
self:Log("SPELL_CAST_SUCCESS", "DebilitatingRay", 364030)
self:Log("SPELL_CAST_SUCCESS", "InterdimensionalWormholes", 362721)
self:Log("SPELL_AURA_APPLIED", "InterdimensionalWormholesApplied", 362615, 362614)
self:Log("SPELL_AURA_REMOVED", "InterdimensionalWormholesRemoved", 362615, 362614)
self:Log("SPELL_AURA_APPLIED", "GlyphOfRelocationApplied", 362803)
self:Log("SPELL_AURA_REMOVED", "GlyphOfRelocationRemoved", 362803)
self:Log("SPELL_CAST_START", "HyperlightSparknova", 362849)
self:Log("SPELL_CAST_SUCCESS", "StasisTrap", 362885)
self:Log("SPELL_CAST_START", "MassiveBlast", 365682)
self:Log("SPELL_AURA_APPLIED", "MassiveBlastApplied", 365681)
self:Log("SPELL_AURA_APPLIED_DOSE", "MassiveBlastApplied", 365681)
4 years ago
end
function mod:OnEngage()
local stage = 1
self:SetStage(stage)
4 years ago
ringCount = 1
wormholeCount = 1
glyphCount = 1
sparkCount = 1
trapCount = 1
nextStageWarning = 77
mobCollector = {}
mobCount = {}
4 years ago
if self:Mythic() then
self:RegisterEvent("RAID_BOSS_EMOTE") -- for adds
self:Bar(363485, 13.6, CL.adds) -- The Cartel Elite
end
4 years ago
self:Bar(362721, self:Mythic() and 9 or 8, CL.count:format(L.wormholes, wormholeCount)) -- Dimensional Tear
self:Bar(362849, self:Mythic() and timersMythic[stage][362849][sparkCount] or 14, CL.count:format(L.sparknova, sparkCount)) -- Hyperlight Sparknova
self:Bar(362885, self:Mythic() and timersMythic[stage][362885][trapCount] or 21, CL.count:format(CL.traps, trapCount)) -- Stasis Trap
self:Bar(364465, self:Mythic() and timersMythic[stage][364465][ringCount] or 26, CL.count:format(L.rings:format(self:GetStage()), ringCount)) -- Forerunner Rings
self:Bar(362803, self:Mythic() and timersMythic[stage][362803][glyphCount] or 40, L.relocation_count:format(L.relocation, self:GetStage(), glyphCount)) -- Glyph of Relocation
4 years ago
if self:GetOption(spellslingerMarker) or (self:Mythic() and self:GetOption(overseerMarker)) then
self:RegisterTargetEvents("MarkAdds")
end
4 years ago
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss1")
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_HEALTH(event, unit)
local currentHealth = self:GetHealth(unit)
if currentHealth < nextStageWarning then -- Intermission at 75% and 50%, Different timers at 30%
if currentHealth > 35 then
self:Message("stages", "green", CL.soon:format(CL.intermission), false)
else
self:Message("stages", "green", CL.soon:format(CL.stage:format(4)), false)
end
self:PlaySound("stages", "info")
4 years ago
nextStageWarning = nextStageWarning - 25
if nextStageWarning < 10 then
4 years ago
self:UnregisterUnitEvent(event, unit)
elseif nextStageWarning < 50 then
nextStageWarning = 32
4 years ago
end
end
end
function mod:MarkAcolytes()
for boss = 1, 5 do
local unit = ("boss%d"):format(boss)
local guid = self:UnitGUID(unit)
local id = self:MobId(guid)
if id == 184140 and not mobCollector[guid] then
self:CustomIcon(acolyteMarker, unit, 8 - (mobCount[id] or 0)) -- 8, 7
mobCount[id] = (mobCount[id] or 0) + 1
mobCollector[guid] = true
end
end
end
function mod:MarkAdds(event, unit, guid)
if not mobCollector[guid] then
local id = self:MobId(guid)
if id == 183707 and self:GetOption(spellslingerMarker) then -- Xy Spellslinger
mobCount[id] = (mobCount[id] or 0) + 1
self:CustomIcon(spellslingerMarker, unit, mobCount[id]) -- 1, 2, 3
mobCollector[guid] = true
elseif id == 184792 and self:GetOption(overseerMarker) then -- Cartel Overseer
self:CustomIcon(overseerMarker, unit, 8 - (mobCount[id] or 0)) -- 8, 7
mobCount[id] = (mobCount[id] or 0) + 1
mobCollector[guid] = true
4 years ago
end
end
end
4 years ago
function mod:DecipherRelicSuccess() -- Stage 4
self:StopBar(CL.count:format(L.rings:format(self:GetStage()), ringCount)) -- Forerunner Rings
self:StopBar(CL.count:format(L.wormholes, wormholeCount)) -- Interdimensional Wormholes
self:StopBar(L.relocation_count:format(L.relocation, self:GetStage(), glyphCount)) -- Glyph of Relocation
self:StopBar(CL.count:format(L.sparknova, sparkCount)) -- Hyperlight Sparknova
self:StopBar(CL.count:format(CL.traps, trapCount)) -- Stasis Trap
4 years ago
local stage = 4
4 years ago
self:Message("stages", "cyan", CL.stage:format(stage), false)
self:PlaySound("stages", "info")
self:SetStage(stage)
-- Not resetting traps as they persist throughout the whole fight
-- Not resetting wormholes as you get 1 per stage
-- wormholeCount = 1
-- trapCount = 1
ringCount = 1
glyphCount = 1
sparkCount = 1
if self:Mythic() then
self:Bar(363485, 12.3, CL.adds) -- The Cartel Elite
end
self:Bar(362849, self:Mythic() and timersMythic[stage][362849][sparkCount] or 15.6, CL.count:format(L.sparknova, sparkCount)) -- Hyperlight Sparknova
4 years ago
self:Bar(362721, 22.2, CL.count:format(L.wormholes, wormholeCount)) -- Interdimensional Wormholes
self:Bar(362885, self:Mythic() and timersMythic[stage][362885][trapCount] or 23.3, CL.count:format(CL.traps, trapCount)) -- Stasis Trap
self:Bar(364465, self:Mythic() and timersMythic[stage][364465][ringCount] or 28.9, CL.count:format(L.rings:format(self:GetStage()), ringCount)) -- Forerunner Rings
self:Bar(362803, self:Mythic() and timersMythic[stage][362803][glyphCount] or 44.5, L.relocation_count:format(L.relocation, self:GetStage(), glyphCount)) -- Glyph of Relocation
4 years ago
end
4 years ago
function mod:DecipherRelic()
self:Message("stages", "cyan", CL.intermission, false)
self:PlaySound("stages", "long")
self:StopBar(CL.count:format(L.rings:format(self:GetStage()), ringCount)) -- Forerunner Rings
self:StopBar(CL.count:format(L.wormholes, wormholeCount)) -- Interdimensional Wormholes
4 years ago
self:StopBar(L.relocation_count:format(L.relocation, self:GetStage(), glyphCount)) -- Glyph of Relocation
4 years ago
self:StopBar(CL.count:format(L.sparknova, sparkCount)) -- Hyperlight Sparknova
self:StopBar(CL.count:format(CL.traps, trapCount)) -- Stasis Trap
if self:GetOption(acolyteMarker) then
self:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT", "MarkAcolytes")
end
4 years ago
end
function mod:DecipherRelicRemoved()
local stage = self:GetStage() + 1
self:Message("stages", "cyan", CL.stage:format(stage), false)
self:PlaySound("stages", "info")
self:SetStage(stage)
if self:GetOption(acolyteMarker) then
self:UnregisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT")
end
mobCount = {}
4 years ago
-- Not resetting traps as they persist throughout the whole fight
-- Not resetting wormholes as you get 1 per stage
-- wormholeCount = 1
-- trapCount = 1
ringCount = 1
glyphCount = 1
sparkCount = 1
if self:Mythic() then
self:Bar(363485, 12.3, CL.adds) -- The Cartel Elite
end
4 years ago
self:Bar(362721, 8, CL.count:format(L.wormholes, wormholeCount)) -- Interdimensional Wormholes
self:Bar(362849, self:Mythic() and timersMythic[stage][362849][sparkCount] or 14, CL.count:format(L.sparknova, sparkCount)) -- Hyperlight Sparknova
self:Bar(362885, self:Mythic() and timersMythic[stage][362885][trapCount] or 21, CL.count:format(CL.traps, trapCount)) -- Stasis Trap
self:Bar(364465, self:Mythic() and timersMythic[stage][364465][ringCount] or 26, CL.count:format(L.rings:format(self:GetStage()), ringCount)) -- Forerunner Rings
self:Bar(362803, self:Mythic() and timersMythic[stage][362803][glyphCount] or 45, L.relocation_count:format(L.relocation, self:GetStage(), glyphCount)) -- Glyph of Relocation
4 years ago
end
function mod:ForerunnerRings(args)
self:StopBar(CL.count:format(L.rings:format(self:GetStage()), ringCount))
self:Message(args.spellId, "yellow", CL.count:format(L.rings:format(self:GetStage()), ringCount))
self:PlaySound(args.spellId, "alert")
ringCount = ringCount + 1
self:Bar(args.spellId, self:Mythic() and timersMythic[self:GetStage()][args.spellId][ringCount] or (self:GetStage() == 4 and 33.3 or 30), CL.count:format(L.rings:format(self:GetStage()), ringCount))
4 years ago
end
4 years ago
do
local prev = 0
function mod:HyperlightAscension(args)
if prev + 2 < args.time then
prev = args.time
self:Message(args.spellId, "red")
self:PlaySound(args.spellId, "warning")
end
end
4 years ago
end
function mod:DebilitatingRay(args)
local canDo, ready = self:Interrupter(args.sourceGUID)
if canDo then
local icon = CombatLog_String_GetIcon(args.sourceRaidFlags)
self:Message(args.spellId, "yellow", icon .. args.spellName)
4 years ago
if ready then
self:PlaySound(args.spellId, "alert")
end
end
end
do
local playerList = {}
function mod:InterdimensionalWormholes(args)
playerList = {}
wormholeCount = wormholeCount + 1
end
function mod:InterdimensionalWormholesApplied(args)
local count = #playerList+1
playerList[count] = args.destName
playerList[args.destName] = count -- Set raid marker
if self:Me(args.destGUID) then
self:Say(362721, CL.count_rticon:format(L.wormhole, count, count))
self:SayCountdown(362721, 8, count)
self:PlaySound(362721, "warning")
end
self:CustomIcon(interdimensionalWormholesMarker, args.destName, count)
self:NewTargetsMessage(362721, "yellow", playerList, 2, CL.count:format(L.wormhole, wormholeCount-1))
end
function mod:InterdimensionalWormholesRemoved(args)
self:CustomIcon(interdimensionalWormholesMarker, args.destName)
end
end
function mod:GlyphOfRelocationApplied(args)
self:StopBar(L.relocation_count:format(L.relocation, self:GetStage(), glyphCount))
self:TargetMessage(args.spellId, "purple", args.destName, L.relocation_count:format(L.relocation, self:GetStage(), glyphCount))
4 years ago
self:PlaySound(args.spellId, "warning")
self:TargetBar(args.spellId, 5, args.destName, CL.bomb)
if self:Me(args.destGUID) then
self:Say(args.spellId, CL.bomb)
self:SayCountdown(args.spellId, 5)
end
glyphCount = glyphCount + 1
self:CDBar(362803, self:Mythic() and timersMythic[self:GetStage()][362803][glyphCount] or (self:GetStage() == 4 and 66.5 or 60), L.relocation_count:format(L.relocation, self:GetStage(), glyphCount))
4 years ago
end
function mod:GlyphOfRelocationRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
end
function mod:HyperlightSparknova(args)
self:StopBar(CL.count:format(L.sparknova, sparkCount))
self:Message(args.spellId, "orange", CL.count:format(L.sparknova, sparkCount))
self:PlaySound(args.spellId, "alert")
sparkCount = sparkCount + 1
self:Bar(args.spellId, self:Mythic() and timersMythic[self:GetStage()][args.spellId][sparkCount] or (self:GetStage() == 4 and 33.3 or 30), CL.count:format(L.sparknova, sparkCount))
4 years ago
end
function mod:StasisTrap(args)
self:StopBar(CL.count:format(CL.traps, trapCount))
self:Message(args.spellId, "yellow", CL.count:format(CL.traps, trapCount))
4 years ago
self:PlaySound(args.spellId, "alarm")
trapCount = trapCount + 1
self:Bar(args.spellId, self:Mythic() and timersMythic[self:GetStage()][args.spellId][trapCount] or (self:GetStage() == 4 and 33.3 or 30), CL.count:format(CL.traps, trapCount))
4 years ago
end
function mod:RAID_BOSS_EMOTE(_, msg)
if msg:find("363485", nil, true) then -- The Cartel Elite
self:Message(363485, "red", CL.incoming:format(CL.adds))
self:PlaySound(363485, "alert")
end
4 years ago
end
function mod:MassiveBlast(args)
local canDo, ready = self:Interrupter(args.sourceGUID)
if canDo then
local icon = CombatLog_String_GetIcon(args.sourceRaidFlags)
self:Message(365681, "purple", icon .. args.spellName)
if self:Tank() then
self:PlaySound(365681, "alarm")
elseif ready then
self:PlaySound(365681, "alert")
end
end
4 years ago
end
function mod:MassiveBlastApplied(args)
if self:Tank() then
self:NewStackMessage(args.spellId, "purple", args.destName, args.amount, 2)
end
4 years ago
end