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.

1377 lines
52 KiB

if not WeakAuras.IsLibsOK() then return end
---@type string
local AddonName = ...
---@class OptionsPrivate
local OptionsPrivate = select(2, ...)
local L = WeakAuras.L
local function getAuraMatchesLabel(name)
local ids = WeakAuras.spellCache.GetSpellsMatching(name)
if ids then
local numMatches = 0
for _ in pairs(ids) do
numMatches = numMatches + 1
end
return tostring(numMatches)
else
return ""
end
end
local function getAuraMatchesList(name)
local ids = WeakAuras.spellCache.GetSpellsMatching(name)
if ids then
local descText = ""
for id, _ in pairs(ids) do
local icon = OptionsPrivate.Private.ExecEnv.GetSpellIcon(id)
if icon then
if descText == "" then
descText = "|T"..icon..":0|t: "..id
else
descText = descText.."\n|T"..icon..":0|t: "..id
end
end
end
return descText
else
return ""
end
end
local function shiftTable(tbl, pos)
local size = #tbl
for i = pos, size, 1 do
tbl[i] = tbl[i + 1]
end
end
-- Counts the Names or SpellIds in a aura, recursively.
local function CountNames(data, triggernum, name)
local result = 0
local trigger = data.triggers[triggernum].trigger
if trigger[name] then
result = #trigger[name]
end
return result
end
local function IsGroupTrigger(trigger)
return trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party"
or trigger.unit == "boss" or trigger.unit == "nameplate" or trigger.unit == "arena" or trigger.unit == "multi"
end
local function IsSingleMissing(trigger)
return not IsGroupTrigger(trigger) and trigger.matchesShowOn == "showOnMissing"
end
local function CanHaveMatchCheck(trigger)
if IsGroupTrigger(trigger) then
return true
end
if trigger.matchesShowOn == "showOnMissing" then
return false
end
if trigger.matchesShowOn == "showOnActive" or trigger.matchesShowOn == "showOnMatches" or not trigger.matchesShowOn then
return true
end
-- Always: If clones are shown
return trigger.showClones
end
local function CreateNameOptions(aura_options, data, trigger, size, isExactSpellId, isIgnoreList, prefix, baseOrder, useKey, optionKey, name, desc, inverse)
local spellCache = WeakAuras.spellCache
for i = 1, size do
local hiddenFunction
if isIgnoreList then
hiddenFunction = function()
return not (trigger.type == "aura2" and trigger[useKey] and (i == 1 or trigger[optionKey] and trigger[optionKey][i - 1]) and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger))
end
else
hiddenFunction = function()
return not (trigger.type == "aura2" and trigger[useKey] and (i == 1 or trigger[optionKey] and trigger[optionKey][i - 1]))
end
end
if i ~= 1 then
aura_options[prefix .. "space" .. i] = {
type = "execute",
name = inverse and L["and"] or L["or"],
width = WeakAuras.normalWidth - 0.2,
image = function() return "", 0, 0 end,
order = baseOrder + i / 100 + 0.0001,
hidden = hiddenFunction
}
end
local iconOption = prefix .. "icon" .. i
aura_options[iconOption] = {
type = "execute",
width = 0.2,
order = baseOrder + i / 100 + 0.0002,
hidden = hiddenFunction,
control = "WeakAurasIcon"
}
if isExactSpellId then
aura_options[iconOption].name = function()
return OptionsPrivate.Private.ExecEnv.GetSpellName(WeakAuras.SafeToNumber(trigger[optionKey] and trigger[optionKey][i]) or "")
end
aura_options[iconOption].image = function()
local icon = OptionsPrivate.Private.ExecEnv.GetSpellIcon(trigger[optionKey] and trigger[optionKey][i] or "")
return icon and tostring(icon) or "", 18, 18
end
aura_options[iconOption].disabled = function()
return not trigger[optionKey] or not trigger[optionKey][i] or not OptionsPrivate.Private.ExecEnv.GetSpellIcon(trigger[optionKey] and trigger[optionKey][i])
end
else
aura_options[iconOption].name = function()
local spellId = trigger[optionKey] and trigger[optionKey][i] and WeakAuras.SafeToNumber(trigger[optionKey][i])
if spellId then
return getAuraMatchesLabel(OptionsPrivate.Private.ExecEnv.GetSpellName(spellId))
else
return getAuraMatchesLabel(trigger[optionKey] and trigger[optionKey][i])
end
end
aura_options[iconOption].desc = function()
local spellId = trigger[optionKey] and trigger[optionKey][i] and WeakAuras.SafeToNumber(trigger[optionKey][i])
if spellId then
local name = OptionsPrivate.Private.ExecEnv.GetSpellName(spellId)
if name then
local auraDesc = getAuraMatchesList(name)
if auraDesc then
auraDesc = name .. "\n" .. auraDesc
end
return auraDesc
end
else
return getAuraMatchesList(trigger[optionKey] and trigger[optionKey][i])
end
end
aura_options[iconOption].image = function()
local icon
local spellId = trigger[optionKey] and trigger[optionKey][i] and WeakAuras.SafeToNumber(trigger[optionKey][i])
if spellId then
icon = OptionsPrivate.Private.ExecEnv.GetSpellIcon(spellId)
else
icon = spellCache.GetIcon(trigger[optionKey] and trigger[optionKey][i])
end
return icon and tostring(icon) or "", 18, 18
end
end
aura_options[prefix .. i] = {
type = "input",
width = WeakAuras.normalWidth,
name = name,
desc = desc,
order = baseOrder + i / 100 + 0.0003,
hidden = hiddenFunction,
get = function(info)
local rawString = trigger[optionKey] and trigger[optionKey][i]
if not rawString then return "" end
local spellName, _, _, _, _, _, spellID = OptionsPrivate.Private.ExecEnv.GetSpellInfo(WeakAuras.SafeToNumber(rawString))
if spellName and spellID then
return ("%s (%s)"):format(spellID, spellName) .. "\0" .. rawString
elseif WeakAuras.SafeToNumber(rawString) then
return ("%s (%s)"):format(rawString, L["Unknown Spell"]) .. "\0" .. rawString
else
return rawString .. "\0" .. rawString
end
end,
set = function(info, v)
trigger[optionKey] = trigger[optionKey] or {}
if v == "" then
shiftTable(trigger[optionKey], i)
else
if isExactSpellId then
trigger[optionKey][i] = v
else
local _, spellId = WeakAuras.spellCache.CorrectAuraName(v)
if spellId then
trigger[optionKey][i] = tostring(spellId)
else
trigger[optionKey][i] = spellCache.BestKeyMatch(v)
end
end
end
WeakAuras.Add(data)
WeakAuras.UpdateThumbnail(data)
WeakAuras.ClearAndUpdateOptions(data.id)
end,
validate = isExactSpellId and WeakAuras.ValidateNumeric or nil,
control = "WeakAurasInputFocus",
}
end
-- VALIDATE ?
end
local function GetBuffTriggerOptions(data, triggernum)
local trigger = data.triggers[triggernum].trigger
local function HasMatchCount(trigger)
if IsGroupTrigger(trigger) then
return trigger.useMatch_count
else
return trigger.matchesShowOn == "showOnMatches"
end
end
local function HasMatchPerUnitCount(trigger)
if trigger.type == "aura2" and IsGroupTrigger(trigger)
and trigger.showClones and trigger.combinePerUnit and trigger.perUnitMode ~= "unaffected"
then
return trigger.useMatchPerUnit_count
end
end
local ValidateNumeric = WeakAuras.ValidateNumeric
local aura_options = {
useUnit = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Unit"],
order = 10,
disabled = true,
get = function() return true end
},
unit = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Unit"],
order = 10.1,
values = function()
return OptionsPrivate.Private.unit_types_bufftrigger_2
end,
desc = L["• |cff00ff00Player|r, |cff00ff00Target|r, |cff00ff00Focus|r, and |cff00ff00Pet|r correspond directly to those individual unitIDs.\n• |cff00ff00Specific Unit|r lets you provide a specific valid unitID to watch.\n|cffff0000Note|r: The game will not fire events for all valid unitIDs, making some untrackable by this trigger.\n• |cffffff00Party|r, |cffffff00Raid|r, |cffffff00Boss|r, |cffffff00Arena|r, and |cffffff00Nameplate|r can match multiple corresponding unitIDs.\n• |cffffff00Smart Group|r adjusts to your current group type, matching just the \"player\" when solo, \"party\" units (including \"player\") in a party or \"raid\" units in a raid.\n• |cffffff00Multi-target|r attempts to use the Combat Log events, rather than unitID, to track affected units.\n|cffff0000Note|r: Without a direct relationship to actual unitIDs, results may vary.\n\n|cffffff00*|r Yellow Unit settings can match multiple units and will default to being active even while no affected units are found without a Unit Count or Match Count setting."],
},
useSpecificUnit = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Specific Unit"],
order = 10.2,
disabled = true,
hidden = function() return not (trigger.type == "aura2" and trigger.unit == "member") end,
get = function() return true end
},
specificUnit = {
type = "input",
width = WeakAuras.normalWidth,
name = L["Specific Unit"],
order = 10.3,
desc = L["A Unit ID (e.g., party1)."],
hidden = function() return not (trigger.type == "aura2" and trigger.unit == "member") end
},
warnSpecifcUnit = {
type = "description",
width = WeakAuras.doubleWidth,
name = function()
return L["|cFFFF0000Note:|r The unit '%s' is not a trackable unit."]:format(trigger.specificUnit or "")
end,
order = 10.4,
hidden = function() return not (trigger.type == "aura2" and trigger.unit == "member" and WeakAuras.UntrackableUnit(trigger.specificUnit)) end
},
warnSoftTarget = {
type = "description",
width = WeakAuras.doubleWidth,
name = function()
return L["|cFFFF0000Note:|r The unit '%s' requires soft target cvars to be enabled."]:format(trigger.unit or "")
end,
order = 10.4,
hidden = function() return not WeakAuras.IsUntrackableSoftTarget(trigger.unit) end
},
useDebuffType = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Aura Type"],
order = 11,
disabled = true,
get = function() return true end
},
debuffType = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Aura Type"],
order = 11.1,
values = OptionsPrivate.Private.debuff_types,
},
spell_filters_header = {
type = "header",
name = L["Spell Selection Filters"],
order = 11.15,
},
use_debuffClass = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Debuff Type"],
order = 11.2,
desc = L["Filter to only dispellable de/buffs of the given type(s)\nBleed classification via LibDispel"],
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end
},
debuffClass = {
type = "multiselect",
width = WeakAuras.normalWidth,
name = L["Debuff Type"],
order = 11.3,
hidden = function()
return not (trigger.type == "aura2" and trigger.unit ~= "multi"
and CanHaveMatchCheck(trigger)
and trigger.use_debuffClass)
end,
values = OptionsPrivate.Private.debuff_class_types,
},
debuffClassSpace = {
type = "description",
width = WeakAuras.normalWidth,
name = "",
order = 11.4,
hidden = function()
return not (trigger.type == "aura2" and trigger.unit ~= "multi"
and CanHaveMatchCheck(trigger)
and not trigger.use_debuffClass)
end
},
useName = {
type = "toggle",
name = L["Name(s)"],
order = 12,
width = WeakAuras.normalWidth - 0.2,
},
useNameSpace = {
type = "description",
name = "",
order = 12.1,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and not trigger.useName) end
},
useExactSpellId = {
type = "toggle",
name = L["Exact Spell ID(s)"],
width = WeakAuras.normalWidth - 0.2,
order = 22,
},
useExactSpellIdSpace = {
type = "description",
name = "",
order = 22.1,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and not trigger.useExactSpellId) end
},
useIgnoreName = {
type = "toggle",
name = L["Ignored Name(s)"],
order = 32,
width = WeakAuras.normalWidth - 0.2,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end
},
useIgnoreNameSpace = {
type = "description",
name = "",
order = 32.1,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and not trigger.useIgnoreName and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end
},
useIgnoreExactSpellId = {
type = "toggle",
name = L["Ignored Exact Spell ID(s)"],
width = WeakAuras.normalWidth - 0.2,
order = 42,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end
},
useIgnoreExactSpellIddSpace = {
type = "description",
name = "",
order = 42.1,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and not trigger.useIgnoreExactSpellId and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end
},
useNamePattern = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Name Pattern Match"],
desc = L["Filter based on the spell Name string."],
order = 55,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi") end
},
useNamePatternSpace = {
type = "description",
name = "",
order = 55.2,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and not trigger.useNamePattern) end
},
namePattern_operator = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Operator"],
order = 55.1,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and trigger.useNamePattern) end,
values = OptionsPrivate.Private.string_operator_types
},
namePattern_name = {
type = "input",
name = L["Aura Name Pattern"],
width = WeakAuras.doubleWidth,
order = 55.2,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and trigger.useNamePattern) end
},
aura_filters_header = {
type = "header",
name = L["Active Aura Filters and Info"],
order = 59.9,
},
useStacks = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Stack Count"],
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end,
order = 60
},
stacksOperator = {
type = "select",
name = L["Operator"],
order = 60.1,
width = WeakAuras.halfWidth,
values = OptionsPrivate.Private.operator_types,
disabled = function() return not trigger.useStacks end,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.useStacks) end,
get = function() return trigger.useStacks and trigger.stacksOperator or nil end
},
stacks = {
type = "input",
name = L["Stack Count"],
validate = ValidateNumeric,
order = 60.2,
width = WeakAuras.halfWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.useStacks) end,
get = function() return trigger.useStacks and trigger.stacks or nil end
},
useStacksSpace = {
type = "description",
width = WeakAuras.normalWidth,
name = "",
order = 60.3,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and not trigger.useStacks) end
},
useRem = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Remaining Time"],
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end,
order = 61
},
remOperator = {
type = "select",
name = L["Operator"],
order = 61.1,
width = WeakAuras.halfWidth,
values = OptionsPrivate.Private.operator_types,
disabled = function() return not trigger.useRem end,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.useRem) end,
get = function() return trigger.useRem and trigger.remOperator or nil end
},
rem = {
type = "input",
name = L["Remaining Time"],
validate = ValidateNumeric,
order = 61.2,
width = WeakAuras.halfWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.useRem) end,
get = function() return trigger.useRem and trigger.rem or nil end
},
useRemSpace = {
type = "description",
width = WeakAuras.normalWidth,
name = "",
order = 61.3,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and not trigger.useRem) end
},
useTotal = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Total Time"],
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end,
order = 61.4
},
totalOperator = {
type = "select",
name = L["Operator"],
order = 61.5,
width = WeakAuras.halfWidth,
values = OptionsPrivate.Private.operator_types,
disabled = function() return not trigger.useTotal end,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.useTotal) end,
get = function() return trigger.useTotal and trigger.totalOperator or nil end
},
total = {
type = "input",
name = L["Total Time"],
validate = ValidateNumeric,
order = 61.6,
width = WeakAuras.halfWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.useTotal) end,
get = function() return trigger.useTotal and trigger.total or nil end
},
useTotalSpace = {
type = "description",
width = WeakAuras.normalWidth,
name = "",
order = 61.7,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and not trigger.useTotal) end
},
use_stealable = {
type = "toggle",
name = function(input)
local value = trigger.use_stealable
if value == nil then return L["Is Stealable"]
elseif value == false then return "|cFFFF0000 " .. L["Negator"] .. " " .. L["Is Stealable"] .. "|r"
else return "|cFF00FF00" .. L["Is Stealable"] .. "|r" end
end,
width = WeakAuras.doubleWidth,
order = 64,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end,
get = function()
local value = trigger.use_stealable
if value == nil then return false
elseif value == false then return "false"
else return "true" end
end,
set = function(info, v)
if v then
trigger.use_stealable = true
else
local value = trigger.use_stealable
if value == false then trigger.use_stealable = nil
else trigger.use_stealable = false end
end
WeakAuras.Add(data)
end
},
use_isBossDebuff = {
type = "toggle",
name = function(input)
local value = trigger.use_isBossDebuff
if value == nil then return L["Is Boss Debuff"]
elseif value == false then return "|cFFFF0000 " .. L["Negator"] .. " " .. L["Is Boss Debuff"] .. "|r"
else return "|cFF00FF00" .. L["Is Boss Debuff"] .. "|r" end
end,
width = WeakAuras.doubleWidth,
order = 64.1,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end,
get = function()
local value = trigger.use_isBossDebuff
if value == nil then return false
elseif value == false then return "false"
else return "true" end
end,
set = function(info, v)
if v then
trigger.use_isBossDebuff = true
else
local value = trigger.use_isBossDebuff
if value == false then trigger.use_isBossDebuff = nil
else trigger.use_isBossDebuff = false end
end
WeakAuras.Add(data)
end
},
use_castByPlayer = {
type = "toggle",
name = function()
local value = trigger.use_castByPlayer
if value == nil then return L["Cast by a Player Character"]
elseif value == false then return "|cFFFF0000 "..L["Negator"].." "..L["Cast by a Player Character"]
else return "|cFF00FF00"..L["Cast by a Player Character"] end
end,
desc = L["Only Match auras cast by a player (not an npc)"],
width = WeakAuras.doubleWidth,
order = 64.2,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger)) end,
get = function()
local value = trigger.use_castByPlayer
if value == nil then return false
elseif value == false then return "false"
else return "true" end
end,
set = function(info, v)
if v then
trigger.use_castByPlayer = true
else
local value = trigger.use_castByPlayer
if value == false then trigger.use_castByPlayer = nil
else trigger.use_castByPlayer = false end
end
WeakAuras.Add(data)
end
},
ownOnly = {
type = "toggle",
width = WeakAuras.doubleWidth,
name = function()
local value = trigger.ownOnly
if value == nil then return L["Own Only"]
elseif value == false then return "|cFFFF0000 " .. L["Negator"] .. " " .. L["Own Only"] .. "|r"
else return "|cFF00FF00" .. L["Own Only"] .. "|r" end
end,
desc = function()
local value = trigger.ownOnly
if value == nil then return L["Only match auras cast by the player or their pet"]
elseif value == false then return L["Only match auras cast by people other than the player or their pet"]
else return L["Only match auras cast by the player or their pet"] end
end,
get = function()
local value = trigger.ownOnly
if value == nil then return false
elseif value == false then return "false"
else return "true" end
end,
set = function(info, v)
if v then
trigger.ownOnly = true
else
local value = trigger.ownOnly
if value == false then trigger.ownOnly = nil
else trigger.ownOnly = false end
end
WeakAuras.Add(data)
end,
order = 64.3,
hidden = function() return not trigger.type == "aura2" end
},
fetchTooltip = {
type = "toggle",
name = L["Fetch Tooltip Information"],
desc = L["This adds %tooltip, %tooltip1, %tooltip2, %tooltip3 and %tooltip4 as text replacements and also allows filtering based on the tooltip content/values."],
order = 64.5,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and not IsSingleMissing(trigger)) end
},
use_tooltip = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Tooltip Pattern Match"],
order = 64.51,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.fetchTooltip) end
},
use_tooltipSpace = {
type = "description",
name = "",
order = 64.52,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and not trigger.use_tooltip and trigger.fetchTooltip) end
},
tooltip_operator = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Operator"],
order = 64.53,
disabled = function() return not trigger.use_tooltip end,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.use_tooltip and trigger.fetchTooltip) end,
values = OptionsPrivate.Private.string_operator_types
},
tooltip = {
type = "input",
name = L["Tooltip Content"],
width = WeakAuras.doubleWidth,
order = 64.54,
disabled = function() return not trigger.use_tooltip end,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.use_tooltip and trigger.fetchTooltip) end
},
use_tooltipValue = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Tooltip Value"],
order = 64.55,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.fetchTooltip) end
},
tooltipValueNumber = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Tooltip Value #"],
order = 64.56,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.use_tooltipValue and trigger.fetchTooltip) end,
values = OptionsPrivate.Private.tooltip_count
},
use_tooltipValueSpace = {
type = "description",
name = "",
order = 64.57,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and not trigger.use_tooltipValue and trigger.fetchTooltip) end
},
tooltipValue_operator = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Operator"],
order = 64.58,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.use_tooltipValue and trigger.fetchTooltip) end,
values = OptionsPrivate.Private.operator_types
},
tooltipValue = {
type = "input",
name = L["Tooltip"],
width = WeakAuras.normalWidth,
validate = ValidateNumeric,
order = 64.59,
hidden = function() return not (trigger.type == "aura2" and trigger.unit ~= "multi" and CanHaveMatchCheck(trigger) and trigger.use_tooltipValue and trigger.fetchTooltip) end
},
unit_filters_header = {
type = "header",
name = L["Affected Unit Filters and Info"],
order = 65,
hidden = function() return trigger.unit == "multi" end,
},
useAffected = {
type = "toggle",
name = L["Fetch Affected/Unaffected Names and Units"],
width = WeakAuras.doubleWidth,
order = 65.1,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")) end
},
fetchRole = {
type = "toggle",
name = L["Fetch Role Information"],
desc = L["This adds %role, %roleIcon as text replacements. Does nothing if the unit is not a group member."],
order = 65.2,
width = WeakAuras.doubleWidth,
hidden = function()
return not (trigger.type == "aura2" and trigger.unit ~= "multi")
or WeakAuras.IsClassicEra()
end
},
fetchRaidMark = {
type = "toggle",
name = L["Fetch Raid Mark Information"],
desc = L["This adds %raidMark as text replacements."],
order = 65.3,
width = WeakAuras.doubleWidth,
hidden = function()
return not (trigger.type == "aura2" and trigger.unit ~= "multi")
end
},
use_includePets = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Include Pets"],
order = 66.1,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party"))
end
},
includePets = {
type = "select",
values = OptionsPrivate.Private.include_pets_types,
width = WeakAuras.normalWidth,
name = L["Include Pets"],
order = 66.15,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.use_includePets) end,
},
includePetsSpace = {
type = "description",
name = "",
order = 66.16,
width = WeakAuras.normalWidth,
hidden = function()
return not (trigger.type == "aura2"
and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and not trigger.use_includePets)
end
},
useActualSpec = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Specialization"],
desc = L["Requires LibSpecialization, that is e.g. a up-to date WeakAuras version"],
order = 66.3,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")
and WeakAuras.IsCataOrMistsOrRetail())
end,
},
actualSpec = {
type = "multiselect",
width = WeakAuras.normalWidth,
name = L["Actual Spec"],
desc = L["Requires syncing the specialization via LibSpecialization."],
values = OptionsPrivate.Private.spec_types_all,
hidden = function()
return not (trigger.type == "aura2"
and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")
and trigger.useActualSpec
and WeakAuras.IsCataOrMistsOrRetail())
end,
order = 66.4
},
actualSpecSpace = {
type = "description",
name = "",
order = 66.5,
width = WeakAuras.normalWidth,
hidden = function()
return not (trigger.type == "aura2"
and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")
and not trigger.useActualSpec
and WeakAuras.IsCataOrMistsOrRetail())
end
},
useGroupRole = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Group Role"],
order = 67.1,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party"))
or WeakAuras.IsClassicEra()
end
},
group_role = {
type = "multiselect",
width = WeakAuras.normalWidth,
name = L["Group Role"],
values = OptionsPrivate.Private.role_types,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.useGroupRole)
or WeakAuras.IsClassicEra()
end,
order = 67.2
},
group_roleSpace = {
type = "description",
name = "",
order = 67.3,
width = WeakAuras.normalWidth,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and not trigger.useGroupRole)
or WeakAuras.IsClassicEra()
end
},
useRaidRole = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Raid Role"],
order = 67.4,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party"))
or WeakAuras.IsRetail()
end
},
raid_role = {
type = "multiselect",
width = WeakAuras.normalWidth,
name = L["Raid Role"],
values = OptionsPrivate.Private.raid_role_types,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.useRaidRole)
or WeakAuras.IsRetail()
end,
order = 67.5
},
raid_roleSpace = {
type = "description",
name = "",
order = 67.6,
width = WeakAuras.normalWidth,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and not trigger.useRaidRole)
or WeakAuras.IsRetail()
end
},
useArenaSpec = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Arena Spec"],
order = 67.8,
hidden = function() return
not (WeakAuras.IsRetail() and trigger.type == "aura2" and trigger.unit == "arena")
end
},
arena_spec = {
type = "multiselect",
width = WeakAuras.normalWidth,
name = L["Specialization"],
values = OptionsPrivate.Private.spec_types_all,
hidden = function()
return not (WeakAuras.IsRetail() and trigger.type == "aura2" and trigger.unit == "arena" and trigger.useArenaSpec)
end,
order = 67.9
},
arena_specSpace = {
type = "description",
name = "",
order = 67.91,
width = WeakAuras.normalWidth,
hidden = function()
return not (WeakAuras.IsRetail() and trigger.type == "aura2" and trigger.unit == "arena" and not trigger.useArenaSpec)
end,
},
useClass = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Class"],
order = 68.1,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party"))
end
},
class = {
type = "multiselect",
width = WeakAuras.normalWidth,
name = L["Class"],
values = WeakAuras.class_types,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.useClass) end,
order = 68.2
},
classSpace = {
type = "description",
name = "",
order = 68.3,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and not trigger.useClass) end
},
useUnitName = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Unit Name"],
order = 68.4,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party"))
end
},
unitName = {
type = "input",
width = WeakAuras.normalWidth,
name = L["Filter by Unit Name"],
desc = L["Filter formats: 'Name', 'Name-Realm', '-Realm'.\n\nSupports multiple entries, separated by commas\nCan use \\ to escape -."],
order = 68.5,
hidden = function()
return not (trigger.type == "aura2"
and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.useUnitName)
end
},
unitNameSpace = {
type = "description",
name = "",
order = 68.5,
width = WeakAuras.normalWidth,
hidden = function()
return not (trigger.type == "aura2"
and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and not trigger.useUnitName)
end
},
useHostility = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Hostility"],
order = 69.1,
hidden = function()
return not (trigger.type == "aura2"
and (trigger.unit == "group"
or trigger.unit == "raid"
or trigger.unit == "party"
or trigger.unit == "nameplate"))
end
},
hostility = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Hostility"],
values = OptionsPrivate.Private.hostility_types,
hidden = function()
return not (trigger.type == "aura2"
and trigger.useHostility
and (trigger.unit == "group"
or trigger.unit == "raid"
or trigger.unit == "party"
or trigger.unit == "nameplate"))
end,
order = 69.2
},
hostilitySpace = {
type = "description",
name = "",
order = 69.3,
width = WeakAuras.normalWidth,
hidden = function()
return not (trigger.type == "aura2"
and not trigger.useHostility
and (trigger.unit == "group"
or trigger.unit == "raid"
or trigger.unit == "party"
or trigger.unit == "nameplate"))
end
},
useNpcId = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Filter by Npc ID"],
order = 69.31,
hidden = function() return
not (trigger.type == "aura2" and (trigger.unit == "nameplate" or trigger.unit == "boss"))
end
},
npcId = {
type = "input",
width = WeakAuras.normalWidth,
name = L["Npc ID"],
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "nameplate" or trigger.unit == "boss") and trigger.useNpcId) end,
order = 69.32,
desc = L["Supports multiple entries, separated by commas"]
},
npcIdSpace = {
type = "description",
name = "",
order = 69.33,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "nameplate" or trigger.unit == "boss") and not trigger.useNpcId) end
},
ignoreSelf = {
type = "toggle",
name = L["Ignore Self"],
order = 69.35,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party" or trigger.unit == "nameplate")) end
},
ignoreDead = {
type = "toggle",
name = L["Ignore Dead"],
order = 69.4,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")) end
},
ignoreDisconnected = {
type = "toggle",
name = L["Ignore Disconnected"],
order = 69.8,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")) end
},
inRange = {
type = "toggle",
name = L["Ignore out of casting range"],
desc = L["Uses UnitInRange() to check if in range. Matches default raid frames out of range behavior, which is between 25 to 40 yards depending on your class and spec."],
order = 69.81,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and WeakAuras.IsRetail()) end
},
ignoreInvisible = {
type = "toggle",
name = L["Ignore out of checking range"],
desc = L["Uses UnitIsVisible() to check if game client has loaded a object for this unit. This distance is around 100 yards. This is polled every second."],
order = 69.9,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party")) end
},
show_settings_header = {
type = "header",
name = L["Show and Clone Settings"],
order = 69.91,
},
multi_unit_hint = {
type = "description",
order = 69.92,
width = WeakAuras.doubleWidth,
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger)) end,
name = L["|cff999999Triggers tracking multiple units will default to being active even while no affected units are found without a Unit Count or Match Count setting applied.|r"],
},
useGroup_count = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Unit Count"],
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger)) end,
order = 70
},
useGroup_countSpace = {
type = "description",
name = "",
order = 70.1,
width = WeakAuras.normalWidth,
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger) and not trigger.useGroup_count) end
},
group_countOperator = {
type = "select",
name = L["Operator"],
desc = function()
if (trigger.unit == "multi") then
return L["Compare against the number of units affected."]
else
local groupType = OptionsPrivate.Private.unit_types_bufftrigger_2[trigger.unit or "group"] or "|cFFFF0000Error|r"
return L["Group aura count description"]:format(groupType, groupType, groupType, groupType, groupType, groupType, groupType)
end
end,
order = 70.2,
width = WeakAuras.halfWidth,
values = OptionsPrivate.Private.operator_types,
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger) and trigger.useGroup_count) end,
get = function() return trigger.group_countOperator end
},
group_count = {
type = "input",
name = L["Count"],
desc = function()
if (trigger.unit == "multi") then
return L["Compare against the number of units affected."]
else
local groupType = OptionsPrivate.Private.unit_types_bufftrigger_2[trigger.unit or "group"] or "|cFFFF0000Error|r"
return L["Group aura count description"]:format(groupType, groupType, groupType, groupType, groupType, groupType, groupType)
end
end,
order = 70.3,
width = WeakAuras.halfWidth,
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger) and trigger.useGroup_count) end,
},
use_matchesShowOn = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Show On"],
order = 71,
hidden = function() return not (trigger.type == "aura2" and not IsGroupTrigger(trigger)) end,
get = function() return true end,
disabled = true
},
matchesShowOn = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Show On"],
values = OptionsPrivate.Private.bufftrigger_2_progress_behavior_types,
order = 71.1,
hidden = function() return not (trigger.type == "aura2" and not IsGroupTrigger(trigger)) end,
get = function()
return trigger.matchesShowOn or "showOnActive"
end
},
useMatch_count = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Match Count"],
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger)) end,
order = 71.2
},
useMatch_countSpace = {
type = "description",
name = "",
order = 71.3,
width = WeakAuras.normalWidth,
hidden = function()
if trigger.type ~= "aura2" then
return true
end
if IsGroupTrigger(trigger) then
return trigger.useMatch_count
else
return trigger.matchesShowOn ~= "showOnMatches"
end
end
},
match_countOperator = {
type = "select",
name = L["Operator"],
order = 71.4,
width = WeakAuras.halfWidth,
values = OptionsPrivate.Private.operator_types,
hidden = function() return not (trigger.type == "aura2" and HasMatchCount(trigger)) end,
desc = L["Counts the number of matches over all units."]
},
match_count = {
type = "input",
name = L["Count"],
order = 71.5,
width = WeakAuras.halfWidth,
hidden = function() return not (trigger.type == "aura2" and HasMatchCount(trigger)) end,
validate = ValidateNumeric,
desc = L["Counts the number of matches over all units."]
},
useMatchPerUnit_count = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Match Count per Unit"],
hidden = function() return not (trigger.type == "aura2" and IsGroupTrigger(trigger)
and trigger.showClones and trigger.combinePerUnit and trigger.perUnitMode ~= "unaffected") end,
order = 71.6
},
useMatchPerUnit_countSpace = {
type = "description",
name = "",
order = 71.7,
width = WeakAuras.normalWidth,
hidden = function()
if trigger.type == "aura2" and IsGroupTrigger(trigger)
and trigger.showClones and trigger.combinePerUnit and trigger.perUnitMode ~= "unaffected" then
return trigger.useMatchPerUnit_count
end
return true
end
},
matchPerUnit_countOperator = {
type = "select",
name = L["Operator"],
order = 71.8,
width = WeakAuras.halfWidth,
values = OptionsPrivate.Private.operator_types,
hidden = function() return not (HasMatchPerUnitCount(trigger)) end,
desc = L["Counts the number of matches per unit."]
},
matchPerUnit_count = {
type = "input",
name = L["Count"],
order = 71.9,
width = WeakAuras.halfWidth,
hidden = function() return not (HasMatchPerUnitCount(trigger)) end,
validate = ValidateNumeric,
desc = L["Counts the number of matches per unit."]
},
showClones = {
type = "toggle",
name = L["Auto-Clone (Show All Matches)"],
order = 72,
hidden = function() return not (trigger.type == "aura2" and not IsSingleMissing(trigger)) end,
width = WeakAuras.doubleWidth,
set = function(info, v)
trigger.showClones = v
WeakAuras.Add(data)
end
},
combinePerUnit = {
type = "toggle",
name = L["Combine Matches Per Unit"],
width = WeakAuras.doubleWidth,
order = 72.2,
hidden = function()
return not (trigger.type == "aura2" and IsGroupTrigger(trigger) and trigger.showClones)
end
},
use_perUnitMode = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Show Matches for Units"],
order = 72.3,
hidden = function()
return not (trigger.type == "aura2" and IsGroupTrigger(trigger) and trigger.showClones and trigger.unit ~= "multi" and trigger.combinePerUnit)
end,
get = function() return true end,
disabled = true
},
perUnitMode = {
type = "select",
name = L["Show Matches for"],
values = OptionsPrivate.Private.bufftrigger_2_per_unit_mode,
order = 72.4,
width = WeakAuras.normalWidth,
hidden = function()
return not (trigger.type == "aura2" and IsGroupTrigger(trigger) and trigger.showClones and trigger.unit ~= "multi" and trigger.combinePerUnit)
end,
get = function()
return trigger.perUnitMode or "affected"
end
},
use_combineMode = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Preferred Match"],
order = 72.5,
hidden = function()
if (trigger.type == "aura2") then
if (IsGroupTrigger(trigger)) then
if trigger.showClones then
return not (trigger.combinePerUnit and trigger.perUnitMode ~= "unaffected")
else
return false
end
else
return not (not IsSingleMissing(trigger) and not trigger.showClones)
end
end
return true
end,
get = function() return true end,
disabled = true
},
combineMode = {
type = "select",
name = L["Preferred Match"],
values = OptionsPrivate.Private.bufftrigger_2_preferred_match_types,
order = 72.6,
width = WeakAuras.normalWidth,
hidden = function()
if (trigger.type == "aura2") then
if (IsGroupTrigger(trigger)) then
if trigger.showClones then
return not (trigger.combinePerUnit and trigger.perUnitMode ~= "unaffected")
else
return false
end
else
return not (not IsSingleMissing(trigger) and not trigger.showClones)
end
end
return true
end,
get = function()
return trigger.combineMode or "showLowest"
end
},
unitExists = {
type = "toggle",
name = L["Show If Unit Does Not Exist"],
width = WeakAuras.doubleWidth,
order = 73,
hidden = function()
return not (trigger.type == "aura2" and trigger.unit ~= "player" and not IsGroupTrigger(trigger))
end,
},
}
-- Names
local nameOptionSize = CountNames(data, triggernum, "auranames") + 1
local spellOptionsSize = CountNames(data, triggernum, "auraspellids") + 1
local ignoreNameOptionSize = CountNames(data, triggernum, "ignoreAuraNames") + 1
local ignoreSpellOptionsSize = CountNames(data, triggernum, "ignoreAuraSpellids") + 1
CreateNameOptions(aura_options, data, trigger, nameOptionSize,
false, false, "name", 12, "useName", "auranames",
L["Aura Name"],
L["Enter an Aura Name, partial Aura Name, or Spell ID. A Spell ID will match any spells with the same name."],
IsSingleMissing(trigger))
CreateNameOptions(aura_options, data, trigger, spellOptionsSize,
true, false, "spellid", 22, "useExactSpellId", "auraspellids",
L["Spell ID"], L["Enter a Spell ID. You can use the addon idTip to determine spell ids."],
IsSingleMissing(trigger))
CreateNameOptions(aura_options, data, trigger, ignoreNameOptionSize,
false, true, "ignorename", 32, "useIgnoreName", "ignoreAuraNames",
L["Ignored Aura Name"],
L["Enter an Aura Name, partial Aura Name, or Spell ID. A Spell ID will match any spells with the same name."],
IsSingleMissing(trigger))
CreateNameOptions(aura_options, data, trigger, ignoreSpellOptionsSize,
true, true, "ignorespellid", 42, "useIgnoreExactSpellId", "ignoreAuraSpellids",
L["Ignored Spell ID"], L["Enter a Spell ID. You can use the addon idTip to determine spell ids."],
IsSingleMissing(trigger))
OptionsPrivate.commonOptions.AddCommonTriggerOptions(aura_options, data, triggernum, true)
OptionsPrivate.commonOptions.AddTriggerGetterSetter(aura_options, data, triggernum)
OptionsPrivate.AddTriggerMetaFunctions(aura_options, data, triggernum)
return {
["trigger." .. triggernum .. ".aura_options"] = aura_options
}
end
WeakAuras.RegisterTriggerSystemOptions({"aura2"}, GetBuffTriggerOptions)