dc8afd6584
Co-authored-by: Szyler <Szyler@Szyler.com>
352 lines
11 KiB
Lua
352 lines
11 KiB
Lua
local mod = DBM:NewMod("Vashj", "DBM-Serpentshrine")
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision(("$Revision: 183 $"):sub(12, -3))
|
|
mod:SetCreatureID(21212)
|
|
mod:RegisterCombat("combat", 21212)
|
|
mod:SetUsedIcons(6,8)
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEvents(
|
|
"SPELL_AURA_APPLIED",
|
|
"SPELL_AURA_REMOVED",
|
|
"SPELL_CAST_START",
|
|
"SPELL_CAST_SUCCESS",
|
|
"UNIT_DIED",
|
|
"CHAT_MSG_MONSTER_YELL",
|
|
"CHAT_MSG_LOOT",
|
|
"CHAT_MSG_RAID_BOSS_EMOTE",
|
|
"UNIT_AURA"
|
|
)
|
|
|
|
local warnPhase2 = mod:NewPhaseAnnounce(2)
|
|
local warnPhase3 = mod:NewPhaseAnnounce(3)
|
|
local warnCharge = mod:NewTargetAnnounce(2138039, 4)
|
|
local warnEnvenom = mod:NewTargetAnnounce(2138049, 3)
|
|
local warnAimedShot = mod:NewTargetAnnounce(2138044, 4)
|
|
local warnMulti = mod:NewSpellAnnounce(2138011, 3)
|
|
local WarnHeal = mod:NewSpellAnnounce(2138024, 3)
|
|
local warnSporebat = mod:NewAnnounce("WarnSporebat", 3, "Interface\\Icons\\Ability_Hunter_Pet_Sporebat")
|
|
local warnElemental = mod:NewAnnounce("WarnElemental", 4, "Interface\\Icons\\Spell_Frost_SummonWaterElemental_2")
|
|
local warnHydra = mod:NewAnnounce("WarnHydra", 3, "Interface\\Icons\\achievement_boss_bazil_akumai")
|
|
local warnNaga = mod:NewAnnounce("WarnNaga", 3, "Interface\\Icons\\achievement_boss_warlord_kalithresh")
|
|
local warnEnchantress = mod:NewAnnounce("WarnEnchantress", 3, "Interface\\Icons\\Spell_Holy_FlashHeal")
|
|
local warnLoot = mod:NewAnnounce("WarnLoot", 3, "Interface\\Icons\\Spell_Nature_ElementalShields")
|
|
local warnPhoenix = mod:NewAnnounce("WarnPhoenix", 3, "Interface\\Icons\\INV_Misc_PheonixPet_01")
|
|
|
|
local specWarnCharge = mod:NewSpecialWarningMove(2138039)
|
|
local specWarnDischarge = mod:NewSpecialWarningMove(2138020)
|
|
local specWarnToxic = mod:NewSpecialWarningMove(2138035)
|
|
|
|
local timerCharge = mod:NewNextTimer(30, 2138039)
|
|
local timerAimedShot = mod:NewNextTimer(30, 2138045)
|
|
local timerMulti = mod:NewNextTimer(15, 2138011)
|
|
local timerEnvenom = mod:NewNextTimer(30, 2138049)
|
|
local timerMark = mod:NewTargetTimer(6, 2138044)
|
|
local timerChargeDmg = mod:NewTimer(8, "ChargeExplosion", 2138040)
|
|
|
|
local timerBreath = mod:NewNextTimer(10, 2138076)
|
|
local timerElementalCD = mod:NewTimer(65, "TimerElemental", "Interface\\Icons\\Spell_Frost_SummonWaterElemental_2")--75-82 variation. because of high variation the pre warning special warning not useful, fortunately we can detect spawns with precise timing.
|
|
local timerHydra = mod:NewTimer(95, "TimerHydra", "INTERFACE\\ICONS\\Achievement_ZG_Gahz")
|
|
local timerNaga = mod:NewTimer(49, "TimerNaga", "Interface\\Icons\\achievement_boss_warlord_kalithresh")
|
|
local timerEnchantress = mod:NewTimer(47, "TimerEnchantress", "Interface\\Icons\\Spell_Holy_FlashHeal")
|
|
local timerGenerator = mod:NewTimer(30, "NextGenerator", "Interface\\Icons\\Spell_Nature_LightningOverload")
|
|
local timerDischarge = mod:NewTimer(9, "Discharge", "Interface\\Icons\\Spell_Nature_LightningOverload")
|
|
local timerSporebat = mod:NewTimer(23, "NextSporebat", "Interface\\Icons\\Ability_Hunter_Pet_Sporebat")
|
|
|
|
-- Ascended Mechanics
|
|
|
|
local timerParasite = mod:NewNextTimer(45, 2138027)
|
|
local timerSiren = mod:NewNextTimer(17, 2138025)
|
|
local timerPhoenix = mod:NewNextTimer(16, 2138015)
|
|
|
|
local warnParasite = mod:NewTargetAnnounce(2138027, 3)
|
|
local yellParasite = mod:NewFadesYell(2138027)
|
|
local warnSong = mod:NewTargetAnnounce(2138026, 3)
|
|
|
|
local specWarnSiren = mod:NewSpecialWarning("SpecWarnSiren")
|
|
|
|
local berserkTimer = mod:NewBerserkTimer(900)
|
|
|
|
mod:AddBoolOption("RangeFrame", true)
|
|
mod:AddBoolOption(L.LootIcon)
|
|
mod:AddBoolOption(L.AimedIcon)
|
|
mod:AddBoolOption(L.ChargeYellOpt)
|
|
mod:AddBoolOption(L.AimedYellOpt)
|
|
mod:AddBoolOption(L.LootYellOpt)
|
|
mod:AddBoolOption(L.ParasiteYellOpt)
|
|
mod:AddBoolOption("AutoChangeLootToFFA", false)
|
|
|
|
mod.vb.phase = 1
|
|
mod.vb.nagaCount = 1
|
|
mod.vb.elementalCount = 1
|
|
local lootmethod
|
|
local ChargeTargets = {}
|
|
local BatCD = 24;
|
|
local lastTriggerTime = 0;
|
|
local TaintedCoreTarget;
|
|
|
|
|
|
function mod:HydraSpawn()
|
|
timerHydra:Stop()
|
|
warnHydra:Show()
|
|
timerHydra:Start()
|
|
end
|
|
|
|
function mod:NagaSpawn()
|
|
timerNaga:Stop()
|
|
warnNaga:Show(tostring(mod.vb.nagaCount))
|
|
timerNaga:Start(nil, tostring(mod.vb.nagaCount))
|
|
mod.vb.nagaCount = mod.vb.nagaCount + 1
|
|
end
|
|
|
|
function mod:EnchantressSpawn()
|
|
timerEnchantress:Stop()
|
|
warnEnchantress:Show()
|
|
timerEnchantress:Start()
|
|
self:ScheduleMethod(47,"EnchantressSpawn")
|
|
end
|
|
|
|
function mod:TaintedSpawn()
|
|
timerElementalCD:Stop()
|
|
warnElemental:Show(tostring(mod.vb.elementalCount))
|
|
mod.vb.elementalCount = mod.vb.elementalCount + 1
|
|
end
|
|
|
|
local function warnChargeTargets()
|
|
warnCharge:Show(table.concat(ChargeTargets, "<, >"))
|
|
timerCharge:Start()
|
|
timerChargeDmg:Start()
|
|
table.wipe(ChargeTargets)
|
|
end
|
|
|
|
function mod:SporebatSpawn()
|
|
BatCD = BatCD - 1
|
|
if BatCD <= 2 then -- Toxic Sporebat CD is capped at 2 seconds, it does not decay below that.
|
|
BatCD = 2
|
|
end
|
|
timerSporebat:Start(BatCD)
|
|
warnSporebat:Show()
|
|
self:ScheduleMethod(BatCD,"SporebatSpawn")
|
|
end
|
|
|
|
|
|
function mod:OnCombatStart(delay)
|
|
mod.vb.phase = 1
|
|
mod.vb.nagaCount = 1
|
|
mod.vb.elementalCount = 1
|
|
if mod:IsDifficulty("heroic10", "heroic25") then
|
|
timerMulti:Start(22-delay)
|
|
timerEnvenom:Start(19-delay)
|
|
timerAimedShot:Start(25-delay)
|
|
timerCharge:Start(10-delay)
|
|
timerParasite:Start(40-delay)
|
|
else
|
|
timerMulti:Start(22-delay)
|
|
timerEnvenom:Start(19-delay)
|
|
timerAimedShot:Start(25-delay)
|
|
timerCharge:Start(10-delay)
|
|
end
|
|
if DBM:GetRaidRank() == 2 then
|
|
lootmethod = GetLootMethod()
|
|
end
|
|
berserkTimer:Start(-delay)
|
|
table.wipe(ChargeTargets)
|
|
end
|
|
|
|
function mod:OnCombatEnd()
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
if self.Options.AutoChangeLootToFFA and DBM:GetRaidRank() == 2 then
|
|
if lootmethod then
|
|
SetLootMethod(lootmethod)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
if args:IsSpellID(2138039) then
|
|
ChargeTargets[#ChargeTargets + 1] = args.destName
|
|
self:Unschedule(warnChargeTargets)
|
|
self:Schedule(0.3, warnChargeTargets)
|
|
if args:IsPlayer() then
|
|
specWarnCharge:Show()
|
|
if self.Options.ChargeYellOpt and args:IsPlayer() then
|
|
SendChatMessage(L.ChargeYell, "YELL")
|
|
end
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
if mod:IsDifficulty("heroic10", "heroic25") then
|
|
timerCharge:Start(45)
|
|
else
|
|
timerCharge:Start()
|
|
end
|
|
elseif args:IsSpellID(2138013) then
|
|
warnAimedShot:Show(args.destName)
|
|
timerMark:Start(args.destName)
|
|
if mod:IsDifficulty("heroic10", "heroic25") then
|
|
timerAimedShot:Start(45)
|
|
else
|
|
timerAimedShot:Start()
|
|
end
|
|
if self.Options.AimedYellOpt and args:IsPlayer() then
|
|
SendChatMessage(L.AimedYell, "YELL")
|
|
end
|
|
if self.Options.AimedIcon then
|
|
self:SetIcon(args.destName, 8, 6)
|
|
end
|
|
elseif args:IsSpellID(38132) then
|
|
if self.Options.LootIcon then
|
|
self:SetIcon(args.destName, 6)
|
|
end
|
|
elseif args:IsSpellID(2138024) and (GetTime() - lastTriggerTime) >= 35 then
|
|
lastTriggerTime = GetTime()
|
|
self:UnscheduleMethod("EnchantressSpawn")
|
|
self:EnchantressSpawn()
|
|
elseif args:IsSpellID(2138027, 2138028, 2138029, 2138030) then
|
|
warnParasite:Show(args.destName)
|
|
timerParasite:Start()
|
|
if args:IsPlayer() and self.Options.ParasiteYellOpt then
|
|
yellParasite:Countdown(8,5)
|
|
end
|
|
elseif args:IsSpellID(2138031, 2138032, 2138033, 2138034) then
|
|
warnParasite:Show(args.destName)
|
|
if args:IsPlayer() and self.Options.ParasiteYellOpt then
|
|
yellParasite:Countdown(16,5)
|
|
end
|
|
elseif args.spellId == 2138026 then
|
|
warnSong:Show(args.destName)
|
|
specWarnSiren:Show()
|
|
elseif args:IsSpellID(2138035, 2138036, 2138037, 2138038) and args:IsPlayer() then
|
|
specWarnToxic:Show()
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
if args:IsSpellID(2138039, 351307) then
|
|
timerChargeDmg:Stop(args.destName)
|
|
if self.Options.ChargeIcon then
|
|
self:SetIcon(args.destName, 0)
|
|
end
|
|
if args:IsPlayer() then
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
end
|
|
elseif args:IsSpellID(38132) then
|
|
if self.Options.LootIcon then
|
|
self:SetIcon(args.destName, 0)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
if args.spellId == 2138011 then
|
|
warnMulti:Show()
|
|
timerMulti:Start()
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_PERIODIC_HEAL(args)
|
|
if args.spellId == 2138024 then
|
|
warnHeal:Show()
|
|
end
|
|
end
|
|
|
|
function mod:CHAT_MSG_RAID_BOSS_EMOTE(msg)
|
|
if msg == L.DBM_VASHJ_DISCHARGE or msg:find(L.DBM_VASHJ_DISCHARGE) then
|
|
timerDischarge:Start()
|
|
specWarnDischarge:Show()
|
|
if mod.vb.phase == 2 and mod:IsDifficulty("heroic10", "heroic25") then
|
|
timerSiren:Start()
|
|
elseif mod.vb.phase == 3 then
|
|
timerGenerator:Start()
|
|
end
|
|
elseif msg == L.DBM_VASHJ_ELITE or msg:find(L.DBM_VASHJ_ELITE) then
|
|
self:NagaSpawn()
|
|
elseif msg == L.DBM_VASHJ_HYDRA or msg:find(L.DBM_VASHJ_HYDRA) then
|
|
self:HydraSpawn()
|
|
elseif msg == L.DBM_VASHJ_TAINTED or msg:find(L.DBM_VASHJ_TAINTED) then
|
|
self:TaintedSpawn()
|
|
elseif msg == L.DBM_VASHJ_TAINTED_DEAD or msg:find(L.DBM_VASHJ_TAINTED_DEAD) then
|
|
timerElementalCD:Start(nil, tostring(mod.vb.elementalCount))
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
|
if args:IsSpellID(2138049, 2138050, 2138051, 2138052) then
|
|
warnEnvenom:Show(args.destName)
|
|
timerEnvenom:Start()
|
|
elseif args.spellID == 2138025 then
|
|
specWarnSiren:Show()
|
|
elseif args:IsSpellID(2138000, 2138001, 2138002, 2138003) then
|
|
timerPhoenix:Start()
|
|
warnPhoenix:Show()
|
|
elseif args:IsSpellID(2138076) then
|
|
if timerDischarge:GetTime() == 0 then
|
|
timerBreath:Start()
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:CHAT_MSG_MONSTER_YELL(msg)
|
|
if msg == L.DBM_VASHJ_YELL_PHASE2 or msg:find(L.DBM_VASHJ_YELL_PHASE2) then
|
|
timerMulti:Cancel()
|
|
timerEnvenom:Cancel()
|
|
timerAimedShot:Cancel()
|
|
timerCharge:Cancel()
|
|
mod.vb.phase = 2
|
|
mod.vb.nagaCount = 1
|
|
mod.vb.elementalCount = 1
|
|
warnPhase2:Show()
|
|
timerNaga:Start(13, tostring(mod.vb.nagaCount))
|
|
timerEnchantress:Start(25)
|
|
timerElementalCD:Start()
|
|
timerHydra:Start(35)
|
|
if self.Options.AutoChangeLootToFFA and DBM:GetRaidRank() == 2 then
|
|
SetLootMethod("freeforall")
|
|
end
|
|
elseif (msg == L.DBM_VASHJ_YELL_PHASE3 or msg:find(L.DBM_VASHJ_YELL_PHASE3)) and mod.vb.phase == 2 then
|
|
mod.vb.phase = 3
|
|
warnPhase3:Show()
|
|
timerNaga:Cancel()
|
|
warnNaga:Cancel()
|
|
timerElementalCD:Cancel()
|
|
warnElemental:Cancel()
|
|
timerHydra:Cancel()
|
|
timerEnchantress:Cancel()
|
|
warnEnchantress:Cancel()
|
|
warnHydra:Cancel()
|
|
self:UnscheduleMethod("NagaSpawn")
|
|
self:UnscheduleMethod("EnchantressSpawn")
|
|
self:UnscheduleMethod("TaintedSpawn")
|
|
self:UnscheduleMethod("HydraSpawn")
|
|
self:ScheduleMethod(10, "SporebatSpawn")
|
|
timerSporebat:Start(10)
|
|
if mod:IsDifficulty("heroic10", "heroic25") then
|
|
timerPhoenix:Start(60)
|
|
timerGenerator:Start(25)
|
|
timerCharge:Start(15)
|
|
else
|
|
timerGenerator:Start(25)
|
|
timerCharge:Start(15)
|
|
end
|
|
if self.Options.AutoChangeLootToFFA and DBM:GetRaidRank() == 2 then
|
|
if lootmethod then
|
|
SetLootMethod(lootmethod)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:UNIT_AURA(unit)
|
|
local name = UnitName(unit);
|
|
if (name ~= TaintedCoreTarget) and UnitDebuff(unit,"Tainted Core") then
|
|
TaintedCoreTarget = name;
|
|
warnLoot:Show(name)
|
|
end
|
|
end |