Files
coa-dbm/DBM-TheEye/Alar.lua
T
Andrew6810 39c0ed874e init
2022-10-21 06:50:13 -07:00

295 lines
9.6 KiB
Lua

local mod = DBM:NewMod("Alar", "DBM-TheEye", 1)
local L = mod:GetLocalizedStrings()
mod:SetRevision(("$Revision: 132 $"):sub(12, -3))
mod:SetCreatureID(19514)
mod:RegisterCombat("combat", 19551)
-- mod:RegisterKill("yell", L.NeverHappen) --There is no yell. Just abusing it so DBM doesnt end combat when al'ar dies in between Phases
mod:SetWipeTime(25)
mod:RegisterEvents(
"SPELL_AURA_APPLIED",
"SPELL_AURA_APPLIED_DOSE",
"SPELL_AURA_REFRESH",
"SPELL_AURA_REMOVED",
"SPELL_CAST_START",
"SPELL_CAST_SUCCESS",
"CHAT_MSG_RAID_BOSS_EMOTE",
"UNIT_DIED"
)
-- local warn
local warnEmber = mod:NewAnnounce("WarnEmber", 2, 2135208)
-- local warnDive = mod:NewAnnounce("WarnDive", 2, "Interface\\Icons\\Spell_Fire_Fireball02")
local warnDive = mod:NewSpecialWarningRun(2135164)
local warnAlarRebirth = mod:NewSpellAnnounce(2135200, 4) --Heroic 2135201, Ascended 10Man-2135202, 25Man-2135203
local warnFlameCascade = mod:NewSpellAnnounce(2135190, 3)
local specWarnFeather = mod:NewSpecialWarning("SpecWarnFeather")
local specWarnGround = mod:NewSpecialWarningYou(2135186)
local warnFlameBreath = mod:NewAnnounce(L.FlameBreath, 2, 2135155)
-- local timer
local timerNextPlatform = mod:NewTimer(30, "NextPlatform", "Interface\\AddOns\\DBM-Core\\textures\\CryptFiendBurrow.blp") -- timer might be slightly off need to test in action
local berserkTimer = mod:NewTimer(720, "Berserk", 26662)
local timerAlarUp = mod:NewTimer(30, "AlarUp", "Interface\\Icons\\Spell_Fire_Fireball02")
local timerAlarDive = mod:NewTimer(14, "AlarDive", "Interface\\Icons\\Spell_Fire_Fireball02")
local timerEmberSpawn = mod:NewTimer(12, "TimerEmberSpawn", 2135208) --heroic 2135209 , Ascended 10Man-2135210, 25Man-2135211
local timerNextBreath = mod:NewNextTimer(10, 2135154) --Heroic 2135155 , Ascended 10Man-2135156, 25Man-2135157
local timerNextAlarRebirth = mod:NewNextTimer(10, 2135200)
local timerNextFlameCascade = mod:NewNextTimer(60, 2135190)
local timerFlameCascade = mod:NewBuffActiveTimer(17, 2135190)
--Ascended mechanics:
local yellLivingBomb = mod:NewFadesYell(2135176)
mod:AddBoolOption(L.LivingBombYellOpt, true)
-- local variables
-- local options
mod.vb.phase = 1
function mod:PlatformSwap()
self:UnscheduleMethod("PlatformSwap")
timerEmberSpawn:Start()
warnEmber:Schedule(12)
timerNextPlatform:Start(32)
self:ScheduleMethod(32, "PlatformSwap")
end
function mod:OnCombatStart(delay)
berserkTimer:Start(-delay)
timerNextPlatform:Start(-delay)
self:ScheduleMethod(32-delay, "PlatformSwap")
timerNextBreath:Start(-delay)
end
function mod:SPELL_AURA_APPLIED(args)
if args:IsSpellID(2135190) then
timerFlameCascade:Start()
timerEmberSpawn:Cancel()
warnFlameCascade:Show()
elseif args:IsSpellID(2135186, 2135187, 2135188, 2135189) and args:IsPlayer() then
specWarnGround:Show()
elseif args:IsSpellID(2135174) and args:IsPlayer() then
specWarnFeather:Schedule(45)
elseif args:IsSpellID(2135154, 2135155, 2135156, 2135157) then --Flame Breath debuffs on tanks
warnFlameBreath:Show(args.spellName, args.destName, args.amount or 1)
elseif args:IsSpellID(2135176, 2135177, 2135178, 2135179) and self.Options.LivingBombYellOpt and args:IsPlayer() then
SendChatMessage("Living Bomb on "..args.destName.."!", "YELL")
yellLivingBomb:Countdown(12)
end
end
function mod:SPELL_AURA_APPLIED_DOSE(args)
if args:IsSpellID(2135154, 2135155, 2135156, 2135157) then
warnFlameBreath:Show(args.spellName, args.destName, args.amount or 1)
end
end
function mod:SPELL_AURA_REFRESH(args)
if args:IsSpellID(2135174) and args:IsPlayer() then
self:Unschedule(specWarnFeather)
specWarnFeather:Schedule(45)
end
end
function mod:SPELL_AURA_REMOVED(args)
if args:IsSpellID(2135190) then
timerEmberSpawn:Start(11)
timerNextFlameCascade:Start()
end
end
function mod:SPELL_CAST_SUCCESS(args)
if args:IsSpellID(2135154, 2135155, 2135156, 2135157) and self.vb.phase ~= 3 then
timerNextBreath:Start()
elseif args:IsSpellID(2135196, 2135197, 2135198, 2135199) then
if self.vb.phase == 1 then
self.vb.phase = 2
timerEmberSpawn:Stop()
timerAlarUp:Start(40)
timerNextBreath:Stop()
timerNextPlatform:Stop()
self:UnscheduleMethod("PlatformSwap")
elseif self.vb.phase == 2 then
self.vb.phase = 3
timerNextBreath:Stop()
timerEmberSpawn:Stop()
timerAlarUp:Stop()
end
elseif args:IsSpellID(2135190) then
timerEmberSpawn:Start()
timerNextFlameCascade:Start()
end
end
function mod:SPELL_CAST_START(args)
if args:IsSpellID(2135200, 2135201, 2135202, 2135203) then
warnAlarRebirth:Show()
timerNextBreath:Start(2)
if self.vb.phase == 2 then
timerAlarUp:Start(33)
timerNextBreath:Start(18)
end
elseif args:IsSpellID(2135208, 2135209, 2135210, 2135211) then
warnEmber:Show()
self:SetIcon(args.sourceName, 5, 30)
if self.vb.phase == 1 then
timerEmberSpawn:Start(45) -- 45 sec unless boss goes into the air
elseif self.vb.phase == 3 then
timerEmberSpawn:Start(12)
end
end
end
function mod:CHAT_MSG_RAID_BOSS_EMOTE(msg)
if msg == L.EmoteAlarUp or msg:find(L.EmoteAlarUp) then
timerNextBreath:Stop()
timerAlarDive:Start()
timerEmberSpawn:Start(24)
warnDive:Schedule(14)
timerAlarUp:Start()
elseif msg == L.EmotePhase3 or msg:find(L.EmotePhase3) then
timerAlarUp:Stop()
timerEmberSpawn:Start(22)
timerNextFlameCascade:Start()
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 19514 then
if self.vb.phase == 1 then
self.vb.phase = 2
mod:IsInCombat()
mod.inCombat = true
timerNextAlarRebirth:Start()
elseif self.vb.phase == 2 then
self.vb.phase = 3
end
end
end
-- Old Alar code
-- Alar:RegisterEvents(
-- "SPELL_AURA_APPLIED"
-- );
-- Alar:AddOption("WarnArmor", true, DBM_ALAR_OPTION_MELTARMOR);
-- Alar:AddOption("Meteor", true, DBM_ALAR_OPTION_METEOR);
-- Alar:AddBarOption("Enrage")
-- Alar:AddBarOption("Meteor")
-- Alar:AddBarOption("Melt Armor: (.*)")
-- function Alar:OnCombatStart(delay)
-- self:ScheduleSelf(10, "CheckForAlar"); -- to prevent bugs if you are using an unsupported client language...
-- end
-- function Alar:OnEvent(event, arg1)
-- if event == "CheckForAlar" then
-- for i = 1, GetNumRaidMembers() do
-- if UnitName("raid"..i.."target") == DBM_ALAR_NAME and UnitAffectingCombat("raid"..i.."target") then
-- warnPhase = true;
-- break;
-- end
-- end
-- if not warnPhase then
-- langError = true;
-- end
-- elseif event == "SPELL_AURA_APPLIED" then
-- if arg1.spellId == 35383 and arg1.destName == UnitName("player") then
-- self:AddSpecialWarning(DBM_ALAR_WARN_FIRE);
-- elseif arg1.spellId == 35410 then
-- self:SendSync("MeltArmor"..tostring(arg1.destName));
-- end
-- elseif event == "MeteorSoon" then
-- if self.Options.Meteor then
-- self:Announce(DBM_ALAR_WARN_METEOR_SOON, 1);
-- end
-- elseif event == "EnrageWarn" and type(arg1) == "number" then
-- if arg1 >= 60 then
-- self:Announce(string.format(DBM_ALAR_WARN_ENRAGE, (arg1/60), DBM_MIN), 1);
-- else
-- self:Announce(string.format(DBM_ALAR_WARN_ENRAGE, arg1, DBM_SEC), 3);
-- end
-- end
-- end
-- function Alar:OnSync(msg)
-- if msg == "Rebirth" and not self:IsWipe() and self.InCombat then
-- self:Announce(DBM_ALAR_WARN_REBIRTH, 2);
-- self:EndStatusBarTimer("Next Platform");
-- self:ScheduleSelf(47, "MeteorSoon");
-- self:StartStatusBarTimer(52, "Meteor", "Interface\\Icons\\Spell_Fire_Fireball02");
-- self:StartStatusBarTimer(600, "Enrage", "Interface\\Icons\\Spell_Shadow_UnholyFrenzy");
-- self:ScheduleSelf(300, "EnrageWarn", 300);
-- self:ScheduleSelf(480, "EnrageWarn", 120);
-- self:ScheduleSelf(540, "EnrageWarn", 60);
-- self:ScheduleSelf(570, "EnrageWarn", 30);
-- self:ScheduleSelf(590, "EnrageWarn", 10);
-- elseif string.sub(msg, 0, 9) == "MeltArmor" then
-- local target = string.sub(msg, 10);
-- if target then
-- if self:GetStatusBarTimerTimeLeft("Melt Armor: "..target) then
-- self:UpdateStatusBarTimer("Melt Armor: "..target, 0, 60);
-- else
-- self:StartStatusBarTimer(60, "Melt Armor: "..target, "Interface\\Icons\\Spell_Fire_Immolation");
-- end
-- if self.Options.WarnArmor then
-- self:Announce(DBM_ALAR_WARN_MELTARMOR:format(target), 1);
-- end
-- end
-- elseif msg == "AddInc" and (GetTime() - lastAdd) > 15 and self.InCombat then
-- lastAdd = GetTime();
-- flying = true;
-- self:EndStatusBarTimer("Next Platform");
-- self:Announce(DBM_ALAR_WARN_ADD, 2);
-- elseif msg == "Meteor" and (GetTime() - lastMeteor) > 30 and self.InCombat then
-- lastMeteor = GetTime();
-- if self.Options.Meteor then
-- self:Announce(DBM_ALAR_WARN_METEOR, 3);
-- end
-- self:ScheduleSelf(49, "MeteorSoon");
-- self:StartStatusBarTimer(54.5, "Meteor", "Interface\\Icons\\Spell_Fire_Fireball02");
-- elseif msg == "NextPlatform" and self.InCombat then
-- end
-- end
-- function Alar:OnUpdate(elapsed)
-- if self.InCombat and not langError and not self:IsWipe() then
-- local foundIt;
-- local target;
-- for i = 1, GetNumRaidMembers() do
-- if UnitName("raid"..i.."target") == DBM_ALAR_NAME then
-- foundIt = true;
-- target = UnitName("raid"..i.."targettarget");
-- if not target and UnitCastingInfo("raid"..i.."target") == DBM_ALAR_FLAME_BUFFET then
-- target = "Dummy";
-- end
-- break;
-- end
-- end
-- if not foundIt and warnPhase then
-- self:SendSync("Rebirth");
-- end
-- if foundIt and not target and not phase2 then
-- self:SendSync("AddInc");
-- elseif not target and type(phase2) == "number" and (GetTime() - phase2) > 25 then
-- self:SendSync("Meteor");
-- elseif target and flying then
-- self:SendSync("NextPlatform");
-- end
-- end
-- end