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.

270 lines
12 KiB

local mod = DBM:NewMod("CityofThreadsTrash", "DBM-Party-WarWithin", 8)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240820072838")
--mod:SetModelID(47785)
mod.isTrashMod = true
mod.isTrashModBossFightAllowed = true
mod:RegisterEvents(
"SPELL_CAST_START 443430 443433 443500 451543 451423 450784 442536 452162 434137 445813 453840 446086 446717 447271",
"SPELL_CAST_SUCCESS 443436 443430 443500 451543 452162 446086",
"SPELL_INTERRUPT",
"SPELL_AURA_APPLIED 443437",
-- "SPELL_AURA_APPLIED_DOSE",
"SPELL_AURA_REMOVED 443437",
"UNIT_DIED"
)
--TODO, see if you can target scan Perfume Toss? since drycoding off WCL not sure if it can actually be side stepped or not
--TODO, track https://www.wowhead.com/beta/spell=441795/pheromone-veil and https://www.wowhead.com/beta/spell=448047/web-wrap ?
--TODO, Quazii's guide also says Lord Vul'azak casts EarthShatter but can't find in any logs. keep an eye out for it though
--TODO, emphasis on Venomous Spray? it seems like aoe is unavoidable and then the dodging is continous after.
--TODO, quazii's guide mentions Sureki Unnaturaler casts https://www.wowhead.com/spell=453840/awakening-calling but I can't find any casts of it in any log for a timer
--TODO, add Venom Strike (443401) dispel alert?
--TODO, add interrupt warning for Web Bolt (443427)? It hits hard but is spammed.
--[[
(ability.id = 443430 or ability.id = 452162 or ability.id = 443433 or ability.id = 446086 or ability.id = 442536 or ability.id = 443500 or ability.id = 451543 or ability.id = 451423 or ability.id = 450784 or ability.id = 434137 or ability.id = 445813 or ability.id = 453840 or ability.id = 446717 or ability.id = 447271) and type = "begincast"
or (ability.id = 443436 or ability.id = 443430 or ability.id = 443500 or ability.id = 451543 or ability.id = 452162 or ability.id = 446086) and type = "cast"
or (stoppedAbility.id = 443430 or stoppedAbility.id = 452162 or stoppedAbility.id = 446086)
or type = "dungeonencounterstart" or type = "dungeonencounterend"
--]]
local warnSilkBinding = mod:NewCastAnnounce(443430, 3)--High Prio Interrupt
local warnPerfumeToss = mod:NewCastAnnounce(450784, 2)
local warnMendingWeb = mod:NewCastAnnounce(452162, 3)--High Prio Interrupt
local warnShadowsofDoubt = mod:NewTargetAnnounce(443437, 2)
local warnVenomousSpray = mod:NewSpellAnnounce(434137, 3)
local warnAwakeningCalling = mod:NewSpellAnnounce(453840, 3)
local warnUmbralWeave = mod:NewCastAnnounce(446717, 3)--Reason to special warn? can't really do much about it
local specWarnShadowsofDoubt = mod:NewSpecialWarningMoveAway(443436, nil, nil, nil, 1, 2)
local yellShadowsofDoubt = mod:NewShortYell(443436)
local yellShadowsofDoubtFades = mod:NewShortFadesYell(443436)
local specWarnEarthShatter = mod:NewSpecialWarningDodge(443500, nil, nil, nil, 2, 2)
local specWarnNullSlam = mod:NewSpecialWarningDodge(451543, nil, nil, nil, 2, 2)
local specWarnGossamerBarrage = mod:NewSpecialWarningDodge(451423, nil, nil, nil, 2, 2)
local specWarnDarkBarrage = mod:NewSpecialWarningDodge(445813, nil, nil, nil, 2, 2)
local specWarnTremorSlam = mod:NewSpecialWarningRun(447271, nil, nil, nil, 4, 2)--Don't confuse with 437700 which is boss version
--local specWarnStormshield = mod:NewSpecialWarningDispel(386223, "MagicDispeller", nil, nil, 1, 2)
local specWarnSilkBinding = mod:NewSpecialWarningInterrupt(443430, "HasInterrupt", nil, nil, 1, 2)--High Prio Interrupt
local specWarnTwistThoughts = mod:NewSpecialWarningInterrupt(443433, "HasInterrupt", nil, nil, 1, 2)--High Prio Interrupt (no CD, so no timer)
local specWarnGrimweaveBlast = mod:NewSpecialWarningInterrupt(442536, "HasInterrupt", nil, nil, 1, 2)--High Prio Interrupt (no CD, so no timer)
local specWarnMendingWeb = mod:NewSpecialWarningInterrupt(452162, "HasInterrupt", nil, nil, 1, 2)--High Prio Interrupt
local specWarnVoidWave = mod:NewSpecialWarningInterrupt(446086, "HasInterrupt", nil, nil, 1, 2)
local timerShadowsofDoubtCD = mod:NewCDNPTimer(11.1, 443436, nil, nil, nil, 3)--11.1-14.6
local timerSilkBindingCD = mod:NewCDNPTimer(24.5, 443430, nil, "HasInterrupt", nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerEarthShatterCD = mod:NewCDNPTimer(11, 443500, nil, nil, nil, 3)
local timerNullSlamCD = mod:NewCDNPTimer(24.9, 451543, nil, nil, nil, 3)
local timerGossamerBarrageCD = mod:NewCDNPTimer(23, 451423, nil, nil, nil, 3)--Start to Start, non CCable caster
local timerPerfumeTossCD = mod:NewCDNPTimer(17, 450784, nil, nil, nil, 3)--Poor sample, need more data
local timerMendingWebCD = mod:NewCDNPTimer(16.6, 452162, nil, "HasInterrupt", nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerVenomousSprayCD = mod:NewCDNPTimer(24.2, 434137, nil, nil, nil, 3)
local timerDarkBarrageCD = mod:NewCDNPTimer(27.9, 445813, nil, nil, nil, 3)
local timerVoidWaveCD = mod:NewCDNPTimer(15.4, 446086, nil, "HasInterrupt", nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerUmbralWeaveCD = mod:NewCDNPTimer(20, 446717, nil, nil, nil, 2)
local timerTremorSlamCD = mod:NewCDNPTimer(20, 447271, nil, nil, nil, 3)
--local playerName = UnitName("player")
--Antispam IDs for this mod: 1 run away, 2 dodge, 3 dispel, 4 incoming damage, 5 you/role, 6 misc, 7 off interrupt
--[[
function mod:CLTarget(targetname)
if not targetname then return end
if targetname == UnitName("player") then
if self:AntiSpam(4, 5) then
specWarnChainLightning:Show()
specWarnChainLightning:Play("runout")
end
yellChainLightning:Yell()
end
end
--]]
--Xeph'itik is a special case, he doesn't die, so we need to clear his timers some other way
local xephEngaged = false
---@param self DBMMod
---@param guid string
local function XephCheck(self, guid)
local combatFound = self:GroupInCombat()
if not combatFound and xephEngaged then
xephEngaged = false
timerGossamerBarrageCD:Stop(guid)
timerPerfumeTossCD:Stop(guid)
return
end
self:Schedule(1, XephCheck, self, guid)
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if not self:IsValidWarning(args.sourceGUID) then return end
if spellId == 443430 then
if self.Options.SpecWarn443430interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnSilkBinding:Show(args.sourceName)
specWarnSilkBinding:Play("kickcast")
elseif self:AntiSpam(3, 7) then
warnSilkBinding:Show()
end
elseif spellId == 452162 then
if self.Options.SpecWarn452162interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnMendingWeb:Show(args.sourceName)
specWarnMendingWeb:Play("kickcast")
elseif self:AntiSpam(3, 7) then
warnMendingWeb:Show()
end
elseif spellId == 443433 then
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnTwistThoughts:Show(args.sourceName)
specWarnTwistThoughts:Play("kickcast")
end
elseif spellId == 446086 then
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnVoidWave:Show(args.sourceName)
specWarnVoidWave:Play("kickcast")
end
elseif spellId == 442536 then
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnGrimweaveBlast:Show(args.sourceName)
specWarnGrimweaveBlast:Play("kickcast")
end
elseif spellId == 443500 then
if self:AntiSpam(3, 2) then
specWarnEarthShatter:Show()
specWarnEarthShatter:Play("shockwave")
end
elseif spellId == 451543 then
if self:AntiSpam(3, 2) then
specWarnNullSlam:Show()
specWarnNullSlam:Play("shockwave")
end
elseif spellId == 451423 then
if not xephEngaged then
xephEngaged = true
self:Schedule(3, XephCheck, self, args.sourceGUID)
end
timerGossamerBarrageCD:Start(23, args.sourceGUID)
if self:AntiSpam(3, 2) then
specWarnGossamerBarrage:Show()
specWarnGossamerBarrage:Play("watchstep")
end
elseif spellId == 450784 then
if not xephEngaged then
xephEngaged = true
self:Schedule(3, XephCheck, self, args.sourceGUID)
end
timerPerfumeTossCD:Start(17, args.sourceGUID)
if self:AntiSpam(3, 6) then
warnPerfumeToss:Show()
end
elseif spellId == 434137 then
if self:AntiSpam(3, 6) then
warnVenomousSpray:Show()
end
timerVenomousSprayCD:Start(24.2, args.sourceGUID)
elseif spellId == 445813 then
if self:AntiSpam(3, 2) then
specWarnDarkBarrage:Show()
specWarnDarkBarrage:Play("watchstep")
end
timerDarkBarrageCD:Start(27.9, args.sourceGUID)
elseif spellId == 453840 then
if self:AntiSpam(3, 6) then
warnAwakeningCalling:Show()
end
elseif spellId == 446717 then
timerUmbralWeaveCD:Start(20, args.sourceGUID)
if self:AntiSpam(3, 6) then
warnUmbralWeave:Show()
end
elseif spellId == 447271 then
timerTremorSlamCD:Start(20, args.sourceGUID)
if self:AntiSpam(3, 1) then
specWarnTremorSlam:Show()
specWarnTremorSlam:Play("justrun")
end
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if not self:IsValidWarning(args.sourceGUID) then return end
if spellId == 443436 then
timerShadowsofDoubtCD:Start(11.1, args.sourceGUID)
elseif spellId == 443430 then
timerSilkBindingCD:Start(24.5, args.sourceGUID)
elseif spellId == 443500 then
--Royal Swarmguard (220197) 11, Royal VenomShell (220730) 20.8
local timer = args:GetSrcCreatureID() == 220730 and 20.8 or 11
timerEarthShatterCD:Start(timer, args.sourceGUID)
elseif spellId == 451543 then
timerNullSlamCD:Start(24.9, args.sourceGUID)
elseif spellId == 452162 then
timerMendingWebCD:Start(16.6, args.sourceGUID)
elseif spellId == 446086 then
timerVoidWaveCD:Start(15.4, args.sourceGUID)
end
end
function mod:SPELL_INTERRUPT(args)
if not self.Options.Enabled then return end
local spellId = args.extraSpellId
if spellId == 443430 then
timerSilkBindingCD:Start(24.5, args.sourceGUID)
elseif spellId == 452162 then
timerMendingWebCD:Start(16.6, args.sourceGUID)
elseif spellId == 446086 then
timerVoidWaveCD:Start(15.4, args.sourceGUID)
end
end
function mod:SPELL_AURA_APPLIED(args)
if not self.Options.Enabled then return end
local spellId = args.spellId
if spellId == 443437 then
if args:IsPlayer() then
specWarnShadowsofDoubt:Show()
specWarnShadowsofDoubt:Play("runout")
yellShadowsofDoubt:Yell()
yellShadowsofDoubtFades:Countdown(spellId)
else
warnShadowsofDoubt:Show(args.destName)
end
end
end
--mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
if not self.Options.Enabled then return end
local spellId = args.spellId
if spellId == 443437 then
yellShadowsofDoubtFades:Cancel()
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 220196 then--Herald of Ansurekha
timerShadowsofDoubtCD:Stop(args.destGUID)
elseif cid == 220195 then--Sureki Silkbinder
timerSilkBindingCD:Stop(args.destGUID)
elseif cid == 220197 then--Royal Swarmsguard
timerEarthShatterCD:Stop(args.destGUID)
elseif cid == 220730 then--Royal VenomShell
timerVenomousSprayCD:Stop(args.destGUID)
timerEarthShatterCD:Stop(args.destGUID)
elseif cid == 220003 then--Hallows Resident
timerNullSlamCD:Stop(args.destGUID)
elseif cid == 223844 or cid == 224732 then--Covert Webmancer
timerMendingWebCD:Stop(args.destGUID)
elseif cid == 216328 then--Unstable test Subject
timerDarkBarrageCD:Stop(args.destGUID)
elseif cid == 216339 then--Sureki Unnaturaler
timerVoidWaveCD:Stop(args.destGUID)
elseif cid == 221102 then--Elder Shadowweaver
timerUmbralWeaveCD:Stop(args.destGUID)
elseif cid == 221103 then--Hulking Warshell
timerTremorSlamCD:Stop(args.destGUID)
end
end