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.
333 lines
14 KiB
333 lines
14 KiB
local mod = DBM:NewMod(2611, "DBM-Raids-WarWithin", 1, 1273)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20240704050257")
|
|
mod:SetCreatureID(214502)
|
|
mod:SetEncounterID(2917)
|
|
mod:SetUsedIcons(3, 4, 5, 6, 7, 8)
|
|
mod:SetHotfixNoticeRev(20240628000000)
|
|
--mod:SetMinSyncRevision(20230929000000)
|
|
mod.respawnTime = 29
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEventsInCombat(
|
|
"SPELL_CAST_START 444363 452237 445936 442530 451288 445016 445174",
|
|
"SPELL_CAST_SUCCESS 443203",
|
|
"SPELL_SUMMON 444830 444835",
|
|
"SPELL_AURA_APPLIED 443612 452245 443042 445272",
|
|
"SPELL_AURA_APPLIED_DOSE 445272",
|
|
"SPELL_AURA_REMOVED 443612 452245 443042",
|
|
"SPELL_PERIODIC_DAMAGE 445518",
|
|
"SPELL_PERIODIC_MISSED 445518",
|
|
"UNIT_DIED"
|
|
-- "UNIT_SPELLCAST_SUCCEEDED boss1"
|
|
)
|
|
|
|
--TODO, maybe further warn when the aoe damage from Goresplatter starts for healers?
|
|
--TODO, possibly infoframe for Membrane healoffs?
|
|
--TODO, repeating yell for grasp? it spams bad stuff on ground for entire 12 seconds that affects other players
|
|
--TODO, fade boss timers and squelch boss alerts if player is in Baneful shift, if they are unaffected by boss abilities while shifted
|
|
--TODO, also announce add spawns if they aren't automatically spawn with another boss ability (like disgorge)
|
|
--TODO, can blood horrors be killed? should they be auto marked with https://www.wowhead.com/beta/spell=445197/manifest-horror ?
|
|
--TODO, Manifest Horror nameplate timer? i kinda assume it's just sort of spam cast til dead
|
|
--TODO, change option keys to match BW for weak aura compatability before live
|
|
--TODO, possibly rework timers to restart on Goresplatter so they can be more accurate and not rely in hacky fixes
|
|
--TODO, add spawn nameplate timer
|
|
--TODO, track personal https://www.wowhead.com/beta/spell=445570/unseeming-blight ?
|
|
--[[
|
|
(ability.id = 444363 or ability.id = 452237 or ability.id = 445936 or ability.id = 442530 or ability.id = 451288 or ability.id = 445016 or ability.id = 445174) and type = "begincast"
|
|
or ability.id = 443203 and type = "cast"
|
|
or ability.id = 443042 and type = "applydebuff"
|
|
or (ability.id = 444830 or ability.id = 444835) and type = "summon"
|
|
--]]
|
|
local warnBanefulShift = mod:NewYouAnnounce(443612, 2)
|
|
local warnBanefulShiftFades = mod:NewFadesAnnounce(443612, 2)
|
|
local warnCrimsonRain = mod:NewCountAnnounce(443203, 2)
|
|
local warnGraspFromBeyondFades = mod:NewFadesAnnounce(443042, 1, nil, nil, 367465, nil, nil, 2)
|
|
|
|
local specWarnGruesomeDisgorge = mod:NewSpecialWarningCount(444363, nil, nil, nil, 1, 2)
|
|
local specWarnBanefulShift = mod:NewSpecialWarningTaunt(443612, nil, nil, nil, 1, 2)
|
|
local specWarnBloodcurdle = mod:NewSpecialWarningMoveAway(452237, nil, nil, nil, 1, 2, 4)
|
|
local yellBloodcurdle = mod:NewShortYell(452237)
|
|
local yellBloodcurdleFades = mod:NewShortFadesYell(452237)
|
|
local specWarnSpewingHemorrhage = mod:NewSpecialWarningRunCount(445936, nil, nil, nil, 4, 2)
|
|
local specWarnGoresplatter = mod:NewSpecialWarningDodgeCount(442530, nil, nil, nil, 2, 2)
|
|
local specWarnGraspFromBeyond = mod:NewSpecialWarningMoveAway(443042, nil, 367465, nil, 1, 2)
|
|
local yellGraspFromBeyond = mod:NewShortYell(443042, 285205)--ShortYell "Tentacle"
|
|
local specWarnGTFO = mod:NewSpecialWarningGTFO(445518, nil, nil, nil, 1, 8)
|
|
|
|
local timerGruesomeDigorgeCD = mod:NewNextCountTimer(49, 444363, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
local timerBanefulShift = mod:NewBuffFadesTimer(40, 443612, nil, nil, nil, 5)
|
|
local timerBloodcurdleCD = mod:NewNextCountTimer(40, 452237, DBM_COMMON_L.SPREADS.." (%s)", nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)
|
|
local timerSpewingHemorrhageCD = mod:NewNextCountTimer(40, 445936, nil, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON)
|
|
local timerGoresplatterCD = mod:NewNextCountTimer(128, 442530, nil, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON..DBM_COMMON_L.DEADLY_ICON)
|
|
local timerCrimsonRainCD = mod:NewNextCountTimer(128, 443203, nil, nil, nil, 3, nil, DBM_COMMON_L.HEALER_ICON)
|
|
local timerGraspFromBeyondCD = mod:NewNextCountTimer(40, 443042, 367465, nil, nil, 3)--ShortYell "Tentacles"
|
|
--The Unseeming
|
|
mod:AddTimerLine(DBM:GetSpellName(462306))
|
|
local warnManifestHorror = mod:NewCastAnnounce(445174, 4, nil, nil, false, 2)--Spammy, opt in
|
|
local warnBloodPact = mod:NewStackAnnounce(445272, 2)
|
|
|
|
local specWarnBlackBulwark = mod:NewSpecialWarningInterruptCount(451288, "HasInterrupt", nil, nil, 1, 2)
|
|
local specWarnSpectralSlam = mod:NewSpecialWarningDefensive(445016, nil, nil, nil, 1, 2)
|
|
|
|
local timerBlackBulwarkCD = mod:NewCDNPTimer(15.5, 451288, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)--Nameplate only timer
|
|
local timerSpectralSlamCD = mod:NewCDNPTimer(13.4, 445016, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)--Nameplate only, larger variation
|
|
|
|
--mod:AddInfoFrameOption(407919, true)
|
|
mod:AddSetIconOption("SetIconOnWatchers", 444830, true, 5, {8})
|
|
mod:AddSetIconOption("SetIconOnHarb", 444835, true, 5, {3, 4, 5, 6, 7})--Harbingers spawn with watchers in following sequence: 1 1 2 2 3 3 4 4 (not seen further than this)
|
|
--mod:AddPrivateAuraSoundOption(426010, true, 425885, 4)
|
|
|
|
mod.vb.disgorgeCount = 0
|
|
mod.vb.curdleCount = 0
|
|
mod.vb.hemorrhageCount = 0
|
|
mod.vb.goresplatterCount = 0
|
|
mod.vb.membraneCount = 0
|
|
mod.vb.graspCount = 0
|
|
local castsPerGUID = {}
|
|
local addUsedMarks = {}
|
|
--local playerPhased = false
|
|
|
|
function mod:OnCombatStart(delay)
|
|
self.vb.disgorgeCount = 0
|
|
self.vb.curdleCount = 0
|
|
self.vb.hemorrhageCount = 0
|
|
self.vb.goresplatterCount = 0
|
|
self.vb.membraneCount = 0
|
|
self.vb.graspCount = 0
|
|
table.wipe(castsPerGUID)
|
|
table.wipe(addUsedMarks)
|
|
--playerPhased = false
|
|
timerCrimsonRainCD:Start(11, 1)
|
|
timerGruesomeDigorgeCD:Start(self:IsMythic() and 14 or 16, 1)
|
|
timerGraspFromBeyondCD:Start(self:IsMythic() and 19.1 or 22, 1)
|
|
if self:IsHard() then
|
|
timerSpewingHemorrhageCD:Start(32, 1)
|
|
end
|
|
if self:IsMythic() then
|
|
timerBloodcurdleCD:Start(9, 1)
|
|
end
|
|
timerGoresplatterCD:Start(120, 1)
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
local spellId = args.spellId
|
|
if spellId == 444363 then
|
|
--16.0, 51.0, 77.0, 51.0, 77.0, 51.0, 77.1, 51.0 (heroic and normal)
|
|
--14.0, 59.0, 69.1, 59.0, 69.1, 58.9, 69.0 (mythic)
|
|
self.vb.disgorgeCount = self.vb.disgorgeCount + 1
|
|
specWarnGruesomeDisgorge:Show(self.vb.disgorgeCount)
|
|
specWarnGruesomeDisgorge:Play("shockwave")
|
|
if self.vb.disgorgeCount % 2 == 0 then
|
|
timerGruesomeDigorgeCD:Start(self:IsMythic() and 69.1 or 77, self.vb.disgorgeCount+1)
|
|
else
|
|
timerGruesomeDigorgeCD:Start(self:IsMythic() and 59 or 51, self.vb.disgorgeCount+1)
|
|
end
|
|
elseif spellId == 452237 then
|
|
--9.0, 32.0, 27.0, 32.0, 37.0, 32.0, 27.0, 32.0, 37.0, 32.0, 27.0, 32.0, 37.0, 32.0
|
|
--(37.0, 32.0, 27.0, 32.0 repeating)
|
|
self.vb.curdleCount = self.vb.curdleCount + 1
|
|
if self.vb.curdleCount % 4 == 2 then
|
|
timerBloodcurdleCD:Start(27, self.vb.curdleCount+1)
|
|
elseif self.vb.curdleCount % 4 == 4 then
|
|
timerBloodcurdleCD:Start(37, self.vb.curdleCount+1)
|
|
else--1 and 3
|
|
timerBloodcurdleCD:Start(32, self.vb.curdleCount+1)
|
|
end
|
|
elseif spellId == 445936 then
|
|
--32.0, 49.0, 79.0, 49.0, 79.0, 49.0, 79.0, 49.0 (heroic)
|
|
--32.0, 59.0, 69.1, 59.0, 69.0, 59.0, 69.0 (Mythic)
|
|
self.vb.hemorrhageCount = self.vb.hemorrhageCount + 1
|
|
specWarnSpewingHemorrhage:Show(self.vb.hemorrhageCount)
|
|
specWarnSpewingHemorrhage:Play("justrun")
|
|
if self.vb.hemorrhageCount % 2 == 0 then
|
|
timerSpewingHemorrhageCD:Start(self:IsMythic() and 69.1 or 79, self.vb.hemorrhageCount+1)
|
|
else
|
|
timerSpewingHemorrhageCD:Start(self:IsMythic() and 59 or 49, self.vb.hemorrhageCount+1)
|
|
end
|
|
elseif spellId == 442530 then
|
|
self.vb.goresplatterCount = self.vb.goresplatterCount + 1
|
|
specWarnGoresplatter:Show(self.vb.goresplatterCount)
|
|
specWarnGoresplatter:Play("watchstep")
|
|
timerGoresplatterCD:Start(nil, self.vb.goresplatterCount+1)
|
|
if self:IsEasy() then
|
|
--Dirty fix just for normal for now. It's likely all timers should be restarted here in stead of sequenced though
|
|
timerGraspFromBeyondCD:Stop()
|
|
timerGraspFromBeyondCD:Start(30, self.vb.graspCount+1)
|
|
end
|
|
elseif spellId == 451288 then
|
|
--Backup, in case SPELL_SUMMON not exposed
|
|
if not castsPerGUID[args.sourceGUID] then
|
|
castsPerGUID[args.sourceGUID] = 0
|
|
if self.Options.SetIconOnWatchers then
|
|
self:ScanForMobs(args.sourceGUID, 2, 8, 1, nil, 12, "SetIconOnWatchers", nil, nil, true)
|
|
end
|
|
end
|
|
castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
|
|
local count = castsPerGUID[args.sourceGUID]
|
|
if self:CheckInterruptFilter(args.sourceGUID, false, false) then--Count interrupt, so cooldown is not checked
|
|
specWarnBlackBulwark:Show(args.sourceName, count)
|
|
if count < 6 then
|
|
specWarnBlackBulwark:Play("kick"..count.."r")
|
|
else
|
|
specWarnBlackBulwark:Play("kickcast")
|
|
end
|
|
end
|
|
timerBlackBulwarkCD:Start(nil, args.sourceGUID)
|
|
elseif spellId == 445016 then
|
|
timerSpectralSlamCD:Start(nil, args.sourceGUID)
|
|
if self:IsTanking("player", nil, nil, true, args.sourceGUID) then
|
|
specWarnSpectralSlam:Show()
|
|
specWarnSpectralSlam:Play("defensive")
|
|
end
|
|
elseif spellId == 445174 and self:AntiSpam(3, 1) then
|
|
warnManifestHorror:Show()
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
|
local spellId = args.spellId
|
|
if spellId == 443203 then
|
|
--"Crimson Rain-443203-npc:214502-00006B455A = pull:11.0, 128.0, 128.0, 128.0" (heroic) (mythic is same)
|
|
self.vb.membraneCount = self.vb.membraneCount +1
|
|
warnCrimsonRain:Show(self.vb.membraneCount)
|
|
timerCrimsonRainCD:Start(nil, self.vb.membraneCount+1)--128
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_SUMMON(args)
|
|
local spellId = args.spellId
|
|
if spellId == 444830 then--Lost Watcher
|
|
if not castsPerGUID[args.destGUID] then
|
|
castsPerGUID[args.destGUID] = 0
|
|
--timerBlackBulwarkCD:Start(nil, args.destGUID)
|
|
--timerSpectralSlamCD:Start(nil, args.destGUID)
|
|
if self.Options.SetIconOnWatchers then
|
|
self:ScanForMobs(args.destGUID, 2, 8, 1, nil, 12, "SetIconOnWatchers", nil, nil, true)
|
|
end
|
|
end
|
|
elseif spellId == 444835 then--Forgotten Harbinger
|
|
if not castsPerGUID[args.destGUID] then
|
|
castsPerGUID[args.destGUID] = 0
|
|
if self.Options.SetIconOnHarb then
|
|
--Boss always spawns 3 adds on normal and 4 on mythic (heroic unknown, it worked diff during that test)
|
|
--We reserve skull for watcher, and 7 6 5 for harbingers. We also allow 2 extra in case there is a left over add or two on a bad pull
|
|
--We do not touch icon 1 or 2 because some strats were marking tanks so we're leaving 1 and 2 free
|
|
for i = 7, 3, -1 do
|
|
if not addUsedMarks[i] then
|
|
addUsedMarks[i] = args.destGUID
|
|
self:ScanForMobs(args.destGUID, 2, i, 1, nil, 12, "SetIconOnHarb", nil, nil, true)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 443612 then
|
|
if args:IsPlayer() then
|
|
--playerPhased = true
|
|
warnBanefulShift:Show()
|
|
timerBanefulShift:Start()
|
|
else
|
|
local uId = DBM:GetRaidUnitId(args.destName)
|
|
if self:IsTanking(uId) then
|
|
specWarnBanefulShift:Show(args.destName)
|
|
specWarnBanefulShift:Play("tauntboss")
|
|
end
|
|
end
|
|
elseif spellId == 452245 then
|
|
if args:IsPlayer() then
|
|
specWarnBloodcurdle:Show()
|
|
specWarnBloodcurdle:Play("scatter")
|
|
yellBloodcurdle:Yell()
|
|
yellBloodcurdleFades:Countdown(spellId, 3)
|
|
end
|
|
elseif spellId == 443042 then
|
|
if self:AntiSpam(5, 2) then
|
|
--22, 15, 15, 21, 15, 15, 47, 15, 15, 15, 15 (normal)
|
|
--22.0, 28.0, 28.0, 28.0, 44.0, 28.0, 28.0, 28.0, 44.0, 28.0, 28.0, 28.0, 44.1, 28.0, 28.0, 28.0 (heroic)
|
|
--19.1, 27.9, 31.2, 27.8, 41.1, 27.9, 31.1, 27.9, 41.2, 27.8, 31.1, 27.9, 41.1 (mythic)
|
|
self.vb.graspCount = self.vb.graspCount + 1
|
|
if self:IsMythic() then
|
|
--41.1, 27.9, 31.1, 27.9 repeating
|
|
if self.vb.graspCount % 4 == 0 then
|
|
timerGraspFromBeyondCD:Start(41.1, self.vb.graspCount+1)
|
|
elseif self.vb.graspCount % 4 == 2 then
|
|
timerGraspFromBeyondCD:Start(31.1, self.vb.graspCount+1)
|
|
else--1 and 3
|
|
timerGraspFromBeyondCD:Start(27.8, self.vb.graspCount+1)
|
|
end
|
|
elseif self:IsHeroic() then
|
|
if self.vb.graspCount % 4 == 0 then
|
|
timerGraspFromBeyondCD:Start(44, self.vb.graspCount+1)
|
|
else
|
|
timerGraspFromBeyondCD:Start(28, self.vb.graspCount+1)
|
|
end
|
|
else--Normal confirmed, LFR unknown
|
|
--Just start 15 here and we'll fix timer on goresplatter cast
|
|
if timerGruesomeDigorgeCD:GetRemaining(self.vb.disgorgeCount+1) > 15 then
|
|
timerGraspFromBeyondCD:Start(15, self.vb.graspCount+1)
|
|
else
|
|
timerGraspFromBeyondCD:Start(21, self.vb.graspCount+1)
|
|
end
|
|
end
|
|
end
|
|
if args:IsPlayer() then
|
|
specWarnGraspFromBeyond:Show()
|
|
specWarnGraspFromBeyond:Play("runout")
|
|
specWarnGraspFromBeyond:ScheduleVoice(2, "keepmove")
|
|
yellGraspFromBeyond:Yell()
|
|
end
|
|
elseif spellId == 445272 then
|
|
warnBloodPact:Cancel()
|
|
warnBloodPact:Schedule(2, args.destName, args.amount or 1)
|
|
end
|
|
end
|
|
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 443612 then
|
|
if args:IsPlayer() then
|
|
-- playerPhased = false
|
|
warnBanefulShiftFades:Show()
|
|
timerBanefulShift:Stop()
|
|
end
|
|
elseif spellId == 452245 then
|
|
if args:IsPlayer() then
|
|
yellBloodcurdleFades:Cancel()
|
|
end
|
|
elseif spellId == 443042 and args:IsPlayer() then
|
|
warnGraspFromBeyondFades:Show()
|
|
warnGraspFromBeyondFades:Play("safenow")
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
|
if spellId == 445518 and destGUID == UnitGUID("player") and self:AntiSpam(2, 3) then
|
|
specWarnGTFO:Show(spellName)
|
|
specWarnGTFO:Play("watchfeet")
|
|
end
|
|
end
|
|
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
|
|
|
|
function mod:UNIT_DIED(args)
|
|
local cid = self:GetCIDFromGUID(args.destGUID)
|
|
if cid == 221667 then--lost-watcher
|
|
timerBlackBulwarkCD:Stop(args.destGUID)
|
|
timerSpectralSlamCD:Stop(args.destGUID)
|
|
elseif cid == 221945 then--forgotten-harbinger
|
|
for i = 7, 3, -1 do
|
|
if addUsedMarks[i] == args.destGUID then
|
|
addUsedMarks[i] = nil
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|