You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
12 KiB

local mod = DBM:NewMod(2502, "DBM-VaultoftheIncarnates", nil, 1200)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20230314030911")
mod:SetCreatureID(189813)
mod:SetEncounterID(2635)
mod:SetUsedIcons(8, 7, 6, 5, 4)
mod:SetHotfixNoticeRev(20221215000000)
mod:SetMinSyncRevision(20221014000000)
--mod.respawnTime = 29
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 387849 388302 376943 388410 375580 387943 385812 384273 387627 391382 395501",
-- "SPELL_CAST_SUCCESS",
"SPELL_SUMMON 387857",
"SPELL_AURA_APPLIED 391686 375580",
"SPELL_AURA_APPLIED_DOSE 375580",
-- "SPELL_AURA_REMOVED",
-- "SPELL_PERIODIC_DAMAGE",
-- "SPELL_PERIODIC_MISSED",
"UNIT_DIED",
"UNIT_SPELLCAST_SUCCEEDED boss1"
)
--[[
(ability.id = 387849 or ability.id = 388302 or ability.id = 376943 or ability.id = 388410 or ability.id = 375580) and type = "begincast"
or ability.id = 391600 and type = "cast" and source.id = 189813
--]]
--Dathea, Ascended
mod:AddTimerLine(DBM_COMMON_L.BOSS)
local warnMarkCast = mod:NewCountAnnounce(391686, 3)
local warnRagingBurst = mod:NewCountAnnounce(388302, 3, nil, nil, 86189)
local warnZephyrSlam = mod:NewStackAnnounce(375580, 2, nil, "Tank|Healer")
local specWarnCoalescingStorm = mod:NewSpecialWarningCount(387849, nil, nil, nil, 2, 2)
local specWarnConductiveMark = mod:NewSpecialWarningMoveAway(391686, nil, nil, nil, 1, 2)
local yellConductiveMark = mod:NewYell(391686, 28836)--Short text "Mark"
local specWarnCyclone = mod:NewSpecialWarningCount(376943, nil, nil, nil, 2, 12)
local specWarnCrosswinds = mod:NewSpecialWarningDodgeCount(388410, nil, nil, nil, 2, 2)--232722 "Slicing Tornado" better?
local specWarnZephyrSlam = mod:NewSpecialWarningDefensive(375580, nil, nil, nil, 1, 2)
local specWarnZephyrSlamTaunt = mod:NewSpecialWarningTaunt(375580, nil, nil, nil, 1, 2)
--local specWarnGTFO = mod:NewSpecialWarningGTFO(340324, nil, nil, nil, 1, 8)
local timerColaescingStormCD = mod:NewCDCountTimer(79.1, 387849, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
local timerRagingBurstCD = mod:NewCDCountTimer(79.1, 388302, 86189, nil, nil, 3)--Tornados
local timerConductiveMarkCD = mod:NewCDCountTimer(25, 391686, nil, nil, nil, 3)
local timerCycloneCD = mod:NewCDCountTimer(79.1, 376943, nil, nil, nil, 2)
local timerCrosswindsCD = mod:NewCDCountTimer(33, 388410, nil, nil, nil, 3)--232722 "Slicing Tornado" better?
local timerZephyrSlamCD = mod:NewCDCountTimer(15.7, 375580, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
--local berserkTimer = mod:NewBerserkTimer(600)
mod:AddRangeFrameOption(5, 391686)
--mod:AddInfoFrameOption(391686, true)
--Volatile Infuser
mod:AddTimerLine(DBM:EJ_GetSectionInfo(25903))
local warnBlowback = mod:NewCastAnnounce(395501, 4)--Fallback warning, should know it's being cast even if not in distance of knockback, so you don't walk into it
local specWarnBlowback = mod:NewSpecialWarningSpell(395501, nil, nil, nil, 2, 2)--Distance based warning, Ie in range of knockback
local specWarnDivertedEssence = mod:NewSpecialWarningInterruptCount(387943, "HasInterrupt", nil, nil, 1, 2)
local specWarnAerialSlash = mod:NewSpecialWarningDefensive(385812, nil, nil, nil, 1, 2)
local timerAerialSlashCD = mod:NewCDTimer(12, 385812, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
mod:AddSetIconOption("SetIconOnVolatileInfuser", "ej25903", true, 5, {8, 7, 6, 5, 4})
--Thunder Caller
mod:AddTimerLine(DBM:EJ_GetSectionInfo(25958))
local specWarnStormBolt = mod:NewSpecialWarningInterruptCount(384273, false, nil, nil, 1, 2)
local castsPerGUID = {}
mod.vb.addIcon = 8
mod.vb.stormCount = 0
mod.vb.burstCount = 0
mod.vb.markCount = 0
mod.vb.cycloneCount = 0
mod.vb.crosswindCount = 0
mod.vb.slamCount = 0
function mod:OnCombatStart(delay)
table.wipe(castsPerGUID)
self.vb.addIcon = 8
self.vb.stormCount = 0
self.vb.burstCount = 0
self.vb.markCount = 0
self.vb.cycloneCount = 0
self.vb.crosswindCount = 0
self.vb.slamCount = 0
timerConductiveMarkCD:Start(4.6-delay, 1)
timerRagingBurstCD:Start(7-delay, 1)
if self:IsHard() then
timerZephyrSlamCD:Start(15.7-delay, 1)
timerCrosswindsCD:Start(25.5-delay, 1)
timerCycloneCD:Start(35.2-delay, 1)
timerColaescingStormCD:Start(70-delay, 1)--70-73 (check ito it being 73 consistently on mythic)
else
timerZephyrSlamCD:Start(9.4-delay, 1)
timerCrosswindsCD:Start(28.9-delay, 1)
timerCycloneCD:Start(45.2-delay, 1)
timerColaescingStormCD:Start(80-delay, 1)
end
if self.Options.RangeFrame then
DBM.RangeCheck:Show(5)
end
-- if self.Options.InfoFrame then
-- DBM.InfoFrame:SetHeader(DBM:GetSpellInfo(391686))
-- DBM.InfoFrame:Show(self:IsMythic() and 20 or 10, "playerdebuffstacks", 391686)
-- end
end
function mod:OnCombatEnd()
if self.Options.RangeFrame then
DBM.RangeCheck:Hide()
end
-- if self.Options.InfoFrame then
-- DBM.InfoFrame:Hide()
-- end
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 387849 then
self.vb.addIcon = 8
self.vb.stormCount = self.vb.stormCount + 1
specWarnCoalescingStorm:Show(self.vb.stormCount)
specWarnCoalescingStorm:Play("mobsoon")
--Timers reset by storm
if self:IsMythic() then
timerConductiveMarkCD:Restart(19.5, self.vb.markCount+1)
timerZephyrSlamCD:Restart(30, self.vb.slamCount+1)--30-33
timerCrosswindsCD:Restart(40, self.vb.crosswindCount+1)--40-45, but always a minimum of 40 from heer
timerColaescingStormCD:Start(86.2, self.vb.stormCount+1)
elseif self:IsHeroic() then
timerZephyrSlamCD:Restart(20.7, self.vb.slamCount+1)
timerCrosswindsCD:Restart(30.4, self.vb.crosswindCount+1)--40-45, but always a minimum of 40 from heer
timerConductiveMarkCD:Restart(35, self.vb.markCount+1)
timerColaescingStormCD:Start(75.5, self.vb.stormCount+1)
else
timerConductiveMarkCD:Restart(9.7, self.vb.markCount+1)
timerZephyrSlamCD:Restart(15.7, self.vb.slamCount+1)
timerCrosswindsCD:Restart(34, self.vb.crosswindCount+1)
timerColaescingStormCD:Start(86.2, self.vb.stormCount+1)
end
elseif spellId == 388302 then
self.vb.burstCount = self.vb.burstCount + 1
warnRagingBurst:Show(self.vb.burstCount)
timerRagingBurstCD:Start(self:IsHeroic() and 75 or 86.2, self.vb.burstCount+1)
elseif spellId == 376943 then
self.vb.cycloneCount = self.vb.cycloneCount + 1
specWarnCyclone:Show(self.vb.cycloneCount)
specWarnCyclone:Play("pullin")
timerCycloneCD:Start(self:IsHeroic() and 75 or 86.2, self.vb.cycloneCount+1)
if timerZephyrSlamCD:GetRemaining(self.vb.slamCount+1) < 13.2 then
timerZephyrSlamCD:Restart(13.2, self.vb.slamCount+1)--13.2-15
end
elseif spellId == 388410 then
self.vb.crosswindCount = self.vb.crosswindCount + 1
specWarnCrosswinds:Show(self.vb.crosswindCount)
specWarnCrosswinds:Play("farfromline")
--If storm comes before cross winds would come off CD, storm will reset the CD anyways so don't start here
if timerColaescingStormCD:GetRemaining(self.vb.stormCount+1) > 35 then
timerCrosswindsCD:Start(nil, self.vb.crosswindCount+1)
end
if timerZephyrSlamCD:GetRemaining(self.vb.slamCount+1) < 6 then
timerZephyrSlamCD:Restart(6, self.vb.slamCount+1)--6-8
end
elseif spellId == 375580 then
self.vb.slamCount = self.vb.slamCount + 1
if self:IsTanking("player", "boss1", nil, true) then
specWarnZephyrSlam:Show()
specWarnZephyrSlam:Play("carefly")
end
timerZephyrSlamCD:Start(nil, self.vb.slamCount+1)
elseif spellId == 387943 then
if not castsPerGUID[args.sourceGUID] then
castsPerGUID[args.sourceGUID] = 0
if self.Options.SetIconOnVolatileInfuser and self.vb.addIcon > 3 then--Only use up to 5 icons
self:ScanForMobs(args.sourceGUID, 2, self.vb.addIcon, 1, nil, 12, "SetIconOnVolatileInfuser")
end
self.vb.addIcon = self.vb.addIcon - 1
end
castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
local count = castsPerGUID[args.sourceGUID]
if self:CheckInterruptFilter(args.sourceGUID, false, false) then--Count interrupt, so cooldown is not checked
specWarnDivertedEssence:Show(args.sourceName, count)
if count < 6 then
specWarnDivertedEssence:Play("kick"..count.."r")
else
specWarnDivertedEssence:Play("kickcast")
end
end
elseif spellId == 385812 then
timerAerialSlashCD:Start(nil, args.sourceGUID)
if self:IsTanking("player", nil, nil, true, args.sourceGUID) and self:AntiSpam(3, 1) then
specWarnAerialSlash:Show()
specWarnAerialSlash:Play("defensive")
end
elseif spellId == 384273 then
if not castsPerGUID[args.sourceGUID] then
castsPerGUID[args.sourceGUID] = 0
end
castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
local count = castsPerGUID[args.sourceGUID]
if self:CheckInterruptFilter(args.sourceGUID, false, false) then--Count interrupt, so cooldown is not checked
specWarnStormBolt:Show(args.sourceName, count)
if count < 6 then
specWarnStormBolt:Play("kick"..count.."r")
else
specWarnStormBolt:Play("kickcast")
end
end
elseif spellId == 387627 or spellId == 391382 or spellId == 395501 then
if self:CheckBossDistance(args.sourceGUID, true, 13289, 28) then
specWarnBlowback:Show()
specWarnBlowback:Play("carefly")
else
warnBlowback:Show()
end
end
end
--[[
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 362805 then
end
end
--]]
function mod:SPELL_SUMMON(args)
local spellId = args.spellId
if spellId == 387857 then--Zephyr Guardian
if not castsPerGUID[args.destGUID] then
castsPerGUID[args.destGUID] = 0
if self.Options.SetIconOnVolatileInfuser and self.vb.addIcon > 3 then--Only use up to 5 icons
self:ScanForMobs(args.destGUID, 2, self.vb.addIcon, 1, nil, 12, "SetIconOnVolatileInfuser")
end
self.vb.addIcon = self.vb.addIcon - 1
end
timerAerialSlashCD:Start(6, args.destGUID)
-- elseif spellId == 384757 then--Thunder Caller
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 391686 then
if args:IsPlayer() then
specWarnConductiveMark:Show()
specWarnConductiveMark:Play("range5")
yellConductiveMark:Yell()
end
elseif spellId == 375580 and not args:IsPlayer() then
local amount = args.amount or 1
local _, _, _, _, _, expireTime = DBM:UnitDebuff("player", spellId)
local remaining
if expireTime then
remaining = expireTime-GetTime()
end
if amount >= 2 and (not remaining or remaining and remaining < 6.1) and not UnitIsDeadOrGhost("player") and not self:IsHealer() then
specWarnZephyrSlamTaunt:Show(args.destName)
specWarnZephyrSlamTaunt:Play("tauntboss")
else
warnZephyrSlam:Show(args.destName, amount)
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
--[[
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 361966 then
end
end
--]]
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 192934 then--Volatile Infuser
timerAerialSlashCD:Stop(args.destGUID)
-- elseif cid == 194647 then--Thunder Caller
end
end
--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if spellId == 340324 and destGUID == UnitGUID("player") and self:AntiSpam(2, 4) then
specWarnGTFO:Show(spellName)
specWarnGTFO:Play("watchfeet")
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--]]
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if (spellId == 391600 or spellId == 391595) and self:AntiSpam(3, 2) then--391595 confirmed, 391600 i'm keeping for now in case it's used on mythics
self.vb.markCount = self.vb.markCount + 1
warnMarkCast:Show(self.vb.markCount)
timerConductiveMarkCD:Start(self:IsHard() and 25 or 31.5, self.vb.markCount+1)
end
end