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.
472 lines
16 KiB
472 lines
16 KiB
--------------------------------------------------------------------------------
|
|
-- TODO List:
|
|
-- -- initial Bars for the Platform mini bosses when engaged
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Module Declaration
|
|
--
|
|
|
|
local mod, CL = BigWigs:NewBoss("Portal Keeper Hasabel", 1712, 1985)
|
|
if not mod then return end
|
|
mod:RegisterEnableMob(122104)
|
|
mod.engageId = 2064
|
|
mod.respawnTime = 35
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Locals
|
|
--
|
|
|
|
local addsAlive = 0
|
|
local playerPlatform = 1 -- 1: Nexus, 2: Xoroth, 3: Rancora, 4: Nathreza
|
|
local nextPortalSoonWarning = 0
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Localization
|
|
--
|
|
|
|
local L = mod:GetLocale()
|
|
if L then
|
|
L.custom_on_stop_timers = "Always show ability bars"
|
|
L.custom_on_stop_timers_desc = "Hasabel randomizes which off-cooldown ability she uses next. When this option is enabled, the bars for those abilities will stay on your screen."
|
|
|
|
L.custom_on_filter_platforms = "Filter Side Platform Warnings and Bars"
|
|
L.custom_on_filter_platforms_desc = "Removes unnecessary messages and bars if you are not on a side platform. It will always show bars and warnings from the main Platform: Nexus."
|
|
|
|
L.worldExplosion = mod:SpellName(20476) -- Explosion
|
|
L.worldExplosion_desc = "Show a timer for the Collapsing World explosion."
|
|
L.worldExplosion_icon = 120637
|
|
|
|
L.platform_active = "%s Active!" -- Platform: Xoroth Active!
|
|
L.add_killed = "%s killed!"
|
|
|
|
L.achiev = "'Portal Combat' achievement debuffs" -- Achievement 11928
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Initialization
|
|
--
|
|
|
|
function mod:GetOptions()
|
|
return {
|
|
--[[ General ]]--
|
|
"stages",
|
|
"custom_on_stop_timers",
|
|
"custom_on_filter_platforms",
|
|
"berserk",
|
|
|
|
--[[ Platform: Nexus ]]--
|
|
{244016, "TANK"}, -- Reality Tear
|
|
243983, -- Collapsing World
|
|
"worldExplosion",
|
|
244000, -- Felstorm Barrage
|
|
244689, -- Transport Portal
|
|
245504, -- Howling Shadows
|
|
246075, -- Catastrophic Implosion
|
|
|
|
--[[ Platform: Xoroth ]]--
|
|
244607, -- Flames of Xoroth
|
|
244598, -- Supernova
|
|
{244613, "SAY", "SAY_COUNTDOWN"}, -- Everburning Flames
|
|
255805, -- Unstable Portal, every platform add casts it and i don't know where else to put it
|
|
|
|
--[[ Platform: Rancora ]]--
|
|
{244926, "SAY"}, -- Felsilk Wrap
|
|
246316, -- Poison Essence
|
|
{244849, "SAY", "SAY_COUNTDOWN"}, -- Caustic Slime
|
|
|
|
--[[ Platform: Nathreza ]]--
|
|
{245050, "HEALER"}, -- Delusions
|
|
245040, -- Corrupt
|
|
{245118, "SAY", "SAY_COUNTDOWN"}, -- Cloying Shadows
|
|
245075, -- Hungering Gloom
|
|
|
|
--[[ 'Portal Combat' achievement debuffs ]]--
|
|
246911, -- Binding: Xoroth
|
|
246925, -- Binding: Rancora
|
|
246929, -- Binding: Nathreza
|
|
},{
|
|
["stages"] = "general",
|
|
[244016] = -15799, -- Platform: Nexus
|
|
[244607] = -15800, -- Platform: Xoroth
|
|
[244926] = -15801, -- Platform: Rancora
|
|
[245050] = -15802, -- Platform: Nathreza
|
|
[246911] = L.achiev,
|
|
}
|
|
end
|
|
|
|
function mod:OnBossEnable()
|
|
--[[ General ]]--
|
|
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", "ActivatePortals", "boss1") -- Used when portals activate
|
|
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", "TransferPortals", "player") -- Used to track which platform a player is on as the spells below have been removed from CLUE
|
|
|
|
--self:Log("SPELL_CAST_SUCCESS", "PlatformPortal", 244073, 244136, 244146) -- Xoroth, Rancora, Nathreza
|
|
--self:Log("SPELL_CAST_SUCCESS", "ReturnPortal", 244112, 244138, 244145) -- Xoroth, Rancora, Nathreza
|
|
|
|
--[[ Platform: Nexus ]]--
|
|
self:Log("SPELL_AURA_APPLIED", "RealityTear", 244016)
|
|
self:Log("SPELL_AURA_APPLIED_DOSE", "RealityTear", 244016)
|
|
self:Log("SPELL_CAST_SUCCESS", "RealityTearSuccess", 244016)
|
|
self:Log("SPELL_CAST_START", "CollapsingWorldStart", 243983)
|
|
self:Log("SPELL_CAST_SUCCESS", "CollapsingWorld", 243983)
|
|
self:Log("SPELL_CAST_START", "FelstormBarrageStart", 244000)
|
|
self:Log("SPELL_CAST_SUCCESS", "FelstormBarrage", 244000)
|
|
self:Log("SPELL_CAST_START", "TransportPortalStart", 244689)
|
|
self:Log("SPELL_CAST_SUCCESS", "TransportPortal", 244689)
|
|
self:Log("SPELL_CAST_START", "HowlingShadows", 245504)
|
|
self:Log("SPELL_CAST_START", "CatastrophicImplosion", 246075)
|
|
|
|
--[[ Platform: Xoroth ]]--
|
|
self:Log("SPELL_CAST_START", "FlamesofXoroth", 244607)
|
|
self:Log("SPELL_CAST_SUCCESS", "Supernova", 244598)
|
|
self:Log("SPELL_AURA_APPLIED", "EverburningFlames", 244613)
|
|
self:Log("SPELL_AURA_REMOVED", "EverburningFlamesRemoved", 244613)
|
|
self:Log("SPELL_CAST_START", "UnstablePortal", 255805) -- Every platform add casts it and i don't know where else to put it
|
|
self:Death("VulcanarDeath", 122211)
|
|
|
|
--[[ Platform: Rancora ]]--
|
|
self:Log("SPELL_CAST_SUCCESS", "FelsilkWrap", 244926)
|
|
self:Log("SPELL_CAST_START", "PoisonEssence", 246316)
|
|
self:Log("SPELL_AURA_APPLIED", "CausticSlime", 244849)
|
|
self:Log("SPELL_AURA_REMOVED", "CausticSlimeRemoved", 244849)
|
|
self:Death("LadyDacidionDeath", 122212)
|
|
|
|
--[[ Platform: Nathreza ]]--
|
|
self:Log("SPELL_CAST_START", "Delusions", 245050)
|
|
self:Log("SPELL_AURA_APPLIED", "Corrupt", 245040)
|
|
self:Log("SPELL_AURA_APPLIED_DOSE", "Corrupt", 245040)
|
|
self:Log("SPELL_CAST_SUCCESS", "CorruptSuccess", 245040)
|
|
self:Log("SPELL_AURA_APPLIED", "CloyingShadows", 245118)
|
|
self:Log("SPELL_AURA_REMOVED", "CloyingShadowsRemoved", 245118)
|
|
self:Log("SPELL_AURA_APPLIED", "HungeringGloom", 245075)
|
|
self:Log("SPELL_AURA_REMOVED", "HungeringGloomRemoved", 245075)
|
|
self:Death("LordEilgarDeath", 122213)
|
|
|
|
--[[ 'Portal Combat' achievement debuffs ]]--
|
|
self:Log("SPELL_AURA_APPLIED", "Binding", 246911, 246925, 246929) -- Binding: Xoroth, Binding: Rancora, Binding: Nathreza
|
|
|
|
self:RegisterMessage("BigWigs_BarCreated", "BarCreated")
|
|
end
|
|
|
|
function mod:OnEngage()
|
|
addsAlive = 0
|
|
playerPlatform = 1
|
|
|
|
self:Bar(244016, 7) -- Reality Tear
|
|
self:Bar(243983, 12.7) -- Collapsing World
|
|
self:Bar(244689, self:Mythic() and 36.3 or 26.7) -- Transport Portal
|
|
self:Bar(244000, self:Mythic() and 26.9 or 35.7) -- Felstorm Barrage
|
|
self:Berserk(720)
|
|
|
|
nextPortalSoonWarning = 92 -- happens at 90%
|
|
self:RegisterUnitEvent("UNIT_HEALTH", nil, "boss1")
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Event Handlers
|
|
--
|
|
|
|
local triggerCdForOtherSpells
|
|
do
|
|
local abilitysToPause = {
|
|
[243983] = 9, -- Collapsing World
|
|
[244689] = 8.5, -- Transport Portal
|
|
[244000] = 9, -- Felstorm Barrage
|
|
}
|
|
|
|
local castPattern = CL.cast:gsub("%%s", ".+")
|
|
|
|
function triggerCdForOtherSpells(self, id, castTime)
|
|
for spellId, extraTime in next, abilitysToPause do
|
|
if id ~= spellId then
|
|
local cd = extraTime + (castTime or 0)
|
|
if self:BarTimeLeft(spellId) < cd then
|
|
self:Bar(spellId, cd)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
function mod:UNIT_HEALTH(event, unit)
|
|
local hp = UnitHealth(unit) / UnitHealthMax(unit) * 100
|
|
if hp < nextPortalSoonWarning then
|
|
local platformName = (hp < 40 and self:SpellName(257942)) or (hp < 70 and self:SpellName(257941)) or self:SpellName(257939)
|
|
local icon = (hp < 40 and "spell_mage_flameorb_purple") or (hp < 70 and "spell_mage_flameorb_green") or "spell_mage_flameorb"
|
|
self:MessageOld("stages", "green", nil, CL.soon:format(platformName), icon)
|
|
nextPortalSoonWarning = nextPortalSoonWarning - 30
|
|
if nextPortalSoonWarning < 30 then
|
|
self:UnregisterUnitEvent(event, unit)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:ActivatePortals(_, _, _, spellId)
|
|
if spellId == 257939 then -- Gateway: Xoroth
|
|
self:MessageOld("stages", "green", "long", L.platform_active:format(self:SpellName(257939)), "spell_mage_flameorb") -- Platform: Xoroth
|
|
addsAlive = addsAlive + 1
|
|
self:CDBar(255805, (self:LFR() and 60) or (self:Mythic() and 30) or 45) -- Unstable Portal
|
|
elseif spellId == 257941 then -- Gateway: Rancora
|
|
self:MessageOld("stages", "green", "long", L.platform_active:format(self:SpellName(257941)), "spell_mage_flameorb_green") -- Platform: Rancora
|
|
addsAlive = addsAlive + 1
|
|
self:CDBar(255805, (self:LFR() and 60) or (self:Mythic() and 30) or 45) -- Unstable Portal
|
|
elseif spellId == 257942 then -- Gateway: Nathreza
|
|
self:MessageOld("stages", "green", "long", L.platform_active:format(self:SpellName(257942)), "spell_mage_flameorb_purple") -- Platform: Nathreza
|
|
addsAlive = addsAlive + 1
|
|
self:CDBar(255805, (self:LFR() and 60) or (self:Mythic() and 30) or 45) -- Unstable Portal
|
|
end
|
|
end
|
|
|
|
function mod:TransferPortals(_, _, _, spellId)
|
|
if spellId == 244450 then -- Platform: Nexus
|
|
playerPlatform = 1
|
|
elseif spellId == 244455 then -- Xoroth
|
|
playerPlatform = 2
|
|
elseif spellId == 244512 then -- Rancora
|
|
playerPlatform = 3
|
|
elseif spellId == 244513 then -- Nathreza
|
|
playerPlatform = 4
|
|
end
|
|
end
|
|
|
|
--function mod:PlatformPortal(args)
|
|
-- if self:Me(args.sourceGUID) then
|
|
-- if args.spellId == 244073 then -- Xoroth
|
|
-- playerPlatform = 2
|
|
-- elseif args.spellId == 244136 then -- Rancora
|
|
-- playerPlatform = 3
|
|
-- elseif args.spellId == 244146 then -- Nathreza
|
|
-- playerPlatform = 4
|
|
-- end
|
|
-- end
|
|
--end
|
|
|
|
--function mod:ReturnPortal(args)
|
|
-- if self:Me(args.sourceGUID) then
|
|
-- playerPlatform = 1
|
|
-- end
|
|
--end
|
|
|
|
function mod:RealityTear(args)
|
|
local amount = args.amount or 1
|
|
self:StackMessage(args.spellId, args.destName, amount, "orange", amount > 1 and "alarm", nil, nil, true)
|
|
end
|
|
|
|
function mod:RealityTearSuccess(args)
|
|
self:Bar(args.spellId, addsAlive > 0 and 24.4 or 12.2) -- Cooldown increased when there are platforms active
|
|
end
|
|
|
|
function mod:CollapsingWorldStart(args)
|
|
self:StopBar(args.spellId)
|
|
triggerCdForOtherSpells(self, args.spellId, 2)
|
|
end
|
|
|
|
function mod:CollapsingWorld(args)
|
|
self:MessageOld(args.spellId, "red", "warning")
|
|
self:Bar("worldExplosion", 8, L.worldExplosion, L.worldExplosion_icon)
|
|
self:Bar(args.spellId, (self:Easy() and 37.1) or (self:Mythic() and 27.5) or 32.75)
|
|
triggerCdForOtherSpells(self, args.spellId)
|
|
end
|
|
|
|
function mod:FelstormBarrageStart(args)
|
|
self:StopBar(args.spellId)
|
|
triggerCdForOtherSpells(self, args.spellId, 2)
|
|
end
|
|
|
|
function mod:FelstormBarrage(args)
|
|
self:MessageOld(args.spellId, "orange", "alert")
|
|
self:Bar(args.spellId, (self:Easy() and 37.1) or (self:Mythic() and 27.5) or 32.75)
|
|
triggerCdForOtherSpells(self, args.spellId)
|
|
end
|
|
|
|
function mod:TransportPortalStart(args)
|
|
self:StopBar(args.spellId)
|
|
triggerCdForOtherSpells(self, args.spellId, 1.5)
|
|
end
|
|
|
|
function mod:TransportPortal(args)
|
|
self:MessageOld(args.spellId, "cyan", "info")
|
|
self:Bar(args.spellId, (self:Mythic() and 36.5) or 41.7)
|
|
self:CastBar(args.spellId, 12, CL.spawning:format(CL.adds))
|
|
triggerCdForOtherSpells(self, args.spellId)
|
|
end
|
|
|
|
function mod:HowlingShadows(args)
|
|
if playerPlatform == 1 then
|
|
self:MessageOld(args.spellId, "orange", "alarm")
|
|
end
|
|
end
|
|
|
|
do
|
|
local prev = 0
|
|
function mod:CatastrophicImplosion(args)
|
|
local t = GetTime()
|
|
if t-prev > 0.2 then
|
|
prev = t
|
|
self:MessageOld(args.spellId, "red", "alarm")
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local lastFlames = 0
|
|
|
|
function mod:FlamesofXoroth(args)
|
|
lastFlames = GetTime()
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform ~= 2 then return end
|
|
if self:Interrupter(args.sourceGUID) then
|
|
self:MessageOld(args.spellId, "orange", "alarm")
|
|
end
|
|
self:CDBar(args.spellId, 7.3) -- sometimes 8.5 (we adjust that timer in :Supernova())
|
|
self:CDBar(244598, 4.8) -- Supernova
|
|
end
|
|
|
|
function mod:Supernova(args)
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform ~= 2 then return end
|
|
self:MessageOld(args.spellId, "yellow", "alert")
|
|
if (GetTime() - lastFlames) < 5.5 then -- 2nd Supernova before Flames very likely
|
|
self:CDBar(args.spellId, 2.5)
|
|
self:CDBar(244607, 3.65) -- Flames of Xoroth
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:EverburningFlames(args)
|
|
if self:Me(args.destGUID) then
|
|
self:MessageOld(args.spellId, "blue", "info", CL.you:format(args.spellName))
|
|
self:SayCountdown(args.spellId, 10)
|
|
end
|
|
end
|
|
|
|
function mod:EverburningFlamesRemoved(args)
|
|
if self:Me(args.destGUID) then
|
|
self:CancelSayCountdown(args.spellId)
|
|
end
|
|
end
|
|
|
|
function mod:UnstablePortal(args)
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform == 1 then return end
|
|
self:MessageOld(args.spellId, "red", self:Interrupter(args.sourceGUID) and "alarm")
|
|
end
|
|
|
|
function mod:VulcanarDeath(args)
|
|
self:MessageOld("stages", "green", nil, L.add_killed:format(args.destName), "spell_mage_flameorb")
|
|
self:StopBar(244598) -- Supernova
|
|
self:StopBar(244607) -- Flames of Xoroth
|
|
self:StopBar(255805) -- Unstable Portal
|
|
addsAlive = addsAlive - 1
|
|
end
|
|
|
|
function mod:FelsilkWrap(args)
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform ~= 3 then return end
|
|
self:PlaySound(args.spellId, "warning")
|
|
self:TargetMessage(args.spellId, "orange", args.destName)
|
|
self:CDBar(args.spellId, 17)
|
|
if self:Me(args.destGUID) then
|
|
self:Say(args.spellId)
|
|
end
|
|
end
|
|
|
|
function mod:PoisonEssence(args)
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform ~= 3 then return end
|
|
self:MessageOld(args.spellId, "red", "alarm")
|
|
self:CDBar(args.spellId, 9.7)
|
|
end
|
|
|
|
function mod:CausticSlime(args)
|
|
if self:Me(args.destGUID) then
|
|
self:MessageOld(args.spellId, "blue", "info", CL.you:format(args.spellName))
|
|
self:SayCountdown(args.spellId, 20)
|
|
end
|
|
end
|
|
|
|
function mod:CausticSlimeRemoved(args)
|
|
if self:Me(args.destGUID) then
|
|
self:CancelSayCountdown(args.spellId)
|
|
end
|
|
end
|
|
|
|
function mod:LadyDacidionDeath(args)
|
|
self:MessageOld("stages", "green", nil, L.add_killed:format(args.destName), "spell_mage_flameorb_green")
|
|
self:StopBar(244926) -- Felsilk Wrap
|
|
self:StopBar(246316) -- Poison Essence
|
|
self:StopBar(255805) -- Unstable Portal
|
|
addsAlive = addsAlive - 1
|
|
end
|
|
|
|
function mod:Delusions(args)
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform ~= 4 then return end
|
|
self:MessageOld(args.spellId, "yellow", "alert", CL.casting:format(args.spellName))
|
|
self:CDBar(args.spellId, 14.5)
|
|
end
|
|
|
|
function mod:Corrupt(args)
|
|
if self:Me(args.destGUID) then
|
|
local amount = args.amount or 1
|
|
self:StackMessage(args.spellId, args.destName, amount, "yellow", amount > 2 and "warning") -- Sound when stacks are 3 or higher
|
|
end
|
|
end
|
|
|
|
function mod:CorruptSuccess(args)
|
|
if self:GetOption("custom_on_filter_platforms") and playerPlatform ~= 4 then return end
|
|
self:CDBar(args.spellId, 6.1)
|
|
end
|
|
|
|
function mod:CloyingShadows(args)
|
|
if self:Me(args.destGUID) then
|
|
self:PlaySound(args.spellId, "info")
|
|
self:PersonalMessage(args.spellId)
|
|
self:SayCountdown(args.spellId, 30)
|
|
end
|
|
end
|
|
|
|
function mod:CloyingShadowsRemoved(args)
|
|
if self:Me(args.destGUID) then
|
|
self:CancelSayCountdown(args.spellId)
|
|
end
|
|
end
|
|
|
|
function mod:HungeringGloom(args)
|
|
if self:UnitGUID("boss2") == args.destGUID or self:UnitGUID("boss3") == args.destGUID or self:UnitGUID("boss4") == args.destGUID then -- Should always be boss2, rest is safety
|
|
self:PlaySound(args.spellId, "info")
|
|
self:MessageOld(args.spellId, "orange", nil, CL.other:format(args.spellName, args.destName))
|
|
self:Bar(args.spellId, 20, CL.onboss:format(args.spellName))
|
|
end
|
|
end
|
|
|
|
function mod:HungeringGloomRemoved(args)
|
|
if self:UnitGUID("boss2") == args.destGUID or self:UnitGUID("boss3") == args.destGUID or self:UnitGUID("boss4") == args.destGUID then -- Should always be boss2, rest is safety
|
|
self:StopBar(CL.onboss:format(args.spellName))
|
|
end
|
|
end
|
|
|
|
function mod:LordEilgarDeath(args)
|
|
self:MessageOld("stages", "green", nil, L.add_killed:format(args.destName), "spell_mage_flameorb_purple")
|
|
self:StopBar(245050) -- Delusions
|
|
self:StopBar(245040) -- Corrupt
|
|
self:StopBar(255805) -- Unstable Portal
|
|
addsAlive = addsAlive - 1
|
|
end
|
|
|
|
--[[ 'Portal Combat' achievement debuffs ]]--
|
|
function mod:Binding(args)
|
|
if self:Me(args.destGUID) then
|
|
self:PlaySound(args.spellId, "info")
|
|
self:PersonalMessage(args.spellId)
|
|
self:TargetBar(args.spellId, 16, args.destName)
|
|
end
|
|
end
|
|
|