Files
Szyler 82a9ac0937 Update to 5.21 Sunwell (#6)
* 5.20

* Update to 5.21

---------

Co-authored-by: Szyler <Szyler@Szyler.com>
2024-09-30 20:09:41 -07:00

557 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("combat", 22917)
mod:SetBossHealthInfo(22917, "Illidan Stormrage")
mod:RegisterEvents(
"SPELL_AURA_APPLIED",
"SPELL_AURA_APPLIED_DOSE",
"SPELL_CAST_START",
"SPELL_CAST_SUCCESS",
"CHAT_MSG_MONSTER_YELL",
"UNIT_DIED",
"SPELL_INTERRUPT",
"UNIT_HEALTH",
"UNIT_AURA"
)
-- General
local timerLongRPStart = mod:NewTimer(39, "Combat starting in ", 560576)
local timerShortRPStart = mod:NewTimer(3, "Combat starting in ", 560576)
local berserkTimer = mod:NewBerserkTimer(1200) -- 20 minutes
-- Stage One: You Are Not Prepared
local warnPhase1 = mod:NewAnnounce("Stage One: You Are Not Prepared", 3, 804613)
local warnDrawSoul = mod:NewSpellAnnounce(2144737)
local warnShear = mod:NewSpellAnnounce(2144715)
local warnCrash = mod:NewSpellAnnounce(2144720)
local warnBlade = mod:NewSpellAnnounce(2144742)
local warnElites = mod:NewAnnounce("New waves of Illidari Elites", 804613)
local timerShearCD = mod:NewNextTimer(30, 2144715)
local timerFlameCrash = mod:NewNextTimer(30, 2144720)
local timerDrawSoul = mod:NewNextTimer(30, 2144737)
local timerBladeCD = mod:NewNextTimer(40, 2144742)
local timerElites = mod:NewTimer(60, "Illidari Elites", 804613)
local timerChainLightning = mod:NewCastTimer(3, 2144908)
local timerChainLightningCD = mod:NewCDTimer(9, 2144908)
-- Stage Two: Flames of Azzinoth
local warnPhase2 = mod:NewAnnounce("Stage Two: Flames of Azzinoth", 3, 801892)
--Illidan Stormrage
local warnBarrage = mod:NewTargetAnnounce(2144811, 3)
local warnEyebeamTarget = mod:NewAnnounce("Eye Beam on %s!", 3, "Interface\\Icons\\ability_demonhunter_eyebeam")
local specWarnBarrage = mod:NewSpecialWarning("Shadow Barrage on >YOU!<", 2144811)
local specWarnEyebeam = mod:NewSpecialWarning("Eyebeam on >YOU!<", 2144766)
local timerNextBarrage = mod:NewNextTimer(10, 2144811)
local timerBarrage = mod:NewTargetTimer(10, 2144811)
local timerEyebeam = mod:NewTargetTimer(20, 2144816)
local timerNextEyebeam = mod:NewNextTimer(35, 2144816)
local timerLanding = mod:NewTimer(7, "Illidan is targetable", 560576)
local specWarnChaosBlast = mod:NewSpecialWarning("Chaos Blast on you", 2144803)
local warnChaosBlast = mod:NewAnnounce("Chaos Blast on %s", 2144803)
local timerCBcast = mod:NewCastTimer(2, 2144803)
-- Flame of Azzinoth
local timerFelFireBlast = mod:NewNextTimer(20, 2144780)
-- Stage Three: The Demon Within
local warnPhase3 = mod:NewAnnounce("Stage Three: The Demon Within", 3, 40506)
local warnParasite = mod:NewTargetAnnounce(2144749, 3)
local specWarnParasite = mod:NewSpecialWarning("Parasitic Shadowfiends on >YOU!<", 2144751)
local yellParasiteFades = mod:NewFadesYell(2144751)
local warnDemonSoon = mod:NewAnnounce("Demon Within soon", 40506)
local timerNextDemon = mod:NewTimer(70, "Next Demon Phase", 40506)
local timerNextParasite = mod:NewNextTimer(40, 2144749)
local timerParasite = mod:NewTargetTimer(10, 2144751)
-- [Stage Three: The Demon Within] Demon Form
local warnDemonForm = mod:NewAnnounce("Demon Form", 3, 40506)
local specWarnShadowDemon = mod:NewSpecialWarning("Switch to Shadow Demons", 2144868)
local timerShadowDemon = mod:NewNextTimer(20, 2144868)
local timerNextHuman = mod:NewTimer(60, "Next Human Phase", 560576)
local timerChaosBurst = mod:NewNextTimer(10, 2144858)
-- Stage Four: The Long Hunt
local warnPhase4 = mod:NewAnnounce("Stage Four: The Long Hunt", 3, 2144934)
local warnTrapped = mod:NewAnnounce("Illidan is trapped", 3, 5116)
local specWarnTrap = mod:NewSpecialWarning("Maiev has placed the trap!", 1499)
local timerP4RP = mod:NewTimer(33, "Enemies to Lovers RP", 2144934)
local timerHatred = mod:NewNextTimer(20, 2144761)
local timerTrap = mod:NewTimer(30, "Next Maiev Trap", 1499)
local timerStun = mod:NewTimer(15, "Illidan is trapped", 5116)
-- Stage Five: Avatar of Hatred
local warnPhase5 = mod:NewAnnounce("Stage Five: Avatar of Hatred", 3, 2145004)
local warnSoulShear = mod:NewSpellAnnounce(2145040)
local warnHateCrash = mod:NewSpellAnnounce(2145025)
local warnMadness = mod:NewSpellAnnounce(2145051)
local warnUnleash = mod:NewSpellAnnounce(2145061)
local warnStruggle = mod:NewSpellAnnounce(2145081)
local warnHateBeam = mod:NewSpellAnnounce(2145074)
local specWarnHatred = mod:NewSpecialWarning("Unleash Hatred!", 2145065)
local timerMotes = mod:NewTimer(5, "Motes of Hatres spawning", 2145072)
local timerP5RP = mod:NewTimer(49, "Illidan tranformation RP", 2145004)
local timerDyingRP = mod:NewTimer(23, "Illidan dying RP", 2145004)
local timerSoulShear = mod:NewNextTimer(35, 2145040)
local timerHateCrash = mod:NewNextTimer(35, 2145025)
local timerMadness = mod:NewNextTimer(110, 2145051)
local timerUnleash = mod:NewNextTimer(110, 2145061)
local timerNextHateBeam = mod:NewNextTimer(110, 2145074)
local timerHateBeam = mod:NewTimer(12,"Eye Beam", 2145074)
local timerStruggle = mod:NewNextTimer(110, 2145081)
local timerStruggling = mod:NewTimer(10, "Illidan is struggling", 2145081)
local ParasiteTargets = {}
local illidan = false
mod:AddBoolOption(L.ParasiteIcon)
mod.vb.flamesDown = 0
local warned_flame = false
local warned_50demon = false
local warned_10demon = false
local LongPullRP = false
local Name
local bladeCount
local crashCount
local shearCount
local EliteCD = 60
local prepared
local Struggled
local eyebeamTarget
local castEyebeam = false
local castBarrage = false
function mod:warnParasiteTargets()
warnParasite:Show(table.concat(ParasiteTargets, "<, >"))
table.wipe(ParasiteTargets)
end
local function humanForms(self)
self:Unschedule(humanForms)
timerChaosBurst:Start()
timerBladeCD:Start(15)
timerFlameCrash:Start(25)
timerNextParasite:Start(30)
timerShearCD:Start(35)
timerDrawSoul:Start(40)
timerNextDemon:Start()
end
local function phase4Start(self)
self:Unschedule(humanForms)
timerBladeCD:Start(5)
timerFlameCrash:Start(15)
timerHatred:Start()
timerShearCD:Start(25)
timerDrawSoul:Start(30)
timerParasite:Start(50)
timerNextDemon:Start(60)
timerTrap:Start()
end
local function humanHatredForms(self)
self:Unschedule(humanForms)
timerChaosBurst:Start()
timerBladeCD:Start(15)
timerFlameCrash:Start(25)
timerHatred:Start(30)
timerShearCD:Start(35)
timerDrawSoul:Start(40)
timerTrap:Start(30)
timerParasite:Start(60)
timerNextDemon:Start()
end
function mod:CancelP5timers()
timerBladeCD:Cancel()
timerFlameCrash:Cancel()
timerParasite:Cancel()
timerDrawSoul:Cancel()
timerShearCD:Cancel()
timerNextDemon:Cancel()
bladeCount = 0
end
function mod:StartP5timers()
timerBladeCD:Start(16)
timerMadness:Start(30)
timerSoulShear:Start(37)
timerHateCrash:Start(44)
timerUnleash:Start(70)
timerNextHateBeam:Start(77)
timerStruggle:Start(93)
end
function mod:EyeBeamReset()
eyebeamTarget = 0
end
function mod:ChaosBlast()
local targetCB = mod:GetBossTarget(22917)
if targetCB == UnitName("player") then
specWarnChaosBlast:Show()
SendChatMessage("Chaos Blast on "..UnitName("PLAYER").."!", "SAY")
else
warnChaosBlast:Show(targetCB)
end
timerCBcast:Start(targetCB)
self:SetIcon(targetCB, 8, 2)
end
local function illidariElites(self)
self:Unschedule(illidariElites)
if not EliteCD then EliteCD = 60 end
timerElites:Start(EliteCD or 60)
self:Schedule(EliteCD or 60, illidariElites, self)
warnElites:Show()
EliteCD = EliteCD - 5
end
local function Prepared(self)
self:Unschedule(Prepared)
prepared = true
end
function mod:OnCombatStart(delay)
illidan = true
self.vb.phase = 1
warnPhase1:Show()
eyebeamTarget = 0
castEyebeam = false
castBarrage = false
warned_50demon = false
warned_10demon = false
warned_flame = false
self.vb.flamesDown = 0
bladeCount = 0
shearCount = 0
crashCount = 0
EliteCD = 60
table.wipe(ParasiteTargets)
if LongPullRP == false or LongPullRP == nil then
self:Schedule(8, illidariElites, self)
timerElites:Start(8)
timerFlameCrash:Start(18)
timerShearCD:Start(28)
timerDrawSoul:Start(33)
timerBladeCD:Start(38)
self:Schedule(5, Prepared, self)
end
end
function mod:OnCombatEnd()
illidan = false
self:UnregisterAllEvents()
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
LongPullRP = false
prepared = false
Struggled = false
end
function mod:SPELL_CAST_START(args)
if illidan == true then
if args:IsSpellID(2144737, 2144738, 2144739, 2144740) then
warnDrawSoul:Show()
timerDrawSoul:Start()
elseif args:IsSpellID(2144868) then
specWarnShadowDemon:Show()
elseif args:IsSpellID(2144715) then -- Shear
timerShearCD:Start()
warnShear:Show()
elseif args:IsSpellID(2144720, 2144721, 2144722, 2144723) then -- Flame Crash
timerFlameCrash:Start()
warnCrash:Show()
elseif args:IsSpellID(2144742, 2145015) then
if bladeCount >= 1 and self.vb.phase == 3 then
timerBladeCD:Start()
warnBlade:Show()
bladeCount = bladeCount + 1
elseif bladeCount >= 1 and self.vb.phase == 5 then
timerBladeCD:Start()
warnBlade:Show()
bladeCount = bladeCount + 1
elseif bladeCount >= 1 and self.vb.phase == 6 then
warnBlade:Show()
timerBladeCD:Start(75)
bladeCount = 0
elseif bladeCount == 0 and self.vb.phase == 6 then
timerBladeCD:Start(35)
warnBlade:Show()
bladeCount = bladeCount + 1
else
timerBladeCD:Start(30)
warnBlade:Show()
bladeCount = bladeCount + 1
end
elseif args:IsSpellID(2145040) then
warnSoulShear:Show()
if shearCount == 0 then
timerSoulShear:Start()
shearCount = shearCount + 1
elseif shearCount == 1 then
shearCount = 0
timerSoulShear:Start(75)
end
elseif args:IsSpellID(2145022, 2145023, 2145024, 2145025) then
warnHateCrash:Show()
if self.vb.phase == 6 and crashCount == 0 then
timerHateCrash:Start()
crashCount = crashCount + 1
elseif self.vb.phase == 6 and crashCount == 1 then
timerHateCrash:Start(74)
crashCount = 0
end
elseif args:IsSpellID(2145051,2145052) then
warnMadness:Show()
timerMadness:Start(110)
elseif args:IsSpellID(2144908) then
timerChainLightning:Start(3)
timerChainLightningCD:Start()
elseif args:IsSpellID(2145074) then
warnHateBeam:Show()
timerHateBeam:Start()
timerNextHateBeam:Start()
elseif args:IsSpellID(2144816) then
castEyebeam = true
elseif args:IsSpellID(2144803) then
self:ScheduleMethod(0.15,"ChaosBlast")
end
end
end
function mod:SPELL_INTERRUPT(args)
if illidan == true then
if args:IsSpellID(2144908) then
timerChainLightning:Cancel()
end
end
end
function mod:SPELL_AURA_APPLIED(args)
if illidan == true then
if args:IsSpellID(2144751, 2144752, 2144753, 2144754, 2144755) then
timerParasite:Start(args.destName)
if args:IsPlayer() then
specWarnParasite:Show()
yellParasiteFades:Countdown(10, 3)
end
self:UnscheduleMethod("warnParasiteTargets")
ParasiteTargets[#ParasiteTargets + 1] = args.destName
self:ScheduleMethod(0.3, "warnParasiteTargets")
if self.Options.ParasiteIcon then
if DBM:AntiSpam(10) then self:SetIcon(args.destName, 7)
elseif DBM:AntiSpam(10) then self:SetIcon(args.destName, 6)
elseif DBM:AntiSpam(10) then self:SetIcon(args.destName, 5)
elseif DBM:AntiSpam(10) then self:SetIcon(args.destName, 4)
elseif DBM:AntiSpam(10) then self:SetIcon(args.destName, 3)
end
end
timerNextParasite:Start()
end
if args:IsSpellID(2144810) then
if args.destName == args:IsPlayer() then
specWarnBarrage:Show()
SendChatMessage("Dark Barrage on "..UnitName("PLAYER").."!", "SAY")
else
warnBarrage:Show(args.destName)
end
self:SetIcon(args.destName, 7, 2)
timerBarrage:Start(args.destName)
castBarrage = true
end
if args:IsSpellID(2145061) and args.destName == "Illidan Stormrage" then
timerUnleash:Start(110)
timerMotes:Start(5)
warnUnleash:Show()
end
end
end
function mod:SPELL_AURA_REMOVED(args)
if illidan == true then
if args:IsSpellID(2144751, 2144752, 2144753, 2144754, 2144755) then
timerParasite:Stop(args.destName)
elseif args:IsSpellID(2144816) then
castEyebeam = false
elseif args:IsSpellID(2144810) then
castBarrage = false
end
end
end
function mod:UNIT_DIED(args)
if illidan == true then
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 22997 then
self.vb.flamesDown = self.vb.flamesDown + 1
if self.vb.flamesDown >= 2 then
self.vb.phase = 3
warnPhase3:Show()
bladeCount = 0
if castEyebeam == true then
local eyebeamTime = timerEyebeam:GetTime();
timerLanding:Start(eyebeamTime+7)
timerBladeCD:Start(eyebeamTime+10)
timerFlameCrash:Start(eyebeamTime+18)
timerNextParasite:Start(eyebeamTime+23)
timerShearCD:Start(eyebeamTime+28)
timerDrawSoul:Start(eyebeamTime+33)
timerNextDemon:Start(eyebeamTime+67)
elseif castBarrage == true then
local barrageTime = timerBarrage:GetTime();
timerLanding:Start(barrageTime+7)
timerBladeCD:Start(barrageTime+10)
timerFlameCrash:Start(barrageTime+18)
timerNextParasite:Start(barrageTime+23)
timerShearCD:Start(barrageTime+28)
timerDrawSoul:Start(barrageTime+33)
timerNextDemon:Start(barrageTime+67)
else
timerLanding:Start(7)
timerBladeCD:Start(10)
timerFlameCrash:Start(18)
timerNextParasite:Start(23)
timerShearCD:Start(28)
timerDrawSoul:Start(33)
timerNextDemon:Start(67)
end
end
end
if args.destName == Name then
eyebeamTarget = 0
end
end
end
function mod:CHAT_MSG_MONSTER_YELL(msg)
if msg == L.Pull or msg:find(L.Pull) then
timerLongRPStart:Start()
LongPullRP = true
self:Schedule(18, illidariElites, self)
timerElites:Start(44)
timerFlameCrash:Start(54)
timerShearCD:Start(64)
timerDrawSoul:Start(69)
timerBladeCD:Start(74)
self:Schedule(5, Prepared, self)
elseif msg == L.RealPull or msg:find(L.RealPull) and prepared == false or nil then
timerShortRPStart:Start()
elseif msg == L.Demon or msg:find(L.Demon) then
warnDemonForm:Show()
timerBladeCD:Cancel()
timerFlameCrash:Cancel()
timerParasite:Cancel()
timerDrawSoul:Cancel()
timerShearCD:Cancel()
bladeCount = 0
elseif msg == L.DemonWithinQuote or msg:find(L.DemonWithinQuote) then
timerNextHuman:Start()
timerChaosBurst:Start(10)
timerShadowDemon:Start(30)
if self.vb.phase == 3 then
self:Schedule(60, humanForms, self)
elseif self.vb.phase == 5 then
self:Schedule(60, humanHatredForms, self)
end
elseif msg == L.Phase4 or msg:find(L.Phase4) then
self.vb.phase = 4
bladeCount = 0
self:Unschedule(humanForms)
timerBladeCD:Cancel()
timerFlameCrash:Cancel()
timerShearCD:Cancel()
timerDrawSoul:Cancel()
timerNextParasite:Cancel()
timerNextHuman:Cancel()
timerNextDemon:Cancel()
timerP4RP:Start()
warnPhase4:Schedule(33)
self:Schedule(33, phase4Start, self)
elseif msg == L.MaievTrap or msg:find(L.MaievTrap) then
specWarnTrap:Show()
elseif msg == L.Trapped1 or msg == L.Trapped2 or msg == L.Trapped3 then
timerStun:Start()
warnTrapped:Show()
elseif msg == L.Phase5 or msg:find(L.Phase5) then
if mod:IsDifficulty("heroic25") then
self.vb.phase = 5
warnPhase5:Schedule(46)
timerP5RP:Start()
self:ScheduleMethod(0,"CancelP5timers")
self:ScheduleMethod(49, "StartP5timers")
else
timerDyingRP:Start()
end
end
end
function mod:UNIT_HEALTH(uId)
if illidan == true then
local cid = self:GetUnitCreatureId(uId)
if warned_50demon == false and cid == 22917 and UnitHealth(uId) / UnitHealthMax(uId) <= 0.55 then
warned_50demon = true
warnDemonSoon:Show()
elseif warned_10demon == false and cid == 22917 and UnitHealth(uId) / UnitHealthMax(uId) <= 0.15 then
warned_10demon = true
warnDemonSoon:Show()
elseif warned_flame == false and cid == 22917 and UnitHealth(uId) / UnitHealthMax(uId) <= 0.7 then
warned_flame = true
warnPhase2:Show()
self.vb.phase = 2
self:Unschedule(illidariElites)
timerBladeCD:Cancel()
timerFlameCrash:Cancel()
timerShearCD:Cancel()
timerDrawSoul:Cancel()
timerElites:Cancel()
end
end
end
function mod:UNIT_AURA(unit)
if illidan == true then
if self.vb.phase == 2 and eyebeamTarget == 0 and UnitDebuff(unit, "Betrayer's Gaze") and DBM:AntiSpam(35) then
eyebeamTarget = 1
Name = UnitName(unit)
if Name == UnitName("player") then
specWarnEyebeam:Show()
SendChatMessage("Eye Beam on "..UnitName("PLAYER").."!", "SAY")
else
warnEyebeamTarget:Show(Name)
end
timerEyebeam:Start(Name)
self:SetIcon(Name, 6, 10)
self:ScheduleMethod(10,"EyeBeamReset")
end
if UnitDebuff("Boss", "Struggle for Control") and DBM:AntiSpam(105, 3) then
warnStruggle:Show()
timerStruggling:Start()
timerStruggle:Start()
Struggled = true
end
end
end