local mod = DBM : NewMod ( 2418 , " DBM-CastleNathria " , nil , 1190 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20220908201246 " )
mod : SetCreatureID ( 166644 )
mod : SetEncounterID ( 2405 )
mod : SetUsedIcons ( 1 , 2 )
mod : SetHotfixNoticeRev ( 20210214000000 ) --2021, 02, 14
mod : SetMinSyncRevision ( 20201214000000 )
--mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 328437 335013 325399 327887 329770 328789 340758 329834 328880 342310 340788 342854 329107 340807 " ,
" SPELL_CAST_SUCCESS 325361 326271 325399 181089 " ,
" SPELL_AURA_APPLIED 328448 328468 325236 327902 327414 " ,
" SPELL_AURA_REMOVED 328448 328468 325236 " ,
-- "SPELL_PERIODIC_DAMAGE",
-- "SPELL_PERIODIC_MISSED",
" CHAT_MSG_RAID_BOSS_EMOTE "
-- "CHAT_MSG_MONSTER_YELL"
-- "UNIT_SPELLCAST_SUCCEEDED boss1"
)
--TODO, add https://shadowlands.wowhead.com/spell=340842/soul-singe ?
--[[
( ability.id = 328437 or ability.id = 335013 or ability.id = 325399 or ability.id = 327887 or ability.id = 340758 or ability.id = 329770 or ability.id = 329834 or ability.id = 328880 or ability.id = 328789 or ability.id = 342310 or ability.id = 340807 or ability.id = 340788 or ability.id = 342854 ) and type = " begincast "
or ( ability.id = 326271 or ability.id = 325361 or ability.id = 181089 ) and type = " cast "
--]]
mod : AddTimerLine ( BOSS )
local warnPhase = mod : NewPhaseChangeAnnounce ( 2 , nil , nil , nil , nil , nil , 2 )
local warnDimensionalTear = mod : NewTargetNoFilterAnnounce ( 328437 , 3 , nil , nil , 327770 )
local warnHyperlightSpark = mod : NewCountAnnounce ( 325399 , 2 , nil , false , 2 )
local specWarnDimensionalTear = mod : NewSpecialWarningYouPos ( 328437 , 327770 , nil , nil , 1 , 2 )
local yellDimensionalTear = mod : NewPosYell ( 328437 , 327770 )
local yellDimensionalTearFades = mod : NewIconFadesYell ( 328437 , 327770 )
local specWarnGlyphofDestruction = mod : NewSpecialWarningMoveAwayCount ( 325361 , nil , nil , nil , 1 , 2 )
local yellGlyphofDestruction = mod : NewYell ( 325361 )
local yellGlyphofDestructionFades = mod : NewShortFadesYell ( 325361 )
local specWarnGlyphofDestructionTaunt = mod : NewSpecialWarningTaunt ( 325361 , nil , nil , nil , 1 , 2 )
local specWarnStasisTrap = mod : NewSpecialWarningDodge ( 326271 , nil , nil , nil , 2 , 2 )
local specWarnRiftBlast = mod : NewSpecialWarningDodge ( 335013 , nil , nil , nil , 2 , 2 )
local timerDimensionalTearCD = mod : NewCDTimer ( 25 , 328437 , 327770 , nil , nil , 3 )
local timerGlyphofDestructionCD = mod : NewCDCountTimer ( 27.9 , 325361 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON ) --27.9-58.6 for now
local timerGlyphofDestruction = mod : NewTargetTimer ( 4 , 325361 , nil , nil , 2 , 2 , nil , DBM_COMMON_L.TANK_ICON )
local timerStasisTrapCD = mod : NewCDTimer ( 30.3 , 326271 , nil , nil , nil , 3 ) --30, except when it's reset by phase changes
local timerRiftBlastCD = mod : NewCDTimer ( 36 , 335013 , nil , nil , nil , 3 ) --36.3 except when it's reset by phase changes
local timerHyperlightSparkCD = mod : NewCDTimer ( 15.8 , 325399 , nil , nil , nil , 2 , nil , DBM_COMMON_L.HEALER_ICON ) --15.8 except when it's heavily spell queued
--local berserkTimer = mod:NewBerserkTimer(600)
mod : AddSetIconOption ( " SetIconOnTear " , 328437 , true , false , { 1 , 2 } )
--Sire Denathrius' Private Collection
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22119 ) )
local warnSpirits = mod : NewSpellAnnounce ( 340758 , 3 , nil , nil , 263222 )
local warnFixate = mod : NewTargetAnnounce ( 327902 , 3 )
local warnPossession = mod : NewTargetNoFilterAnnounce ( 327414 , 4 )
local warnSeedsofExtinction = mod : NewSpellAnnounce ( 329834 , 3 , nil , nil , 205446 ) --Shortname "Planting Seeds"
local warnUnleashPower = mod : NewCountAnnounce ( 342854 , 4 )
local specWarnFixate = mod : NewSpecialWarningRun ( 327902 , nil , nil , nil , 4 , 2 )
local specWarnEdgeofAnnihilation = mod : NewSpecialWarningRun ( 328789 , nil , 307421 , nil , 4 , 2 )
local timerFleetingSpiritsCD = mod : NewCDTimer ( 40.8 , 340758 , 263222 , nil , nil , 3 ) --40.8-46
local timerSeedsofExtinctionCD = mod : NewCDTimer ( 43.7 , 329770 , 205446 , nil , nil , 5 ) --43-49. Shortname "Planting Seeds"
local timerExtinction = mod : NewCastTimer ( 16 , 329107 , nil , nil , nil , 2 , nil , DBM_COMMON_L.DEADLY_ICON )
local timerEdgeofAnnihilationCD = mod : NewCDTimer ( 44.3 , 328789 , 307421 , nil , nil , 2 , nil , DBM_COMMON_L.DEADLY_ICON ) --Shortname "Annihilation"
local timerEdgeofAnnihilation = mod : NewCastTimer ( 10 , 328789 , 307421 , nil , nil , 5 , nil , DBM_COMMON_L.DEADLY_ICON )
local timerUnleashPowerCD = mod : NewCDTimer ( 40.8 , 342854 , nil , nil , nil , 5 , nil , DBM_COMMON_L.MYTHIC_ICON .. DBM_COMMON_L.DEADLY_ICON )
mod : GroupSpells ( 340758 , 327902 ) --Spirits and their fixate
mod : GroupSpells ( 329770 , 329107 ) --Seeds of extinction and their cast
mod.vb . spartCount = 0
mod.vb . tearIcon = 1
mod.vb . annihilationCount = 0
mod.vb . destructionCount = 0
mod.vb . unleashCount = 0
mod.vb . p3FirstCast = 0 --1- Tear, 2 - Annihilate
mod.vb . hyperInProgress = false
function mod : OnCombatStart ( delay )
self : SetStage ( 1 )
self.vb . spartCount = 0
self.vb . tearIcon = 1
self.vb . annihilationCount = 0
self.vb . destructionCount = 0
self.vb . unleashCount = 0
self.vb . p3FirstCast = 0 --1- Tear, 2 - Annihilate
self.vb . hyperInProgress = false
timerHyperlightSparkCD : Start ( 5 - delay )
if self : IsHard ( ) then
timerStasisTrapCD : Start ( 10.5 - delay )
end
timerDimensionalTearCD : Start ( 14 )
timerRiftBlastCD : Start ( 20.3 - delay )
timerFleetingSpiritsCD : Start ( 25 )
timerGlyphofDestructionCD : Start ( 31.6 - delay , 1 ) --SUCCESS
-- berserkTimer:Start(-delay)
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 328437 or spellId == 342310 then
self.vb . tearIcon = 1
if spellId == 328437 then --One scripted to rotator
if self.vb . phase == 1 then
timerFleetingSpiritsCD : Start ( 20.2 )
elseif self.vb . phase == 2 then
timerSeedsofExtinctionCD : Start ( self : IsMythic ( ) and 25 or 20.2 )
else --Phase 3
--To notify user of a bug that sometimes happens when boss casts annihilate/Unleashed power twice in a row instead of alternating, making fight harder to do
if self.vb . p3FirstCast == 0 then
self.vb . p3FirstCast = 1
end
if self : IsMythic ( ) then
timerUnleashPowerCD : Start ( 40 )
else
timerDimensionalTearCD : Start ( 25 ) --(26.75)
end
end
else --If boss is casting 342310 he's transitioning into a new phase and spawning initial rifts for that phase
--Stop timers if they weren't stopped by earlier yell triggers
timerDimensionalTearCD : Stop ( ) --stop rift timer from Spell Rotator if it wasn't stopped by earlier phase change scripts
timerFleetingSpiritsCD : Stop ( )
timerSeedsofExtinctionCD : Stop ( )
end
elseif spellId == 335013 then
specWarnRiftBlast : Show ( )
specWarnRiftBlast : Play ( " farfromline " )
timerRiftBlastCD : Start ( )
elseif spellId == 325399 then
self.vb . spartCount = self.vb . spartCount + 1
warnHyperlightSpark : Show ( self.vb . spartCount )
timerHyperlightSparkCD : Start ( )
self.vb . hyperInProgress = true
-- elseif spellId == 327887 then--First Spirits cast (Crystal of Phantasms)
-- warnSpirits:Show()
-- timerDimensionalTearCD:Start(25)--Timer for first tear after activation. Activations don't fire spell rotator
-- elseif spellId == 340758 then--Fleeting Spirits 2nd+ cast (but only in phase 1, phase 2 and 3 mythic don't fire this event)
-- timerDimensionalTearCD:Start(20.2)
elseif spellId == 329770 then --Root of Extinction first cast
-- warnSeedsofExtinction:Show()
if self.vb . phase < 2 then --In case user playing in language with unlocalized phase 2 yell
self : SetStage ( 2 )
timerDimensionalTearCD : Stop ( )
timerFleetingSpiritsCD : Stop ( )
end
timerDimensionalTearCD : Start ( 33.5 )
elseif spellId == 340788 then --Seeds of Extinction casts 2+ (the one rotator is linked to)
timerDimensionalTearCD : Start ( self : IsMythic ( ) and 25 or 20.2 )
elseif spellId == 329834 then --Seeds cast itself, for warnings
warnSeedsofExtinction : Show ( )
elseif spellId == 329107 and self : AntiSpam ( 3 , 1 ) then --Seeds Extinction Cast
timerExtinction : Start ( )
elseif spellId == 328880 then --Phase Change 3 (Edge of Annihilation)
if self.vb . phase < 3 then --In case boss doesn't cast 342310, which happens in rare cases
self : SetStage ( 3 )
self.vb . p3FirstCast = 0 --1- Tear, 2 - Annihilate
timerDimensionalTearCD : Stop ( )
timerSeedsofExtinctionCD : Stop ( )
end
--TODO, monitor for blizzard having fixed this issue https://us.forums.blizzard.com/en/wow/t/feedback-mythic-artificer-xymox/617893/5
--Mythic could be either Unleash OR tear first. if it's actually annihilation next it's a wipe
if self : IsMythic ( ) then
self.vb . unleashCount = 1
warnUnleashPower : Show ( 1 )
timerEdgeofAnnihilationCD : Start ( 7.2 )
timerSeedsofExtinctionCD : Start ( 11.4 )
timerFleetingSpiritsCD : Start ( 13.6 )
timerDimensionalTearCD : Start ( 30 ) --Or Unleashed power
else
timerDimensionalTearCD : Start ( 35.2 )
end
elseif spellId == 340807 then --Annihilate 2+ cast by boss, for timer handling
if self.vb . p3FirstCast == 0 then
self.vb . p3FirstCast = 2
DBM : AddMsg ( " This is very likely a bugged pull. This may cause you to wipe. Refer to https://us.forums.blizzard.com/en/wow/t/feedback-mythic-artificer-xymox/617893/5 " )
end
timerDimensionalTearCD : Start ( 25.2 )
elseif spellId == 328789 then --Script for the actual annihilate, where warning handling is done
self.vb . annihilationCount = self.vb . annihilationCount + 1
specWarnEdgeofAnnihilation : Show ( self.vb . annihilationCount )
specWarnEdgeofAnnihilation : Play ( " justrun " )
specWarnEdgeofAnnihilation : ScheduleVoice ( 2 , " keepmove " )
timerEdgeofAnnihilation : Start ( )
elseif spellId == 342854 then --Unleash Power, cast in mythic phase 3 to activate all relics at once (replaces 340807 which is not cast on mythic)
if self.vb . p3FirstCast == 0 then
self.vb . p3FirstCast = 2
DBM : AddMsg ( " This is very likely a bugged pull. This may cause you to wipe. Refer to https://us.forums.blizzard.com/en/wow/t/feedback-mythic-artificer-xymox/617893/5 " )
end
self.vb . unleashCount = self.vb . unleashCount + 1
warnUnleashPower : Show ( self.vb . unleashCount )
--Unleash Power 1: Spirits, delay, Seeds+Annihilation
timerDimensionalTearCD : Start ( 40 )
--Starts at 2 because first tri is actually activated on Annihilationn relic activation
if self.vb . unleashCount == 2 then
timerFleetingSpiritsCD : Start ( 3 )
timerSeedsofExtinctionCD : Start ( 11 )
timerEdgeofAnnihilationCD : Start ( 11 )
--Unleash Power 2: Annihilate, Spirits, seeds
elseif self.vb . unleashCount == 3 then
timerEdgeofAnnihilationCD : Start ( 3 )
timerFleetingSpiritsCD : Start ( 6 )
timerSeedsofExtinctionCD : Start ( 13 )
--Unleash Power 3: Seeds, unknown, unknown
elseif self.vb . unleashCount == 4 then
timerSeedsofExtinctionCD : Start ( 3 )
timerEdgeofAnnihilationCD : Start ( 11 )
--timerFleetingSpiritsCD:Start(13)--Unknown
end
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 325361 then
self.vb . destructionCount = self.vb . destructionCount + 1
timerGlyphofDestructionCD : Start ( nil , self.vb . destructionCount + 1 )
elseif spellId == 326271 and self : IsHard ( ) then
--Even fires in all difficulties even though it doesn't do anything on normal/LFR
specWarnStasisTrap : Show ( )
specWarnStasisTrap : Play ( " watchstep " )
timerStasisTrapCD : Start ( )
elseif spellId == 325399 then
self.vb . hyperInProgress = false
elseif spellId == 181089 then
self : SetStage ( 0 )
if self.vb . phase == 2 then
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2 ) )
warnPhase : Play ( " ptwo " )
timerStasisTrapCD : Stop ( )
timerRiftBlastCD : Stop ( )
timerHyperlightSparkCD : Stop ( )
timerGlyphofDestructionCD : Stop ( ) --Glyph is auto cast on transition yells, in addition starts a custom non 36 timer for first one in each phase
timerFleetingSpiritsCD : Stop ( )
timerDimensionalTearCD : Stop ( )
--If hyper is in progress, boss actually finishes it and the phase change CD isn't triggered
if not self.vb . hyperInProgress then
timerHyperlightSparkCD : Start ( 5.5 ) --5.5-6
else --When this happens, it doesn't get recast for a full minute (Old)
timerHyperlightSparkCD : Start ( 25 ) --New, it's no longer a minute?
end
timerDimensionalTearCD : Start ( 14 )
timerRiftBlastCD : Start ( 20 )
timerSeedsofExtinctionCD : Start ( 21.6 )
timerGlyphofDestructionCD : Start ( 27.8 , self.vb . destructionCount + 1 ) --SUCCESS
if self : IsHard ( ) then
timerStasisTrapCD : Start ( 10.7 )
end
elseif self.vb . phase == 3 then
self.vb . p3FirstCast = 0 --1- Tear, 2 - Annihilate/Unleashed
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 3 ) )
warnPhase : Play ( " pthree " )
timerStasisTrapCD : Stop ( )
timerRiftBlastCD : Stop ( )
timerHyperlightSparkCD : Stop ( )
timerGlyphofDestructionCD : Stop ( ) --Glyph is auto cast on transition yells, in addition starts a custom non 36 timer for first one in each phase
timerSeedsofExtinctionCD : Stop ( )
timerDimensionalTearCD : Stop ( )
--If hyper is in progress, boss actually finishes it and the phase change CD isn't triggered
if not self.vb . hyperInProgress then
timerHyperlightSparkCD : Start ( 5.5 ) --5.5-7
else --When this happens, it doesn't get recast for a full minute
timerHyperlightSparkCD : Start ( 60 )
end
timerDimensionalTearCD : Start ( 14.4 )
timerRiftBlastCD : Start ( 45.9 )
timerGlyphofDestructionCD : Start ( 53.5 , self.vb . destructionCount + 1 ) --SUCCESS
if self : IsHard ( ) then
timerStasisTrapCD : Start ( 10.7 )
end
if self : IsMythic ( ) then
timerUnleashPowerCD : Start ( 20 ) --Time until phase 3 activation edge of annihilation spell
else
timerEdgeofAnnihilationCD : Start ( 27 ) --Time until actual annihilation cast, not edge of annihilation
end
end
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 328448 or spellId == 328468 then
local icon = self.vb . tearIcon
if self.Options . SetIconOnTear then
self : SetIcon ( args.destName , icon )
end
if args : IsPlayer ( ) then
specWarnDimensionalTear : Show ( self : IconNumToTexture ( icon ) )
specWarnDimensionalTear : Play ( " mm " .. icon )
yellDimensionalTear : Yell ( icon , icon , icon )
yellDimensionalTearFades : Countdown ( spellId , nil , icon )
end
warnDimensionalTear : CombinedShow ( 1 , args.destName )
self.vb . tearIcon = self.vb . tearIcon + 1
elseif spellId == 325236 then
if args : IsPlayer ( ) then
specWarnGlyphofDestruction : Show ( self.vb . destructionCount )
specWarnGlyphofDestruction : Play ( " runout " )
yellGlyphofDestruction : Yell ( )
yellGlyphofDestructionFades : Countdown ( spellId )
else
specWarnGlyphofDestructionTaunt : Show ( args.destName )
specWarnGlyphofDestructionTaunt : Play ( " tauntboss " )
end
timerGlyphofDestruction : Start ( self : IsEasy ( ) and 8 or 4 , args.destName )
elseif spellId == 327902 then
warnFixate : CombinedShow ( 0.5 , args.destName )
if args : IsPlayer ( ) then
specWarnFixate : Show ( )
specWarnFixate : Play ( " justrun " )
end
elseif spellId == 327414 then
warnPossession : CombinedShow ( 1 , args.destName )
end
end
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 328448 or spellId == 328468 then
if args : IsPlayer ( ) then
yellDimensionalTearFades : Cancel ( )
end
if self.Options . SetIconOnTear then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 325236 then
if args : IsPlayer ( ) then
yellGlyphofDestructionFades : Cancel ( spellId )
end
timerGlyphofDestruction : Stop ( args.destName )
end
end
--[[
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId , spellName )
if spellId == 270290 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 2 ) then
specWarnGTFO : Show ( spellName )
specWarnGTFO : Play ( " watchfeet " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--]]
--Only activation that lacks a CLEU event for the actual activations. Stage 1 has a boss cast, but on mythic that doesn't exist in stage 2 or 3, this does
function mod : CHAT_MSG_RAID_BOSS_EMOTE ( msg )
if msg : find ( " spell:327887 " ) then
warnSpirits : Show ( )
if self.vb . phase == 1 then
timerDimensionalTearCD : Start ( 20.2 )
end
end
end