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.

214 lines
6.7 KiB

--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Kin-Tara", 2285, 2399)
if not mod then return end
mod:RegisterEnableMob(162059, 163077) -- Kin-Tara, Azules
mod.engageId = 2357
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
"stages",
{320966, "TANK_HEALER"}, -- Overhead Slash
{327481, "DISPEL"}, -- Dark Lance
{321009, "ICON", "SAY", "SAY_COUNTDOWN"}, -- Charged Spear
324368, -- Attenuated Barrage
331251, -- Deep Connection
}, {
["stages"] = CL.general,
[320966] = -21637, -- Kin-Tara
[324368] = -21639, -- Azules
[331251] = CL.mythic,
}
end
function mod:OnBossEnable()
self:Log("SPELL_CAST_START", "OverheadSlash", 320966)
self:Log("SPELL_CAST_SUCCESS", "DarkLanceSuccess", 327481)
self:Log("SPELL_AURA_APPLIED", "DarkLanceApplied", 327481)
self:Log("SPELL_CAST_START", "AttenuatedBarrage", 324368)
self:Log("SPELL_AURA_APPLIED", "DeepConnection", 331251)
self:Log("SPELL_AURA_APPLIED_DOSE", "DeepConnection", 331251)
self:Log("SPELL_AURA_APPLIED", "IonizedPlasma", 324662) -- Periodic damage from Charged Spear
self:Log("SPELL_PERIODIC_DAMAGE", "IonizedPlasma", 324662)
self:Log("SPELL_PERIODIC_MISSED", "IonizedPlasma", 324662)
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1", "boss2") -- Charged Spear
-- Stage detection
if self:Mythic() then
self:Log("SPELL_AURA_APPLIED", "IntermissionOver", 331249) -- Deep Connection
self:Log("SPELL_AURA_REMOVED", "Intermission", 331249)
else
self:RegisterEvent("CHAT_MSG_MONSTER_YELL")
end
end
function mod:OnEngage()
self:Bar(327481, 9.7) -- Dark Lance
if not self:Mythic() then
-- Call it manually because there's no Deep Connection on Normal and Heroic:
self:IntermissionOver()
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
do
local function startTimers(self, offset)
self:StopBar(324368) -- Attenuated Barrage
self:StopBar(320966) -- Overhead Slash
self:StopBar(327481) -- Dark Lance
self:CDBar(321009, 3.6 + offset) -- Charged Spear (timers are very inconsistent for this one)
self:CDBar("stages", 22 + offset, CL.over:format(CL.intermission), "inv_sword_01")
end
function mod:Intermission()
startTimers(self, 0)
end
function mod:CHAT_MSG_MONSTER_YELL(_, _, source, _, _, target)
if source == target then -- Intermission (or a wipe, or someone with the same name on koKR where it doesn't have a hyphen)
startTimers(self, -0.2)
self:RegisterUnitEvent("UNIT_POWER_FREQUENT", nil, "boss1") -- Power resets to 0 at the end of the intermission
end
end
end
function mod:IntermissionOver()
self:StopBar(321009) -- Charged Spear
self:Bar(324368, 6) -- Attenuated Barrage
self:CDBar(320966, 7.3) -- Overhead Slash
self:Bar("stages", 30.3, CL.intermission, "inv_icon_wing06a")
end
function mod:UNIT_POWER_FREQUENT(event, unit, powerType)
if powerType == "ENERGY" and UnitPower(unit, 3) == 0 then -- ENERGY = 3
self:UnregisterUnitEvent(event, unit)
self:IntermissionOver()
end
end
function mod:OverheadSlash(args)
self:Message(args.spellId, "purple", CL.casting:format(args.spellName))
self:PlaySound(args.spellId, "alarm")
self:CDBar(args.spellId, 9.7)
end
function mod:DarkLanceSuccess(args)
self:CDBar(args.spellId, 51.4)
end
do
local playerList = mod:NewTargetList()
function mod:DarkLanceApplied(args)
if self:Dispeller("magic", nil, args.spellId) then
playerList[#playerList+1] = args.destName
self:TargetsMessage(args.spellId, "orange", playerList, 2)
self:PlaySound(args.spellId, "alert", nil, playerList)
elseif self:Me(args.destGUID) then
self:PersonalMessage(args.spellId)
self:PlaySound(args.spellId, "alert")
end
end
end
-- Charged Spear:
do
-- UNIT_SPELLCAST_SUCCEEDED happens 1.2s before the real cast,
-- CHAT_MSG_RAID_BOSS_EMOTE - happens 1.0s before.
--
-- The cast itself is 0.5s long, so an early warning helps quite a bit.
--
-- When she starts flying, she clears her current target.
-- The sequence for this ability is:
-- -1.21s UNIT_TARGET -> a player (sometimes this one is missing)
-- -1.20s UNIT_SPELLCAST_SUCCEEDED (321088)
-- -1.17s UNIT_TARGET -> empty target
-- -1.00s CHAT_MSG_RAID_BOSS_EMOTE
-- +0.00s SPELL_CAST_START + UNIT_SPELLCAST_START (321009)
-- +0.00s UNIT_TARGET -> a player
-- +0.50s SPELL_CAST_SUCCESS + UNIT_SPELLCAST_SUCCEEDED (321009)
-- +1.50s UNIT_SPELLCAST_SUCCEEDED (324662)
local function printTarget(self, destName, offset)
self:TargetMessage(321009, "yellow", destName)
self:PlaySound(321009, "alert", nil, destName)
self:CastBar(321009, 2.7 + offset) -- Targetting + actual cast + travel time (it's constant)
self:CDBar(321009, 10.9 + offset)
self:PrimaryIcon(321009, destName)
local guid = self:UnitGUID(destName)
if self:Me(guid) then
self:Say(321009)
self:SayCountdown(321009, 2.7 + offset, nil, 2)
end
end
function mod:UNIT_SPELLCAST_SUCCEEDED(_, unit, _, spellId)
if spellId == 321088 then -- Charged Spear (targetting)
local destName = self:UnitName(unit.."target")
if destName and not self:Tanking(unit, destName) then
printTarget(self, destName, 0)
else
self:RegisterEvent("CHAT_MSG_RAID_BOSS_EMOTE")
end
elseif spellId == 321009 then -- Charged Spear (thrown)
self:UnregisterEvent("CHAT_MSG_RAID_BOSS_EMOTE")
elseif spellId == 324662 then -- Ionized Plasma (Charged Spear landed)
self:PrimaryIcon(321009)
end
end
function mod:CHAT_MSG_RAID_BOSS_EMOTE(event, _, _, _, _, destName)
self:UnregisterEvent(event)
printTarget(self, destName, -0.2)
end
end
do
local prev = 0
function mod:IonizedPlasma(args)
if self:Me(args.destGUID) then
local t = args.time
if t - prev > 1.5 then
prev = t
self:PersonalMessage(321009, "underyou", args.spellName, args.spellId)
self:PlaySound(321009, "underyou")
end
end
end
end
do
local prev = 0
function mod:AttenuatedBarrage(args)
local t = args.time
if t - prev > 5 then -- 3 casts, long cooldown, repeat
prev = t
self:Message(args.spellId, "cyan")
self:PlaySound(args.spellId, "long")
self:CDBar(args.spellId, 11) -- depends on how long it takes for Azules to move to a new location
end
end
end
function mod:DeepConnection(args)
local stacks = args.amount or 1
if self:Me(args.destGUID) and stacks % 2 == 1 then
self:StackMessage(args.spellId, args.destName, stacks, "red")
self:PlaySound(args.spellId, stacks > 4 and "warning" or "alert")
end
end