local mod = DBM:NewMod(2426, "DBM-CastleNathria", nil, 1190) local L = mod:GetLocalizedStrings() mod:SetRevision("20210614184808") 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_CORE_L.TANK_ICON) local timerDutifulAttendantCD = mod:NewCDTimer(44.9, 346698, nil, nil, nil, 5, nil, DBM_CORE_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_CORE_L.HEALER_ICON) local timerDreadboltVolleyCD = mod:NewCDTimer(45, 337110, nil, nil, nil, 2, nil, DBM_CORE_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_CORE_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, 48.3}, --Prideful Eruption (P2+) [346657] = {0, 43.3, 48.3}, --Soul Spikes (P3+) [346762] = {0, 0, 48.3}, --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_CORE_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_CORE_L.MYTHIC_ICON) end if self.Options.SetIconOnDutiful then self:ScanForMobs(175992, 2, 8, 1, 0.2, 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 if not UnitIsDeadOrGhost("player") and not DBM:UnitDebuff("player", spellId) 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, 0.2, 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