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