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.
703 lines
23 KiB
703 lines
23 KiB
|
5 years ago
|
--------------------------------------------------------------------------------
|
||
|
|
-- 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
|