-------------------------------------------------------------------------------- -- Module Declaration -- local mod, CL = BigWigs:NewBoss("Stone Legion Generals", 2296, 2425) if not mod then return end mod:RegisterEnableMob( 168112, -- General Kaal 168113) -- General Grashaal mod:SetEncounterID(2417) mod:SetRespawnTime(30) mod:SetStage(1) -------------------------------------------------------------------------------- -- Locals -- local intermission = false local wickedBladeCount = 1 local heartRendCount = 1 local serratedSwipeCount = 1 local crystalizeCount = 1 local pulverizingMeteorCount = 1 local reverberatingLeapCount = 1 local seismicUphealvalCount = 1 local shadowForcesCount = 1 local isInfoOpen = false local mobCollector = {} local mobCollectorGoliath = {} local skirmisherCount = 0 local skirmisherTracker = {} local commandoesKilled = 0 local commandoesNeeded = 7 local commandoAddMarks = {} local wickedLacerationList = {} local firstGoliath = false local playerListVolAnima = {} -------------------------------------------------------------------------------- -- Localization -- local L = mod:GetLocale() if L then L.first_blade = "First Blade" -- Wicked Blade L.second_blade = "Second Blade" L.skirmishers = "Skirmishers" -- Short for Stone Legion Skirmishers L.eruption = "Eruption" -- Short for Reverberating Eruption L.custom_on_stop_timers = "Always show ability bars" L.custom_on_stop_timers_desc = "Just for testing right now" L.goliath = -23101 L.goliath_short = "Goliath" L.goliath_desc = "Show warnings and timers for when the Stone Legion Goliath is going to spawn." L.goliath_icon = "Ability_deathknight_summongargoyle" L.commando = -22791 L.commando_short = "Commando" L.commando_desc = "Show warnings when a Stone Legion Commando is killed." end -------------------------------------------------------------------------------- -- Initialization -- local wickedBladeMarker = mod:AddMarkerOption(false, "player", 2, 333387, 2, 3) -- Wicked Blade local heartRendMarker = mod:AddMarkerOption(false, "player", 1, 334765, 1, 2, 3, 4) -- Heart Rend local crystalizeMarker = mod:AddMarkerOption(false, "player", 1, 339690, 1) -- Crystalize local skirmisherMarker = mod:AddMarkerOption(false, "npc", 8, -22761, 8, 7, 6) -- Stone Legion Skirmisher local commandoMarker = mod:AddMarkerOption(false, "npc", 8, -22772, 8, 7, 6, 5) -- Stone Legion Commando function mod:GetOptions() return { "berserk", "custom_on_stop_timers", "goliath", "commando", --[[ Stage One: Kaal's Assault ]]-- 329636, -- Hardened Stone Form {333387, "SAY"}, -- Wicked Blade {333913, "INFOBOX"}, -- Wicked Laceration wickedBladeMarker, 334765, -- Heart Rend heartRendMarker, {334929, "TANK"}, -- Serrated Swipe {339690, "SAY", "SAY_COUNTDOWN", "ME_ONLY_EMPHASIZE"}, -- Crystalize crystalizeMarker, {342544, "SAY"}, -- Pulverizing Meteor 343063, -- Stone Spike {342733, "FLASH"}, -- Ravenous Feast 343898, -- Soultaint Effigy --[[ Intermission ]]-- 332406, -- Anima Infusion 339885, -- Anima Infection 342722, -- Stonewrath Exhaust 332683, -- Shattering Blast --[[ Stage Two: Grashaal's Blitz ]]-- 329808, -- Hardened Stone Form {342425, "TANK"}, -- Stone Fist {344496, "SAY", "ME_ONLY_EMPHASIZE"}, -- Reverberating Eruption 334498, -- Seismic Upheaval --[[ Mythic ]]-- 342256, -- Call Shadow Forces skirmisherMarker, 342655, -- Volatile Anima Infusion 340037, -- Volatile Stone Shell 342698, -- Volatile Anima Injection commandoMarker, },{ ["berserk"] = "general", [329636] = -22681, -- Stage One: Kaal's Assault [332406] = "intermission", [329808] = -22718, -- Stage Two: Grashaal's Blitz [342256] = "mythic", },{ ["goliath"] = L.goliath_short, -- Stone Legion Goliath (Goliath) ["commando"] = L.commando_short, -- Stone Legion Commando (Commando) [342544] = CL.meteor, -- Pulverizing Meteor (Meteor) [344496] = L.eruption, -- Reverberating Eruption (Eruption) } end function mod:OnBossEnable() self:RegisterMessage("BigWigs_BarCreated", "BarCreated") self:Log("SPELL_CAST_SUCCESS", "SummonReinforcements", 342255) --[[ Stage One: Kaal's Assault ]]-- self:Log("SPELL_AURA_APPLIED", "HardenedStoneFormApplied", 329636) self:Log("SPELL_AURA_REMOVED", "HardenedStoneFormRemoved", 329636) self:Log("SPELL_CAST_START", "WickedBlade", 344230, 333387) -- Normal, Heroic self:Log("SPELL_AURA_APPLIED", "WickedBladeApplied", 333377) -- Wicked Mark self:Log("SPELL_AURA_REMOVED", "WickedBladeRemoved", 333377) self:Log("SPELL_AURA_APPLIED", "WickedLaceration", 333913) self:Log("SPELL_AURA_APPLIED_DOSE", "WickedLaceration", 333913) self:Log("SPELL_AURA_REMOVED", "WickedLacerationRemoved", 333913) self:Log("SPELL_CAST_START", "HeartRend", 334765) self:Log("SPELL_CAST_SUCCESS", "HeartRendSuccess", 334765) self:Log("SPELL_AURA_APPLIED", "HeartRendApplied", 334765) self:Log("SPELL_AURA_REMOVED", "HeartRendRemoved", 334765) self:Log("SPELL_CAST_START", "SerratedSwipe", 334929) self:Log("SPELL_CAST_SUCCESS", "SerratedSwipeSuccess", 334929) self:Log("SPELL_CAST_SUCCESS", "Crystalize", 339690) self:Log("SPELL_AURA_APPLIED", "CrystalizeApplied", 339690) self:Log("SPELL_AURA_REMOVED", "CrystalizeRemoved", 339690) self:Log("SPELL_CAST_START", "PulverizingMeteor", 342544) self:Log("SPELL_AURA_APPLIED", "StoneSpikeApplied", 343063) self:Log("SPELL_AURA_APPLIED", "AnimaApplied", 332406, 339885) -- Anima Infusion, Anima Infection self:Log("SPELL_CAST_START", "StonewrathExhaust", 342722) self:Log("SPELL_CAST_START", "ShatteringBlast", 332683) self:Log("SPELL_CAST_SUCCESS", "RavenousFeast", 342732) -- Faster than 342733 self:Log("SPELL_AURA_APPLIED", "SoultaintEffigy", 343898) --[[ Stage Two: Grashaal's Blitz ]]-- self:Log("SPELL_AURA_APPLIED", "GraniteFormApplied", 329808) self:Log("SPELL_AURA_REMOVED", "GraniteFormRemoved", 329808) self:Log("SPELL_CAST_START", "StoneFist", 342425) self:Log("SPELL_AURA_APPLIED", "StoneFistApplied", 342425) self:Log("SPELL_AURA_APPLIED_DOSE", "StoneFistApplied", 342425) self:Log("SPELL_CAST_START", "ReverberatingEruption", 344496) self:Log("SPELL_CAST_START", "SeismicUpheaval", 334498) --[[ Mythic ]]-- self:Log("SPELL_CAST_START", "CallShadowForces", 342256) self:Log("SPELL_SUMMON", "SummonSkirmisher", 342259, 342257, 342258) self:Log("SPELL_AURA_APPLIED", "VolatileAnimaAppliedInfusion", 342655) self:Log("SPELL_AURA_APPLIED", "VolatileAnimaAppliedInfection", 342698) self:Log("SPELL_AURA_APPLIED", "VolatileStoneShell", 340037) self:Death("CommandoDeath", 169601) -- Stone Legion Commando end function mod:OnEngage() wickedBladeCount = 1 heartRendCount = 1 serratedSwipeCount = 1 crystalizeCount = 1 pulverizingMeteorCount = 1 reverberatingLeapCount = 1 seismicUphealvalCount = 1 shadowForcesCount = 1 intermission = false wickedLacerationList = {} isInfoOpen = false mobCollectorGoliath = {} playerListVolAnima = {} if self:Easy() then firstGoliath = false else firstGoliath = true end self:SetStage(1) self:Bar(334929, 8.2, CL.count:format(self:SpellName(334929), serratedSwipeCount)) -- Serrated Swipe self:Bar(333387, self:Mythic() and 18 or 19, CL.count:format(self:SpellName(333387), wickedBladeCount)) -- Wicked Blade self:Bar(334765, self:Mythic() and 32.5 or 30, CL.count:format(self:SpellName(334765), heartRendCount)) -- Heart Rend // It's either Heart Rend or Crystalize in Mythic self:Bar(339690, self:Mythic() and 32.5 or 25, CL.count:format(self:SpellName(339690), crystalizeCount)) -- Crystalize if self:Mythic() then self:Bar(342256, 10.7, CL.count:format(L.skirmishers, shadowForcesCount)) -- Call Shadow Forces self:Berserk(720) end -- Marking stuff mobCollector = {} skirmisherCount = 0 skirmisherTracker = {} commandoesKilled = 0 commandoesNeeded = 7 commandoAddMarks = {} if self:GetOption(skirmisherMarker) or self:GetOption(commandoMarker) then self:RegisterTargetEvents("AddMarkTracker") end self:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT") end -------------------------------------------------------------------------------- -- Event Handlers -- function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT() local _, guid = self:GetBossId(172858) -- Stone Legion Goliath if guid and not mobCollectorGoliath[guid] then mobCollectorGoliath[guid] = true self:Message("goliath", "cyan", CL.spawned:format(L.goliath_short), L.goliath_icon) self:StopBar(L.goliath_short) self:Bar(342733, 18) -- Ravenous Feast self:PlaySound("goliath", "info") end end function mod:SummonReinforcements() if not firstGoliath then -- Avoid a message on boss engage (only happens on hc/mythic) self:Message("goliath", "cyan", CL.custom_sec:format(L.goliath_short, 10), false) else firstGoliath = false end self:CDBar("goliath", 10, L.goliath_short, L.goliath_icon) end do local abilitysToPause = { [333387] = true, -- Wicked Blade [334765] = true, -- Heart Rend [339690] = true, -- Crystallize [344496] = true, -- Reverberating Eruption [334498] = true, -- Seismic Upheaval } local castPattern = CL.cast:gsub("%%s", ".+") local function stopAtZeroSec(bar) if bar.remaining < 0.15 then -- Pause at 0.0 bar:SetDuration(0.01) -- Make the bar look full bar:Start() bar:Pause() bar:SetTimeVisibility(false) end end function mod:BarCreated(_, _, bar, _, key, text) if self:GetOption("custom_on_stop_timers") and abilitysToPause[key] and not text:match(castPattern) then bar:AddUpdateFunction(stopAtZeroSec) end end end do local throttle = false local function Message() throttle = false mod:Message("commando", "cyan", CL.mob_killed:format(L.commando_short, commandoesKilled, commandoesNeeded), false) -- Stone Legion Commando end function mod:CommandoDeath(args) if intermission then commandoesKilled = commandoesKilled + 1 if not throttle then throttle = true self:SimpleTimer(Message, 1.5) end end if self:GetOption(commandoMarker) then for i = 8, 5, -1 do -- 8, 7, 6, 5 if commandoAddMarks[i] == args.destGUID then commandoAddMarks[i] = nil return end end end end end function mod:SummonSkirmisher(args) skirmisherCount = skirmisherCount + 1 local icon = 9-skirmisherCount skirmisherTracker[args.destGUID] = icon end function mod:AddMarkTracker(event, unit, guid) if guid and not mobCollector[guid] then local mobId = self:MobId(guid) if self:GetOption(skirmisherMarker) and skirmisherTracker[guid] then -- Stone Legion Skirmisher self:CustomIcon(skirmisherMarker, unit, skirmisherTracker[guid]) mobCollector[guid] = true elseif self:GetOption(commandoMarker) and mobId == 169601 then -- Stone Legion Commando if self:GetHealth(unit) < 75 then -- They are 72% when they are on the floor, 100% when flying around for i = 8, 5, -1 do -- 8, 7, 6, 5 if not commandoAddMarks[i] then mobCollector[guid] = true commandoAddMarks[i] = guid self:CustomIcon(commandoMarker, unit, i) return end end end end end end --[[ Stage One: Kaal's Assault ]]-- function mod:HardenedStoneFormApplied(args) self:Message(args.spellId, "green", CL.intermission) self:PlaySound(args.spellId, "long") self:Bar("goliath", 10, L.goliath_short, L.goliath_icon) intermission = true commandoAddMarks = {} commandoesKilled = 0 self:StopBar(CL.count:format(L.skirmishers, shadowForcesCount)) -- Call Shadow Forces shadowForcesCount = 1 end function mod:HardenedStoneFormRemoved(args) self:StopBar(CL.count:format(self:SpellName(334765), heartRendCount)) -- Heart Rend self:StopBar(CL.count:format(self:SpellName(334929), serratedSwipeCount)) -- Serrated Swipe self:StopBar(CL.count:format(self:SpellName(333387), wickedBladeCount)) -- Wicked Blade self:StopBar(CL.count:format(self:SpellName(339690), crystalizeCount)) -- Crystalize self:SetStage(2) self:Message(args.spellId, "green", CL.stage:format(2)) self:PlaySound(args.spellId, "long") heartRendCount = 1 serratedSwipeCount = 1 crystalizeCount = 1 pulverizingMeteorCount = 1 reverberatingLeapCount = 1 seismicUphealvalCount = 1 wickedBladeCount = 1 self:Bar(342425, 23) -- Stone Fist self:Bar(339690, 14.5, CL.count:format(self:SpellName(339690), crystalizeCount)) -- Crystalize self:Bar(344496, 33, CL.count:format(L.eruption, reverberatingLeapCount)) -- Reverberating Eruption self:Bar(334498, 45, CL.count:format(self:SpellName(334498), seismicUphealvalCount)) -- Seismic Upheaval self:Bar(333387, 25.5, CL.count:format(self:SpellName(333387), wickedBladeCount)) -- Wicked Blade end do local playerList, onMe, firstGUID = {}, false, nil local function printTarget(self, target, guid) if #playerList ~= 0 then -- Compensate for sometimes taking a very long time (0.5s+) to pick a target by using this fallback if not self:Me(guid) and onMe then self:Say(333387, L.second_blade) self:PlaySound(333387, "warning") end if self:GetOption(wickedBladeMarker) then for i = 1, #playerList do local name = playerList[i] self:CustomIcon(wickedBladeMarker, name, name == target and 2 or 3) end end else firstGUID = guid playerList[1] = target end if self:Me(guid) then self:Say(333387, L.first_blade) self:PlaySound(333387, "warning") end end function mod:WickedBlade(args) playerList = {} firstGUID = nil self:StopBar(CL.count:format(args.spellName, wickedBladeCount)) self:GetNextBossTarget(printTarget, args.sourceGUID, 1) wickedBladeCount = wickedBladeCount + 1 self:Bar(333387, 30.5, CL.count:format(args.spellName, wickedBladeCount)) end function mod:WickedBladeApplied(args) if not firstGUID then -- Compensate for sometimes taking a very long time (0.5s+) to pick a target by using this fallback playerList[#playerList+1] = args.destName if self:Me(args.destGUID) then onMe = true self:Say(333387) self:PlaySound(333387, "warning") end if #playerList == 2 then --if self:GetOption(wickedBladeMarker) then -- Are potentially wrong marks better than potentially no marks? -- self:CustomIcon(wickedBladeMarker, playerList[1], 2) -- self:CustomIcon(wickedBladeMarker, playerList[2], 3) --end self:NewTargetsMessage(333387, "orange", playerList, 2, CL.count:format(self:SpellName(333387), wickedBladeCount-1)) end elseif firstGUID and firstGUID ~= args.destGUID then if self:Me(args.destGUID) then self:Say(333387, L.second_blade) self:PlaySound(333387, "warning") end playerList[2] = args.destName self:CustomIcon(wickedBladeMarker, playerList[1], 2) self:CustomIcon(wickedBladeMarker, playerList[2], 3) self:NewTargetsMessage(333387, "orange", playerList, 2, CL.count:format(self:SpellName(333387), wickedBladeCount-1)) end end function mod:WickedBladeRemoved(args) if self:Me(args.destGUID) then onMe = false end self:CustomIcon(wickedBladeMarker, args.destName) end end function mod:WickedLaceration(args) if not isInfoOpen then isInfoOpen = true self:OpenInfo(args.spellId, args.spellName) end wickedLacerationList[args.destName] = args.amount or 1 self:SetInfoByTable(args.spellId, wickedLacerationList) end function mod:WickedLacerationRemoved(args) wickedLacerationList[args.destName] = nil if next(wickedLacerationList) then self:SetInfoByTable(args.spellId, wickedLacerationList) elseif isInfoOpen then isInfoOpen = false self:CloseInfo(args.spellId) end end do local playerList = {} local prevStage, prevCount = 1, 0 function mod:HeartRend(args) playerList = {} prevStage = self:GetStage() prevCount = heartRendCount end function mod:HeartRendSuccess(args) if self:GetStage() == prevStage then -- Only if we didn't transition during cast self:StopBar(CL.count:format(args.spellName, heartRendCount)) heartRendCount = heartRendCount + 1 self:Bar(args.spellId, 42.5, CL.count:format(args.spellName, heartRendCount)) end if self:Dispeller("magic") then self:PlaySound(args.spellId, "alarm") end end function mod:HeartRendApplied(args) local count = #playerList+1 playerList[count] = args.destName playerList[args.destName] = count -- Set raid marker if self:Me(args.destGUID) and not self:Dispeller("magic") then self:PlaySound(args.spellId, "alarm") end self:CustomIcon(heartRendMarker, args.destName, count) if self:GetStage() ~= prevStage then -- We transitioned during the cast and heartRendCount was reset to 1 self:NewTargetsMessage(args.spellId, "orange", playerList, self:Mythic() and 4 or 3, CL.count:format(args.spellName, prevCount)) else self:NewTargetsMessage(args.spellId, "orange", playerList, self:Mythic() and 4 or 3, CL.count:format(args.spellName, heartRendCount-1)) end end function mod:HeartRendRemoved(args) self:CustomIcon(heartRendMarker, args.destName) end end function mod:SerratedSwipe(args) self:StopBar(CL.count:format(args.spellName, serratedSwipeCount)) self:Message(args.spellId, "yellow", CL.count:format(args.spellName, serratedSwipeCount)) self:PlaySound(args.spellId, "info") end function mod:SerratedSwipeSuccess(args) serratedSwipeCount = serratedSwipeCount + 1 self:CDBar(args.spellId, 21.9, CL.count:format(args.spellName, serratedSwipeCount)) -- to _start end function mod:Crystalize(args) self:StopBar(CL.count:format(args.spellName, crystalizeCount)) crystalizeCount = crystalizeCount + 1 self:CDBar(args.spellId, self:Mythic() and 55 or 50, CL.count:format(args.spellName, crystalizeCount)) end do local prevGUID = nil function mod:CrystalizeApplied(args) prevGUID = args.destGUID self:TargetMessage(args.spellId, "yellow", args.destName, CL.count:format(args.spellName, crystalizeCount-1)) if self:Me(args.destGUID) then self:Say(args.spellId) self:SayCountdown(args.spellId, 5) self:PlaySound(args.spellId, "warning") end self:CustomIcon(crystalizeMarker, args.destName, 1) end function mod:CrystalizeRemoved(args) if self:Me(args.destGUID) then self:CancelSayCountdown(args.spellId) end self:CustomIcon(crystalizeMarker, args.destName) end function mod:PulverizingMeteor(args) if self:Me(prevGUID) then self:Yell(args.spellId, CL.meteor) -- Meteor end self:Message(args.spellId, "orange", CL.count:format(CL.meteor, pulverizingMeteorCount)) self:PlaySound(args.spellId, "alert") pulverizingMeteorCount = pulverizingMeteorCount + 1 end end function mod:StoneSpikeApplied(args) if self:Me(args.destGUID) then self:PersonalMessage(args.spellId) self:PlaySound(args.spellId, "alarm") end end function mod:AnimaApplied(args) if self:Me(args.destGUID) then self:Message(args.spellId, "green", CL.you:format(args.spellName)) self:PlaySound(args.spellId, "info") end end function mod:StonewrathExhaust(args) self:Message(args.spellId, "yellow") self:PlaySound(args.spellId, "alert") end function mod:ShatteringBlast(args) self:Message(args.spellId, "red") self:PlaySound(args.spellId, "warning") self:CastBar(args.spellId, 5) intermission = false end --[[ Stage Two: Grashaal's Blitz ]]-- function mod:GraniteFormApplied(args) self:Message(args.spellId, "green", CL.intermission) self:PlaySound(args.spellId, "long") self:Bar("goliath", 10, L.goliath_short, L.goliath_icon) commandoAddMarks = {} commandoesKilled = 0 intermission = true self:StopBar(CL.count:format(self:SpellName(334498), seismicUphealvalCount)) -- Seismic Upheaval self:StopBar(CL.count:format(L.skirmishers, shadowForcesCount)) -- Call Shadow Forces shadowForcesCount = 1 end function mod:GraniteFormRemoved(args) self:StopBar(CL.count:format(self:SpellName(333387), wickedBladeCount)) -- Wicked Blade self:StopBar(CL.count:format(self:SpellName(334765), heartRendCount)) -- Heart Rend self:StopBar(CL.count:format(self:SpellName(339690), crystalizeCount)) -- Crystalize self:StopBar(CL.count:format(L.eruption, reverberatingLeapCount)) -- Reverberating Eruption self:StopBar(343086) -- Ricocheting Shuriken self:SetStage(3) self:Message(args.spellId, "green", CL.stage:format(3)) self:PlaySound(args.spellId, "long") --reverberatingLeapCount = 1 -- We dont reset as soaking is counting up from stage 2 + intermission heartRendCount = 1 serratedSwipeCount = 1 wickedBladeCount = 1 seismicUphealvalCount = 1 crystalizeCount = 1 pulverizingMeteorCount = 1 self:Bar(334929, 9, CL.count:format(self:SpellName(334929), serratedSwipeCount)) -- Serrated Swipe self:Bar(342425, 16) -- Stone Fist self:Bar(339690, 7.5, CL.count:format(self:SpellName(339690), crystalizeCount)) -- Crystalize self:Bar(333387, 20, CL.count:format(self:SpellName(333387), wickedBladeCount)) -- Wicked Blade self:Bar(344496, 26, CL.count:format(L.eruption, reverberatingLeapCount)) -- Reverberating Eruption self:Bar(334765, 33, CL.count:format(self:SpellName(334765), heartRendCount)) -- Heart Rend self:Bar(334498, 39, CL.count:format(self:SpellName(334498), seismicUphealvalCount)) -- Seismic Upheaval end function mod:StoneFist(args) self:CDBar(args.spellId, 19) end function mod:StoneFistApplied(args) local amount = args.amount or 1 if amount == 1 then self:TargetMessage(args.spellId, "purple", args.destName) else self:NewStackMessage(args.spellId, "purple", args.destName, amount) end self:PlaySound(args.spellId, "warning") end do local function printTarget(self, player, guid) if self:Me(guid) then self:Say(344496, L.eruption) -- Eruption self:PlaySound(344496, "warning") end self:TargetMessage(344496, "red", player, CL.count:format(L.eruption, reverberatingLeapCount-1)) end function mod:ReverberatingEruption(args) self:StopBar(CL.count:format(L.eruption, reverberatingLeapCount)) self:GetNextBossTarget(printTarget, args.sourceGUID) reverberatingLeapCount = reverberatingLeapCount + 1 self:CDBar(args.spellId, 30, CL.count:format(L.eruption, reverberatingLeapCount)) end end function mod:SeismicUpheaval(args) self:StopBar(CL.count:format(args.spellName, seismicUphealvalCount)) self:Message(args.spellId, "orange", CL.count:format(args.spellName, seismicUphealvalCount)) self:PlaySound(args.spellId, "long") seismicUphealvalCount = seismicUphealvalCount + 1 self:CDBar(args.spellId, self:Mythic() and 26 or 28, CL.count:format(args.spellName, seismicUphealvalCount)) end --[[ Mythic ]]-- function mod:CallShadowForces(args) self:Message(args.spellId, "cyan", CL.count:format(L.skirmishers, shadowForcesCount)) self:PlaySound(args.spellId, "long") skirmisherCount = 0 -- Reset for a new wave shadowForcesCount = shadowForcesCount + 1 self:CDBar(args.spellId, 52, CL.count:format(L.skirmishers, shadowForcesCount)) end function mod:VolatileAnimaAppliedInfusion(args) playerListVolAnima[#playerListVolAnima+1] = args.destName if self:Me(args.destGUID) then self:PlaySound(args.spellId, "alert") end self:NewTargetsMessage(args.spellId, "cyan", playerListVolAnima, nil, nil, nil, 2) -- Throttle to 2s end function mod:VolatileAnimaAppliedInfection(args) self:TargetMessage(args.spellId, "cyan", args.destName) if self:Me(args.destGUID) then self:PlaySound(args.spellId, "alert") end end do local prev = 0 function mod:VolatileStoneShell(args) local t = args.time if t-prev > 2 then prev = t self:Message(args.spellId, "orange") self:PlaySound(args.spellId, "alarm") end end end function mod:RavenousFeast(args) self:TargetMessage(342733, "red", args.destName) if self:Me(args.destGUID) then self:PlaySound(342733, "warning") self:Flash(342733) end self:Bar(342733, self:Mythic() and 24.3 or 18.2) -- Ravenous Feast end function mod:SoultaintEffigy(args) self:Message(args.spellId, "yellow", CL.percent:format(30, args.spellName)) self:PlaySound(args.spellId, "alert") self:StopBar(342733) -- Ravenous Feast end