Files
Andrew6810 39c0ed874e init
2022-10-21 06:50:13 -07:00

260 lines
7.7 KiB
Lua

local mod = DBM:NewMod("Aran", "DBM-Karazhan")
local L = mod:GetLocalizedStrings()
mod:SetRevision(("$Revision: 166 $"):sub(12, -3))
mod:SetCreatureID(16524)
mod:RegisterCombat("combat")
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8)
mod:RegisterEvents(
"SPELL_CAST_START",
"SPELL_AURA_APPLIED",
"SPELL_AURA_REMOVED",
"SPELL_CAST_SUCCESS",
"SPELL_SUMMON",
"CHAT_MSG_MONSTER_YELL",
"SPELL_PERIODIC_DAMAGE",
"CHAT_MSG_MONSTER_WHISPER"
)
local warningFlameCast = mod:NewCastAnnounce(30004, 4)
local warningArcaneCast = mod:NewCastAnnounce(29973, 4)
local warningBlizzard = mod:NewSpellAnnounce(29969, 3)
local warningElementals = mod:NewSpellAnnounce(37053, 3)
local warningChains = mod:NewTargetAnnounce(29991, 2)
local warningFlameTargets = mod:NewTargetAnnounce(29946, 4)
local warningSheepTargets = mod:NewTargetAnnounce(85273, 3)
local warningPoly = mod:NewSpellAnnounce(85273, 3)
local specWarnDontMove = mod:NewSpecialWarning("DBM_ARAN_DO_NOT_MOVE")
local specWarnArcane = mod:NewSpecialWarningRun(29973)
local specWarnBlizzard = mod:NewSpecialWarningMove(29951)
local specWarnBossShield = mod:NewSpecialWarning(L.DBM_ARAN_VULNERABLE)
local specWarnPoly = mod:NewSpecialWarning(L.VolatilePoly)
local specWarnFull = mod:NewSpecialWarning(L.ArcaneSpiral)
--local specWarnDoubleCast = mod:NewSpecialWarning(L.DoubleCast);
local timerSpecial = mod:NewTimer(30, L.timerSpecial, "Interface\\Icons\\INV_Enchant_EssenceMagicLarge")
local timerFlameCast = mod:NewCastTimer(4, 30004)
local timerArcaneExplosion = mod:NewCastTimer(10, 29973)
-- local timerBlizzadCast = mod:NewCastTimer(3.7, 29969)
local timerFlame = mod:NewBuffActiveTimer(20.5, 29946)
local timerBlizzad = mod:NewBuffActiveTimer(30, 29951)
-- local timerElementals = mod:NewBuffActiveTimer(90, 37053)
local timerChains = mod:NewTargetTimer(10, 29991)
local timerShield = mod:NewBuffActiveTimer(60, 85182)
local timerPoly = mod:NewTargetTimer(30, 85273)
local timerBoom = mod:NewTimer(5, L.ArcaneSpiralTimer, "Interface\\Icons\\spell_nature_wispsplode")
local berserkTimer = mod:NewBerserkTimer(900)
mod:AddBoolOption("WreathIcons", false)
mod:AddBoolOption("ElementalIcons", false)
mod:AddBoolOption("SheepIcons", false)
mod:AddBoolOption("MarkCurrentTarget", false)
local WreathTargets = {}
local flameWreathIcon = 7
local SheepTargets = {};
local sheepIcon = 7;
local lastTarget;
local specialAbilities = {};
local function warnFlameWreathTargets()
warningFlameTargets:Show(table.concat(WreathTargets, "<, >"))
table.wipe(WreathTargets)
flameWreathIcon = 7
end
local function warnSheepTargets()
warningSheepTargets:Show(table.concat(SheepTargets, "<, >"));
table.wipe(SheepTargets);
sheepIcon = 7;
end
function mod:UpdateSpecials(spell)
if (spell == true) then
wipe(specialAbilities);
elseif spell then
for k,v in ipairs(specialAbilities) do
if v == spell then
table.remove(specialAbilities,k);
break;
end
end
end
if (#specialAbilities == 0) then
specialAbilities = {"Blizzard","Wreath","Explosion"};
if mod:IsDifficulty("heroic10","heroic25") then
table.insert(specialAbilities,"Poly");
end
end
return table.concat(specialAbilities,"/");
end
function mod:OnCombatStart(delay)
timerSpecial:Start(11-delay,self:UpdateSpecials(true));
berserkTimer:Start(-delay)
flameWreathIcon = 7
sheepIcon = 7;
lastTarget = nil;
table.wipe(WreathTargets)
table.wipe(SheepTargets);
self.vb.phase = 1
end
function mod:SPELL_CAST_START(args)
-- if args:IsSpellID(85255, 85251, 85253) then -- Arcane Missiles, Fireball, Frostbolt
-- local destName = self:GetBossTarget();
-- if destName then
-- if self.Options.MarkCurrentTarget then
-- self:SetIcon(destName, 8);
-- end
-- if lastTarget and (destName == lastTarget) then
-- specWarnDoubleCast:Show(args.spellName);
-- end
-- lastTarget = destName;
-- end
if args:IsSpellID(30004) then
warningFlameCast:Show()
timerFlameCast:Start()
timerSpecial:Start(35,self:UpdateSpecials("Wreath"))
elseif args:IsSpellID(29973, 85436) then
warningArcaneCast:Show()
timerArcaneExplosion:Start()
specWarnArcane:Show()
timerSpecial:Start(35,self:UpdateSpecials("Explosion"))
elseif args:IsSpellID(85273) then
specWarnPoly:Show()
timerSpecial:Start(35,self:UpdateSpecials("Poly"))
-- elseif args:IsSpellID(29969) then - deprecated, Ascension's Aran doesn't use CAST_START for Blizzard.
-- warningBlizzard:Show()
-- timerBlizzadCast:Show()
-- timerBlizzad:Schedule(3.7)--may need tweaking
-- timerSpecial:Start()
end
end
function mod:SPELL_AURA_APPLIED(args)
if args:IsSpellID(29991) then
warningChains:Show(args.destName)
timerChains:Start(args.destName)
elseif args:IsSpellID(29946) then
WreathTargets[#WreathTargets + 1] = args.destName
timerFlame:Start()
if args:IsPlayer() then
specWarnDontMove:Show()
end
if self.Options.WreathIcons then
self:SetIcon(args.destName, flameWreathIcon, 20)
flameWreathIcon = flameWreathIcon - 1
end
self:Unschedule(warnFlameWreathTargets)
self:Schedule(0.3, warnFlameWreathTargets)
elseif args:IsSpellID(85182) then
timerShield:Start()
specWarnBossShield:Schedule(60)
timerSpecial:Cancel()
self.vb.phase = 2
elseif args:IsSpellID(85273) then -- Volatile Polymorph
--warningPoly:Show(args.destName)
SheepTargets[#SheepTargets + 1] = args.destName;
timerPoly:Start(args.destName);
if self.Options.SheepIcons then
self:SetIcon(args.destName, sheepIcon, 12);
sheepIcon = sheepIcon - 1;
end
self:Unschedule(warnSheepTargets);
if (self:IsDifficulty("heroic10") and (#SheepTargets >= 5)) then
self:Schedule(0, warnSheepTargets);
else
self:Schedule(0.3, warnSheepTargets);
end
elseif args:IsSpellID(29963) then
if args:IsPlayer() then
local elapsed, total = timerSpecial:GetTime(self:UpdateSpecials());
timerSpecial:Update(elapsed, total+10, self:UpdateSpecials());
end
end
end
function mod:SPELL_AURA_REMOVED(args)
if args:IsSpellID(29991) then
timerChains:Cancel(args.destName)
elseif args:IsSpellID(85273) then -- Volatile Polymorph
timerPoly:Cancel(args.destName);
if self.Options.SheepIcons then
self:RemoveIcon(args.destName);
end
end
end
function mod:CHAT_MSG_MONSTER_WHISPER(msg)
if msg == L.DBM_ARAN_FULL then
specWarnFull:Show()
timerBoom:Start()
end
end
function mod:CHAT_MSG_MONSTER_YELL(msg)
if (msg == L.DBM_ARAN_BLIZZARD_1) or (msg == L.DBM_ARAN_BLIZZARD_2) then
warningBlizzard:Show()
timerBlizzad:Start()
timerSpecial:Start(35,self:UpdateSpecials("Blizzard"))
end
end
do
local elementalIcon = {}
local currentIcon = 1
local iconsSet = 0
local function resetElementalIconState()
table.wipe(elementalIcon)
currentIcon = 1
iconsSet = 0
end
local lastElemental = 0
function mod:SPELL_SUMMON(args)
if args:IsSpellID(29962, 37051, 37052, 37053) then -- Summon Water elementals
if time() - lastElemental > 5 then
warningElementals:Show()
-- timerElementals:Show()
lastElemental = time()
if self.Options.ElementalIcons then
resetElementalIconState()
end
end
if self.Options.ElementalIcons then
elementalIcon[args.destGUID] = currentIcon
currentIcon = currentIcon + 1
end
end
end
mod:RegisterOnUpdateHandler(function(self)
if self.Options.ElementalIcons and (DBM:GetRaidRank() > 0 and not iconsSet == 4) then
for i = 1, GetNumRaidMembers() do
local uId = "raid"..i.."target"
local guid = UnitGUID(uId)
if beastIcon[guid] then
SetRaidTarget(uId, elementalIcon[guid])
iconsSet = iconsSet + 1
elementalIcon[guid] = nil
end
end
end
end, 1)
end
do
local lastBlizzard = 0
function mod:SPELL_PERIODIC_DAMAGE(args)
if args:IsSpellID(29951, 85250) and args:IsPlayer() and GetTime() - lastBlizzard > 2 then
specWarnBlizzard:Show()
lastBlizzard = GetTime()
end
end
end