Files
coa-dbm/DBM-BlackTemple/Illidan.lua
T
Szyler dc8afd6584 5.19b (#4)
Co-authored-by: Szyler <Szyler@Szyler.com>
2024-03-03 11:23:13 -07:00

424 lines
16 KiB
Lua

local mod = DBM:NewMod("Illidan", "DBM-BlackTemple")
local L = mod:GetLocalizedStrings()
mod:SetRevision(("$Revision: 5019 $"):sub(12, -3))
mod:SetCreatureID(22917)
mod:RegisterCombat("yell", L.DBM_ILLIDAN_YELL_PULL)
-- Illidan:SetMinCombatTime(20)
mod:RegisterEvents(
"SPELL_CAST_SUCCESS",
"SPELL_CAST_START",
"SPELL_AURA_APPLIED",
"SPELL_CAST_SUCCESS",
"SPELL_DAMAGE",
"UNIT_DIED",
"CHAT_MSG_MONSTER_YELL",
"UNIT_SPELLCAST_START"
)
local timerCombatStart = mod:NewTimer(3, "TimerCombatStart", 2457)
local warnChaosBlast = mod:NewSpellAnnounce(2144802, 2)
local warnFlameCrash = mod:NewSpellAnnounce(2144720, 2)
local warnFlameCrashDot = mod:NewSpellAnnounce(2144720, 3)
local warnForceNova = mod:NewSpellAnnounce(2144724, 2)
local warnShear = mod:NewSpellAnnounce(2144718, 2)
local warnDrawSoul = mod:NewSpellAnnounce(2144737, 2)
local warnFelFireBlast = mod:NewSpellAnnounce(2144829, 2)
local warnUnharnessedBlade = mod:NewSpellAnnounce(2144742, 2)
local yellUnharnessedBlade = mod:NewFadesYell(2144742)
local timerChaosBlast = mod:NewCastTimer(2, 2144802)
local timerChaosBlastDebuff = mod:NewBuffActiveTimer(6, 2144802)
local timerNextFlameCrash = mod:NewNextTimer(30, 2144720)
local timerFlameCrash = mod:NewCastTimer(2, 2144720)
local timerNextForceNova = mod:NewNextTimer(25, 2144724)
local timerNextShear = mod:NewNextTimer(25, 2144718)
local timerNextDrawSoul = mod:NewNextTimer(30, 2144737)
local timerFelFireBlast = mod:NewCastTimer(2, 2144802)
local timerNextFelFireBlast = mod:NewNextTimer(20, 2144829)
local timerFelFireBlast2 = mod:NewCastTimer(2, 2144802)
local timerNextFelFireBlast2 = mod:NewNextTimer(20, 2144829)
local timerNextUnharnessedBlade = mod:NewNextTimer(30, 2144742)
function mod:OnCombatStart(delay)
if self.Options.RangeCheck then
DBM.RangeCheck:Show(15)
end
timerCombatStart:Start(3)
timerNextForceNova:Start(18-delay)
timerNextShear:Start(28-delay)
timerNextDrawSoul:Start(33-delay)
timerNextUnharnessedBlade:Start(38)
end
function mod:UnharnessedBlade()
local target = nil
target = mod:GetBossTarget(22917)
if target == UnitName("player") then
yellUnharnessedBlade:Countdown(3,3)
end
end
function mod:SPELL_CAST_SUCCESS(args)
if args:IsSpellID(2144840) then
if timerFelFireBlast:IsStarted() or timerNextFelFireBlast:IsStarted() then
timerFelFireBlast2:Start()
timerNextFelFireBlast2:Start(20)
else
timerFelFireBlast:Start()
timerNextFelFireBlast:Start(20)
end
warnFelFireBlast:Show()
elseif args:IsSpellID(2144802,2144803,2144804,2144805) then
warnChaosBlast:Show()
timerChaosBlast:Start()
elseif args:IsSpellID(2144715,2144716,2144717,2144718) then
warnShear:Show()
timerNextShear:Start()
end
end
function mod:SPELL_CAST_START(args)
if args:IsSpellID(2144737,2144738,2144739,2144740) then
warnDrawSoul:Show()
timerNextDrawSoul:Start()
elseif args:IsSpellID(2144720,2144721,2144722,2144723) then
timerNextFlameCrash:Start()
warnFlameCrash:Show()
timerFlameCrash:Start()
elseif args:IsSpellID(2144829,2144830,2144831,2144832) then
warnFelFireBlast:Show()
timerNextFelFireBlast:Start()
elseif args:IsSpellID(2144742) then
self:ScheduleMethod(0.2, "UnharnessedBlade")
warnUnharnessedBlade:Show()
timerNextUnharnessedBlade:Start()
elseif args:IsSpellID(2144715,2144716,2144717,2144718) then
warnShear:Show()
timerNextShear:Start()
elseif args:IsSpellID(2144802,2144803,2144804,2144805) then
warnChaosBlast:Show()
timerChaosBlast:Start()
end
end
function mod:SPELL_AURA_APPLIED(args)
if args:IsSpellID(2144802,2144803,2144804,2144805) then
timerChaosBlastDebuff:Start()
elseif args:IsSpellID(2144720,2144721,2144722,2144723) then
if args:IsPlayer() then
warnFlameCrashDot:Show()
end
end
end
function mod:SPELL_DAMAGE(args)
if args:IsSpellID(2144724,2144725,2144726,2144727) and DBM:AntiSpam(15) then
warnForceNova:Show()
timerNextForceNova:Start()
end
end
function mod:OnCombatEnd()
DBM.RangeCheck:Hide()
end
-- if self.Options.RangeCheck then
-- DBM_Gui_DistanceFrame_Hide()
-- end
-- phase2 = nil
-- phase4 = nil
-- local flameTargets = {}
-- local flamesDown = 0
-- local flameBursts = 0
-- local demonTargets = {}
-- local phase2
-- local warnedDemons
-- local phase4
--Illidan:AddOption("RangeCheck", true, DBM_ILLIDAN_OPTION_RANGECHECK)
--Illidan:AddOption("WarnPhases", true, DBM_ILLIDAN_OPTION_PHASES)
----Illidan:AddOption("WarnShearCast", false, DBM_ILLIDAN_OPTION_SHEARCAST)
----Illidan:AddOption("WarnShear", true, DBM_ILLIDAN_OPTION_SHEAR)
--Illidan:AddOption("WarnShadowfiend", true, DBM_ILLIDAN_OPTION_SHADOWFIEND)
--Illidan:AddOption("IconShadowfiend", true, DBM_ILLIDAN_OPTION_ICONFIEND)
--Illidan:AddOption("WarnBarrage", true, DBM_ILLIDAN_OPTION_BARRAGE)
--Illidan:AddOption("WarnBarrageSoon", true, DBM_ILLIDAN_OPTION_BARRAGE_SOON)
--Illidan:AddOption("WarnEyeBeam", true, DBM_ILLIDAN_OPTION_EYEBEAM)
----Illidan:AddOption("WarnEyeBeamSoon", false, DBM_ILLIDAN_OPTION_EYEBEAMSOON) -- inaccurate!
--Illidan:AddOption("WarnFlames", true, DBM_ILLIDAN_OPTION_FLAMES)
--Illidan:AddOption("WarnDemonForm", true, DBM_ILLIDAN_OPTION_DEMONFORM)
--Illidan:AddOption("WarnFlameBursts", true, DBM_ILLIDAN_OPTION_FLAMEBURST)
--Illidan:AddOption("WarnShadowDemons", true, DBM_ILLIDAN_OPTION_SHADOWDEMONS)
--Illidan:AddBarOption("Enrage")
--Illidan:AddBarOption("Illidan Stormrage")
----Illidan:AddBarOption("Shear: (.*)")
--Illidan:AddBarOption("Shadowfiend: (.*)")
--Illidan:AddBarOption("Next Dark Barrage")
--Illidan:AddBarOption("Dark Barrage: (.*)")
--Illidan:AddBarOption("Flames: (.*)", false)
--Illidan:AddBarOption("Demon Phase")
--Illidan:AddBarOption("Normal Phase")
--Illidan:AddBarOption("Shadow Demons")
--Illidan:AddBarOption("Next Flame Burst")
-- flameTargets = {}
-- demonTargets = {}
-- flamesDown = 0
-- flameBursts = 0
-- phase2 = nil
-- phase4 = nil
-- delay = (delay or 0) - 7 - 33 -- 7 = time until combat starts and 33 because the timer will stop while illidan is switching from phase 1->2, 2->3 and 3->4; according to my combatlogs this should be quite accurate
-- self:StartStatusBarTimer(1500 - delay, "Enrage", "Interface\\Icons\\Spell_Shadow_UnholyFrenzy");
-- self:ScheduleAnnounce(900 - delay, DBM_GENERIC_ENRAGE_WARN:format(10, DBM_MIN), 1)
-- self:ScheduleAnnounce(1200 - delay, DBM_GENERIC_ENRAGE_WARN:format(5, DBM_MIN), 1)
-- self:ScheduleAnnounce(1320 - delay, DBM_GENERIC_ENRAGE_WARN:format(3, DBM_MIN), 1)
-- self:ScheduleAnnounce(1440 - delay, DBM_GENERIC_ENRAGE_WARN:format(1, DBM_MIN), 2)
-- self:ScheduleAnnounce(1470 - delay, DBM_GENERIC_ENRAGE_WARN:format(30, DBM_SEC), 3)
-- self:ScheduleAnnounce(1490 - delay, DBM_GENERIC_ENRAGE_WARN:format(10, DBM_SEC), 4)
-- function Illidan:OnEvent(event, args)
-- if event == "CHAT_MSG_MONSTER_YELL" then
-- if args == DBM_ILLIDAN_YELL_EYEBEAM then
-- self:SendSync("EyeBeam")
-- elseif args == DBM_ILLIDAN_YELL_DEMONFORM then
-- self:SendSync("DemonForm")
-- elseif args == DBM_ILLIDAN_YELL_PHASE4 then
-- self:SendSync("Phase4")
-- elseif args == DBM_ILLIDAN_YELL_START then
-- self:StartStatusBarTimer(36.6, "Illidan Stormrage", "Interface\\Icons\\INV_Weapon_ShortBlade_07")
-- end
-- elseif event == "SPELL_AURA_APPLIED" then
-- if args.spellId == 40647 then
-- self:SendSync("Prison")
-- -- elseif args.spellId == 41032 then
-- -- self:SendSync("Shear"..tostring(args.destName))
-- elseif args.spellId == 41917 or args.spellId == 41914 then
-- self:SendSync("Shadowfiend"..tostring(args.destName))
-- elseif args.spellId == 40585 then
-- self:SendSync("DarkBarrage"..tostring(args.destName))
-- elseif args.spellId == 40932 then
-- self:SendSync("Flames"..tostring(args.destName))
-- elseif args.spellId == 41083 then
-- self:SendSync("ShadowDems"..tostring(args.destName))
-- elseif args.spellId == 40683 then -- ??
-- self:SendSync("P4Enrage")
-- elseif args.spellId == 40695 then
-- self:SendSync("Caged")
-- end
-- elseif event == "SPELL_CAST_SUCCESS" then
-- if args.spellId == 39855 then
-- self:SendSync("Phase2")
-- end
-- elseif event == "WarnAF" then
-- local msg = ""
-- for i, v in ipairs(flameTargets) do
-- msg = msg..">"..v.."<, "
-- end
-- msg = msg:sub(0, -3)
-- flameTargets = {}
-- if self.Options.WarnFlames then
-- self:Announce(DBM_ILLIDAN_WARN_FLAMES:format(msg), 3)
-- end
-- elseif event == "WarnSD" and not warnedDemons then
-- local msg = ""
-- for i, v in ipairs(demonTargets) do
-- msg = msg..">"..v.."<, "
-- end
-- msg = msg:sub(0, -3)
-- demonTargets = {}
-- if self.Options.WarnShadowDemons then
-- self:Announce(DBM_ILLIDAN_WARN_SHADOWDEMSON:format(msg), 4)
-- end
-- warnedDemons = true
-- elseif event == "UNIT_DIED" then
-- if args.destName == DBM_ILLIDAN_MOB_FLAME then
-- self:SendSync("FlameDown")
-- end
-- elseif event == "SPELL_DAMAGE" then
-- if args.spellId == 41131 then
-- self:SendSync("Flameburst")
-- end
-- -- elseif event == "SPELL_CAST_START" then
-- -- if args.spellId == 41032 then
-- -- self:SendSync("CastShear")
-- -- end
-- end
-- end
-- function Illidan:GetBossHP()
-- if phase2 then
-- return DBM_ILLIDAN_STATUSMSG_PHASE2
-- end
-- end
-- function Illidan:OnSync(msg)
-- if msg:sub(0, 5) == "Shear" then
-- -- msg = msg:sub(6)
-- -- if self.Options.WarnShear then
-- -- self:Announce(DBM_ILLIDAN_WARN_SHEAR:format(msg), 1)
-- -- end
-- -- self:StartStatusBarTimer(7, "Shear: "..msg, "Interface\\Icons\\Spell_Shadow_FocusedPower")
-- elseif msg == "CastShear" then
-- -- if self.Options.WarnShearCast then
-- -- self:Announce(DBM_ILLIDAN_WARN_CASTSHEAR, 1)
-- -- end
-- elseif msg:sub(0, 11) == "Shadowfiend" then
-- msg = msg:sub(12)
-- if msg == UnitName("player") then
-- self:AddSpecialWarning(DBM_ILLIDAN_SELFWARN_SHADOWFIEND)
-- end
-- if self.Options.WarnShadowfiend then
-- self:Announce(DBM_ILLIDAN_WARN_SHADOWFIEND:format(msg), 2)
-- end
-- if self.Options.IconShadowfiend then
-- self:SetIcon(msg, 10)
-- end
-- self:StartStatusBarTimer(10, "Shadowfiend: "..msg, "Interface\\Icons\\Spell_Shadow_Shadowfiend")
-- elseif msg:sub(0, 11) == "DarkBarrage" then
-- msg = msg:sub(12)
-- if self.Options.WarnBarrage then
-- self:Announce(DBM_ILLIDAN_WARN_BARRAGE:format(msg), 2)
-- end
-- if self.Options.WarnBarrageSoon then
-- self:ScheduleAnnounce(42, DBM_ILLIDAN_WARN_BARRAGE_SOON, 1)
-- end
-- self:EndStatusBarTimer("Next Dark Barrage") -- synced timers may only overwrite timers that are about to expire - the barrage timer seems to be quite inaccurate...so send a end timer command before.
-- self:StartStatusBarTimer(44, "Next Dark Barrage", "Interface\\Icons\\Spell_Shadow_PainSpike")
-- self:StartStatusBarTimer(10, "Dark Barrage: "..msg, "Interface\\Icons\\Spell_Shadow_PainSpike")
-- elseif msg == "EyeBeam" then
-- if self.Options.WarnEyeBeam then
-- self:Announce(DBM_ILLIDAN_WARN_EYEBEAM, 3)
-- end
-- -- if self.Options.WarnEyeBeamSoon then -- inaccurate!
-- -- self:ScheduleAnnounce(32, DBM_ILLIDAN_WARN_EYEBEAM_SOON, 2)
-- -- end
-- -- self:StartStatusBarTimer(35, "Next Eye Blast", "Interface\\Icons\\Spell_Shadow_SiphonMana")
-- elseif msg:sub(0, 6) == "Flames" then
-- msg = msg:sub(7)
-- self:StartStatusBarTimer(60, "Flames: "..msg, "Interface\\Icons\\Spell_Fire_BlueImmolation")
-- if msg == UnitName("player") then
-- self:AddSpecialWarning(DBM_ILLIDAN_SELFWARN_SHADOW)
-- end
-- table.insert(flameTargets, msg)
-- self:UnScheduleEvent("WarnAF")
-- self:ScheduleEvent(1, "WarnAF")
-- elseif msg == "Phase2" then
-- if self.Options.WarnPhases then
-- self:Announce(DBM_ILLIDAN_WARN_PHASE2, 4)
-- end
-- if self.Options.WarnBarrageSoon then
-- self:ScheduleAnnounce(76, DBM_ILLIDAN_WARN_BARRAGE_SOON, 1)
-- end
-- self:StartStatusBarTimer(81, "Next Dark Barrage", "Interface\\Icons\\Spell_Shadow_PainSpike")
-- phase2 = true
-- flamesDown = 0
-- elseif msg == "Phase3" then
-- if self.Options.WarnPhases then
-- self:Announce(DBM_ILLIDAN_WARN_PHASE3, 4)
-- end
-- if self.Options.RangeCheck then
-- DBM_Gui_DistanceFrame_Show()
-- end
-- phase2 = nil
-- self:StartStatusBarTimer(76, "Demon Phase", "Interface\\Icons\\Spell_Shadow_Metamorphosis")
-- if self.Options.WarnDemonForm then
-- self:ScheduleAnnounce(66, DBM_ILLIDAN_WARN_DEMONPHASE_SOON, 3)
-- end
-- self:EndStatusBarTimer("Next Dark Barrage")
-- self:UnScheduleAnnounce(DBM_ILLIDAN_WARN_BARRAGE_SOON, 1)
-- elseif msg == "Phase4" then
-- if self.Options.WarnPhases then
-- self:Announce(DBM_ILLIDAN_WARN_PHASE4, 4)
-- end
-- self:EndStatusBarTimer("Demon Phase")
-- self:EndStatusBarTimer("Normal Phase")
-- self:UnScheduleAnnounce(DBM_ILLIDAN_WARN_DEMONPHASE_SOON)
-- self:UnScheduleAnnounce(DBM_ILLIDAN_WARN_NORMALPHASE_SOON)
-- self:StartStatusBarTimer(92, "Demon Phase", "Interface\\Icons\\Spell_Shadow_Metamorphosis")
-- if self.Options.WarnDemonForm then
-- self:ScheduleAnnounce(82, DBM_ILLIDAN_WARN_DEMONPHASE_SOON, 3)
-- end
-- self:StartStatusBarTimer(71.5, "Enrage2", "Interface\\Icons\\Ability_Warrior_EndlessRage")
-- self:ScheduleAnnounce(66.5, DBM_ILLIDAN_WARN_P4ENRAGE_SOON, 3)
-- phase4 = true
-- elseif msg == "DemonForm" then
-- flameBursts = 0
-- if self.Options.WarnDemonForm then
-- self:Announce(DBM_ILLIDAN_WARN_PHASE_DEMON, 4)
-- end
-- self:StartStatusBarTimer(74, "Normal Phase", "Interface\\Icons\\INV_Weapon_ShortBlade_07")
-- self:StartStatusBarTimer(34, "Shadow Demons", "Interface\\Icons\\Spell_Shadow_SoulLeech_3")
-- self:StartStatusBarTimer(20, "Next Flame Burst", "Interface\\Icons\\Spell_Fire_BlueRainOfFire")
-- if self.Options.WarnDemonForm then
-- self:ScheduleAnnounce(64, DBM_ILLIDAN_WARN_NORMALPHASE_SOON, 2)
-- end
-- if self.Options.WarnShadowDemons then
-- self:ScheduleAnnounce(29, DBM_ILLIDAN_WARN_SHADOWDEMSSOON, 2)
-- end
-- if self.Options.WarnFlameBursts then
-- self:ScheduleAnnounce(15, DBM_ILLIDAN_WARN_FLAMEBURST_SOON, 1)
-- end
-- self:ScheduleMethod(74, "SendSync", "NormalForm")
-- warnedDemons = nil
-- elseif msg == "NormalForm" then
-- if self.Options.WarnDemonForm then
-- self:Announce(DBM_ILLIDAN_WARN_PHASE_NORMAL, 4)
-- end
-- self:StartStatusBarTimer(60, "Demon Phase", "Interface\\Icons\\Spell_Shadow_Metamorphosis")
-- if self.Options.WarnDemonForm then
-- self:ScheduleAnnounce(50, DBM_ILLIDAN_WARN_DEMONPHASE_SOON, 3)
-- end
-- if phase4 then
-- self:StartStatusBarTimer(40, "Enrage2", "Interface\\Icons\\Ability_Warrior_EndlessRage")
-- self:ScheduleAnnounce(35, DBM_ILLIDAN_WARN_P4ENRAGE_SOON, 3)
-- end
-- elseif msg == "FlameDown" then
-- flamesDown = flamesDown + 1
-- if flamesDown >= 2 then
-- self:SendSync("Phase3")
-- end
-- elseif msg == "Flameburst" then
-- flameBursts = flameBursts + 1
-- if flameBursts < 3 then
-- self:StartStatusBarTimer(19.5, "Next Flame Burst", "Interface\\Icons\\Spell_Fire_BlueRainOfFire")
-- if self.Options.WarnFlameBursts then
-- self:ScheduleAnnounce(14.5, DBM_ILLIDAN_WARN_FLAMEBURST_SOON, 1)
-- end
-- end
-- if self.Options.WarnFlameBursts then
-- self:Announce(DBM_ILLIDAN_WARN_FLAMEBURST:format(flameBursts), 3)
-- end
-- elseif msg:sub(0, 10) == "ShadowDems" then
-- msg = msg:sub(11)
-- if msg == UnitName("player") then
-- self:AddSpecialWarning(DBM_ILLIDAN_SELFWARN_DEMONS)
-- end
-- table.insert(demonTargets, msg)
-- self:UnScheduleEvent("WarnSD")
-- if #demonTargets == 4 then
-- self:OnEvent("WarnSD")
-- else
-- self:ScheduleEvent(1, "WarnSD")
-- end
-- elseif msg == "Prison" then
-- self:Announce(DBM_ILLIDAN_WARN_PRISON)
-- self:StartStatusBarTimer(30, "Shadow Prison", "Interface\\Icons\\Spell_Shadow_SealOfKings")
-- elseif msg == "P4Enrage" then
-- self:Announce(DBM_ILLIDAN_WARN_P4ENRAGE_NOW, 4)
-- elseif msg == "Caged" then
-- self:Announce(DBM_ILLIDAN_WARN_CAGED, 1)
-- self:StartStatusBarTimer(15, "Caged", 40695)
-- end
-- end