local mod = DBM:NewMod(2447, "DBM-SanctumOfDomination", nil, 1193) local L = mod:GetLocalizedStrings() mod:SetRevision("20220205042222") mod:SetCreatureID(175730) mod:SetEncounterID(2431) mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8) mod:SetHotfixNoticeRev(20210902000000) mod:SetMinSyncRevision(20210706000000) mod.respawnTime = 29 mod:RegisterCombat("combat") mod:RegisterEventsInCombat( "SPELL_CAST_START 351680 350554 350421 353426 350169 354367 354265 357144 353603", "SPELL_CAST_SUCCESS 350355", "SPELL_AURA_APPLIED 354365 351680 353432 350568 356065 353195 354964 357739", -- "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED 354365 351680 350568 356065 353195 357739", -- "SPELL_PERIODIC_DAMAGE", -- "SPELL_PERIODIC_MISSED", "UNIT_DIED", "UNIT_SPELLCAST_SUCCEEDED boss1" ) --Extended todo, stuff that probably won't get done do to diminished time investment these days. Hard to stay motivated with so much support decline --TODO, https://ptr.wowhead.com/spell=354966/unstable-accretion trackingn for mythic phase 2 --TODO, further timer data for longer pulls? --TODO, add cast bars for the double beam casts that don't actually have double casts events --TODO, verify add auto marking off IEEU --TODO, improve P3 timers for invoke/bombs to account for when it will be delayed by runes? (likely will never actually get done, time investment these days is as diminished as support) --[[ (ability.id = 350421 or ability.id = 351680 or ability.id = 350554 or ability.id = 354367 or ability.id = 354265 or ability.id = 357144) and type = "begincast" or (ability.id = 353195 or ability.id = 357739) and (type = "applybuff" or type = "removebuff") or (ability.id = 353195) and type = "applydebuff" or ability.id = 354964 and type = "applydebuff" --]] --Stage One: Scrying Fate mod:AddOptionLine(DBM:EJ_GetSectionInfo(22926), "announce") local warnProbe = mod:NewCastAnnounce(353603, 2) local warnGrimPortent = mod:NewTargetNoFilterAnnounce(354365, 4)--Mythic local warnTwistFate = mod:NewCountAnnounce(353931, 2, nil, "RemoveMagic") local warnCallofEternity = mod:NewTargetAnnounce(350554, 4, nil, nil, 37859) local specWarnGrimPortent = mod:NewSpecialWarningYouPos(354365, nil, nil, nil, 1, 2, 4)--Mythic local yellGrimPortent = mod:NewYell(354365)--Mythic local yellGrimPortentFades = mod:NewShortFadesYell(354365)--Mythic local specWarnInvokeDestiny = mod:NewSpecialWarningMoveAway(351680, nil, nil, nil, 1, 2) local yellInvokeDestiny = mod:NewYell(351680) local yellInvokeDestinyFades = mod:NewShortFadesYell(351680) local specWarnInvokeDestinySwap = mod:NewSpecialWarningTaunt(351680, nil, nil, nil, 1, 2) local specWarnBurdenofDestinyYou = mod:NewSpecialWarningRun(353432, nil, 244657, nil, 4, 2)--"Fixate" local specWarnBurdenofDestiny = mod:NewSpecialWarningSwitch(353432, "Dps", nil, nil, 1, 2) local specWarnFatedConjunction = mod:NewSpecialWarningDodge(350355, nil, 207544, nil, 2, 2) local specWarnCallofEternity = mod:NewSpecialWarningMoveAway(350554, nil, 37859, nil, 1, 2) local yellCallofEternity = mod:NewShortPosYell(350554, 37859)--"Bomb" local yellCallofEternityFades = mod:NewIconFadesYell(350554, 37859) local timerGrimPortentCD = mod:NewCDCountTimer(28.8, 354365, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)--28-46? local timerGrimPortent = mod:NewBuffFadesTimer(9, 354365, nil, nil, nil, 5, nil, DBM_COMMON_L.HEALER_ICON) local timerInvokeDestinyCD = mod:NewCDCountTimer(37.8, 351680, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)--37.8-41 local timerInvokeDestiny = mod:NewAddsCustomTimer(8, 351680, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON) local timerTwistFateCD = mod:NewCDCountTimer(48.7, 353931, nil, nil, 2, 5, nil, DBM_COMMON_L.MAGIC_ICON..DBM_COMMON_L.HEALER_ICON) local timerFatedConjunctionCD = mod:NewCDCountTimer(59.7, 350355, 207544, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON, nil, 1, 3)--"Beams" local timerFatedConjunction = mod:NewCastTimer(6.7, 350355, 207544, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON) local timerCallofEternityCD = mod:NewCDCountTimer(37.9, 350554, 167180, nil, nil, 3)--"Bombs" mod:AddSetIconOption("SetIconOnCallofEternity", 350554, true, false, {1, 2, 3, 4, 5}) mod:AddSetIconOption("SetIconOnGrimPortent", 354365, false, false, {1, 2, 3, 4, 5, 6, 7, 8}) mod:AddNamePlateOption("NPAuraOnBurdenofDestiny", 353432, true) --Stage Two: Defying Destiny mod:AddOptionLine(DBM:EJ_GetSectionInfo(22927), "announce") local warnRunicAffinity = mod:NewTargetNoFilterAnnounce(354964, 4)--Mythic local specWarnRealignFate = mod:NewSpecialWarningCount(351969, nil, nil, nil, 2, 2) local specWarnRunicAffinity = mod:NewSpecialWarningYou(354964, nil, nil, nil, 2, 2, 4) local timerDespairCD = mod:NewCDCountTimer("d17", 357144, nil, nil, nil, 4)--Tricky to type, it's interrupt bar in 3/4 difficulties, aoe run out in mythic local timerDarkestDestiny = mod:NewCastTimer(40, 353122, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON) ----Monstrosity local warnDespair = mod:NewCountAnnounce(357144, 3) local specWarnDespair = mod:NewSpecialWarningInterruptCount(357144, "HasInterrupt", nil, nil, 1, 2)--Non mythic only local specWarnDespairRun = mod:NewSpecialWarningRun(357144, nil, nil, nil, 4, 2, 4) mod:AddSetIconOption("SetIconOnMonstrosity", "ej23764", true, true, {7, 8}) --Stage Three: Fated Terminus mod:AddOptionLine(DBM:EJ_GetSectionInfo(23486), "announce") local warnExtemporaneousFate = mod:NewSoonAnnounce(353195, 3) local specWarnExtemporaneousFate = mod:NewSpecialWarningCount(353195, nil, nil, nil, 2, 2) local timerRunicAffinityCD = mod:NewCDCountTimer(39, 354964, nil, nil, nil, 3, nil, nil, true)--Used in state 3 only, in stage 1 it happens at same time as rings local timerExtemporaneousFateCD = mod:NewCDCountTimer(39, 353195, nil, nil, nil, 6, nil, nil, true) --local berserkTimer = mod:NewBerserkTimer(600) mod:GroupSpells(351680, 353432)--Burden and invoke bundled (invoke is add fixate at end of burden) mod:GroupSpells(351969, 353122)--Realign fate and darkest destiny which is channel for how long you have for fate mod.vb.EternityIcon = 1 mod.vb.DebuffIcon = 1 mod.vb.realignCount = 0 mod.vb.twistCount = 0 mod.vb.eternityCount = 0 mod.vb.destinyCount = 0 mod.vb.conjunctionCount = 0 mod.vb.portentCount = 0 mod.vb.affinityCount = 0 mod.vb.extemporaneousCount = 0 mod.vb.addIcon = 8 local grimDebuffs = 0--Local variable for timer canceling only local castsPerGUID = {} local difficultyName = "normal" local allTimers = { ["mythic"] = { [1] = { --Twist Fate [354265] = {5.8, 31.5, 20, 37.7, 27.9, 18.2},--first is 11 the second time around --Call of Eternity [350554] = {17.8, 57.1, 37.6},--first is 23 the second time around --Invoke Destiny [351680] = {20, 45, 44.9, 34.4},--first is 25 the second time around --Fated Conjunction [350421] = {30, 47.4, 5, 7},--first is 35 the second time around --Grim Portent [354367] = {43, 75},--first is 48 the second time around }, [3] = { --Twist Fate [354265] = {40, 16, 29, 46.5}, --Call of Eternity [350554] = {13, 54.7, 29}, --Invoke Destiny [351680] = {26, 44, 44.1}, --Fated Conjunction [350421] = {18, 75, 7}, --Extemporaneous Fate [353195] = {54, 89.4},--or 56? } }, ["normal"] = {--Same as heroic [1] = {--Timers after Realign Fate --Twist Fate [354265] = {10, 49.2, 75.2, 35.2, 10.9},--Last one is 10.9-38.9 for some reason --Call of Eternity [350554] = {29.4, 38.8, 34.1, 44.9, 41.3}, --Invoke Destiny [351680] = {40.4, 39.3, 38.7, 40}, --Fated Conjunction [350421] = {18.5, 59.7, 26.7, 23.4, 48.5}, }, [3] = { --Twist Fate [354265] = {50.5, 48.6, 38.8}, --Call of Eternity [350554] = {11.5, 38.6, 38.8, 57.1},--second and third one can be flipped based on phasing timing, so for sequence sake lowest seen is used for both :\ --11.53, 75.89, 40.14 --11.5, 38.6, 73.1, 57.1 --Invoke Destiny [351680] = {25.6, 43.7, 90}, --Fated Conjunction [350421] = {9.4, 50.4, 51.1, 40.1, 26.7}, --Extemporaneous Fate [353195] = {36.7, 43.1, 43.7},--Huge variations, 36-50 } }, } --Attempts to fix destiny timer when it's 73.1 instead of 38.6 --This schedule function will only run if it doesn't come on time, and restart the timer for remainder of 73.1 --local function fixEternity(self) -- timerCallofEternityCD:Update(50, 73.1, self.vb.eternityCount+1) --end function mod:OnCombatStart(delay) table.wipe(castsPerGUID) self.vb.DebuffIcon = 1 self:SetStage(1) self.vb.realignCount = 0 self.vb.twistCount = 0 self.vb.eternityCount = 0 self.vb.destinyCount = 0 self.vb.conjunctionCount = 0 self.vb.portentCount = 0 self.vb.extemporaneousCount = 0 -- berserkTimer:Start(-delay) if self:IsMythic() then difficultyName = "mythic" timerTwistFateCD:Start(5.8-delay, 1) timerCallofEternityCD:Start(17.8-delay, 1) timerInvokeDestinyCD:Start(20-delay, 1) timerFatedConjunctionCD:Start(30-delay, 1) timerGrimPortentCD:Start(43-delay, 1) else difficultyName = "normal" --Normal and Heroic timers are same here timerTwistFateCD:Start(4.6-delay, 1) timerFatedConjunctionCD:Start(13.1-delay, 1)--13.1-14.4 timerCallofEternityCD:Start(24-delay, 1) timerInvokeDestinyCD:Start(35-delay, 1) end if self.Options.NPAuraOnBurdenofDestiny then DBM:FireEvent("BossMod_EnableHostileNameplates") end -- DBM:AddMsg("Abilities on this fight can be volatile and sometimes skip casts/change order. DBM timers attempt to match the most common scenario of events but sometimes fight will do it's own thing") end function mod:OnCombatEnd() table.wipe(castsPerGUID) self:UnregisterShortTermEvents() if self.Options.NPAuraOnBurdenofDestiny then DBM.Nameplate:Hide(true, nil, nil, nil, true, true) end end function mod:OnTimerRecovery() if self:IsMythic() then difficultyName = "mythic" else difficultyName = "normal" end end function mod:SPELL_CAST_START(args) local spellId = args.spellId if spellId == 351680 then self.vb.destinyCount = self.vb.destinyCount + 1 local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.destinyCount+1] if timer then timerInvokeDestinyCD:Start(timer, self.vb.destinyCount+1) end elseif spellId == 350554 then--Two sub cast IDs, but one primary? -- self:Unschedule(fixEternity) self.vb.EternityIcon = 1 self.vb.eternityCount = self.vb.eternityCount + 1 local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.eternityCount+1] if timer then timerCallofEternityCD:Start(timer, self.vb.eternityCount+1) --if (self.vb.eternityCount+1) == 2 and self.vb.phase == 3 then -- self:Schedule(50, fixEternity, self) --end end elseif (spellId == 350421 or spellId == 353426 or spellId == 350169) then--350421 confiremd, others unknown self.vb.conjunctionCount = self.vb.conjunctionCount + 1 specWarnFatedConjunction:Show() specWarnFatedConjunction:Play("watchstep") local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][350421][self.vb.conjunctionCount+1] if timer then timerFatedConjunctionCD:Start(timer, self.vb.conjunctionCount+1) end timerFatedConjunction:Start()--6.7 elseif spellId == 354367 then grimDebuffs = 0 self.vb.DebuffIcon = 1 self.vb.portentCount = self.vb.portentCount + 1 local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.portentCount+1] if timer then timerGrimPortentCD:Start(timer, self.vb.portentCount+1) end elseif spellId == 354265 then--Twist Fate self.vb.twistCount = self.vb.twistCount + 1 warnTwistFate:Show(self.vb.twistCount) local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.twistCount+1] if timer then timerTwistFateCD:Start(timer, self.vb.twistCount+1) end elseif spellId == 357144 then if not castsPerGUID[args.sourceGUID] then--Shouldn't happen, but failsafe castsPerGUID[args.sourceGUID] = 0 end castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1 local count = castsPerGUID[args.sourceGUID] timerDespairCD:Start(17, count, args.sourceGUID) if self:IsMythic() then--Not interruptable on mythic if self:CheckBossDistance(args.destGUID, true, 21519, 23) or self:IsTank() then--23 yards away (mistletoe) or you're a tank, regular warning if self:AntiSpam(3, 1) then warnDespair:Show(count) end else--Special warning if self:AntiSpam(3, 2) then specWarnDespairRun:Show() specWarnDespairRun:Play("justrun") end end else timerDespairCD:UpdateInline(DBM_COMMON_L.INTERRUPT_ICON, count, args.sourceGUID)--It's only interruptable in non mythic, add icon there if self:CheckInterruptFilter(args.sourceGUID, false, false) then specWarnDespair:Show(args.sourceName, count) if count == 1 then specWarnDespair:Play("kick1r") elseif count == 2 then specWarnDespair:Play("kick2r") elseif count == 3 then specWarnDespair:Play("kick3r") elseif count == 4 then specWarnDespair:Play("kick4r") elseif count == 5 then specWarnDespair:Play("kick5r") else specWarnDespair:Play("kickcast") end end end elseif spellId == 353603 then if self:IsTanking("player", "boss1", nil, true) then warnProbe:Show() end end end --[[ function mod:SPELL_CAST_SUCCESS(args) local spellId = args.spellId if spellId == 353931 then timerTwistFateCD:Start() end end --]] function mod:SPELL_AURA_APPLIED(args) local spellId = args.spellId if spellId == 354365 then if args:IsDestTypePlayer() then grimDebuffs = grimDebuffs + 1 local icon = self.vb.DebuffIcon if self.Options.SetIconOnGrimPortent and icon < 9 then self:SetIcon(args.destName, icon) end if args:IsPlayer() then specWarnGrimPortent:Show() specWarnGrimPortent:Play("targetyou") yellGrimPortent:Yell() yellGrimPortentFades:Countdown(spellId) end warnGrimPortent:CombinedShow(0.5, args.destName) self.vb.DebuffIcon = self.vb.DebuffIcon + 1 timerGrimPortent:Start() end elseif spellId == 351680 then if args:IsPlayer() then specWarnInvokeDestiny:Show() specWarnInvokeDestiny:Play("runout") yellInvokeDestiny:Yell() yellInvokeDestinyFades:Countdown(spellId) else specWarnInvokeDestinySwap:Show(args.destName) specWarnInvokeDestinySwap:Play("tauntboss") specWarnInvokeDestinySwap:ScheduleVoice(1.5, "defensive") end timerInvokeDestiny:Start(8, self.vb.destinyCount) elseif spellId == 353432 then if args:IsPlayer() then specWarnBurdenofDestinyYou:Show() specWarnBurdenofDestinyYou:Play("justrun") if self.Options.NPAuraOnBurdenofDestiny then DBM.Nameplate:Show(true, args.sourceGUID, spellId) end elseif self:IsHard() then--Normal and LFR just blow it up, it doesn't do any damage specWarnBurdenofDestiny:Show() specWarnBurdenofDestiny:Play("killmob") end elseif spellId == 350568 or spellId == 356065 then local icon = self.vb.EternityIcon if self.Options.SetIconOnCallofEternity then self:SetIcon(args.destName, icon) end if args:IsPlayer() then specWarnCallofEternity:Show()--self:IconNumToTexture(icon) specWarnCallofEternity:Play("runout")--"mm"..icon yellCallofEternity:Yell(icon, icon) yellCallofEternityFades:Countdown(spellId, nil, icon) end warnCallofEternity:CombinedShow(0.5, args.destName) self.vb.EternityIcon = self.vb.EternityIcon + 1 elseif spellId == 353195 then--Extemporaneous Fate self.vb.extemporaneousCount = self.vb.extemporaneousCount + 1 specWarnExtemporaneousFate:Show(self.vb.extemporaneousCount) specWarnExtemporaneousFate:Play("specialsoon") timerDarkestDestiny:Start(30) local timer = allTimers[difficultyName][3][spellId][self.vb.extemporaneousCount+1] or 39--(technically timer is always 39 unless spell queued behind other spells. this seems to be lowest cast order priority) if timer then timerExtemporaneousFateCD:Start(timer, self.vb.extemporaneousCount+1) end elseif spellId == 354964 then warnRunicAffinity:CombinedShow(0.3, args.destName) if args:IsPlayer() then specWarnRunicAffinity:Show() specWarnRunicAffinity:Play("targetyou") end if self:AntiSpam(5, 3) and self.vb.phase == 3 then self.vb.affinityCount = self.vb.affinityCount + 1 --The same timer a Extemporaneous fate, just earlier, offset self handled local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][353195][self.vb.affinityCount+1] or 39 if timer then timerRunicAffinityCD:Start(timer, self.vb.affinityCount+1) end end elseif spellId == 357739 then self:SetStage(2) self.vb.addIcon = 8 self.vb.realignCount = self.vb.realignCount + 1 specWarnRealignFate:Show(self.vb.realignCount) specWarnRealignFate:Play("specialsoon") timerInvokeDestinyCD:Stop() timerTwistFateCD:Stop() timerFatedConjunctionCD:Stop() timerCallofEternityCD:Stop() timerGrimPortentCD:Stop() timerDarkestDestiny:Start() self:RegisterShortTermEvents( "INSTANCE_ENCOUNTER_ENGAGE_UNIT" ) end end function mod:SPELL_AURA_REMOVED(args) local spellId = args.spellId if spellId == 354365 then grimDebuffs = grimDebuffs - 1 if self.Options.SetIconOnGrimPortent then self:SetIcon(args.destName, 0) end if grimDebuffs == 0 then timerGrimPortent:Stop() end elseif spellId == 351680 then if args:IsPlayer() then yellInvokeDestinyFades:Cancel() end timerInvokeDestiny:Stop() elseif spellId == 353432 then if args:IsPlayer() then if self.Options.NPAuraOnBurdenofDestiny then DBM.Nameplate:Show(true, args.sourceGUID, spellId) end end elseif spellId == 350568 or spellId == 356065 then if args:IsPlayer() then yellCallofEternityFades:Cancel() end if self.Options.SetIconOnCallofEternity then self:SetIcon(args.destName, 0) end elseif spellId == 353195 then--Extemporaneous Fate timerDarkestDestiny:Stop() elseif (spellId == 357739) and self.vb.phase == 2 then self:UnregisterShortTermEvents() timerDarkestDestiny:Stop() self.vb.twistCount = 0 self.vb.eternityCount = 0 self.vb.destinyCount = 0 self.vb.conjunctionCount = 0 self.vb.portentCount = 0 if self.vb.realignCount == 1 then--first cast self:SetStage(1) if self:IsMythic() then timerTwistFateCD:Start(11, 1) timerCallofEternityCD:Start(23, 1) timerInvokeDestinyCD:Start(25, 1) timerFatedConjunctionCD:Start(30, 1) timerGrimPortentCD:Start(48, 1) else timerTwistFateCD:Start(10, 1)--CAST_START timerFatedConjunctionCD:Start(18.5, 1) timerCallofEternityCD:Start(29.4, 1) timerInvokeDestinyCD:Start(40.4, 1) end else--Second cast self:SetStage(3) if self:IsMythic() then timerCallofEternityCD:Start(13, 1) timerFatedConjunctionCD:Start(18, 1) timerInvokeDestinyCD:Start(26, 1) timerRunicAffinityCD:Start(39, 1) timerTwistFateCD:Start(40, 1) timerExtemporaneousFateCD:Start(54, 1)--Rings activating else timerFatedConjunctionCD:Start(9.4, 1)--9.4-12.1 timerCallofEternityCD:Start(11.5, 1)--11.5-14.5 timerInvokeDestinyCD:Start(25.6, 1) if self:IsHeroic() then timerRunicAffinityCD:Start(30, 1) end timerExtemporaneousFateCD:Start(self:IsHeroic() and 46.7 or 36.7, 1) timerTwistFateCD:Start(50.5, 1) end end end end function mod:UNIT_DIED(args) local cid = self:GetCIDFromGUID(args.destGUID) if cid == 180323 then--Fatespawn Monstrosity timerDespairCD:Stop(1, args.destGUID) timerDespairCD:Stop(2, args.destGUID) timerDespairCD:Stop(3, args.destGUID) timerDespairCD:Stop(4, args.destGUID) timerDespairCD:Stop(5, args.destGUID) end end function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT() for i = 1, 5 do local unitID = "boss"..i local unitGUID = UnitGUID(unitID) if UnitExists(unitID) and not castsPerGUID[unitGUID] then castsPerGUID[unitGUID] = 0 local cid = self:GetUnitCreatureId(unitID) if cid == 180323 then--Fatespawn Monstrosity --Initial despair timer, with new transcriptor log --timerDespairCD:Start(0, 1, unitGUID) if not GetRaidTargetIndex(unitID) then--Not already marked if self.Options.SetIconOnMonstrosity then self:SetIcon(unitID, self.vb.addIcon) end self.vb.addIcon = self.vb.addIcon - 1 end end end end end --[[ function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName) if spellId == 340324 and destGUID == UnitGUID("player") and not playerDebuff and self:AntiSpam(2, 4) then specWarnGTFO:Show(spellName) specWarnGTFO:Play("watchfeet") end end mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE --]] --"<1445.83 22:22:30> [UNIT_SPELLCAST_SUCCEEDED] Fatescribe Roh-Kalo(Shazzul) -Extemporaneous Fate- [[boss1:Cast-3-2012-2450-10555-353193-000195A188:353193]]", -- [28166] --"<1453.06 22:22:37> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\ICONS\\Achievement_GuildPerk_WorkingOvertime_Rank2.blp:20|t Fatescribe Roh-Kalo is creating an |cFFFF0000|Hspell:353195|h[Extemporaneous Fate]|h|r!#Fatescribe Roh-Kalo###Fatescribe Roh-Kalo##0#0##0#572#nil#0#false#false#false#false", -- [28352] function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId) if spellId == 353193 then--Extemporaneous Fate (precast) warnExtemporaneousFate:Show()--PreWarning end end