local mod = DBM : NewMod ( 2426 , " DBM-CastleNathria " , nil , 1190 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20211125075428 " )
mod : SetCreatureID ( 166971 , 166969 , 166970 ) --Castellan Niklaus, Baroness Frieda, Lord Stavros
mod : SetEncounterID ( 2412 )
mod : SetBossHPInfoToHighest ( )
mod : SetUsedIcons ( 8 , 6 )
mod : SetHotfixNoticeRev ( 20210216000000 ) --2021, 02, 16
mod : SetMinSyncRevision ( 20210216000000 )
--mod.respawnTime = 29
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 330965 330978 327497 346654 346690 337110 346657 346762 346303 346790 346698 346800 331634 " ,
" SPELL_CAST_SUCCESS 330959 346657 346303 347376 " ,
" SPELL_AURA_APPLIED 330967 331636 331637 332535 346694 347350 346690 346709 " ,
" SPELL_AURA_APPLIED_DOSE 332535 346690 " ,
" SPELL_AURA_REMOVED 330967 331636 331637 346694 330959 347350 " ,
" SPELL_AURA_REMOVED_DOSE 347350 " ,
" SPELL_PERIODIC_DAMAGE 346945 " ,
" SPELL_PERIODIC_MISSED 346945 " ,
" UNIT_DIED " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3 " ,
" CHAT_MSG_RAID_BOSS_EMOTE "
)
--TODO, upgrade Dreadbolt volley to interrupt count special warning with more data
--TODO, upgrade Cadre to special warning for melee/everyone based on where they spawn?
--TODO, Soul Spikes mid spikes swap, similar to the mid combo swap of Zek'vhoz?
--TODO, continue reviewing timers, especially rechecking mythic and any guessed timers or timers that may have changed since last testing
--TODO, rework and reenable the volley timer eventually. It needs a lot of work since it's sequenced by phase and difficulty and alive vs dead. Real damn mess, Lower Priority
--[[
( ability.id = 330965 or ability.id = 330978 or ability.id = 327497 or ability.id = 346654 or ability.id = 337110 or ability.id = 346657 or ability.id = 346762 or ability.id = 346698 or ability.id = 346690 or ability.id = 346800 or ability.id = 331634 ) and type = " begincast "
or ability.id = 332535 or ability.id = 330959 or ability.id = 332538 or abiity.id = 331918 or ability.id = 346709 or ability.id = 346706
or ( ability.id = 330964 or ability.id = 335773 ) and type = " cast "
or ( target.id = 166971 or target.id = 166969 or target.id = 166970 ) and type = " death "
or ability.id = 347350 and type = " applydebuff "
or ability.id = 346303 and type = " begincast "
or ( ability.id = 347376 ) and type = " cast "
--]]
--I Forgot
--https://www.warcraftlogs.com/reports/MFwzxfRcthN4C9mX#fight=36&view=events&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20330965%20or%20ability.id%20%3D%20330978%20or%20ability.id%20%3D%20327497%20or%20ability.id%20%3D%20346654%20or%20ability.id%20%3D%20337110%20or%20ability.id%20%3D%20346657%20or%20ability.id%20%3D%20346681%20or%20ability.id%20%3D%20346698%20or%20ability.id%20%3D%20346690%20or%20ability.id%20%3D%20346800)%20and%20type%20%3D%20%22begincast%22%20%20or%20(ability.id%20%3D%20331634)%20and%20type%20%3D%20%22cast%22%20%20or%20ability.id%20%3D%20332535%20or%20ability.id%20%3D%20330959%20or%20ability.id%20%3D%20332538%20or%20abiity.id%20%3D%20331918%20or%20ability.id%20%3D%20346709%20%20or%20(ability.id%20%3D%20330964%20or%20ability.id%20%3D%20335773)%20and%20type%20%3D%20%22cast%22%20%20or%20(target.id%20%3D%20166971%20or%20target.id%20%3D%20166969%20or%20target.id%20%3D%20166970)%20and%20type%20%3D%20%22death%22%20%20or%20ability.id%20%3D%20346303%20and%20type%20%3D%20%22begincast%22
--https://www.warcraftlogs.com/reports/L8wWqHKkFmBPgTCQ#fight=16&view=events&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20330965%20or%20ability.id%20%3D%20330978%20or%20ability.id%20%3D%20327497%20or%20ability.id%20%3D%20346654%20or%20ability.id%20%3D%20337110%20or%20ability.id%20%3D%20346657%20or%20ability.id%20%3D%20346762%20or%20ability.id%20%3D%20346698%20or%20ability.id%20%3D%20346690%20or%20ability.id%20%3D%20346800)%20and%20type%20%3D%20%22begincast%22%0A%20or%20(ability.id%20%3D%20331634)%20and%20type%20%3D%20%22cast%22%0A%20or%20ability.id%20%3D%20332535%20or%20ability.id%20%3D%20330959%20or%20ability.id%20%3D%20332538%20or%20abiity.id%20%3D%20331918%20or%20ability.id%20%3D%20346709%0A%20or%20(ability.id%20%3D%20330964%20or%20ability.id%20%3D%20335773)%20and%20type%20%3D%20%22cast%22%0A%20or%20(target.id%20%3D%20166971%20or%20target.id%20%3D%20166969%20or%20target.id%20%3D%20166970)%20and%20type%20%3D%20%22death%22%20%20or%20ability.id%20%3D%20346303%20and%20type%20%3D%20%22begincast%22
--https://www.warcraftlogs.com/reports/94ydxX23tR8Phcfj#fight=26&view=events&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20330965%20or%20ability.id%20%3D%20330978%20or%20ability.id%20%3D%20327497%20or%20ability.id%20%3D%20346654%20or%20ability.id%20%3D%20337110%20or%20ability.id%20%3D%20346657%20or%20ability.id%20%3D%20346681%20or%20ability.id%20%3D%20346698%20or%20ability.id%20%3D%20346690%20or%20ability.id%20%3D%20346800)%20and%20type%20%3D%20%22begincast%22%20%20or%20(ability.id%20%3D%20331634)%20and%20type%20%3D%20%22cast%22%20%20or%20ability.id%20%3D%20332535%20or%20ability.id%20%3D%20330959%20or%20ability.id%20%3D%20332538%20or%20abiity.id%20%3D%20331918%20or%20ability.id%20%3D%20346709%20%20or%20(ability.id%20%3D%20330964%20or%20ability.id%20%3D%20335773)%20and%20type%20%3D%20%22cast%22%20%20or%20(target.id%20%3D%20166971%20or%20target.id%20%3D%20166969%20or%20target.id%20%3D%20166970)%20and%20type%20%3D%20%22death%22%20%20or%20ability.id%20%3D%20346303%20and%20type%20%3D%20%22begincast%22
--LFR
--https://www.warcraftlogs.com/reports/ahyp8WPMnFcA96Vg#fight=last&view=events&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20330965%20or%20ability.id%20%3D%20330978%20or%20ability.id%20%3D%20327497%20or%20ability.id%20%3D%20346654%20or%20ability.id%20%3D%20337110%20or%20ability.id%20%3D%20346657%20or%20ability.id%20%3D%20346762%20or%20ability.id%20%3D%20346698%20or%20ability.id%20%3D%20346690%20or%20ability.id%20%3D%20346800)%20and%20type%20%3D%20%22begincast%22%20%20or%20(ability.id%20%3D%20331634)%20and%20type%20%3D%20%22cast%22%20%20or%20ability.id%20%3D%20332535%20or%20ability.id%20%3D%20330959%20or%20ability.id%20%3D%20332538%20or%20abiity.id%20%3D%20331918%20or%20ability.id%20%3D%20346709%20%20or%20(ability.id%20%3D%20330964%20or%20ability.id%20%3D%20335773)%20and%20type%20%3D%20%22cast%22%20%20or%20(target.id%20%3D%20166971%20or%20target.id%20%3D%20166969%20or%20target.id%20%3D%20166970)%20and%20type%20%3D%20%22death%22%20%20or%20ability.id%20%3D%20347350%20and%20type%20%3D%20%22applydebuff%22%20%20or%20ability.id%20%3D%20346303%20and%20type%20%3D%20%22begincast%22
--https://www.warcraftlogs.com/reports/cNrfpg1XZt89Aa4R#fight=last&view=events&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20330965%20or%20ability.id%20%3D%20330978%20or%20ability.id%20%3D%20327497%20or%20ability.id%20%3D%20346654%20or%20ability.id%20%3D%20337110%20or%20ability.id%20%3D%20346657%20or%20ability.id%20%3D%20346762%20or%20ability.id%20%3D%20346698%20or%20ability.id%20%3D%20346690%20or%20ability.id%20%3D%20346800)%20and%20type%20%3D%20%22begincast%22%20%20or%20(ability.id%20%3D%20331634)%20and%20type%20%3D%20%22cast%22%20%20or%20ability.id%20%3D%20332535%20or%20ability.id%20%3D%20330959%20or%20ability.id%20%3D%20332538%20or%20abiity.id%20%3D%20331918%20or%20ability.id%20%3D%20346709%20%20or%20(ability.id%20%3D%20330964%20or%20ability.id%20%3D%20335773)%20and%20type%20%3D%20%22cast%22%20%20or%20(target.id%20%3D%20166971%20or%20target.id%20%3D%20166969%20or%20target.id%20%3D%20166970)%20and%20type%20%3D%20%22death%22%20%20or%20ability.id%20%3D%20347350%20and%20type%20%3D%20%22applydebuff%22%20%20or%20ability.id%20%3D%20346303%20and%20type%20%3D%20%22begincast%22
--https://www.warcraftlogs.com/reports/zHM8mJ4hxX6TaVdG#fight=9&view=events&pins=2%24Off%24%23244F4B%24expression%24(ability.id%20%3D%20330965%20or%20ability.id%20%3D%20330978%20or%20ability.id%20%3D%20327497%20or%20ability.id%20%3D%20346654%20or%20ability.id%20%3D%20337110%20or%20ability.id%20%3D%20346657%20or%20ability.id%20%3D%20346762%20or%20ability.id%20%3D%20346698%20or%20ability.id%20%3D%20346690%20or%20ability.id%20%3D%20346800)%20and%20type%20%3D%20%22begincast%22%20%20or%20(ability.id%20%3D%20331634)%20and%20type%20%3D%20%22cast%22%20%20or%20ability.id%20%3D%20332535%20or%20ability.id%20%3D%20330959%20or%20ability.id%20%3D%20332538%20or%20abiity.id%20%3D%20331918%20or%20ability.id%20%3D%20346709%20%20or%20(ability.id%20%3D%20330964%20or%20ability.id%20%3D%20335773)%20and%20type%20%3D%20%22cast%22%20%20or%20(target.id%20%3D%20166971%20or%20target.id%20%3D%20166969%20or%20target.id%20%3D%20166970)%20and%20type%20%3D%20%22death%22%20%20or%20ability.id%20%3D%20347350%20and%20type%20%3D%20%22applydebuff%22%20%20or%20ability.id%20%3D%20346303%20and%20type%20%3D%20%22begincast%22
local warnPhase = mod : NewPhaseChangeAnnounce ( 2 , nil , nil , nil , nil , nil , 2 )
--Castellan Niklaus
local warnDualistsRiposte = mod : NewStackAnnounce ( 346690 , 2 , nil , " Tank|Healer " )
local warnDutifulAttendant = mod : NewSpellAnnounce ( 346698 , 2 )
local warnDredgerServants = mod : NewSpellAnnounce ( 330978 , 2 ) --One boss dead
----Adds
local warnCastellansCadre = mod : NewSpellAnnounce ( 330965 , 2 ) --Two bosses dead
local warnFixate = mod : NewTargetAnnounce ( 330967 , 3 ) --Two bosses dead
local warnSintouchedBlade = mod : NewSpellAnnounce ( 346790 , 4 )
--Baroness Frieda
local warnDreadboltVolley = mod : NewCountAnnounce ( 337110 , 2 )
local warnDrainEssence = mod : NewCountAnnounce ( 346654 , 3 , nil , " Healer " )
--Lord Stavros
local warnDarkRecital = mod : NewTargetNoFilterAnnounce ( 331634 , 3 )
local warnDancingFools = mod : NewSpellAnnounce ( 330964 , 2 ) --Two bosses dead
--Intermission
local warnDanceOver = mod : NewEndAnnounce ( 330959 , 2 )
local warnDancingFever = mod : NewTargetNoFilterAnnounce ( 347350 , 4 )
--General
local specWarnGTFO = mod : NewSpecialWarningGTFO ( 346945 , nil , nil , nil , 1 , 8 )
--Castellan Niklaus
local specWarnDualistsRiposte = mod : NewSpecialWarningStack ( 346690 , nil , 2 , nil , nil , 1 , 2 )
local specWarnDualistsRiposteTaunt = mod : NewSpecialWarningTaunt ( 346690 , nil , nil , nil , 1 , 2 )
local specWarnDutifulAttendant = mod : NewSpecialWarningSwitch ( 346698 , " Dps " , nil , nil , 1 , 2 )
local specWarnFixate = mod : NewSpecialWarningRun ( 330967 , nil , nil , nil , 4 , 2 ) --Two bosses dead
----Mythic
--local specWarnMindFlay = mod:NewSpecialWarningInterrupt(310552, "HasInterrupt", nil, nil, 1, 2)
--Baroness Frieda
local specWarnDreadboltVolley = mod : NewSpecialWarningInterruptCount ( 337110 , false , nil , nil , 1 , 2 )
local specWarnPridefulEruption = mod : NewSpecialWarningMoveAway ( 346657 , nil , 138658 , nil , 2 , 2 ) --One boss dead
--Lord Stavros
local specWarnEvasiveLunge = mod : NewSpecialWarningDodge ( 327497 , nil , 219588 , nil , 2 , 2 )
local specWarnDarkRecital = mod : NewSpecialWarningMoveTo ( 331634 , nil , nil , nil , 1 , 2 ) --One boss dead
local yellDarkRecitalRepeater = mod : NewIconRepeatYell ( 331634 , DBM_CORE_L.AUTO_YELL_ANNOUNCE_TEXT . shortyell ) --One boss dead
local specWarnWaltzofBlood = mod : NewSpecialWarningDodge ( 327616 , nil , nil , nil , 2 , 2 )
local specWarnDancingFools = mod : NewSpecialWarningSwitch ( 330964 , " Dps " , nil , nil , 1 , 2 )
--Intermission
local specWarnDanseMacabre = mod : NewSpecialWarningSpell ( 328495 , nil , nil , 2 , 2 , 2 )
local yellDancingFever = mod : NewYell ( 347350 , nil , false ) --Off by default do to potential to spam when spread, going to dry run nameplate auras for this
--Castellan Niklaus
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22147 ) ) --2 baseline abilities
local timerDualistsRiposteCD = mod : NewCDTimer ( 18.7 , 346690 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerDutifulAttendantCD = mod : NewCDTimer ( 44.9 , 346698 , nil , nil , nil , 5 , nil , DBM_COMMON_L.DAMAGE_ICON ) --Used after death on Mythic
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22201 ) ) --One is dead
local timerDredgerServantsCD = mod : NewCDTimer ( 44.3 , 330978 , nil , nil , nil , 1 ) --Iffy on verification
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22199 ) ) --Two are dead
local timerCastellansCadreCD = mod : NewCDTimer ( 26.7 , 330965 , nil , nil , nil , 1 )
--local timerSintouchedBladeCD = mod:NewNextCountTimer(12.1, 308872, nil, nil, nil, 5)
--Baroness Frieda
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22148 ) ) --2 baseline abilities
local timerDrainEssenceCD = mod : NewCDTimer ( 22.5 , 346654 , nil , nil , nil , 5 , nil , DBM_COMMON_L.HEALER_ICON )
local timerDreadboltVolleyCD = mod : NewCDTimer ( 45 , 337110 , nil , nil , nil , 2 , nil , DBM_COMMON_L.MYTHIC_ICON ) --Only for after image
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22202 ) ) --One is dead
local timerPridefulEruptionCD = mod : NewCDTimer ( 25 , 346657 , 138658 , nil , nil , 3 )
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22945 ) ) --Two are dead
local timerSoulSpikesCD = mod : NewCDTimer ( 19.4 , 346762 , nil , nil , nil , 3 )
--Lord Stavros
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22149 ) ) --2 baseline abilities
local timerEvasiveLungeCD = mod : NewCDTimer ( 18.7 , 327497 , 219588 , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerDarkRecitalCD = mod : NewCDTimer ( 45 , 331634 , nil , nil , nil , 3 ) --Continues on Mythic after death instead of gaining new ability
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22203 ) ) --One is dead
local timerWaltzofBloodCD = mod : NewCDTimer ( 21.8 , 327616 , nil , nil , nil , 3 )
mod : AddTimerLine ( DBM : EJ_GetSectionInfo ( 22206 ) ) --Two are dead
local timerDancingFoolsCD = mod : NewCDTimer ( 30.3 , 330964 , nil , nil , nil , 1 )
--Mythic
mod : AddTimerLine ( PLAYER_DIFFICULTY6 )
local timerDancingFeverCD = mod : NewCDCountTimer ( 60 , 347350 , nil , nil , nil , 3 )
local berserkTimer = mod : NewBerserkTimer ( 600 )
mod : AddRangeFrameOption ( 8 , 346657 )
mod : AddInfoFrameOption ( 347350 , true )
mod : AddSetIconOption ( " SetIconOnDutiful " , 346698 , true , true , { 8 } )
mod : AddSetIconOption ( " SetIconOnImage " , " ej22433 " , true , true , { 6 } )
mod : AddSetIconOption ( " SetIconOnDancingFools " , 346826 , true , true , { 8 } ) --Attempts to set icon only on killable one, not yet tested
mod : AddNamePlateOption ( " NPAuraOnFixate " , 330967 )
mod : AddNamePlateOption ( " NPAuraOnShield " , 346694 )
mod : AddNamePlateOption ( " NPAuraOnUproar " , 346303 )
mod.vb . feversActive = 0
mod.vb . volleyCast = 0
mod.vb . drainCount = 0
mod.vb . feverCast = 0
mod.vb . nikDead = false
mod.vb . friedaDead = false
mod.vb . stavrosDead = false
--local danceDurationFix = 0
local darkRecitalTargets = { }
local playerName = UnitName ( " player " )
local castsPerGUID = { }
local FeverStacks = { }
local difficultyName = " None "
local allTimers = {
[ " lfr " ] = { --LFR definitely differs from everything else
--Duelist Riposte
[ 346690 ] = { 25 , 20 , 10 } ,
--Dutiful Attendant
[ 346698 ] = { 60 , 60 , 29.9 } ,
--Dreger Servants (P2+)
[ 330978 ] = { 0 , 60 , 60 } ,
--Castellan's Cadre (P3+)
[ 330965 ] = { 0 , 0 , 60 } ,
--Drain Essence
[ 346654 ] = { 27.3 , 19.8 , 46.6 } ,
--Prideful Eruption (P2+)
[ 346657 ] = { 0 , 43.3 , 46.6 } ,
--Soul Spikes (P3+)
[ 346762 ] = { 0 , 0 , 46.6 } ,
--Evasive Lunge
[ 327497 ] = { 25 , 19.6 , 13.3 } , --Phase 2 lunge can get in a bugged state and spam every 10 seconds in rare cases
--Dark Recital
[ 331634 ] = { 60 , 80 , 26.6 } ,
--Waltz of Blood (P2+)
[ 346800 ] = { 0 , 80 , 110 } ,
--Dancing Fools (P3+)
[ 346826 ] = { 0 , 0 , 110 } ,
} ,
[ " normal " ] = { --Heroic and Normal same, for now, but separated for time being in case this changes
--Duelist Riposte
[ 346690 ] = { 21.4 , 17.1 , 11.4 } ,
--Dutiful Attendant
[ 346698 ] = { 51.4 , 51.4 , 25.6 } ,
--Dreger Servants (P2+)
[ 330978 ] = { 0 , 51.4 , 51.4 } ,
--Castellan's Cadre (P3+)
[ 330965 ] = { 0 , 0 , 51.4 } ,
--Drain Essence
[ 346654 ] = { 25.7 , 19.9 , 41.3 } , --not a bug, verified in two logs at least.
--Prideful Eruption (P2+)
[ 346657 ] = { 0 , 65 , 40.9 } ,
--Soul Spikes (P3+)
[ 346762 ] = { 0 , 0 , 40.9 } ,
--Evasive Lunge
[ 327497 ] = { 21.4 , 17.1 , 11.4 } ,
--Dark Recital
[ 331634 ] = { 51.4 , 68.1 , 22.8 } ,
--Waltz of Blood (P2+)
[ 346800 ] = { 0 , 68.1 , 68.1 } ,
--Dancing Fools (P3+)
[ 346826 ] = { 0 , 0 , 68.1 } ,
} ,
[ " heroic " ] = { --Heroic and Normal same, for now, but separated for time being in case this changes
--Duelist Riposte
[ 346690 ] = { 21.4 , 17.1 , 11.4 } ,
--Dutiful Attendant
[ 346698 ] = { 51.4 , 51.4 , 25.6 } ,
--Dreger Servants (P2+)
[ 330978 ] = { 0 , 51.4 , 51.4 } ,
--Castellan's Cadre (P3+)
[ 330965 ] = { 0 , 0 , 51.4 } ,
--Drain Essence
[ 346654 ] = { 25.7 , 19.9 , 41.3 } , --not a bug, verified in two logs at least.
--Prideful Eruption (P2+)
[ 346657 ] = { 0 , 68.1 , 40.9 } , --68.1 is guessed, did not find any logs it was cast twice in phase 2
--Soul Spikes (P3+)
[ 346762 ] = { 0 , 0 , 40.9 } ,
--Evasive Lunge
[ 327497 ] = { 21.4 , 17.1 , 11.4 } ,
--Dark Recital
[ 331634 ] = { 51.4 , 68.1 , 22.8 } ,
--Waltz of Blood (P2+)
[ 346800 ] = { 0 , 68.1 , 68.1 } ,
--Dancing Fools (P3+)
[ 346826 ] = { 0 , 0 , 68.1 } ,
} ,
[ " mythic " ] = {
--Duelist Riposte
[ 346690 ] = { 18.7 , 14.9 , 7.5 } ,
--Dutiful Attendant (Living)
[ 346698 ] = { 44.9 , 44.9 , 22.5 } , --Verified final mythic test
--Dreger Servants (P2+)
[ 330978 ] = { 0 , 44.9 , 44.9 } ,
--Castellan's Cadre (P3+)
[ 330965 ] = { 0 , 0 , 44.9 } ,
--Drain Essence
[ 346654 ] = { 22.5 , 17.4 , 36.1 } , --17 and 36 are extrapolated based on non mythic timers, could be wrong
--Prideful Eruption (P2+)
[ 346657 ] = { 0 , 60 , 35.7 } , --Guessed based on math differential, but both could be wrong.
--Soul Spikes (P3+)
[ 346762 ] = { 0 , 0 , 35.7 } , --Guessed based on math differential, but both could be wrong
--Dreadbolt Volley (Dead)
[ 337110 ] = { 0 , 44.9 , 37.5 } ,
--Evasive Lunge
[ 327497 ] = { 18.7 , 14.9 , 10 } ,
--Dark Recital (Living)
[ 331634 ] = { 44.9 , 59.9 , 20 } ,
--Dark Recital (Dead)
[ 331635 ] = { 0 , 60 , 36.9 } ,
--Waltz of Blood (P2+)
[ 346800 ] = { 0 , 60 , 60 } ,
--Dancing Fools (P3+)
[ 346826 ] = { 0 , 0 , 60 } ,
} ,
}
local function warndarkRecitalTargets ( self )
warnDarkRecital : Show ( table.concat ( darkRecitalTargets , " <, > " ) )
table.wipe ( darkRecitalTargets )
end
local function darkRecitalYellRepeater ( self , text , runTimes )
yellDarkRecitalRepeater : Yell ( text )
-- runTimes = runTimes + 1
-- if runTimes < 4 then--If they fix visual bugs, enable this restriction
self : Schedule ( 2 , darkRecitalYellRepeater , self , text , runTimes )
-- end
end
local function phaseChange ( self , adjustment )
--Bump phase and stop all timers since regardless of kills, phase changes reset anyone that's still up
local bossesDead = ( self.vb . nikDead and 1 or 0 ) + ( self.vb . friedaDead and 1 or 0 ) + ( self.vb . stavrosDead and 1 or 0 )
if ( bossesDead + 1 ) == self.vb . phase then return end --Somehow phaseChange ran more than once for same phase change, force abort
self : SetStage ( 0 )
if adjustment > 0 then
DBM : AddMsg ( " Some timers may be incorrect this phase. This usually happens when Infusion/Empowered buff misses remaining boss, causing timers not to correctly reset " )
end
if self.vb . phase == 3 then --Two Dead
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 3 ) )
warnPhase : Play ( " pthree " )
--Castellan Niklaus
timerDualistsRiposteCD : Stop ( )
timerDutifulAttendantCD : Stop ( )
if self.vb . nikDead then
if self : IsMythic ( ) then
timerDutifulAttendantCD : Start ( 19.1 - adjustment ) --Confirmed
end
else
timerDredgerServantsCD : Start ( ( self : IsMythic ( ) and 4.4 or self : IsLFR ( ) and 5.7 or 5 ) - adjustment ) --Verify heroic
timerDualistsRiposteCD : Start ( ( self : IsMythic ( ) and 8.2 or self : IsLFR ( ) and 10.7 or 9.2 ) - adjustment )
timerCastellansCadreCD : Start ( ( self : IsMythic ( ) and 11.9 or self : IsLFR ( ) and 15.7 or 13.5 ) - adjustment )
timerDutifulAttendantCD : Start ( ( self : IsMythic ( ) and 19.5 or self : IsLFR ( ) and 25.7 or 22.1 ) - adjustment )
end
--Baroness Frieda
timerDrainEssenceCD : Stop ( )
-- timerDreadboltVolleyCD:Stop()
timerPridefulEruptionCD : Stop ( )
if self.vb . friedaDead then
if self : IsMythic ( ) then
timerDreadboltVolleyCD : Start ( 25 - adjustment ) --Might be because she cast it on transition though, needs recheck
end
else
--timerDreadboltVolleyCD:Start(1)--Used near imediately, except on LFR which has a massive delay of about 25 seconds
timerDrainEssenceCD : Start ( ( self : IsMythic ( ) and 5 or self : IsLFR ( ) and 7.4 or 6.4 ) - adjustment ) --Mythic unknown, completely guessed
timerPridefulEruptionCD : Start ( ( self : IsMythic ( ) and 17 or self : IsLFR ( ) and 24.1 or 20 ) - adjustment ) --Unknown on mythic, completely guessed
timerSoulSpikesCD : Start ( ( self : IsMythic ( ) and 28 or self : IsLFR ( ) and 37.4 or 32.1 ) - adjustment ) --Mythic unknown, completely guessed
end
--Lord Stavros
timerEvasiveLungeCD : Stop ( )
timerWaltzofBloodCD : Stop ( )
timerDarkRecitalCD : Stop ( )
if self.vb . stavrosDead then
if self : IsMythic ( ) then
timerDarkRecitalCD : Start ( 35.9 - adjustment )
end
else
timerDarkRecitalCD : Start ( ( self : IsMythic ( ) and 5.6 or self : IsLFR ( ) and 7.3 or 6.4 ) - adjustment )
timerEvasiveLungeCD : Start ( ( self : IsMythic ( ) and 10.7 or self : IsLFR ( ) and 14 or 12.1 ) - adjustment )
timerDancingFoolsCD : Start ( ( self : IsMythic ( ) and 18.2 or self : IsLFR ( ) and 24 or 20.7 ) - adjustment )
timerWaltzofBloodCD : Start ( ( self : IsMythic ( ) and 54.4 or self : IsLFR ( ) and 44.4 or 62.1 ) - adjustment ) --START (LFR iffy, dance correction makes murky)
end
else --One Dead (Phase 2)
warnPhase : Show ( DBM_CORE_L.AUTO_ANNOUNCE_TEXTS . stage : format ( 2 ) )
warnPhase : Play ( " ptwo " )
--Castellan Niklaus
timerDredgerServantsCD : Stop ( )
timerDualistsRiposteCD : Stop ( )
timerDutifulAttendantCD : Stop ( )
if self.vb . nikDead then
--if self:IsMythic() then
--timerDutifulAttendantCD:Start(34.4-adjustment)--Unknown
--end
else
timerDredgerServantsCD : Start ( ( self : IsMythic ( ) and 4.4 or self : IsLFR ( ) and 5.7 or 13.5 ) - adjustment )
timerDualistsRiposteCD : Start ( ( self : IsMythic ( ) and 8.2 or self : IsLFR ( ) and 10.7 or 9.2 ) - adjustment )
timerDutifulAttendantCD : Start ( ( self : IsMythic ( ) and 34.4 or self : IsLFR ( ) and 8.7 or 5 ) - adjustment ) --Mythic confirmed, this is just weird that heroic is way different
end
--Baroness Frieda
timerDrainEssenceCD : Stop ( )
-- timerDreadboltVolleyCD:Stop()
if self.vb . friedaDead then
if self : IsMythic ( ) then
timerDreadboltVolleyCD : Start ( 13.4 - adjustment )
end
else
--Still needs correcting with live mythic
-- timerDreadboltVolleyCD:Start(1.3)--Used like 1 second after except on LFR
timerDrainEssenceCD : Start ( ( self : IsMythic ( ) and 5 or self : IsLFR ( ) and 7.4 or 6.4 ) - adjustment ) --Unknown on mythic, completely guessed
timerPridefulEruptionCD : Start ( ( self : IsMythic ( ) and 27.3 or self : IsLFR ( ) and 40.7 or 35 ) - adjustment ) --Unknown on mythic, completely guessed
end
--Lord Stavros
timerEvasiveLungeCD : Stop ( )
timerDarkRecitalCD : Stop ( )
if self.vb . stavrosDead then
--if self:IsMythic() then
-- timerDarkRecitalCD:Start(26.6-adjustment)--Unknown
--end
else
timerEvasiveLungeCD : Start ( ( self : IsMythic ( ) and 7 or self : IsLFR ( ) and 10.7 or 7.9 ) - adjustment )
timerDarkRecitalCD : Start ( ( self : IsMythic ( ) and 20.6 or self : IsLFR ( ) and 15.7 or 23.5 ) - adjustment )
timerWaltzofBloodCD : Start ( ( self : IsMythic ( ) and 26.9 or self : IsLFR ( ) and 35.7 or 30.7 ) - adjustment ) --START
end
end
end
--/run DBM:GetModByName(2426):TestRestart(60)
function mod : TestRestart ( amount )
timerDutifulAttendantCD : Start ( amount )
timerDualistsRiposteCD : Start ( amount )
timerDredgerServantsCD : Start ( amount )
timerCastellansCadreCD : Start ( amount )
timerDrainEssenceCD : Start ( amount )
timerSoulSpikesCD : Start ( amount )
timerDarkRecitalCD : Start ( amount )
timerEvasiveLungeCD : Start ( amount )
timerWaltzofBloodCD : Start ( amount )
timerDancingFoolsCD : Start ( amount )
end
--/run DBM:GetModByName(2426):TestAdd(10)
function mod : TestAdd ( amount )
timerDutifulAttendantCD : AddTime ( amount )
timerDualistsRiposteCD : AddTime ( amount )
timerDredgerServantsCD : AddTime ( amount )
timerCastellansCadreCD : AddTime ( amount )
timerDrainEssenceCD : AddTime ( amount )
timerSoulSpikesCD : AddTime ( amount )
timerDarkRecitalCD : AddTime ( amount )
timerEvasiveLungeCD : AddTime ( amount )
timerWaltzofBloodCD : AddTime ( amount )
timerDancingFoolsCD : AddTime ( amount )
end
--/run DBM:GetModByName(2426):TestRemove(10)
function mod : TestRemove ( amount )
timerDutifulAttendantCD : RemoveTime ( amount )
timerDualistsRiposteCD : RemoveTime ( amount )
timerDredgerServantsCD : RemoveTime ( amount )
timerCastellansCadreCD : RemoveTime ( amount )
timerDrainEssenceCD : RemoveTime ( amount )
timerSoulSpikesCD : RemoveTime ( amount )
timerDarkRecitalCD : RemoveTime ( amount )
timerEvasiveLungeCD : RemoveTime ( amount )
timerWaltzofBloodCD : RemoveTime ( amount )
timerDancingFoolsCD : RemoveTime ( amount )
end
--/run DBM:GetModByName(2426):SmallTestAdd(10)
function mod : SmallTestAdd ( amount )
timerDutifulAttendantCD : AddTime ( amount )
end
--/run DBM:GetModByName(2426):SmallTestRemove(10)
function mod : SmallTestRemove ( amount )
timerDutifulAttendantCD : RemoveTime ( amount )
end
--/run DBM:GetModByName(2426):SmallTestRestart(30)
function mod : SmallTestRestart ( amount )
timerDutifulAttendantCD : Start ( amount )
end
--/run DBM:GetModByName(2426):TestPause()
function mod : TestPause ( )
timerDutifulAttendantCD : Pause ( )
timerDualistsRiposteCD : Pause ( )
timerDredgerServantsCD : Pause ( )
timerCastellansCadreCD : Pause ( )
timerDrainEssenceCD : Pause ( )
timerSoulSpikesCD : Pause ( )
timerDarkRecitalCD : Pause ( )
timerEvasiveLungeCD : Pause ( )
timerWaltzofBloodCD : Pause ( )
timerDancingFoolsCD : Pause ( )
end
--/run DBM:GetModByName(2426):TestResume()
function mod : TestResume ( )
timerDutifulAttendantCD : Resume ( )
timerDualistsRiposteCD : Resume ( )
timerDredgerServantsCD : Resume ( )
timerCastellansCadreCD : Resume ( )
timerDrainEssenceCD : Resume ( )
timerSoulSpikesCD : Resume ( )
timerDarkRecitalCD : Resume ( )
timerEvasiveLungeCD : Resume ( )
timerWaltzofBloodCD : Resume ( )
timerDancingFoolsCD : Resume ( )
end
function mod : OnCombatStart ( delay )
self : SetStage ( 1 )
self.vb . feversActive = 0
self.vb . volleyCast = 1
self.vb . drainCount = 0
self.vb . feverCast = 0
self.vb . nikDead = false
self.vb . friedaDead = false
self.vb . stavrosDead = false
table.wipe ( darkRecitalTargets )
table.wipe ( castsPerGUID )
table.wipe ( FeverStacks )
if self : IsMythic ( ) then
difficultyName = " mythic "
timerDancingFeverCD : Start ( 5 - delay , 1 )
--Castellan Niklaus
timerDutifulAttendantCD : Start ( 6.5 - delay )
timerDualistsRiposteCD : Start ( 16.5 - delay )
--Baroness Frieda
-- timerDreadboltVolleyCD:Start(5-delay)
timerDrainEssenceCD : Start ( 13.6 - delay )
--Lord Stavros
timerEvasiveLungeCD : Start ( 8.4 - delay )
timerDarkRecitalCD : Start ( 21.1 - delay )
elseif self : IsHeroic ( ) then
difficultyName = " heroic "
--Castellan Niklaus
timerDutifulAttendantCD : Start ( 7.3 - delay )
timerDualistsRiposteCD : Start ( 18.4 - delay )
--Baroness Frieda
-- timerDreadboltVolleyCD:Start(5.5-delay)
timerDrainEssenceCD : Start ( 15.5 - delay )
--Lord Stavros
timerEvasiveLungeCD : Start ( 8.4 - delay ) --Not changed?
timerDarkRecitalCD : Start ( 22.7 - delay )
elseif self : IsNormal ( ) then --CURRENTLY SAME AS HEROIC, which may be wrong
difficultyName = " normal "
--TODO, FIXME?
--Castellan Niklaus
timerDutifulAttendantCD : Start ( 7.3 - delay )
timerDualistsRiposteCD : Start ( 18.4 - delay )
--Baroness Frieda
-- timerDreadboltVolleyCD:Start(5.5-delay)
timerDrainEssenceCD : Start ( 15.5 - delay )
--Lord Stavros
timerEvasiveLungeCD : Start ( 8.4 - delay ) --Not changed?
timerDarkRecitalCD : Start ( 22.7 - delay )
else
difficultyName = " lfr "
--Castellan Niklaus
timerDutifulAttendantCD : Start ( 7.7 - delay )
timerDualistsRiposteCD : Start ( 21 - delay )
--Baroness Frieda
-- timerDreadboltVolleyCD:Start(6-delay)
timerDrainEssenceCD : Start ( 17.7 - delay )
--Lord Stavros
timerEvasiveLungeCD : Start ( 9.4 - delay )
timerDarkRecitalCD : Start ( 27.7 - delay )
end
if self.Options . NPAuraOnFixate or self.Options . NPAuraOnShield or self.Options . NPAuraOnUproar then
DBM : FireEvent ( " BossMod_EnableHostileNameplates " )
end
berserkTimer : Start ( 720 - delay )
end
function mod : OnCombatEnd ( )
self : UnregisterShortTermEvents ( )
table.wipe ( castsPerGUID )
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
if self.Options . NPAuraOnFixate or self.Options . NPAuraOnShield or self.Options . NPAuraOnUproar then
DBM.Nameplate : Hide ( false , nil , nil , nil , true , true )
end
end
function mod : OnTimerRecovery ( )
if self : IsMythic ( ) then
difficultyName = " mythic "
elseif self : IsHeroic ( ) then
difficultyName = " heroic "
elseif self : IsNormal ( ) then
difficultyName = " normal "
else
difficultyName = " lfr "
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 331634 then
if args : GetSrcCreatureID ( ) == 166970 then --Main boss
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerDarkRecitalCD : Start ( timer )
end
else --173053
local timer = allTimers [ difficultyName ] [ 331635 ] [ self.vb . phase ]
if timer then
timerDarkRecitalCD : Start ( timer )
timerDarkRecitalCD : UpdateInline ( DBM_COMMON_L.MYTHIC_ICON )
end
end
elseif spellId == 330965 then
warnCastellansCadre : Show ( )
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerCastellansCadreCD : Start ( timer )
end
elseif spellId == 330978 then
warnDredgerServants : Show ( )
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerDredgerServantsCD : Start ( timer )
end
elseif spellId == 327497 then
specWarnEvasiveLunge : Show ( )
specWarnEvasiveLunge : Play ( " chargemove " )
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerEvasiveLungeCD : Start ( timer )
end
elseif spellId == 346654 then
self.vb . drainCount = self.vb . drainCount + 1
warnDrainEssence : Show ( self.vb . drainCount )
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerDrainEssenceCD : Start ( timer )
end
elseif spellId == 346690 then
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerDualistsRiposteCD : Start ( timer )
end
elseif spellId == 337110 then --Cast in sets of 2 or 3
if self : AntiSpam ( 12 , 4 ) then
self.vb . volleyCast = 0
end
self.vb . volleyCast = self.vb . volleyCast + 1
local count = self.vb . volleyCast
if self.Options . SpecWarn337110interruptcount then
specWarnDreadboltVolley : Show ( args.sourceName , count )
if count == 1 then
specWarnDreadboltVolley : Play ( " kick1r " )
elseif count == 2 then
specWarnDreadboltVolley : Play ( " kick2r " )
elseif count == 3 then
specWarnDreadboltVolley : Play ( " kick3r " )
else --fallback, shouldn't happen but never know
specWarnDreadboltVolley : Play ( " kickcast " )
end
else
warnDreadboltVolley : Show ( count )
end
elseif spellId == 346657 then
specWarnPridefulEruption : Show ( )
specWarnPridefulEruption : Play ( " scatter " )
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerPridefulEruptionCD : Start ( timer )
end
if self.Options . RangeFrame then
DBM.RangeCheck : Show ( 8 )
end
elseif spellId == 346762 then
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerSoulSpikesCD : Start ( timer )
end
elseif spellId == 346303 then
if self.Options . NPAuraOnUproar then
DBM.Nameplate : Show ( true , args.sourceGUID , spellId , nil , 15 )
end
elseif spellId == 346790 then
if not castsPerGUID [ args.sourceGUID ] then
castsPerGUID [ args.sourceGUID ] = 0
end
castsPerGUID [ args.sourceGUID ] = castsPerGUID [ args.sourceGUID ] + 1
-- local addnumber, count = self.vb.darkManifestationCount, castsPerGUID[args.sourceGUID]
local count = castsPerGUID [ args.sourceGUID ]
warnSintouchedBlade : Show ( count ) --addnumber.."-"..
-- timerSintouchedBladeCD:Start(12.1, count+1, args.sourceGUID)
elseif spellId == 346698 then
if self.Options . SpecWarn346698switch then
specWarnDutifulAttendant : Show ( )
specWarnDutifulAttendant : Play ( " killmob " )
else
warnDutifulAttendant : Show ( )
end
if args : GetSrcCreatureID ( ) == 166971 then --Main boss
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerDutifulAttendantCD : Start ( timer )
end
else
timerDutifulAttendantCD : Start ( self.vb . phase == 2 and 44.9 or 36.2 ) --Mythic only, and yes two diff timers in last test
timerDutifulAttendantCD : UpdateInline ( DBM_COMMON_L.MYTHIC_ICON )
end
if self.Options . SetIconOnDutiful then
self : ScanForMobs ( 175992 , 2 , 8 , 1 , nil , 25 , " SetIconOnDutiful " ) --creatureID, iconSetMethod, mobIcon, maxIcon, scanInterval, scanningTime, optionName
end
elseif spellId == 346800 then
specWarnWaltzofBlood : Show ( )
specWarnWaltzofBlood : Play ( " watchstep " )
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerWaltzofBloodCD : Start ( timer )
end
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if ( spellId == 347376 or spellId == 330959 ) and self : AntiSpam ( 10 , 1 ) then
specWarnDanseMacabre : Show ( )
specWarnDanseMacabre : Play ( " specialsoon " )
--Automatic timer extending.
--After many rounds of testing blizzard finally listened to feedback and suspends active CD timers during dance
--Castellan Niklaus
-- danceDurationFix = GetTime()
--Over adds time to all timers just to keep them from expiring
--This is then corrected later after knowing exact time of dance
timerDancingFeverCD : Stop ( )
if not self.vb . nikDead then
timerDutifulAttendantCD : Pause ( ) --Alive and dead ability
timerDualistsRiposteCD : Pause ( )
if self.vb . phase >= 2 then --1 Dead
timerDredgerServantsCD : Pause ( )
end
if self.vb . phase >= 3 then --1 Dead
timerCastellansCadreCD : Pause ( )
end
else
if self : IsMythic ( ) then
timerDutifulAttendantCD : Pause ( )
end
end
--Baroness Frieda
if not self.vb . friedaDead then
-- timerDreadboltVolleyCD:Pause()
timerDrainEssenceCD : Pause ( )
if self.vb . phase >= 2 then --1 Dead
timerPridefulEruptionCD : Pause ( )
end
if self.vb . phase >= 3 then --2 Dead
timerSoulSpikesCD : Pause ( )
end
else
-- if self:IsMythic() then
-- timerDreadboltVolleyCD:Pause()
-- end
end
--Lord Stavros
if not self.vb . stavrosDead then
timerDarkRecitalCD : Pause ( )
timerEvasiveLungeCD : Pause ( )
if self.vb . phase >= 2 then --1 Dead
timerWaltzofBloodCD : Pause ( )
end
if self.vb . phase >= 3 then --1 Dead
timerDancingFoolsCD : Pause ( )
end
else
if self : IsMythic ( ) then
timerDarkRecitalCD : Pause ( )
end
end
elseif spellId == 346657 then
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
elseif spellId == 346303 then
if self.Options . NPAuraOnUproar then
DBM.Nameplate : Hide ( true , args.sourceGUID , spellId )
end
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 330967 then
warnFixate : CombinedShow ( 0.5 , args.destName )
if args : IsPlayer ( ) then
specWarnFixate : Show ( )
specWarnFixate : Play ( " justrun " )
if self.Options . NPAuraOnFixate then
DBM.Nameplate : Show ( true , args.sourceGUID , spellId , nil , 12 )
end
end
elseif spellId == 346690 then
local amount = args.amount or 1
if amount >= 2 then
if args : IsPlayer ( ) then
specWarnDualistsRiposte : Show ( amount )
specWarnDualistsRiposte : Play ( " stackhigh " )
else
local _ , _ , _ , _ , _ , expireTime = DBM : UnitDebuff ( " player " , spellId )
local remaining
if expireTime then
remaining = expireTime - GetTime ( )
end
if ( not remaining or remaining and remaining < 18.7 ) and not UnitIsDeadOrGhost ( " player " ) then
specWarnDualistsRiposteTaunt : Show ( args.destName )
specWarnDualistsRiposteTaunt : Play ( " tauntboss " )
else
warnDualistsRiposte : Show ( args.destName , amount )
end
end
else
warnDualistsRiposte : Show ( args.destName , amount )
end
elseif spellId == 331636 or spellId == 331637 then
--Pair offs actually work by 331636 paired with 331637 in each set, but combat log order also works
darkRecitalTargets [ # darkRecitalTargets + 1 ] = args.destName
self : Unschedule ( warndarkRecitalTargets )
self : Schedule ( 0.3 , warndarkRecitalTargets , self )
local icon
if # darkRecitalTargets % 2 == 0 then
icon = # darkRecitalTargets / 2 --Generate icon on the evens, because then we can divide it by 2 to assign raid icon to that pair
local playerIsInPair = false
--TODO, REMOVE me if entire raid doesn't get it on mythic (they probably don't)
if icon == 9 then
icon = " (°,,°) "
elseif icon == 10 then
icon = " (•_•) "
end
if darkRecitalTargets [ # darkRecitalTargets - 1 ] == UnitName ( " player " ) then
specWarnDarkRecital : Show ( darkRecitalTargets [ # darkRecitalTargets ] )
specWarnDarkRecital : Play ( " gather " )
playerIsInPair = true
elseif darkRecitalTargets [ # darkRecitalTargets ] == UnitName ( " player " ) then
specWarnDarkRecital : Show ( darkRecitalTargets [ # darkRecitalTargets - 1 ] )
specWarnDarkRecital : Play ( " gather " )
playerIsInPair = true
end
if playerIsInPair then --Only repeat yell on mythic and mythic
self : Unschedule ( darkRecitalYellRepeater )
if type ( icon ) == " number " then icon = DBM_CORE_L.AUTO_YELL_CUSTOM_POSITION : format ( icon , " " ) end
self : Schedule ( 2 , darkRecitalYellRepeater , self , icon , 0 )
yellDarkRecitalRepeater : Yell ( icon )
end
end
elseif ( spellId == 332535 or spellId == 346709 ) and self : AntiSpam ( 30 , spellId == 346709 and 7 or 8 ) then --Infused/Empowered
self : Unschedule ( phaseChange )
phaseChange ( self , 0 ) --true phase change, more accurate timers, but sometimes missing from combat log
elseif spellId == 346694 then
if self.Options . NPAuraOnShield then
DBM.Nameplate : Show ( true , args.destGUID , spellId )
end
elseif spellId == 347350 then
self.vb . feversActive = self.vb . feversActive + 1
warnDancingFever : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
yellDancingFever : Countdown ( spellId )
end
if self : AntiSpam ( 5 , 6 ) then
self.vb . feverCast = self.vb . feverCast + 1
timerDancingFeverCD : Start ( 60 , self.vb . feverCast + 1 )
end
FeverStacks [ args.destName ] = 3
if self.Options . InfoFrame then
if not DBM.InfoFrame : IsShown ( ) then
DBM.InfoFrame : SetHeader ( args.spellName )
DBM.InfoFrame : Show ( 20 , " table " , FeverStacks , 1 )
else
DBM.InfoFrame : UpdateTable ( FeverStacks )
end
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 330967 and args : IsPlayer ( ) then
if self.Options . NPAuraOnFixate then
DBM.Nameplate : Hide ( true , args.sourceGUID , spellId )
end
elseif spellId == 331636 or spellId == 331637 then
if args : IsPlayer ( ) then
self : Unschedule ( darkRecitalYellRepeater )
end
elseif spellId == 346694 then
if self.Options . NPAuraOnShield then
DBM.Nameplate : Hide ( true , args.destGUID , spellId )
end
elseif spellId == 330959 and self : AntiSpam ( 10 , 2 ) then
warnDanceOver : Show ( )
--Hack to remove the over timing of dance phases
-- local danceDuration = GetTime() - danceDurationFix--Remove after testing of pause/resume
-- local adjustment = 50-danceDuration--Remove after testing of pause/resume
if not self.vb . nikDead then
timerDutifulAttendantCD : Resume ( ) --Alive and dead ability
timerDualistsRiposteCD : Resume ( )
if self.vb . phase >= 2 then --1 Dead
timerDredgerServantsCD : Resume ( )
end
if self.vb . phase >= 3 then --1 Dead
timerCastellansCadreCD : Resume ( )
end
else
if self : IsMythic ( ) then
timerDutifulAttendantCD : Resume ( )
end
end
--Baroness Frieda
if not self.vb . friedaDead then
-- timerDreadboltVolleyCD:Resume()
timerDrainEssenceCD : Resume ( )
if self.vb . phase >= 2 then --1 Dead
timerPridefulEruptionCD : Resume ( )
end
if self.vb . phase >= 3 then --2 Dead
timerSoulSpikesCD : Resume ( )
end
else
-- if self:IsMythic() then
-- timerDreadboltVolleyCD:Resume()
-- end
end
--Lord Stavros
if not self.vb . stavrosDead then
timerDarkRecitalCD : Resume ( )
timerEvasiveLungeCD : Resume ( )
if self.vb . phase >= 2 then --1 Dead
timerWaltzofBloodCD : Resume ( )
end
if self.vb . phase >= 3 then --1 Dead
timerDancingFoolsCD : Resume ( )
end
else
if self : IsMythic ( ) then
timerDarkRecitalCD : Resume ( )
end
end
if self : IsMythic ( ) then
timerDancingFeverCD : Start ( 5.5 , self.vb . feverCast + 1 )
end
elseif spellId == 347350 then
self.vb . feversActive = self.vb . feversActive - 1
if args : IsPlayer ( ) then
yellDancingFever : Cancel ( )
end
FeverStacks [ args.destName ] = nil
if self.Options . InfoFrame then
if self.vb . feversActive > 0 then
DBM.InfoFrame : UpdateTable ( FeverStacks )
else
DBM.InfoFrame : Hide ( )
end
end
end
end
function mod : SPELL_AURA_REMOVED_DOSE ( args )
local spellId = args.spellId
if spellId == 347350 then
FeverStacks [ args.destName ] = args.amount or 1
if self.Options . InfoFrame then
DBM.InfoFrame : UpdateTable ( FeverStacks )
end
end
end
--https://shadowlands.wowhead.com/npc=169925/begrudging-waiter
--https://shadowlands.wowhead.com/npc=168406/waltzing-venthyr
function mod : UNIT_DIED ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 166971 then --Castellan Niklaus
self.vb . nikDead = true
timerDualistsRiposteCD : Stop ( )
timerDutifulAttendantCD : Stop ( )
timerDredgerServantsCD : Stop ( )
--Less accurate phase change, but backup if the true phase change infusion/empowerment events are missing
self : Unschedule ( phaseChange )
if self.vb . phase < 3 then
self : Schedule ( 5 , phaseChange , self , 2 )
end
elseif cid == 166969 then --Baroness Frieda
self.vb . friedaDead = true
timerDrainEssenceCD : Stop ( )
-- timerDreadboltVolleyCD:Stop()
timerPridefulEruptionCD : Stop ( )
--Less accurate phase change, but backup if the true phase change infusion/empowerment events are missing
self : Unschedule ( phaseChange )
if self.vb . phase < 3 then
self : Schedule ( 5 , phaseChange , self , 2 )
end
elseif cid == 166970 then --Lord Stavros
self.vb . stavrosDead = true
timerEvasiveLungeCD : Stop ( )
timerWaltzofBloodCD : Stop ( )
timerDarkRecitalCD : Stop ( )
timerDancingFoolsCD : Stop ( )
--Less accurate phase change, but backup if the true phase change infusion/empowerment events are missing
self : Unschedule ( phaseChange )
if self.vb . phase < 3 then
self : Schedule ( 5 , phaseChange , self , 2 )
end
elseif cid == 168406 then --Waltzing Venthyr
if self.Options . NPAuraOnUproar then
DBM.Nameplate : Hide ( true , args.destGUID , 346303 )
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId , spellName )
if spellId == 346945 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_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 346826 then --Dancing Fools
if self.Options . SpecWarn330964switch then
specWarnDancingFools : Show ( )
specWarnDancingFools : Play ( " killmob " )
else
warnDancingFools : Show ( )
end
local timer = allTimers [ difficultyName ] [ spellId ] [ self.vb . phase ]
if timer then
timerDancingFoolsCD : Start ( timer )
end
if self.Options . SetIconOnDancingFools then
self : RegisterShortTermEvents (
" NAME_PLATE_UNIT_ADDED " ,
" FORBIDDEN_NAME_PLATE_UNIT_ADDED "
)
end
end
end
function mod : CHAT_MSG_RAID_BOSS_EMOTE ( msg , npc , _ , _ , target )
if msg : find ( " spell:337110 " ) then
if self.Options . SetIconOnImage then
self : ScanForMobs ( 172803 , 2 , 6 , 1 , nil , 10 , " SetIconOnImage " ) --creatureID, iconSetMethod, mobIcon, maxIcon, scanInterval, scanningTime, optionName
end
local timer = allTimers [ difficultyName ] [ 337110 ] [ self.vb . phase ]
if timer then
timerDreadboltVolleyCD : Start ( timer )
end
end
end
--This assumes the real one is only one with nameplate. Based on video it appears so
--But that doesn't mean other units don't have nameplates that blizzard just adjusted z axis on so it's off the screen.
function mod : NAME_PLATE_UNIT_ADDED ( unit )
if unit then
local guid = UnitGUID ( unit )
if not guid then return end
local cid = self : GetCIDFromGUID ( guid )
if cid == 176026 then
if not GetRaidTargetIndex ( unit ) then
SetRaidTarget ( unit , 8 )
end
self : UnregisterShortTermEvents ( )
end
end
end
mod.FORBIDDEN_NAME_PLATE_UNIT_ADDED = mod.NAME_PLATE_UNIT_ADDED