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.

388 lines
20 KiB

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