local mod = DBM:NewMod("TirnaScitheTrash", "DBM-Party-Shadowlands", 3) local L = mod:GetLocalizedStrings() mod:SetRevision("20240809034357") --mod:SetModelID(47785) mod.isTrashMod = true mod.isTrashModBossFightAllowed = true mod:RegisterEvents( "SPELL_CAST_START 321968 324909 324923 324914 324776 340305 340304 340300 340160 340189 326046 331718 331743 460092 463256 463248 340208 340289 326021",--325418 "SPELL_CAST_SUCCESS 325418 340544 322938 325223 331743 340279 321968 324923 331718 322486 322557 324914 324776 326046 463248 463256 340160 340208 340189 326021 460092 324987 340300", "SPELL_INTERRUPT", "SPELL_AURA_APPLIED 322557 324914 324776 325224 340288 326046 322486 325021", "SPELL_AURA_APPLIED_DOSE 340288", "SPELL_AURA_REMOVED 325224", "UNIT_DIED" ) --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, add https://www.wowhead.com/beta/spell=322569/hand-of-thros ? can you really do anything about it though? Guess tank can kite, timer too varaible to add --TODO, add https://www.wowhead.com/beta/spell=463217/anima-slash stack tracking? --TODO, track https://www.wowhead.com/beta/spell=340289/triple-bite cast itself for nameplate timer purposes? --TODO, dispel warning for https://www.wowhead.com/beta/spell=340283/poisonous-discharge ? --[[ (ability.id = 321968 or ability.id = 324909 or ability.id = 324923 or ability.id = 324914 or ability.id = 324776 or ability.id = 340305 or ability.id = 340304 or ability.id = 340300 or ability.id = 340160 or ability.id = 340189 or ability.id = 326046 or ability.id = 331718 or ability.id = 331743 or ability.id = 460092 or ability.id = 463256 or ability.id = 463248 or ability.id = 340208 or ability.id = 340289 or ability.id = 326021) and (type = "begincast" or type = "cast") or (ability.id = 325418 or ability.id = 340544 or ability.id = 322938 or ability.id = 325223 or ability.id = 331743 or ability.id = 340279 or ability.id = 321968 or ability.id = 324923 or ability.id = 331718 or ability.id = 322486 or ability.id = 322557 or ability.id = 324914 or ability.id = 324776 or ability.id = 326046) and type = "cast" or stoppedAbility.id = 322938 or stoppedAbility.id = 324914 or stoppedAbility.id = 324776 or stoppedAbility.id = 326046 or stoppedAbility.id = 340544 or type = "dungeonencounterstart" or type = "dungeonencounterend" --]] local warnOvergrowth = mod:NewTargetAnnounce(322486, 4) local warnFuriousThrashing = mod:NewSpellAnnounce(324909, 3)--No CD timer because no one has ever seen it cast twice in a row 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 local warnMistveilTear = mod:NewTargetNoFilterAnnounce(325021, 3, nil, "Tank|Healer|RemoveBleed") --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 specWarnExpel = mod:NewSpecialWarningDodge(463248, nil, nil, nil, 2, 2) local specWarnAcidGlobule = mod:NewSpecialWarningDodge(326021, nil, nil, nil, 2, 2) local specWarnOvergrowth = mod:NewSpecialWarningMoveTo(322486, nil, nil, nil, 1, 11) local specWarnShredArmor = mod:NewSpecialWarningDefensive(340208, nil, nil, nil, 1, 2) 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 specWarnMistWard = mod:NewSpecialWarningMove(463256, 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)--Valid Aug 8 local timerOvergrowthCD = mod:NewCDNPTimer(15.3, 322486, nil, nil, nil, 3)--Valid Aug 8 local timerBrambleBurstCD = mod:NewCDNPTimer(13.5, 324923, nil, nil, nil, 3)--Valid Aug 8 local timerSpearFlurryCD = mod:NewCDNPTimer(9.3, 331718, nil, false, nil, 3)--Likely deleted from game local timerAnimaInjectionCD = mod:NewCDNPTimer(14.1, 325224, nil, nil, nil, 3)--Valid Aug 8 local timerBuckingRampageCD = mod:NewCDNPTimer(15.2, 331743, nil, nil, nil, 3)--Likely deleted from game local timerPoisonousDischargeCD = mod:NewCDNPTimer(21.2, 340279, nil, nil, nil, 3)--??? not seen in logs, mob avoided? local timerSoulSpiritCD = mod:NewCDNPTimer(14.5, 322557, nil, nil, nil, 5)--Valid Aug 8 local timerVolatileAcidCD = mod:NewCDNPTimer(12.1, 325418, nil, nil, nil, 3)--Valid Aug 8, HIGHLY variable though (like 12-19) local timerNourishtheForestCD = mod:NewCDNPTimer(15.9, 324914, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Valid Aug 8 local timerBramblethornCoatCD = mod:NewCDNPTimer(21.6, 324776, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Valid Aug 8, 21.6-24.something local timerStimulateResistanceCD = mod:NewCDNPTimer(15.8, 326046, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Valid Aug 8 local timerStimulateRegenerationCD = mod:NewCDNPTimer(22.6, 340544, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Valid Aug 8, but could be lower local timerAcidNovaCD = mod:NewCDNPTimer(18, 460092, nil, nil, nil, 3)--Valid Aug 8 local timerHarvestEssenceCD = mod:NewCDNPTimer(15, 322938, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)----Valid Aug 8. This one does go on CD if stunned because it's channeled not cast start local timerExpelCD = mod:NewCDNPTimer(15.1, 463248, nil, nil, nil, 3)--Valid Aug 8 local timerMistWardCD = mod:NewCDNPTimer(22.9, 463256, nil, nil, nil, 5)--Valid Aug 8, One of two creatures has CD, the other does not. local timerRadiantBreathCD = mod:NewCDNPTimer(10.4, 340160, nil, nil, nil, 3)--Valid Aug 8 local timerShredArmorCD = mod:NewCDNPTimer(10.6, 340208, nil, nil, nil, 5)----Valid Aug 8, Possible same as breath local timerPoolofRadianceCD = mod:NewCDNPTimer(28, 340189, nil, nil, nil, 5)--Valid Aug 8 local timerAcidGlobuleCD = mod:NewCDNPTimer(17.4, 326021, nil, nil, nil, 3)--Valid Aug 8 local timerMistveilBiteCD = mod:NewCDNPTimer(10.4, 324987, nil, nil, nil, 5)--Valid Aug 8 local timerTongueLashingCD = mod:NewCDTimer(7.7, 340300, nil, nil, nil, 3)--Valid Aug 8 --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 == 463256 then--No Antispam, not to be throttled against other types if self:IsTanking("player", nil, nil, true, args.sourceGUID) then specWarnMistWard:Show() specWarnMistWard: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 elseif spellId == 463248 then if self:AntiSpam(3, 2) then specWarnExpel:Show() specWarnExpel:Play("chargemove") end elseif spellId == 340208 then if self:IsTanking("player", nil, nil, true, args.sourceGUID) and self:AntiSpam(3, 5) then specWarnShredArmor:Show() specWarnShredArmor:Play("defensive") end elseif spellId == 326021 then if self:AntiSpam(3, 2) then specWarnAcidGlobule:Show() specWarnAcidGlobule:Play("watchstep") 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) elseif spellId == 463248 then timerExpelCD:Start(nil, args.sourceGUID) elseif spellId == 463256 and args:GetSrcCreatureID() == 163058 then timerMistWardCD:Start(nil, args.sourceGUID) elseif spellId == 340160 then timerRadiantBreathCD:Start(nil, args.sourceGUID) elseif spellId == 340208 then timerShredArmorCD:Start(nil, args.sourceGUID) elseif spellId == 340189 then timerPoolofRadianceCD:Start(nil, args.sourceGUID) elseif spellId == 326021 then timerAcidGlobuleCD:Start(nil, args.sourceGUID) elseif spellId == 460092 then timerAcidNovaCD:Start(nil, args.sourceGUID) elseif spellId == 324987 then timerMistveilBiteCD:Start(nil, args.sourceGUID) elseif spellId == 340300 then timerTongueLashingCD: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) elseif args.extraSpellId == 460092 then timerAcidNovaCD: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 elseif spellId == 325021 then warnMistveilTear:Show(args.destName) 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 or cid == 163058 then--Mistveil Defender timerSpearFlurryCD:Stop(args.destGUID)--Removed ability? timerExpelCD:Stop(args.destGUID) timerMistWardCD: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) timerAcidNovaCD:Stop(args.destGUID) elseif cid == 167113 then --Spinemaw Acidgullet timerVolatileAcidCD:Stop(args.destGUID) elseif cid == 164921 then--Drust Harvester timerHarvestEssenceCD:Stop(args.destGUID) elseif cid == 173655 then--Mistveil Matriarch timerRadiantBreathCD:Stop(args.destGUID) timerShredArmorCD:Stop(args.destGUID) timerPoolofRadianceCD:Stop(args.destGUID) elseif cid == 172312 then--Spinemaw Gorger timerAcidGlobuleCD:Stop(args.destGUID) elseif cid == 166301 then--Mistveil Stalker timerMistveilBiteCD:Stop(args.destGUID) elseif cid == 173720 then--Mistveil Gorgegullet timerTongueLashingCD:Stop(args.destGUID) end end