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.
664 lines
23 KiB
664 lines
23 KiB
|
|
--------------------------------------------------------------------------------
|
|
-- TODO List:
|
|
-- Fix/Remove untested mythic funcs:
|
|
-- MistInfusion
|
|
-- (Mythic) Update Lantarn of Darkness initial timer.
|
|
-- (Mythic) Update Fetid Rot timers
|
|
-- (Mythic) If marking Orb targets, in p3 there is double dps
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Module Declaration
|
|
--
|
|
|
|
local mod, CL = BigWigs:NewBoss("Helya-TrialOfValor", 1648, 1829)
|
|
if not mod then return end
|
|
mod:RegisterEnableMob(114537)
|
|
mod.engageId = 2008
|
|
mod.respawnTime = 30
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Locals
|
|
--
|
|
|
|
local taintMarkerCount = 4
|
|
local tentaclesUp = 9
|
|
local phase = 1
|
|
local orbCount = 1
|
|
local tentacleCount = 1
|
|
local tentacleMsgCount = 1
|
|
local taintCount = 1
|
|
local breathCount = 1
|
|
|
|
local timers = {
|
|
["Tentacle Strike"] = {35.4, 4.0, 32.0, 0.0, 35.6, 4.0, 31.3, 4.0, 4.0, 27.2, 4.0}, -- furthest data we have
|
|
["Orb of Corrosion"] = {6, 13.0, 13.0, 27.3, 10.7, 13.0, 25.0, 13.0, 13.0, 25.0, 13.0, 18.5, 19.5, 13.0, 13.0, 12.0, 12.0, 16.8, 8.2}, -- furthest data we have
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Localization
|
|
--
|
|
|
|
local L = mod:GetLocale()
|
|
if L then
|
|
L.nearTrigger = "near" -- |TInterface\\Icons\\inv_misc_monsterhorn_03.blp:20|t A %s emerges near Helya!
|
|
L.farTrigger = "far" -- |TInterface\\Icons\\inv_misc_monsterhorn_03.blp:20|t A %s emerges far from Helya!
|
|
L.tentacle_near = "Tentacle NEAR Helya"
|
|
L.tentacle_near_desc = "This option can be used to emphasize or hide the messages when a Striking Tentacle spawns near Helya."
|
|
L.tentacle_near_icon = 228730
|
|
L.tentacle_far = "Tentacle FAR from Helya"
|
|
L.tentacle_far_desc = "This option can be used to emphasize or hide the messages when a Striking Tentacle spawns far from Helya."
|
|
L.tentacle_far_icon = 228730
|
|
|
|
L.orb_melee = "Orb: Melee timer"
|
|
L.orb_melee_desc = "Show the timer for the Orbs that spawn on Melee."
|
|
L.orb_melee_icon = 229119
|
|
L.orb_melee_bar = "Melee Orb"
|
|
|
|
L.orb_ranged = "Orb: Ranged timer"
|
|
L.orb_ranged_desc = "Show the timer for the Orbs that spawn on Ranged."
|
|
L.orb_ranged_icon = 229119
|
|
L.orb_ranged_bar = "Ranged Orb"
|
|
|
|
L.gripping_tentacle = -14309
|
|
L.grimelord = -14263
|
|
L.mariner = -14278
|
|
|
|
L.orb_say = "Orb"
|
|
L.taint_say = "Taint"
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Initialization
|
|
--
|
|
|
|
local orbMarker = mod:AddMarkerOption(false, "player", 1, 229119, 1, 2, 3) -- Orb of Corruption
|
|
local taintMarker = mod:AddMarkerOption(false, "player", 4, 228054, 4, 5, 6, 7, 8) -- Taint of the Sea
|
|
function mod:GetOptions()
|
|
return {
|
|
--[[ Helya ]]--
|
|
"stages",
|
|
"berserk",
|
|
{229119, "SAY", "FLASH"}, -- Orb of Corruption
|
|
"orb_melee",
|
|
"orb_ranged",
|
|
orbMarker,
|
|
227967, -- Bilewater Breath
|
|
227992, -- Bilewater Liquefaction
|
|
{227982, "TANK"}, -- Bilewater Redox
|
|
228730, -- Tentacle Strike
|
|
"tentacle_near",
|
|
"tentacle_far",
|
|
{228054, "SAY"}, -- Taint of the Sea
|
|
taintMarker,
|
|
228872, -- Corrossive Nova
|
|
230197, -- Dark Waters
|
|
|
|
--[[ Stage Two: From the Mists ]]--
|
|
228300, -- Fury of the Maw
|
|
167910, -- Kvaldir Longboat
|
|
|
|
--[[ Grimelord ]]--
|
|
228390, -- Sludge Nova
|
|
{193367, "SAY", "SAY_COUNTDOWN", "FLASH", "PROXIMITY"}, -- Fetid Rot
|
|
228519, -- Anchor Slam
|
|
|
|
--[[ Night Watch Mariner ]]--
|
|
228619, -- Lantern of Darkness
|
|
228633, -- Give No Quarter
|
|
{228611, "TANK"}, -- Ghostly Rage
|
|
|
|
--[[ Decaying Minion ]]--
|
|
228127, -- Decay
|
|
|
|
--[[ Helarjer Mistcaller ]]--
|
|
228854, -- Mist Infusion
|
|
|
|
--[[ Stage Three: Helheim's Last Stand ]]--
|
|
{230267, "SAY", "FLASH"}, -- Orb of Corrosion
|
|
228565, -- Corrupted Breath
|
|
{232488, "TANK"}, -- Dark Hatred
|
|
{232450, "HEALER"}, -- Corrupted Axiom
|
|
},{
|
|
["stages"] = -14213, -- Helya
|
|
[228300] = -14222, -- Stage Two: From the Mists
|
|
[228390] = -14263, -- Grimelord
|
|
[228619] = -14278, -- Night Watch Mariner
|
|
[228127] = -14223, -- Decaying Minion
|
|
[228854] = -14544, -- Helarjer Mistcaller
|
|
[230267] = -14224, -- Stage Three: Helheim's Last Stand
|
|
}
|
|
end
|
|
|
|
function mod:OnBossEnable()
|
|
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1", "boss2", "boss3", "boss4", "boss5")
|
|
self:RegisterEvent("RAID_BOSS_EMOTE")
|
|
self:RegisterEvent("RAID_BOSS_WHISPER")
|
|
|
|
--[[ Helya ]]--
|
|
self:Log("SPELL_CAST_START", "OrbOfCorruption", 227903)
|
|
self:Log("SPELL_AURA_APPLIED", "OrbApplied", 229119)
|
|
self:Log("SPELL_AURA_REMOVED", "OrbRemoved", 229119)
|
|
self:Log("SPELL_DAMAGE", "OrbDamage", 227930)
|
|
self:Log("SPELL_MISSED", "OrbDamage", 227930)
|
|
self:Log("SPELL_AURA_APPLIED", "TaintOfTheSea", 228054)
|
|
self:Log("SPELL_AURA_REMOVED", "TaintOfTheSeaRemoved", 228054)
|
|
self:Log("SPELL_CAST_START", "BilewaterBreath", 227967)
|
|
self:Log("SPELL_AURA_APPLIED", "BilewaterRedox", 227982)
|
|
self:Log("SPELL_CAST_START", "TentacleStrike", 228730)
|
|
self:Log("SPELL_CAST_START", "CorrossiveNova", 228872)
|
|
|
|
self:Log("SPELL_AURA_APPLIED", "DarkWatersDamage", 230197)
|
|
self:Log("SPELL_PERIODIC_DAMAGE", "DarkWatersDamage", 230197)
|
|
self:Log("SPELL_PERIODIC_MISSED", "DarkWatersDamage", 230197)
|
|
|
|
--[[ Stage Two: From the Mists ]]--
|
|
self:Log("SPELL_AURA_APPLIED", "FuryOfTheMaw", 228300)
|
|
self:Log("SPELL_AURA_REMOVED", "FuryOfTheMawRemoved", 228300)
|
|
self:Log("SPELL_AURA_REMOVED", "KvaldirLongboat", 167910) -- Add Spawn
|
|
|
|
--[[ Grimelord ]]--
|
|
self:Log("SPELL_CAST_START", "SludgeNova", 228390)
|
|
self:Log("SPELL_AURA_APPLIED", "FetidRot", 193367)
|
|
self:Log("SPELL_AURA_REMOVED", "FetidRotRemoved", 193367)
|
|
self:Log("SPELL_CAST_START", "AnchorSlam", 228519)
|
|
self:Death("GrimelordDeath", 114709)
|
|
|
|
--[[ Night Watch Mariner ]]--
|
|
self:Log("SPELL_CAST_START", "LanternOfDarkness", 228619)
|
|
self:Log("SPELL_CAST_SUCCESS", "GiveNoQuarter", 228633)
|
|
self:Log("SPELL_CAST_SUCCESS", "GhostlyRage", 228611)
|
|
self:Death("MarinerDeath", 114809)
|
|
|
|
--[[ Decaying Minion ]]--
|
|
self:Log("SPELL_AURA_APPLIED", "DecayDamage", 228127)
|
|
self:Log("SPELL_PERIODIC_DAMAGE", "DecayDamage", 228127)
|
|
self:Log("SPELL_PERIODIC_MISSED", "DecayDamage", 228127)
|
|
|
|
--[[ Helarjer Mistcaller ]]--
|
|
self:Log("SPELL_CAST_START", "MistInfusion", 228854)
|
|
|
|
--[[ Stage Three: Helheim's Last Stand ]]--
|
|
self:Log("SPELL_CAST_START", "OrbOfCorrosion", 228056)
|
|
self:Log("SPELL_AURA_APPLIED", "OrbApplied", 230267)
|
|
self:Log("SPELL_AURA_REMOVED", "OrbRemoved", 230267)
|
|
self:Log("SPELL_DAMAGE", "OrbDamage", 228063)
|
|
self:Log("SPELL_MISSED", "OrbDamage", 228063)
|
|
self:Log("SPELL_CAST_START", "CorruptedBreath", 228565)
|
|
self:Log("SPELL_AURA_APPLIED", "DarkHatred", 232488)
|
|
self:Log("SPELL_AURA_APPLIED", "CorruptedAxiom", 232450)
|
|
end
|
|
|
|
function mod:OnEngage()
|
|
taintMarkerCount = 4
|
|
tentaclesUp = self:Mythic() and 8 or 9
|
|
phase = 1
|
|
orbCount = 1
|
|
tentacleCount = 1
|
|
tentacleMsgCount = 1
|
|
taintCount = 1
|
|
breathCount = 1
|
|
|
|
self:CDBar(227967, self:Mythic() and 10.5 or self:Heroic() and 12 or 13.3, CL.count:format(self:SpellName(227967), breathCount)) -- Bilewater Breath
|
|
self:CDBar(228054, self:Mythic() and 15.5 or self:Heroic() and 19.5 or self:Normal() and 12 or 21.8, CL.count:format(self:SpellName(228054), taintCount)) -- Taint of the Sea
|
|
self:CDBar("orb_ranged", self:Mythic() and 14 or self:Heroic() and 31 or self:Normal() and 18 or 34, CL.count:format(L.orb_ranged_bar, orbCount), 229119) -- Orb of Corruption
|
|
if not self:LFR() then
|
|
self:CDBar(228730, self:Mythic() and 35.3 or self:Heroic() and 36.7 or 53.3, CL.count:format(self:SpellName(228730), tentacleCount)) -- Tentacle Strike
|
|
end
|
|
if self:Mythic() then
|
|
self:Berserk(660)
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Event Handlers
|
|
--
|
|
|
|
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
|
|
if spellId == 34098 then -- ClearAllDebuffs
|
|
phase = 2
|
|
self:MessageOld("stages", "cyan", "long", CL.stage:format(2), false)
|
|
self:StopBar(CL.count:format(L.orb_ranged_bar, orbCount))
|
|
self:StopBar(CL.count:format(L.orb_melee_bar, orbCount))
|
|
self:StopBar(CL.count:format(self:SpellName(228054), taintCount)) -- Taint of the Sea
|
|
self:StopBar(CL.count:format(self:SpellName(227967), breathCount)) -- Bilewater Breath
|
|
if not self:LFR() then
|
|
self:StopBar(CL.count:format(self:SpellName(228730), tentacleCount)) -- Tentacle Strike
|
|
end
|
|
self:Bar(167910, 14, CL.adds) -- Kvaldir Longboat
|
|
self:Bar(228300, self:Mythic() and 11 or 50) -- Fury of the Maw
|
|
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss1")
|
|
elseif spellId == 228546 then -- Helya
|
|
self:UnregisterUnitEvent("UNIT_HEALTH", "boss1")
|
|
phase = 3
|
|
orbCount = 1
|
|
breathCount = 1
|
|
self:MessageOld("stages", "cyan", "long", CL.stage:format(3), false)
|
|
self:StopBar(228300) -- Fury of the Maw
|
|
self:StopBar(CL.cast:format(self:SpellName(228300))) -- Cast: Fury of the Maw
|
|
self:StopBar(CL.adds)
|
|
self:Bar("orb_ranged", self:Mythic() and 6 or 15.5, CL.count:format(L.orb_ranged_bar, orbCount), 230267) -- Orb of Corrosion
|
|
self:Bar(228565, self:Mythic() and 10 or 19.5) -- Corrupted Breath
|
|
if not self:Mythic() then -- Taint comes instant in mythic, no need for timer.
|
|
self:Bar(228054, 24.5) -- Taint of the Sea
|
|
end
|
|
self:Bar(167910, self:Mythic() and 44 or 38, self:SpellName(L.mariner)) -- Kvaldir Longboat
|
|
elseif spellId == 228838 then -- Fetid Rot (Grimelord)
|
|
self:Bar(193367, self:Easy() and 15.8 or 12.2) -- Fetid Rot
|
|
end
|
|
end
|
|
|
|
function mod:RAID_BOSS_EMOTE(event, msg, npcname)
|
|
if msg:find(L.nearTrigger) then
|
|
self:MessageOld("tentacle_near", "orange", "long", CL.count:format(L.tentacle_near, tentacleMsgCount), 228730)
|
|
tentacleMsgCount = tentacleMsgCount + 1
|
|
elseif msg:find(L.farTrigger) then
|
|
self:MessageOld("tentacle_far", "orange", "long", CL.count:format(L.tentacle_far, tentacleMsgCount), 228730)
|
|
tentacleMsgCount = tentacleMsgCount + 1
|
|
elseif msg:find("inv_misc_monsterhorn_03", nil, true) then -- Fallback for no locale
|
|
msg = msg:gsub("|T[^|]+|t", "")
|
|
self:MessageOld(228730, "orange", "long", CL.count:format(msg:format(npcname), tentacleMsgCount), 228730)
|
|
tentacleMsgCount = tentacleMsgCount + 1
|
|
BigWigs:Print("Missing translation for tentacle strike. Please report it on Discord/Curse/GitHub.") -- XXX temp
|
|
BigWigs:Error(("TELL THE AUTHORS: %s"):format(msg))
|
|
end
|
|
end
|
|
|
|
function mod:RAID_BOSS_WHISPER(event, msg)
|
|
if msg:find("227920") then -- P1 Orb of Corruption
|
|
self:MessageOld(229119, "blue", "warning", CL.you:format(self:SpellName(229119))) -- Orb of Corruption
|
|
self:Say(229119, L.orb_say)
|
|
self:Flash(229119)
|
|
elseif msg:find("228058") then -- P2 Orb of Corrosion
|
|
self:MessageOld(230267, "blue", "warning", CL.you:format(self:SpellName(230267))) -- Orb of Corrosion
|
|
self:Say(230267, L.orb_say)
|
|
self:Flash(230267)
|
|
end
|
|
end
|
|
|
|
function mod:UNIT_HEALTH(event, unit)
|
|
local hp = UnitHealth(unit) / UnitHealthMax(unit)*100
|
|
if phase == 2 then
|
|
local tentaclesLeft = self:Mythic() and floor((hp-45)/2.5) or floor((hp-40)/2.77)
|
|
if tentaclesLeft < tentaclesUp then
|
|
tentaclesUp = tentaclesLeft
|
|
if tentaclesLeft >= 0 then
|
|
self:MessageOld("stages", "cyan", nil, CL.mob_remaining:format(self:SpellName(L.gripping_tentacle), tentaclesLeft), false)
|
|
else
|
|
self:UnregisterUnitEvent(event, unit)
|
|
end
|
|
end
|
|
else
|
|
self:UnregisterUnitEvent(event, unit)
|
|
end
|
|
end
|
|
|
|
do
|
|
local list, orbMarked, isOnMe, timer = mod:NewTargetList(), false, false, nil
|
|
|
|
local function warn(self, spellId, spellName)
|
|
if not isOnMe then
|
|
self:TargetMessageOld(spellId, list, "orange", "warning", CL.count:format(spellName, orbCount - 1)) -- gets incremented on the cast
|
|
else
|
|
list = self:NewTargetList()
|
|
end
|
|
end
|
|
|
|
function mod:OrbApplied(args)
|
|
list[#list+1] = args.destName
|
|
if #list == 1 then
|
|
orbMarked, isOnMe = false, false
|
|
timer = self:ScheduleTimer(warn, 0.4, self, args.spellId, args.spellName)
|
|
elseif #list == 3 or (#list == 2 and self:Easy()) then -- Max
|
|
self:CancelTimer(timer)
|
|
timer = nil
|
|
warn(self, args.spellId, args.spellName)
|
|
end
|
|
|
|
if self:GetOption(orbMarker) then
|
|
if self:Healer(args.destName) then
|
|
self:CustomIcon(false, args.destName, 1)
|
|
elseif self:Tank(args.destName) or (phase == 3 and orbMarked) then
|
|
self:CustomIcon(false, args.destName, 2)
|
|
else -- Damager
|
|
orbMarked = true
|
|
self:CustomIcon(false, args.destName, 3)
|
|
end
|
|
end
|
|
|
|
if self:Me(args.destGUID) then -- Warning and Say are in RAID_BOSS_WHISPER
|
|
isOnMe = true
|
|
end
|
|
end
|
|
|
|
function mod:OrbRemoved(args)
|
|
if self:GetOption(orbMarker) then
|
|
self:CustomIcon(false, args.destName)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:OrbOfCorruption()
|
|
orbCount = orbCount + 1
|
|
local timer = self:Mythic() and 24.3 or self:Heroic() and 28 or self:Normal() and 31.5 or 32.8
|
|
if orbCount % 2 == 0 then
|
|
self:Bar("orb_melee", timer, CL.count:format(L.orb_melee_bar, orbCount), 229119) -- Orb of Corruption
|
|
else
|
|
self:Bar("orb_ranged", timer, CL.count:format(L.orb_ranged_bar, orbCount), 229119) -- Orb of Corruption
|
|
end
|
|
end
|
|
|
|
do
|
|
local prev = 0
|
|
function mod:OrbDamage(args)
|
|
local t = GetTime()
|
|
if self:Me(args.destGUID) and t-prev > 2 then
|
|
prev = t
|
|
self:MessageOld(args.spellId == 228063 and 230267 or 229119, "blue", "alarm", CL.underyou:format(args.spellName))
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:BilewaterBreath(args)
|
|
self:MessageOld(args.spellId, "red", "alarm", CL.count:format(args.spellName, breathCount))
|
|
self:CastBar(args.spellId, 3, CL.count:format(args.spellName, breathCount))
|
|
self:CastBar(227992, self:Easy() and 25.5 or 20.5) -- Bilewater Liquefaction
|
|
breathCount = breathCount + 1
|
|
self:CDBar(args.spellId, self:Mythic() and 42.5 or self:Heroic() and 52 or self:Normal() and 55.9 or 60.8, CL.count:format(args.spellName, breathCount))
|
|
end
|
|
|
|
function mod:BilewaterRedox(args)
|
|
if self:Tank(args.destName) then -- others might get hit, only tank is relevant
|
|
self:TargetMessageOld(args.spellId, args.destName, "orange", not self:Me(args.destGUID) and "alarm", nil, nil, true)
|
|
self:TargetBar(args.spellId, 30, args.destName)
|
|
end
|
|
end
|
|
|
|
do
|
|
local list, timer = mod:NewTargetList(), nil
|
|
function mod:TaintOfTheSea(args)
|
|
list[#list+1] = args.destName
|
|
if #list == 1 then
|
|
taintMarkerCount = 4
|
|
timer = self:ScheduleTimer("TargetMessageOld", 0.4, args.spellId, list, "yellow", "alert", CL.count:format(args.spellName, taintCount), nil, self:Dispeller("magic"))
|
|
taintCount = taintCount + 1
|
|
self:CDBar(args.spellId, phase == 1 and (self:LFR() and 17 or 12.1) or (self:Mythic() and 20 or 28), CL.count:format(args.spellName, taintCount))
|
|
elseif #list == 5 or (#list == 3 and not self:Mythic()) then
|
|
self:CancelTimer(timer)
|
|
timer = nil
|
|
self:TargetMessageOld(args.spellId, list, "yellow", "alert", CL.count:format(args.spellName, taintCount-1), nil, self:Dispeller("magic"))
|
|
end
|
|
|
|
if self:GetOption(taintMarker) then
|
|
self:CustomIcon(false, args.destName, taintMarkerCount)
|
|
taintMarkerCount = taintMarkerCount + 1
|
|
if taintMarkerCount > 8 then taintMarkerCount = 4 end
|
|
end
|
|
end
|
|
|
|
local prev, wasOnMe, scheduled = 0, nil, nil
|
|
|
|
local function warn(self, spellId, spellName)
|
|
self:MessageOld(spellId, "green", "warning", wasOnMe and CL.underyou:format(spellName) or CL.near:format(spellName))
|
|
wasOnMe = nil
|
|
scheduled = nil
|
|
end
|
|
|
|
function mod:TaintOfTheSeaRemoved(args)
|
|
local t = GetTime()
|
|
if self:Me(args.destGUID) then -- warn always if it got dispelled from us
|
|
prev = t
|
|
wasOnMe = true
|
|
self:Say(args.spellId, L.taint_say)
|
|
if not scheduled then
|
|
scheduled = self:ScheduleTimer(warn, 0.1, self, args.spellId, args.spellName)
|
|
end
|
|
elseif IsItemInRange(33278, args.destName) and t-prev > 2 then -- warn if dispelled in ~8yd range
|
|
prev = t
|
|
if not scheduled then
|
|
scheduled = self:ScheduleTimer(warn, 0.1, self, args.spellId, args.spellName)
|
|
end
|
|
end
|
|
if self:GetOption(taintMarker) then
|
|
self:CustomIcon(false, args.destName)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:TentacleStrike(args)
|
|
-- Message is in RAID_BOSS_EMOTE
|
|
self:CastBar(args.spellId, 6,CL.count:format(args.spellName, tentacleCount))
|
|
tentacleCount = tentacleCount + 1
|
|
self:Bar(args.spellId, self:Mythic() and timers["Tentacle Strike"][tentacleCount] or 40, CL.count:format(self:SpellName(228730), tentacleCount))
|
|
end
|
|
|
|
do
|
|
local prev = 0
|
|
function mod:CorrossiveNova(args)
|
|
local t = GetTime()
|
|
if t-prev > 3 then
|
|
prev = t
|
|
self:MessageOld(args.spellId, "red", self:Tank() and "long")
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local prev = 0
|
|
function mod:DarkWatersDamage(args)
|
|
local t = GetTime()
|
|
if self:Me(args.destGUID) and t-prev > 2 then
|
|
prev = t
|
|
self:MessageOld(args.spellId, "blue", "alarm", CL.underyou:format(args.spellName))
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:FuryOfTheMaw(args)
|
|
self:MessageOld(args.spellId, "red", "info")
|
|
self:CastBar(args.spellId, self:Mythic() and 24 or 32)
|
|
end
|
|
|
|
function mod:FuryOfTheMawRemoved(args)
|
|
self:MessageOld(args.spellId, "red", nil, CL.over:format(args.spellName))
|
|
self:Bar(args.spellId, 44.5)
|
|
end
|
|
|
|
do
|
|
local prev = 0
|
|
|
|
function mod:KvaldirLongboat(args)
|
|
local t = GetTime()
|
|
if t-prev > 1 then
|
|
prev = t
|
|
self:MessageOld(args.spellId, "cyan", "long", phase == 2 and CL.adds or args.destName) -- destName = name of the spawning add
|
|
end
|
|
|
|
if phase == 2 then
|
|
self:Bar(args.spellId, 75, CL.adds)
|
|
else
|
|
self:Bar(args.spellId, 71.5, self:SpellName(L.mariner))
|
|
end
|
|
|
|
if self:MobId(args.destGUID) == 114809 then -- Mariner
|
|
self:Bar(228633, 7) -- Give No Quarter
|
|
self:Bar(228611, 10) -- Ghostly Rage
|
|
if not self:Easy() then
|
|
self:Bar(228619, phase == 2 and 30 or 35) -- Lantern of Darkness
|
|
end
|
|
elseif self:MobId(args.destGUID) == 114709 then -- Grimelord
|
|
self:Bar(193367, 7) -- Fetid Rot
|
|
if not self:LFR() then
|
|
self:Bar(228519, 12) -- Anchor Slam
|
|
end
|
|
self:Bar(228390, self:Easy() and 17 or 14) -- Sludge Nova
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[ Grimelord ]]--
|
|
function mod:SludgeNova(args)
|
|
self:MessageOld(args.spellId, "yellow", "alert", CL.casting:format(args.spellName))
|
|
self:CastBar(args.spellId, 3)
|
|
self:Bar(args.spellId, 24.3)
|
|
end
|
|
|
|
do
|
|
local proxList, isOnMe = {}, nil
|
|
|
|
function mod:FetidRot(args)
|
|
if self:Me(args.destGUID) then
|
|
isOnMe = true
|
|
self:TargetMessageOld(args.spellId, args.destName, "blue", "warning")
|
|
self:Flash(args.spellId)
|
|
self:Say(args.spellId)
|
|
local _, _, _, expires = self:UnitDebuff("player", args.spellName, 193367) -- 193367 on LFR
|
|
local t = expires - GetTime()
|
|
self:TargetBar(args.spellId, t, args.destName)
|
|
self:SayCountdown(args.spellId, t)
|
|
self:OpenProximity(args.spellId, 5)
|
|
end
|
|
|
|
proxList[#proxList+1] = args.destName
|
|
if not isOnMe then
|
|
self:OpenProximity(args.spellId, 5, proxList)
|
|
end
|
|
end
|
|
|
|
function mod:FetidRotRemoved(args)
|
|
if self:Me(args.destGUID) then
|
|
isOnMe = nil
|
|
self:StopBar(args.spellName, args.destName)
|
|
self:CloseProximity(args.spellId)
|
|
self:CancelSayCountdown(args.spellId)
|
|
end
|
|
|
|
tDeleteItem(proxList, args.destName)
|
|
|
|
if not isOnMe then -- Don't change proximity if it's on you and expired on someone else
|
|
if #proxList == 0 then
|
|
self:CloseProximity(args.spellId)
|
|
else
|
|
self:OpenProximity(args.spellId, 5, proxList)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:AnchorSlam(args)
|
|
self:MessageOld(args.spellId, "orange", "alarm", CL.casting:format(args.spellName))
|
|
self:Bar(args.spellId, self:Normal() and 14.6 or 12)
|
|
end
|
|
|
|
function mod:GrimelordDeath()
|
|
if not self:LFR() then
|
|
self:StopBar(228519) -- Anchor Slam
|
|
end
|
|
self:StopBar(228390) -- Sludge Nova
|
|
self:StopBar(CL.cast:format(self:SpellName(228390))) -- Sludge Nova
|
|
self:StopBar(193367) -- Fetid Rot
|
|
end
|
|
|
|
--[[ Night Watch Mariner ]]--
|
|
function mod:LanternOfDarkness(args)
|
|
self:MessageOld(args.spellId, "red", "long")
|
|
self:CastBar(args.spellId, 7)
|
|
end
|
|
|
|
function mod:GiveNoQuarter(args)
|
|
self:MessageOld(args.spellId, "yellow", self:Ranged() and "alert")
|
|
self:Bar(args.spellId, self:Easy() and 9.3 or 6.1)
|
|
end
|
|
|
|
function mod:GhostlyRage(args)
|
|
local unit = self:GetUnitIdByGUID(args.sourceGUID)
|
|
if unit and self:Tanking(unit) then
|
|
self:MessageOld(args.spellId, "orange", "long", CL.on:format(args.spellName, args.sourceName))
|
|
end
|
|
self:Bar(args.spellId, 9.7)
|
|
end
|
|
|
|
function mod:MarinerDeath()
|
|
self:StopBar(228633) -- Give No Quarter
|
|
if not self:Easy() then
|
|
self:StopBar(228619) -- Lantern of Darkness
|
|
self:StopBar(CL.cast:format(self:SpellName(228619))) -- Lantern of Darkness
|
|
end
|
|
self:StopBar(228611) -- Ghostly Rage
|
|
end
|
|
|
|
--[[ Decaying Minion ]]--
|
|
do
|
|
local prev = 0
|
|
function mod:DecayDamage(args)
|
|
local t = GetTime()
|
|
if self:Me(args.destGUID) and t-prev > 3 then
|
|
prev = t
|
|
self:MessageOld(args.spellId, "blue", "alert", CL.underyou:format(args.spellName))
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[ Helarjer Mistcaller ]]--
|
|
do
|
|
local prev = 0
|
|
function mod:MistInfusion(args)
|
|
local t = GetTime()
|
|
if t-prev > 1 then
|
|
prev = t
|
|
self:MessageOld(args.spellId, "green", self:Interrupter(args.sourceGUID) and "info")
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[ Stage Three: Helheim's Last Stand ]]--
|
|
|
|
function mod:OrbOfCorrosion()
|
|
orbCount = orbCount + 1
|
|
if orbCount % 2 == 0 then
|
|
self:Bar("orb_melee", self:Mythic() and timers["Orb of Corrosion"][orbCount] or 18, CL.count:format(L.orb_melee_bar, orbCount), 230267) -- Orb of Corruption
|
|
else
|
|
self:Bar("orb_ranged", self:Mythic() and timers["Orb of Corrosion"][orbCount] or 18, CL.count:format(L.orb_ranged_bar, orbCount), 230267) -- Orb of Corruption
|
|
end
|
|
end
|
|
|
|
function mod:CorruptedBreath(args)
|
|
self:MessageOld(args.spellId, "red", "alarm", CL.count:format(args.spellName, breathCount))
|
|
self:CastBar(args.spellId, 4.5, CL.count:format(args.spellName, breathCount))
|
|
breathCount = breathCount + 1
|
|
self:Bar(args.spellId, self:Mythic() and 43 or self:Heroic() and 47 or 51, CL.count:format(args.spellName, breathCount))
|
|
end
|
|
|
|
function mod:DarkHatred(args)
|
|
if self:Tank(args.destName) then -- others might get hit, only tank is relevant
|
|
self:TargetMessageOld(args.spellId, args.destName, "orange", not self:Me(args.destGUID) and "alarm", nil, nil, true)
|
|
self:TargetBar(args.spellId, 12, args.destName)
|
|
end
|
|
end
|
|
|
|
do
|
|
local list, isOnMe = mod:NewTargetList(), nil
|
|
|
|
local function warn(self, spellId)
|
|
if not isOnMe then
|
|
if #list < 6 then -- If the pools don't get soaked, everyone gets a debuff
|
|
self:TargetMessageOld(spellId, list, "yellow", "long", nil, nil, true)
|
|
else
|
|
self:MessageOld(spellId, "yellow", "long")
|
|
end
|
|
end
|
|
isOnMe = nil
|
|
end
|
|
|
|
function mod:CorruptedAxiom(args)
|
|
list[#list+1] = args.destName
|
|
if #list == 1 then
|
|
self:ScheduleTimer(warn, 0.1, self, args.spellId)
|
|
end
|
|
|
|
if self:Me(args.destGUID) then
|
|
self:TargetMessageOld(args.spellId, args.destName, "blue", "long")
|
|
isOnMe = true
|
|
end
|
|
end
|
|
end
|
|
|