Files
coa-weakauras/WeakAuras/Types.lua
T
NoM0Re 430871de21 revisit Faction Reputation
Discovered and integrated the previously undocumented GetFactionInfoByID API call, allowing removal of a workaround table that was no longer needed. Also verified faction localizations across common client faction.dbc files and cleaned up Cataclysm factions that were incorrectly included in the 3.3.5a version of the LibBabble library.
2025-06-14 01:16:34 +02:00

4051 lines
145 KiB
Lua

if not WeakAuras.IsLibsOK() then return end
local AddonName = ...
local Private = select(2, ...)
local WeakAuras = WeakAuras;
local L = WeakAuras.L;
local LSM = LibStub("LibSharedMedia-3.0");
local wipe, tinsert = wipe, tinsert
local GetNumShapeshiftForms, GetShapeshiftFormInfo = GetNumShapeshiftForms, GetShapeshiftFormInfo
local WrapTextInColorCode = WrapTextInColorCode
local MAX_NUM_TALENTS = MAX_NUM_TALENTS or 40
local function WA_GetClassColor(classFilename)
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[classFilename]
if color then
return color.colorStr
end
return "ffffffff"
end
Private.glow_action_types = {
show = L["Show"],
hide = L["Hide"]
}
Private.glow_frame_types = {
UNITFRAME = L["Unit Frame"],
FRAMESELECTOR = L["Frame Selector"],
PARENTFRAME = L["Parent Frame"]
}
if WeakAuras.IsAwesomeEnabled() then
Private.glow_frame_types.NAMEPLATE = L["Nameplate"]
end
Private.circular_group_constant_factor_types = {
ANGLE = L["Angle and Radius"],
RADIUS = L["Radius"],
SPACING = L["Spacing"]
}
Private.frame_strata_types = {
[1] = L["Inherited"],
[2] = "BACKGROUND",
[3] = "LOW",
[4] = "MEDIUM",
[5] = "HIGH",
[6] = "DIALOG",
[7] = "FULLSCREEN",
[8] = "FULLSCREEN_DIALOG",
[9] = "TOOLTIP"
}
Private.hostility_types = {
hostile = L["Hostile"],
friendly = L["Friendly"]
}
Private.character_types = {
player = L["Player Character"],
npc = L["Non-player Character"]
}
Private.spec_position_types = {
caster = L["Ranged"],
melee = L["Melee"]
}
Private.group_sort_types = {
ascending = L["Ascending"],
descending = L["Descending"],
hybrid = L["Hybrid"],
none = L["None"],
custom = L["Custom"]
}
Private.group_hybrid_position_types = {
hybridFirst = L["Marked First"],
hybridLast = L["Marked Last"]
}
Private.group_hybrid_sort_types = {
ascending = L["Ascending"],
descending = L["Descending"]
}
Private.time_format_types = {
[0] = L["WeakAuras Built-In (63:42 | 3:07 | 10 | 2.4)"],
[1] = L["Old Blizzard (2h | 3m | 10s | 2.4)"],
[2] = L["Modern Blizzard (1h 3m | 3m 7s | 10s | 2.4)"],
}
Private.time_precision_types = {
[1] = "12.3",
[2] = "12.34",
[3] = "12.345",
}
Private.precision_types = {
[0] = "12",
[1] = "12.3",
[2] = "12.34",
[3] = "12.345",
}
Private.big_number_types = {
["AbbreviateNumbers"] = L["AbbreviateNumbers (Blizzard)"],
["AbbreviateLargeNumbers"] = L["AbbreviateLargeNumbers (Blizzard)"],
["BreakUpLargeNumbers"] = L["BreakUpLargeNumbers (Blizzard)"],
}
Private.big_number_types_with_disable = CopyTable(Private.big_number_types)
Private.big_number_types_with_disable["disable"] = L["Disabled"]
Private.round_types = {
floor = L["Floor"],
ceil = L["Ceil"],
round = L["Round"]
}
Private.pad_types = {
left = L["Left"],
right = L["Right"]
}
Private.unit_color_types = {
none = L["None"],
class = L["Class"]
}
Private.unit_realm_name_types = {
never = L["Never"],
star = L["* Suffix"],
differentServer = L["Only if on a different realm"],
always = L["Always include realm"]
}
local timeFormatter = {}
WeakAuras.Mixin(timeFormatter, SecondsFormatterMixin)
timeFormatter:Init(0, SecondsFormatter.Abbreviation.OneLetter)
-- The default time formatter adds a space between the value and the unit
-- While there is a API to strip it, that API does not work on all locales, e.g. german
-- Thus, copy the interval descriptions, strip the whitespace from them
-- and hack the timeFormatter to use our interval descriptions
local timeFormatIntervalDescriptionFixed = {}
timeFormatIntervalDescriptionFixed = CopyTable(SecondsFormatter.IntervalDescription)
for i, interval in ipairs(timeFormatIntervalDescriptionFixed) do
interval.formatString = CopyTable(SecondsFormatter.IntervalDescription[i].formatString)
for j, formatString in ipairs(interval.formatString) do
interval.formatString[j] = formatString:gsub(" ", "")
end
end
timeFormatter.GetIntervalDescription = function(self, interval)
return timeFormatIntervalDescriptionFixed[interval]
end
timeFormatter.GetMaxInterval = function(self)
return #timeFormatIntervalDescriptionFixed
end
local AbbreviateNumbers = AbbreviateNumbers
local gameLocale = GetLocale()
if gameLocale == "koKR" or gameLocale == "zhCN" or gameLocale == "zhTW" then
-- Work around https://github.com/Stanzilla/WoWUIBugs/issues/515
--
local NUMBER_ABBREVIATION_DATA_FIXED={
[1]={
breakpoint = 10000 * 10000,
significandDivisor = 10000 * 10000,
abbreviation = L["SECOND_NUMBER_CAP_NO_SPACE"],
fractionDivisor = 1
},
[2]={
breakpoint = 1000 * 10000,
significandDivisor = 1000 * 10000,
abbreviation = L["SECOND_NUMBER_CAP_NO_SPACE"],
fractionDivisor = 10
},
[3]={
breakpoint = 10000,
significandDivisor = 1000,
abbreviation = L["FIRST_NUMBER_CAP_NO_SPACE"],
fractionDivisor = 10
}
}
AbbreviateNumbers = function(value)
for i, data in ipairs(NUMBER_ABBREVIATION_DATA_FIXED) do
if value >= data.breakpoint then
local finalValue = math.floor(value / data.significandDivisor) / data.fractionDivisor;
return finalValue .. data.abbreviation;
end
end
return tostring(value);
end
end
local simpleFormatters = {
AbbreviateNumbers = function(value)
if type(value) == "string" then value = tonumber(value) end
return (type(value) == "number") and AbbreviateNumbers(value) or value
end,
AbbreviateLargeNumbers = function(value)
if type(value) == "string" then value = tonumber(value) end
return (type(value) == "number") and AbbreviateLargeNumbers(Round(value)) or value
end,
BreakUpLargeNumbers = function(value)
if type(value) == "string" then value = tonumber(value) end
return (type(value) == "number") and BreakUpLargeNumbers(value) or value
end,
floor = function(value)
if type(value) == "string" then value = tonumber(value) end
return (type(value) == "number") and floor(value) or value
end,
ceil = function(value)
if type(value) == "string" then value = tonumber(value) end
return (type(value) == "number") and ceil(value) or value
end,
round = function(value)
if type(value) == "string" then value = tonumber(value) end
return (type(value) == "number") and Round(value) or value
end,
time = {
[0] = function(value)
if type(value) == "string" then value = tonumber(value) end
if type(value) == "number" then
if value > 60 then
return string.format("%i:", math.floor(value / 60)) .. string.format("%02i", value % 60)
else
return string.format("%d", value)
end
end
end,
-- Old Blizzard
[1] = function(value)
local fmt, time = SecondsToTimeAbbrev(value)
-- Remove the space between the value and unit
return fmt:gsub(" ", ""):format(time)
end,
-- Modern Blizzard
[2] = function(value)
return timeFormatter:Format(value)
end,
-- Fixed built-in formatter
[99] = function(value)
if type(value) == "string" then value = tonumber(value) end
if type(value) == "number" then
value = ceil(value)
if value > 60 then
return string.format("%i:", math.floor(value / 60)) .. string.format("%02i", value % 60)
else
return string.format("%d", value)
end
end
end,
},
}
Private.format_types = {
none = {
display = L["None"],
AddOptions = function() end,
CreateFormatter = function() return nil end
},
string = {
display = L["String"],
AddOptions = function(symbol, hidden, addOption, get)
addOption(symbol .. "_abbreviate", {
type = "toggle",
name = L["Abbreviate"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_abbreviate_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Max Char "],
width = WeakAuras.normalWidth,
min = 1,
softMax = 20,
hidden = hidden,
step = 1,
disabled = function()
return not get(symbol .. "_abbreviate")
end
})
addOption(symbol .. "_pad", {
type = "toggle",
name = L["Pad"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_pad_mode", {
type = "select",
name = L["Pad Mode"],
width = WeakAuras.halfWidth,
values = Private.pad_types,
hidden = hidden,
})
addOption(symbol .. "_pad_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Pad to"],
width = WeakAuras.halfWidth,
min = 1,
max = 20,
hidden = hidden,
step = 1,
})
end,
CreateFormatter = function(symbol, get)
local abbreviate = get(symbol .. "_abbreviate", false)
local abbreviateMax = get(symbol .. "_abbreviate_max", 8)
local pad = get(symbol .. "_pad", false)
local padMode = get(symbol .. "_pad_mode", "left")
local padLength = get(symbol .. "_pad_max", 8)
if abbreviate and pad then
return function(input)
return WeakAuras.PadString(WeakAuras.WA_Utf8Sub(input, abbreviateMax), padMode, padLength)
end
elseif pad then
return function(input)
return WeakAuras.PadString(input, padMode, padLength)
end
elseif abbreviate then
return function(input)
return WeakAuras.WA_Utf8Sub(input, abbreviateMax)
end
end
return nil
end
},
timed = {
display = L["Time Format"],
AddOptions = function(symbol, hidden, addOption, get)
addOption(symbol .. "_time_format", {
type = "select",
name = L["Format"],
width = WeakAuras.doubleWidth,
values = Private.time_format_types,
hidden = hidden
})
addOption(symbol .. "_time_dynamic_threshold", {
type = "range",
control = "WeakAurasSpinBox",
min = 0,
max = 60,
step = 1,
name = L["Increase Precision Below"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_time_precision", {
type = "select",
name = L["Precision"],
width = WeakAuras.normalWidth,
values = Private.time_precision_types,
hidden = hidden,
disabled = function() return get(symbol .. "_time_dynamic_threshold") == 0 end
})
addOption(symbol .. "_time_legacy_floor", {
type = "toggle",
name = L["Use Legacy floor rounding"],
desc = L["Enables (incorrect) round down of seconds, which was the previous default behavior."],
width = WeakAuras.normalWidth,
hidden = hidden,
disabled = function() return get(symbol .. "_time_format", 0) ~= 0 end
})
end,
CreateFormatter = function(symbol, get, wihoutColor, data)
local format = get(symbol .. "_time_format", 0)
local threshold = get(symbol .. "_time_dynamic_threshold", 60)
local precision = get(symbol .. "_time_precision", 1)
local legacyRoundingMode = get(symbol .. "_time_legacy_floor", false)
if format == 0 and not legacyRoundingMode then
format = 99
end
if not simpleFormatters.time[format] then
format = 99
end
local mainFormater = simpleFormatters.time[format]
local timePointProperty = {}
-- For the mod rate support, we need to know which state member is the modRate, as
-- different progressSources can have different modRates
-- Here, we only collect the names, so that the actual formatter can quickly lookup
-- the property
-- This is somewhat complicated by legacy behaviour (for %p, %t) and that %foo, can
-- be the foo of different triggers that might use different modRate properties
-- Similarly to distinguish between time formaters for durations and timepoints,
-- we maintain a lookup table for time points
-- Timepoint formatters need to run every frame, so we rturn true if we
-- are formatting a timepoint
local triggerNum, sym = string.match(symbol, "(.+)%.(.+)")
triggerNum = triggerNum and tonumber(triggerNum)
sym = sym or symbol
if triggerNum then
local progressSource = Private.GetProgressSourceFor(data, triggerNum, sym)
if progressSource then
if progressSource[2] == "timer" or progressSource[2] == "elapsedTimer" then
timePointProperty[triggerNum] = true
end
end
else
for i = 1, #data.triggers do
local progressSource = Private.GetProgressSourceFor(data, i, symbol)
if progressSource then
if progressSource[2] == "timer" or progressSource[2] == "elapsedTimer" then
timePointProperty[i] = true
end
end
end
end
local formatter
if threshold == 0 then
formatter = function(value, state, trigger)
if type(value) ~= 'number' or value == math.huge then
return ""
end
if timePointProperty[trigger] then
value = abs(GetTime() - value)
end
if value <= 0 then
return ""
end
return mainFormater(value)
end
else
local formatString = "%." .. precision .. "f"
formatter = function(value, state, trigger)
if type(value) ~= 'number' or value == math.huge then
return ""
end
if timePointProperty[trigger] then
value = abs(GetTime() - value)
end
if value <= 0 then
return ""
end
if value < threshold then
return string.format(formatString, value)
else
return mainFormater(value)
end
end
end
if sym == "p" or sym == "t" then
-- Special case %p and %t. Since due to how the formatting
-- work previously, the time formatter only formats %p and %t
-- if the progress type is timed!
return function(value, state, trigger)
if not state or state.progressType ~= "timed" then
return value
end
return formatter(value, state, trigger)
end, next(timePointProperty) ~= nil
else
return formatter, next(timePointProperty) ~= nil
end
end
},
Money = {
display = L["Money"],
AddOptions = function(symbol, hidden, addOption)
addOption(symbol .. "_money_format", {
type = "select",
name = L["Format Gold"],
width = WeakAuras.normalWidth,
values = Private.big_number_types_with_disable,
hidden = hidden
})
addOption(symbol .. "_money_precision", {
type = "select",
name = L["Coin Precision"],
width = WeakAuras.normalWidth,
values = Private.money_precision_types,
hidden = hidden
})
end,
CreateFormatter = function(symbol, get)
local format = get(symbol .. "_money_format", "AbbreviateNumbers")
local precision = get(symbol .. "_money_precision", 3)
return function(value)
if type(value) ~= "number" then
return ""
end
local gold = floor(value / 1e4)
local silver = floor(value / 100 % 100)
local copper = value % 100
if (format == "AbbreviateNumbers") then
gold = simpleFormatters.AbbreviateNumbers(gold)
elseif (format == "BreakUpLargeNumbers") then
gold = simpleFormatters.BreakUpLargeNumbers(gold)
elseif (format == "AbbreviateLargeNumbers") then
gold = simpleFormatters.AbbreviateLargeNumbers(gold)
end
local formatCode
if precision == 1 then
formatCode = "%s%s"
elseif precision == 2 then
formatCode = "%s%s %d%s"
else
formatCode = "%s%s %d%s %d%s"
end
return string.format(formatCode,
tostring(gold), Private.coin_icons.gold,
silver, Private.coin_icons.silver,
copper, Private.coin_icons.copper
)
end
end
},
BigNumber = {
display = L["Big Number"],
AddOptions = function(symbol, hidden, addOption, get)
addOption(symbol .. "_big_number_format", {
type = "select",
name = L["Format"],
width = WeakAuras.normalWidth,
values = Private.big_number_types,
hidden = hidden
})
addOption(symbol .. "_big_number_space", {
type = "description",
name = "",
width = WeakAuras.normalWidth,
hidden = hidden
})
addOption(symbol .. "_pad", {
type = "toggle",
name = L["Pad"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_pad_mode", {
type = "select",
name = L["Pad Mode"],
width = WeakAuras.halfWidth,
values = Private.pad_types,
hidden = hidden,
})
addOption(symbol .. "_pad_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Pad to"],
width = WeakAuras.halfWidth,
min = 1,
max = 20,
hidden = hidden,
step = 1,
})
end,
CreateFormatter = function(symbol, get)
local format = get(symbol .. "_big_number_format", "AbbreviateNumbers")
local pad = get(symbol .. "_pad", false)
local padMode = get(symbol .. "_pad_mode", "left")
local padLength = get(symbol .. "_pad_max", 8)
local formatterFunc
if (format == "AbbreviateNumbers") then
formatterFunc = simpleFormatters.AbbreviateNumbers
elseif (format == "BreakUpLargeNumbers") then
formatterFunc = simpleFormatters.BreakUpLargeNumbers
else
formatterFunc = simpleFormatters.AbbreviateLargeNumbers
end
if pad then
return function(input)
return WeakAuras.PadString(formatterFunc(input), padMode, padLength)
end
end
return formatterFunc
end
},
Number = {
display = L["Number"],
AddOptions = function(symbol, hidden, addOption, get)
addOption(symbol .. "_decimal_precision", {
type = "select",
name = L["Precision"],
width = WeakAuras.normalWidth,
values = Private.precision_types,
hidden = hidden
})
addOption(symbol .. "_round_type", {
type = "select",
name = L["Round Mode"],
width = WeakAuras.normalWidth,
values = Private.round_types,
hidden = hidden,
disabled = function()
return get(symbol .. "_decimal_precision") ~= 0
end
})
addOption(symbol .. "_pad", {
type = "toggle",
name = L["Pad"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_pad_mode", {
type = "select",
name = L["Pad Mode"],
width = WeakAuras.halfWidth,
values = Private.pad_types,
hidden = hidden,
})
addOption(symbol .. "_pad_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Pad to"],
width = WeakAuras.halfWidth,
min = 1,
max = 20,
hidden = hidden,
step = 1,
})
end,
CreateFormatter = function(symbol, get)
local precision = get(symbol .. "_decimal_precision", 1)
local pad = get(symbol .. "_pad", false)
local padMode = get(symbol .. "_pad_mode", "left")
local padLength = get(symbol .. "_pad_max", 8)
local formatterFunc
if precision == 0 then
local type = get(symbol .. "_round_type", "floor")
formatterFunc = simpleFormatters[type]
else
local format = "%." .. precision .. "f"
formatterFunc = function(value)
return (type(value) == "number") and string.format(format, value) or value
end
end
if pad then
return function(input)
return WeakAuras.PadString(formatterFunc(input), padMode, padLength)
end
end
return formatterFunc
end
},
Unit = {
display = L["Formats |cFFFFCC00%unit|r"],
AddOptions = function(symbol, hidden, addOption, get, withoutColor)
if not withoutColor then
addOption(symbol .. "_color", {
type = "select",
name = L["Color"],
width = WeakAuras.normalWidth,
values = Private.unit_color_types,
hidden = hidden,
})
end
addOption(symbol .. "_realm_name", {
type = "select",
name = L["Realm Name"],
width = WeakAuras.normalWidth,
values = Private.unit_realm_name_types,
hidden = hidden,
})
addOption(symbol .. "_abbreviate", {
type = "toggle",
name = L["Abbreviate"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_abbreviate_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Max Char"],
width = WeakAuras.normalWidth,
min = 1,
max = 20,
hidden = hidden,
step = 1,
disabled = function()
return not get(symbol .. "_abbreviate")
end
})
addOption(symbol .. "_pad", {
type = "toggle",
name = L["Pad"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_pad_mode", {
type = "select",
name = L["Pad Mode"],
width = WeakAuras.halfWidth,
values = Private.pad_types,
hidden = hidden,
})
addOption(symbol .. "_pad_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Pad to"],
width = WeakAuras.halfWidth,
min = 1,
max = 20,
hidden = hidden,
step = 1,
})
end,
CreateFormatter = function(symbol, get, withoutColor)
local color = not withoutColor and get(symbol .. "_color", true)
local realm = get(symbol .. "_realm_name", "never")
local abbreviate = get(symbol .. "_abbreviate", false)
local abbreviateMax = get(symbol .. "_abbreviate_max", 8)
local pad = get(symbol .. "_pad", false)
local padMode = get(symbol .. "_pad_mode", "left")
local padLength = get(symbol .. "_pad_max", 8)
local nameFunc
local colorFunc
local abbreviateFunc
if color == "class" then
colorFunc = function(unit, text)
if unit and UnitPlayerControlled(unit) then
local classFilename = select(2, UnitClass(unit))
if classFilename then
return WrapTextInColorCode(text, WA_GetClassColor(classFilename))
end
end
return text
end
end
if realm == "never" then
nameFunc = function(unit)
return unit and WeakAuras.UnitName(unit) or ""
end
elseif realm == "star" then
nameFunc = function(unit)
if not unit then
return ""
end
local name, realm = WeakAuras.UnitName(unit)
if realm then
return name .. "*"
end
return name or ""
end
elseif realm == "differentServer" then
nameFunc = function(unit)
if not unit then
return ""
end
local name, realm = WeakAuras.UnitName(unit)
if realm then
return name .. "-" .. realm
end
return name or ""
end
elseif realm == "always" then
nameFunc = function(unit)
if not unit then
return ""
end
local name, realm = WeakAuras.UnitNameWithRealmCustomName(unit)
return name .. "-" .. realm
end
end
if pad and abbreviate then
abbreviateFunc = function(input)
return WeakAuras.PadString(WeakAuras.WA_Utf8Sub(input, abbreviateMax), padMode, padLength)
end
elseif pad then
abbreviateFunc = function(input)
return WeakAuras.PadString(input, padMode, padLength)
end
elseif abbreviate then
abbreviateFunc = function(input)
return WeakAuras.WA_Utf8Sub(input, abbreviateMax)
end
end
-- Do the checks on what is necessary here instead of inside the returned
-- formatter
if colorFunc then
if abbreviateFunc then
return function(unit)
local name = abbreviateFunc(nameFunc(unit))
return colorFunc(unit, name)
end
else
return function(unit)
local name = nameFunc(unit)
return colorFunc(unit, name)
end
end
else
if abbreviateFunc then
return function(unit)
local name = nameFunc(unit)
return abbreviateFunc(name)
end
else
return nameFunc
end
end
end
},
guid = {
display = L["Formats Player's |cFFFFCC00%guid|r"],
AddOptions = function(symbol, hidden, addOption, get, withoutColor)
if not withoutColor then
addOption(symbol .. "_color", {
type = "select",
name = L["Color"],
width = WeakAuras.normalWidth,
values = Private.unit_color_types,
hidden = hidden,
})
end
addOption(symbol .. "_realm_name", {
type = "select",
name = L["Realm Name"],
width = WeakAuras.normalWidth,
values = Private.unit_realm_name_types,
hidden = hidden,
})
addOption(symbol .. "_abbreviate", {
type = "toggle",
name = L["Abbreviate"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_abbreviate_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Max Char "],
width = WeakAuras.normalWidth,
min = 1,
max = 20,
hidden = hidden,
disabled = function()
return not get(symbol .. "_abbreviate")
end
})
addOption(symbol .. "_pad", {
type = "toggle",
name = L["Pad"],
width = WeakAuras.normalWidth,
hidden = hidden,
})
addOption(symbol .. "_pad_mode", {
type = "select",
name = L["Pad Mode"],
width = WeakAuras.halfWidth,
values = Private.pad_types,
hidden = hidden,
})
addOption(symbol .. "_pad_max", {
type = "range",
control = "WeakAurasSpinBox",
name = L["Pad to"],
width = WeakAuras.halfWidth,
min = 1,
max = 20,
hidden = hidden,
step = 1,
})
end,
CreateFormatter = function(symbol, get, withoutColor)
local color = not withoutColor and get(symbol .. "_color", true)
local realm = get(symbol .. "_realm_name", "never")
local abbreviate = get(symbol .. "_abbreviate", false)
local abbreviateMax = get(symbol .. "_abbreviate_max", 8)
local pad = get(symbol .. "_pad", false)
local padMode = get(symbol .. "_pad_mode", "left")
local padLength = get(symbol .. "_pad_max", 8)
local nameFunc
local colorFunc
local abbreviateFunc
if color == "class" then
colorFunc = function(class, text)
if class then
return WrapTextInColorCode(text, WA_GetClassColor(class))
else
return text
end
end
end
if realm == "never" then
nameFunc = function(name, realm)
return WeakAuras.GetName(name)
end
elseif realm == "star" then
nameFunc = function(name, realm)
name = WeakAuras.GetName(name)
if realm ~= "" then
return name .. "*"
end
return name
end
elseif realm == "differentServer" then
nameFunc = function(name, realm)
name = WeakAuras.GetName(name)
if realm ~= "" then
return name .. "-" .. realm
end
return name
end
elseif realm == "always" then
nameFunc = function(name, realm)
name = WeakAuras.GetName(name)
if realm == "" then
realm = select(2, WeakAuras.UnitNameWithRealm("player"))
end
return name .. "-" .. realm
end
end
if pad and abbreviate then
abbreviateFunc = function(input)
return WeakAuras.PadString(WeakAuras.WA_Utf8Sub(input, abbreviateMax), padMode, padLength)
end
elseif pad then
abbreviateFunc = function(input)
return WeakAuras.PadString(input, padMode, padLength)
end
elseif abbreviate then
abbreviateFunc = function(input)
return WeakAuras.WA_Utf8Sub(input, abbreviateMax)
end
end
-- Do the checks on what is necessary here instead of inside the returned
-- formatter
if colorFunc then
if abbreviateFunc then
return function(guid)
local ok, _, class, _, _, _, name, realm = pcall(GetPlayerInfoByGUID, guid)
if ok and name then
local name = abbreviateFunc(nameFunc(name, realm))
return colorFunc(class, name)
end
end
else
return function(guid)
local ok, _, class, _, _, _, name, realm = pcall(GetPlayerInfoByGUID, guid)
if ok and name then
return colorFunc(class, nameFunc(name, realm))
end
end
end
else
if abbreviateFunc then
return function(guid)
local ok, _, class, _, _, _, name, realm = pcall(GetPlayerInfoByGUID, guid)
if ok and name then
return abbreviateFunc(nameFunc(name, realm))
end
end
else
return function(guid)
local ok, _, class, _, _, _, name, realm = pcall(GetPlayerInfoByGUID, guid)
if ok and name then
return nameFunc(name, realm)
end
end
end
end
end
},
GCDTime = {
display = L["Time in GCDs"],
AddOptions = function(symbol, hidden, addOption, get)
addOption(symbol .. "_gcd_gcd", {
type = "toggle",
name = L["Subtract GCD"],
width = WeakAuras.normalWidth,
hidden = hidden
})
addOption(symbol .. "_gcd_cast", {
type = "toggle",
name = L["Subtract Cast"],
width = WeakAuras.normalWidth,
hidden = hidden
})
addOption(symbol .. "_gcd_channel", {
type = "toggle",
name = L["Subtract Channel"],
width = WeakAuras.normalWidth,
hidden = hidden
})
addOption(symbol .. "_gcd_hide_zero", {
type = "toggle",
name = L["Hide 0 cooldowns"],
width = WeakAuras.normalWidth,
hidden = hidden
})
addOption(symbol .. "_decimal_precision", {
type = "select",
name = L["Precision"],
width = WeakAuras.normalWidth,
values = Private.precision_types,
hidden = hidden
})
addOption(symbol .. "_round_type", {
type = "select",
name = L["Round Mode"],
width = WeakAuras.normalWidth,
values = Private.round_types,
hidden = hidden,
disabled = function()
return get(symbol .. "_decimal_precision") ~= 0
end
})
end,
CreateFormatter = function(symbol, get)
local gcd = get(symbol .. "_gcd_gcd", true)
local cast = get(symbol .. "_gcd_cast", false)
local channel = get(symbol .. "_gcd_channel", false)
local hideZero = get(symbol .. "_gcd_hide_zero", false)
local precision = get(symbol .. "_decimal_precision", 1)
local numberToStringFunc
if precision ~= 0 then
local format = "%." .. precision .. "f"
numberToStringFunc = function(number)
return string.format(format, number)
end
else
local type = get(symbol .. "_round_type", "ceil")
numberToStringFunc = simpleFormatters[type]
end
return function(value, state)
if state.progressType ~= "timed" or type(value) ~= "number" then
return value
end
WeakAuras.WatchGCD()
local result = value
local now = GetTime()
if gcd then
local gcdDuration, gcdExpirationTime = WeakAuras.GetGCDInfo()
if gcdDuration ~= 0 then
result = now + value - gcdExpirationTime
end
end
if cast then
local _, _, _, _, endTime = UnitCastingInfo("player")
local castExpirationTIme = endTime and endTime > 0 and (endTime / 1000) or 0
if castExpirationTIme > 0 then
result = min(result, now + value - castExpirationTIme)
end
end
if channel then
local _, _, _, _, endTime = UnitChannelInfo("player")
local castExpirationTIme = endTime and endTime > 0 and (endTime / 1000) or 0
if castExpirationTIme > 0 then
result = min(result, now + value - castExpirationTIme)
end
end
if result <= 0 then
return hideZero and "" or "0"
end
return numberToStringFunc(result / WeakAuras.CalculatedGcdDuration())
end
end
}
}
Private.format_types_display = {}
for k, v in pairs(Private.format_types) do Private.format_types_display[k] = v.display end
Private.sound_channel_types = {
Master = L["Master"],
SFX = ENABLE_SOUNDFX,
Ambience = ENABLE_AMBIENCE,
Music = ENABLE_MUSIC,
Dialog = ENABLE_DIALOG
}
Private.sound_condition_types = {
Play = L["Play"],
Loop = L["Loop"],
Stop = L["Stop"]
}
Private.trigger_require_types = {
any = L["Any Triggers"],
all = L["All Triggers"],
custom = L["Custom Function"]
}
Private.trigger_require_types_one = {
any = L["Trigger 1"],
custom = L["Custom Function"]
}
Private.trigger_modes = {
["first_active"] = -10,
}
Private.debuff_types = {
HELPFUL = L["Buff"],
HARMFUL = L["Debuff"],
BOTH = L["Buff/Debuff"]
}
Private.tooltip_count = {
[1] = L["First"],
[2] = L["Second"],
[3] = L["Third"]
}
Private.aura_types = {
BUFF = L["Buff"],
DEBUFF = L["Debuff"],
}
Private.debuff_class_types = {
magic = L["Magic"],
curse = L["Curse"],
disease = L["Disease"],
poison = L["Poison"],
enrage = L["Enrage"],
none = L["None"]
}
Private.player_target_events = {
PLAYER_TARGET_CHANGED = "target",
PLAYER_FOCUS_CHANGED = "focus",
}
local target_unit_types = {
target = L["Target"],
focus = L["Focus"],
}
Private.unit_types = WeakAuras.Mixin({
player = L["Player"],
group = L["Group"],
member = L["Specific Unit"],
pet = L["Pet"],
multi = L["Multi-target"]
}, target_unit_types)
Private.unit_types_bufftrigger_2 = WeakAuras.Mixin({
player = L["Player"],
group = L["Smart Group"],
raid = L["Raid"],
party = L["Party"],
boss = L["Boss"],
arena = L["Arena"],
pet = L["Pet"],
member = L["Specific Unit"],
multi = L["Multi-target"]
}, target_unit_types)
if WeakAuras.IsAwesomeEnabled() then
Private.unit_types_bufftrigger_2.nameplate = L["Nameplate"]
end
Private.actual_unit_types = WeakAuras.Mixin({
player = L["Player"],
pet = L["Pet"],
}, target_unit_types)
Private.actual_unit_types_with_specific = WeakAuras.Mixin({
player = L["Player"],
pet = L["Pet"],
member = L["Specific Unit"]
}, target_unit_types)
Private.actual_unit_types_cast = WeakAuras.Mixin({
player = L["Player"],
group = L["Smart Group"],
party = L["Party"],
raid = L["Raid"],
boss = L["Boss"],
arena = L["Arena"],
pet = L["Pet"],
member = L["Specific Unit"],
}, target_unit_types)
if WeakAuras.IsAwesomeEnabled() then
Private.actual_unit_types_cast.nameplate = L["Nameplate"]
end
Private.actual_unit_types_cast_tooltip = 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\n|cffffff00*|r Yellow Unit settings will create clones for each matching unit while this trigger is providing Dynamic Info to the Aura."]
Private.threat_unit_types = WeakAuras.Mixin({
boss = L["Boss"],
member = L["Specific Unit"],
none = L["At Least One Enemy"]
}, target_unit_types)
if WeakAuras.IsAwesomeEnabled() then
Private.threat_unit_types.nameplate = L["Nameplate"]
end
Private.unit_types_range_check = WeakAuras.Mixin({
pet = L["Pet"],
member = L["Specific Unit"]
}, target_unit_types)
Private.unit_threat_situation_types = {
[-1] = L["Not On Threat Table"],
[0] = "|cFFB0B0B0"..L["Lower Than Tank"].."|r",
[1] = "|cFFFFFF77"..L["Higher Than Tank"].."|r",
[2] = "|cFFFF9900"..L["Tanking But Not Highest"].."|r",
[3] = "|cFFFF0000"..L["Tanking And Highest"].."|r"
}
WeakAuras.class_types = {}
for i, class in ipairs(CLASS_SORT_ORDER) do
WeakAuras.class_types[class] = WrapTextInColorCode(LOCALIZED_CLASS_NAMES_MALE[class], WA_GetClassColor(class))
end
if WeakAuras.IsClassicPlusOrTBC() then
WeakAuras.class_types["DEATHKNIGHT"] = nil
end
-- missing localisation
WeakAuras.race_types = {
Human = "Human",
Orc = "Orc",
Dwarf = "Dwarf",
NightElf = "Night Elf",
Scourge = "Undead",
Tauren = "Tauren",
Gnome = "Gnome",
Troll = "Troll",
BloodElf = "Blood Elf",
Draenei = "Draenei",
}
Private.faction_group = {
Alliance = L["Alliance"],
Horde = L["Horde"],
Neutral = L["Neutral"]
}
Private.form_types = {};
local function update_forms()
local oldForms = Private.form_types
Private.form_types = {}
Private.form_types[0] = "0 - " .. L["Humanoid"]
for i = 1, GetNumShapeshiftForms() do
local _, name = GetShapeshiftFormInfo(i);
if(name) then
Private.form_types[i] = i.." - "..name
end
end
if Private.OptionsFrame and not tCompare(oldForms, Private.form_types) then
Private.OptionsFrame():ReloadOptions()
end
end
local form_frame = CreateFrame("Frame");
form_frame:RegisterEvent("UPDATE_SHAPESHIFT_FORMS")
form_frame:RegisterEvent("PLAYER_LOGIN")
form_frame:SetScript("OnEvent", update_forms);
Private.blend_types = {
ADD = L["Glow"],
BLEND = L["Opaque"]
}
Private.slant_mode = {
INSIDE = L["Keep Inside"],
EXTEND = L["Extend Outside"]
}
Private.text_check_types = {
update = L["Every Frame"],
event = L["Trigger Update"]
}
Private.check_types = {
update = L["Every Frame (High CPU usage)"],
event = L["Event(s)"]
}
Private.point_types = {
BOTTOMLEFT = L["Bottom Left"],
BOTTOM = L["Bottom"],
BOTTOMRIGHT = L["Bottom Right"],
RIGHT = L["Right"],
TOPRIGHT = L["Top Right"],
TOP = L["Top"],
TOPLEFT = L["Top Left"],
LEFT = L["Left"],
CENTER = L["Center"]
}
Private.default_types_for_anchor = {}
for k, v in pairs(Private.point_types) do
Private.default_types_for_anchor[k] = {
display = v,
type = "point"
}
end
Private.default_types_for_anchor["ALL"] = {
display = L["Full Region"],
type = "area"
}
Private.anchor_mode = {
area = L["Fill Area"],
point = L["Attach to Point"]
}
Private.inverse_point_types = {
BOTTOMLEFT = "TOPRIGHT",
BOTTOM = "TOP",
BOTTOMRIGHT = "TOPLEFT",
RIGHT = "LEFT",
TOPRIGHT = "BOTTOMLEFT",
TOP = "BOTTOM",
TOPLEFT = "BOTTOMRIGHT",
LEFT = "RIGHT",
CENTER = "CENTER"
}
Private.anchor_frame_types = {
SCREEN = L["Screen/Parent Group"],
UIPARENT = L["Screen"],
MOUSE = L["Mouse Cursor"],
SELECTFRAME = L["Select Frame"],
UNITFRAME = L["Unit Frames"],
CUSTOM = L["Custom"]
}
if WeakAuras.IsAwesomeEnabled() then
Private.anchor_frame_types.NAMEPLATE = L["Nameplates"]
end
Private.anchor_frame_types_group = {
SCREEN = L["Screen/Parent Group"],
UIPARENT = L["Screen"],
MOUSE = L["Mouse Cursor"],
SELECTFRAME = L["Select Frame"],
CUSTOM = L["Custom"]
}
Private.spark_rotation_types = {
AUTO = L["Automatic Rotation"],
MANUAL = L["Manual Rotation"]
}
Private.spark_hide_types = {
NEVER = L["Never"],
FULL = L["Full"],
EMPTY = L["Empty"],
BOTH = L["Full/Empty"]
}
Private.tick_placement_modes = {
AtValue = L["At Value"],
AtMissingValue = L["At missing Value"],
AtPercent = L["At Percent"],
ValueOffset = L["Offset from progress"]
}
Private.font_flags = {
None = L["None"],
MONOCHROME = L["Monochrome"],
OUTLINE = L["Outline"],
THICKOUTLINE = L["Thick Outline"],
["MONOCHROME|OUTLINE"] = L["Monochrome Outline"],
["MONOCHROME|THICKOUTLINE"] = L["Monochrome Thick Outline"]
}
Private.text_automatic_width = {
Auto = L["Automatic"],
Fixed = L["Fixed"]
}
Private.text_word_wrap = {
WordWrap = L["Wrap"],
Elide = L["Elide"]
}
Private.include_pets_types = {
PlayersAndPets = L["Players and Pets"],
PetsOnly = L["Pets only"]
}
Private.subevent_prefix_types = {
SWING = L["Swing"],
RANGE = L["Range"],
SPELL = L["Spell"],
SPELL_PERIODIC = L["Periodic Spell"],
SPELL_BUILDING = L["Spell (Building)"],
ENVIRONMENTAL = L["Environmental"],
DAMAGE_SHIELD = L["Damage Shield"],
DAMAGE_SPLIT = L["Damage Split"],
DAMAGE_SHIELD_MISSED = L["Damage Shield Missed"],
PARTY_KILL = L["Party Kill"],
UNIT_DIED = L["Unit Died"],
UNIT_DESTROYED = L["Unit Destroyed"],
UNIT_DISSIPATES = L["Unit Dissipates"],
ENCHANT_APPLIED = L["Enchant Applied"],
ENCHANT_REMOVED = L["Enchant Removed"]
}
Private.subevent_actual_prefix_types = {
SWING = L["Swing"],
RANGE = L["Range"],
SPELL = L["Spell"],
SPELL_PERIODIC = L["Periodic Spell"],
SPELL_BUILDING = L["Spell (Building)"],
ENVIRONMENTAL = L["Environmental"]
}
Private.subevent_suffix_types = {
_DAMAGE = L["Damage"],
_MISSED = L["Missed"],
_HEAL = L["Heal"],
_ENERGIZE = L["Energize"],
_DRAIN = L["Drain"],
_LEECH = L["Leech"],
_INTERRUPT = L["Interrupt"],
_DISPEL = L["Dispel"],
_DISPEL_FAILED = L["Dispel Failed"],
_STOLEN = L["Stolen"],
_EXTRA_ATTACKS = L["Extra Attacks"],
_AURA_APPLIED = L["Aura Applied"],
_AURA_REMOVED = L["Aura Removed"],
_AURA_APPLIED_DOSE = L["Aura Applied Dose"],
_AURA_REMOVED_DOSE = L["Aura Removed Dose"],
_AURA_REFRESH = L["Aura Refresh"],
_AURA_BROKEN = L["Aura Broken"],
_AURA_BROKEN_SPELL = L["Aura Broken Spell"],
_CAST_START = L["Cast Start"],
_CAST_SUCCESS = L["Cast Success"],
_CAST_FAILED = L["Cast Failed"],
_INSTAKILL = L["Instakill"],
_DURABILITY_DAMAGE = L["Durability Damage"],
_DURABILITY_DAMAGE_ALL = L["Durability Damage All"],
_CREATE = L["Create"],
_SUMMON = L["Summon"],
_RESURRECT = L["Resurrect"]
}
Private.power_types = {
[0] = MANA,
[1] = RAGE,
[2] = FOCUS,
[3] = ENERGY,
[6] = RUNIC_POWER,
[27] = HAPPINESS,
}
Private.power_types_player = {
[0] = MANA,
[1] = RAGE,
[2] = FOCUS,
[3] = ENERGY,
[4] = COMBAT_TEXT_SHOW_COMBO_POINTS_TEXT,
[6] = RUNIC_POWER,
[27] = HAPPINESS,
}
Private.miss_types = {
ABSORB = L["Absorb"],
BLOCK = L["Block"],
DEFLECT = L["Deflect"],
DODGE = L["Dodge"],
EVADE = L["Evade"],
IMMUNE = L["Immune"],
MISS = L["Miss"],
PARRY = L["Parry"],
REFLECT = L["Reflect"],
RESIST = L["Resist"]
}
Private.environmental_types = {
Drowning = STRING_ENVIRONMENTAL_DAMAGE_DROWNING,
Falling = STRING_ENVIRONMENTAL_DAMAGE_FALLING,
Fatigue = STRING_ENVIRONMENTAL_DAMAGE_FATIGUE,
Fire = STRING_ENVIRONMENTAL_DAMAGE_FIRE,
Lava = STRING_ENVIRONMENTAL_DAMAGE_LAVA,
Slime = STRING_ENVIRONMENTAL_DAMAGE_SLIME
}
Private.combatlog_flags_check_type = {
Mine = L["Mine"],
InGroup = L["In Group"],
InParty = L["In Party"],
NotInGroup = L["Not in Smart Group"]
}
Private.combatlog_flags_check_reaction = {
Hostile = L["Hostile"],
Neutral = L["Neutral"],
Friendly = L["Friendly"]
}
Private.combatlog_flags_check_object_type = {
Object = L["Object"],
Guardian = L["Guardian"],
Pet = L["Pet"],
NPC = L["NPC"],
Player = L["Player"]
}
Private.combatlog_spell_school_types = {
[1] = STRING_SCHOOL_PHYSICAL,
[2] = STRING_SCHOOL_HOLY,
[4] = STRING_SCHOOL_FIRE,
[8] = STRING_SCHOOL_NATURE,
[16] = STRING_SCHOOL_FROST,
[32] = STRING_SCHOOL_SHADOW,
[64] = STRING_SCHOOL_ARCANE,
[3] = STRING_SCHOOL_HOLYSTRIKE,
[5] = STRING_SCHOOL_FLAMESTRIKE,
[6] = STRING_SCHOOL_HOLYFIRE,
[9] = STRING_SCHOOL_STORMSTRIKE,
[10] = STRING_SCHOOL_HOLYSTORM,
[12] = STRING_SCHOOL_FIRESTORM,
[17] = STRING_SCHOOL_FROSTSTRIKE,
[18] = STRING_SCHOOL_HOLYFROST,
[20] = STRING_SCHOOL_FROSTFIRE,
[24] = STRING_SCHOOL_FROSTSTORM,
[33] = STRING_SCHOOL_SHADOWSTRIKE,
[34] = STRING_SCHOOL_SHADOWLIGHT,
[36] = STRING_SCHOOL_SHADOWFLAME,
[40] = STRING_SCHOOL_SHADOWSTORM,
[48] = STRING_SCHOOL_SHADOWFROST,
[65] = STRING_SCHOOL_SPELLSTRIKE,
[66] = STRING_SCHOOL_DIVINE,
[68] = STRING_SCHOOL_SPELLFIRE,
[72] = STRING_SCHOOL_SPELLSTORM,
[80] = STRING_SCHOOL_SPELLFROST,
[96] = STRING_SCHOOL_SPELLSHADOW,
[28] = STRING_SCHOOL_ELEMENTAL,
[62] = STRING_SCHOOL_CHROMATIC,
[106] = STRING_SCHOOL_COSMIC,
[124] = STRING_SCHOOL_CHAOS,
[126] = STRING_SCHOOL_MAGIC,
[127] = STRING_SCHOOL_CHAOS,
}
Private.combatlog_spell_school_types_for_ui = {}
for id, str in pairs(Private.combatlog_spell_school_types) do
Private.combatlog_spell_school_types_for_ui[id] = ("%.3d - %s"):format(id, str)
end
Private.coin_icons = {
["gold"] = "|Tinterface/moneyframe/ui-goldicon:0|t",
["silver"] = "|Tinterface/moneyframe/ui-silvericon:0|t",
["copper"] = "|Tinterface/moneyframe/ui-coppericon:0|t"
}
Private.money_precision_types = {
[1] = "123 " .. Private.coin_icons.gold,
[2] = "123 " .. Private.coin_icons.gold .. " 45 " .. Private.coin_icons.silver,
[3] = "123 " .. Private.coin_icons.gold .. " 45 " .. Private.coin_icons.silver .. " 67 " .. Private.coin_icons.copper
}
Private.item_quality_types = {
[0] = ITEM_QUALITY0_DESC,
[1] = ITEM_QUALITY1_DESC,
[2] = ITEM_QUALITY2_DESC,
[3] = ITEM_QUALITY3_DESC,
[4] = ITEM_QUALITY4_DESC,
[5] = ITEM_QUALITY5_DESC,
[6] = ITEM_QUALITY6_DESC,
[7] = ITEM_QUALITY7_DESC,
[8] = ITEM_QUALITY8_DESC,
}
Private.totalcount_currencies = {
[45624] = 3018, -- Emblems of Conquest
[40753] = 1465, -- Emblems of Valor
[29434] = 1462, -- Badges of Justice
[40752] = 1464, -- Emblems of Heroism
[47241] = 4729, -- Emblems of Triumph
[49426] = 4730, -- Emblems of Frost
}
function Private.ExecEnv.GetTotalCountCurrencies(currencyID)
local achievementID = Private.totalcount_currencies[currencyID]
if achievementID then
local totalEarned = GetStatistic(achievementID)
return tonumber(totalEarned) or 0
end
return 0
end
local function InitializeCurrencies()
if Private.discovered_currencies and next(Private.discovered_currencies) then
return
end
Private.discovered_currencies = {}
Private.discovered_currencies_sorted = {}
Private.discovered_currencies_headers = {}
local expanded = {}
for index = GetCurrencyListSize(), 1, -1 do
local name, isHeader, isExpanded = GetCurrencyListInfo(index)
if isHeader and not isExpanded then
ExpandCurrencyList(index, true)
expanded[name] = true
end
end
for index = 1, GetCurrencyListSize() do
local name, isHeader, _, _, _, _, currencyType, iconFileID, itemID = GetCurrencyListInfo(index)
local icon
if currencyType == 1 then -- Arena points
icon = "Interface\\PVPFrame\\PVP-ArenaPoints-Icon"
elseif currencyType == 2 then -- Honor points
icon = "Interface\\BattlefieldFrame\\Battleground-".. UnitFactionGroup("player")
end
if itemID and iconFileID then
icon = icon or iconFileID or "Interface\\Icons\\INV_Misc_QuestionMark" -- iconFileID not available on first login
Private.discovered_currencies[itemID] = "|T" .. icon .. ":0|t" .. name
Private.discovered_currencies_sorted[itemID] = index
elseif isHeader then
Private.discovered_currencies[name] = name
Private.discovered_currencies_sorted[name] = index
Private.discovered_currencies_headers[name] = true
end
end
for index = GetCurrencyListSize(), 1, -1 do
local name, isHeader = GetCurrencyListInfo(index)
if isHeader and expanded[name] then
ExpandCurrencyList(index, false)
end
end
Private.discovered_currencies["member"] = "|Tinterface\\common\\ui-searchbox-icon:0:0:0:-2|t"..L["Specific Currency"];
Private.discovered_currencies_sorted["member"] = -1;
end
Private.ExecEnv.GetDiscoveredCurrencies = function()
InitializeCurrencies()
return Private.discovered_currencies
end
Private.GetDiscoveredCurrenciesSorted = function()
InitializeCurrencies()
return Private.discovered_currencies_sorted
end
Private.GetDiscoveredCurrenciesHeaders = function()
InitializeCurrencies()
return Private.discovered_currencies_headers
end
Private.ExecEnv.GetFactionDataByIndex = function(index)
local name, description, standingID, barMin, barMax, barValue, atWarWith, canToggleAtWar, isHeader, isCollapsed, hasRep, isWatched, isChild = GetFactionInfo(index)
return {
factionID = name and Private.faction_to_id[name] or 0,
name = name,
description = description,
reaction = standingID,
currentReactionThreshold = barMin,
nextReactionThreshold = barMax,
currentStanding = barValue,
atWarWith = atWarWith or false,
canToggleAtWar = canToggleAtWar,
isChild = isChild,
isHeader = isHeader,
isHeaderWithRep = hasRep,
isCollapsed = isCollapsed,
isWatched = isWatched,
}
end
Private.ExecEnv.GetFactionDataByID = function(ID)
local name, description, standingID, barMin, barMax, barValue, atWarWith, canToggleAtWar, isHeader, isCollapsed, hasRep, isWatched, isChild = GetFactionInfoByID(ID or 0)
if name then
return {
factionID = ID,
name = name,
description = description,
reaction = standingID,
currentReactionThreshold = barMin,
nextReactionThreshold = barMax,
currentStanding = barValue,
atWarWith = atWarWith or false,
canToggleAtWar = canToggleAtWar,
isChild = isChild,
isHeader = isHeader,
isHeaderWithRep = hasRep,
isCollapsed = isCollapsed,
isWatched = isWatched,
}
end
end
Private.ExecEnv.GetWatchedFactionId = function()
local factionName = GetWatchedFactionInfo()
return factionName and Private.faction_to_id[factionName]
end
local function InitializeReputations()
if Private.reputations and next(Private.reputations) then
return
end
Private.reputations = {}
Private.reputations_sorted = {}
Private.reputations_headers = {}
-- Dynamic expansion of all collapsed headers
local collapsed = {}
local index = 1
while index <= GetNumFactions() do
local factionData = Private.ExecEnv.GetFactionDataByIndex(index)
if factionData and factionData.isHeader and factionData.isCollapsed then
ExpandFactionHeader(index)
collapsed[factionData.name] = true
end
index = index + 1
end
-- Process all faction data
for i = 1, GetNumFactions() do
local factionData = Private.ExecEnv.GetFactionDataByIndex(i)
if factionData then
if factionData.currentStanding > 0 or not factionData.isHeader then
local factionID = factionData.factionID
if factionID then
Private.reputations[factionID] = factionData.name
Private.reputations_sorted[factionID] = i
end
else
local name = factionData.name
if name then
Private.reputations[name] = name
Private.reputations_sorted[name] = i
Private.reputations_headers[name] = true
end
end
end
end
-- Collapse headers back to their original state
for i = GetNumFactions(), 1, -1 do
local factionData = Private.ExecEnv.GetFactionDataByIndex(i)
if factionData and collapsed[factionData.name] then
CollapseFactionHeader(i)
end
end
end
Private.GetReputations = function()
InitializeReputations()
return Private.reputations
end
Private.GetReputationsSorted = function()
InitializeReputations()
return Private.reputations_sorted
end
Private.GetReputationsHeaders = function()
InitializeReputations()
return Private.reputations_headers
end
Private.combatlog_raid_mark_check_type = {
[0] = RAID_TARGET_NONE,
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_1:14|t " .. RAID_TARGET_1, -- Star
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_2:14|t " .. RAID_TARGET_2, -- Circle
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_3:14|t " .. RAID_TARGET_3, -- Diamond
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_4:14|t " .. RAID_TARGET_4, -- Triangle
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_5:14|t " .. RAID_TARGET_5, -- Moon
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_6:14|t " .. RAID_TARGET_6, -- Square
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_7:14|t " .. RAID_TARGET_7, -- Cross
"|TInterface\\TARGETINGFRAME\\UI-RaidTargetingIcon_8:14|t " .. RAID_TARGET_8, -- Skull
L["Any"]
}
Private.combatlog_raidFlags = {
[0] = 0,
[1] = 1,
[2] = 2,
[4] = 3,
[8] = 4,
[16] = 5,
[32] = 6,
[64] = 7,
[128] = 8,
}
Private.raid_mark_check_type = CopyTable(Private.combatlog_raid_mark_check_type)
Private.raid_mark_check_type[9] = nil
Private.orientation_types = {
HORIZONTAL_INVERSE = L["Left to Right"],
HORIZONTAL = L["Right to Left"],
VERTICAL = L["Bottom to Top"],
VERTICAL_INVERSE = L["Top to Bottom"]
}
Private.orientation_with_circle_types = {
HORIZONTAL_INVERSE = L["Left to Right"],
HORIZONTAL = L["Right to Left"],
VERTICAL = L["Bottom to Top"],
VERTICAL_INVERSE = L["Top to Bottom"],
CLOCKWISE = L["Clockwise"],
ANTICLOCKWISE = L["Anticlockwise"]
}
Private.gradient_orientations = {
HORIZONTAL = L["Horizontal"],
VERTICAL = L["Vertical"]
}
Private.totem_types = {
[1] = L["Fire"],
[2] = L["Earth"],
[3] = L["Water"],
[4] = L["Air"]
}
Private.texture_types = {
["Blizzard Alerts"] = {
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\arcane_missiles"] = "Arcane Missiles",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\arcane_missiles_1"] = "Arcane Missiles 1",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\arcane_missiles_2"] = "Arcane Missiles 2",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\arcane_missiles_3"] = "Arcane Missiles 3",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\art_of_war"] = "Art of War",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\backlash"] = "Backlash",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\backlash_green"] = "Backlash_Green",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\bandits_guile"] = "Bandits Guile",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\berserk"] = "Berserk",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\blood_boil"] = "Blood Boil",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\blood_surge"] = "Blood Surge",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\brain_freeze"] = "Brain Freeze",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\dark_tiger"] = "Dark Tiger",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\dark_transformation"] = "Dark Transformation",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\daybreak"] = "Daybreak",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\demonic_core"] = "Demonic Core",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\demonic_core_vertical"] = "Demonic Core Vertical",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\denounce"] = "Denounce",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\echo_of_the_elements"] = "Echo of the Elements",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\eclipse_moon"] = "Eclipse Moon",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\eclipse_sun"] = "Eclipse Sun",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\feral_omenofclarity"] = "Feral Omenofclarity",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\focus_fire"] = "Focus Fire",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\frozen_fingers"] = "Frozen Fingers",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\fulmination"] = "Fulmination",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\fury_of_stormrage"] = "Fury of Stormrage",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\genericarc_01"] = "Generic Arc 1",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\genericarc_02"] = "Generic Arc 2",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\genericarc_03"] = "Generic Arc 3",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\genericarc_04"] = "Generic Arc 4",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\genericarc_05"] = "Generic Arc 5",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\genericarc_06"] = "Generic Arc 6",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\generictop_01"] = "Generic Top 1",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\generictop_02"] = "Generic Top 2",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\grand_crusader"] = "Grand Crusader",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\hand_of_light"] = "Hand of Light",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\high_tide"] = "High Tide",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\hot_streak"] = "Hot Streak",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\imp_empowerment_green"] = "Imp Empowerment Green",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\imp_empowerment"] = "Imp Empowerment",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\impact"] = "Impact",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\killing_machine"] = "Killing Machine",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\lock_and_load"] = "Lock and Load",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\maelstrom_weapon_1"] = "Maelstrom Weapon 1",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\maelstrom_weapon_2"] = "Maelstrom Weapon 2",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\maelstrom_weapon_3"] = "Maelstrom Weapon 3",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\maelstrom_weapon_4"] = "Maelstrom Weapon 4",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\maelstrom_weapon"] = "Maelstrom Weapon",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\master_marksman"] = "Master Marksman",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\molten_core_green"] = "Molten Core Green",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\molten_core"] = "Molten Core",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_blackoutkick"] = "Monk Blackout Kick",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_ox_2"] = "Monk Ox 2",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_ox_3"] = "Monk Ox 3",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_ox"] = "Monk Ox",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_serpent"] = "Monk Serpent",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_tigerpalm"] = "Monk Tiger Palm",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\monk_tiger"] = "Monk Tiger",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\natures_grace"] = "Nature's Grace",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\necropolis"] = "Necropolis",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\nightfall"] = "Nightfall",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\predatory_swiftness_green"] = "Predatory Swiftness Green",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\predatory_swiftness"] = "Predatory Swiftness",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\raging_blow"] = "Raging Blow",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\rime"] = "Rime",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\serendipity"] = "Serendipity",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\shadow_word_insanity"] = "Shadow Word Insanity",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\shadow_of_death"] = "Shadow of Death",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\shooting_stars"] = "Shooting Stars",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\slice_and_dice"] = "Slice and Dice",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\spellactivationoverlay_0"] = "Spell Activation Overlay 0",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\sudden_death"] = "Sudden Death",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\sudden_doom"] = "Sudden Doom",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\surge_of_darkness"] = "Surge of Darkness",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\surge_of_light"] = "Surge of Light",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\sword_and_board"] = "Sword and Board",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\thrill_of_the_hunt_1"] = "Thrill of the Hunt 1",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\thrill_of_the_hunt_2"] = "Thrill of the Hunt 2",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\thrill_of_the_hunt_3"] = "Thrill of the Hunt 3",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\tooth_and_claw"] = "Tooth and Claw",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\ultimatum"] = "Ultimatum",
["Interface\\AddOns\\WeakAuras\\Media\\SpellActivationOverlays\\white_tiger"] = "White Tiger",
},
["Icons"] = {
["Spells\\Agility_128"] = "Paw",
["Spells\\ArrowFeather01"] = "Feathers",
["Spells\\Aspect_Beast"] = "Lion",
["Spells\\Aspect_Cheetah"] = "Cheetah",
["Spells\\Aspect_Hawk"] = "Hawk",
["Spells\\Aspect_Monkey"] = "Monkey",
["Spells\\Aspect_Snake"] = "Snake",
["Spells\\Aspect_Wolf"] = "Wolf",
["Spells\\EndlessRage"] = "Rage",
["Spells\\Eye"] = "Eye",
["Spells\\Eyes"] = "Eyes",
["Spells\\Fire_Rune_128"] = "Fire",
["Spells\\HolyRuinProtect"] = "Holy Ruin",
["Spells\\Intellect_128"] = "Intellect",
["Spells\\MoonCrescentGlow2"] = "Crescent",
["Spells\\Nature_Rune_128"] = "Leaf",
["Spells\\PROTECT_128"] = "Shield",
["Spells\\Ice_Rune_128"] = "Snowflake",
["Spells\\PoisonSkull1"] = "Poison Skull",
["Spells\\InnerFire_Rune_128"] = "Inner Fire",
["Spells\\RapidFire_Rune_128"] = "Rapid Fire",
["Spells\\Rampage"] = "Rampage",
["Spells\\Reticle_128"] = "Reticle",
["Spells\\Stamina_128"] = "Bull",
["Spells\\Strength_128"] = "Crossed Swords",
["Spells\\StunWhirl_reverse"] = "Stun Whirl",
["Spells\\T_Star3"] = "Star",
["Spells\\Spirit1"] = "Spirit",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\cancel-icon.tga"] = "Cancel Icon",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\cancel-mark.tga"] = "Cancel Mark",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\emoji.tga"] = "Emoji",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\exclamation-mark.tga"] = "Exclamation Mark",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\eyes.tga"] = "Eyes",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\ok-icon.tga"] = "Ok Icon",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\targeting-mark.tga"] = "Targeting Mark",
},
["Runes"] = {
["Spells\\starrune"] = "Star Rune",
["Spells\\RUNEBC1"] = "Heavy BC Rune",
["Spells\\RuneBC2"] = "Light BC Rune",
["Spells\\RUNEFROST"] = "Circular Frost Rune",
["Spells\\Rune1d_White"] = "Dense Circular Rune",
["Spells\\RUNE1D_GLOWLESS"] = "Sparse Circular Rune",
["Spells\\Rune1d"] = "Ringed Circular Rune",
["Spells\\Rune1c"] = "Filled Circular Rune",
["Spells\\RogueRune1"] = "Dual Blades",
["Spells\\RogueRune2"] = "Octagonal Skulls",
["Spells\\HOLY_RUNE1"] = "Holy Rune",
["Spells\\Holy_Rune_128"] = "Holy Cross Rune",
["Spells\\DemonRune5backup"] = "Demon Rune",
["Spells\\DemonRune6"] = "Demon Rune",
["Spells\\DemonRune7"] = "Demon Rune",
["Spells\\DemonicRuneSummon01"] = "Demonic Summon",
["Spells\\Death_Rune"] = "Death Rune",
["Spells\\DarkSummon"] = "Dark Summon",
["Spells\\AuraRune256b"] = "Square Aura Rune",
["Spells\\AURARUNE256"] = "Ringed Aura Rune",
["Spells\\AURARUNE8"] = "Spike-Ringed Aura Rune",
["Spells\\AuraRune7"] = "Tri-Circle Ringed Aura Rune",
["Spells\\AuraRune5Green"] = "Tri-Circle Aura Rune",
["Spells\\AURARUNE_C"] = "Oblong Aura Rune",
["Spells\\AURARUNE_B"] = "Sliced Aura Rune",
["Spells\\AURARUNE_A"] = "Small Tri-Circle Aura Rune"
},
["PvP Emblems"] = {
["Interface\\PVPFrame\\PVP-Banner-Emblem-1"] = "Wheelchair",
["Interface\\PVPFrame\\PVP-Banner-Emblem-2"] = "Recycle",
["Interface\\PVPFrame\\PVP-Banner-Emblem-3"] = "Biohazard",
["Interface\\PVPFrame\\PVP-Banner-Emblem-4"] = "Heart",
["Interface\\PVPFrame\\PVP-Banner-Emblem-5"] = "Lightning Bolt",
["Interface\\PVPFrame\\PVP-Banner-Emblem-6"] = "Bone",
["Interface\\PVPFrame\\PVP-Banner-Emblem-7"] = "Glove",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-2"] = "Bull",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-3"] = "Bird Claw",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-4"] = "Canary",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-5"] = "Mushroom",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-6"] = "Cherries",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-7"] = "Ninja",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-8"] = "Dog Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-9"] = "Circled Drop",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-10"] = "Circled Glove",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-11"] = "Winged Blade",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-12"] = "Circled Cross",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-13"] = "Dynamite",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-14"] = "Intellect",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-15"] = "Feather",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-16"] = "Present",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-17"] = "Giant Jaws",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-18"] = "Drums",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-19"] = "Panda",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-20"] = "Crossed Clubs",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-21"] = "Skeleton Key",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-22"] = "Heart Potion",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-23"] = "Trophy",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-24"] = "Crossed Mallets",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-25"] = "Circled Cheetah",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-26"] = "Mutated Chicken",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-27"] = "Anvil",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-28"] = "Dwarf Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-29"] = "Brooch",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-30"] = "Spider",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-31"] = "Dual Hawks",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-32"] = "Cleaver",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-33"] = "Spiked Bull",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-34"] = "Fist of Thunder",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-35"] = "Lean Bull",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-36"] = "Mug",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-37"] = "Sliced Circle",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-38"] = "Totem",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-39"] = "Skull and Crossbones",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-40"] = "Voodoo Doll",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-41"] = "Dual Wolves",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-42"] = "Wolf",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-43"] = "Crossed Wrenches",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-44"] = "Saber-toothed Tiger",
--["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-45"] = "Targeting Eye", -- Duplicate of 53
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-46"] = "Artifact Disc",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-47"] = "Dice",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-48"] = "Fish Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-49"] = "Crossed Axes",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-50"] = "Doughnut",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-51"] = "Human Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-52"] = "Eyeball",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-53"] = "Targeting Eye",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-54"] = "Monkey Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-55"] = "Circle Skull",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-56"] = "Tipped Glass",
--["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-57"] = "Saber-toothed Tiger", -- Duplicate of 44
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-58"] = "Pile of Weapons",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-59"] = "Mushrooms",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-60"] = "Pounding Mallet",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-61"] = "Winged Mask",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-62"] = "Axe",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-63"] = "Spiked Shield",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-64"] = "The Horns",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-65"] = "Ice Cream Cone",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-66"] = "Ornate Lockbox",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-67"] = "Roasting Marshmallow",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-68"] = "Smiley Bomb",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-69"] = "Fist",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-70"] = "Spirit Wings",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-71"] = "Ornate Pipe",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-72"] = "Scarab",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-73"] = "Glowing Ball",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-74"] = "Circular Rune",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-75"] = "Tree",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-76"] = "Flower Pot",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-77"] = "Night Elf Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-78"] = "Nested Egg",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-79"] = "Helmed Chicken",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-80"] = "Winged Boot",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-81"] = "Skull and Cross-Wrenches",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-82"] = "Cracked Skull",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-83"] = "Rocket",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-84"] = "Wooden Whistle",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-85"] = "Cogwheel",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-86"] = "Lizard Eye",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-87"] = "Baited Hook",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-88"] = "Beast Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-89"] = "Talons",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-90"] = "Rabbit",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-91"] = "4-Toed Pawprint",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-92"] = "Paw",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-93"] = "Mask",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-94"] = "Spiked Helm",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-95"] = "Dog Treat",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-96"] = "Targeted Orc",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-97"] = "Bird Face",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-98"] = "Lollipop",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-99"] = "5-Toed Pawprint",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-100"] = "Frightened Cat",
["Interface\\PVPFrame\\Icons\\PVP-Banner-Emblem-101"] = "Eagle Face"
},
["Beams"] = {
["Textures\\SPELLCHAINEFFECTS\\Beam_Purple"] = "Purple Beam",
["Textures\\SPELLCHAINEFFECTS\\Beam_Red"] = "Red Beam",
["Textures\\SPELLCHAINEFFECTS\\Beam_RedDrops"] = "Red Drops Beam",
["Textures\\SPELLCHAINEFFECTS\\DrainManaLightning"] = "Drain Mana Lightning",
["Textures\\SPELLCHAINEFFECTS\\Ethereal_Ribbon_Spell"] = "Ethereal Ribbon",
["Textures\\SPELLCHAINEFFECTS\\Ghost1_Chain"] = "Ghost Chain",
["Textures\\SPELLCHAINEFFECTS\\Ghost2purple_Chain"] = "Purple Ghost Chain",
["Textures\\SPELLCHAINEFFECTS\\HealBeam"] = "Heal Beam",
["Textures\\SPELLCHAINEFFECTS\\Lightning"] = "Lightning",
["Textures\\SPELLCHAINEFFECTS\\LightningRed"] = "Red Lightning",
["Textures\\SPELLCHAINEFFECTS\\ManaBeam"] = "Mana Beam",
["Textures\\SPELLCHAINEFFECTS\\ManaBurnBeam"] = "Mana Burn Beam",
["Textures\\SPELLCHAINEFFECTS\\RopeBeam"] = "Rope",
["Textures\\SPELLCHAINEFFECTS\\ShockLightning"] = "Shock Lightning",
["Textures\\SPELLCHAINEFFECTS\\SoulBeam"] = "Soul Beam",
["Spells\\TEXTURES\\Beam_ChainGold"] = "Gold Chain",
["Spells\\TEXTURES\\Beam_ChainIron"] = "Iron Chain",
["Spells\\TEXTURES\\Beam_FireGreen"] = "Green Fire Beam",
["Spells\\TEXTURES\\Beam_FireRed"] = "Red Fire Beam",
["Spells\\TEXTURES\\Beam_Purple_02"] = "Straight Purple Beam",
["Spells\\TEXTURES\\Beam_Shadow_01"] = "Shadow Beam",
["Spells\\TEXTURES\\Beam_SmokeBrown"] = "Brown Smoke Beam",
["Spells\\TEXTURES\\Beam_SmokeGrey"] = "Grey Smoke Beam",
["Spells\\TEXTURES\\Beam_SpiritLink"] = "Spirit Link Beam",
["Spells\\TEXTURES\\Beam_SummonGargoyle"] = "Summon Gargoyle Beam",
["Spells\\TEXTURES\\Beam_VineGreen"] = "Green Vine",
["Spells\\TEXTURES\\Beam_VineRed"] = "Red Vine",
["Spells\\TEXTURES\\Beam_WaterBlue"] = "Blue Water Beam",
["Spells\\TEXTURES\\Beam_WaterGreen"] = "Green Water Beam",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\rainbowbar"] = "Rainbow Bar",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\StripedTexture"] = "Striped Bar",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\stripe-bar.tga"] = "Striped Bar 2",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\stripe-rainbow-bar.tga"] = "Rainbow Bar 2",
},
["Shapes"] = {
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_Smooth"] = "Smooth Circle",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_Smooth_Border"] = "Smooth Circle with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_Squirrel"] = "Spiralled Circle",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_Squirrel_Border"] = "Spiralled Circle with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_White"] = "Circle",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_White_Border"] = "Circle with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_Smooth"] = "Smooth Square",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_Smooth_Border"] = "Smooth Square with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_Smooth_Border2"] = "Smooth Square with Border 2",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_Squirrel"] = "Spiralled Square",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_Squirrel_Border"] = "Spiralled Square with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_White"] = "Square",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_White_Border"] = "Square with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_FullWhite"] = "Full White Square",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Triangle45"] = "45° Triangle",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Trapezoid"] = "Trapezoid",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\triangle-border.tga"] = "Triangle with Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\triangle.tga"] = "Triangle",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_Smooth2.tga"] = "Smooth Circle Small",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\circle_border5.tga"] = "Circle Border",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\ring_glow3.tga"] = "Circle Border Glow",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\square_mini.tga"] = "Small Square",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\target_indicator.tga"] = "Target Indicator",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\target_indicator_glow.tga"] = "Target Indicator Glow",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\arrows_target.tga"] = "Arrows Target",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_AlphaGradient_In.tga"] = "Circle Alpha Gradient In",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Circle_AlphaGradient_Out.tga"] = "Circle Alpha Gradient Out",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Ring_10px.tga"] = "Ring 10px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Ring_20px.tga"] = "Ring 20px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Ring_30px.tga"] = "Ring 30px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Ring_40px.tga"] = "Ring 40px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\Square_AlphaGradient.tga"] = "Square Alpha Gradient",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\square_border_1px.tga"] = "Square Border 1px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\square_border_5px.tga"] = "Square Border 5px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\square_border_10px.tga"] = "Square Border 10px",
},
["Sparks"] = {
["Interface\\CastingBar\\UI-CastingBar-Spark"] = "Blizzard Spark",
["Interface\\GLUES\\LoadingBar\\UI-LoadingBar-Spark"] = "Loading Bar Spark",
["Creature\\GOBLIN\\SPARK"] = "Goblin Spark",
},
[BINDING_HEADER_RAID_TARGET] = {
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_1"] = RAID_TARGET_1,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_2"] = RAID_TARGET_2,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_3"] = RAID_TARGET_3,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_4"] = RAID_TARGET_4,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_5"] = RAID_TARGET_5,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_6"] = RAID_TARGET_6,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_7"] = RAID_TARGET_7,
["Interface\\TargetingFrame\\UI-RaidTargetingIcon_8"] = RAID_TARGET_8,
},
["WeakAuras"] = {
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\logo_64.tga"] = "WeakAuras logo 64px",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\logo_256.tga"] = "WeakAuras logo 256px"
}
}
local PowerAurasPath = "Interface\\Addons\\WeakAuras\\PowerAurasMedia\\Auras\\"
Private.texture_types["PowerAuras Heads-Up"] = {
[PowerAurasPath.."Aura1"] = "Runed Text",
[PowerAurasPath.."Aura2"] = "Runed Text On Ring",
[PowerAurasPath.."Aura3"] = "Power Waves",
[PowerAurasPath.."Aura4"] = "Majesty",
[PowerAurasPath.."Aura5"] = "Runed Ends",
[PowerAurasPath.."Aura6"] = "Extra Majesty",
[PowerAurasPath.."Aura7"] = "Triangular Highlights",
[PowerAurasPath.."Aura11"] = "Oblong Highlights",
[PowerAurasPath.."Aura16"] = "Thin Crescents",
[PowerAurasPath.."Aura17"] = "Crescent Highlights",
[PowerAurasPath.."Aura18"] = "Dense Runed Text",
[PowerAurasPath.."Aura23"] = "Runed Spiked Ring",
[PowerAurasPath.."Aura24"] = "Smoke",
[PowerAurasPath.."Aura28"] = "Flourished Text",
[PowerAurasPath.."Aura33"] = "Droplet Highlights"
}
Private.texture_types["PowerAuras Icons"] = {
[PowerAurasPath.."Aura8"] = "Rune",
[PowerAurasPath.."Aura9"] = "Stylized Ghost",
[PowerAurasPath.."Aura10"] = "Skull and Crossbones",
[PowerAurasPath.."Aura12"] = "Snowflake",
[PowerAurasPath.."Aura13"] = "Flame",
[PowerAurasPath.."Aura14"] = "Holy Rune",
[PowerAurasPath.."Aura15"] = "Zig-Zag Exclamation Point",
[PowerAurasPath.."Aura19"] = "Crossed Swords",
[PowerAurasPath.."Aura21"] = "Shield",
[PowerAurasPath.."Aura22"] = "Glow",
[PowerAurasPath.."Aura25"] = "Cross",
[PowerAurasPath.."Aura26"] = "Droplet",
[PowerAurasPath.."Aura27"] = "Alert",
[PowerAurasPath.."Aura29"] = "Paw",
[PowerAurasPath.."Aura30"] = "Bull",
-- [PowerAurasPath.."Aura31"] = "Hieroglyphics Horizontal",
[PowerAurasPath.."Aura32"] = "Hieroglyphics",
[PowerAurasPath.."Aura34"] = "Circled Arrow",
[PowerAurasPath.."Aura35"] = "Short Sword",
-- [PowerAurasPath.."Aura36"] = "Short Sword Horizontal",
[PowerAurasPath.."Aura45"] = "Circular Glow",
[PowerAurasPath.."Aura48"] = "Totem",
[PowerAurasPath.."Aura49"] = "Dragon Blade",
[PowerAurasPath.."Aura50"] = "Ornate Design",
[PowerAurasPath.."Aura51"] = "Inverted Holy Rune",
[PowerAurasPath.."Aura52"] = "Stylized Skull",
[PowerAurasPath.."Aura53"] = "Exclamation Point",
[PowerAurasPath.."Aura54"] = "Nonagon",
[PowerAurasPath.."Aura68"] = "Wings",
[PowerAurasPath.."Aura69"] = "Rectangle",
[PowerAurasPath.."Aura70"] = "Low Mana",
[PowerAurasPath.."Aura71"] = "Ghostly Eye",
[PowerAurasPath.."Aura72"] = "Circle",
[PowerAurasPath.."Aura73"] = "Ring",
[PowerAurasPath.."Aura74"] = "Square",
[PowerAurasPath.."Aura75"] = "Square Brackets",
[PowerAurasPath.."Aura76"] = "Bob-omb",
[PowerAurasPath.."Aura77"] = "Goldfish",
[PowerAurasPath.."Aura78"] = "Check",
[PowerAurasPath.."Aura79"] = "Ghostly Face",
[PowerAurasPath.."Aura84"] = "Overlapping Boxes",
-- [PowerAurasPath.."Aura85"] = "Overlapping Boxes 45°",
-- [PowerAurasPath.."Aura86"] = "Overlapping Boxes 270°",
[PowerAurasPath.."Aura87"] = "Fairy",
[PowerAurasPath.."Aura88"] = "Comet",
[PowerAurasPath.."Aura95"] = "Dual Spiral",
[PowerAurasPath.."Aura96"] = "Japanese Character",
[PowerAurasPath.."Aura97"] = "Japanese Character",
[PowerAurasPath.."Aura98"] = "Japanese Character",
[PowerAurasPath.."Aura99"] = "Japanese Character",
[PowerAurasPath.."Aura100"] = "Japanese Character",
[PowerAurasPath.."Aura101"] = "Ball of Flame",
[PowerAurasPath.."Aura102"] = "Zig-Zag",
[PowerAurasPath.."Aura103"] = "Thorny Ring",
[PowerAurasPath.."Aura110"] = "Hunter's Mark",
-- [PowerAurasPath.."Aura111"] = "Hunter's Mark Horizontal",
[PowerAurasPath.."Aura112"] = "Kaleidoscope",
[PowerAurasPath.."Aura113"] = "Jesus Face",
[PowerAurasPath.."Aura114"] = "Green Mushroom",
[PowerAurasPath.."Aura115"] = "Red Mushroom",
[PowerAurasPath.."Aura116"] = "Fire Flower",
[PowerAurasPath.."Aura117"] = "Radioactive",
[PowerAurasPath.."Aura118"] = "X",
[PowerAurasPath.."Aura119"] = "Flower",
[PowerAurasPath.."Aura120"] = "Petal",
[PowerAurasPath.."Aura130"] = "Shoop Da Woop",
[PowerAurasPath.."Aura131"] = "8-Bit Symbol",
[PowerAurasPath.."Aura132"] = "Cartoon Skull",
[PowerAurasPath.."Aura138"] = "Stop",
[PowerAurasPath.."Aura139"] = "Thumbs Up",
[PowerAurasPath.."Aura140"] = "Palette",
[PowerAurasPath.."Aura141"] = "Blue Ring",
[PowerAurasPath.."Aura142"] = "Ornate Ring",
[PowerAurasPath.."Aura143"] = "Ghostly Skull"
}
Private.texture_types["PowerAuras Separated"] = {
[PowerAurasPath.."Aura46"] = "8-Part Ring 1",
[PowerAurasPath.."Aura47"] = "8-Part Ring 2",
[PowerAurasPath.."Aura55"] = "Skull on Gear 1",
[PowerAurasPath.."Aura56"] = "Skull on Gear 2",
[PowerAurasPath.."Aura57"] = "Skull on Gear 3",
[PowerAurasPath.."Aura58"] = "Skull on Gear 4",
[PowerAurasPath.."Aura59"] = "Rune Ring Full",
[PowerAurasPath.."Aura60"] = "Rune Ring Empty",
[PowerAurasPath.."Aura61"] = "Rune Ring Left",
[PowerAurasPath.."Aura62"] = "Rune Ring Right",
[PowerAurasPath.."Aura63"] = "Spiked Rune Ring Full",
[PowerAurasPath.."Aura64"] = "Spiked Rune Ring Empty",
[PowerAurasPath.."Aura65"] = "Spiked Rune Ring Left",
[PowerAurasPath.."Aura66"] = "Spiked Rune Ring Bottom",
[PowerAurasPath.."Aura67"] = "Spiked Rune Ring Right",
[PowerAurasPath.."Aura80"] = "Spiked Helm Background",
[PowerAurasPath.."Aura81"] = "Spiked Helm Full",
[PowerAurasPath.."Aura82"] = "Spiked Helm Bottom",
[PowerAurasPath.."Aura83"] = "Spiked Helm Top",
[PowerAurasPath.."Aura89"] = "5-Part Ring 1",
[PowerAurasPath.."Aura90"] = "5-Part Ring 2",
[PowerAurasPath.."Aura91"] = "5-Part Ring 3",
[PowerAurasPath.."Aura92"] = "5-Part Ring 4",
[PowerAurasPath.."Aura93"] = "5-Part Ring 5",
[PowerAurasPath.."Aura94"] = "5-Part Ring Full",
[PowerAurasPath.."Aura104"] = "Shield Center",
[PowerAurasPath.."Aura105"] = "Shield Full",
[PowerAurasPath.."Aura106"] = "Shield Top Right",
[PowerAurasPath.."Aura107"] = "Shield Top Left",
[PowerAurasPath.."Aura108"] = "Shield Bottom Right",
[PowerAurasPath.."Aura109"] = "Shield Bottom Left",
[PowerAurasPath.."Aura121"] = "Vine Top Right Leaf",
[PowerAurasPath.."Aura122"] = "Vine Left Leaf",
[PowerAurasPath.."Aura123"] = "Vine Bottom Right Leaf",
[PowerAurasPath.."Aura124"] = "Vine Stem",
[PowerAurasPath.."Aura125"] = "Vine Thorns",
[PowerAurasPath.."Aura126"] = "3-Part Circle 1",
[PowerAurasPath.."Aura127"] = "3-Part Circle 2",
[PowerAurasPath.."Aura128"] = "3-Part Circle 3",
[PowerAurasPath.."Aura129"] = "3-Part Circle Full",
[PowerAurasPath.."Aura133"] = "Sliced Orb 1",
[PowerAurasPath.."Aura134"] = "Sliced Orb 2",
[PowerAurasPath.."Aura135"] = "Sliced Orb 3",
[PowerAurasPath.."Aura136"] = "Sliced Orb 4",
[PowerAurasPath.."Aura137"] = "Sliced Orb 5",
[PowerAurasPath.."Aura144"] = "Taijitu Bottom",
[PowerAurasPath.."Aura145"] = "Taijitu Top"
}
Private.texture_types["PowerAuras Words"] = {
[PowerAurasPath.."Aura20"] = "Power",
[PowerAurasPath.."Aura37"] = "Slow",
[PowerAurasPath.."Aura38"] = "Stun",
[PowerAurasPath.."Aura39"] = "Silence",
[PowerAurasPath.."Aura40"] = "Root",
[PowerAurasPath.."Aura41"] = "Disorient",
[PowerAurasPath.."Aura42"] = "Dispel",
[PowerAurasPath.."Aura43"] = "Danger",
[PowerAurasPath.."Aura44"] = "Buff",
[PowerAurasPath.."Aura44"] = "Buff",
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\interrupt"] = "Interrupt"
}
Private.operator_types = {
["=="] = "=",
["~="] = "!=",
[">"] = ">",
["<"] = "<",
[">="] = ">=",
["<="] = "<="
}
Private.equality_operator_types = {
["=="] = "=",
["~="] = "!="
}
Private.operator_types_without_equal = {
[">="] = ">=",
["<="] = "<="
}
Private.string_operator_types = {
["=="] = L["Is Exactly"],
["find('%s')"] = L["Contains"],
["match('%s')"] = L["Matches (Pattern)"]
}
Private.weapon_types = {
["main"] = MAINHANDSLOT,
["off"] = SECONDARYHANDSLOT,
["ranged"] = RANGEDSLOT,
}
Private.swing_types = {
["main"] = MAINHANDSLOT,
["off"] = SECONDARYHANDSLOT,
["ranged"] = RANGEDSLOT
}
Private.rune_specific_types = {
[1] = L["Blood Rune #1"],
[2] = L["Blood Rune #2"],
[3] = L["Unholy Rune #1"],
[4] = L["Unholy Rune #2"],
[5] = L["Frost Rune #1"],
[6] = L["Frost Rune #2"],
}
Private.custom_trigger_types = {
["event"] = L["Event"],
["status"] = L["Status"],
["stateupdate"] = L["Trigger State Updater (Advanced)"]
}
Private.eventend_types = {
["timed"] = L["Timed"],
["custom"] = L["Custom"]
}
Private.timedeventend_types = {
["timed"] = L["Timed"],
}
Private.justify_types = {
["LEFT"] = L["Left"],
["CENTER"] = L["Center"],
["RIGHT"] = L["Right"]
}
Private.grow_types = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"],
["UP"] = L["Up"],
["DOWN"] = L["Down"],
["HORIZONTAL"] = L["Centered Horizontal"],
["VERTICAL"] = L["Centered Vertical"],
["CIRCLE"] = L["Counter Clockwise"],
["COUNTERCIRCLE"] = L["Clockwise"],
["GRID"] = L["Grid"],
["CUSTOM"] = L["Custom"],
}
-- horizontal types: R (right), L (left)
-- vertical types: U (up), D (down)
Private.grid_types = {
RU = L["Right, then Up"],
UR = L["Up, then Right"],
LU = L["Left, then Up"],
UL = L["Up, then Left"],
RD = L["Right, then Down"],
DR = L["Down, then Right"],
LD = L["Left, then Down"],
DL = L["Down, then Left"],
HD = L["Centered Horizontal, then Down"],
HU = L["Centered Horizontal, then Up"],
VR = L["Centered Vertical, then Right"],
VL = L["Centered Vertical, then Left"],
DH = L["Down, then Centered Horizontal"],
UH = L["Up, then Centered Horizontal"],
LV = L["Left, then Centered Vertical"],
RV = L["Right, then Centered Vertical"],
HV = L["Centered Horizontal, then Centered Vertical"],
VH = L["Centered Vertical, then Centered Horizontal"]
}
Private.centered_types_h = {
LR = L["Left to Right"],
RL = L["Right to Left"],
CLR =L["Center, then alternating left and right"],
CRL = L["Center, then alternating right and left"]
}
Private.centered_types_v = {
LR = L["Bottom to Top"],
RL = L["Top to Bottom"],
CLR =L["Center, then alternating bottom and top"],
CRL = L["Center, then alternating top and bottom"]
}
Private.text_rotate_types = {
["LEFT"] = L["Left"],
["NONE"] = L["None"],
["RIGHT"] = L["Right"]
}
Private.align_types = {
["LEFT"] = L["Left"],
["CENTER"] = L["Center"],
["RIGHT"] = L["Right"]
}
Private.rotated_align_types = {
["LEFT"] = L["Top"],
["CENTER"] = L["Center"],
["RIGHT"] = L["Bottom"]
}
Private.icon_side_types = {
["LEFT"] = L["Left"],
["RIGHT"] = L["Right"]
}
Private.rotated_icon_side_types = {
["LEFT"] = L["Top"],
["RIGHT"] = L["Bottom"]
}
Private.anim_types = {
none = L["None"],
preset = L["Preset"],
custom = L["Custom"]
}
Private.anim_ease_types = {
none = L["None"],
easeIn = L["Ease In"],
easeOut = L["Ease Out"],
easeOutIn = L["Ease In and Out"]
}
Private.anim_ease_functions = {
none = function(percent) return percent end,
easeIn = function(percent, power)
return percent ^ power;
end,
easeOut = function(percent, power)
return 1.0 - (1.0 - percent) ^ power;
end,
easeOutIn = function(percent, power)
if percent < .5 then
return (percent * 2.0) ^ power * .5;
end
return 1.0 - ((1.0 - percent) * 2.0) ^ power * .5;
end
}
Private.anim_translate_types = {
straightTranslate = L["Normal"],
circle = L["Circle"],
spiral = L["Spiral"],
spiralandpulse = L["Spiral In And Out"],
shake = L["Shake"],
bounce = L["Bounce"],
bounceDecay = L["Bounce with Decay"],
custom = L["Custom Function"]
}
Private.anim_scale_types = {
straightScale = L["Normal"],
pulse = L["Pulse"],
fauxspin = L["Spin"],
fauxflip = L["Flip"],
custom = L["Custom Function"]
}
Private.anim_alpha_types = {
straight = L["Normal"],
alphaPulse = L["Pulse"],
hide = L["Hide"],
custom = L["Custom Function"]
}
Private.anim_rotate_types = {
straight = L["Normal"],
backandforth = L["Back and Forth"],
wobble = L["Wobble"],
custom = L["Custom Function"]
}
Private.anim_color_types = {
straightColor = L["Legacy RGB Gradient"],
straightHSV = L["Gradient"],
pulseColor = L["Legacy RGB Gradient Pulse"],
pulseHSV = L["Gradient Pulse"],
custom = L["Custom Function"]
}
Private.instance_types = {
none = L["No Instance"],
party = L["5 Man Dungeon"],
ten = L["10 Man Raid"],
twenty = L["20 Man Raid"],
twentyfive = L["25 Man Raid"],
fortyman = L["40 Man Raid"],
pvp = L["Battleground"],
arena = L["Arena"]
}
Private.TocToExpansion = {
[1] = L["Classic"],
[2] = L["Burning Crusade"],
[3] = L["Wrath of the Lich King"],
[4] = L["Cataclysm"],
[5] = L["Mists of Pandaria"],
[6] = L["Warlords of Draenor"],
[7] = L["Legion"],
[8] = L["Battle for Azeroth"],
[9] = L["Shadowlands"],
[10] = L["Dragonflight"],
[11] = L["The War Within"]
}
Private.group_types = {
solo = L["Not in Group"],
group = L["In Party"],
raid = L["In Raid"]
}
Private.difficulty_types = {
none = L["None"],
normal = PLAYER_DIFFICULTY1,
heroic = PLAYER_DIFFICULTY2
}
Private.raid_role_types = {
MAINTANK = "|TInterface\\GroupFrame\\UI-Group-maintankIcon:16:16|t "..MAINTANK,
MAINASSIST = "|TInterface\\GroupFrame\\UI-Group-mainassistIcon:16:16|t "..MAINASSIST,
NONE = L["Other"]
}
Private.role_types = {
tank = "|TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES:16:16:0:0:64:64:0:19:22:41|t "..TANK,
melee = "|TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES:16:16:0:0:64:64:20:39:22:41|t "..L["Melee"],
caster = "|TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES:16:16:0:0:64:64:20:39:22:41|t "..L["Ranged"],
healer = "|TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES:16:16:0:0:64:64:20:39:1:20|t "..HEALER,
}
Private.group_member_types = {
LEADER = L["Leader"],
ASSIST = L["Assist"],
NONE = L["None"]
}
Private.classification_types = {
worldboss = L["World Boss"],
rareelite = L["Rare Elite"],
elite = L["Elite"],
rare = L["Rare"],
normal = L["Normal"],
trivial = L["Trivial (Low Level)"]
}
if WeakAuras.IsAwesomeEnabled() then
Private.classification_types.minus = L["Minus (Small Nameplate)"]
end
Private.creature_type_types = {
[1] = L["Beast"],
[2] = L["Dragonkin"],
[3] = L["Demon"],
[4] = L["Elemental"],
[5] = L["Giant"],
[6] = L["Undead"],
[7] = L["Humanoid"],
[8] = L["Critter"],
[9] = L["Mechanical"],
[10] = L["Not specified"],
[11] = L["Totem"],
[12] = L["Non-combat Pet"],
[13] = L["Gas Cloud"],
[14] = L["Wild Pet"],
[15] = L["Aberration"],
}
Private.ExecEnv.creature_type_name_to_id = {
[L["Beast"]] = 1,
[L["Dragonkin"]] = 2,
[L["Demon"]] = 3,
[L["Elemental"]] = 4,
[L["Giant"]] = 5,
[L["Undead"]] = 6,
[L["Humanoid"]] = 7,
[L["Critter"]] = 8,
[L["Mechanical"]] = 9,
[L["Not specified"]] = 10,
[L["Totem"]] = 11,
[L["Non-combat Pet"]] = 12,
[L["Gas Cloud"]] = 13,
[L["Wild Pet"]] = 14,
[L["Aberration"]] = 15,
}
Private.creature_family_types = {
[1] = L["Wolf"],
[2] = L["Cat"],
[3] = L["Spider"],
[4] = L["Bear"],
[5] = L["Boar"],
[6] = L["Crocolisk"],
[7] = L["Carrion Bird"],
[8] = L["Crab"],
[9] = L["Gorilla"],
[11] = L["Raptor"],
[12] = L["Tallstrider"],
[15] = L["Felhunter"],
[16] = L["Voidwalker"],
[17] = L["Succubus"],
[19] = L["Doomguard"],
[20] = L["Scorpid"],
[21] = L["Turtle"],
[23] = L["Imp"],
[24] = L["Bat"],
[25] = L["Hyena"],
[26] = L["Bird of Prey"],
[27] = L["Wind Serpent"],
[28] = L["Remote Control"],
[29] = L["Felguard"],
[30] = L["Dragonhawk"],
[31] = L["Ravager"],
[32] = L["Warp Stalker"],
[33] = L["Sporebat"],
[34] = L["Nether Ray"],
[35] = L["Serpent"],
[37] = L["Moth"],
[38] = L["Chimaera"],
[39] = L["Devilsaur"],
[40] = L["Ghoul"],
[41] = L["Silithid"],
[42] = L["Worm"],
[43] = L["Rhino"],
[44] = L["Wasp"],
[45] = L["Core Hound"],
[46] = L["Spirit Beast"],
[302] = L["Incubus"],
}
Private.ExecEnv.creature_family_name_to_id = {
[L["Wolf"]] = 1,
[L["Cat"]] = 2,
[L["Spider"]] = 3,
[L["Bear"]] = 4,
[L["Boar"]] = 5,
[L["Crocolisk"]] = 6,
[L["Carrion Bird"]] = 7,
[L["Crab"]] = 8,
[L["Gorilla"]] = 9,
[L["Raptor"]] = 11,
[L["Tallstrider"]] = 12,
[L["Felhunter"]] = 15,
[L["Voidwalker"]] = 16,
[L["Succubus"]] = 17,
[L["Doomguard"]] = 19,
[L["Scorpid"]] = 20,
[L["Turtle"]] = 21,
[L["Imp"]] = 23,
[L["Bat"]] = 24,
[L["Hyena"]] = 25,
[L["Bird of Prey"]] = 26,
[L["Wind Serpent"]] = 27,
[L["Remote Control"]] = 28,
[L["Felguard"]] = 29,
[L["Dragonhawk"]] = 30,
[L["Ravager"]] = 31,
[L["Warp Stalker"]] = 32,
[L["Sporebat"]] = 33,
[L["Nether Ray"]] = 34,
[L["Serpent"]] = 35,
[L["Moth"]] = 37,
[L["Chimaera"]] = 38,
[L["Devilsaur"]] = 39,
[L["Ghoul"]] = 40,
[L["Silithid"]] = 41,
[L["Worm"]] = 42,
[L["Rhino"]] = 43,
[L["Wasp"]] = 44,
[L["Core Hound"]] = 45,
[L["Spirit Beast"]] = 46,
[L["Incubus"]] = 302,
}
Private.anim_start_preset_types = {
slidetop = L["Slide from Top"],
slideleft = L["Slide from Left"],
slideright = L["Slide from Right"],
slidebottom = L["Slide from Bottom"],
fade = L["Fade In"],
shrink = L["Grow"],
grow = L["Shrink"],
spiral = L["Spiral"],
bounceDecay = L["Bounce"],
starShakeDecay = L["Star Shake"],
}
Private.anim_main_preset_types = {
shake = L["Shake"],
spin = L["Spin"],
flip = L["Flip"],
wobble = L["Wobble"],
pulse = L["Pulse"],
alphaPulse = L["Flash"],
rotateClockwise = L["Rotate Right"],
rotateCounterClockwise = L["Rotate Left"],
spiralandpulse = L["Spiral"],
orbit = L["Orbit"],
bounce = L["Bounce"]
}
Private.anim_finish_preset_types = {
slidetop = L["Slide to Top"],
slideleft = L["Slide to Left"],
slideright = L["Slide to Right"],
slidebottom = L["Slide to Bottom"],
fade = L["Fade Out"],
shrink = L["Shrink"],
grow =L["Grow"],
spiral = L["Spiral"],
bounceDecay = L["Bounce"],
starShakeDecay = L["Star Shake"],
}
Private.chat_message_types = {
CHAT_MSG_BATTLEGROUND = L["Battleground"],
CHAT_MSG_BG_SYSTEM_NEUTRAL = L["BG-System Neutral"],
CHAT_MSG_BG_SYSTEM_ALLIANCE = L["BG-System Alliance"],
CHAT_MSG_BG_SYSTEM_HORDE = L["BG-System Horde"],
CHAT_MSG_BN_WHISPER = L["Battle.net Whisper"],
CHAT_MSG_CHANNEL = L["Channel"],
CHAT_MSG_EMOTE = L["Emote"],
CHAT_MSG_GUILD = L["Guild"],
CHAT_MSG_MONSTER_YELL = L["Monster Yell"],
CHAT_MSG_MONSTER_EMOTE = L["Monster Emote"],
CHAT_MSG_MONSTER_SAY = L["Monster Say"],
CHAT_MSG_MONSTER_WHISPER = L["Monster Whisper"],
CHAT_MSG_MONSTER_PARTY = L["Monster Party"],
CHAT_MSG_OFFICER = L["Officer"],
CHAT_MSG_PARTY = L["Party"],
CHAT_MSG_RAID = L["Raid"],
CHAT_MSG_RAID_BOSS_EMOTE = L["Boss Emote"],
CHAT_MSG_RAID_BOSS_WHISPER = L["Boss Whisper"],
CHAT_MSG_RAID_WARNING = L["Raid Warning"],
CHAT_MSG_SAY = L["Say"],
CHAT_MSG_WHISPER = L["Whisper"],
CHAT_MSG_YELL = L["Yell"],
CHAT_MSG_SYSTEM = L["System"],
CHAT_MSG_LOOT = L["Loot"],
}
Private.chat_message_leader_event = {
CHAT_MSG_BATTLEGROUND = "CHAT_MSG_BATTLEGROUND_LEADER",
CHAT_MSG_PARTY = "CHAT_MSG_PARTY_LEADER",
CHAT_MSG_RAID = "CHAT_MSG_RAID_LEADER"
}
Private.send_chat_message_types = {
WHISPER = L["Whisper"],
CHANNEL = L["Channel"],
SAY = L["Say"],
EMOTE = L["Emote"],
YELL = L["Yell"],
PARTY = L["Party"],
GUILD = L["Guild"],
OFFICER = L["Officer"],
RAID = L["Raid"],
SMARTRAID = L["BG>Raid>Party>Say"],
RAID_WARNING = L["Raid Warning"],
BATTLEGROUND = L["Battleground"],
COMBAT = L["Blizzard Combat Text"],
PRINT = L["Chat Frame"],
ERROR = L["Error Frame"]
}
Private.group_aura_name_info_types = {
aura = L["Aura Name"],
players = L["Player(s) Affected"],
nonplayers = L["Player(s) Not Affected"]
}
Private.group_aura_stack_info_types = {
count = L["Number Affected"],
stack = L["Aura Stack"]
}
Private.cast_types = {
cast = L["Cast"],
channel = L["Channel (Spell)"]
}
-- register sounds
LSM:Register("sound", "Heartbeat Single", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\HeartbeatSingle.ogg")
LSM:Register("sound", "Batman Punch", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\BatmanPunch.ogg")
LSM:Register("sound", "Bike Horn", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\BikeHorn.ogg")
LSM:Register("sound", "Boxing Arena Gong", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\BoxingArenaSound.ogg")
LSM:Register("sound", "Bleat", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Bleat.ogg")
LSM:Register("sound", "Cartoon Hop", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\CartoonHop.ogg")
LSM:Register("sound", "Cat Meow", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\CatMeow2.ogg")
LSM:Register("sound", "Kitten Meow", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\KittenMeow.ogg")
LSM:Register("sound", "Robot Blip", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\RobotBlip.ogg")
LSM:Register("sound", "Sharp Punch", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\SharpPunch.ogg")
LSM:Register("sound", "Water Drop", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\WaterDrop.ogg")
LSM:Register("sound", "Air Horn", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\AirHorn.ogg")
LSM:Register("sound", "Applause", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Applause.ogg")
LSM:Register("sound", "Banana Peel Slip", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\BananaPeelSlip.ogg")
LSM:Register("sound", "Blast", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Blast.ogg")
LSM:Register("sound", "Cartoon Voice Baritone", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\CartoonVoiceBaritone.ogg")
LSM:Register("sound", "Cartoon Walking", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\CartoonWalking.ogg")
LSM:Register("sound", "Cow Mooing", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\CowMooing.ogg")
LSM:Register("sound", "Ringing Phone", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\RingingPhone.ogg")
LSM:Register("sound", "Roaring Lion", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\RoaringLion.ogg")
LSM:Register("sound", "Shotgun", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Shotgun.ogg")
LSM:Register("sound", "Squish Fart", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\SquishFart.ogg")
LSM:Register("sound", "Temple Bell", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\TempleBellHuge.ogg")
LSM:Register("sound", "Torch", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Torch.ogg")
LSM:Register("sound", "Warning Siren", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\WarningSiren.ogg")
LSM:Register("sound", "Lich King Apocalypse", "Sound\\Creature\\LichKing\\IC_Lich King_Special01.ogg")
-- Sounds from freesound.org, see commits for attributions
LSM:Register("sound", "Sheep Blerping", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\SheepBleat.ogg")
LSM:Register("sound", "Rooster Chicken Call", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\RoosterChickenCalls.ogg")
LSM:Register("sound", "Goat Bleeting", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\GoatBleating.ogg")
LSM:Register("sound", "Acoustic Guitar", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\AcousticGuitar.ogg")
LSM:Register("sound", "Synth Chord", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\SynthChord.ogg")
LSM:Register("sound", "Chicken Alarm", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\ChickenAlarm.ogg")
LSM:Register("sound", "Xylophone", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Xylophone.ogg")
LSM:Register("sound", "Drums", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Drums.ogg")
LSM:Register("sound", "Tada Fanfare", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\TadaFanfare.ogg")
LSM:Register("sound", "Squeaky Toy Short", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\SqueakyToyShort.ogg")
LSM:Register("sound", "Error Beep", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\ErrorBeep.ogg")
LSM:Register("sound", "Oh No", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\OhNo.ogg")
LSM:Register("sound", "Double Whoosh", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\DoubleWhoosh.ogg")
LSM:Register("sound", "Brass", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Brass.mp3")
LSM:Register("sound", "Glass", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Glass.mp3")
LSM:Register("sound", "Voice: Adds", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Adds.ogg")
LSM:Register("sound", "Voice: Boss", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Boss.ogg")
LSM:Register("sound", "Voice: Circle", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Circle.ogg")
LSM:Register("sound", "Voice: Cross", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Cross.ogg")
LSM:Register("sound", "Voice: Diamond", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Diamond.ogg")
LSM:Register("sound", "Voice: Don't Release", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\DontRelease.ogg")
LSM:Register("sound", "Voice: Empowered", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Empowered.ogg")
LSM:Register("sound", "Voice: Focus", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Focus.ogg")
LSM:Register("sound", "Voice: Idiot", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Idiot.ogg")
LSM:Register("sound", "Voice: Left", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Left.ogg")
LSM:Register("sound", "Voice: Moon", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Moon.ogg")
LSM:Register("sound", "Voice: Next", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Next.ogg")
LSM:Register("sound", "Voice: Portal", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Portal.ogg")
LSM:Register("sound", "Voice: Protected", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Protected.ogg")
LSM:Register("sound", "Voice: Release", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Release.ogg")
LSM:Register("sound", "Voice: Right", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Right.ogg")
LSM:Register("sound", "Voice: Run Away", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\RunAway.ogg")
LSM:Register("sound", "Voice: Skull", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Skull.ogg")
LSM:Register("sound", "Voice: Spread", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Spread.ogg")
LSM:Register("sound", "Voice: Square", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Square.ogg")
LSM:Register("sound", "Voice: Stack", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Stack.ogg")
LSM:Register("sound", "Voice: Star", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Star.ogg")
LSM:Register("sound", "Voice: Switch", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Switch.ogg")
LSM:Register("sound", "Voice: Taunt", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Taunt.ogg")
LSM:Register("sound", "Voice: Triangle", "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\Triangle.ogg")
local PowerAurasSoundPath = "Interface\\Addons\\WeakAuras\\PowerAurasMedia\\Sounds\\"
LSM:Register("sound", "Aggro", PowerAurasSoundPath.."aggro.ogg")
LSM:Register("sound", "Arrow Swoosh", PowerAurasSoundPath.."Arrow_swoosh.ogg")
LSM:Register("sound", "Bam", PowerAurasSoundPath.."bam.ogg")
LSM:Register("sound", "Polar Bear", PowerAurasSoundPath.."bear_polar.ogg")
LSM:Register("sound", "Big Kiss", PowerAurasSoundPath.."bigkiss.ogg")
LSM:Register("sound", "Bite", PowerAurasSoundPath.."BITE.ogg")
LSM:Register("sound", "Burp", PowerAurasSoundPath.."burp4.ogg")
LSM:Register("sound", "Cat", PowerAurasSoundPath.."cat2.ogg")
LSM:Register("sound", "Chant Major 2nd", PowerAurasSoundPath.."chant2.ogg")
LSM:Register("sound", "Chant Minor 3rd", PowerAurasSoundPath.."chant4.ogg")
LSM:Register("sound", "Chimes", PowerAurasSoundPath.."chimes.ogg")
LSM:Register("sound", "Cookie Monster", PowerAurasSoundPath.."cookie.ogg")
LSM:Register("sound", "Electrical Spark", PowerAurasSoundPath.."ESPARK1.ogg")
LSM:Register("sound", "Fireball", PowerAurasSoundPath.."Fireball.ogg")
LSM:Register("sound", "Gasp", PowerAurasSoundPath.."Gasp.ogg")
LSM:Register("sound", "Heartbeat", PowerAurasSoundPath.."heartbeat.ogg")
LSM:Register("sound", "Hiccup", PowerAurasSoundPath.."hic3.ogg")
LSM:Register("sound", "Huh?", PowerAurasSoundPath.."huh_1.ogg")
LSM:Register("sound", "Hurricane", PowerAurasSoundPath.."hurricane.ogg")
LSM:Register("sound", "Hyena", PowerAurasSoundPath.."hyena.ogg")
LSM:Register("sound", "Kaching", PowerAurasSoundPath.."kaching.ogg")
LSM:Register("sound", "Moan", PowerAurasSoundPath.."moan.ogg")
LSM:Register("sound", "Panther", PowerAurasSoundPath.."panther1.ogg")
LSM:Register("sound", "Phone", PowerAurasSoundPath.."phone.ogg")
LSM:Register("sound", "Punch", PowerAurasSoundPath.."PUNCH.ogg")
LSM:Register("sound", "Rain", PowerAurasSoundPath.."rainroof.ogg")
LSM:Register("sound", "Rocket", PowerAurasSoundPath.."rocket.ogg")
LSM:Register("sound", "Ship's Whistle", PowerAurasSoundPath.."shipswhistle.ogg")
LSM:Register("sound", "Gunshot", PowerAurasSoundPath.."shot.ogg")
LSM:Register("sound", "Snake Attack", PowerAurasSoundPath.."snakeatt.ogg")
LSM:Register("sound", "Sneeze", PowerAurasSoundPath.."sneeze.ogg")
LSM:Register("sound", "Sonar", PowerAurasSoundPath.."sonar.ogg")
LSM:Register("sound", "Splash", PowerAurasSoundPath.."splash.ogg")
LSM:Register("sound", "Squeaky Toy", PowerAurasSoundPath.."Squeakypig.ogg")
LSM:Register("sound", "Sword Ring", PowerAurasSoundPath.."swordecho.ogg")
LSM:Register("sound", "Throwing Knife", PowerAurasSoundPath.."throwknife.ogg")
LSM:Register("sound", "Thunder", PowerAurasSoundPath.."thunder.ogg")
LSM:Register("sound", "Wicked Male Laugh", PowerAurasSoundPath.."wickedmalelaugh1.ogg")
LSM:Register("sound", "Wilhelm Scream", PowerAurasSoundPath.."wilhelm.ogg")
LSM:Register("sound", "Wicked Female Laugh", PowerAurasSoundPath.."wlaugh.ogg")
LSM:Register("sound", "Wolf Howl", PowerAurasSoundPath.."wolf5.ogg")
LSM:Register("sound", "Yeehaw", PowerAurasSoundPath.."yeehaw.ogg")
Private.sound_types = {
[" custom"] = " " .. L["Custom"],
[" KitID"] = " " .. L["Sound by Kit ID"]
}
Private.sound_file_types = {}
for name, path in next, LSM:HashTable("sound") do
Private.sound_types[path] = name
Private.sound_file_types[path] = name
end
LSM.RegisterCallback(WeakAuras, "LibSharedMedia_Registered", function(_, mediatype, key)
if mediatype == "sound" then
local path = LSM:Fetch(mediatype, key)
if path then
Private.sound_types[path] = key
Private.sound_file_types[path] = key
end
elseif mediatype == "statusbar" then
local path = LSM:Fetch(mediatype, key)
if path then
Private.texture_types["LibSharedMedia Textures"][path] = key
end
end
end)
Private.texture_types["LibSharedMedia Textures"] = {}
for _, mediaType in ipairs{"statusbar"} do
local mediaTable = LSM:HashTable(mediaType)
if mediaTable then
for name, path in pairs(mediaTable) do
Private.texture_types["LibSharedMedia Textures"][path] = name
end
end
end
-- register options font
LSM:Register("font", "Fira Mono Medium", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\FiraMono-Medium.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
-- Other Fira fonts
LSM:Register("font", "Fira Sans Black", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\FiraSans-Heavy.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
LSM:Register("font", "Fira Sans Condensed Black", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\FiraSansCondensed-Heavy.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
LSM:Register("font", "Fira Sans Condensed Medium", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\FiraSansCondensed-Medium.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
LSM:Register("font", "Fira Sans Medium", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\FiraSans-Medium.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
LSM:Register("font", "PT Sans Narrow Regular", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\PTSansNarrow-Regular.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
LSM:Register("font", "PT Sans Narrow Bold", "Interface\\Addons\\WeakAuras\\Media\\Fonts\\PTSansNarrow-Bold.ttf", LSM.LOCALE_BIT_western + LSM.LOCALE_BIT_ruRU)
-- register plain white border
LSM:Register("border", "Square Full White", [[Interface\AddOns\WeakAuras\Media\Textures\Square_FullWhite.tga]])
LSM:Register("statusbar", "Clean", [[Interface\AddOns\WeakAuras\Media\Textures\Statusbar_Clean]])
LSM:Register("statusbar", "Stripes", [[Interface\AddOns\WeakAuras\Media\Textures\Statusbar_Stripes]])
LSM:Register("statusbar", "Thick Stripes", [[Interface\AddOns\WeakAuras\Media\Textures\Statusbar_Stripes_Thick]])
LSM:Register("statusbar", "Thin Stripes", [[Interface\AddOns\WeakAuras\Media\Textures\Statusbar_Stripes_Thin]])
LSM:Register("border", "Drop Shadow", [[Interface\AddOns\WeakAuras\Media\Textures\Border_DropShadow]])
Private.duration_types = {
seconds = L["Seconds"],
relative = L["Relative"]
}
Private.duration_types_no_choice = {
seconds = L["Seconds"]
}
Private.gtfo_types = {
[1] = L["High Damage"],
[2] = L["Low Damage"],
[3] = L["Fail Alert"],
[4] = L["Friendly Fire"]
}
Private.pet_behavior_types = {
aggressive = PET_MODE_AGGRESSIVE,
passive = PET_MODE_PASSIVE,
defensive = PET_MODE_DEFENSIVE
}
Private.cooldown_progress_behavior_types = {
showOnCooldown = L["On Cooldown"],
showOnReady = L["Not on Cooldown"],
showAlways = L["Always"]
}
Private.cooldown_types = {
auto = L["Auto"],
charges = L["Charges"],
cooldown = L["Cooldown"]
}
Private.bufftrigger_progress_behavior_types = {
showOnActive = L["Buffed/Debuffed"],
showOnMissing = L["Missing"],
showAlways= L["Always"]
}
Private.bufftrigger_2_progress_behavior_types = {
showOnActive = L["Aura(s) Found"],
showOnMissing = L["Aura(s) Missing"],
showAlways = L["Always"],
showOnMatches = L["Match Count"]
}
Private.bufftrigger_2_preferred_match_types = {
showLowest = L["Least remaining time"],
showHighest = L["Most remaining time"],
showLowestSpellId = L["Lowest Spell Id"],
showHighestSpellId = L["Highest Spell Id"],
}
Private.bufftrigger_2_per_unit_mode = {
affected = L["Affected"],
unaffected = L["Unaffected"],
all = L["All"]
}
Private.item_slot_types = {
[0] = AMMOSLOT,
[1] = HEADSLOT,
[2] = NECKSLOT,
[3] = SHOULDERSLOT,
[5] = CHESTSLOT,
[6] = WAISTSLOT,
[7] = LEGSSLOT,
[8] = FEETSLOT,
[9] = WRISTSLOT,
[10] = HANDSSLOT,
[11] = FINGER0SLOT_UNIQUE,
[12] = FINGER1SLOT_UNIQUE,
[13] = TRINKET0SLOT_UNIQUE,
[14] = TRINKET1SLOT_UNIQUE,
[15] = BACKSLOT,
[16] = MAINHANDSLOT,
[17] = SECONDARYHANDSLOT,
[18] = RANGEDSLOT,
[19] = TABARDSLOT
}
Private.charges_change_type = {
GAINED = L["Gained"],
LOST = L["Lost"],
CHANGED = L["Changed"]
}
Private.charges_change_condition_type = {
GAINED = L["Gained"],
LOST = L["Lost"]
}
Private.combat_event_type = {
PLAYER_REGEN_ENABLED = L["Leaving"],
PLAYER_REGEN_DISABLED = L["Entering"]
}
Private.bool_types = {
[0] = L["False"],
[1] = L["True"]
}
Private.update_categories = {
{
name = "anchor",
-- Note, these are special cased for child auras and considered arrangement
fields = {
"xOffset",
"yOffset",
"selfPoint",
"anchorPoint",
"anchorFrameType",
"anchorFrameFrame",
"frameStrata",
"height",
"width",
"fontSize",
"scale",
},
default = false,
label = L["Size & Position"],
},
{
name = "userconfig",
fields = {"config"},
default = false,
label = L["Custom Configuration"],
},
{
name = "name",
fields = {"id"},
default = true,
label = L["Aura Names"],
},
{
name = "display",
fields = {},
default = true,
label = L["Display"],
},
{
name = "trigger",
fields = {"triggers"},
default = true,
label = L["Trigger"],
},
{
name = "conditions",
fields = {"conditions"},
default = true,
label = L["Conditions"],
},
{
name = "load",
fields = {"load"},
default = true,
label = L["Load Conditions"],
},
{
name = "action",
fields = {"actions"},
default = true,
label = L["Actions"],
},
{
name = "animation",
fields = {"animation"},
default = true,
label = L["Animations"],
},
{
name = "authoroptions",
fields = {"authorOptions"},
default = true,
label = L["Author Options"]
},
{
name = "arrangement",
fields = {
"grow",
"space",
"stagger",
"sort",
"hybridPosition",
"radius",
"align",
"rotation",
"constantFactor",
"hybridSortMode",
},
default = true,
label = L["Group Arrangement"],
},
{
name = "oldchildren",
fields = {},
default = true,
label = L["Remove Obsolete Auras"],
skipInSummary = true
},
{
name = "newchildren",
fields = {},
default = true,
label = L["Add Missing Auras"],
skipInSummary = true
},
{
name = "metadata",
fields = {
"url",
"desc",
"version",
"semver",
"wagoID", -- i don't *love* that we're so closely tied to wago, but eh
},
default = true,
label = L["Meta Data"],
},
}
-- fields that are handled as special cases when importing
-- mismatch of internal fields is not counted as a difference
Private.internal_fields = {
uid = true,
internalVersion = true,
sortHybridTable = true,
tocversion = true,
parent = true,
controlledChildren = true,
source = true
}
-- fields that are not included in exported data
-- these represent information which is only meaningful inside the db,
-- or are represented in other ways in exported
Private.non_transmissable_fields = {
controlledChildren = true,
parent = true,
authorMode = true,
skipWagoUpdate = true,
ignoreWagoUpdate = true,
preferToUpdate = true,
information = {
saved = true
}
}
-- For nested groups, we do transmit parent + controlledChildren
Private.non_transmissable_fields_v2000 = {
authorMode = true,
skipWagoUpdate = true,
ignoreWagoUpdate = true,
preferToUpdate = true,
information = {
saved = true
}
}
Private.data_stub = {
-- note: this is the minimal data stub which prevents false positives in diff upon reimporting an aura.
-- pending a refactor of other code which adds unnecessary fields, it is possible to shrink it
triggers = {
{
trigger = {
type = "aura2",
names = {},
event = "Health",
subeventPrefix = "SPELL",
subeventSuffix = "_CAST_START",
spellIds = {},
unit = "player",
debuffType = "HELPFUL",
},
untrigger = {},
},
},
load = {
size = {
multi = {},
},
spec = {
multi = {},
},
class = {
multi = {},
},
talent = {
multi = {},
},
},
actions = {
init = {},
start = {},
finish = {},
},
animation = {
start = {
type = "none",
duration_type = "seconds",
easeType = "none",
easeStrength = 3,
},
main = {
type = "none",
duration_type = "seconds",
easeType = "none",
easeStrength = 3,
},
finish = {
type = "none",
duration_type = "seconds",
easeType = "none",
easeStrength = 3,
},
},
conditions = {},
config = {},
authorOptions = {},
information = {},
}
Private.author_option_classes = {
toggle = "simple",
input = "simple",
number = "simple",
range = "simple",
color = "simple",
select = "simple",
media = "simple",
multiselect = "simple",
description = "noninteractive",
space = "noninteractive",
header = "noninteractive",
group = "group"
}
Private.author_option_types = {
toggle = L["Toggle"],
input = L["String"],
number = L["Number"],
range = L["Slider"],
description = L["Description"],
color = L["Color"],
select = L["Dropdown Menu"],
space = L["Space"],
multiselect = L["Toggle List"],
media = L["Media"],
header = L["Separator"],
group = L["Option Group"],
}
Private.author_option_fields = {
common = {
type = true,
name = true,
useDesc = true,
desc = true,
key = true,
width = true,
},
number = {
min = 0,
max = 1,
step = .05,
default = 0,
},
range = {
min = 0,
max = 1,
step = .05,
default = 0,
},
input = {
default = "",
useLength = false,
length = 10,
multiline = false,
},
toggle = {
default = false,
},
description = {
text = "",
fontSize = "medium",
},
color = {
default = {1, 1, 1, 1},
},
select = {
values = {"val1"},
default = 1,
},
space = {
variableWidth = true,
useHeight = false,
height = 1,
},
media = {
mediaType = "sound",
media = "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\AirHorn.ogg"
},
multiselect = {
default = {true},
values = {"val1"},
},
header = {
useName = false,
text = "",
},
group = {
groupType = "simple",
useCollapse = true,
collapse = false,
limitType = "none",
size = 10,
nameSource = 0,
hideReorder = true,
entryNames = nil, -- handled as a special case in code
subOptions = {},
noMerge = false,
}
}
Private.shared_media_types = {
sound = L["Sound"],
font = L["Font"],
border = L["Border"],
background = L["Background"],
statusbar = L["Status Bar"]
}
Private.author_option_media_defaults = {
sound = "Interface\\AddOns\\WeakAuras\\Media\\Sounds\\AirHorn.ogg",
font = "Friz Quadrata TT",
border = "1 Pixel",
background = "None",
statusbar = "Blizzard",
}
Private.author_option_media_controls = {
statusbar = "LSM30_Statusbar",
border = "LSM30_Border",
background = "LSM30_Background",
font = "LSM30_Font"
}
Private.author_option_media_itemControls = {
sound = "WeakAurasMediaSound"
}
Private.array_entry_name_types = {
[-1] = L["Fixed Names"],
[0] = L["Entry Order"],
-- the rest is auto-populated with indices which are valid entry name sources
}
-- option types which can be used to generate entry names on arrays
Private.name_source_option_types = {
input = true,
number = true,
range = true,
}
Private.group_limit_types = {
none = L["Unlimited"],
max = L["Limited"],
fixed = L["Fixed Size"],
}
Private.group_option_types = {
simple = L["Simple"],
array = L["Array"],
}
Private.glow_types = {
ACShine = L["Autocast Shine"],
Pixel = L["Pixel Glow"],
buttonOverlay = L["Action Button Glow"],
Proc = L["Proc Glow"]
}
Private.font_sizes = {
small = L["Small"],
medium = L["Medium"],
large = L["Large"],
}
-- unitIds registerable with RegisterUnitEvent
Private.baseUnitId = {
["player"] = true,
["target"] = true,
["pet"] = true,
["focus"] = true,
["vehicle"] = true
}
Private.multiUnitId = {
["boss"] = true,
["arena"] = true,
["group"] = true,
["grouppets"] = true,
["grouppetsonly"] = true,
["party"] = true,
["partypets"] = true,
["partypetsonly"] = true,
["raid"] = true,
}
if WeakAuras.IsAwesomeEnabled() then
Private.multiUnitId["nameplate"] = true
end
Private.multiUnitUnits = {
["boss"] = {},
["arena"] = {},
["group"] = {},
["party"] = {},
["raid"] = {}
}
if WeakAuras.IsAwesomeEnabled() then
Private.multiUnitUnits["nameplate"] = {}
end
Private.multiUnitUnits.group["player"] = true
Private.multiUnitUnits.party["player"] = true
Private.multiUnitUnits.group["pet"] = true
Private.multiUnitUnits.party["pet"] = true
for i = 1, 4 do
Private.baseUnitId["party"..i] = true
Private.baseUnitId["partypet"..i] = true
Private.multiUnitUnits.group["party"..i] = true
Private.multiUnitUnits.party["party"..i] = true
Private.multiUnitUnits.group["partypet"..i] = true
Private.multiUnitUnits.party["partypet"..i] = true
end
for i = 1, MAX_BOSS_FRAMES do
Private.baseUnitId["boss"..i] = true
Private.multiUnitUnits.boss["boss"..i] = true
end
for i = 1, 5 do
Private.baseUnitId["arena"..i] = true
Private.multiUnitUnits.arena["arena"..i] = true
end
for i = 1, 40 do
Private.baseUnitId["raid"..i] = true
Private.baseUnitId["raidpet"..i] = true
Private.multiUnitUnits.group["raid"..i] = true
Private.multiUnitUnits.raid["raid"..i] = true
Private.multiUnitUnits.group["raidpet"..i] = true
Private.multiUnitUnits.raid["raidpet"..i] = true
end
if WeakAuras.IsAwesomeEnabled() then
for i = 1, 100 do
Private.baseUnitId["nameplate"..i] = true
Private.multiUnitUnits.nameplate["nameplate"..i] = true
end
end
Private.dbm_types = {
[1] = L["Add"],
[2] = L["AOE"],
[3] = L["Targeted"],
[4] = L["Interrupt"],
[5] = L["Role"],
[6] = L["Phase"],
[7] = L["Important"]
}
Private.weapon_enchant_types = {
showOnActive = L["Enchant Found"],
showOnMissing = L["Enchant Missing"],
showAlways = L["Always"],
}
Private.reset_swing_spells = {
[GetSpellInfo(1464)] = true, -- Slam
[GetSpellInfo(78)] = true, -- Heroic Strike
[GetSpellInfo(845)] = true, -- Cleave
[GetSpellInfo(2973)] = true, -- Raptor Strike
[GetSpellInfo(6807)] = true, -- Maul
[GetSpellInfo(20549)] = true, -- War Stomp
[GetSpellInfo(56815)] = true, -- Rune Strike
[GetSpellInfo(5384)] = true, -- Feign Death
[GetSpellInfo(2764)] = true, -- Throw
[GetSpellInfo(5019)] = true, -- Shoot
}
Private.reset_ranged_swing_spells = {
[GetSpellInfo(2764)] = true, -- Throw
[GetSpellInfo(5019)] = true, -- Shoot Wands
[GetSpellInfo(75)] = true, -- Auto Shot
[GetSpellInfo(5384)] = true, -- Feign Death
}
Private.noreset_swing_spells = {
[GetSpellInfo(23063)] = true, -- Dense Dynamite
[GetSpellInfo(4054)] = true, -- Rough Dynamite
[GetSpellInfo(4064)] = true, -- Rough Copper Bomb
[GetSpellInfo(4061)] = true, -- Coarse Dynamite
[GetSpellInfo(8331)] = true, -- Ez-Thro Dynamite
[GetSpellInfo(4065)] = true, -- Large Copper Bomb
[GetSpellInfo(4066)] = true, -- Small Bronze Bomb
[GetSpellInfo(4062)] = true, -- Heavy Dynamite
[GetSpellInfo(4067)] = true, -- Big Bronze Bomb
[GetSpellInfo(4068)] = true, -- Iron Grenade
[GetSpellInfo(23000)] = true, -- Ez-Thro Dynamite II
[GetSpellInfo(12421)] = true, -- Mithril Frag Bomb
[GetSpellInfo(4069)] = true, -- Big Iron Bomb
[GetSpellInfo(12562)] = true, -- The Big One
[GetSpellInfo(12543)] = true, -- Hi-Explosive Bomb
[GetSpellInfo(19769)] = true, -- Thorium Grenade
[GetSpellInfo(19784)] = true, -- Dark Iron Bomb
[GetSpellInfo(30216)] = true, -- Fel Iron Bomb
[GetSpellInfo(19821)] = true, -- Arcane Bomb
[GetSpellInfo(39965)] = true, -- Frost Grenade
[GetSpellInfo(30461)] = true, -- The Bigger One
[GetSpellInfo(30217)] = true, -- Adamantite Grenade
[GetSpellInfo(35476)] = true, -- Drums of Battle
[GetSpellInfo(35475)] = true, -- Drums of War
[GetSpellInfo(35477)] = true, -- Drums of Speed
[GetSpellInfo(35478)] = true, -- Drums of Restoration
[GetSpellInfo(34120)] = true, -- Steady Shot (rank 1)
[GetSpellInfo(19434)] = true, -- Aimed Shot (rank 1)
[GetSpellInfo(1464)] = true, -- Slam (rank 1)
--35474 Drums of Panic DO reset the swing timer, do not add
}
WeakAuras.StopMotion = WeakAuras.StopMotion or {}
WeakAuras.StopMotion.texture_types = WeakAuras.StopMotion.texture_types or {}
WeakAuras.StopMotion.texture_data = WeakAuras.StopMotion.texture_data or {}
WeakAuras.StopMotion.texture_types.Basic = {
["Interface\\AddOns\\WeakAuras\\Media\\Textures\\stopmotion"] = "Example",
}
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAuras\\Media\\Textures\\stopmotion"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Basic\\circle"] = { count = 256, rows = 16, columns = 16 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Basic\\checkmark"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Basic\\redx"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Basic\\leftarc"] = { count = 256, rows = 16, columns = 16 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Basic\\rightarc"] = { count = 256, rows = 16, columns = 16 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Basic\\fireball"] = { count = 7, rows = 5, columns = 5 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Runes\\AURARUNE8"] = { count = 256, rows = 16, columns = 16 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Runes\\legionv"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Runes\\legionw"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Runes\\legionf"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Runes\\legionword"] = { count = 64, rows = 8, columns = 8 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Kaitan\\CellRing"] = { count = 32, rows = 8, columns = 4 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Kaitan\\Gadget"] = { count = 32, rows = 8, columns = 4 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Kaitan\\Radar"] = { count = 32, rows = 8, columns = 4 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Kaitan\\RadarComplex"] = { count = 32, rows = 8, columns = 4 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Kaitan\\Saber"] = { count = 32, rows = 8, columns = 4 }
WeakAuras.StopMotion.texture_data["Interface\\AddOns\\WeakAurasStopMotion\\Textures\\Kaitan\\Waveform"] = { count = 32, rows = 8, columns = 4 }
WeakAuras.StopMotion.animation_types = {
loop = L["Loop"],
bounce = L["Forward, Reverse Loop"],
once = L["Forward"],
progress = L["Progress"]
}
do
local function addGlyphFromSpellID(id, sorted)
local name, _, icon = GetSpellInfo(id or 0)
if name and icon and not Private.glyph_types[id] then
Private.glyph_types[id] = "|T" .. icon .. ":0|t" .. name
table.insert(sorted, { glyphID = id, name = name })
end
end
local function addEquippedGlyphs(sorted)
for i = 1, GetNumGlyphSockets() or 6 do
local _, _, glyphID, icon = GetGlyphSocketInfo(i)
if glyphID and icon and not Private.glyph_types[glyphID] then
local name = GetSpellInfo(glyphID)
if name then
Private.glyph_types[glyphID] = "|T" .. icon .. ":0|t" .. name
table.insert(sorted, { glyphID = glyphID, name = name })
end
end
end
end
Private.InitializeGlyphs = function(glyphId)
Private.glyph_types = {}
Private.glyph_sorted = {}
local sorted = {}
addEquippedGlyphs(sorted)
if glyphId then
if glyphId.single then
addGlyphFromSpellID(glyphId.single, sorted)
end
if glyphId.multi then
for _, id in ipairs(glyphId.multi) do
addGlyphFromSpellID(id, sorted)
end
end
end
table.sort(sorted, function(a, b)
return a.name < b.name
end)
for _, glyph in ipairs(sorted) do
table.insert(Private.glyph_sorted, glyph.glyphID)
end
end
end
Private.faction_to_id = {
[L["Booty Bay"]] = 21,
[L["Ironforge"]] = 47,
[L["Gnomeregan Exiles"]] = 54,
[L["Thorium Brotherhood"]] = 59,
[L["Horde"]] = 67,
[L["Undercity"]] = 68,
[L["Darnassus"]] = 69,
[L["Syndicate"]] = 70,
[L["Stormwind"]] = 72,
[L["Orgrimmar"]] = 76,
[L["Thunder Bluff"]] = 81,
[L["Bloodsail Buccaneers"]] = 87,
[L["Gelkis Clan Centaur"]] = 92,
[L["Magram Clan Centaur"]] = 93,
[L["Zandalar Tribe"]] = 270,
[L["Ravenholdt"]] = 349,
[L["Gadgetzan"]] = 369,
[L["Alliance"]] = 469,
[L["Ratchet"]] = 470,
[L["The League of Arathor"]] = 509,
[L["The Defilers"]] = 510,
[L["Argent Dawn"]] = 529,
[L["Darkspear Trolls"]] = 530,
[L["Timbermaw Hold"]] = 576,
[L["Everlook"]] = 577,
[L["Wintersaber Trainers"]] = 589,
[L["Cenarion Circle"]] = 609,
[L["Frostwolf Clan"]] = 729,
[L["Stormpike Guard"]] = 730,
[L["Hydraxian Waterlords"]] = 749,
[L["Shen'dralar"]] = 809,
[L["Warsong Outriders"]] = 889,
[L["Silverwing Sentinels"]] = 890,
[L["Darkmoon Faire"]] = 909,
[L["Brood of Nozdormu"]] = 910,
[L["Silvermoon City"]] = 911,
[L["Tranquillien"]] = 922,
[L["Exodar"]] = 930,
[L["The Aldor"]] = 932,
[L["The Consortium"]] = 933,
[L["The Scryers"]] = 934,
[L["The Sha'tar"]] = 935,
[L["The Mag'har"]] = 941,
[L["Cenarion Expedition"]] = 942,
[L["Honor Hold"]] = 946,
[L["Thrallmar"]] = 947,
[L["The Violet Eye"]] = 967,
[L["Sporeggar"]] = 970,
[L["Kurenai"]] = 978,
[L["Keepers of Time"]] = 989,
[L["The Scale of the Sands"]] = 990,
[L["Lower City"]] = 1011,
[L["Ashtongue Deathsworn"]] = 1012,
[L["Netherwing"]] = 1015,
[L["Sha'tari Skyguard"]] = 1031,
[L["Alliance Vanguard"]] = 1037,
[L["Ogri'la"]] = 1038,
[L["Valiance Expedition"]] = 1050,
[L["Horde Expedition"]] = 1052,
[L["The Taunka"]] = 1064,
[L["The Hand of Vengeance"]] = 1067,
[L["Explorers' League"]] = 1068,
[L["The Kalu'ak"]] = 1073,
[L["Shattered Sun Offensive"]] = 1077,
[L["Warsong Offensive"]] = 1085,
[L["Kirin Tor"]] = 1090,
[L["The Wyrmrest Accord"]] = 1091,
[L["The Silver Covenant"]] = 1094,
[L["Knights of the Ebon Blade"]] = 1098,
[L["Frenzyheart Tribe"]] = 1104,
[L["The Oracles"]] = 1105,
[L["Argent Crusade"]] = 1106,
[L["The Sons of Hodir"]] = 1119,
[L["The Sunreavers"]] = 1124,
[L["The Frostborn"]] = 1126,
[L["The Ashen Verdict"]] = 1156,
}
do
local classData = {
DEATHKNIGHT = {
icon = "Interface\\Icons\\Spell_Deathknight_ClassIcon",
specs = {
[250] = { name = L["Blood"], icon = "Interface\\Icons\\Spell_Deathknight_BloodPresence" },
[251] = { name = L["Frost"], icon = "Interface\\Icons\\Spell_Deathknight_FrostPresence" },
[252] = { name = L["Unholy"], icon = "Interface\\Icons\\Spell_Deathknight_UnholyPresence" },
}
},
DRUID = {
icon = "Interface\\Icons\\Ability_Druid_Maul",
specs = {
[102] = { name = L["Balance"], icon = "Interface\\Icons\\Spell_Nature_StarFall" },
[103] = { name = L["Feral Combat"], icon = "Interface\\Icons\\Ability_Racial_BearForm" },
[104] = { name = L["Guardian"], icon = "Interface\\Icons\\Ability_Racial_BearForm" },
[105] = { name = L["Restoration"], icon = "Interface\\Icons\\Spell_Nature_HealingTouch" },
}
},
HUNTER = {
icon = "Interface\\Icons\\INV_Weapon_Bow_07",
specs = {
[253] = { name = L["Beast Mastery"], icon = "Interface\\Icons\\Ability_Hunter_BeastTaming" },
[254] = { name = L["Marksmanship"], icon = "Interface\\Icons\\Ability_Marksmanship" },
[255] = { name = L["Survival"], icon = "Interface\\Icons\\Ability_Hunter_SwiftStrike" },
}
},
MAGE = {
icon = "Interface\\Icons\\INV_Staff_13",
specs = {
[62] = { name = L["Arcane"], icon = "Interface\\Icons\\Spell_Holy_MagicalSentry" },
[63] = { name = L["Fire"], icon = "Interface\\Icons\\Spell_Fire_FireBolt02" },
[64] = { name = L["Frost"], icon = "Interface\\Icons\\Spell_Frost_FrostBolt02" },
}
},
PALADIN = {
icon = "Interface\\Icons\\INV_Hammer_01",
specs = {
[65] = { name = L["Holy"], icon = "Interface\\Icons\\Spell_Holy_HolyBolt" },
[66] = { name = L["Protection"], icon = "Interface\\Icons\\Spell_Holy_DevotionAura" },
[70] = { name = L["Retribution"], icon = "Interface\\Icons\\Spell_Holy_AuraOfLight" },
}
},
PRIEST = {
icon = "Interface\\Icons\\INV_Staff_30",
specs = {
[256] = { name = L["Discipline"], icon = "Interface\\Icons\\Spell_Holy_WordFortitude" },
[257] = { name = L["Holy"], icon = "Interface\\Icons\\Spell_Holy_GuardianSpirit" },
[258] = { name = L["Shadow"], icon = "Interface\\Icons\\Spell_Shadow_ShadowWordPain" },
}
},
ROGUE = {
icon = "Interface\\Icons\\INV_ThrowingKnife_04",
specs = {
[259] = { name = L["Assassination"], icon = "Interface\\Icons\\Ability_Rogue_Eviscerate" },
[260] = { name = L["Combat"], icon = "Interface\\Icons\\Ability_BackStab" },
[261] = { name = L["Subtlety"], icon = "Interface\\Icons\\Ability_Stealth" },
}
},
SHAMAN = {
icon = "Interface\\Icons\\Spell_Nature_BloodLust",
specs = {
[262] = { name = L["Elemental"], icon = "Interface\\Icons\\Spell_Nature_Lightning" },
[263] = { name = L["Enhancement"], icon = "Interface\\Icons\\Spell_Nature_LightningShield" },
[264] = { name = L["Restoration"], icon = "Interface\\Icons\\Spell_Nature_MagicImmunity" },
}
},
WARLOCK = {
icon = "Interface\\Icons\\Spell_Nature_FaerieFire",
specs = {
[265] = { name = L["Affliction"], icon = "Interface\\Icons\\Spell_Shadow_DeathCoil" },
[266] = { name = L["Demonology"], icon = "Interface\\Icons\\Spell_Shadow_Metamorphosis" },
[267] = { name = L["Destruction"], icon = "Interface\\Icons\\Spell_Shadow_RainOfFire" },
}
},
WARRIOR = {
icon = "Interface\\Icons\\INV_Sword_27",
specs = {
[71] = { name = L["Arms"], icon = "Interface\\Icons\\Ability_Rogue_Eviscerate" },
[72] = { name = L["Fury"], icon = "Interface\\Icons\\Ability_Warrior_InnerRage" },
[73] = { name = L["Protection"], icon = "Interface\\Icons\\INV_Shield_06" },
}
},
}
-- Creates the options layout. Due to CUSTOM_CLASS_COLORS, it needs to be created dynamically.
local function createSpecString(class, specID)
local data = classData[class]
if not data then return "" end
local classIcon = data.icon or "Interface\\Icons\\INV_Misc_QuestionMark"
local specData = data.specs[specID] or { icon = "Interface\\Icons\\INV_Misc_QuestionMark", name = "Unknown" }
local color = WA_GetClassColor(class)
return ("|T%s:0|t |T%s:0|t |c%s%s|r"):format(classIcon, specData.icon, color, specData.name)
end
Private.spec_types_all = {}
Private.spec = {}
for class, data in pairs(classData) do
for specID in pairs(data.specs) do
Private.spec_types_all[specID] = createSpecString(class, specID)
end
end
wipe(classData)
end
Private.specid_to_icon = {
[250] = "Interface\\Icons\\Spell_Deathknight_BloodPresence",
[251] = "Interface\\Icons\\Spell_Deathknight_FrostPresence",
[252] = "Interface\\Icons\\Spell_Deathknight_UnholyPresence",
[102] = "Interface\\Icons\\Spell_Nature_StarFall",
[103] = "Interface\\Icons\\Ability_Racial_BearForm",
[104] = "Interface\\Icons\\Ability_Racial_BearForm",
[105] = "Interface\\Icons\\Spell_Nature_HealingTouch",
[253] = "Interface\\Icons\\Ability_Hunter_BeastTaming",
[254] = "Interface\\Icons\\Ability_Marksmanship",
[255] = "Interface\\Icons\\Ability_Hunter_SwiftStrike",
[62] = "Interface\\Icons\\Spell_Holy_MagicalSentry",
[63] = "Interface\\Icons\\Spell_Fire_FireBolt02",
[64] = "Interface\\Icons\\Spell_Frost_FrostBolt02",
[65] = "Interface\\Icons\\Spell_Holy_HolyBolt",
[66] = "Interface\\Icons\\Spell_Holy_DevotionAura",
[70] = "Interface\\Icons\\Spell_Holy_AuraOfLight",
[256] = "Interface\\Icons\\Spell_Holy_WordFortitude",
[257] = "Interface\\Icons\\Spell_Holy_GuardianSpirit",
[258] = "Interface\\Icons\\Spell_Shadow_ShadowWordPain",
[259] = "Interface\\Icons\\Ability_Rogue_Eviscerate",
[260] = "Interface\\Icons\\Ability_BackStab",
[261] = "Interface\\Icons\\Ability_Stealth",
[262] = "Interface\\Icons\\Spell_Nature_Lightning",
[263] = "Interface\\Icons\\Spell_Nature_LightningShield",
[264] = "Interface\\Icons\\Spell_Nature_MagicImmunity",
[265] = "Interface\\Icons\\Spell_Shadow_DeathCoil",
[266] = "Interface\\Icons\\Spell_Shadow_Metamorphosis",
[267] = "Interface\\Icons\\Spell_Shadow_RainOfFire",
[71] = "Interface\\Icons\\Ability_Rogue_Eviscerate",
[72] = "Interface\\Icons\\Ability_Warrior_InnerRage",
[73] = "Interface\\Icons\\INV_Shield_06",
}
Private.specname_to_id = {
["DEATHKNIGHT" .. L["Blood"]] = 250,
["DEATHKNIGHT" .. L["Frost"]] = 251,
["DEATHKNIGHT" .. L["Unholy"]] = 252,
["DRUID" .. L["Balance"]] = 102,
["DRUID" .. L["Feral Combat"]] = 103,
["DRUID" .. L["Guardian"]] = 104,
["DRUID" .. L["Restoration"]] = 105,
["HUNTER" .. L["Beast Mastery"]] = 253,
["HUNTER" .. L["Marksmanship"]] = 254,
["HUNTER" .. L["Survival"]] = 255,
["MAGE" .. L["Arcane"]] = 62,
["MAGE" .. L["Fire"]] = 63,
["MAGE" .. L["Frost"]] = 64,
["PALADIN" .. L["Holy"]] = 65,
["PALADIN" .. L["Protection"]] = 66,
["PALADIN" .. L["Retribution"]] = 70,
["PRIEST" .. L["Discipline"]] = 256,
["PRIEST" .. L["Holy"]] = 257,
["PRIEST" .. L["Shadow"]] = 258,
["ROGUE" .. L["Assassination"]] = 259,
["ROGUE" .. L["Combat"]] = 260,
["ROGUE" .. L["Subtlety"]] = 261,
["SHAMAN" .. L["Elemental"]] = 262,
["SHAMAN" .. L["Enhancement"]] = 263,
["SHAMAN" .. L["Restoration"]] = 264,
["WARLOCK" .. L["Affliction"]] = 265,
["WARLOCK" .. L["Demonology"]] = 266,
["WARLOCK" .. L["Destruction"]] = 267,
["WARRIOR" .. L["Arms"]] = 71,
["WARRIOR" .. L["Fury"]] = 72,
["WARRIOR" .. L["Protection"]] = 73,
}
Private.specid_to_name = {
[250] = "DEATHKNIGHT" .. L["Blood"],
[251] = "DEATHKNIGHT" .. L["Frost"],
[252] = "DEATHKNIGHT" .. L["Unholy"],
[102] = "DRUID" .. L["Balance"],
[103] = "DRUID" .. L["Feral Combat"],
[104] = "DRUID" .. L["Guardian"],
[105] = "DRUID" .. L["Restoration"],
[253] = "HUNTER" .. L["Beast Mastery"],
[254] = "HUNTER" .. L["Marksmanship"],
[255] = "HUNTER" .. L["Survival"],
[62] = "MAGE" .. L["Arcane"],
[63] = "MAGE" .. L["Fire"],
[64] = "MAGE" .. L["Frost"],
[65] = "PALADIN" .. L["Holy"],
[66] = "PALADIN" .. L["Protection"],
[70] = "PALADIN" .. L["Retribution"],
[256] = "PRIEST" .. L["Discipline"],
[257] = "PRIEST" .. L["Holy"],
[258] = "PRIEST" .. L["Shadow"],
[259] = "ROGUE" .. L["Assassination"],
[260] = "ROGUE" .. L["Combat"],
[261] = "ROGUE" .. L["Subtlety"],
[262] = "SHAMAN" .. L["Elemental"],
[263] = "SHAMAN" .. L["Enhancement"],
[264] = "SHAMAN" .. L["Restoration"],
[265] = "WARLOCK" .. L["Affliction"],
[266] = "WARLOCK" .. L["Demonology"],
[267] = "WARLOCK" .. L["Destruction"],
[71] = "WARRIOR" .. L["Arms"],
[72] = "WARRIOR" .. L["Fury"],
[73] = "WARRIOR" .. L["Protection"],
}
--[=[[ Old unused Talent List
Private.talents_ids = {
DEATHKNIGHT = {{48979,48997,49182,48978,49004,55107,48982,48987,49467,48985,49145,49015,48977,49006,49005,48988,53137,49027,49016,50365,62905,49018,55233,49189,55050,49023,61154,49028}, {49175,49455,49042,55061,49140,49226,50880,49039,51468,51123,49149,49137,49186,49471,49796,55610,49024,49188,50040,49203,50384,65661,54639,51271,49200,49143,50187,49202,49184}, {51745,48962,55129,49036,48963,49588,48965,49013,51459,49158,49146,49219,55620,49194,49220,49223,55666,49224,49208,52143,66799,51052,50391,63560,49032,49222,49217,51099,55090,50117,49206}},
DRUID = {{16814,57810,16845,35363,16821,16836,16880,57865,16819,16909,16850,33589,5570,57849,33597,16896,33592,24858,48384,33600,48389,33603,48516,50516,33831,48488,48506,48505}, {16934,16858,16947,16998,16929,17002,61336,16942,16966,16972,37116,48409,16940,49377,33872,57878,17003,33853,17007,34297,33851,57873,33859,48483,48492,33917,48532,48432,63503,50334}, {17050,17063,17056,17069,17118,16833,17106,16864,48411,24968,17111,17116,17104,17123,33879,17074,34151,18562,33881,33886,48496,48539,65139,48535,63410,51179,48438}},
HUNTER = {{19552,19583,35029,19549,19609,24443,19559,53265,19616,19572,19598,19578,19577,19590,34453,19621,34455,19574,34462,53252,34466,53262,34692,53256,56314,53270}, {19407,53620,19426,34482,19421,19485,34950,19454,19434,34948,19464,19416,35100,23989,19461,34475,19507,53234,19506,35104,34485,53228,53215,34490,53221,53241,53209}, {52783,19498,19159,19290,19184,19376,34494,19255,19503,19295,19286,56333,56342,56339,19370,19306,19168,34491,34500,19386,34497,34506,53295,53298,3674,53302,53290,53301}},
MAGE = {{11210,11222,11237,28574,29441,11213,11247,11242,44397,54646,11252,11255,18462,29447,31569,12043,11232,31574,15058,31571,31579,12042,44394,44378,31584,31589,44404,44400,35578,44425}, {11078,18459,11069,11119,54747,11108,11100,11103,11366,11083,11095,11094,29074,31638,11115,11113,31641,11124,34293,11129,31679,64353,31656,44442,31661,44445,44449,44457}, {11071,11070,31670,11207,11189,29438,11175,11151,12472,11185,16757,11160,11170,11958,11190,31667,55091,11180,44745,11426,31674,31682,44543,44546,31687,44557,44566,44572}},
PALADIN = {{20205,20224,20237,20257,9453,31821,20210,20234,20254,20244,53660,31822,20216,20359,31825,5923,31833,20473,31828,53551,31837,31842,53671,53569,53556,53563}, {63646,20262,31844,20174,20096,64205,20468,20143,53527,20487,20138,20911,20177,31848,20196,31785,20925,31850,20127,31858,53590,31935,53583,53709,53695,53595}, {20060,20101,25956,20335,20042,9452,20117,20375,26022,9799,32043,31866,20111,31869,20049,31871,53486,20066,31876,31879,53375,53379,35395,53501,53380,53385}},
PRIEST = {{14522,47586,14523,14747,14749,14531,14521,14751,14748,33167,14520,14750,33201,18551,63574,33186,34908,45234,10060,63504,57470,47535,47507,47509,33206,47516,52795,47540}, {14913,14908,14889,27900,18530,19236,27811,14892,27789,14912,14909,14911,20711,14901,33150,14898,34753,724,33142,64127,33158,63730,63534,34861,47558,47562,47788}, {15270,15337,15259,15318,15275,15260,15392,15273,15407,15274,17322,15257,15487,15286,27839,33213,14910,63625,15473,33221,47569,33191,64044,34914,47580,47573,47585}},
ROGUE = {{14162,14144,14138,14156,51632,13733,14983,14168,14128,16513,14113,31208,14177,14174,31244,14186,14158,51625,58426,31380,51634,31234,31226,1329,51627,51664,51662}, {13741,13732,13715,14165,13713,13705,13742,14251,13706,13754,13743,13712,18427,13709,13877,13960,30919,31124,31122,13750,31130,5952,35541,51672,32601,51682,51685,51690}, {14179,13958,14057,30892,14076,13975,13981,14278,14171,13983,13976,14079,30894,14185,14082,16511,31221,30902,31211,14183,31228,31216,51692,51698,36554,58414,51708,51713}},
SHAMAN = {{16039,16035,16038,28996,30160,16040,16164,16089,16086,29062,28999,16041,30664,30672,16578,16166,51483,63370,51466,30675,51474,30706,51480,62097,51490}, {16259,16043,17485,16258,16255,16262,16261,16266,43338,16254,16256,16252,29192,16268,51883,30802,29082,63373,30816,30798,17364,51525,60103,51521,30812,30823,51523,51528,51533}, {16182,16173,16184,29187,16179,16180,16181,55198,16176,16187,16194,29206,16188,30864,16178,30881,16190,51886,51554,30872,30867,51556,974,51560,51562,61295}},
WARLOCK = {{18827,18174,17810,18179,18213,18182,17804,53754,17783,18288,18218,18094,32381,32385,63108,18223,54037,18271,47195,30060,18220,30054,32477,47198,30108,58435,47201,48181}, {18692,18694,18697,47230,18703,18705,18731,18754,19028,18708,30143,18769,18709,30326,18767,23785,47245,30319,47193,35691,30242,63156,54347,30146,63117,47236,59672}, {17793,17788,18119,63349,17778,18126,17877,17959,18135,17917,17927,34935,17815,18130,30299,17954,17962,30293,18096,30288,54117,47258,30283,47220,47266,50796}},
WARRIOR = {{12282,16462,12286,12285,12300,12295,12290,12296,16493,12834,12163,56636,12700,12328,12284,12281,20504,12289,46854,29834,12294,46865,12862,64976,35446,46859,29723,29623,29836,46867,46924}, {61216,12321,12320,12324,12322,12329,12323,16487,12318,23584,20502,12317,29590,12292,29888,20500,12319,46908,23881,29721,46910,29759,60970,29801,46913,56927,46917}, {12301,12298,12287,50685,12297,12975,12797,29598,12299,59088,12313,12308,12312,12809,12311,16538,29593,50720,29787,29140,46945,57499,20243,47294,46951,58872,46968}}
}
]]=]