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.

368 lines
12 KiB

-- GLOBALS: tContains, tDeleteItem
--------------------------------------------------------------------------------
-- TODO List:
-- Orbs alternate colour, maybe something like Krosus Assist?
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Maiden of Vigilance", 1676, 1897)
if not mod then return end
mod:RegisterEnableMob(118289) -- Maiden of Vigilance
mod.engageId = 2052
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local massInstabilityCounter = 0
local hammerofCreationCounter = 0
local hammerofObliterationCounter = 0
local infusionCounter = 0
local orbCounter = 1
local mySide = 0
local lightList, felList = {}, {}
local initialOrbs = nil
local orbTimers = {8, 8.5, 7.5, 10.5, 11.5, 8.0, 8.0, 10.0}
local wrathStacks = 0
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.infusionChanged = "Infusion CHANGED: %s"
L.sameInfusion = "Same Infusion: %s"
L.fel = "Fel"
L.light = "Light"
L.felHammer = "Fel Hammer" -- Better name for "Hammer of Obliteration"
L.lightHammer = "Light Hammer" -- Better name for "Hammer of Creation"
L.absorb = "Absorb"
L.absorb_text = "%s (|cff%s%.0f%%|r)"
L.cast = "Cast"
L.cast_text = "%.1fs (|cff%s%.0f%%|r)"
L.stacks = "Stacks"
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
"berserk",
{235117, "COUNTDOWN"}, -- Unstable Soul
241593, -- Aegwynn's Ward
{235271, "PROXIMITY", "FLASH"}, -- Infusion
241635, -- Hammer of Creation
238028, -- Light Remanence
241636, -- Hammer of Obliteration
238408, -- Fel Remanence
235267, -- Mass Instability
248812, -- Blowback
{235028, "INFOBOX"}, -- Titanic Bulwark
234891, -- Wrath of the Creators
239153, -- Spontaneous Fragmentation
},{
["berserk"] = "general",
[235271] = -14974, -- Stage One: Divide and Conquer
[248812] = -14975, -- Stage Two: Watcher's Wrath
[239153] = "mythic",
}
end
function mod:OnBossEnable()
-- General
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_AURA_APPLIED", "UnstableSoul", 243276, 240209, 235117) -- Mythic, LFR, Normal/Heroic
self:Log("SPELL_AURA_REFRESH", "UnstableSoul", 243276, 240209, 235117) -- Mythic, LFR, Normal/Heroic
self:Log("SPELL_AURA_REMOVED", "UnstableSoulRemoved", 243276, 240209, 235117) -- Mythic, LFR, Normal/Heroic
self:Log("SPELL_AURA_APPLIED", "AegwynnsWardApplied", 241593, 236420) -- Heroic, Normal/LFR
self:Log("SPELL_AURA_APPLIED", "GroundEffectDamage", 238028, 238408) -- Light Remanence, Fel Remanence
self:Log("SPELL_PERIODIC_DAMAGE", "GroundEffectDamage", 238028, 238408)
self:Log("SPELL_PERIODIC_MISSED", "GroundEffectDamage", 238028, 238408)
-- Stage One: Divide and Conquer
self:Log("SPELL_CAST_START", "Infusion", 235271)
self:Log("SPELL_AURA_APPLIED", "FelInfusion", 235240)
self:Log("SPELL_AURA_APPLIED", "LightInfusion", 235213)
self:Log("SPELL_AURA_APPLIED", "InfusionLFR", 240219, 240218) -- Fel Infusion (LFR), Light Infusion (LFR)
self:Log("SPELL_CAST_START", "HammerofCreation", 241635)
self:Log("SPELL_CAST_START", "HammerofObliteration", 241636)
self:Log("SPELL_CAST_START", "MassInstability", 235267)
-- Stage Two: Watcher's Wrath
self:Log("SPELL_CAST_SUCCESS", "Blowback", 248812)
self:Log("SPELL_AURA_APPLIED", "TitanicBulwarkApplied", 235028)
self:Log("SPELL_AURA_REMOVED", "TitanicBulwarkRemoved", 235028)
self:Log("SPELL_CAST_SUCCESS", "WrathoftheCreators", 234891)
self:Log("SPELL_AURA_REMOVED", "WrathoftheCreatorsInterrupted", 234891)
end
function mod:OnEngage()
mySide = 0
lightList = {}
felList = {}
massInstabilityCounter = 0
hammerofCreationCounter = 0
hammerofObliterationCounter = 0
infusionCounter = 0
orbCounter = 1
initialOrbs = true
wrathStacks = 0
if not self:LFR() then
self:Bar(235271, 2) -- Infusion
self:Bar(241635, 12, L.lightHammer) -- Hammer of Creation
self:Bar(235267, 22) -- Mass Instability
self:Bar(241636, 32, L.felHammer) -- Hammer of Obliteration
self:Bar(248812, 42.5) -- Blowback
self:Bar(234891, 43.5) -- Wrath of the Creators
else
self:Bar(235267, 6) -- Mass Instability
self:Bar(235271, 41) -- Infusion
self:Bar(248812, 46) -- Blowback
self:Bar(234891, 47.5) -- Wrath of the Creators
end
if self:Mythic() then
self:Bar(239153, 8, CL.count:format(self:SpellName(230932), orbCounter))
end
if not self:LFR() then
self:Berserk(480)
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 239153 then -- Spontaneous Fragmentation
self:MessageOld(spellId, "yellow", "alert", self:SpellName(230932))
orbCounter = orbCounter + 1
if orbCounter <= 4 and initialOrbs then
self:Bar(spellId, 8, CL.count:format(self:SpellName(230932), orbCounter))
elseif not initialOrbs then
self:Bar(spellId, orbTimers[orbCounter], CL.count:format(self:SpellName(230932), orbCounter))
end
elseif spellId == 234917 or spellId == 236433 then -- Wrath of the Creators
-- Blizzard didn't give us SPELL_AURA_APPLIED_DOSE events for the stacks,
-- so we have to count the casts.
wrathStacks = wrathStacks + 1
if (wrathStacks >= 10 and wrathStacks % 5 == 0) or (wrathStacks >= 25) then -- 10,15,20,25,26,27,28,29,30
self:MessageOld(234891, "orange", wrathStacks >= 25 and "alert", CL.count:format(self:SpellName(spellId), wrathStacks))
end
end
end
do
local prev = 0
function mod:UnstableSoul(args)
if self:Me(args.destGUID) then
local t = GetTime()
if t-prev > 1.5 then
prev = t
self:TargetMessageOld(235117, args.destName, "blue", "alarm")
end
-- Duration can be longer if the debuff gets refreshed
local _, _, _, expires = self:UnitDebuff(args.destName, args.spellId)
local remaining = expires-GetTime()
self:TargetBar(235117, remaining, args.destName)
end
end
end
function mod:UnstableSoulRemoved(args)
if self:Me(args.destGUID) then
self:StopBar(235117, args.destName)
end
end
function mod:AegwynnsWardApplied(args)
if self:Me(args.destGUID) then
self:MessageOld(241593, "cyan", "info")
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:Infusion(args)
self:MessageOld(args.spellId, "cyan", nil, CL.casting:format(args.spellName))
if self:LFR() then return end
infusionCounter = infusionCounter + 1
if infusionCounter == 2 then
self:Bar(args.spellId, 38.0)
end
end
do
local function checkSide(self, newSide, spellName)
local sideString = newSide == 235240 and L.fel or L.light
if mySide ~= newSide then
self:MessageOld(235271, "red", "warning", mySide == 0 and spellName or L.infusionChanged:format(sideString), newSide)
self:Flash(235271)
else
self:MessageOld(235271, "green", "info", L.sameInfusion:format(sideString), newSide)
end
mySide = newSide
end
function mod:FelInfusion(args)
if not tContains(felList, args.destName) then
felList[#felList+1] = args.destName
end
tDeleteItem(lightList, args.destName)
if self:Me(args.destGUID) then
self:OpenProximity(235271, 5, lightList) -- Avoid people with Light debuff
checkSide(self, args.spellId, args.spellName)
end
end
function mod:LightInfusion(args)
if not tContains(lightList, args.destName) then
lightList[#lightList+1] = args.destName
end
tDeleteItem(felList, args.destName)
if self:Me(args.destGUID) then
self:OpenProximity(235271, 5, felList) -- Avoid people with Fel debuff
checkSide(self, args.spellId, args.spellName)
end
end
end
function mod:InfusionLFR(args)
if self:Me(args.destGUID) then
self:MessageOld(235271, "green", "info", args.spellName)
end
end
function mod:HammerofCreation(args)
self:MessageOld(args.spellId, "orange", "alert", L.lightHammer)
hammerofCreationCounter = hammerofCreationCounter + 1
if hammerofCreationCounter == 2 then
self:Bar(args.spellId, 36, L.lightHammer)
end
end
function mod:HammerofObliteration(args)
self:MessageOld(args.spellId, "orange", "alert", L.felHammer)
hammerofObliterationCounter = hammerofObliterationCounter + 1
if hammerofObliterationCounter == 2 then
self:Bar(args.spellId, 36, L.felHammer)
end
end
function mod:MassInstability(args)
self:MessageOld(args.spellId, "yellow", "alert")
massInstabilityCounter = massInstabilityCounter + 1
if self:LFR() then
if massInstabilityCounter < 5 then
self:Bar(args.spellId, 12)
end
else
if massInstabilityCounter == 2 then
self:Bar(args.spellId, 36)
end
end
end
function mod:Blowback(args)
self:MessageOld(args.spellId, "red", "warning")
end
do
local timer, castOver, maxAbsorb = nil, 0, 0
local red, yellow, green = {.6, 0, 0, .6}, {.7, .5, 0}, {0, .5, 0}
local function updateInfoBox(self, spellId)
local castTimeLeft = castOver - GetTime()
local castPercentage = castTimeLeft / 50
local absorb = UnitGetTotalAbsorbs("boss1")
local absorbPercentage = absorb / maxAbsorb
local diff = castPercentage - absorbPercentage
local hexColor = "ff0000"
local rgbColor = red
if diff > 0.1 then -- over 10%
hexColor = "00ff00"
rgbColor = green
elseif diff > 0 then -- below 10%, so it's still close
hexColor = "ffff00"
rgbColor = yellow
end
self:SetInfoBar(spellId, 1, absorbPercentage, unpack(rgbColor))
self:SetInfo(spellId, 2, L.absorb_text:format(self:AbbreviateNumber(absorb), hexColor, absorbPercentage * 100))
self:SetInfoBar(spellId, 3, castPercentage)
self:SetInfo(spellId, 4, L.cast_text:format(castTimeLeft, hexColor, castPercentage * 100))
self:SetInfo(spellId, 6, ("%d/30"):format(wrathStacks))
end
function mod:TitanicBulwarkApplied(args)
wrathStacks = 0
if self:CheckOption(args.spellId, "INFOBOX") then
self:OpenInfo(args.spellId, args.spellName)
self:SetInfo(args.spellId, 1, L.absorb)
self:SetInfo(args.spellId, 3, L.cast)
self:SetInfo(args.spellId, 5, L.stacks)
castOver = GetTime() + 50 -- Time to 30 stacks
maxAbsorb = UnitGetTotalAbsorbs("boss1")
timer = self:ScheduleRepeatingTimer(updateInfoBox, 0.1, self, args.spellId)
end
end
function mod:TitanicBulwarkRemoved(args)
self:MessageOld(args.spellId, "green", "info", CL.removed:format(args.spellName))
end
function mod:WrathoftheCreators(args)
self:MessageOld(args.spellId, "yellow", "alert", CL.casting:format(args.spellName))
end
function mod:WrathoftheCreatorsInterrupted(args)
self:MessageOld(args.spellId, "green", "long", CL.interrupted:format(args.spellName))
massInstabilityCounter = 1
hammerofCreationCounter = 1
hammerofObliterationCounter = 1
infusionCounter = 1
orbCounter = 1
initialOrbs = nil
if timer then
self:CancelTimer(timer)
timer = nil
end
self:CloseInfo(235028) -- Titanic Bulwark
if not self:LFR() then
self:Bar(235271, 2) -- Infusion
self:Bar(241635, 14, L.lightHammer) -- Hammer of Creation
self:Bar(235267, 22) -- Mass Instability
self:Bar(241636, 32, L.felHammer) -- Hammer of Obliteration
self:Bar(248812, 82.5) -- Blowback
self:Bar(234891, 83.5) -- Wrath of the Creators
else
self:Bar(235267, 8) -- Mass Instability
self:Bar(248812, 66) -- Blowback
self:Bar(234891, 68) -- Wrath of the Creators
end
if self:Mythic() then
self:Bar(239153, 8, CL.count:format(self:SpellName(230932), orbCounter))
end
end
end