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.
654 lines
23 KiB
654 lines
23 KiB
local mod = DBM:NewMod(2446, "DBM-SanctumOfDomination", nil, 1193)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20220830203003")
|
|
mod:SetCreatureID(175731)
|
|
mod:SetEncounterID(2436)
|
|
mod:SetUsedIcons(1, 2, 3)
|
|
mod:SetHotfixNoticeRev(20210815000000)--2021-08-15
|
|
mod:SetMinSyncRevision(20210718000000)
|
|
mod.respawnTime = 29
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEventsInCombat(
|
|
"SPELL_CAST_START 352589 352538 350732 352833 352660 356090 355352 350734",
|
|
"SPELL_AURA_APPLIED 352385 352394 350734 350496 350732",--350534
|
|
"SPELL_AURA_REMOVED 352385 352394 350496",--350534
|
|
"SPELL_PERIODIC_DAMAGE 350455",
|
|
"SPELL_PERIODIC_MISSED 350455",
|
|
-- "UNIT_DIED"
|
|
"CHAT_MSG_MONSTER_YELL",
|
|
"UNIT_SPELLCAST_SUCCEEDED boss1"
|
|
)
|
|
|
|
--[[
|
|
(ability.id = 352589 or ability.id = 352538 or ability.id = 350732 or ability.id = 352833 or ability.id = 352660 or ability.id = 356090 or ability.id = 355352 or ability.id = 350734) and type = "begincast"
|
|
or (ability.id = 352385 or ability.id = 350534) and (type = "applybuff" or type = "removebuff")
|
|
--]]
|
|
--TODO, do people really need a timer for purging protocol? it's based on bosses energy depletion rate (which is exactly 1 energy per second and visible on infoframe)
|
|
--In other words, infoframe energy tracker IS the timer, and his energy is constantly going up and down based on core strategy, timer would need aggressive updates from UNIT_POWER
|
|
local warnDisintegration = mod:NewTargetNoFilterAnnounce(352833, 3, nil, nil, 182908)
|
|
local warnThreatNeutralization = mod:NewTargetNoFilterAnnounce(350496, 2, nil, nil, 167180)
|
|
local warnFormSentry = mod:NewSpellAnnounce(352660, 2)
|
|
local warnObliterate = mod:NewCountAnnounce(355352, 2)
|
|
|
|
--Cores
|
|
local specWarnRadiantEnergy = mod:NewSpecialWarningMoveTo(350455, nil, nil, nil, 1, 2)
|
|
local specWarnMeltdown = mod:NewSpecialWarningRun(352589, nil, nil, nil, 4, 2)--Change to appropriate text and priority
|
|
--Guardian
|
|
local specWarnPurgingProtocol = mod:NewSpecialWarningCount(352538, nil, nil, nil, 2, 2)
|
|
local specWarnSunder = mod:NewSpecialWarningDefensive(350732, nil, nil, nil, 1, 2)
|
|
local specWarnSunderTaunt = mod:NewSpecialWarningTaunt(350732, nil, nil, nil, 1, 2)--Only used on normal/LFR, swaps for heroic and mythic are during Obliterate
|
|
local specWarnObliterate = mod:NewSpecialWarningTaunt(350734, nil, nil, nil, 1, 2)
|
|
local specWarnObliterateCount = mod:NewSpecialWarningCount(350734, false, nil, nil, 1, 2)
|
|
local specWarnDisintegration = mod:NewSpecialWarningDodgeCount(352833, nil, 182908, nil, 2, 2)
|
|
local yellDisintegration = mod:NewYell(352833)
|
|
local specWarnThreatNeutralization = mod:NewSpecialWarningMoveAway(350496, nil, 37859, nil, 1, 2)
|
|
local yellThreatNeutralization = mod:NewShortPosYell(350496, 37859)
|
|
local yellThreatNeutralizationFades = mod:NewIconFadesYell(350496, 37859)
|
|
local specWarnGTFO = mod:NewSpecialWarningGTFO(340324, nil, nil, nil, 1, 8)
|
|
|
|
local timerEliminationPatternCD = mod:NewCDCountTimer(31.6, 350735, 350732, "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--Time between casts not known, but link reset kinda works
|
|
local timerDisintegrationCD = mod:NewCDCountTimer(34.6, 352833, 182908, nil, nil, 3)--Continues whether linked or not
|
|
local timerFormSentryCD = mod:NewCDTimer(72.6, 352660, nil, nil, nil, 1)--Time between casts not known, but link reset kinda works
|
|
local timerThreatNeutralizationCD = mod:NewCDCountTimer(11.4, 350496, 167180, nil, nil, 3, nil, nil, true)--Continues whether linked or not
|
|
|
|
--local berserkTimer = mod:NewBerserkTimer(600)
|
|
|
|
mod:AddRangeFrameOption(10, 350496)
|
|
mod:AddInfoFrameOption(352394, true)
|
|
mod:AddSetIconOption("SetIconOnThreat", 350496, true, false, {1, 2, 3})
|
|
mod:AddMiscLine(DBM_CORE_L.OPTION_CATEGORY_DROPDOWNS)
|
|
mod:AddDropdownOption("IconBehavior", {"TypeOne", "TypeTwo"}, "TypeOne", "misc")--TypeTwo is BW default
|
|
mod:GroupSpells(350732, 350735)
|
|
|
|
mod.vb.timerMode = 0
|
|
mod.vb.coreActive = false
|
|
mod.vb.beamCount = 0
|
|
mod.vb.protocolCount = 0
|
|
mod.vb.patternCount = 0
|
|
mod.vb.threatCount = 0
|
|
mod.vb.comboCount = 0
|
|
mod.vb.iconSetting = 1
|
|
local radiantEnergy = DBM:GetSpellInfo(352394)
|
|
local playerSafe = false
|
|
local playersSafe = {}
|
|
local threatTargets = {}
|
|
local difficultyName = "normal"
|
|
local allTimers = {
|
|
["mythic"] = {
|
|
[0] = {--Initial
|
|
--Threat Neutralization
|
|
[356090] = {8.5, 12.2, 21.8},
|
|
--Disintegration
|
|
[352833] = {15.4},
|
|
},
|
|
[1] = {--Post Link
|
|
--Threat Neutralization
|
|
[356090] = {0, 16.5, 29.2, 17},--Threat used immediately coming out of purging protocol
|
|
--Disintegration
|
|
[352833] = {5.8, 39},
|
|
},
|
|
},
|
|
["heroic"] = {
|
|
[0] = {--Initial
|
|
--Threat Neutralization
|
|
[356090] = {10.7, 12.2},
|
|
--Disintegration
|
|
[352833] = {15.4},
|
|
},
|
|
[1] = {--Post Link
|
|
--Threat Neutralization
|
|
[356090] = {0, 12.1, 12.1, 26.7, 12.1},
|
|
--Disintegration
|
|
[352833] = {5.8, 40.1},
|
|
},
|
|
},
|
|
["normal"] = {--LFR is same
|
|
[0] = {--Initial
|
|
--Threat Neutralization
|
|
[356090] = {10.4, 11, 23.2},
|
|
--Disintegration
|
|
[352833] = {15.4},
|
|
},
|
|
[1] = {--Post Link
|
|
--Threat Neutralization
|
|
[356090] = {4.5, 12.1, 23, 15.7, 12.1},
|
|
--Disintegration
|
|
[352833] = {18, 32.5},
|
|
},
|
|
},
|
|
}
|
|
|
|
local updateInfoFrame
|
|
do
|
|
local DBM, DBM_COMMON_L = DBM, DBM_COMMON_L
|
|
local UnitPower, UnitPowerMax, UnitName = UnitPower, UnitPowerMax, UnitName
|
|
local twipe = table.wipe
|
|
local lines, sortedLines = {}, {}
|
|
local function addLine(key, value)
|
|
-- sort by insertion order
|
|
lines[key] = value
|
|
sortedLines[#sortedLines + 1] = key
|
|
end
|
|
updateInfoFrame = function()
|
|
twipe(lines)
|
|
twipe(sortedLines)
|
|
--Boss Power
|
|
local currentPower, maxPower = UnitPower("boss1"), UnitPowerMax("boss1")
|
|
if maxPower and maxPower ~= 0 then
|
|
if currentPower / maxPower * 100 >= 1 then
|
|
addLine(UnitName("boss1"), currentPower)
|
|
end
|
|
end
|
|
--Player safety status
|
|
if mod.vb.coreActive then
|
|
addLine(radiantEnergy, DBM_COMMON_L.NOTSAFE)
|
|
for uId in DBM:GetGroupMembers() do
|
|
local unitName = DBM:GetUnitFullName(uId)
|
|
if not playersSafe[unitName] then
|
|
addLine(unitName, "")
|
|
end
|
|
end
|
|
end
|
|
return lines, sortedLines
|
|
end
|
|
end
|
|
|
|
--Ugly as hell, definitely a cleaner logical way of doing it but i'm not smart or patient enough these days
|
|
--Code logic is simple (even though it looks like shit). Prio melee before ranged in icon assignments.
|
|
--1 melee = star, 2 melee = star and circle. 3 melee is same as 3 ranged since at this point we just assign icons in table order.
|
|
--Ranged will get icons 2 and 3 or just 3 after melee got theirs obviously
|
|
local isMelee = {[1] = false,[2] = false,[3] = false,}
|
|
local playerName = UnitName("player")
|
|
local function showthreat(self)
|
|
local nameOne, nameTwo, nameThree = nil, nil, nil
|
|
local meleeCount = 0
|
|
local setIcon = self.Options.SetIconOnThreat
|
|
for i = 1, #threatTargets do
|
|
local name = threatTargets[i]
|
|
local uId = DBM:GetRaidUnitId(name)
|
|
if not uId then return end--Prevent errors if person leaves group
|
|
--Identify number of melee and assign them numbers
|
|
if self:IsMeleeDps(uId) then--Melee
|
|
meleeCount = meleeCount + 1
|
|
isMelee[i] = true
|
|
else
|
|
isMelee[i] = false
|
|
end
|
|
--Now cache names to numbers
|
|
if i == 1 then
|
|
nameOne = name
|
|
elseif i == 2 then
|
|
nameTwo = name
|
|
else
|
|
nameThree = name
|
|
end
|
|
end
|
|
--Now deal with every possible scenario
|
|
--All melee or all ranged, Or user wants icons to match bigwigs. results same, use CLEU/table insert order
|
|
if self.vb.iconSetting == 2 or meleeCount == 3 or meleeCount == 0 then
|
|
if setIcon then
|
|
self:SetIcon(nameOne, 1)
|
|
end
|
|
if playerName == nameOne then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(1, 1)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 1)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
if setIcon then
|
|
self:SetIcon(nameTwo, 2)
|
|
end
|
|
if playerName == nameTwo then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(2, 2)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 2)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
if setIcon then
|
|
self:SetIcon(nameThree, 3)
|
|
end
|
|
if playerName == nameThree then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(3, 3)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 3)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
elseif meleeCount == 2 then--2 melee, 1 ranged
|
|
local meleeicon = 0--In this set we have only 1 ranged which means up to 2 melee
|
|
if isMelee[1] then
|
|
meleeicon = meleeicon + 1
|
|
if setIcon then
|
|
self:SetIcon(nameOne, meleeicon)
|
|
end
|
|
if playerName == nameOne then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(meleeicon, meleeicon)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, meleeicon)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
else--Ranged (only one, so icon always 3)
|
|
if setIcon then
|
|
self:SetIcon(nameOne, 3)
|
|
end
|
|
if playerName == nameOne then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(3, 3)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 3)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
end
|
|
if isMelee[2] then
|
|
meleeicon = meleeicon + 1
|
|
if setIcon then
|
|
self:SetIcon(nameTwo, meleeicon)
|
|
end
|
|
if playerName == nameTwo then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(meleeicon, meleeicon)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, meleeicon)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
else--Ranged (only one, so icon always 3)
|
|
if setIcon then
|
|
self:SetIcon(nameTwo, 3)
|
|
end
|
|
if playerName == nameTwo then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(3, 3)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 3)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
end
|
|
if isMelee[3] then
|
|
meleeicon = meleeicon + 1
|
|
if setIcon then
|
|
self:SetIcon(nameThree, meleeicon)
|
|
end
|
|
if playerName == nameThree then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(meleeicon, meleeicon)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, meleeicon)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
else--Ranged (only one, so icon always 3)
|
|
if setIcon then
|
|
self:SetIcon(nameThree, 3)
|
|
end
|
|
if playerName == nameThree then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(3, 3)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 3)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
end
|
|
elseif meleeCount == 1 then
|
|
local rangedIcon = 1--In this set we have 1 melee which means up to 2 ranged, icon starts at 1 instead of 0 because of melee reservation
|
|
if isMelee[1] then--Melee will always be icon 1 in this scenario
|
|
if setIcon then
|
|
self:SetIcon(nameOne, 1)
|
|
end
|
|
if playerName == nameOne then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(1, 1)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 1)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
else
|
|
rangedIcon = rangedIcon + 1
|
|
if setIcon then
|
|
self:SetIcon(nameOne, rangedIcon)
|
|
end
|
|
if playerName == nameOne then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(rangedIcon, rangedIcon)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, rangedIcon)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
end
|
|
if isMelee[2] then--Melee will always be icon 1 in this scenario
|
|
if setIcon then
|
|
self:SetIcon(nameTwo, 1)
|
|
end
|
|
if playerName == nameTwo then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(1, 1)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 1)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
else
|
|
rangedIcon = rangedIcon + 1
|
|
if setIcon then
|
|
self:SetIcon(nameTwo, rangedIcon)
|
|
end
|
|
if playerName == nameTwo then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(rangedIcon, rangedIcon)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, rangedIcon)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
end
|
|
if isMelee[3] then--Melee will always be icon 1 in this scenario
|
|
if setIcon then
|
|
self:SetIcon(nameThree, 1)
|
|
end
|
|
if playerName == nameThree then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(1, 1)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, 1)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
else
|
|
rangedIcon = rangedIcon + 1
|
|
if setIcon then
|
|
self:SetIcon(nameThree, rangedIcon)
|
|
end
|
|
if playerName == nameThree then
|
|
specWarnThreatNeutralization:Show()
|
|
specWarnThreatNeutralization:Play("runout")
|
|
yellThreatNeutralization:Yell(rangedIcon, rangedIcon)
|
|
yellThreatNeutralizationFades:Countdown(350496, nil, rangedIcon)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(10)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
warnThreatNeutralization:Show(table.concat(threatTargets, "<, >"))
|
|
end
|
|
|
|
function mod:OnCombatStart(delay)
|
|
playerSafe = false
|
|
self.vb.timerMode = 0
|
|
self.vb.beamCount = 0
|
|
self.vb.protocolCount = 0
|
|
self.vb.threatCount = 0
|
|
self.vb.patternCount = 0--which pattern SET it is
|
|
self.vb.comboCount = 0--Which cast within the pattern set
|
|
self.vb.iconSetting = self.Options.IconBehavior == "TypeOne" and 1 or 2
|
|
timerFormSentryCD:Start(3.6-delay, 1)--Same in all
|
|
timerDisintegrationCD:Start(15.4-delay, 1)--Same in all
|
|
timerEliminationPatternCD:Start(25.3-delay, 1)--Same in all
|
|
if self:IsMythic() then
|
|
difficultyName = "mythic"
|
|
timerThreatNeutralizationCD:Start(8, 1)
|
|
else
|
|
timerThreatNeutralizationCD:Start(10.4, 1)
|
|
if self:IsHeroic() then
|
|
difficultyName = "heroic"
|
|
else
|
|
difficultyName = "normal"
|
|
end
|
|
end
|
|
--Infoframe setup (might not be needed)
|
|
for uId in DBM:GetGroupMembers() do
|
|
if DBM:UnitDebuff(uId, 352394) then
|
|
local unitName = DBM:GetUnitFullName(uId)
|
|
playersSafe[unitName] = true
|
|
end
|
|
end
|
|
if DBM:UnitAura("boss1", 352385) then
|
|
self.vb.coreActive = true
|
|
else
|
|
self.vb.coreActive = false
|
|
end
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:SetHeader(radiantEnergy)
|
|
DBM.InfoFrame:Show(8, "function", updateInfoFrame, false, false)
|
|
end
|
|
if UnitIsGroupLeader("player") then
|
|
self:SendSync("IconMethod", self.vb.iconSetting)
|
|
end
|
|
end
|
|
|
|
function mod:OnCombatEnd()
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:Hide()
|
|
end
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
end
|
|
|
|
function mod:OnTimerRecovery()
|
|
if self:IsMythic() then
|
|
difficultyName = "mythic"
|
|
elseif self:IsHeroic() then
|
|
difficultyName = "heroic"
|
|
else
|
|
difficultyName = "normal"
|
|
end
|
|
if DBM:UnitDebuff("player", 352394) then
|
|
playerSafe = true
|
|
end
|
|
for uId in DBM:GetGroupMembers() do
|
|
if DBM:UnitDebuff(uId, 352394) then
|
|
local unitName = DBM:GetUnitFullName(uId)
|
|
playersSafe[unitName] = true
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
local spellId = args.spellId
|
|
if spellId == 352589 then
|
|
specWarnMeltdown:Show()
|
|
specWarnMeltdown:Play("justrun")
|
|
elseif spellId == 352538 then
|
|
self.vb.protocolCount = self.vb.protocolCount + 1
|
|
specWarnPurgingProtocol:Show(self.vb.protocolCount)
|
|
specWarnPurgingProtocol:Play("aesoon")
|
|
if self.vb.timerMode == 0 then
|
|
self.vb.timerMode = 1
|
|
end
|
|
if self.vb.protocolCount == 1 then
|
|
--Reset everything but tank combo (and protocol obviously), tank combo we continue counting forward for CD, plus only 1 in each cycle
|
|
self.vb.beamCount = 0
|
|
self.vb.threatCount = 0
|
|
--We allow Threat to keep going on purpose, because it will likely be recast before next link
|
|
timerDisintegrationCD:Stop()
|
|
timerEliminationPatternCD:Stop()
|
|
timerFormSentryCD:Stop()
|
|
if self:IsFated() then
|
|
self:AffixEvent(0)
|
|
end
|
|
end
|
|
elseif spellId == 350732 then
|
|
self.vb.comboCount = self.vb.comboCount + 1
|
|
if self:IsTanking("player", "boss1", nil, true) then
|
|
specWarnSunder:Show()
|
|
specWarnSunder:Play("defensive")
|
|
end
|
|
elseif spellId == 352833 then
|
|
self.vb.beamCount = self.vb.beamCount + 1
|
|
specWarnDisintegration:Show(self.vb.beamCount)
|
|
specWarnDisintegration:Play("farfromline")
|
|
local timer = allTimers[difficultyName][self.vb.timerMode][spellId][self.vb.beamCount+1]
|
|
if timer then
|
|
timerDisintegrationCD:Start(timer, self.vb.beamCount+1)
|
|
end
|
|
elseif spellId == 352660 then
|
|
warnFormSentry:Show()
|
|
elseif spellId == 356090 then
|
|
self.vb.threatCount = self.vb.threatCount + 1
|
|
isMelee = {[1] = false,[2] = false,[3] = false,}
|
|
table.wipe(threatTargets)
|
|
timerThreatNeutralizationCD:Stop()
|
|
local timer = allTimers[difficultyName][self.vb.timerMode][spellId][self.vb.threatCount+1]
|
|
if timer then
|
|
timerThreatNeutralizationCD:Start(timer, self.vb.threatCount+1)
|
|
end
|
|
elseif spellId == 355352 or spellId == 350734 then--Mythic, Heroic
|
|
self.vb.comboCount = self.vb.comboCount + 1
|
|
local castCount = (self.vb.comboCount == 2) and 1 or 2
|
|
if self.Options.SpecWarn355352count then
|
|
specWarnObliterateCount:Show(castCount)
|
|
else
|
|
warnObliterate:Show(castCount)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 352385 then--Energizing Link
|
|
self.vb.coreActive = true
|
|
self.vb.protocolCount = 0
|
|
if not playerSafe then
|
|
specWarnRadiantEnergy:Show(radiantEnergy)
|
|
specWarnRadiantEnergy:Play("findshelter")
|
|
end
|
|
timerDisintegrationCD:Stop()
|
|
timerFormSentryCD:Stop()
|
|
timerEliminationPatternCD:Stop()
|
|
timerDisintegrationCD:Start(self:IsEasy() and 18 or 5.8)
|
|
timerFormSentryCD:Start(self:IsEasy() and 10.7 or 18)
|
|
timerEliminationPatternCD:Start(28.2, self.vb.patternCount+1)
|
|
if self:IsFated() then
|
|
--Not as good as form sentry in accuracy of timer, but better for start accuracy to avoid starting on pull form sentry
|
|
self:AffixEvent(1, 2)
|
|
end
|
|
elseif spellId == 352394 then
|
|
playersSafe[args.destName] = true
|
|
if args:IsPlayer() then
|
|
playerSafe = true
|
|
end
|
|
elseif spellId == 350734 then
|
|
local uId = DBM:GetRaidUnitId(args.destName)
|
|
if self:IsTanking(uId) and not args:IsPlayer() then
|
|
specWarnObliterate:Show(args.destName)
|
|
specWarnObliterate:Play("tauntboss")
|
|
end
|
|
elseif spellId == 350732 then
|
|
local uId = DBM:GetRaidUnitId(args.destName)
|
|
if self:IsTanking(uId) and not args:IsPlayer() and self.vb.comboCount == 2 then--Obviously normal/LFR
|
|
specWarnSunderTaunt:Show(args.destName)
|
|
specWarnSunderTaunt:Play("tauntboss")
|
|
end
|
|
elseif spellId == 350496 then
|
|
threatTargets[#threatTargets+1] = args.destName
|
|
self:Unschedule(showthreat)
|
|
if #threatTargets == 3 then
|
|
showthreat(self)
|
|
else
|
|
self:Schedule(0.5, showthreat, self)
|
|
end
|
|
elseif spellId == 350534 then--Purging Protocol Activating
|
|
timerEliminationPatternCD:Stop()--Still probably not most accurate way of doing it, but probably most reliable one given most strategies
|
|
end
|
|
end
|
|
--mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 352385 then--Energizing Link
|
|
self.vb.coreActive = false
|
|
elseif spellId == 352394 then
|
|
playersSafe[args.destName] = nil
|
|
if args:IsPlayer() then
|
|
playerSafe = false
|
|
end
|
|
elseif spellId == 350496 then
|
|
if self.Options.SetIconOnThreat then
|
|
self:SetIcon(args.destName, 0)
|
|
end
|
|
if args:IsPlayer() then
|
|
yellThreatNeutralizationFades:Cancel()
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
end
|
|
-- elseif spellId == 350534 then--Purging Protocol disabling
|
|
|
|
end
|
|
end
|
|
|
|
--"<1155.70 23:16:13> [CHAT_MSG_MONSTER_YELL] Dissection!#Guardian of the First Ones###Champssh##0#0##0#282#nil#0#false#false#false#false", -- [14127]
|
|
--"<25.44 22:36:58> [CHAT_MSG_MONSTER_YELL] Dismantle.#Guardian of the First Ones###Tadorz##0#0##0#1980#nil#0#false#false#false#false", -- [305]
|
|
function mod:CHAT_MSG_MONSTER_YELL(msg, _, _, _, targetName)
|
|
if msg == L.Dissection or msg:find(L.Dissection) or msg == L.Dismantle or msg:find(L.Dismantle) then
|
|
self:SendSync("Dissection", targetName)
|
|
end
|
|
end
|
|
|
|
do
|
|
--Delayed function just to make absolute sure RL sync overrides user settings after OnCombatStart functions run
|
|
local function UpdateIcons(self, setting)
|
|
self.vb.iconSetting = setting
|
|
end
|
|
function mod:OnSync(msg, target, sender)
|
|
if not self:IsInCombat() then return end
|
|
if msg == "Dissection" and sender then
|
|
local targetName = DBM:GetUnitFullName(target) or target
|
|
if targetName then
|
|
warnDisintegration:Show(targetName)--Everyone needs to dodge it so everyone gets special warning. this is just informative message
|
|
if targetName == UnitName("player") then
|
|
yellDisintegration:Yell()
|
|
end
|
|
end
|
|
elseif msg == "IconMethod" then
|
|
self:Schedule(3, UpdateIcons, self, target)
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
|
if spellId == 350455 and destGUID == UnitGUID("player") and not playerSafe and self:AntiSpam(2, 3) then
|
|
specWarnGTFO:Show(spellName)
|
|
specWarnGTFO:Play("watchfeet")
|
|
end
|
|
end
|
|
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
|
|
|
|
--"<34.94 22:37:08> [UNIT_SPELLCAST_SUCCEEDED] Guardian of the First Ones(Shazzw) -Elimination Pattern- [[boss1:Cast-3-2012-2450-6508-350735-0021A819F4:350735]]", -- [464]
|
|
--"<34.95 22:37:08> [UNIT_SPELLCAST_START] Guardian of the First Ones(Shazzw) - Sunder - 2s [[boss1:Cast-3-2012-2450-6508-350732-00222819F4:350732]]", -- [465]
|
|
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
|
|
if spellId == 350735 then--Elimination Pattern
|
|
self.vb.patternCount = self.vb.patternCount + 1
|
|
timerEliminationPatternCD:Start(nil, self.vb.patternCount+1)
|
|
end
|
|
end
|
|
|