You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1009 lines
42 KiB

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