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.

551 lines
17 KiB

--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Star Augur Etraeus", 1530, 1732)
if not mod then return end
mod:RegisterEnableMob(103758)
mod.engageId = 1863
mod.respawnTime = 50
--------------------------------------------------------------------------------
-- Locals
--
local phase = 1
local mobCollector = {}
local ejectionCount = 1
local novaCount = 1
local timers = {
-- Icy Ejection, SPELL_CAST_SUCCESS, timers vary sometimes (+-2s)
[206936] = {25, 35.2, 6.6, 4.8, 51.2, 2.1, 3.0, 24.2, 2.1, 2.2},
-- Fel Ejection, SPELL_CAST_SUCCESS, timers vary sometimes (+-2s)
[205649] = {17, 3.9, 2.9, 2.6, 9.7, 2.1, 1.5, 32.7, 1.8, 2.0, 13.7, 3.2, 1.9, 21.8, 7.3, 11.1, 2.9, 2.1, 23.3, 2.0, 2.0}
}
local grandCast = nil
local grandCounter = 1
local grandTimers = {
{15, 13.4, 14}, -- P1
{26, 44.9, 57.7}, -- P2
{60, 43.7, 41.4}, -- P3
{47.9, 61.3, 51.3}, -- P4
}
local worldDevouringForceCounter = 1
local worldDevouringForceTimers = {22.7, 41.7, 57.6, 52.2}
local voidCount = 1
local starSignTables = {
[205429] = {},
[205445] = {},
[216345] = {},
[216344] = {},
}
--------------------------------------------------------------------------------
-- Upvalues
--
local tDeleteItem = tDeleteItem
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.yourSign = "Your sign"
L.with = "with"
L[205429] = "|T1391538:15:15:0:0:64:64:4:60:4:60|t|cFFFFDD00Crab|r"
L[205445] = "|T1391537:15:15:0:0:64:64:4:60:4:60|t|cFFFF0000Wolf|r"
L[216345] = "|T1391536:15:15:0:0:64:64:4:60:4:60|t|cFF00FF00Hunter|r"
L[216344] = "|T1391535:15:15:0:0:64:64:4:60:4:60|t|cFF00DDFFDragon|r"
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
--[[ General ]]--
"stages",
221875, -- Nether Traversal
--[[ Stage One ]]--
206464, -- Coronal Ejection
--[[ Stage Two ]]--
{205984, "SAY", "SAY_COUNTDOWN"}, -- Gravitational Pull
206589, -- Chilled
{206936, "SAY", "SAY_COUNTDOWN", "FLASH", "PROXIMITY"}, -- Icy Ejection
206949, -- Frigid Nova
--[[ Stage Three ]]--
{214167, "SAY", "SAY_COUNTDOWN"}, -- Gravitational Pull
{206388, "TANK"}, -- Felburst
206517, -- Fel Nova
{205649, "SAY"}, -- Fel Ejection
206398, -- Felflame
--[[ Stage Four ]]--
{214335, "SAY", "SAY_COUNTDOWN"}, -- Gravitational Pull
207439, -- Void Nova
222761, -- Big Bang
216909, -- World-Devouring Force
--[[ Thing That Should Not Be ]]--
207720, -- Witness the Void
--[[ Mythic ]]--
{205408, "INFOBOX", "PROXIMITY"}, -- Grand Conjunction
}, {
["stages"] = "general",
[206464] = -13033, -- Stage One
[205984] = -13036, -- Stage Two
[214167] = -13046, -- Stage Three
[214335] = -13053, -- Stage Four
[207720] = -13057, -- Thing That Should Not Be
}
end
function mod:OnBossEnable()
--[[ General ]]--
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_CAST_START", "NetherTraversal", 221875)
self:Log("SPELL_AURA_APPLIED", "GroundEffectDamage", 206398) -- Felflame
self:Log("SPELL_AURA_APPLIED_DOSE", "GroundEffectDamage", 206398) -- Felflame
--[[ Stage One ]]--
self:Log("SPELL_CAST_SUCCESS", "CoronalEjection", 206464)
--[[ Stage Two ]]--
self:Log("SPELL_AURA_APPLIED", "GravitationalPull", 205984, 214167, 214335) -- Stage 2, Stage 3, Stage 4
self:Log("SPELL_AURA_REMOVED", "GravitationalPullRemoved", 205984, 214167, 214335) -- Stage 2, Stage 3, Stage 4
self:Log("SPELL_CAST_SUCCESS", "GravitationalPullSuccess", 205984, 214167, 214335) -- Stage 2, Stage 3, Stage 4
self:Log("SPELL_AURA_APPLIED", "Chilled", 206589)
self:Log("SPELL_CAST_SUCCESS", "IcyEjection", 206936)
self:Log("SPELL_AURA_APPLIED", "IcyEjectionApplied", 206936)
self:Log("SPELL_AURA_REMOVED", "IcyEjectionRemoved", 206936)
self:Log("SPELL_CAST_START", "FrigidNova", 206949)
--[[ Stage Three ]]--
self:Log("SPELL_AURA_APPLIED", "Felburst", 206388)
self:Log("SPELL_AURA_APPLIED_DOSE", "Felburst", 206388)
self:Log("SPELL_CAST_START", "FelNova", 206517)
self:Log("SPELL_CAST_SUCCESS", "FelEjection", 205649)
self:Log("SPELL_AURA_APPLIED", "FelEjectionApplied", 205649)
self:Log("SPELL_AURA_REMOVED", "FelEjectionRemoved", 205649)
--[[ Stage Four ]]--
self:Log("SPELL_CAST_START", "VoidNova", 207439)
self:Log("SPELL_CAST_START", "WorldDevouringForce", 216909)
--[[ Thing That Should Not Be ]]--
self:Log("SPELL_CAST_START", "WitnessTheVoid", 207720)
self:Death("ThingDeath", 104880) -- Thing That Should Not Be
--[[ Mythic ]]--
self:Log("SPELL_CAST_START", "GrandConjunction", 205408)
self:Log("SPELL_CAST_SUCCESS", "GrandConjunctionSuccess", 205408)
self:Log("SPELL_AURA_APPLIED", "StarSigns", 205429, 205445, 216345, 216344) -- Star Sign: Crab, Wolf, Hunter, Dragon
self:Log("SPELL_AURA_REMOVED", "StarSignsRemoved", 205429, 205445, 216345, 216344)
end
function mod:OnEngage()
phase = 1
ejectionCount = 1
grandCounter = 1
novaCount = 1
worldDevouringForceCounter = 1
voidCount = 1
grandCast = nil
mobCollector = {}
self:Bar(206464, 12.5) -- Coronal Ejection
if self:Mythic() then
self:CDBar(205408, 15) -- Grand Conjunction
else
self:Bar(221875, 20) -- Nether Traversal
end
starSignTables = {
[205429] = {},
[205445] = {},
[216345] = {},
[216344] = {},
}
end
function mod:OnBossDisable()
mobCollector = {}
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 222130 then -- Phase 2 Conversation
phase = 2
self:MessageOld("stages", "cyan", "long", "90% - ".. CL.stage:format(2), false)
ejectionCount = 1
novaCount = 1
self:CDBar(206936, timers[206936][ejectionCount], CL.count:format(self:SpellName(206936), ejectionCount))
self:Bar(205984, 30) -- Gravitational Pull
if not self:Easy() then
self:Bar(206949, self:Mythic() and 49 or 53, CL.count:format(self:SpellName(206949), novaCount)) -- Frigid Nova
end
if self:Mythic() then
self:StopBar(CL.count:format(self:SpellName(205408), grandCounter)) -- Grand Conjunction
grandCounter = 1
self:CDBar(205408, 26, CL.count:format(self:SpellName(205408), grandCounter)) -- Grand Conjunction
end
elseif spellId == 222133 then -- Phase 3 Conversation
phase = 3
self:MessageOld("stages", "cyan", "long", "60% - ".. CL.stage:format(3), false)
self:StopBar(CL.count:format(self:SpellName(206936), ejectionCount)) -- Icy Ejection
self:StopBar(CL.count:format(self:SpellName(206949), novaCount)) -- Frigid Nova
ejectionCount = 1
novaCount = 1
self:CDBar(205649, timers[205649][ejectionCount], CL.count:format(self:SpellName(205649), ejectionCount))
self:CDBar(214167, 28) -- Gravitational Pull
if not self:Easy() then
self:CDBar(206517, self:Mythic() and 52 or 58.6, CL.count:format(self:SpellName(206517), novaCount)) -- Fel Nova
end
if self:Mythic() then
self:StopBar(CL.count:format(self:SpellName(205408), grandCounter)) -- Grand Conjunction
grandCounter = 1
self:CDBar(205408, 60, CL.count:format(self:SpellName(205408), grandCounter)) -- Grand Conjunction
end
elseif spellId == 222134 then -- Phase 4 Conversation
phase = 4
self:MessageOld("stages", "cyan", "long", "30% - ".. CL.stage:format(4), false)
self:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT")
self:StopBar(CL.count:format(self:SpellName(205649), ejectionCount)) -- Fel Ejection
self:StopBar(CL.count:format(self:SpellName(206517), novaCount)) -- Fel Nova
ejectionCount = 1
novaCount = 1
self:CDBar(214335, 20) -- Gravitational Pull
if not self:Easy() then
self:CDBar(207439, 42, CL.count:format(self:SpellName(207439), novaCount)) -- Void Nova
end
self:Berserk(self:Mythic() and 201.5 or 231.5, true, nil, 222761, 222761) -- Big Bang (end of cast)
if self:Mythic() then
self:StopBar(CL.count:format(self:SpellName(205408), grandCounter)) -- Grand Conjunction
grandCounter = 1
worldDevouringForceCounter = 1
self:CDBar(205408, 47, CL.count:format(self:SpellName(205408), grandCounter)) -- Grand Conjunction
self:Bar(216909, worldDevouringForceTimers[worldDevouringForceCounter], CL.count:format(self:SpellName(216909), worldDevouringForceCounter)) -- World-Devouring Force
end
end
end
function mod:NetherTraversal(args)
if grandCast == true then
grandCast = nil
self:StopBar(CL.cast:format(205408))
self:CloseProximity(205408)
end
self:CastBar(args.spellId, 8.5)
end
do
local prev = 0
function mod:GroundEffectDamage(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
--[[ Stage One ]]--
function mod:CoronalEjection(args)
self:MessageOld(args.spellId, "yellow")
end
--[[ Stage Two ]]--
do
local timers = {
[205984] = 30,
[214167] = 28,
[214335] = 62,
}
function mod:GravitationalPullSuccess(args)
-- Only show this once by using the success event
self:TargetMessageOld(args.spellId, args.destName, "orange", "warning", nil, nil, self:Tank())
self:CDBar(args.spellId, timers[args.spellId])
if self:Me(args.destGUID) then
self:Say(args.spellId)
end
end
end
function mod:GravitationalPull(args)
local _, _, _, expires = self:UnitDebuff(args.destName, args.spellId)
local remaining = expires-GetTime()
self:TargetBar(args.spellId, remaining, args.destName)
if self:Me(args.destGUID) then
self:SayCountdown(args.spellId, remaining)
end
end
function mod:GravitationalPullRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
self:StopBar(args.spellId, args.destName)
end
function mod:IcyEjection(args)
self:StopBar(CL.count:format(args.spellName, ejectionCount))
if phase == 2 then -- Prevent starting the bar in phase transition
ejectionCount = ejectionCount + 1
self:CDBar(args.spellId, timers[args.spellId][ejectionCount] or 30, CL.count:format(args.spellName, ejectionCount))
end
end
function mod:IcyEjectionApplied(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "yellow", "warning")
self:Say(args.spellId)
self:OpenProximity(args.spellId, 8)
self:TargetBar(args.spellId, 10, args.destName)
if not self:LFR() then
self:SayCountdown(args.spellId, 10)
end
end
end
function mod:IcyEjectionRemoved(args)
if self:Me(args.destGUID) then
self:CloseProximity(args.spellId)
self:CancelSayCountdown(args.spellId)
self:StopBar(args.spellId, args.destName)
end
end
function mod:FrigidNova(args)
self:MessageOld(args.spellId, "red", "alarm")
self:CastBar(args.spellId, 4)
novaCount = novaCount + 1
self:CDBar(args.spellId, 61, CL.count:format(args.spellName, novaCount))
end
function mod:Chilled(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue")
self:TargetBar(args.spellId, 12, args.destName)
end
end
--[[ Stage Three ]]--
function mod:Felburst(args)
local amount = args.amount or 1
if amount % 2 == 1 or amount > 5 then
self:StackMessage(args.spellId, args.destName, amount, "red", amount > 5 and "warning")
end
end
function mod:FelNova(args)
self:MessageOld(args.spellId, "red", "alarm")
self:CastBar(args.spellId, 4)
novaCount = novaCount + 1
self:Bar(args.spellId, (self:Mythic() and (novaCount == 2 and 48.5 or 51)) or 45, CL.count:format(args.spellName, novaCount))
end
function mod:FelEjection(args)
self:StopBar(CL.count:format(args.spellName, ejectionCount))
if phase == 3 then -- Prevent starting the bar in phase transition
ejectionCount = ejectionCount + 1
self:CDBar(args.spellId, timers[args.spellId][ejectionCount] or 30, CL.count:format(args.spellName, ejectionCount))
end
end
function mod:FelEjectionApplied(args)
if self:Me(args.destGUID) then
self:TargetMessageOld(args.spellId, args.destName, "blue", "warning")
self:Say(args.spellId)
self:TargetBar(args.spellId, 8, args.destName)
end
end
function mod:FelEjectionRemoved(args)
if self:Me(args.destGUID) then
self:MessageOld(args.spellId, "blue", nil, CL.removed:format(args.spellName))
end
end
--[[ Stage Four ]]--
function mod:VoidNova(args)
self:MessageOld(args.spellId, "red", "alarm")
self:CastBar(args.spellId, 4)
self:CDBar(args.spellId, 75)
end
function mod:WorldDevouringForce(args)
self:MessageOld(args.spellId, "red", "alarm")
worldDevouringForceCounter = worldDevouringForceCounter + 1
local t = worldDevouringForceTimers[worldDevouringForceCounter]
if t then
self:Bar(args.spellId, t, CL.count:format(args.spellName, worldDevouringForceCounter))
end
end
--[[ Thing That Should Not Be ]]--
function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i = 1, 5 do
local guid = self:UnitGUID(("boss%d"):format(i))
if guid and not mobCollector[guid] then
mobCollector[guid] = true
local mobId = self:MobId(guid)
if mobId == 104880 then -- Thing That Should Not Be
voidCount = 1
self:CDBar(207720, self:Mythic() and 13.7 or 14.5, CL.count:format(self:SpellName(207720), voidCount)) -- Witness the Void
end
end
end
end
function mod:WitnessTheVoid(args)
self:StopBar(CL.count:format(args.spellName, voidCount)) -- will be replaced by a CL.cast bar
self:MessageOld(args.spellId, "yellow", "warning", CL.casting:format(CL.count:format(args.spellName, voidCount)))
self:CastBar(args.spellId, self:Mythic() and 2.8 or 4, CL.count:format(args.spellName, voidCount))
voidCount = voidCount + 1
self:Bar(args.spellId, self:Mythic() and 16.2 or 18.6, CL.count:format(args.spellName, voidCount)) -- m: 13.4 cd + 2.8, hc = 14.6 cd + 4
end
function mod:ThingDeath()
self:StopBar(CL.cast:format(CL.count:format(self:SpellName(207720), voidCount-1))) -- Witness the Void Cast
self:StopBar(CL.count:format(self:SpellName(207720), voidCount)) -- Witness the Void
end
--[[ Mythic ]]--
do
local mySign, scheduled, tryCount = nil, nil, 0
local playerList = mod:NewTargetList()
function mod:GrandConjunction(args)
starSignTables = {
[205429] = {},
[205445] = {},
[216345] = {},
[216344] = {},
}
tryCount = 0
mySign = nil
scheduled = nil
grandCast = true
self:MessageOld(args.spellId, "yellow", "info", CL.count:format(args.spellName, grandCounter))
grandCounter = grandCounter + 1
self:CastBar(args.spellId, 4)
self:OpenProximity(args.spellId, 5) -- no idea if this range is reasonable
local timer = 47 -- assumed p4 cd as default
if grandTimers[phase][grandCounter] then -- Everything else is assumed
timer = grandTimers[phase][grandCounter]
elseif phase == 1 then
timer = 14
elseif phase == 2 then
timer = 57
elseif phase == 3 then
timer = 42
end
self:CDBar(args.spellId, timer, CL.count:format(args.spellName, grandCounter))
end
function mod:GrandConjunctionSuccess(args)
grandCast = nil
self:CloseProximity(args.spellId)
end
local function warn(self)
scheduled = nil
tryCount = tryCount + 1
if not mySign then
if tryCount < 5 then
-- without counting, it could run endless if the same sign as ours gets
-- removed from another player first and then from us
scheduled = self:ScheduleTimer(warn, 0.1, self)
end
else
for i = 1, #starSignTables[mySign] do
playerList[#playerList+1] = starSignTables[mySign][i]
end
self:TargetMessageOld(205408, playerList, mySign == 205429 and "yellow" or mySign == 205445 and "red" or mySign == 216345 and "green" or "blue", "warning", mySign, mySign)
end
end
local function updateInfoBox(self)
if mySign then
-- -------------------------
-- | 1 Your Sign *Crab* 2 |
-- | 3 with PlayerA 4 |
-- | 5 PlayerB 6 |
-- | 7 PlayerC 8 |
-- | 9 10 |
-- -------------------------
self:SetInfo(205408, 1, L.yourSign)
self:SetInfo(205408, 2, L[mySign])
self:SetInfo(205408, 3, L.with)
self:SetInfo(205408, 4, "")
self:SetInfo(205408, 6, "")
self:SetInfo(205408, 8, "")
self:SetInfo(205408, 10, "")
for i = 1, #starSignTables[mySign] do
local name = starSignTables[mySign][i]
if name ~= self:UnitName("player") then
local c = i - 1
self:SetInfo(205408, 4+2*c, self:ColorName(name))
end
end
self:OpenInfo(205408, self:SpellName(mySign))
else
self:CloseInfo(205408)
end
end
function mod:StarSigns(args)
if self:Me(args.destGUID) then
mySign = args.spellId
if #starSignTables[mySign] == 4 then
warn(self)
elseif not scheduled then
scheduled = self:ScheduleTimer(warn, 0.1, self)
end
end
starSignTables[args.spellId][#starSignTables[args.spellId]+1] = args.destName
if mySign and mySign == args.spellId then
updateInfoBox(self)
end
end
function mod:StarSignsRemoved(args)
tDeleteItem(starSignTables[args.spellId], args.destName)
if self:Me(args.destGUID) then
self:MessageOld(205408, "blue", "info", CL.removed:format(args.spellName), args.spellId)
mySign = nil
updateInfoBox(self)
end
if mySign and mySign == args.spellId then -- Fewer players with our sign
updateInfoBox(self)
if not scheduled then
scheduled = self:ScheduleTimer(warn, 0.1, self)
end
end
end
end