local mod = DBM : NewMod ( " TirnaScitheTrash " , " DBM-Party-Shadowlands " , 3 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240622200108 " )
--mod:SetModelID(47785)
mod.isTrashMod = true
mod : RegisterEvents (
" SPELL_CAST_START 321968 324909 324923 324914 324776 340305 340304 340300 340160 340189 326046 331718 331743 460092 " , --325418
" SPELL_CAST_SUCCESS 325418 340544 322938 325223 331743 340279 321968 324923 331718 322486 322557 324914 324776 326046 " ,
" SPELL_INTERRUPT " ,
" SPELL_AURA_APPLIED 322557 324914 324776 325224 340288 326046 322486 " ,
" SPELL_AURA_APPLIED_DOSE 340288 " ,
" SPELL_AURA_REMOVED 325224 " ,
" UNIT_DIED "
)
--All warnings/recommendations drycoded from https://www.wowhead.com/guides/mists-of-tirna-scithe-shadowlands-dungeon-strategy-guide
--TODO, adjust triple bite stack warnings? More often, less often?
--TODO, target scan crushing leap? If it can be done, and if the two aoe abilities come from leap target destination, fine tune those warnings too
--TODO, see if Pool of Radiance is too early to warn, might need to warn at 340191/rejuvenating-radiance instead
--TODO, Acid Nova cooldown from Spinemaw Staghorn (167111)?
--TODO, add https://www.wowhead.com/beta/spell=324987/mistveil-bite ?
local warnOvergrowth = mod : NewTargetAnnounce ( 322486 , 4 )
local warnFuriousThrashing = mod : NewSpellAnnounce ( 324909 , 3 )
local warnTripleBite = mod : NewStackAnnounce ( 340288 , 2 , nil , " Tank|Healer|RemovePoison " )
local warnCrushingLeap = mod : NewSpellAnnounce ( 340305 , 3 ) --Change to target warning if target scan debug checks out
local warnVolatileAcid = mod : NewTargetAnnounce ( 325418 , 3 )
local warnHarvestEssence = mod : NewCastAnnounce ( 322938 , 4 , 6 ) --High Prio off internet
local warnNourishtheForest = mod : NewCastAnnounce ( 324914 , 4 ) --High Prio off internet
local warnBuckingRampage = mod : NewSpellAnnounce ( 331743 , 3 , nil , " Melee " ) --Annoying spell that can do a lot of burst damage to melee that's not interruptable
--General
--local specWarnGTFO = mod:NewSpecialWarningGTFO(257274, nil, nil, nil, 1, 8)
local specWarnAcidNova = mod : NewSpecialWarningSpell ( 460092 , nil , nil , nil , 2 , 2 )
local specWarnBrambleBurst = mod : NewSpecialWarningDodge ( 324923 , nil , nil , nil , 2 , 2 )
local specWarnSpearFlurry = mod : NewSpecialWarningDodge ( 331718 , nil , nil , nil , 2 , 2 )
local specWarnPoisonousSecretions = mod : NewSpecialWarningDodge ( 340304 , nil , nil , nil , 2 , 2 )
local specWarnTongueLashing = mod : NewSpecialWarningDodge ( 340300 , nil , nil , nil , 2 , 2 )
local specWarnRadiantBreath = mod : NewSpecialWarningDodge ( 340160 , nil , nil , nil , 2 , 2 )
local specWarnPoisonousDischarge = mod : NewSpecialWarningDodge ( 340279 , nil , nil , nil , 2 , 2 )
local specWarnBewilderingPollen = mod : NewSpecialWarningDodge ( 321968 , nil , nil , nil , 1 , 2 )
local specWarnOvergrowth = mod : NewSpecialWarningMoveTo ( 322486 , nil , nil , nil , 1 , 11 )
local specWarnSoulSplit = mod : NewSpecialWarningDispel ( 322557 , " RemoveMagic " , nil , nil , 1 , 2 )
local specWarnNourishtheForestDispel = mod : NewSpecialWarningDispel ( 324914 , " MagicDispeller " , nil , nil , 1 , 2 )
local specWarnBramblethornCoatDispel = mod : NewSpecialWarningDispel ( 324776 , " MagicDispeller " , nil , nil , 1 , 2 )
local specWarnStimulateResistanceDispel = mod : NewSpecialWarningDispel ( 326046 , " MagicDispeller " , nil , nil , 1 , 2 )
local specWarnPoolOfRadiance = mod : NewSpecialWarningMove ( 340189 , nil , nil , nil , 1 , 10 )
local specWarnVolatileAcid = mod : NewSpecialWarningMoveAway ( 325418 , nil , nil , nil , 1 , 2 )
local yellVolatileAcid = mod : NewShortYell ( 325418 )
local specWarnAnimaInjection = mod : NewSpecialWarningMoveAway ( 325224 , nil , nil , nil , 1 , 2 )
local yellAnimaInjection = mod : NewShortYell ( 325224 )
local yellAnimaInjectionFades = mod : NewShortFadesYell ( 325224 )
local specWarnHarvestEssence = mod : NewSpecialWarningInterrupt ( 322938 , " HasInterrupt " , nil , nil , 1 , 2 ) --High Prio Interrupt
local specWarnNourishtheForest = mod : NewSpecialWarningInterrupt ( 324914 , " HasInterrupt " , nil , nil , 1 , 2 ) --High Prio Interrupt
local specWarnBramblethornCoat = mod : NewSpecialWarningInterrupt ( 324776 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnStimulateResistance = mod : NewSpecialWarningInterrupt ( 326046 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnStimulateRegeneration = mod : NewSpecialWarningInterrupt ( 340544 , " HasInterrupt " , nil , nil , 1 , 2 )
--Cooldowns only show Recast time after successful interrupt or cast finish
--This means stunned/CCed mobs will not show recast timers since abilities do not go on cooldown
local timerBewilderingPollenCD = mod : NewCDNPTimer ( 12.2 , 321968 , nil , nil , nil , 3 )
local timerOvergrowthCD = mod : NewCDNPTimer ( 15.3 , 322486 , nil , nil , nil , 3 )
local timerBrambleBurstCD = mod : NewCDNPTimer ( 13.5 , 324923 , nil , nil , nil , 3 )
local timerSpearFlurryCD = mod : NewCDNPTimer ( 9.3 , 331718 , nil , false , nil , 3 ) --9.3-13, off by default due to variation
local timerAnimaInjectionCD = mod : NewCDNPTimer ( 12.2 , 325224 , nil , nil , nil , 3 )
local timerBuckingRampageCD = mod : NewCDNPTimer ( 15.2 , 331743 , nil , nil , nil , 3 )
local timerPoisonousDischargeCD = mod : NewCDNPTimer ( 21.2 , 340279 , nil , nil , nil , 3 )
local timerSoulSpiritCD = mod : NewCDNPTimer ( 14 , 322557 , nil , nil , nil , 5 )
local timerVolatileAcidCD = mod : NewCDNPTimer ( 12.1 , 325418 , nil , nil , nil , 3 )
local timerNourishtheForestCD = mod : NewCDNPTimer ( 21.1 , 324914 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON ) --Poor sample size, needs more data
local timerBramblethornCoatCD = mod : NewCDNPTimer ( 22.7 , 324776 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON )
local timerStimulateResistanceCD = mod : NewCDNPTimer ( 22.7 , 326046 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON ) --Poor sample size, needs more data
--local timerStimulateRegenerationCD = mod:NewCDNPTimer(15, 340544, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Not enough data yet
local timerHarvestEssenceCD = mod : NewCDNPTimer ( 15 , 322938 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON ) --This one does go on CD if stunned because it's channeled not cast start
--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 : CrushingLeap ( targetname , _ , unituid )
--Now has death check cause it's possible for mob to die before cast finishes and we don't want scan to return target if it won't finish
if not targetname or ( unituid and UnitIsDead ( unituid ) ) then return end
DBM : Debug ( " Crushing Leap on " .. targetname )
-- warnRicochetingThrow:Show(targetname)
-- if targetname == UnitName("player") then
-- yellRicochetingThrow:Yell()
-- end
end
--[[
--About 1 second faster than debuff
function mod : VolatileAcid ( targetname , _ , unituid )
--Now has death check cause it's possible for mob to die before cast finishes and we don't want scan to return target if it won't finish
if not targetname or ( unituid and UnitIsDead ( unituid ) ) then return end
if self : AntiSpam ( 3 , targetname ) then
if targetname == UnitName ( " player " ) then
specWarnVolatileAcid : Show ( )
specWarnVolatileAcid : Play ( " range5 " )
yellVolatileAcid : Yell ( )
else
warnVolatileAcid : Show ( targetname )
end
end
end
--]]
function mod : SPELL_CAST_START ( args )
if not self.Options . Enabled then return end
if not self : IsValidWarning ( args.sourceGUID ) then return end --Filter all casts done by mobs in combat with npcs/other mobs.
local spellId = args.spellId
if spellId == 321968 and self : AntiSpam ( 3 , 2 ) then
if self : IsTanking ( " player " , nil , nil , true , args.sourceGUID ) then
specWarnBewilderingPollen : Show ( )
specWarnBewilderingPollen : Play ( " shockwave " )
end
elseif spellId == 324909 and self : AntiSpam ( 3 , 4 ) then
warnFuriousThrashing : Show ( )
elseif spellId == 324923 and self : AntiSpam ( 3 , 2 ) then
specWarnBrambleBurst : Show ( )
specWarnBrambleBurst : Play ( " watchfeet " )
elseif spellId == 324914 then
if self.Options . SpecWarn324914interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnNourishtheForest : Show ( args.sourceName )
specWarnNourishtheForest : Play ( " kickcast " )
elseif self : AntiSpam ( 3 , 7 ) then
warnNourishtheForest : Show ( )
end
elseif spellId == 324776 and self : CheckInterruptFilter ( args.sourceGUID , false , true ) and self : AntiSpam ( 2 , 5 ) then
specWarnBramblethornCoat : Show ( args.sourceName )
specWarnBramblethornCoat : Play ( " kickcast " )
elseif spellId == 326046 and self : CheckInterruptFilter ( args.sourceGUID , false , true ) and self : AntiSpam ( 2 , 5 ) then
specWarnStimulateResistance : Show ( args.sourceName )
specWarnStimulateResistance : Play ( " kickcast " )
elseif spellId == 340305 then
warnCrushingLeap : Show ( )
self : ScheduleMethod ( 0.1 , " BossTargetScanner " , args.sourceGUID , " CrushingLeap " , 0.1 , 4 )
elseif spellId == 340304 and self : AntiSpam ( 3 , 2 ) then
specWarnPoisonousSecretions : Show ( )
specWarnPoisonousSecretions : Play ( " watchstep " )
elseif spellId == 340300 and self : AntiSpam ( 3 , 2 ) then
specWarnTongueLashing : Show ( )
specWarnTongueLashing : Play ( " watchstep " )
elseif spellId == 340160 and self : AntiSpam ( 3 , 2 ) then
specWarnRadiantBreath : Show ( )
specWarnRadiantBreath : Play ( " watchstep " )
elseif spellId == 340189 then --No Antispam, not to be throttled against other types
if self : IsTanking ( " player " , nil , nil , true , args.sourceGUID ) then
specWarnPoolOfRadiance : Show ( )
specWarnPoolOfRadiance : Play ( " mobout " )
end
-- elseif spellId == 325418 then
-- self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "VolatileAcid", 0.1, 4)
elseif spellId == 331718 and self : AntiSpam ( 3 , 2 ) then
specWarnSpearFlurry : Show ( )
specWarnSpearFlurry : Play ( " shockwave " )
elseif spellId == 331743 then
warnBuckingRampage : Show ( )
elseif spellId == 460092 then
if self : AntiSpam ( 3 , 4 ) then
specWarnAcidNova : Show ( )
specWarnAcidNova : Play ( " aesoon " )
end
end
end
function mod : SPELL_CAST_SUCCESS ( args )
if not self.Options . Enabled then return end
local spellId = args.spellId
if spellId == 325418 then
timerVolatileAcidCD : Start ( nil , args.sourceGUID )
-- if self:AntiSpam(3, args.destName) then--Backup, in case no one in party was targetting mob casting Volatile Acid (ie target scanning would fail)
if args : IsPlayer ( ) then
specWarnVolatileAcid : Show ( )
specWarnVolatileAcid : Play ( " range5 " )
yellVolatileAcid : Yell ( )
else
warnVolatileAcid : Show ( args.destName )
end
-- end
elseif spellId == 340544 then
--timerStimulateRegenerationCD:Start(nil, args.sourceGUID)
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnStimulateRegeneration : Show ( args.sourceName )
specWarnStimulateRegeneration : Play ( " kickcast " )
end
elseif spellId == 322938 then
timerHarvestEssenceCD : Start ( nil , args.sourceGUID )
if self.Options . SpecWarn322938interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnHarvestEssence : Show ( args.sourceName )
specWarnHarvestEssence : Play ( " kickcast " )
else
warnHarvestEssence : Show ( )
end
elseif spellId == 325223 then
timerAnimaInjectionCD : Start ( nil , args.sourceGUID )
elseif spellId == 331743 then
timerBuckingRampageCD : Start ( nil , args.sourceGUID )
elseif spellId == 340279 then
timerPoisonousDischargeCD : Start ( nil , args.sourceGUID )
if self : AntiSpam ( 3 , 2 ) then
specWarnPoisonousDischarge : Show ( )
specWarnPoisonousDischarge : Play ( " watchstep " )
end
elseif spellId == 321968 then
timerBewilderingPollenCD : Start ( nil , args.sourceGUID )
elseif spellId == 324923 then
timerBrambleBurstCD : Start ( nil , args.sourceGUID )
elseif spellId == 331718 and self : IsValidWarning ( args.sourceGUID ) then
timerSpearFlurryCD : Start ( nil , args.sourceGUID )
elseif spellId == 322486 then
timerOvergrowthCD : Start ( nil , args.sourceGUID )
elseif spellId == 322557 then
timerSoulSpiritCD : Start ( nil , args.sourceGUID )
elseif spellId == 324914 then
timerNourishtheForestCD : Start ( nil , args.sourceGUID )
elseif spellId == 324776 then
timerBramblethornCoatCD : Start ( nil , args.sourceGUID )
elseif spellId == 326046 then
timerStimulateResistanceCD : Start ( nil , args.sourceGUID )
end
end
function mod : SPELL_INTERRUPT ( args )
if type ( args.extraSpellId ) ~= " number " then return end
if args.extraSpellId == 324914 then
timerNourishtheForestCD : Start ( nil , args.sourceGUID )
elseif args.extraSpellId == 324776 then
timerBramblethornCoatCD : Start ( nil , args.sourceGUID )
elseif args.extraSpellId == 326046 then
timerStimulateResistanceCD : Start ( nil , args.sourceGUID )
end
end
function mod : SPELL_AURA_APPLIED ( args )
if not self.Options . Enabled then return end
local spellId = args.spellId
if spellId == 322557 and args : IsDestTypePlayer ( ) and self : CheckDispelFilter ( " magic " ) and self : AntiSpam ( 3 , 5 ) then
specWarnSoulSplit : Show ( args.destName )
specWarnSoulSplit : Play ( " helpdispel " )
elseif spellId == 325224 then
if args : IsPlayer ( ) then
specWarnAnimaInjection : Show ( )
specWarnAnimaInjection : Play ( " runout " )
yellAnimaInjection : Yell ( )
yellAnimaInjectionFades : Countdown ( spellId )
end
elseif spellId == 322486 then
if args : IsPlayer ( ) then
specWarnOvergrowth : Show ( DBM_COMMON_L.TANK )
specWarnOvergrowth : Play ( " movemelee " )
else
warnOvergrowth : Show ( args.destName )
end
elseif spellId == 322557 and self : IsValidWarning ( args.destGUID ) and args : IsDestTypeHostile ( ) and self : AntiSpam ( 3 , 5 ) then
specWarnNourishtheForestDispel : Show ( args.destName )
specWarnNourishtheForestDispel : Play ( " helpdispel " )
elseif spellId == 324776 and self : IsValidWarning ( args.destGUID ) and args : IsDestTypeHostile ( ) and self : AntiSpam ( 3 , 5 ) then
specWarnBramblethornCoatDispel : Show ( args.destName )
specWarnBramblethornCoatDispel : Play ( " helpdispel " )
elseif spellId == 326046 and self : IsValidWarning ( args.destGUID ) and args : IsDestTypeHostile ( ) and self : AntiSpam ( 3 , 5 ) then
specWarnStimulateResistanceDispel : Show ( args.destName )
specWarnStimulateResistanceDispel : Play ( " helpdispel " )
elseif spellId == 340288 and args : IsDestTypePlayer ( ) then
local amount = args.amount or 1
if amount % 2 == 0 then
warnTripleBite : Show ( args.destName , args.amount or 1 )
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 == 325224 then
if args : IsPlayer ( ) then
yellAnimaInjectionFades : Cancel ( )
end
end
end
function mod : UNIT_DIED ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 166304 then --Mistveil Stinger
timerAnimaInjectionCD : Stop ( args.destGUID )
elseif cid == 166276 then --Mistveil Guardian
timerBuckingRampageCD : Stop ( args.destGUID )
elseif cid == 173714 then --Mistveil Nightblossom
timerPoisonousDischargeCD : Stop ( args.destGUID )
elseif cid == 164929 then --Tirnenn Villager
timerBewilderingPollenCD : Stop ( args.destGUID )
timerOvergrowthCD : Stop ( args.destGUID )
elseif cid == 164926 then --Drust Boughbreaker
timerBrambleBurstCD : Stop ( args.destGUID )
elseif cid == 171772 then --Mistveil Defender
timerSpearFlurryCD : Stop ( args.destGUID )
elseif cid == 164920 then --Drust Soulcleaver
timerSoulSpiritCD : Stop ( args.destGUID )
elseif cid == 166299 then --Mistveil Tender
timerNourishtheForestCD : Stop ( args.destGUID )
elseif cid == 166275 then --Mistveil Shaper
timerBramblethornCoatCD : Stop ( args.destGUID )
elseif cid == 167111 then --Spinemaw Staghorn
timerStimulateResistanceCD : Stop ( args.destGUID )
--timerStimulateRegenerationCD:Stop(args.destGUID)
elseif cid == 167113 then --Spinemaw Acidgullet
timerVolatileAcidCD : Stop ( args.destGUID )
elseif cid == 164921 then --Drust Harvester
timerHarvestEssenceCD : Stop ( args.destGUID )
end
end