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.

319 lines
10 KiB

4 years ago
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Imonar the Soulhunter", 1712, 2009)
if not mod then return end
mod:RegisterEnableMob(124158)
mod.engageId = 2082
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local stage = 1
local empoweredSchrapnelBlastCount = 1
local nextIntermissionWarning = 0
local canisterProxList = {}
local timersOther = {
--[[ Empowered Shrapnel Blast ]]--
[248070] = {15.3, 21.8, 20.6, 18, 15.8, 16, 13.5, 10},
}
local timersMythic = {
--[[ Empowered Shrapnel Blast ]]--
[248070] = {15.7, 15.7, 15.7, 14.5, 14.5, 12.2, 12.2},
}
local timers = mod:Mythic() and timersMythic or timersOther
--------------------------------------------------------------------------------
-- Initialization
--
local canisterMarker = mod:AddMarkerOption(false, "player", 1, 254244, 1, 2)
function mod:GetOptions()
return {
"stages",
"berserk",
--[[ Stage One: Attack Force ]]--
{247367, "TANK"}, -- Shock Lance
{254244, "SAY", "FLASH", "PROXIMITY"}, -- Sleep Canister
canisterMarker,
247376, -- Pulse Grenade
--[[ Stage Two: Contract to Kill ]]--
{247687, "TANK"}, -- Sever
248254, -- Charged Blasts
247923, -- Shrapnel Blast
--[[ Stage Three: The Perfect Weapon ]]--
{250255, "TANK"}, -- Empowered Shock Lance
248068, -- Empowered Pulse Grenade
248070, -- Empowered Shrapnel Blast
--[[ Intermission: On Deadly Ground ]]--
253302, -- Conflagration
},{
["stages"] = "general",
[247367] = -16577, -- Stage One: Attack Force
[247687] = -16206, -- Stage Two: Contract to Kill
[250255] = -16208, -- Stage Three: The Perfect Weapon
[253302] = -16205, -- Intermission: On Deadly Ground
}
end
function mod:OnBossEnable()
self:RegisterEvent("RAID_BOSS_WHISPER")
self:RegisterMessage("BigWigs_BossComm") -- Syncing the Sleep Canisters
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
self:Log("SPELL_AURA_REMOVED", "IntermissionOver", 248233, 250135) -- Conflagration: Intermission 1, Intermission 2
--[[ Stage One: Attack Force ]]--
self:Log("SPELL_AURA_APPLIED", "ShockLance", 247367)
self:Log("SPELL_AURA_APPLIED_DOSE", "ShockLance", 247367)
self:Log("SPELL_CAST_SUCCESS", "ShockLanceSuccess", 247367)
self:Log("SPELL_CAST_SUCCESS", "SleepCanister", 254244)
self:Log("SPELL_AURA_APPLIED", "SleepCanisterApplied", 257196, 255029) -- LFR, Others. (Backup for the WHISPER event)
self:Log("SPELL_AURA_REMOVED", "SleepCanisterRemoved", 257196, 255029)
self:Log("SPELL_MISSED", "SleepCanisterRemoved", 257196, 255029) -- Since we're using WHISPER as it's faster than APPLIED, people might immune it
self:Log("SPELL_CAST_START", "PulseGrenade", 247376)
--[[ Stage Two: Contract to Kill ]]--
self:Log("SPELL_AURA_APPLIED", "Sever", 247687)
self:Log("SPELL_AURA_APPLIED_DOSE", "Sever", 247687)
self:Log("SPELL_CAST_SUCCESS", "SeverSuccess", 247687)
self:Log("SPELL_CAST_SUCCESS", "ChargedBlasts", 248254)
self:Log("SPELL_CAST_START", "ShrapnelBlast", 247923)
--[[ Stage Three: The Perfect Weapon ]]--
self:Log("SPELL_AURA_APPLIED", "EmpoweredShockLance", 250255)
self:Log("SPELL_AURA_APPLIED_DOSE", "EmpoweredShockLance", 250255)
self:Log("SPELL_CAST_SUCCESS", "EmpoweredShockLanceSuccess", 250255)
self:Log("SPELL_CAST_START", "EmpoweredPulseGrenade", 248068)
self:Log("SPELL_CAST_START", "EmpoweredShrapnelBlast", 248070)
--[[ Intermission: On Deadly Ground ]]--
end
function mod:OnEngage()
timers = self:Mythic() and timersMythic or timersOther
stage = 1
canisterProxList = {}
self:CDBar(247367, self:Mythic() and 4.8 or 4.5) -- Shock Lance
self:CDBar(254244, self:Mythic() and 7.2 or 7.3) -- Sleep Canister
if self:Mythic() then
self:CDBar(248068, 13.4) -- Empowered Pulse Grenade
self:Berserk(480)
else
self:CDBar(247376, 12.2) -- Pulse Grenade
end
nextIntermissionWarning = self:Mythic() and 83 or 69
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss1")
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:UNIT_HEALTH(event, unit)
local hp = UnitHealth(unit) / UnitHealthMax(unit) * 100
if hp < nextIntermissionWarning then
self:MessageOld("stages", "green", nil, CL.soon:format(CL.intermission), false)
nextIntermissionWarning = nextIntermissionWarning - (self:Mythic() and 20 or 33)
if nextIntermissionWarning < 20 then
self:UnregisterUnitEvent(event, unit)
end
end
end
do
local playerList, isOnMe = mod:NewTargetList(), false
local canisterMarks = {false, false}
local function addPlayerToList(self, name)
if not tContains(canisterProxList, name) then
canisterProxList[#canisterProxList+1] = name
playerList[#playerList+1] = name
if self:GetOption(canisterMarker) then
for i = 1, 2 do
if not canisterMarks[i] then
canisterMarks[i] = self:UnitName(name)
self:CustomIcon(false, name, i)
break
end
end
end
if self:Easy() or (isOnMe and name == self:UnitName("player")) then -- Not warning for others when on you
self:TargetsMessage(254244, "red", playerList, 1)
elseif not isOnMe then
self:TargetsMessage(254244, "red", playerList, 2)
end
end
self:OpenProximity(254244, 10, canisterProxList)
end
function mod:RAID_BOSS_WHISPER(_, msg)
if msg:find("254244", nil, true) then -- Sleep Canister
isOnMe = true
self:PlaySound(254244, "alarm")
self:Flash(254244)
self:Say(254244)
addPlayerToList(self, self:UnitName("player"))
self:Sync("SleepCanister")
end
end
function mod:BigWigs_BossComm(_, msg, _, name)
if msg == "SleepCanister" then
addPlayerToList(self, name)
end
end
function mod:SleepCanister(args)
isOnMe = false
playerList = self:NewTargetList()
canisterMarks = {false, false}
self:Bar(args.spellId, self:Mythic() and 12.1 or 10.9)
end
function mod:SleepCanisterApplied(args)
addPlayerToList(self, args.destName)
if self:Healer() and #canisterProxList > 0 then
self:PlaySound(254244, "alert")
end
end
function mod:SleepCanisterRemoved(args)
tDeleteItem(canisterProxList, args.destName)
if #canisterProxList == 0 then
self:CloseProximity(254244)
else
self:OpenProximity(254244, 10, canisterProxList)
end
if self:GetOption(canisterMarker) then
for i = 1, 2 do
if canisterMarks[i] == self:UnitName(args.destName) then
canisterMarks[i] = false
self:CustomIcon(false, args.destName)
break
end
end
end
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 248995 or spellId == 248194 then -- Jetpacks (Intermission 1), Jetpacks (Intermission 2)
self:MessageOld("stages", "green", "long", CL.intermission, false)
-- Stage 1 timers
self:StopBar(247367) -- Shock Lance
self:StopBar(254244) -- Sleep Canister
self:StopBar(247376) -- Pulse Grenade
-- Stage 2 timers
self:StopBar(247687) -- Sever
self:StopBar(248254) -- Charged Blast
self:StopBar(247923) -- Shrapnel Blast
-- Mythic timers
self:StopBar(248068) -- Empowered Pulse Grenade
self:StopBar(248070) -- Empowered Shrapnel Blast
end
end
function mod:IntermissionOver()
stage = stage + 1
self:MessageOld("stages", "green", "long", CL.stage:format(stage), false)
if stage == 2 then
self:CDBar(247687, 7.7) -- Sever
self:CDBar(248254, 10.6) -- Charged Blast
self:CDBar(247923, 12.8) -- Shrapnel Blast
elseif stage == 3 then
if self:Mythic() then
self:CDBar(254244, 7.3) -- Sleep Canister
self:CDBar(248068, 6.8) -- Empowered Pulse Grenade
self:CDBar(247923, 12.8) -- Shrapnel Blast
else
empoweredSchrapnelBlastCount = 1
self:CDBar(250255, 4.3) -- Empowered Shock Lance
self:CDBar(248068, 6.8) -- Empowered Pulse Grenade
self:CDBar(248070, timers[248070][empoweredSchrapnelBlastCount]) -- Empowered Shrapnel Blast
end
elseif stage == 4 then -- Mythic only
empoweredSchrapnelBlastCount = 1
self:CDBar(254244, 7.3) -- Sleep Canister
self:CDBar(248070, 15) -- Empowered Shrapnel Blast
self:CDBar(248254, 10.6) -- Charged Blast
elseif stage == 5 then -- Mythic only
empoweredSchrapnelBlastCount = 1
self:CDBar(254244, 7.3) -- Sleep Canister
self:CDBar(250255, 4.3) -- Empowered Shock Lance
self:CDBar(248068, 6.8) -- Empowered Pulse Grenade
self:CDBar(248070, timers[248070][empoweredSchrapnelBlastCount]) -- Empowered Shrapnel Blast
end
end
--[[ Stage One: Attack Force ]]--
function mod:ShockLance(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "purple", amount > 6 and "warning" or amount > 4 and "alarm") -- Swap on 5, increase warning at 7
end
function mod:ShockLanceSuccess(args)
self:Bar(args.spellId, 4.9)
end
function mod:PulseGrenade(args)
self:MessageOld(args.spellId, "yellow", "alert")
self:Bar(args.spellId, 17.0)
end
--[[ Stage Two: Contract to Kill ]]--
function mod:Sever(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "purple", amount > 3 and "warning" or amount > 1 and "alarm") -- Swap on 2
end
function mod:SeverSuccess(args)
self:Bar(args.spellId, 7.3)
end
function mod:ChargedBlasts(args)
self:MessageOld(args.spellId, "orange", "warning", CL.incoming:format(args.spellName))
self:CastBar(args.spellId, 8.6)
self:Bar(args.spellId, self:Mythic() and (stage == 2 and 14.5 or 18.2) or 18.2)
end
function mod:ShrapnelBlast(args)
self:MessageOld(args.spellId, "yellow", "alert")
self:Bar(args.spellId, self:Mythic() and (stage == 2 and 17 or 14.6) or 13.4)
end
--[[ Stage Three: The Perfect Weapon ]]--
function mod:EmpoweredShockLance(args)
local amount = args.amount or 1
self:StackMessage(args.spellId, args.destName, amount, "purple", amount % 2 == 0 and "alarm")
end
function mod:EmpoweredShockLanceSuccess(args)
self:Bar(args.spellId, self:Mythic() and 6 or 9.7)
end
function mod:EmpoweredPulseGrenade(args)
self:MessageOld(args.spellId, "yellow", "alert")
self:Bar(args.spellId, stage == 5 and 13.3 or 26.7) -- Stage 5 mythic only
end
function mod:EmpoweredShrapnelBlast(args)
self:MessageOld(args.spellId, "orange", "warning")
empoweredSchrapnelBlastCount = empoweredSchrapnelBlastCount + 1
self:CDBar(args.spellId, stage == 4 and 26.8 or timers[args.spellId][empoweredSchrapnelBlastCount] or 9.6)
end