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.
336 lines
12 KiB
336 lines
12 KiB
|
5 years ago
|
--------------------------------------------------------------------------------
|
||
|
|
-- Module Declaration
|
||
|
|
--
|
||
|
|
|
||
|
|
local mod, CL = BigWigs:NewBoss("Hungering Destroyer", 2296, 2428)
|
||
|
|
if not mod then return end
|
||
|
|
mod:RegisterEnableMob(164261) -- Hungering Destroyer
|
||
|
|
mod:SetEncounterID(2383)
|
||
|
|
mod:SetRespawnTime(30)
|
||
|
|
|
||
|
|
--------------------------------------------------------------------------------
|
||
|
|
-- Locals
|
||
|
|
--
|
||
|
|
|
||
|
|
local miasmaCount = 1
|
||
|
|
local volatileCount = 1
|
||
|
|
local consumeCount = 1
|
||
|
|
local expungeCount = 1
|
||
|
|
local desolateCount = 1
|
||
|
|
local overwhelmCount = 1
|
||
|
|
local miasmaPlayerList = {}
|
||
|
|
local volEjectionList = {}
|
||
|
|
local scheduledChatMsg = false
|
||
|
|
local volEjectionOnMe = false
|
||
|
|
local miasmaOnMe = false
|
||
|
|
|
||
|
|
--------------------------------------------------------------------------------
|
||
|
|
-- Localization
|
||
|
|
--
|
||
|
|
|
||
|
|
local L = mod:GetLocale()
|
||
|
|
if L then
|
||
|
|
L.miasma = "Miasma" -- Short for Gluttonous Miasma
|
||
|
|
|
||
|
|
L.custom_on_repeating_yell_miasma = "Repeating Miasma Health Yell"
|
||
|
|
L.custom_on_repeating_yell_miasma_desc = "Repeating yell messages for Gluttonous Miasma to let others know when you are below 75% health."
|
||
|
|
|
||
|
|
L.custom_on_repeating_say_laser = "Repeating Volatile Ejection Say"
|
||
|
|
L.custom_on_repeating_say_laser_desc = "Repeating say messages for Volatile Ejection to help when moving into chat range of players that didn't see your first message."
|
||
|
|
|
||
|
|
L.currentHealth = "%d%%"
|
||
|
|
L.currentHealthIcon = "{rt%d}%d%%"
|
||
|
|
end
|
||
|
|
|
||
|
|
--------------------------------------------------------------------------------
|
||
|
|
-- Initialization
|
||
|
|
--
|
||
|
|
|
||
|
|
local gluttonousMiasmaMarker = mod:AddMarkerOption(false, "player", 1, 329298, 1, 2, 3, 4) -- Gluttonous Miasma
|
||
|
|
local volatileEjectionMarker = mod:AddMarkerOption(false, "player", 5, 334266, 5, 6, 7, 8) -- Volatile Ejection
|
||
|
|
function mod:GetOptions()
|
||
|
|
return {
|
||
|
|
"berserk",
|
||
|
|
{329298, "SAY"}, -- Gluttonous Miasma
|
||
|
|
"custom_on_repeating_yell_miasma",
|
||
|
|
gluttonousMiasmaMarker,
|
||
|
|
{334522, "EMPHASIZE"}, -- Consume
|
||
|
|
329725, -- Expunge
|
||
|
|
{334266, "SAY", "FLASH", "ME_ONLY_EMPHASIZE"}, -- Volatile Ejection
|
||
|
|
"custom_on_repeating_say_laser",
|
||
|
|
volatileEjectionMarker,
|
||
|
|
329455, -- Desolate
|
||
|
|
{329774, "TANK"}, -- Overwhelm
|
||
|
|
{332295, "TANK"}, -- Growing Hunger
|
||
|
|
}, nil, {
|
||
|
|
[329298] = L.miasma, -- Gluttonous Miasma (Miasma)
|
||
|
|
[334266] = CL.beam, -- Volatile Ejection (Beam)
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:OnBossEnable()
|
||
|
|
self:Log("SPELL_AURA_APPLIED", "GluttonousMiasmaApplied", 329298)
|
||
|
|
self:Log("SPELL_AURA_REMOVED", "GluttonousMiasmaRemoved", 329298)
|
||
|
|
self:Log("SPELL_CAST_START", "Consume", 334522)
|
||
|
|
self:Log("SPELL_CAST_SUCCESS", "ConsumeSuccess", 334522)
|
||
|
|
self:Log("SPELL_AURA_APPLIED", "ExpungeApplied", 329725)
|
||
|
|
self:Log("SPELL_AURA_APPLIED", "VolatileEjectionApplied", 338614, 334064) -- LFR, everything else
|
||
|
|
self:Log("SPELL_AURA_REMOVED", "VolatileEjectionRemoved", 338614, 334064)
|
||
|
|
self:Log("SPELL_CAST_START", "VolatileEjection", 334266)
|
||
|
|
self:Log("SPELL_CAST_SUCCESS", "VolatileEjectionSuccess", 334266)
|
||
|
|
self:Log("SPELL_CAST_START", "Desolate", 329455)
|
||
|
|
self:Log("SPELL_CAST_START", "Overwhelm", 329774)
|
||
|
|
self:Log("SPELL_AURA_APPLIED", "GrowingHungerApplied", 332295)
|
||
|
|
self:Log("SPELL_AURA_APPLIED_DOSE", "GrowingHungerApplied", 332295)
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:OnEngage()
|
||
|
|
miasmaCount = 1
|
||
|
|
volatileCount = 1
|
||
|
|
consumeCount = 1
|
||
|
|
expungeCount = 1
|
||
|
|
desolateCount = 1
|
||
|
|
overwhelmCount = 1
|
||
|
|
scheduledChatMsg = false
|
||
|
|
volEjectionOnMe = false
|
||
|
|
miasmaOnMe = false
|
||
|
|
volEjectionList = {}
|
||
|
|
|
||
|
|
self:Bar(329298, 3, CL.count:format(L.miasma, miasmaCount)) -- Gluttonous Miasma
|
||
|
|
if self:LFR() then
|
||
|
|
self:Bar(329774, 5.6) -- Overwhelm
|
||
|
|
self:Bar(334266, 11.1, CL.count:format(CL.beam, volatileCount)) -- Volatile Ejection
|
||
|
|
self:Bar(329455, 24.5, CL.count:format(self:SpellName(329455), desolateCount)) -- Desolate
|
||
|
|
self:Bar(329725, 35.6, CL.count:format(self:SpellName(329725), expungeCount)) -- Expunge
|
||
|
|
self:Bar(334522, 102.9, CL.count:format(self:SpellName(334522), consumeCount)) -- Consume
|
||
|
|
elseif self:Normal() then
|
||
|
|
self:Bar(329774, 5.3) -- Overwhelm
|
||
|
|
self:Bar(334266, 10.6, CL.count:format(CL.beam, volatileCount)) -- Volatile Ejection
|
||
|
|
self:Bar(329455, 23.2, CL.count:format(self:SpellName(329455), desolateCount)) -- Desolate
|
||
|
|
self:Bar(329725, 35.7, CL.count:format(self:SpellName(329725), expungeCount)) -- Expunge
|
||
|
|
self:Bar(334522, 93.7, CL.count:format(self:SpellName(334522), consumeCount)) -- Consume
|
||
|
|
else
|
||
|
|
self:Bar(329774, 5) -- Overwhelm
|
||
|
|
self:Bar(334266, 10, CL.count:format(CL.beam, volatileCount)) -- Volatile Ejection
|
||
|
|
self:Bar(329455, 22, CL.count:format(self:SpellName(329455), desolateCount)) -- Desolate
|
||
|
|
self:Bar(329725, 32, CL.count:format(self:SpellName(329725), expungeCount)) -- Expunge
|
||
|
|
self:Bar(334522, 89, CL.count:format(self:SpellName(334522), consumeCount)) -- Consume
|
||
|
|
end
|
||
|
|
|
||
|
|
if self:Mythic() then
|
||
|
|
self:Berserk(420)
|
||
|
|
else
|
||
|
|
self:Berserk(600)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:OnBossDisable()
|
||
|
|
volEjectionOnMe = false -- Compensate for the boss dieing mid cast
|
||
|
|
miasmaOnMe = false
|
||
|
|
|
||
|
|
if self:GetOption(gluttonousMiasmaMarker) then
|
||
|
|
for i = 1, #miasmaPlayerList do
|
||
|
|
local name = miasmaPlayerList[i]
|
||
|
|
-- Clearing marks on _REMOVED doesn't work great on this boss
|
||
|
|
-- The second set of marks is applied before the first is removed
|
||
|
|
-- When trying to remove the first set of marks it can clear the second set
|
||
|
|
self:CustomIcon(false, name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
miasmaPlayerList = {}
|
||
|
|
|
||
|
|
-- Compensate for the boss dieing mid cast
|
||
|
|
if self:GetOption(volatileEjectionMarker) then
|
||
|
|
for i = 1, #volEjectionList do
|
||
|
|
local name = volEjectionList[i]
|
||
|
|
self:CustomIcon(false, name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
volEjectionList = {}
|
||
|
|
end
|
||
|
|
|
||
|
|
--------------------------------------------------------------------------------
|
||
|
|
-- Event Handlers
|
||
|
|
--
|
||
|
|
|
||
|
|
local function RepeatingChatMessages()
|
||
|
|
local duration = 1.5
|
||
|
|
if volEjectionOnMe and mod:GetOption("custom_on_repeating_say_laser") then
|
||
|
|
mod:Say(false, CL.beam)
|
||
|
|
elseif miasmaOnMe and mod:GetOption("custom_on_repeating_yell_miasma") then -- Repeat Health instead
|
||
|
|
local currentHealthPercent = math.floor(mod:GetHealth("player"))
|
||
|
|
if currentHealthPercent < 75 then -- Only let players know when you are below 75%
|
||
|
|
local myIcon = GetRaidTargetIndex("player")
|
||
|
|
local msg = myIcon and L.currentHealthIcon:format(myIcon, currentHealthPercent) or L.currentHealth:format(currentHealthPercent)
|
||
|
|
mod:Yell(false, msg, true)
|
||
|
|
end
|
||
|
|
if not mod:Mythic() then
|
||
|
|
duration = 2 -- Slower on non-mythic
|
||
|
|
end
|
||
|
|
else
|
||
|
|
scheduledChatMsg = false
|
||
|
|
return -- Nothing had to be repeated, stop repeating
|
||
|
|
end
|
||
|
|
mod:SimpleTimer(RepeatingChatMessages, duration)
|
||
|
|
end
|
||
|
|
|
||
|
|
do
|
||
|
|
local prev = 0
|
||
|
|
function mod:GluttonousMiasmaApplied(args)
|
||
|
|
if self:MobId(args.sourceGUID) == 164261 then -- Boss only, filter trash
|
||
|
|
local t = args.time
|
||
|
|
if t-prev > 3 then
|
||
|
|
prev = t
|
||
|
|
miasmaPlayerList = {}
|
||
|
|
miasmaCount = miasmaCount + 1
|
||
|
|
self:Bar(args.spellId, 24, CL.count:format(L.miasma, miasmaCount))
|
||
|
|
end
|
||
|
|
|
||
|
|
local count = #miasmaPlayerList+1
|
||
|
|
miasmaPlayerList[count] = args.destName
|
||
|
|
miasmaPlayerList[args.destName] = count -- Set raid marker
|
||
|
|
if self:Me(args.destGUID) then
|
||
|
|
miasmaOnMe = true
|
||
|
|
self:PlaySound(args.spellId, "alarm")
|
||
|
|
if not self:LFR() then
|
||
|
|
self:Yell(args.spellId, CL.count_rticon:format(L.miasma, count, count))
|
||
|
|
if not scheduledChatMsg and self:GetOption("custom_on_repeating_yell_miasma") then
|
||
|
|
scheduledChatMsg = true
|
||
|
|
self:SimpleTimer(RepeatingChatMessages, 2)
|
||
|
|
end
|
||
|
|
else
|
||
|
|
self:Yell(args.spellId, L.miasma)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
self:CustomIcon(gluttonousMiasmaMarker, args.destName, count)
|
||
|
|
self:NewTargetsMessage(args.spellId, "yellow", miasmaPlayerList, nil, CL.count:format(L.miasma, miasmaCount-1))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:GluttonousMiasmaRemoved(args)
|
||
|
|
if self:Me(args.destGUID) then
|
||
|
|
miasmaOnMe = false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:Consume(args)
|
||
|
|
self:Message(args.spellId, "orange", CL.count:format(args.spellName, consumeCount))
|
||
|
|
self:PlaySound(args.spellId, "long")
|
||
|
|
self:CastBar(args.spellId, 4, CL.count:format(args.spellName, consumeCount)) -- 4s Cast
|
||
|
|
consumeCount = consumeCount + 1
|
||
|
|
if self:LFR() then
|
||
|
|
self:Bar(args.spellId, 106, CL.count:format(args.spellName, consumeCount))
|
||
|
|
elseif self:Normal() then
|
||
|
|
self:Bar(args.spellId, 101, CL.count:format(args.spellName, consumeCount))
|
||
|
|
else
|
||
|
|
self:Bar(args.spellId, 96, CL.count:format(args.spellName, consumeCount))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:ConsumeSuccess(args)
|
||
|
|
self:CastBar(args.spellId, 6, CL.count:format(args.spellName, consumeCount-1)) -- 6s Channel
|
||
|
|
end
|
||
|
|
|
||
|
|
do
|
||
|
|
local prev = 0
|
||
|
|
function mod:ExpungeApplied(args)
|
||
|
|
local t = args.time
|
||
|
|
if t-prev > 5 then
|
||
|
|
prev = t
|
||
|
|
self:Message(args.spellId, "orange", CL.count:format(args.spellName, expungeCount)) -- Expunge
|
||
|
|
self:PlaySound(args.spellId, "warning")
|
||
|
|
self:CastBar(args.spellId, 5, CL.count:format(args.spellName, expungeCount)) -- Expunge
|
||
|
|
expungeCount = expungeCount + 1
|
||
|
|
if self:LFR() then
|
||
|
|
self:Bar(args.spellId, expungeCount % 2 == 0 and 40 or 66.7, CL.count:format(args.spellName, expungeCount))
|
||
|
|
elseif self:Normal() then
|
||
|
|
self:Bar(args.spellId, expungeCount % 2 == 0 and 37.8 or 63, CL.count:format(args.spellName, expungeCount))
|
||
|
|
else
|
||
|
|
self:Bar(args.spellId, expungeCount % 2 == 0 and 36 or 60, CL.count:format(args.spellName, expungeCount))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
do
|
||
|
|
function mod:VolatileEjectionApplied(args)
|
||
|
|
local count = #volEjectionList+1
|
||
|
|
volEjectionList[count] = args.destName
|
||
|
|
self:NewTargetsMessage(334266, "orange", volEjectionList, self:Mythic() and 4 or 3, CL.beam)
|
||
|
|
self:CustomIcon(volatileEjectionMarker, args.destName, count+4)
|
||
|
|
if self:Me(args.destGUID) then
|
||
|
|
self:PlaySound(334266, "warning")
|
||
|
|
self:Flash(334266)
|
||
|
|
self:Say(334266, CL.beam)
|
||
|
|
volEjectionOnMe = true
|
||
|
|
if not scheduledChatMsg and not self:LFR() and self:GetOption("custom_on_repeating_say_laser") then
|
||
|
|
scheduledChatMsg = true
|
||
|
|
self:SimpleTimer(RepeatingChatMessages, 1.5)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:VolatileEjectionRemoved(args)
|
||
|
|
if self:Me(args.destGUID) then
|
||
|
|
volEjectionOnMe = false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:VolatileEjection()
|
||
|
|
volatileCount = volatileCount + 1
|
||
|
|
if self:LFR() then
|
||
|
|
self:Bar(334266, volatileCount % 3 == 1 and 27.8 or volatileCount % 3 == 2 and 40 or 38.9, CL.count:format(CL.beam, volatileCount))
|
||
|
|
elseif self:Normal() then
|
||
|
|
self:Bar(334266, volatileCount % 3 == 1 and 25.3 or 37.9, CL.count:format(CL.beam, volatileCount))
|
||
|
|
else
|
||
|
|
self:Bar(334266, volatileCount % 3 == 1 and 24 or 36, CL.count:format(CL.beam, volatileCount))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:VolatileEjectionSuccess()
|
||
|
|
if self:GetOption(volatileEjectionMarker) then
|
||
|
|
for i = 1, #volEjectionList do
|
||
|
|
local name = volEjectionList[i]
|
||
|
|
self:CustomIcon(false, name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
volEjectionList = {}
|
||
|
|
volEjectionOnMe = false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:Desolate(args)
|
||
|
|
self:Message(args.spellId, "yellow", CL.count:format(args.spellName, desolateCount))
|
||
|
|
self:PlaySound(args.spellId, "alert")
|
||
|
|
desolateCount = desolateCount + 1
|
||
|
|
if self:LFR() then
|
||
|
|
self:Bar(args.spellId, desolateCount % 2 == 0 and 40 or 66.7, CL.count:format(args.spellName, desolateCount)) -- Desolate
|
||
|
|
elseif self:Normal() then
|
||
|
|
self:Bar(args.spellId, desolateCount % 2 == 0 and 37.9 or 63.1, CL.count:format(args.spellName, desolateCount)) -- Desolate
|
||
|
|
else
|
||
|
|
self:Bar(args.spellId, desolateCount % 2 == 0 and 36 or 60, CL.count:format(args.spellName, desolateCount)) -- Desolate
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:Overwhelm(args)
|
||
|
|
self:TargetMessage(args.spellId, "purple", self:UnitName("boss1target"), CL.casting:format(args.spellName))
|
||
|
|
self:PlaySound(args.spellId, "warning")
|
||
|
|
overwhelmCount = overwhelmCount + 1
|
||
|
|
if self:LFR() then
|
||
|
|
self:Bar(args.spellId, overwhelmCount % 7 == 1 and 26.7 or 13.3) -- Delayed by Consume every 7th
|
||
|
|
elseif self:Normal() then
|
||
|
|
self:Bar(args.spellId, overwhelmCount % 7 == 1 and 25.2 or 12.6) -- Delayed by Consume every 7th
|
||
|
|
else
|
||
|
|
self:Bar(args.spellId, overwhelmCount % 7 == 1 and 24 or 12) -- Delayed by Consume every 7th
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function mod:GrowingHungerApplied(args)
|
||
|
|
local amount = args.amount or 1
|
||
|
|
if amount % 5 == 0 then -- 5, 10... // Generally doesn't go above 5 if you swap on Overwhelm
|
||
|
|
self:NewStackMessage(args.spellId, "purple", args.destName, amount)
|
||
|
|
self:PlaySound(args.spellId, "alert")
|
||
|
|
end
|
||
|
|
end
|