local mod = DBM : NewMod ( 2393 , " DBM-CastleNathria " , nil , 1190 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20221027045353 " )
mod : SetCreatureID ( 164406 )
mod : SetEncounterID ( 2398 )
mod : SetUsedIcons ( 1 , 2 , 3 )
mod : SetHotfixNoticeRev ( 20201222000000 ) --2020, 12, 22
mod : SetMinSyncRevision ( 20201222000000 )
--mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 328857 345936 330711 343005 342863 345397 " ,
" SPELL_CAST_SUCCESS 328857 329362 " ,
" SPELL_AURA_APPLIED 328897 342077 341684 328921 343024 " ,
" SPELL_AURA_APPLIED_DOSE 328897 " ,
" SPELL_AURA_REMOVED 328921 342077 328897 " ,
" SPELL_AURA_REMOVED_DOSE 328897 " ,
" SPELL_PERIODIC_DAMAGE 340324 " ,
" SPELL_PERIODIC_MISSED 340324 " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 "
)
--TODO, need fresh transcriptor log to verify icon resetting/timer event for Scent for Blood
--TODO, icons or auras for 341684?
--TODO, add mor counts to abilities/timers
--[[
( ability.id = 328857 or ability.id = 345936 or ability.id = 330711 or ability.id = 342863 or ability.id = 343005 or ability.id = 345397 ) and type = " begincast "
or ( ability.id = 342074 ) and type = " cast "
or ability.id = 328921
or ability.id = 342077 and type = " applydebuff "
--]]
--Stage One - Thirst for Blood
local warnExsanguinated = mod : NewStackAnnounce ( 328897 , 2 , nil , " Tank|Healer " )
local warnEcholocation = mod : NewTargetAnnounce ( 342074 , 3 )
local warnWaveofBlood = mod : NewCountAnnounce ( 345397 , 3 )
--Stage Two - Terror of Castle Nathria
local warnDeadlyDescent = mod : NewTargetNoFilterAnnounce ( 343024 , 4 )
local warnBloodshroudOver = mod : NewEndAnnounce ( 328921 , 1 )
local warnEarsplittingShriek = mod : NewCastAnnounce ( 345936 , 2 )
local warnEchoingSonar = mod : NewCastAnnounce ( 329362 , 2 , 6 )
local warnBloodLantern = mod : NewTargetNoFilterAnnounce ( 341684 , 1 ) --Mythic
--Stage One - Thirst for Blood
local specWarnExsanguinated = mod : NewSpecialWarningStack ( 328897 , nil , 2 , nil , nil , 1 , 6 )
local specWarnExsanguinatingBite = mod : NewSpecialWarningDefensive ( 328857 , nil , 17253 , nil , 1 , 2 )
local specWarnExsanguinatingBiteOther = mod : NewSpecialWarningTaunt ( 328857 , nil , 17253 , nil , 1 , 2 )
local specWarnEcholocation = mod : NewSpecialWarningMoveAway ( 342074 , nil , nil , nil , 1 , 2 )
local yellEcholocation = mod : NewPosYell ( 342074 )
local yellEcholocationFades = mod : NewIconFadesYell ( 342074 )
local specWarnEarsplittingShriek = mod : NewSpecialWarningMoveTo ( 330711 , nil , 251719 , nil , 1 , 2 )
local specWarnBlindSwipe = mod : NewSpecialWarningDefensive ( 343005 , " Tank " , nil , nil , 1 , 2 )
local specWarnEchoingScreech = mod : NewSpecialWarningDodge ( 342863 , nil , 252538 , nil , 2 , 2 )
--Stage Two - Terror of Castle Nathria
local specWarnBloodshroud = mod : NewSpecialWarningSpell ( 328921 , nil , nil , nil , 2 , 2 )
local specWarnDeadlyDescent = mod : NewSpecialWarningYou ( 343021 , nil , nil , nil , 1 , 2 ) --1 because you can't do anything about it
local yellDeadlyDescent = mod : NewYell ( 343021 , nil , false ) --Useless with only 1 second to avoid
local specWarnGTFO = mod : NewSpecialWarningGTFO ( 340324 , nil , nil , nil , 1 , 8 )
--Stage One - Thirst for Blood
local timerExsanguinatingBiteCD = mod : NewCDTimer ( 17.8 , 328857 , 17253 , " Tank|Healer " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON ) --10-22.9 (too varaible for a countdown by default)
local timerEcholocationCD = mod : NewCDTimer ( 23 , 342074 , nil , nil , nil , 3 , nil , nil , nil , 1 , 3 ) --Seems to be 42.7 without a hitch
local timerEarsplittingShriekCD = mod : NewCDTimer ( 47.1 , 330711 , 251719 , nil , nil , 2 ) --Shortname "Shriek"
local timerEarsplittingShriek = mod : NewCastTimer ( 4 , 345936 , 251719 , false , nil , 5 ) --For users to see cast bar if boss remains untargetable in intermission
local timerWaveofBloodCD = mod : NewCDCountTimer ( 24.8 , 345397 , nil , nil , nil , 2 , nil , DBM_COMMON_L.HEALER_ICON ) --24-30
local timerBlindSwipeCD = mod : NewCDTimer ( 44.4 , 343005 , nil , nil , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerEchoingScreechCD = mod : NewCDTimer ( 48 , 342863 , 252538 , nil , nil , 3 , nil , DBM_COMMON_L.HEROIC_ICON )
local timerBloodshroudCD = mod : NewCDTimer ( 112 , 328921 , nil , nil , nil , 6 ) --100-103
--Stage Two - Terror of Castle Nathria
--local timerBloodshroud = mod:NewBuffActiveTimer(47.5, 328921, nil, nil, nil, 6)--43.4-47.5, more to it than this? or just fact blizzards energy code always proves to be dogshit
local timerEchoingSonar = mod : NewCastTimer ( 6 , 329362 , nil , false , nil , 5 )
--local berserkTimer = mod:NewBerserkTimer(600)
mod : AddRangeFrameOption ( " 8 " )
mod : AddInfoFrameOption ( 328897 , true )
mod : AddSetIconOption ( " SetIconOnEcholocation " , 342074 , true , false , { 1 , 2 , 3 } )
mod : GroupSpells ( 328857 , 328897 )
local ExsanguinatedStacks = { }
local playerDebuff = false
mod.vb . EchoIcon = 1
mod.vb . waveCount = 0
function mod : OnCombatStart ( delay )
table.wipe ( ExsanguinatedStacks )
playerDebuff = false
self : SetStage ( 1 )
self.vb . EchoIcon = 1
self.vb . waveCount = 0
timerExsanguinatingBiteCD : Start ( 8.1 - delay )
timerWaveofBloodCD : Start ( 12 - delay , 1 )
timerEcholocationCD : Start ( 14.2 - delay )
timerBlindSwipeCD : Start ( 20.3 - delay )
if not self : IsEasy ( ) then
timerEchoingScreechCD : Start ( 28 - delay )
end
timerEarsplittingShriekCD : Start ( 48.3 - delay )
timerBloodshroudCD : Start ( 112 - delay )
-- berserkTimer:Start(-delay)
if self.Options . InfoFrame then
DBM.InfoFrame : SetHeader ( DBM : GetSpellInfo ( 328897 ) )
DBM.InfoFrame : Show ( 10 , " table " , ExsanguinatedStacks , 1 )
end
end
function mod : OnCombatEnd ( )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 328857 then
if self : IsTanking ( " player " , " boss1 " , nil , true ) and self : AntiSpam ( 3 , 1 ) then
specWarnExsanguinatingBite : Show ( )
specWarnExsanguinatingBite : Play ( " defensive " )
end
timerExsanguinatingBiteCD : Start ( )
elseif spellId == 330711 or spellId == 345936 then --Phase 1/Phase 2
if self.Options . SpecWarn330711moveto then
specWarnEarsplittingShriek : Show ( DBM_COMMON_L.BREAK_LOS )
specWarnEarsplittingShriek : Play ( " findshelter " )
else
warnEarsplittingShriek : Show ( )
end
timerEarsplittingShriekCD : Start ( spellId == 330711 and 47.4 or 8.5 )
timerEarsplittingShriek : Start ( spellId == 330711 and 6 or 4 )
elseif spellId == 343005 then
specWarnBlindSwipe : Show ( )
specWarnBlindSwipe : Play ( " shockwave " )
timerBlindSwipeCD : Start ( )
elseif spellId == 342863 then
specWarnEchoingScreech : Show ( )
specWarnEchoingScreech : Play ( " watchstep " ) --Maybe shockwave?
timerEchoingScreechCD : Start ( )
elseif spellId == 345397 then
self.vb . waveCount = self.vb . waveCount + 1
warnWaveofBlood : Show ( self.vb . waveCount )
timerWaveofBloodCD : Start ( 24.8 , self.vb . waveCount + 1 )
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 328857 then
if not args : IsPlayer ( ) then
specWarnExsanguinatingBiteOther : Show ( args.destName )
specWarnExsanguinatingBiteOther : Play ( " tauntboss " )
end
elseif spellId == 329362 then
warnEchoingSonar : Show ( )
timerEchoingSonar : Start ( )
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 328897 then
local amount = args.amount or 1
ExsanguinatedStacks [ args.destName ] = amount
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( ExsanguinatedStacks )
end
if args : IsPlayer ( ) then
playerDebuff = true
if ( amount % 3 == 0 ) and self : AntiSpam ( 3 , 1 ) then
--Shared antispam with tank defensive warning, just to avoid tank feeling spammed, especially since this could also trigger twice in a single bite
specWarnExsanguinated : Show ( amount )
specWarnExsanguinated : Play ( " stackhigh " )
end
else
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsTanking ( uId ) then
warnExsanguinated : Show ( args.destName , amount )
end
end
elseif spellId == 343024 then
if args : IsPlayer ( ) then
specWarnDeadlyDescent : Show ( )
specWarnDeadlyDescent : Play ( " targetyou " )
yellDeadlyDescent : Yell ( )
else
warnDeadlyDescent : CombinedShow ( 1 , args.destName )
end
elseif spellId == 342077 then
local icon = self.vb . EchoIcon
if self.Options . SetIconOnEcholocation then
self : SetIcon ( args.destName , self.vb . EchoIcon )
end
if args : IsPlayer ( ) then
specWarnEcholocation : Show ( )
specWarnEcholocation : Play ( " runout " )
yellEcholocation : Yell ( icon , icon , icon )
yellEcholocationFades : Countdown ( spellId , nil , icon )
end
warnEcholocation : CombinedShow ( 0.5 , args.destName )
self.vb . EchoIcon = self.vb . EchoIcon + 1
elseif spellId == 341684 then
warnBloodLantern : Show ( args.destName )
elseif spellId == 328921 then
self : SetStage ( 2 )
if self : IsFated ( ) then
self : AffixEvent ( 0 ) --Stop Affix Bars
end
specWarnBloodshroud : Show ( )
specWarnBloodshroud : Play ( " phasechange " )
timerExsanguinatingBiteCD : Stop ( )
timerEarsplittingShriekCD : Stop ( )
timerEcholocationCD : Stop ( )
timerBlindSwipeCD : Stop ( )
timerWaveofBloodCD : Stop ( )
timerEchoingScreechCD : Stop ( )
timerEarsplittingShriekCD : Start ( 10.9 )
if self.Options . RangeFrame then
DBM.RangeCheck : Show ( 8 )
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 328921 then --Bloodshroud removed
self.vb . waveCount = 0
if self : IsFated ( ) then
--Purposely uses stage 2 table entry
self : AffixEvent ( 1 , 2 ) --Restart Affix Bars
end
self : SetStage ( 1 )
timerEarsplittingShriekCD : Stop ( )
timerEchoingSonar : Stop ( )
timerEarsplittingShriek : Stop ( )
warnBloodshroudOver : Show ( )
--Looks same as pull timers
timerExsanguinatingBiteCD : Start ( 8.1 )
timerWaveofBloodCD : Start ( 12 , 1 )
timerEcholocationCD : Start ( 14.2 )
timerBlindSwipeCD : Start ( 20.3 )
if not self : IsEasy ( ) then
timerEchoingScreechCD : Start ( 28 )
end
timerEarsplittingShriekCD : Start ( 48.3 )
timerBloodshroudCD : Start ( 112 )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
elseif spellId == 342077 then
if args : IsPlayer ( ) then
yellEcholocationFades : Cancel ( )
end
if self.Options . SetIconOnEcholocation then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 328897 then
ExsanguinatedStacks [ args.destName ] = nil
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( ExsanguinatedStacks )
end
if args : IsPlayer ( ) then
playerDebuff = false
end
end
end
function mod : SPELL_AURA_REMOVED_DOSE ( args )
local spellId = args.spellId
if spellId == 328897 then
ExsanguinatedStacks [ args.destName ] = args.amount or 1
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( ExsanguinatedStacks )
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId , spellName )
if spellId == 340324 and destGUID == UnitGUID ( " player " ) and not playerDebuff and self : AntiSpam ( 2 , 2 ) then
specWarnGTFO : Show ( spellName )
specWarnGTFO : Play ( " watchfeet " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 342074 then
self.vb . EchoIcon = 1
timerEcholocationCD : Start ( )
end
end