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.
316 lines
15 KiB
316 lines
15 KiB
local mod = DBM:NewMod("BRHTrash", "DBM-Party-Legion", 1)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20240808043723")
|
|
--mod:SetModelID(47785)
|
|
mod:SetZone(1501)
|
|
|
|
mod.isTrashMod = true
|
|
mod.isTrashModBossFightAllowed = true
|
|
|
|
mod:RegisterEvents(
|
|
"SPELL_CAST_START 200261 221634 221688 225573 214003 199663 200105 196916 225732 196883 194966 200248 200256 200291 200784 200913 201139 201176 182118 214001 227913",--199663
|
|
"SPELL_CAST_SUCCESS 200343 225962 203163 204896 200784",--8599
|
|
"SPELL_AURA_APPLIED 194966 200105 200248 8599 203163",
|
|
"SPELL_AURA_APPLIED_DOSE 200084 225909 200248",
|
|
"SPELL_AURA_REMOVED 200248",
|
|
"UNIT_DIED"
|
|
)
|
|
|
|
--[[
|
|
(ability.id = 200261 or ability.id = 221634 or ability.id = 221688 or ability.id = 225573 or ability.id = 214003 or ability.id = 199663 or ability.id = 200105 or ability.id = 196916 or ability.id = 225732 or ability.id = 196883 or ability.id = 194966 or ability.id = 200248 or ability.id = 200256 or ability.id = 200291 or ability.id = 200784 or ability.id = 200913 or ability.id = 201139 or ability.id = 201176 or ability.id = 182118 or ability.id = 203163 or ability.id = 214001 or ability.id = 199663) and type = "begincast"
|
|
or (ability.id = 200343 or ability.id = 225962 or ability.id = 203163 or ability.id = 204896 or ability.id = 8599 or ability.id = 200784) and type = "cast"
|
|
--]]
|
|
--TODO, add Etch? http://www.wowhead.com/spell=198959/etch
|
|
--TODO, can't find spellId for Priceless artifact puddles. when found, add GTFO
|
|
--TODO, despite what two guides say, fel frenzy doesn't exist in any M+ logs at all
|
|
--NOTE, trash uses 194966 just like boss, the expression will pick up both
|
|
local warnSoulEchoes = mod:NewTargetAnnounce(194966, 2)
|
|
local warnSacrificeSoul = mod:NewTargetNoFilterAnnounce(200105, 2)
|
|
local warnSicBats = mod:NewTargetNoFilterAnnounce(203163, 2)
|
|
local warnArrowBarrage = mod:NewSpellAnnounce(200343, 4, nil, "-Healer", 2, nil, nil, 3)
|
|
local warnKnifeDance = mod:NewSpellAnnounce(200291, 4, nil, "-Healer", 2, nil, nil, 3)
|
|
local warnDrinkPotion = mod:NewSpellAnnounce(200784, 4, nil, "-Healer", 2, nil, nil, 3)
|
|
local warnBloodthirstyLeap = mod:NewSpellAnnounce(225962, 2, nil, false)--Instant cast, announcing it already happened doesn't affect much agency to player
|
|
local warnGlaiveToss = mod:NewCastAnnounce(196916, 3)
|
|
local warnPhasedExplosion = mod:NewCastAnnounce(200256, 3, nil, nil, false)--They basically spam cast it, so off by default
|
|
local warnFelFrenzy = mod:NewCastAnnounce(227913, 4)--High prio off internet
|
|
local warnSoulVenom = mod:NewStackAnnounce(225909, 2)
|
|
|
|
local specWarnSicBats = mod:NewSpecialWarningYou(203163, nil, nil, nil, 1, 2)
|
|
local specWarnStrikeDown = mod:NewSpecialWarningDefensive(225732, nil, nil, nil, 1, 2)
|
|
local specWarnCoupdeGrace = mod:NewSpecialWarningDefensive(214003, nil, nil, nil, 1, 2)
|
|
local specWarnBrutalAssault = mod:NewSpecialWarningDefensive(201139, nil, nil, nil, 1, 2)
|
|
local specWarnBonebreakingStrike = mod:NewSpecialWarningDodge(200261, nil, nil, nil, 2, 2)--Even tank can side step it, but tank can also aim it away from others
|
|
local specWarnWhirlOfFlame = mod:NewSpecialWarningDodge(221634, nil, nil, nil, 2, 2)
|
|
local specWarnIndigestion = mod:NewSpecialWarningDodge(200913, nil, nil, nil, 2, 2)
|
|
local specWarnThrowArtifact = mod:NewSpecialWarningDodge(201176, nil, nil, nil, 2, 2)
|
|
local specWarnRavensDive = mod:NewSpecialWarningDodge(214001, nil, nil, nil, 2, 2)
|
|
local specWarnOverDetonation = mod:NewSpecialWarningRun(221688, nil, nil, nil, 4, 2)
|
|
local specWarnSoulEchos = mod:NewSpecialWarningMoveAway(194966, nil, nil, nil, 1, 2)
|
|
local yellArrowBarrage = mod:NewYell(200343)
|
|
local specWarnSpiritBlast = mod:NewSpecialWarningInterrupt(196883, "HasInterrupt", nil, nil, 1, 2)
|
|
local specWarnDarkMending = mod:NewSpecialWarningInterrupt(225573, "HasInterrupt", nil, nil, 1, 2)
|
|
local specWarnSoulBlast = mod:NewSpecialWarningInterrupt(199663, "HasInterrupt", nil, nil, 1, 2)
|
|
local specWarnArcaneBlitz = mod:NewSpecialWarningInterrupt(200248, "HasInterrupt", nil, nil, 1, 2)
|
|
local specWarnFelFrenzy = mod:NewSpecialWarningInterrupt(227913, "HasInterrupt", nil, nil, 1, 2)--High Priority
|
|
local specWarnSoulBlade = mod:NewSpecialWarningDispel(200084, "RemoveMagic", nil, nil, 1, 2)
|
|
local specWarnDrainLife = mod:NewSpecialWarningDispel(204896, "RemoveMagic", nil, nil, 1, 2)
|
|
local specWarnEnrage = mod:NewSpecialWarningDispel(8599, "RemoveEnrage", nil, 2, 1, 2)
|
|
|
|
local timerRP = mod:NewRPTimer(68)
|
|
local timerSacrificeSoulCD = mod:NewCDNPTimer(21.8, 200105, nil, "HasInterrupt", nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
|
|
local timerGlaiveTossCD = mod:NewCDNPTimer(14.5, 196916, nil, nil, nil, 3)
|
|
local timerStrikeDownCD = mod:NewCDNPTimer(9.7, 225732, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
local timerBonebreakingStrikeCD = mod:NewCDNPTimer(21, 200261, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
local timerKnifeDanceCD = mod:NewCDNPTimer(18.1, 200291, nil, nil, nil, 2)
|
|
local timerArrowBarrageCD = mod:NewCDNPTimer(20.6, 200343, nil, nil, nil, 3)--20.7-23
|
|
local timerBloodthirstyLeapCD = mod:NewCDNPTimer(14.5, 225962, nil, nil, nil, 3)
|
|
local timerDrainLifeCD = mod:NewCDNPTimer(16.8, 204896, nil, nil, nil, 3)--16.8-19
|
|
local timerBrutalAssaultCD = mod:NewCDNPTimer(20.6, 201139, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
local timerDrinkPotionCD = mod:NewCDNPTimer(21.8, 200784, nil, nil, nil, 5)
|
|
local timerSicBatsCD = mod:NewCDNPTimer(21.8, 203163, nil, nil, nil, 5)
|
|
local timerCoupdeGraceCD = mod:NewCDNPTimer(8.4, 214003, nil, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
local timerRavensDiveCD = mod:NewCDNPTimer(16, 214001, nil, nil, nil, 3)
|
|
|
|
--Antispam IDs for this mod: 1 run away, 2 dodge, 3 dispel, 4 incoming damage, 5 you/role, 6 misc, 7 off interrupt, 8 GTFO
|
|
|
|
local blitzStacks = {}
|
|
|
|
--"<2.04 23:10:40> [BOSS_KILL] 1832#Amalgam of Souls", -- [27]
|
|
--"<2.07 23:10:40> [CLEU] UNIT_DIED##nil#Creature-0-4225-1501-17971-98542-00007A7FD4#Amalgam of Souls#-1#false#nil#nil", -- [28]
|
|
--"<10.62 23:10:49> [CHAT_MSG_MONSTER_SAY] The darkness... it is gone.#Lady Velandras Ravencrest###Omegal##0#0##0#2108#nil#0#false#false#false#false", -- [37]
|
|
--"<15.93 23:10:54> [CHAT_MSG_MONSTER_YELL] You... aren't the ones who did this?#Lord Etheldrin Ravencrest###Omegal##0#0##0#2109#nil#0#false#false#false#false", -- [38]
|
|
--"<29.29 23:11:07> [CHAT_MSG_MONSTER_SAY] I... understand now. You... you must find Kur'talos. You must put a stop to this.#Lord Etheldrin Ravencrest###Darksøl##0#0##0#2110#nil#0#false#false#false#false", -- [39]
|
|
--"<39.20 23:11:17> [ZONE_CHANGED_INDOORS] Black Rook Hold#Black Rook Hold#Hidden Passageway", -- [41]
|
|
function mod:StartFirstRP()
|
|
timerRP:Start(35)--Adjusted based on twitch streams
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
if not self.Options.Enabled then return end
|
|
if not self:IsValidWarning(args.sourceGUID) then return end
|
|
local spellId = args.spellId
|
|
if spellId == 200261 then
|
|
timerBonebreakingStrikeCD:Start(nil, args.sourceGUID)
|
|
if self:AntiSpam(3, 2) then
|
|
specWarnBonebreakingStrike:Show()
|
|
specWarnBonebreakingStrike:Play("shockwave")
|
|
end
|
|
elseif spellId == 200913 and self:AntiSpam(3, 2) then
|
|
specWarnIndigestion:Show()
|
|
specWarnIndigestion:Play("shockwave")
|
|
elseif spellId == 201176 and self:AntiSpam(3, 2) then
|
|
specWarnThrowArtifact:Show()
|
|
specWarnThrowArtifact:Play("watchstep")
|
|
elseif spellId == 221634 then
|
|
if self:AntiSpam(3, 2) then
|
|
specWarnWhirlOfFlame:Show()
|
|
specWarnWhirlOfFlame:Play("watchstep")
|
|
end
|
|
elseif spellId == 214001 then
|
|
timerRavensDiveCD:Start(nil, args.sourceGUID)
|
|
if self:AntiSpam(3, 2) then
|
|
specWarnRavensDive:Show()
|
|
specWarnRavensDive:Play("watchstep")
|
|
end
|
|
elseif spellId == 221688 then
|
|
if self:AntiSpam(3, 1) then
|
|
specWarnOverDetonation:Show()
|
|
specWarnOverDetonation:Play("justrun")
|
|
end
|
|
elseif spellId == 225573 then
|
|
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
|
|
specWarnDarkMending:Show(args.sourceName)
|
|
specWarnDarkMending:Play("kickcast")
|
|
end
|
|
elseif spellId == 182118 or spellId == 227913 then
|
|
if self.Options.SpecWarn227913interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
|
|
specWarnFelFrenzy:Show(args.sourceName)
|
|
specWarnFelFrenzy:Play("kickcast")
|
|
elseif self:AntiSpam(3, 7) then
|
|
warnFelFrenzy:Show()
|
|
end
|
|
elseif spellId == 199663 then
|
|
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
|
|
specWarnSoulBlast:Show(args.sourceName)
|
|
specWarnSoulBlast:Play("kickcast")
|
|
end
|
|
elseif spellId == 196883 then
|
|
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
|
|
specWarnSpiritBlast:Show(args.sourceName)
|
|
specWarnSpiritBlast:Play("kickcast")
|
|
end
|
|
elseif spellId == 200248 then
|
|
--Excessively throttle it cause ability is literally spammed so we check stacks, we check interrupt CD, and we even 3 second throttle it
|
|
if blitzStacks[args.destGUID] and blitzStacks[args.destGUID] >= 5 and self:CheckInterruptFilter(args.sourceGUID, false, true) and self:AntiSpam(3, 5) then
|
|
specWarnArcaneBlitz:Show(args.sourceName)
|
|
specWarnArcaneBlitz:Play("kickcast")
|
|
end
|
|
elseif spellId == 214003 then
|
|
timerCoupdeGraceCD:Start(nil, args.sourceGUID)
|
|
if self:IsTanking("player", nil, nil, true, args.sourceGUID) and self:AntiSpam(3, 5) then
|
|
specWarnCoupdeGrace:Show()
|
|
specWarnCoupdeGrace:Play("defensive")
|
|
end
|
|
elseif spellId == 225732 then
|
|
timerStrikeDownCD:Start(nil, args.sourceGUID)
|
|
if self:IsTanking("player", nil, nil, true, args.sourceGUID) and self:AntiSpam(3, 5) then
|
|
specWarnStrikeDown:Show()
|
|
specWarnStrikeDown:Play("defensive")
|
|
end
|
|
elseif spellId == 200105 then
|
|
timerSacrificeSoulCD:Start(nil, args.sourceGUID)
|
|
elseif spellId == 196916 then
|
|
timerGlaiveTossCD:Start(nil, args.sourceGUID)
|
|
if self:AntiSpam(3, 6) then
|
|
warnGlaiveToss:Show()
|
|
end
|
|
elseif spellId == 194966 then
|
|
--Soul Echoes Timer
|
|
elseif spellId == 200256 then
|
|
warnPhasedExplosion:Show()
|
|
elseif spellId == 200291 then
|
|
timerKnifeDanceCD:Start(nil, args.sourceGUID)
|
|
if self:AntiSpam(5, 6) then
|
|
warnKnifeDance:Show()
|
|
warnKnifeDance:Play("crowdcontrol")
|
|
end
|
|
elseif spellId == 200784 then
|
|
--Starts 4.8 second recast timer on cast start
|
|
--ie it'll recast after 4.8 seconds if this cast is stopped
|
|
--But if it finishes casting, goes on ?? second CD
|
|
timerDrinkPotionCD:Start(4.8, args.sourceGUID)
|
|
if self:AntiSpam(3.5, 6) then
|
|
warnDrinkPotion:Show()
|
|
warnDrinkPotion:Play("crowdcontrol")
|
|
end
|
|
elseif spellId == 201139 then
|
|
timerBrutalAssaultCD:Start(nil, args.sourceGUID)
|
|
if self:IsTanking("player", nil, nil, true, args.sourceGUID) and self:AntiSpam(3, 5) then
|
|
specWarnBrutalAssault:Show()
|
|
specWarnBrutalAssault:Play("defensive")
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
|
if not self.Options.Enabled then return end
|
|
local spellId = args.spellId
|
|
if spellId == 200343 then
|
|
timerArrowBarrageCD:Start(nil, args.sourceGUID)
|
|
if self:AntiSpam(5, 6) then
|
|
warnArrowBarrage:Show()
|
|
warnArrowBarrage:Play("crowdcontrol")
|
|
end
|
|
if args:IsPlayer() and self:AntiSpam(3, 6) then
|
|
yellArrowBarrage:Yell()
|
|
end
|
|
elseif spellId == 225962 then--225962 first leap, 225963 second leap (which we don't care about for announce/timer purposes)
|
|
timerBloodthirstyLeapCD:Start(nil, args.sourceGUID)
|
|
if self:AntiSpam(3, 6) then
|
|
warnBloodthirstyLeap:Show()
|
|
end
|
|
elseif spellId == 203163 then
|
|
--Does not go on CD until it's cast. if it's stunned, it's recast within a 3-5 sec cast window
|
|
timerSicBatsCD:Start(16, args.sourceGUID)
|
|
elseif spellId == 204896 then
|
|
timerDrainLifeCD:Start(nil, args.sourceGUID)
|
|
if self:CheckDispelFilter("magic") and self:AntiSpam(3, 3) then
|
|
specWarnDrainLife:Show(args.destName)
|
|
specWarnDrainLife:Play("helpdispel")
|
|
end
|
|
elseif spellId == 200784 then
|
|
--Starts 4.8 second recast timer on cast start
|
|
--ie it'll recast after 4.8 seconds if this cast is stopped
|
|
--But if it finishes casting, goes on ?? second CD
|
|
timerDrinkPotionCD:Stop(args.sourceGUID)
|
|
--TODO, when it's recast is it actually goes on cooldown
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
if not self.Options.Enabled then return end
|
|
local spellId = args.spellId
|
|
if spellId == 194966 then
|
|
if args:IsPlayer() then
|
|
specWarnSoulEchos:Show()
|
|
specWarnSoulEchos:Play("runout")
|
|
specWarnSoulEchos:ScheduleVoice(1, "keepmove")
|
|
else
|
|
warnSoulEchoes:Show(args.destName)
|
|
end
|
|
elseif spellId == 200084 and args:IsDestTypePlayer() then
|
|
local amount = args.amount or 1
|
|
if amount % 2 == 0 and self:CheckDispelFilter("magic") and self:AntiSpam(3, 3) then
|
|
specWarnSoulBlade:Show(args.destName)
|
|
specWarnSoulBlade:Play("helpdispel")
|
|
end
|
|
elseif spellId == 225909 and args:IsDestTypePlayer() then
|
|
local amount = args.amount or 1
|
|
if (amount % 10 == 0) and (self:CheckDispelFilter("magic") or args:IsPlayer()) and self:AntiSpam(3, 3) then
|
|
warnSoulVenom:Show(args.destName, amount)
|
|
end
|
|
elseif spellId == 200105 then
|
|
warnSacrificeSoul:Show(args.sourceName)--Source name used, we want to kill the actor not the target (sometimes one in same though)
|
|
elseif spellId == 200248 then
|
|
blitzStacks[args.destGUID] = args.amount or 1
|
|
elseif spellId == 8599 and self:AntiSpam(4, 3) then
|
|
specWarnEnrage:Show(args.destName)
|
|
specWarnEnrage:Play("enrage")
|
|
elseif spellId == 203163 then
|
|
if args:IsPlayer() then
|
|
specWarnSicBats:Show()
|
|
specWarnSicBats:Play("targetyou")
|
|
else
|
|
warnSicBats: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 == 200248 then
|
|
blitzStacks[args.destGUID] = nil
|
|
end
|
|
end
|
|
|
|
function mod:UNIT_DIED(args)
|
|
local cid = self:GetCIDFromGUID(args.destGUID)
|
|
if cid == 98368 then--ghostly-protector
|
|
timerSacrificeSoulCD:Stop(args.destGUID)
|
|
-- elseif cid == 98370 then--ghostly-councilor
|
|
--Soul Blast
|
|
elseif cid == 98538 then--lady-velandras-ravencrest#drops;mode:normal
|
|
timerGlaiveTossCD:Stop(args.destGUID)
|
|
timerStrikeDownCD:Stop(args.destGUID)
|
|
-- elseif cid == 98521 then--lord-etheldrin-ravencrest
|
|
--Spirit Blast
|
|
--Soul Echoes
|
|
elseif cid == 98275 then--risen-archer
|
|
timerArrowBarrageCD:Stop(args.destGUID)
|
|
elseif cid == 98280 then--risen-arcanist
|
|
blitzStacks[args.destGUID] = nil
|
|
elseif cid == 98691 then--risen-scout
|
|
timerKnifeDanceCD:Stop(args.destGUID)
|
|
elseif cid == 98243 or cid == 98706 then--soul-torn-champion / commander-shemdahsohn
|
|
timerBonebreakingStrikeCD:Stop(args.destGUID)
|
|
elseif cid == 101839 then--risen-companion
|
|
timerBloodthirstyLeapCD:Stop(args.destGUID)
|
|
elseif cid == 98810 then--wrathguard-bladelord
|
|
timerBrutalAssaultCD:Stop(args.destGUID)
|
|
elseif cid == 98792 then--wyrmtongue-scavenger
|
|
timerDrinkPotionCD:Stop()
|
|
elseif cid == 102788 then--felspite-dominator
|
|
--Fel Frenzy
|
|
timerSicBatsCD:Stop(args.destGUID)
|
|
elseif cid == 102094 then--risen-swordsman
|
|
timerCoupdeGraceCD:Stop(args.destGUID)
|
|
elseif cid == 102095 then--risen-lancer
|
|
timerRavensDiveCD:Stop(args.destGUID)
|
|
elseif cid == 98813 then--Bloodscent Felhouhd
|
|
timerDrainLifeCD:Stop(args.destGUID)
|
|
end
|
|
end
|
|
|