local mod = DBM : NewMod ( 2083 , " DBM-Party-BfA " , 1 , 968 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20231024092123 " )
mod : SetCreatureID ( 122963 )
mod : SetEncounterID ( 2086 )
mod : SetHotfixNoticeRev ( 20231023000000 )
mod : SetMinSyncRevision ( 20231023000000 )
mod.respawnTime = 29
mod.sendMainBossGUID = true
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 255371 257407 260683 " ,
" SPELL_CAST_SUCCESS 255434 " ,
" SPELL_AURA_APPLIED 257407 " ,
" SPELL_AURA_REMOVED 257407 255421 " ,
" RAID_BOSS_WHISPER " ,
" CHAT_MSG_RAID_BOSS_EMOTE "
)
--[[
( ability.id = 255371 or ability.id = 257407 or ability.id = 260683 ) and type = " begincast "
or ability.id = 255434 and type = " cast "
or ability.id = 257407 or ability.id = 255421
or type = " dungeonencounterstart " or type = " dungeonencounterend "
--]]
--TODO, Bone Quake deleted in M+? It's in journal but never cast
--TODO, no two pulls are same timer wise. pursuit kinda fucks timers to hell. makes it hard to learn ACTUAL cds since spells get delayed by ICDs and spell queues
local warnPursuit = mod : NewTargetAnnounce ( 257407 , 2 )
local specWarnTeeth = mod : NewSpecialWarningDefensive ( 255434 , " Tank " , nil , nil , 1 , 2 )
local specWarnFear = mod : NewSpecialWarningMoveTo ( 255371 , nil , nil , nil , 3 , 2 ) --Dodge warning on purpose, you dodge it by LOS behind pillar
local yellPursuit = mod : NewYell ( 257407 )
local specWarnPursuit = mod : NewSpecialWarningRun ( 257407 , nil , nil , nil , 4 , 2 )
local specWarnBoneQuake = mod : NewSpecialWarningSpell ( 260683 , nil , nil , nil , 2 , 2 )
local timerTeethCD = mod : NewCDCountTimer ( 26.7 , 255434 , nil , " Tank|Healer " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON ) --actual minimum timer not known
local timerFearCD = mod : NewCDCountTimer ( 35.1 , 255371 , nil , nil , nil , 2 ) --actual minimum timer not known
local timerPursuitCD = mod : NewCDCountTimer ( 35.1 , 257407 , nil , nil , nil , 3 ) --actual minimum timer not known
mod.vb . teethCount = 0 --27.1, 49.7, 29.1, 47.5, 26.7 (some timer examples, min used, and timer correction used otherwise
mod.vb . fearCount = 0
mod.vb . pursuitCount = 0
--Pursuit/Devour ending triggers 9.1 ICD
--Terrifing Visage cast triggers 9.5 ICD
--Serrated teeth triggers 3.5 ICD
--Serated teeth has highest spell queue priority
--ICDs mess CDs all to hell since pursuit is a wild card
--it's likely we'll never learn any of these actual CDs are for true correctness
local function updateAllTimers ( self , ICD )
DBM : Debug ( " updateAllTimers running " , 3 )
if timerTeethCD : GetRemaining ( self.vb . teethCount + 1 ) < ICD then
local elapsed , total = timerTeethCD : GetTime ( self.vb . teethCount + 1 )
local extend = ICD - ( total - elapsed )
DBM : Debug ( " timerTeethCD extended by: " .. extend , 2 )
timerTeethCD : Update ( elapsed , total + extend , self.vb . teethCount + 1 )
end
if timerFearCD : GetRemaining ( self.vb . fearCount + 1 ) < ICD then
local elapsed , total = timerFearCD : GetTime ( self.vb . fearCount + 1 )
local extend = ICD - ( total - elapsed )
DBM : Debug ( " timerFearCD extended by: " .. extend , 2 )
timerFearCD : Update ( elapsed , total + extend , self.vb . fearCount + 1 )
end
if timerPursuitCD : GetRemaining ( self.vb . pursuitCount + 1 ) < ICD then
local elapsed , total = timerPursuitCD : GetTime ( self.vb . pursuitCount + 1 )
local extend = ICD - ( total - elapsed )
DBM : Debug ( " timerPursuitCD extended by: " .. extend , 2 )
timerPursuitCD : Update ( elapsed , total + extend , self.vb . pursuitCount + 1 )
end
end
function mod : OnCombatStart ( delay )
self.vb . teethCount = 0
self.vb . fearCount = 0
self.vb . pursuitCount = 0
timerTeethCD : Start ( 6 - delay , 1 ) --8.1
timerFearCD : Start ( 12.4 - delay , 1 )
timerPursuitCD : Start ( 21.7 - delay , 1 )
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 257407 and self : AntiSpam ( 5 , args.destName ) then --Backup if CHAT_MSG_RAID_BOSS_EMOTE/RAID_BOSS_WHISPER doesn't work
if args : IsPlayer ( ) then
specWarnPursuit : Show ( )
specWarnPursuit : Play ( " justrun " )
yellPursuit : Yell ( )
else
warnPursuit : Show ( args.destName )
end
end
end
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 257407 or ( spellId == 255421 and args : IsDestTypeHostile ( ) ) then --Pursuit ending with no devour happening, or devour ending on Rezan
updateAllTimers ( self , 9.1 )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 255371 then
self.vb . fearCount = self.vb . fearCount + 1
specWarnFear : Show ( DBM_COMMON_L.BREAK_LOS )
specWarnFear : Play ( " findshelter " )
timerFearCD : Start ( nil , self.vb . fearCount + 1 )
updateAllTimers ( self , 9.5 )
elseif spellId == 257407 then
self.vb . pursuitCount = self.vb . pursuitCount + 1
timerPursuitCD : Start ( nil , self.vb . pursuitCount + 1 )
elseif spellId == 260683 then
specWarnBoneQuake : Show ( )
specWarnBoneQuake : Play ( " mobsoon " )
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 255434 then
self.vb . teethCount = self.vb . teethCount + 1
specWarnTeeth : Show ( )
specWarnTeeth : Play ( " defensive " )
timerTeethCD : Start ( nil , self.vb . teethCount + 1 )
updateAllTimers ( self , 3.5 )
end
end
--10.2 switched event to WHISPER
function mod : RAID_BOSS_WHISPER ( msg )
if msg : find ( " spell:255421 " ) then
specWarnPursuit : Show ( )
specWarnPursuit : Play ( " justrun " )
yellPursuit : Yell ( )
end
end
function mod : OnTranscriptorSync ( msg , targetName )
if msg : find ( " 255421 " ) and targetName and self : AntiSpam ( 5 , targetName ) then
targetName = Ambiguate ( targetName , " none " )
warnPursuit : Show ( targetName )
end
end
--Same time as SPELL_CAST_START but has target information on normal
--Deprecated in 10.2
function mod : CHAT_MSG_RAID_BOSS_EMOTE ( msg , _ , _ , _ , targetName )
if msg : find ( " spell:255421 " ) then
if targetName and self : AntiSpam ( 5 , targetName ) then
if targetName == UnitName ( " player " ) then
specWarnPursuit : Show ( )
specWarnPursuit : Play ( " justrun " )
yellPursuit : Yell ( )
else
warnPursuit : Show ( targetName )
end
end
end
end