local mod = DBM : NewMod ( 2554 , " DBM-Raids-Dragonflight " , 1 , 1207 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240716172957 " )
mod : SetCreatureID ( 200926 )
mod : SetEncounterID ( 2709 )
mod : SetUsedIcons ( 1 , 2 , 3 , 4 , 5 , 6 )
mod : SetHotfixNoticeRev ( 20231227000000 )
mod : SetMinSyncRevision ( 20231213000000 )
mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 414425 416996 422776 419048 416048 418531 415624 " ,
-- "SPELL_CAST_SUCCESS 424456",
" SPELL_AURA_APPLIED 414340 414888 414367 419462 415623 414770 426056 422961 " ,
" SPELL_AURA_APPLIED_DOSE 414340 " ,
" SPELL_AURA_REMOVED 414888 422961 415623 " ,
" UNIT_AURA player " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 "
)
--[[
( ability.id = 414425 or ability.id = 416996 or ability.id = 422776 or ability.id = 419048 or ability.id = 416048 or ability.id = 418531 or ability.id = 415624 ) and type = " begincast "
or ability.id = 424456 and type = " cast "
or ability.id = 415020 or ability.id = 415094 or ability.id = 415090 or ability.id = 425282 or ability.id = 425283 or ability.id = 414357
or ability.id = 422961 or ability.id = 301495
or ability.id = 415623 and type = " applydebuff "
--]]
--TODO, secondary warning for https://wowhead.com/ptr-2/spell=424347 ?
--TODO, Smashing Viscera is a hidden aura that's not logged, but UNIT_AURA might work
--TODO, spears 13 is long by 2.3?
--https://www.warcraftlogs.com/reports/N2k1xpg9rVqRDyQZ#fight=11&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20414425%20or%20ability.id%20%3D%20416996%20or%20ability.id%20%3D%20422776%20or%20ability.id%20%3D%20419048%20or%20ability.id%20%3D%20416048%20or%20ability.id%20%3D%20418531%20or%20ability.id%20%3D%20415624)%20and%20type%20%3D%20%22begincast%22%0A%20or%20ability.id%20%3D%20424456%20and%20type%20%3D%20%22cast%22%0A%20or%20ability.id%20%3D%20415020%20or%20ability.id%20%3D%20415094%20or%20ability.id%20%3D%20415090%20or%20ability.id%20%3D%20425282%20or%20ability.id%20%3D%20425283%20or%20ability.id%20%3D%20414357%0A%20or%20ability.name%20%3D%20%22Heart%20Stopper%22&view=events
local warnDrenchedBlades = mod : NewStackAnnounce ( 414340 , 2 , nil , " Tank|Healer " )
local warnBlisteringSpear = mod : NewTargetCountAnnounce ( 414888 , 3 , nil , nil , 282481 , nil , nil , nil , true )
local warnMarkedforTorment = mod : NewCountAnnounce ( 422776 , 3 , nil , nil , 99256 )
local warnGatheringTorment = mod : NewYouAnnounce ( 414367 , 4 )
--Torments
local warnSmashingVisceraSoon = mod : NewSoonAnnounce ( 424456 , 2 , nil , nil , 47482 ) --Sword Stance
local warnHeartstopperSoon = mod : NewSoonAnnounce ( 415623 , 2 ) --Knife Stance
local warnUmbralDestructionSoon = mod : NewSoonAnnounce ( 416048 , 2 ) --Axe Stance
--local warnSmashingViscera = mod:NewTargetNoFilterAnnounce(424456, 3)--Re-add if it gets put back in combat log
local warnHeartStopper = mod : NewTargetCountAnnounce ( 415623 , 3 , nil , nil , nil , nil , nil , nil , true )
local warnFleshMortification = mod : NewYouAnnounce ( 419462 , 4 )
local specWarnDrenchedBlades = mod : NewSpecialWarningTaunt ( 414340 , nil , nil , nil , 1 , 2 )
local specWarnBlisteringSpear = mod : NewSpecialWarningYou ( 414888 , nil , 369351 , nil , 1 , 2 )
local yellBlisteringSpear = mod : NewShortPosYell ( 414888 , 369351 , false ) --Shorttext "Spear"
local yellBlisteringSpearFades = mod : NewIconFadesYell ( 414888 , nil , false )
local specWarnBlisteringTorment = mod : NewSpecialWarningYou ( 414770 , nil , 184656 , nil , 1 , 2 ) --Shorttext "Chains"
local yellBlisteringTorment = mod : NewShortYell ( 414770 , 184656 )
local specWarnTwistingBlade = mod : NewSpecialWarningDodgeCount ( 416996 , nil , 138737 , nil , 2 , 2 )
local specWarnRuinousEnd = mod : NewSpecialWarningSpell ( 419048 , nil , nil , nil , 3 , 2 )
--Torments
local specWarnUmbralDestruction = mod : NewSpecialWarningCount ( 416048 , nil , nil , nil , 2 , 14 )
local specWarnSmashingViscera = mod : NewSpecialWarningYou ( 424456 , nil , 47482 , nil , 1 , 2 ) --Not in combat log
local yellSmashingViscera = mod : NewShortYell ( 424456 , 47482 )
local yellSmashingVisceraFades = mod : NewShortFadesYell ( 424456 )
local specWarnHeartStopper = mod : NewSpecialWarningYou ( 415623 , nil , nil , nil , 1 , 2 )
local specWarnHeartStopperTaunt = mod : NewSpecialWarningTaunt ( 415623 , nil , nil , nil , 1 , 2 )
local yellHeartStopperFades = mod : NewShortFadesYell ( 415623 )
local specWarnVitalRupture = mod : NewSpecialWarningYou ( 426056 , nil , nil , nil , 1 , 2 )
--local specWarnGTFO = mod:NewSpecialWarningGTFO(409058, nil, nil, nil, 1, 8)
local timerBlisteringSpearCD = mod : NewCDCountTimer ( 49 , 414888 , 282481 , nil , nil , 3 ) --Short text "Spears"
local timerTwistingBladeCD = mod : NewCDCountTimer ( 20.6 , 416996 , 138737 , nil , nil , 3 ) --Short Text "Blades"
local timerMarkedforTorment = mod : NewCastTimer ( 20 , 422776 , 99256 , nil , nil , 2 ) --Short text "Torment"
local timerMarkedforTormentCD = mod : NewCDCountTimer ( 49 , 422776 , 99256 , nil , nil , 6 ) --Short text "Torment"
--Torments
local timerUmbralDestructionCD = mod : NewCDCountTimer ( 49 , 416048 , DBM_COMMON_L.GROUPSOAK .. " (%s) " , nil , nil , 5 ) --Shorttext "Soak"
local timerSmashingVisceraCD = mod : NewCDCountTimer ( 49 , 424456 , 47482 , nil , nil , 3 ) --Shorttext "Leap"
local timerHeartStopperCD = mod : NewCDCountTimer ( 49 , 415623 , DBM_COMMON_L.HEALABSORBS .. " (%s) " , nil , nil , 3 )
local berserkTimer = mod : NewBerserkTimer ( 600 )
mod : AddSetIconOption ( " SetIconOnBlisteringSpear " , 414888 , false , 0 , { 1 , 2 , 3 , 4 , 5 , 6 } )
local blisteringMythicTimers = { 14 , 32.1 , 35.1 , 20.2 }
local blisteringHeroicTimers = { 14 , 23.0 , 23.0 , 22.5 , 20.2 }
local blisteringEasyTimers = { 14 , 30.3 , 38.9 , 20.6 }
mod.vb . spearCount = 0 --used for sequencing
mod.vb . spearTotal = 0 --Used for timer text
mod.vb . spearIcon = 1
mod.vb . TwistingCount = 0 --used for sequencing
mod.vb . TwistingTotal = 0 --Used for timer text
mod.vb . tormentCount = 0
--Toremnts
mod.vb . umbralCount = 0
mod.vb . heartCount = 0
--mod.vb.heartIcon = 1
mod.vb . smashingCount = 0
mod.vb . useHeartStopperBackup = false
local tormentOverTime = 0
local playerHearted = false
function mod : OnCombatStart ( delay )
self : SetStage ( 1 )
self.vb . spearCount = 0
self.vb . spearTotal = 0
self.vb . spearIcon = 1
self.vb . TwistingCount = 0
self.vb . TwistingTotal = 0
self.vb . tormentCount = 0
self.vb . useHeartStopperBackup = false
tormentOverTime = 0
if self : IsMythic ( ) then
timerBlisteringSpearCD : Start ( 4.5 - delay , 1 )
timerTwistingBladeCD : Start ( 15.4 - delay , 1 )
timerMarkedforTormentCD : Start ( 45.8 - delay , 1 )
berserkTimer : Start ( 420 - delay ) --430 if a specific weapon combo is done 3rd
else
timerBlisteringSpearCD : Start ( 10.1 - delay , 1 )
timerTwistingBladeCD : Start ( 4 - delay , 1 )
timerMarkedforTormentCD : Start ( 44.7 - delay , 1 )
berserkTimer : Start ( 600 - delay )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 414425 then
self.vb . spearCount = self.vb . spearCount + 1
self.vb . spearTotal = self.vb . spearTotal + 1
self.vb . spearIcon = 1
--If initial timer before any weapons
if ( self.vb . tormentCount == 0 and self.vb . spearCount == 1 ) then
timerBlisteringSpearCD : Start ( 20.5 , self.vb . spearTotal + 1 )
--WHen out of weapons
elseif self : IsHard ( ) and self.vb . tormentCount >= 4 then
timerBlisteringSpearCD : Start ( 30 , self.vb . spearTotal + 1 )
elseif self.vb . tormentCount >= 1 then --Timers will follow sequence of event during active weapons basically
local timer = self : IsMythic ( ) and blisteringMythicTimers [ self.vb . spearCount + 1 ] or self : IsHeroic ( ) and blisteringHeroicTimers [ self.vb . spearCount + 1 ] or blisteringEasyTimers [ self.vb . spearCount + 1 ]
if timer then
timerBlisteringSpearCD : Start ( timer , self.vb . spearTotal + 1 )
end
end
elseif spellId == 416996 then
self.vb . TwistingCount = self.vb . TwistingCount + 1
self.vb . TwistingTotal = self.vb . TwistingTotal + 1
specWarnTwistingBlade : Show ( self.vb . TwistingTotal )
specWarnTwistingBlade : Play ( " watchstep " )
--Changes to 25.5 when out of weapons
if self : IsHard ( ) and self.vb . tormentCount >= 4 then
timerTwistingBladeCD : Start ( 25.5 , self.vb . TwistingTotal + 1 )
--Always two Twisting blades in each set, so if count 1 then always start 2nd timer
elseif self.vb . TwistingCount == 1 then
timerTwistingBladeCD : Start ( 20.6 , self.vb . TwistingTotal + 1 )
end
elseif spellId == 422776 then
self.vb . tormentCount = self.vb . tormentCount + 1
self.vb . useHeartStopperBackup = false
warnMarkedforTorment : Show ( self.vb . tormentCount )
self : SetStage ( self.vb . tormentCount ) --Matching BW behavior which is kinda meh, but WA parity is needed
elseif spellId == 419048 then
specWarnRuinousEnd : Show ( )
specWarnRuinousEnd : Play ( " aesoon " )
elseif spellId == 416048 then
self.vb . umbralCount = self.vb . umbralCount + 1
specWarnUmbralDestruction : Show ( self.vb . umbralCount )
if self.vb . umbralCount == 1 then
if not playerHearted then --Didn't get hearts in last debuffs, give the share count (player can still determine if they soak or not)
specWarnUmbralDestruction : Play ( " shareone " )
else --Player DID have heart in last soak, make sure that player stays out
playerHearted = false --Clear them for next soak
specWarnUmbralDestruction : Play ( " otherout " )
end
timerUmbralDestructionCD : Start ( self : IsMythic ( ) and 32.7 or self : IsHeroic ( ) and 25 or 30 , 2 )
else
if not playerHearted then
specWarnUmbralDestruction : Play ( " sharetwo " )
else
--Don't need to reset variable on 2nd cast
specWarnUmbralDestruction : Play ( " otherout " )
end
end
elseif spellId == 418531 then
self.vb . smashingCount = self.vb . smashingCount + 1
if self.vb . smashingCount == 1 then
timerSmashingVisceraCD : Start ( self : IsMythic ( ) and 32.7 or self : IsHeroic ( ) and 25 or 30 , 2 )
end
elseif spellId == 415624 and self : AntiSpam ( 8 , 1 ) then
self.vb . heartCount = self.vb . heartCount + 1
if self.vb . heartCount == 1 then
timerHeartStopperCD : Start ( self : IsMythic ( ) and 32.7 or self : IsHeroic ( ) and 25 or 30 , 2 ) --Cast start only in combat log on mythic
end
end
end
--[[
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 424456 then
--if args:IsPlayer() then
-- specWarnSmashingViscera:Show()
-- specWarnSmashingViscera:Play("runout")
-- yellSmashingViscera:Yell()
--else
-- warnSmashingViscera:Show(args.destName)
--end
end
end
--]]
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 414340 then
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsTanking ( uId ) then
local amount = args.amount or 1
if amount % 3 == 0 or amount > 6 then --Placeholder until review
if amount > 6 and not DBM : UnitDebuff ( " player " , spellId ) and not UnitIsDeadOrGhost ( " player " ) and not self : IsHealer ( ) then
specWarnDrenchedBlades : Show ( args.destName )
specWarnDrenchedBlades : Play ( " tauntboss " )
else
warnDrenchedBlades : Show ( args.destName , amount )
end
end
end
elseif spellId == 414888 then
local icon = self.vb . spearIcon
if self.Options . SetIconOnBlisteringSpear then
self : SetIcon ( args.destName , icon )
end
if args : IsPlayer ( ) then
specWarnBlisteringSpear : Show ( )
specWarnBlisteringSpear : Play ( " spear " )
yellBlisteringSpear : Yell ( icon , icon )
yellBlisteringSpearFades : Countdown ( spellId , nil , icon )
end
warnBlisteringSpear : CombinedShow ( 0.5 , self.vb . spearTotal , args.destName )
self.vb . spearIcon = self.vb . spearIcon + 1
elseif spellId == 414367 and args : IsPlayer ( ) then
warnGatheringTorment : Show ( )
elseif spellId == 419462 and args : IsPlayer ( ) then
warnFleshMortification : Show ( )
elseif spellId == 415623 then
if self : AntiSpam ( 8 , 1 ) then
self.vb . heartCount = self.vb . heartCount + 1
if self.vb . heartCount == 1 then
timerHeartStopperCD : Start ( self : IsMythic ( ) and 32.7 or self : IsHeroic ( ) and 25 or 30 , 2 ) --Cast start not in combat log on non mythic
end
end
if args : IsPlayer ( ) then
playerHearted = true
specWarnHeartStopper : Show ( )
specWarnHeartStopper : Play ( " targetyou " )
yellHeartStopperFades : Countdown ( spellId ) --, nil, icon
--Unschedule if you also got it
specWarnHeartStopperTaunt : Cancel ( )
specWarnHeartStopperTaunt : CancelVoice ( )
elseif self.vb . useHeartStopperBackup then --Mythic difficulty and boss has debuffs and soaks
local uId = DBM : GetRaidUnitId ( args.destName )
--If heartstopper is on tank that isn't you and you do not have it, taunt the boss on mythic difficulty
if self : IsTanking ( uId ) and not DBM : UnitDebuff ( " player " , spellId ) then
--Scheduled so first wait to make sure you don't also get it
specWarnHeartStopperTaunt : Schedule ( 0.8 , args.destName )
specWarnHeartStopperTaunt : ScheduleVoice ( 0.8 , " tauntboss " )
end
end
warnHeartStopper : CombinedShow ( 1.1 , self.vb . heartCount , args.destName )
elseif spellId == 414770 then
if args : IsPlayer ( ) then
specWarnBlisteringTorment : Show ( )
specWarnBlisteringTorment : Play ( " targetyou " )
yellBlisteringTorment : Yell ( )
end
elseif spellId == 426056 then
if args : IsPlayer ( ) then
specWarnVitalRupture : Show ( )
specWarnVitalRupture : Play ( " targetyou " )
end
elseif spellId == 422961 then --Torment Beginning
tormentOverTime = GetTime ( ) + 20 --Expected duration
timerMarkedforTorment : Start ( )
--Precent errors during stutter cast
timerBlisteringSpearCD : Stop ( )
timerTwistingBladeCD : Stop ( )
timerMarkedforTormentCD : Stop ( )
--Timers started in applied instead of removed, so they don't need adjusting later in LFR due to overtime
if self : IsHard ( ) and self.vb . tormentCount >= 4 then
-- timerTwistingBladeCD:Start(self:IsMythic() and 138.8 or 30.9, self.vb.TwistingTotal+1)--Mythic twisted not seen yet
timerBlisteringSpearCD : Start ( 38.8 , self.vb . spearTotal + 1 )
timerMarkedforTormentCD : Start ( self : IsMythic ( ) and 139.1 or 74 , self.vb . tormentCount + 1 )
else
timerBlisteringSpearCD : Start ( 34 , self.vb . spearTotal + 1 )
timerTwistingBladeCD : Start ( self : IsMythic ( ) and 114.1 or 97.7 , self.vb . TwistingTotal + 1 )
timerMarkedforTormentCD : Start ( self : IsMythic ( ) and 139.1 or 133.8 , self.vb . tormentCount + 1 )
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 414888 then
if self.Options . SetIconOnBlisteringSpear then
self : SetIcon ( args.destName , 0 )
end
if args : IsPlayer ( ) then
yellBlisteringSpearFades : Cancel ( )
end
elseif spellId == 415623 then
if args : IsPlayer ( ) then
yellHeartStopperFades : Cancel ( )
end
elseif spellId == 422961 then --Torment Ending
tormentOverTime = GetTime ( ) - tormentOverTime --Should be 0 all the time in non LFR, in LFR it will be 0 or greater
timerMarkedforTorment : Stop ( )
--Handle initial timer resets
self.vb . spearCount = 0
self.vb . TwistingCount = 0
playerHearted = false
end
end
do
local warnedLeap = false
function mod : UNIT_AURA ( uId )
local hasLeap = DBM : UnitDebuff ( " player " , 424456 )
if hasLeap and not warnedLeap then
warnedLeap = true
specWarnSmashingViscera : Show ( )
specWarnSmashingViscera : Play ( " targetyou " )
yellSmashingViscera : Yell ( )
yellSmashingVisceraFades : Countdown ( 4 )
elseif not hasLeap and warnedLeap then
warnedLeap = false
yellSmashingVisceraFades : Cancel ( )
end
end
end
-- "<72.49 22:05:33> [CLEU] SPELL_AURA_REMOVED#Creature-0-4251-2549-21526-200926-000057D47F#Igira the Cruel#Creature-0-4251-2549-21526-207999-000057D47F#Flesh Mortification#422961#Marked for Torment#BUFF#nil",
-- "<77.51 22:05:38> [UNIT_SPELLCAST_SUCCEEDED] Igira the Cruel(72.7%-0.0%){Target:??} -Axe Knife Stance- [[boss1:Cast-3-4251-2549-21526-425282-004257D59D:425282]]",
--<217.25 22:07:58> [CLEU] SPELL_AURA_REMOVED#Creature-0-4251-2549-21526-200926-000057D47F#Igira the Cruel#Creature-0-4251-2549-21526-207999-000057D47F#Flesh Mortification#422961#Marked for Torment#BUFF#nil",
--"<222.27 22:08:03> [UNIT_SPELLCAST_SUCCEEDED] Igira the Cruel(34.2%-0.0%){Target:??} -Axe Sword Stance- [[boss1:Cast-3-4251-2549-21526-425283-001757D62E:425283]]",
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
--Non Mythic specific weapon handling
if spellId == 415020 then --Sword Stance
self.vb . smashingCount = 0
warnSmashingVisceraSoon : Show ( )
local initialTimer = self : IsLFR ( ) and 23.7 or 19.9
local adjustedTimer = self : IsLFR ( ) and ( initialTimer - tormentOverTime ) or initialTimer
timerSmashingVisceraCD : Start ( adjustedTimer , 1 )
elseif spellId == 415094 then --Knife Stance
self.vb . heartCount = 0
warnHeartstopperSoon : Show ( )
local initialTimer = self : IsLFR ( ) and 23.9 or 19
local adjustedTimer = self : IsLFR ( ) and ( initialTimer - tormentOverTime ) or initialTimer
timerHeartStopperCD : Start ( adjustedTimer , 1 )
elseif spellId == 415090 then --Axe Stance
self.vb . umbralCount = 0
warnUmbralDestructionSoon : Show ( )
local initialTimer = self : IsLFR ( ) and 23.7 or 18.8
local adjustedTimer = self : IsLFR ( ) and ( initialTimer - tormentOverTime ) or initialTimer
timerUmbralDestructionCD : Start ( adjustedTimer , 1 )
--Mythic specific weapon handling
elseif spellId == 425282 then --Axe Knife Stance
self.vb . umbralCount = 0
self.vb . heartCount = 0
self.vb . useHeartStopperBackup = true
warnUmbralDestructionSoon : Show ( )
warnHeartstopperSoon : Show ( )
timerHeartStopperCD : Start ( 21.2 , 1 )
timerUmbralDestructionCD : Start ( 25.2 , 1 )
elseif spellId == 425283 then --Axe Sword Stance
self.vb . smashingCount = 0
self.vb . umbralCount = 0
warnSmashingVisceraSoon : Show ( )
warnUmbralDestructionSoon : Show ( )
timerUmbralDestructionCD : Start ( 18.8 , 1 )
timerSmashingVisceraCD : Start ( 25.3 , 1 )
elseif spellId == 414357 then --Sword Knife Stance
self.vb . smashingCount = 0
self.vb . heartCount = 0
warnSmashingVisceraSoon : Show ( )
warnHeartstopperSoon : Show ( )
timerHeartStopperCD : Start ( 18.8 , 1 )
timerSmashingVisceraCD : Start ( 22.8 , 1 )
end
end