local mod = DBM : NewMod ( " UnderrotTrash " , " DBM-Party-BfA " , 8 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240412075414 " )
--mod:SetModelID(47785)
mod.isTrashMod = true
mod : RegisterEvents (
" SPELL_CAST_START 272609 266106 265019 265089 265091 265433 265540 272183 278961 278755 265487 272592 265081 272180 266209 413044 " ,
" SPELL_CAST_SUCCESS 265523 265016 266201 266265 265668 " ,
" SPELL_AURA_APPLIED 265568 266107 266209 265091 278789 278961 266201 " ,
" UNIT_DIED "
)
--TODO, verify dark omen can actually be stunned/CCed
--TODO, maybe alert if multiple https://www.wowhead.com/spell=265376/barbed-spear target you at once
--TODO, gift of ghuun and reconstruction timers. they are pretty long and rarely see double cast from a single mob
--[[
( ability.id = 413044 or ability.id = 272609 or ability.id = 266106 or ability.id = 265019 or ability.id = 265089 or ability.id = 265091 or ability.id = 265433 or ability.id = 265540 or ability.id = 272183 or ability.id = 278961 or ability.id = 265523 or ability.id = 278755 or ability.id = 265568 or ability.id = 265487 or ability.id = 272592 or ability.id = 265081 or ability.id = 272180 or ability.id = 266209 or ability.id = 265016 ) and type = " begincast "
or ( ability.id = 265668 or ability.id = 266107 or ability.id = 266201 or ability.id = 266265 ) and type = " cast "
--]]
local warnBloodHarvest = mod : NewTargetNoFilterAnnounce ( 265016 , 3 )
local warnGiftOfGhuun = mod : NewCastAnnounce ( 265091 , 3 )
local warnDarkReconstitution = mod : NewCastAnnounce ( 265089 , 3 )
local warnSonicSreech = mod : NewCastAnnounce ( 266106 , 3 )
local warnRaiseDead = mod : NewCastAnnounce ( 272183 , 3 ) --No longer exists in M+ but maybe still exists in timewalking/leveling version?
local warnShadowBoltVolley = mod : NewCastAnnounce ( 265487 , 3 )
local warnWitheringCurse = mod : NewCastAnnounce ( 265433 , 3 )
local warnWarcry = mod : NewCastAnnounce ( 265081 , 4 )
local warnHarrowingDespair = mod : NewCastAnnounce ( 278755 , 3 )
local warnWickedFrenzy = mod : NewCastAnnounce ( 266209 , 3 )
local warnVoidSpit = mod : NewCastAnnounce ( 272180 , 2 , nil , nil , false ) --AKA Dark Bolt prior to 10.1
local warnDarkEchoes = mod : NewCastAnnounce ( 413044 , 4 )
local specWarnMaddeningGaze = mod : NewSpecialWarningDodge ( 272609 , nil , nil , 2 , 3 , 2 )
local yellBloodHarvest = mod : NewShortYell ( 265016 ) --Pre Savage Cleave target awareness
local specWarnSavageCleave = mod : NewSpecialWarningDodge ( 265019 , nil , nil , nil , 2 , 2 )
local specWarnRottenBile = mod : NewSpecialWarningDodge ( 265540 , nil , nil , nil , 2 , 2 )
local specWarnAbyssalReach = mod : NewSpecialWarningDodge ( 272592 , nil , nil , nil , 2 , 2 )
local specWarnDarkOmen = mod : NewSpecialWarningMoveAway ( 265568 , nil , nil , nil , 1 , 2 )
local yellDarkOmen = mod : NewShortYell ( 265568 )
local specWarnThirstforBlood = mod : NewSpecialWarningRun ( 266107 , nil , nil , nil , 4 , 2 )
local specWarnSonicScreech = mod : NewSpecialWarningInterrupt ( 266106 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnDarkReconstituion = mod : NewSpecialWarningInterrupt ( 265089 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnGiftofGhuun = mod : NewSpecialWarningInterrupt ( 265091 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnShadowBoltVolley = mod : NewSpecialWarningInterrupt ( 265487 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnWitheringCurse = mod : NewSpecialWarningInterrupt ( 265433 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnRaiseDead = mod : NewSpecialWarningInterrupt ( 272183 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnDecayingMind = mod : NewSpecialWarningInterrupt ( 278961 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnHarrowingDespair = mod : NewSpecialWarningInterrupt ( 278755 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnVoidSpit = mod : NewSpecialWarningInterrupt ( 272180 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnDarkEchoes = mod : NewSpecialWarningInterrupt ( 413044 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnWickedFrenzy = mod : NewSpecialWarningInterrupt ( 266209 , " HasInterrupt " , nil , nil , 1 , 2 )
local specWarnWickedFrenzyDispel = mod : NewSpecialWarningDispel ( 266209 , " RemoveEnrage " , nil , nil , 1 , 2 )
local specWarnDecayingMindDispel = mod : NewSpecialWarningDispel ( 278961 , " RemoveDisease " , nil , nil , 1 , 2 )
local specWarnGiftofGhuunDispel = mod : NewSpecialWarningDispel ( 265091 , " MagicDispeller " , nil , nil , 1 , 2 )
local specWarnBoneShieldDispel = mod : NewSpecialWarningDispel ( 266201 , " MagicDispeller " , nil , nil , 1 , 2 ) --Unlike BFA version, 10.1 version now instant cast, no interrupt just dispel
local specWarnSpiritDrainTotemOut = mod : NewSpecialWarningDodge ( 265523 , nil , nil , nil , 2 , 2 )
local specWarnGTFO = mod : NewSpecialWarningGTFO ( 278789 , nil , nil , nil , 1 , 8 )
local timerBloodHarvestCD = mod : NewCDNPTimer ( 12.1 , 265016 , nil , nil , nil , 3 )
local timerRottenBileCD = mod : NewCDNPTimer ( 10.7 , 265540 , nil , nil , nil , 3 )
local timerWaveofDecayCD = mod : NewCDNPTimer ( 10.7 , 265668 , nil , false , nil , 3 ) --Off by default to reduce clutter, but optional for those that want it
local timerWarcryCD = mod : NewCDNPTimer ( 25.2 , 265081 , nil , nil , nil , 2 )
local timerDecayingMindCD = mod : NewCDNPTimer ( 27.7 , 278961 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON )
local timerSonicScreechCD = mod : NewCDNPTimer ( 25.4 , 266106 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON )
--local timerVoidSpitCD = mod:NewCDNPTimer(9.7, 272180, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerDarkEchoesCD = mod : NewCDNPTimer ( 18.2 , 413044 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON )
local timerBoneShieldCD = mod : NewCDNPTimer ( 25.4 , 266201 , nil , nil , nil , 5 , nil , DBM_COMMON_L.MAGIC_ICON )
local timerWickedEmbraceCD = mod : NewCDNPTimer ( 8.5 , 266265 , nil , " RemoveMagic " , nil , 5 , nil , DBM_COMMON_L.MAGIC_ICON )
local timerWickedFrenzyCD = mod : NewCDNPTimer ( 25.4 , 266209 , nil , nil , nil , 5 , nil , DBM_COMMON_L.ENRAGE_ICON )
local timerWitheringCurseCD = mod : NewCDNPTimer ( 25.4 , 272180 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON )
local timerShadowBoltVolleyCD = mod : NewCDNPTimer ( 25.4 , 265487 , nil , nil , nil , 4 , nil , DBM_COMMON_L.INTERRUPT_ICON ) --25.4-27.7
local timerAbyssalReachCD = mod : NewCDNPTimer ( 16.1 , 272592 , nil , nil , nil , 3 )
local timerMaddeningGazeCD = mod : NewCDNPTimer ( 15.7 , 272609 , nil , nil , nil , 3 , nil , DBM_COMMON_L.HEALER_ICON , nil , mod : IsTank ( ) and 2 or nil , 3 ) --15.7-17
function mod : OnInitialize ( )
if self.Options . Timer272609cdCVoice == true then
self.Options . Timer272609cdCVoice = self : IsTank ( ) and 2
end
end
--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 : SPELL_CAST_START ( args )
if not self.Options . Enabled then return end
local spellId = args.spellId
if spellId == 272609 then
timerMaddeningGazeCD : Start ( nil , args.sourceGUID )
if self : AntiSpam ( 3 , 2 ) then
specWarnMaddeningGaze : Show ( )
specWarnMaddeningGaze : Play ( " shockwave " )
end
elseif spellId == 265019 and self : AntiSpam ( 3 , 2 ) then
specWarnSavageCleave : Show ( )
specWarnSavageCleave : Play ( " shockwave " )
elseif spellId == 265540 then
timerRottenBileCD : Start ( nil , args.sourceGUID )
if self : AntiSpam ( 3 , 2 ) then
specWarnRottenBile : Show ( )
specWarnRottenBile : Play ( " shockwave " )
end
elseif spellId == 266106 then
timerSonicScreechCD : Start ( nil , args.sourceGUID )
if self.Options . SpecWarn266106interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnSonicScreech : Show ( args.sourceName )
specWarnSonicScreech : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnSonicSreech : Show ( )
end
elseif spellId == 265089 then
if self.Options . SpecWarn265089interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnDarkReconstituion : Show ( args.sourceName )
specWarnDarkReconstituion : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnDarkReconstitution : Show ( )
end
elseif spellId == 265091 then
if self.Options . SpecWarn265091interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnGiftofGhuun : Show ( args.sourceName )
specWarnGiftofGhuun : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnGiftOfGhuun : Show ( )
end
elseif spellId == 265433 then
timerWitheringCurseCD : Start ( nil , args.sourceGUID )
if self.Options . SpecWarn265433interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnWitheringCurse : Show ( args.sourceName )
specWarnWitheringCurse : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnWitheringCurse : Show ( )
end
elseif spellId == 272183 then
if self.Options . SpecWarn272183interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnRaiseDead : Show ( args.sourceName )
specWarnRaiseDead : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 5 ) then
warnRaiseDead : Show ( )
end
elseif spellId == 278961 then
timerDecayingMindCD : Start ( nil , args.sourceGUID )
if self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnDecayingMind : Show ( args.sourceName )
specWarnDecayingMind : Play ( " kickcast " )
end
elseif spellId == 278755 then
if self.Options . SpecWarn278755interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnHarrowingDespair : Show ( args.sourceName )
specWarnHarrowingDespair : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnHarrowingDespair : Show ( )
end
elseif spellId == 272180 then
-- timerVoidSpitCD:Start(nil, args.sourceGUID)
if self.Options . SpecWarn272180interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnVoidSpit : Show ( args.sourceName )
specWarnVoidSpit : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnVoidSpit : Show ( )
end
elseif spellId == 265487 then
timerShadowBoltVolleyCD : Start ( nil , args.sourceGUID )
if self.Options . SpecWarn265487interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnShadowBoltVolley : Show ( args.sourceName )
specWarnShadowBoltVolley : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnShadowBoltVolley : Show ( )
end
elseif spellId == 272592 then
timerAbyssalReachCD : Start ( nil , args.sourceGUID )
if self : AntiSpam ( 3 , 2 ) then
specWarnAbyssalReach : Show ( )
specWarnAbyssalReach : Play ( " watchstep " )
end
elseif spellId == 265081 then
timerWarcryCD : Start ( nil , args.sourceGUID )
if self : AntiSpam ( 3 , 5 ) then
warnWarcry : Show ( )
end
elseif spellId == 266209 then
timerWickedFrenzyCD : Start ( nil , args.sourceGUID )
if self.Options . SpecWarn266209interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnWickedFrenzy : Show ( args.sourceName )
specWarnWickedFrenzy : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnWickedFrenzy : Show ( )
end
elseif spellId == 413044 then
timerDarkEchoesCD : Start ( nil , args.sourceGUID )
if self.Options . SpecWarn413044interrupt and self : CheckInterruptFilter ( args.sourceGUID , false , true ) then
specWarnDarkEchoes : Show ( args.sourceName )
specWarnDarkEchoes : Play ( " kickcast " )
elseif self : AntiSpam ( 2 , 7 ) then
warnDarkEchoes : Show ( )
end
end
end
function mod : SPELL_CAST_SUCCESS ( args )
if not self.Options . Enabled then return end
local spellId = args.spellId
if spellId == 265523 and self : AntiSpam ( 3 , 2 ) then
specWarnSpiritDrainTotemOut : Show ( )
specWarnSpiritDrainTotemOut : Play ( " watchstep " )
elseif spellId == 265016 then
timerBloodHarvestCD : Start ( nil , args.sourceGUID )
if args : IsPlayer ( ) then
yellBloodHarvest : Yell ( )
else
warnBloodHarvest : Show ( args.destName )
end
elseif spellId == 266201 then
timerBoneShieldCD : Start ( nil , args.sourceGUID )
elseif spellId == 266265 then
timerWickedEmbraceCD : Start ( nil , args.sourceGUID )
elseif spellId == 265668 then
timerWaveofDecayCD : 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 == 265568 and args : IsPlayer ( ) and not DBM : UnitDebuff ( " player " , spellId ) then
specWarnDarkOmen : Show ( )
specWarnDarkOmen : Play ( " range5 " )
yellDarkOmen : Yell ( )
elseif spellId == 266107 and args : IsPlayer ( ) and self : AntiSpam ( 3 , 1 ) then
specWarnThirstforBlood : Show ( )
specWarnThirstforBlood : Play ( " justrun " )
elseif spellId == 266209 and self : AntiSpam ( 3 , 5 ) then
specWarnWickedFrenzyDispel : Show ( args.destName )
specWarnWickedFrenzyDispel : Play ( " enrage " )
elseif spellId == 265091 and not args : IsDestTypePlayer ( ) and self : AntiSpam ( 4 , 3 ) then
specWarnGiftofGhuunDispel : Show ( args.destName )
specWarnGiftofGhuunDispel : Play ( " helpdispel " )
elseif spellId == 266201 and not args : IsDestTypePlayer ( ) and self : AntiSpam ( 4 , 3 ) then
specWarnBoneShieldDispel : Show ( args.destName )
specWarnBoneShieldDispel : Play ( " helpdispel " )
elseif spellId == 278789 and args : IsPlayer ( ) and self : AntiSpam ( 3 , 8 ) then
specWarnGTFO : Show ( args.spellName )
specWarnGTFO : Play ( " watchfeet " )
elseif spellId == 278961 and args : IsDestTypePlayer ( ) and self : CheckDispelFilter ( " disease " ) and self : AntiSpam ( 3 , 3 ) then
specWarnDecayingMindDispel : Show ( args.destName )
specWarnDecayingMindDispel : Play ( " helpdispel " )
end
end
function mod : UNIT_DIED ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 131436 then --Chosen Blood Matron
timerBloodHarvestCD : Stop ( args.destGUID )
timerWarcryCD : Stop ( args.destGUID )
elseif cid == 130909 then --Fetid Maggot
timerRottenBileCD : Stop ( args.destGUID )
elseif cid == 133870 then --Diseased Lasher
timerDecayingMindCD : Stop ( args.destGUID )
elseif cid == 133835 then --Feral Bloodswarmer
timerSonicScreechCD : Stop ( args.destGUID )
elseif cid == 138187 then --Grotesque Horror
-- timerVoidSpitCD:Stop(args.destGUID)
timerDarkEchoesCD : Stop ( args.destGUID )
elseif cid == 134284 then --Fallen Deathspeaker
timerWickedFrenzyCD : Stop ( args.destGUID )
timerWickedEmbraceCD : Stop ( args.destGUID )
elseif cid == 133912 then --Broodsworn Defiler
timerWitheringCurseCD : Stop ( args.destGUID )
timerShadowBoltVolleyCD : Stop ( args.destGUID )
elseif cid == 138281 then --Faceless Corruptor
timerAbyssalReachCD : Stop ( args.destGUID )
timerMaddeningGazeCD : Stop ( args.destGUID )
elseif cid == 133836 then --Reanimated Guardian
timerBoneShieldCD : Stop ( args.destGUID )
elseif cid == 133852 then --Living Rot
timerWaveofDecayCD : Start ( args.destGUID )
end
end