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.

382 lines
13 KiB

4 years ago
--------------------------------------------------------------------------------
-- TODO List:
-- - Deadly Screech Timers
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Sisters of the Moon", 1676, 1903)
if not mod then return end
mod:RegisterEnableMob(118523, 118374, 118518, 119205) -- Huntress Kasparian, Captain Yathae Moonstrike, Priestess Lunaspyre, Moontalon
mod.engageId = 2050
mod.respawnTime = 15
--------------------------------------------------------------------------------
-- Locals
--
local stage = 1
local twilightGlaiveCounter = 1
local screechCounter = 0
local rapidShotCounter = 1
local lunarBeaconCounter = 1
local nextUltimate = 0
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
"stages",
{236541, "SAY", "ICON"}, -- Twilight Glaive
{236547, "TANK"}, -- Moon Glaive
{236550, "TANK"}, -- Discorporate
236480, -- Glaive Storm
{236305, "SAY", "ICON"}, -- Incorporeal Shot
{236442, "SAY"}, -- Twilight Volley
236694, -- Call Moontalon
236697, -- Deadly Screech
236603, -- Rapid Shot
{233263, "PROXIMITY"}, -- Embrace of the Eclipse
236519, -- Moon Burn
{236712, "SAY", "SAY_COUNTDOWN"}, -- Lunar Beacon
237351, -- Lunar Barrage
{239264, "TANK"}, -- Lunar Fire
},{
["stages"] = "general",
[236547] = -15499, -- Huntress Kasparian
[236480] = -15510, -- Stage Two: Bow of the Night
[236305] = -15502, -- Captain Yathae Moonstrike
[236694] = -15510, -- Stage Two: Bow of the Night
[233263] = -15506, -- Priestess Lunaspyre
[236712] = -15519, -- Stage Three: Wrath of Elune
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1", "boss2")
-- Huntress Kasparian
self:Log("SPELL_AURA_APPLIED", "TwilightGlaiveApplied", 237561) -- Twilight Glaive
self:Log("SPELL_AURA_REMOVED", "TwilightGlaiveRemoved", 237561) -- Twilight Glaive
self:Log("SPELL_CAST_START", "MoonGlaive", 236547) -- Glaive Storm
self:Log("SPELL_AURA_APPLIED", "Discorporate", 236550) -- Discorporate
-- Stage Two: Bow of the Night
self:Log("SPELL_CAST_START", "GlaiveStorm", 239379) -- Glaive Storm
-- Captain Yathae Moonstrike
self:Log("SPELL_AURA_APPLIED", "IncorporealShotApplied", 236305) -- Incorporeal Shot
self:Log("SPELL_AURA_REMOVED", "IncorporealShotRemoved", 236305) -- Incorporeal Shot
self:Log("SPELL_CAST_START", "TwilightVolley", 236442) -- Twilight Volley
self:Log("SPELL_CAST_SUCCESS", "TwilightVolleySuccess", 236442) -- Twilight Volley
self:Log("SPELL_AURA_APPLIED", "TwilightVolleyDamage", 236516) -- Twilight Volley
self:Log("SPELL_PERIODIC_DAMAGE", "TwilightVolleyDamage", 236516) -- Twilight Volley
self:Log("SPELL_PERIODIC_MISSED", "TwilightVolleyDamage", 236516) -- Twilight Volley
-- Stage Two: Bow of the Night
self:Log("SPELL_CAST_START", "CallMoontalon", 236694) -- Call Moontalon
self:Log("SPELL_CAST_SUCCESS", "DeadlyScreech", 236697) -- Deadly Screech
self:Log("SPELL_AURA_APPLIED", "RapidShotApplied", 236596) -- Rapid Shot (Debuff)
-- Priestess Lunaspyre
self:Log("SPELL_CAST_SUCCESS", "EmbraceoftheEclipse", 233263) -- Embrace of the Eclipse
self:Log("SPELL_AURA_APPLIED", "EmbraceoftheEclipseApplied", 233263) -- Embrace of the Eclipse
self:Log("SPELL_AURA_REMOVED", "EmbraceoftheEclipseRemoved", 233263) -- Embrace of the Eclipse
self:Log("SPELL_CAST_SUCCESS", "MoonBurn", 236518) -- Moon Burn
self:Log("SPELL_AURA_APPLIED", "MoonBurnApplied", 236519) -- Moon Burn
-- Stage Three: Wrath of Elune
self:Log("SPELL_AURA_APPLIED", "LunarBeaconApplied", 236712) -- Lunar Beacon (Debuff)
self:Log("SPELL_AURA_REMOVED", "LunarBeaconRemoved", 236712) -- Lunar Beacon (Debuff)
self:Log("SPELL_CAST_START", "LunarBeacon", 236712) -- Lunar Beacon
self:Log("SPELL_AURA_APPLIED", "GroundEffectDamage", 237351) -- Lunar Barrage
self:Log("SPELL_PERIODIC_DAMAGE", "GroundEffectDamage", 237351)
self:Log("SPELL_PERIODIC_MISSED", "GroundEffectDamage", 237351)
self:Log("SPELL_CAST_SUCCESS", "LunarFire", 239264) -- Lunar Fire
self:Log("SPELL_AURA_APPLIED", "LunarFireApplied", 239264) -- Lunar Fire
self:Log("SPELL_AURA_APPLIED_DOSE", "LunarFireApplied", 239264) -- Lunar Fire
end
function mod:OnEngage()
stage = 1
screechCounter = 0
twilightGlaiveCounter = 1
rapidShotCounter = 1
lunarBeaconCounter = 1
nextUltimate = GetTime() + 48.3
self:MessageOld("stages", "cyan", "long", CL.stage:format(stage), false)
self:Bar(236519, 9.4) -- Moon Burn
self:Bar(236547, 14.2) -- Moon Glaive
self:Bar(236442, 16.6) -- Twilight Volley
self:Bar(236541, 18.1) -- Twilight Glaive
self:Bar(236305, 48.3) -- Incorporeal Shot
if not self:Easy() then
self:Bar(233263, 48.3) -- Embrace of the Eclipse
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 235268 then -- Lunar Ghost (Transition)
stage = stage + 1
local nextUltimateTimer = nextUltimate - GetTime()
self:MessageOld("stages", "cyan", "long", CL.stage:format(stage), false)
if stage == 2 then
self:StopBar(236547) -- Moon Glaive
self:StopBar(236442) -- Twilight Volley
self:StopBar(236541) -- Twilight Glaive
self:StopBar(236305) -- Incorporeal Shot
self:Bar(236541, 6) -- Twilight Glaive
self:Bar(236694, 7.3) -- Call Moontalon
self:Bar(236603, 15.8) -- Rapid Shot
local volleyTimer = 11
if nextUltimateTimer < volleyTimer and (nextUltimateTimer + 11.5) > volleyTimer then -- Check if the cooldown ends at any point for 11.5s after the ultimate incase it gets interupted
volleyTimer = volleyTimer + 7
end
self:CDBar(236442, volleyTimer) -- Twilight Volley
if self:Easy() and nextUltimateTimer > 0 then
self:Bar(233263, nextUltimateTimer) -- Embrace of the Eclipse
elseif nextUltimateTimer > 0 then
self:Bar(236480, nextUltimateTimer) -- Glaive Storm
end
elseif stage == 3 then
self:StopBar(233263) -- Embrace of the Eclipse
self:StopBar(236519) -- Moon Burn
self:StopBar(236694) -- Call Moontalon
self:StopBar(236603) -- Rapid Shot
self:StopBar(236442) -- Twilight Volley
self:Bar(236519, 10) -- Moon Burn
self:Bar(239264, 11) -- Lunar Fire
self:Bar(236712, 18.2) -- Lunar Beacon
local volleyTimer = 15.8
if nextUltimateTimer < volleyTimer and (nextUltimateTimer + 11.5) > volleyTimer then -- Check if the cooldown ends at any point for 11.5s after the ultimate incase it gets interupted
volleyTimer = volleyTimer + 7
end
self:CDBar(236442, volleyTimer) -- Twilight Volley
if self:Easy() and nextUltimateTimer > 0 then
self:Bar(236480, nextUltimateTimer) -- Glaive Storm
elseif nextUltimateTimer > 0 then
self:Bar(236305, nextUltimateTimer) -- Incorporeal Shot
end
end
end
end
function mod:TwilightGlaiveApplied(args)
twilightGlaiveCounter = twilightGlaiveCounter + 1
self:TargetMessageOld(236541, args.destName, "yellow")
if self:Me(args.destGUID) then
self:PlaySound(236541, "warning")
self:Say(236541)
else
self:PlaySound(236541, "info")
end
self:SecondaryIcon(236541, args.destName)
self:Bar(236541, stage > 1 and 20.5 or (twilightGlaiveCounter % 2 == 1 and 30 or 19))
end
function mod:TwilightGlaiveRemoved()
self:SecondaryIcon(236541)
end
function mod:MoonGlaive(args)
self:MessageOld(args.spellId, "red", "warning")
if nextUltimate > GetTime() + 15.5 then
self:Bar(args.spellId, 15.5)
else
local nextUltimateTimer = nextUltimate - GetTime()
local timer = nextUltimateTimer + 25.5 -- CD After Ultimates
self:Bar(args.spellId, timer)
end
end
function mod:Discorporate(args)
self:TargetMessageOld(args.spellId, args.destName, "orange", "alarm", nil, nil, self:Tank())
end
function mod:GlaiveStorm(args)
self:MessageOld(236480, "red", "warning", CL.incoming:format(args.spellName))
self:Bar(236480, 54.7)
nextUltimate = GetTime() + 54.7
end
function mod:IncorporealShotApplied(args)
self:TargetMessageOld(args.spellId, args.destName, "orange", "warning", nil, nil, true)
self:TargetBar(args.spellId, 6, args.destName)
if self:Me(args.destGUID) then
self:Say(args.spellId)
end
self:PrimaryIcon(args.spellId, args.destName)
self:Bar(args.spellId, 54.7)
nextUltimate = GetTime() + 54.7
if stage == 1 then -- Reset CD for tank abilities on Ultimate attacks
self:CDBar(236547, 25.5) -- Moon Glaive
elseif stage == 3 then
self:CDBar(239264, 18.5) -- Lunar Fire
end
end
function mod:IncorporealShotRemoved(args)
self:PrimaryIcon(args.spellId)
end
do
local function printTarget(self, name, guid)
self:TargetMessageOld(236442, name, "yellow", "alert", nil, nil, true)
if self:Me(guid) then
self:Say(236442)
end
end
function mod:TwilightVolley(args)
local nextUltimateTimer = nextUltimate - GetTime()
if nextUltimateTimer > 43.2 then -- If less than 11.5 seconds have passed since last Ultimate, the cast will be interupted
self:CDBar(args.spellId, 7)
else
self:GetBossTarget(printTarget, 0.5, args.sourceGUID)
end
end
end
function mod:TwilightVolleySuccess(args)
local nextUltimateTimer = nextUltimate - GetTime()
local timer = stage == 2 and 15.8 or 19.5 -- XXX Assumed cooldowns
if nextUltimateTimer < timer and (nextUltimateTimer + 11.5) > timer then -- Check if the cooldown ends at any point for 11.5s after the ultimate incase it gets interupted
timer = timer + 7
end
self:CDBar(args.spellId, timer)
end
do
local prev = 0
function mod:TwilightVolleyDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(236442, "blue", "alarm", CL.underyou:format(args.spellName))
end
end
end
function mod:CallMoontalon(args)
self:MessageOld(args.spellId, "orange", "alert", CL.incoming:format(self:SpellName(-15064))) -- Moontalon
screechCounter = 1
self:CDBar(args.spellId, 124.5) -- 122~127
end
function mod:DeadlyScreech(args)
self:MessageOld(args.spellId, "yellow", "alert", CL.count:format(args.spellName, screechCounter))
screechCounter = screechCounter + 1
end
function mod:RapidShotApplied(args)
self:TargetMessageOld(236603, args.destName, "yellow", "warning")
rapidShotCounter = rapidShotCounter + 1
self:Bar(236603, rapidShotCounter % 2 == 0 and 18.5 or 30.5)
end
function mod:EmbraceoftheEclipse(args)
self:MessageOld(args.spellId, "yellow", "alarm", args.spellName)
self:Bar(args.spellId, 54.7)
nextUltimate = GetTime() + 54.7
end
function mod:EmbraceoftheEclipseApplied(args)
if self:Me(args.destGUID) then
self:OpenProximity(args.spellId, 8)
end
end
function mod:EmbraceoftheEclipseRemoved(args)
if self:Me(args.destGUID) then
self:CloseProximity(args.spellId)
end
end
function mod:MoonBurn()
self:CDBar(236519, stage == 3 and 18.3 or 24.3)
end
do
local playerList = mod:NewTargetList()
function mod:MoonBurnApplied(args)
playerList[#playerList+1] = args.destName
if #playerList == 1 then
self:ScheduleTimer("TargetMessageOld", 0.3, args.spellId, playerList, "yellow", "alert")
end
end
end
do
local targetFound = nil
local function printTarget(self, name, guid)
if not self:Tank(name) then -- sometimes takes really long, so we might return early
targetFound = true
self:TargetMessageOld(236712, name, "yellow", "alert")
if self:Me(guid) then
self:Say(236712)
end
end
end
function mod:LunarBeaconApplied(args)
if not targetFound then
printTarget(self, args.destName, args.destGUID)
targetFound = true
end
if self:Me(args.destGUID) then
self:SayCountdown(args.spellId, 6)
end
end
function mod:LunarBeaconRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
end
function mod:LunarBeacon(args)
targetFound = nil
self:GetBossTarget(printTarget, 0.8, args.sourceGUID) -- Faster than waiting for debuff/cast end, but might return with the tank
lunarBeaconCounter = lunarBeaconCounter + 1
self:Bar(args.spellId, lunarBeaconCounter == 2 and 21.9 or 35) -- XXX Need Data longer than 4 casts
end
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
function mod:LunarFire(args)
if nextUltimate > GetTime() + 11 then
self:Bar(args.spellId, 11)
else
local nextUltimateTimer = nextUltimate - GetTime()
local timer = nextUltimateTimer + 18.5 -- CD After Ultimates
self:CDBar(args.spellId, timer)
end
end
function mod:LunarFireApplied(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "red", amount > 1 and "warning")
end