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.

334 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