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.

313 lines
16 KiB

local mod = DBM:NewMod("MechagonTrash", "DBM-Party-BfA", 11)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240808043723")
--mod:SetModelID(47785)
mod.isTrashMod = true
mod.isTrashModBossFightAllowed = true
mod:RegisterEvents(
"SPELL_CAST_START 300687 300764 300777 300650 300159 300177 300171 299588 300087 300188 300207 299475 300414 300514 300436 300424 301681 301667 301629 284219 301088 294064 294290 294324 294349 293854 293986 293729",
"SPELL_CAST_SUCCESS 299525 294015 295169",
"SPELL_AURA_APPLIED 300650 299588 293930 300414 301629 284219 303941 294103 294180 294195 297133",
"SPELL_AURA_APPLIED_DOSE 299438 299474 299502 293670",
"SPELL_AURA_REMOVED 284219",
"UNIT_DIED"
)
--https://www.wowhead.com/guides/operation-mechagon-megadungeon-strategy-guide
--TODO, no actual logs, just drycoded using IDs and probable events for spells given by above guide.
--TODO, target scan https://www.wowhead.com/spell=299525/scrap-grenade used by Pistonhead Blaster? Cast is a bit short so it's more iffy
--TODO, add https://www.wowhead.com/spell=301689/charged-coil ?
--TODO, verify target scans on Scrap Cannon and B.O.R.K.
--TODO, https://www.wowhead.com/spell=301712/pounce is instant cast, can we scan target and is it worth it on something that probably isn't avoidable?
--TODO, https://www.wowhead.com/spell=282945/buzz-saw is environmental and probably not detectable, but add of it is
--TODO, verify peck target scanning (didn't seem to be working on towelliee's stream, just always announced aggro target)
local warnExhaust = mod:NewSpellAnnounce(300177, 2)--Heavy Scrapbot
local warnScrapGrenade = mod:NewSpellAnnounce(299525, 3)--Pistonhead Blaster (upgrade to specwarn/yell if target scan possible)
local warnSledgehammer = mod:NewStackAnnounce(299438, 2, nil, "Tank|Healer")--Pistonhead Scrapper
local warnRippingSlash = mod:NewStackAnnounce(299474, 2, nil, "Tank|Healer")--Saurolisk Bonenipper
local warnNanoslicer = mod:NewStackAnnounce(299502, 2, nil, "Tank|Healer")--Mechagon Trooper
local warnChainblade = mod:NewStackAnnounce(293670, 2, nil, "Tank|Healer")--Workshop Defender
local warnCharge = mod:NewCastAnnounce(301681, 3)--Mechagon Cavalry
local warnVolatileWaste = mod:NewCastAnnounce(294349, 4)--Living Waste
local warnShrunk = mod:NewTargetNoFilterAnnounce(284219, 1)
local warnSummonSquirrel = mod:NewSpellAnnounce(293854, 4)
local specWarnShockCoil = mod:NewSpecialWarningSpell(300207, nil, nil, nil, 2, 2)--Weaponized Crawler
local specWarnSlimewave = mod:NewSpecialWarningDodge(300777, nil, nil, nil, 2, 2)--Slime Elemental
local specWarnScrapCannon = mod:NewSpecialWarningDodge(300188, nil, nil, nil, 2, 2)--Weaponized Crawler
local yellScrapCannon = mod:NewYell(300188)--Weaponized Crawler
local specWarnBORK = mod:NewSpecialWarningDodge(299475, nil, nil, nil, 2, 2)--Scraphound
local yellBORK = mod:NewYell(299475)--Scraphound
local specWarnFlyingPeck = mod:NewSpecialWarningDodge(294064, nil, nil, nil, 2, 2)--Strider Tonk
--local yellFlyingPeck = mod:NewYell(294064)--Strider Tonk
local specWarnShockwave = mod:NewSpecialWarningDodge(300424, nil, nil, nil, 2, 2)--Scrapbone Bully
local specWarnRapidFire = mod:NewSpecialWarningDodge(301667, nil, nil, nil, 2, 2)--Mechagon Cavalry
local specWarnRocketBarrage = mod:NewSpecialWarningDodge(294103, nil, nil, nil, 2, 2)--Rocket Tonk
local specWarnSonicPulse = mod:NewSpecialWarningDodge(293986, nil, nil, nil, 2, 2)--Blastatron X-80/Spider Tank
local specWarnLaunchHERockets = mod:NewSpecialWarningDodge(294015, nil, nil, nil, 2, 2)--Blastatron X-80/Spider Tank
local specWarnCapacitorDischarge = mod:NewSpecialWarningDodge(295169, nil, nil, nil, 3, 2)--Blastatron X-80
local specWarnConsume = mod:NewSpecialWarningRun(300687, nil, nil, nil, 4, 2)--Toxic Monstrosity
local specWarnGyroScrap = mod:NewSpecialWarningRun(300159, "Melee", nil, nil, 4, 2)--Heavy Scrapbot
local specWarnMegaDrill = mod:NewSpecialWarningRun(294324, "Melee", nil, nil, 4, 2)--Waste Processing Unit
local specWarnProcessWaste = mod:NewSpecialWarningSpell(294290, nil, nil, nil, 1, 2)--Waste Processing Unit
local specWarnSlimeBolt = mod:NewSpecialWarningInterrupt(300764, "HasInterrupt", nil, nil, 1, 2)--Slime Elemental
local specWarnSuffocatingSmog = mod:NewSpecialWarningInterrupt(300650, "HasInterrupt", nil, nil, 1, 2)--Toxic Lurker
local specWarnRepairProtocol = mod:NewSpecialWarningInterrupt(300171, "HasInterrupt", nil, nil, 1, 2)--Heavy Scrapbot
local specWarnOverclock = mod:NewSpecialWarningInterrupt(299588, "HasInterrupt", nil, nil, 1, 2)--Pistonhead Mechanic
local specWarnRepair = mod:NewSpecialWarningInterrupt(300087, "HasInterrupt", nil, nil, 1, 2)--Pistonhead Mechanic
local specWarnEnrage = mod:NewSpecialWarningInterrupt(300414, "HasInterrupt", nil, nil, 1, 2)--Scrapbone Grinder/Scrapbone Bully
local specWarnStoneskin = mod:NewSpecialWarningInterrupt(300514, "HasInterrupt", nil, nil, 1, 2)--Scrapbone Shaman
local specWarnGraspingHex = mod:NewSpecialWarningInterrupt(300436, "HasInterrupt", nil, nil, 1, 2)--Scrapbone Shaman
local specWarnEnlarge = mod:NewSpecialWarningInterrupt(301629, "HasInterrupt", nil, nil, 1, 2)--Mechagon Renormalizer
local specWarnShrink = mod:NewSpecialWarningInterrupt(284219, "HasInterrupt", nil, nil, 1, 2)--Mechagon Renormalizer
local specWarnDetonate = mod:NewSpecialWarningInterrupt(301088, "HasInterrupt", nil, nil, 1, 2)--Bomb Tonk
local specWarnTuneUp = mod:NewSpecialWarningInterrupt(293729, "HasInterrupt", nil, nil, 1, 2)--
local specWarnShrinkYou = mod:NewSpecialWarningYou(284219, nil, nil, nil, 1, 2)
local yellShrunk = mod:NewShortYell(284219)--Shrunk will just say with white letters
local yellShrunkRepeater = mod:NewPlayerRepeatYell(284219)
local specWarnSuffocatingSmogDispel = mod:NewSpecialWarningDispel(300650, "RemoveDisease", nil, nil, 1, 2)--Toxic Lurker
local specWarnOverclockDispel = mod:NewSpecialWarningDispel(299588, "MagicDispeller", nil, nil, 1, 2)--Pistonhead Mechanic/Mechagon Mechanic
local specWarnEnlargeDispel = mod:NewSpecialWarningDispel(301629, "MagicDispeller", nil, nil, 1, 2)--Mechagon Renormalizer
local specWarnDefensiveCounter = mod:NewSpecialWarningDispel(303941, "MagicDispeller", nil, nil, 1, 2)--Anodized Coilbearer/Defense Bot Mk III
--local specWarnShrinkDispel = mod:NewSpecialWarningDispel(284219, "RemoveMagic", nil, nil, 1, 2)--Mechagon Renormalizer
local specWarnFlamingRefuseDispel = mod:NewSpecialWarningDispel(294180, "RemoveMagic", nil, nil, 1, 2)--Junkyard D.0.G.
local specWarnArcingZap = mod:NewSpecialWarningDispel(294195, "RemoveMagic", nil, nil, 1, 2)--Defense Bot Mk I/Defense Bot Mk III
local specWarnEnrageDispel = mod:NewSpecialWarningDispel(300414, "RemoveEnrage", nil, nil, 1, 2)--Scrapbone Grinder/Scrapbone Bully
--local specWarnRiotShield = mod:NewSpecialWarningReflect(258317, "CasterDps", nil, nil, 1, 2)
local timerConsumeCD = mod:NewCDNPTimer(20, 300687, nil, nil, nil, 2)--Toxic Monstrosity. 20 second based on guide, not actual log. might need fixing
local function shrunkYellRepeater(self)
yellShrunkRepeater:Yell()
self:Schedule(2, shrunkYellRepeater, self)
end
function mod:Scraptarget(targetname)
if not targetname then return end
if targetname == UnitName("player") and self:AntiSpam(4, 5) then
yellScrapCannon:Yell()
end
end
function mod:BORKtarget(targetname)
if not targetname then return end
if targetname == UnitName("player") and self:AntiSpam(4, 5) then
yellBORK:Yell()
end
end
--[[
function mod:Pecktarget(targetname, uId)
if not targetname then return end
if targetname == UnitName("player") and self:AntiSpam(4, 5) then
yellFlyingPeck:Yell()
end
end
--]]
--Antispam IDs for this mod: 1 run away, 2 dodge, 3 dispel, 4 incoming damage, 5 you/role, 6 misc
function mod:SPELL_CAST_START(args)
if not self.Options.Enabled then return end
local spellId = args.spellId
if spellId == 300687 and self:IsValidWarning(args.sourceGUID) then
if self:AntiSpam(3, 1) then
specWarnConsume:Show()
specWarnConsume:Play("justrun")
end
timerConsumeCD:Start(20, args.sourceGUID)
elseif spellId == 300159 and self:IsValidWarning(args.sourceGUID) and self:AntiSpam(3, 1) then
specWarnGyroScrap:Show()
specWarnGyroScrap:Play("justrun")
elseif spellId == 300777 and self:IsValidWarning(args.sourceGUID) and self:AntiSpam(3, 2) then
specWarnSlimewave:Show()
specWarnSlimewave:Play("chargemove")
elseif spellId == 300764 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnSlimeBolt:Show(args.sourceName)
specWarnSlimeBolt:Play("kickcast")
elseif spellId == 300650 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnSuffocatingSmog:Show(args.sourceName)
specWarnSuffocatingSmog:Play("kickcast")
elseif spellId == 300171 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnRepairProtocol:Show(args.sourceName)
specWarnRepairProtocol:Play("kickcast")
elseif spellId == 299588 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnOverclock:Show(args.sourceName)
specWarnOverclock:Play("kickcast")
elseif spellId == 300087 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnRepair:Show(args.sourceName)
specWarnRepair:Play("kickcast")
elseif spellId == 300414 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnEnrage:Show(args.sourceName)
specWarnEnrage:Play("kickcast")
elseif spellId == 300514 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnStoneskin:Show(args.sourceName)
specWarnStoneskin:Play("kickcast")
elseif spellId == 300436 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnGraspingHex:Show(args.sourceName)
specWarnGraspingHex:Play("kickcast")
elseif spellId == 301629 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnEnlarge:Show(args.sourceName)
specWarnEnlarge:Play("kickcast")
elseif spellId == 284219 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnShrink:Show(args.sourceName)
specWarnShrink:Play("kickcast")
elseif spellId == 301088 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnDetonate:Show(args.sourceName)
specWarnDetonate:Play("kickcast")
elseif spellId == 293729 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnTuneUp:Show(args.sourceName)
specWarnTuneUp:Play("kickcast")
elseif spellId == 300177 and self:IsValidWarning(args.sourceGUID) and self:AntiSpam(3, 6) then
warnExhaust:Show()
elseif spellId == 300188 and self:IsValidWarning(args.sourceGUID) then
if self:AntiSpam(3, 2) then
specWarnScrapCannon:Show()
specWarnScrapCannon:Play("shockwave")
end
self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "Scraptarget", 0.1, 8)
elseif spellId == 299475 and self:IsValidWarning(args.sourceGUID) then
if self:AntiSpam(3, 2) then
specWarnBORK:Show()
specWarnBORK:Play("shockwave")
end
self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "BORKtarget", 0.1, 8)
elseif spellId == 294064 and self:IsValidWarning(args.sourceGUID) then
if self:AntiSpam(3, 2) then
specWarnFlyingPeck:Show()
specWarnFlyingPeck:Play("shockwave")
end
--self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "Pecktarget", 0.1, 8)
elseif spellId == 300424 and self:IsValidWarning(args.sourceGUID) and self:AntiSpam(3, 2) then
specWarnShockwave:Show()
specWarnShockwave:Play("shockwave")
elseif spellId == 300207 and self:IsValidWarning(args.sourceGUID) and self:AntiSpam(3, 4) then
specWarnShockCoil:Show()
specWarnShockCoil:Play("aesoon")
elseif spellId == 301681 and self:AntiSpam(3, 6) then
warnCharge:Show()
elseif spellId == 301667 and self:AntiSpam(3, 2) then
specWarnRapidFire:Show()
specWarnRapidFire:Play("shockwave")--Or watchstep?
elseif spellId == 294324 and self:AntiSpam(3, 1) then
specWarnMegaDrill:Show()
specWarnMegaDrill:Play("justrun")
elseif spellId == 294290 and self:AntiSpam(3, 5) then
specWarnProcessWaste:Show()
if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
specWarnProcessWaste:Play("defensive")
else
specWarnProcessWaste:Play("shockwave")
end
elseif spellId == 294349 and self:AntiSpam(5, 4) then
warnVolatileWaste:Show()
elseif spellId == 293854 and self:AntiSpam(3, 6) then
warnSummonSquirrel:Show()
elseif spellId == 293986 and self:AntiSpam(3, 2) then
specWarnSonicPulse:Show()
specWarnSonicPulse:Play("shockwave")
end
end
function mod:SPELL_CAST_SUCCESS(args)
if not self.Options.Enabled then return end
local spellId = args.spellId
if spellId == 299525 and self:AntiSpam(3, 2) then
warnScrapGrenade:Show()--SUCCESS, because this needs to be dodged when it hits ground, not when it's traveling toward a target that's moving
elseif spellId == 294015 and self:AntiSpam(3, 2) then
specWarnLaunchHERockets:Show()
specWarnLaunchHERockets:Play("watchstep")
elseif spellId == 295169 and self:AntiSpam(3, 2) then
specWarnCapacitorDischarge:Show()
specWarnCapacitorDischarge:Play("farfromline")
end
end
function mod:SPELL_AURA_APPLIED(args)
if not self.Options.Enabled then return end
local spellId = args.spellId
if spellId == 300650 and args:IsDestTypePlayer() and self:CheckDispelFilter("disease") and self:AntiSpam(5, 3) then
specWarnSuffocatingSmogDispel:Show(args.destName)
specWarnSuffocatingSmogDispel:Play("helpdispel")
elseif (spellId == 299588 or spellId == 293930) and not args:IsDestTypePlayer() and self:AntiSpam(3, 3) then
specWarnOverclockDispel:Show(args.destName)
specWarnOverclockDispel:Play("helpdispel")
elseif spellId == 301629 and not args:IsDestTypePlayer() and self:AntiSpam(3, 3) then
specWarnEnlargeDispel:Show(args.destName)
specWarnEnlargeDispel:Play("helpdispel")
elseif (spellId == 303941 or spellId == 297133) and not args:IsDestTypePlayer() and self:AntiSpam(3, 3) then
specWarnDefensiveCounter:Show(args.destName)
specWarnDefensiveCounter:Play("helpdispel")
elseif spellId == 300414 and not args:IsDestTypePlayer() and self:AntiSpam(3, 3) then
specWarnEnrageDispel:Show(args.destName)
specWarnEnrageDispel:Play("enrage")
elseif spellId == 284219 then
if args:IsPlayer() then
specWarnShrinkYou:Show()
specWarnShrinkYou:Play("targetyou")
yellShrunk:Yell()
if self:IsMythic() then--Only repeat yell on mythic and mythic+
self:Unschedule(shrunkYellRepeater)
self:Schedule(2, shrunkYellRepeater, self)
end
-- elseif self.Options.SpecWarn284219dispel and self:CheckDispelFilter() then
-- specWarnShrinkDispel:Show(args.destName)
-- specWarnShrinkDispel:Play("helpdispel")
else
warnShrunk:Show(args.destName)
end
elseif spellId == 294180 and self:CheckDispelFilter("magic") then
specWarnFlamingRefuseDispel:Show(args.destName)
specWarnFlamingRefuseDispel:Play("helpdispel")
elseif spellId == 294195 and self:CheckDispelFilter("magic") then
specWarnArcingZap:CombinedShow(1, args.destName)
specWarnArcingZap:ScheduleVoice(1, "helpdispel")
elseif spellId == 294103 and self:AntiSpam(3, 2) then
specWarnRocketBarrage:Show()
specWarnRocketBarrage:Play("watchstep")
end
end
function mod:SPELL_AURA_APPLIED_DOSE(args)
if not self.Options.Enabled then return end
local spellId = args.spellId
if spellId == 299438 and args:IsDestTypePlayer() then
local amount = args.amount or 1
if (amount >= 3) and self:AntiSpam(3, 5) then
warnSledgehammer:Show(args.destName, amount)
end
elseif spellId == 299474 then
local amount = args.amount or 1
if (amount >= 3) and self:AntiSpam(3, 5) then
warnRippingSlash:Show(args.destName, amount)
end
elseif spellId == 299502 then
local amount = args.amount or 1
if (amount >= 3) and self:AntiSpam(3, 5) then
warnNanoslicer:Show(args.destName, amount)
end
elseif spellId == 293670 then
local amount = args.amount or 1
if (amount >= 3) and self:AntiSpam(3, 5) then
warnChainblade:Show(args.destName, amount)
end
end
end
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 284219 then
if args:IsPlayer() then
self:Unschedule(shrunkYellRepeater)
end
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 154744 or cid == 154758 or cid == 150168 then--Toxic Monstrosity
timerConsumeCD:Stop(args.destGUID)
end
end