5.20.0
This commit is contained in:
+31
-29
@@ -2811,55 +2811,55 @@ function BuffTrigger.GetAdditionalProperties(data, triggernum)
|
||||
local trigger = data.triggers[triggernum].trigger
|
||||
local props = {}
|
||||
|
||||
props["spellId"] = L["Spell ID"]
|
||||
props["debuffClass"] = L["Debuff Class"]
|
||||
props["debuffClassIcon"] = L["Debuff Class Icon"]
|
||||
props["unitCaster"] = L["Caster Unit"]
|
||||
props["casterName"] = L["Caster Name"]
|
||||
props["spellId"] = { display = L["Spell ID"] }
|
||||
props["debuffClass"] = { display = L["Debuff Class"] }
|
||||
props["debuffClassIcon"] = { display = L["Debuff Class Icon"] }
|
||||
props["unitCaster"] = { display = L["Caster Unit"], formatter = "Unit", formatterArgs = { color = "class" } }
|
||||
props["casterName"] = { display = L["Caster Name"], formatter = "string" }
|
||||
|
||||
if trigger.unit ~= "multi" then
|
||||
props["unit"] = L["Unit"]
|
||||
props["unit"] = { display = L["Unit"], formatter = "Unit", formatterArgs = { color = "class" } }
|
||||
props["unitName"] = { display = L["Unit Name"] }
|
||||
end
|
||||
|
||||
props["unitName"] = L["Unit Name"]
|
||||
props["matchCount"] = L["Match Count"]
|
||||
props["matchCountPerUnit"] = L["Match Count per Unit"]
|
||||
props["unitCount"] = L["Units Affected"]
|
||||
props["totalStacks"] = L["Total stacks over all matches"]
|
||||
props["matchCount"] = { display = L["Match Count"] }
|
||||
props["matchCountPerUnit"] = { display = L["Match Count per Unit"] }
|
||||
props["unitCount"] = { display = L["Units Affected"] }
|
||||
props["totalStacks"] = { display = L["Total stacks over all matches"] }
|
||||
|
||||
if trigger.unit ~= "multi" then
|
||||
props["maxUnitCount"] = L["Total Units"]
|
||||
props["maxUnitCount"] = { display = L["Total Units"] }
|
||||
end
|
||||
|
||||
if not IsSingleMissing(trigger) and trigger.unit ~= "multi" and trigger.fetchTooltip then
|
||||
props["tooltip"] = L["Tooltip"]
|
||||
props["tooltip1"] = L["First Value of Tooltip Text"]
|
||||
props["tooltip2"] = L["Second Value of Tooltip Text"]
|
||||
props["tooltip3"] = L["Third Value of Tooltip Text"]
|
||||
props["tooltip4"] = L["Fourth Value of Tooltip Text"]
|
||||
props["tooltip"] = { display = L["Tooltip"], formatter = "string" }
|
||||
props["tooltip1"] = { display = L["First Value of Tooltip Text"] }
|
||||
props["tooltip2"] = { display = L["Second Value of Tooltip Text"] }
|
||||
props["tooltip3"] = { display = L["Third Value of Tooltip Text"] }
|
||||
props["tooltip4"] = { display = L["Fourth Value of Tooltip Text"] }
|
||||
end
|
||||
|
||||
if trigger.unit ~= "multi" then
|
||||
props["stackGainTime"] = L["Since Stack Gain"]
|
||||
props["stackLostTime"] = L["Since Stack Lost"]
|
||||
props["initialTime"] = L["Since Apply"]
|
||||
props["refreshTime"] = L["Since Apply/Refresh"]
|
||||
props["stackGainTime"] = { display = L["Since Stack Gain"], formatter = "timed" }
|
||||
props["stackLostTime"] = { display = L["Since Stack Lost"], formatter = "timed" }
|
||||
props["initialTime"] = { display = L["Since Apply"], formatter = "timed" }
|
||||
props["refreshTime"] = { display = L["Since Apply/Refresh"], formatter = "timed" }
|
||||
end
|
||||
|
||||
if trigger.unit ~= "multi" and trigger.fetchRole then
|
||||
props["role"] = L["Assigned Role"]
|
||||
props["roleIcon"] = L["Assigned Role Icon"]
|
||||
props["role"] = { display = L["Assigned Role"] }
|
||||
props["roleIcon"] = { display = L["Assigned Role Icon"] }
|
||||
end
|
||||
|
||||
if trigger.unit ~= "multi" and trigger.fetchRaidMark then
|
||||
props["raidMark"] = L["Raid Mark"]
|
||||
props["raidMark"] = { display = L["Raid Mark"] }
|
||||
end
|
||||
|
||||
if (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.useAffected then
|
||||
props["affected"] = L["Names of affected Players"]
|
||||
props["unaffected"] = L["Names of unaffected Players"]
|
||||
props["affectedUnits"] = L["Units of affected Players in a table format"]
|
||||
props["unaffectedUnits"] = L["Units of unaffected Players in a table format"]
|
||||
props["affected"] = { display = L["Names of affected Players"], formatter = "string" }
|
||||
props["unaffected"] = { display = L["Names of unaffected Players"], formatter = "string" }
|
||||
props["affectedUnits"] = { display = L["Units of affected Players in a table format"]}
|
||||
props["unaffectedUnits"] = { display = L["Units of unaffected Players in a table format"] }
|
||||
end
|
||||
|
||||
return props
|
||||
@@ -2968,7 +2968,9 @@ function BuffTrigger.GetTriggerConditions(data, triggernum)
|
||||
|
||||
result["unitCaster"] = {
|
||||
display = L["Caster Unit"],
|
||||
type = "string"
|
||||
type = "unit",
|
||||
formatter = "Unit",
|
||||
formatterArgs = { color = "class" }
|
||||
}
|
||||
|
||||
result["nameCaster"] = {
|
||||
|
||||
@@ -17,7 +17,6 @@ Private.DiscordList = {
|
||||
[=[Chab]=],
|
||||
[=[Darian]=],
|
||||
[=[Desik]=],
|
||||
[=[DjinnFish]=],
|
||||
[=[Dodgen]=],
|
||||
[=[exality]=],
|
||||
[=[Fatpala]=],
|
||||
@@ -27,11 +26,11 @@ Private.DiscordList = {
|
||||
[=[Fx]=],
|
||||
[=[Guffin]=],
|
||||
[=[Ifor]=],
|
||||
[=[Ipwnturkeys]=],
|
||||
[=[Ironi]=],
|
||||
[=[Jiberish]=],
|
||||
[=[Jods]=],
|
||||
[=[kanegasi]=],
|
||||
[=[Korvus]=],
|
||||
[=[Koxy]=],
|
||||
[=[Krazyito]=],
|
||||
[=[Listefano]=],
|
||||
@@ -46,14 +45,14 @@ Private.DiscordList = {
|
||||
[=[Nona]=],
|
||||
[=[NostraDumAzz]=],
|
||||
[=[Oi]=],
|
||||
[=[opti]=],
|
||||
[=[Ora]=],
|
||||
[=[phoenix7700]=],
|
||||
[=[Photoshoot]=],
|
||||
[=[pit]=],
|
||||
[=[Putro]=],
|
||||
[=[reggie]=],
|
||||
[=[Reloe]=],
|
||||
[=[Saaggs]=],
|
||||
[=[Sammy]=],
|
||||
[=[Spaten]=],
|
||||
[=[Tel]=],
|
||||
[=[Translit]=],
|
||||
@@ -61,6 +60,7 @@ Private.DiscordList = {
|
||||
[=[vozochris]=],
|
||||
[=[Wizeowel]=],
|
||||
[=[Xepheris]=],
|
||||
[=[Zeus]=],
|
||||
}
|
||||
Private.DiscordListCJ = {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
local AddonName = ...
|
||||
local Private = select(2, ...)
|
||||
|
||||
-- BuildTypes "dev" | "pr" | "alpha" | "beta" | "release"
|
||||
|
||||
local Features = {
|
||||
__feats = {},
|
||||
hydrated = false,
|
||||
}
|
||||
Private.Features = Features
|
||||
|
||||
|
||||
function Features:Exists(id)
|
||||
return self.__feats[id] ~= nil
|
||||
end
|
||||
|
||||
function Features:Enabled(id)
|
||||
return self.hydrated and self:Exists(id) and self.__feats[id].enabled
|
||||
end
|
||||
|
||||
function Features:Enable(id)
|
||||
if not self:Exists(id) then return end
|
||||
if not self.hydrated then
|
||||
error("Cannot enable a feature before hydration", 2)
|
||||
elseif not self.__feats[id].enabled then
|
||||
self.__feats[id].enabled = true
|
||||
if self.__feats[id].persist then
|
||||
self.db[id] = true
|
||||
end
|
||||
self.__feats[id].sub:Notify("Enable")
|
||||
end
|
||||
end
|
||||
|
||||
function Features:Disable(id)
|
||||
if not self:Exists(id) then return end
|
||||
if not self.hydrated then
|
||||
error("Cannot disable a feature before hydration", 2)
|
||||
elseif self.__feats[id].enabled then
|
||||
self.__feats[id].enabled = false
|
||||
if self.__feats[id].persist then
|
||||
self.db[id] = false
|
||||
end
|
||||
self.__feats[id].sub:Notify("Disable")
|
||||
end
|
||||
end
|
||||
|
||||
function Features:ListFeatures()
|
||||
if not self.hydrated then return {} end
|
||||
local list = {}
|
||||
for id, feature in pairs(self.__feats) do
|
||||
table.insert(list, {
|
||||
id = id,
|
||||
enabled = feature.enabled
|
||||
})
|
||||
end
|
||||
table.sort(list, function(a, b)
|
||||
return a.id < b.id
|
||||
end)
|
||||
return list
|
||||
end
|
||||
|
||||
function Features:Hydrate()
|
||||
self.db = Private.db.features
|
||||
for id, feature in pairs(self.__feats) do
|
||||
local enable = false
|
||||
if self.db[id] ~= nil then
|
||||
enable = self.db[id]
|
||||
else
|
||||
for _, buildType in ipairs(feature.autoEnable or {}) do
|
||||
if WeakAuras.buildType == buildType then
|
||||
enable = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
feature.enabled = enable
|
||||
end
|
||||
self.hydrated = true
|
||||
for _, feature in pairs(self.__feats) do
|
||||
-- cannot notify before hydrated flag is set, or we risk consumers getting wrong information
|
||||
feature.sub:Notify(feature.enabled and "Enable" or "Disable")
|
||||
end
|
||||
end
|
||||
|
||||
function Features:Register(feature)
|
||||
if self.hydrated then
|
||||
error("Cannot register a feature after hydration", 2)
|
||||
end
|
||||
if not self.__feats[feature.id] then
|
||||
self.__feats[feature.id] = feature
|
||||
feature.sub = Private.CreateSubscribableObject()
|
||||
end
|
||||
end
|
||||
|
||||
---hide a code path behind a feature flag,
|
||||
---optionally provide a disabled path
|
||||
function Features:Wrap(id, enabledFunc, disabledFunc)
|
||||
return function(...)
|
||||
if self:Enabled(id) then
|
||||
return enabledFunc(...)
|
||||
else
|
||||
if disabledFunc then
|
||||
return disabledFunc(...)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Features:AuraCanFunction(data)
|
||||
local enabled = true
|
||||
local reasons = {}
|
||||
|
||||
for _, feature in pairs(self.__feats) do
|
||||
if feature.requiredByAura and not feature:requiredByAura(data) then
|
||||
enabled = false
|
||||
reasons[feature.id] = false
|
||||
end
|
||||
end
|
||||
|
||||
return enabled, reasons
|
||||
end
|
||||
|
||||
function Features:Subscribe(id, enable, disable)
|
||||
local tbl = {
|
||||
Enable = enable,
|
||||
Disable = disable
|
||||
}
|
||||
if self:Exists(id) then
|
||||
self.__feats[id].sub:AddSubscriber("Enable", tbl)
|
||||
self.__feats[id].sub:AddSubscriber("Disable", tbl)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Features:Register({
|
||||
id = "debug",
|
||||
autoEnable = {"dev"}
|
||||
})
|
||||
|
||||
|
||||
Private.DebugPrint = Features:Wrap("debug", function(...)
|
||||
print("|cff00d3ffWeakAuras-Debug:|r ", ...)
|
||||
end)
|
||||
@@ -4114,7 +4114,17 @@ function GenericTrigger.GetAdditionalProperties(data, triggernum)
|
||||
enable = v.enable
|
||||
end
|
||||
if (enable and v.store and v.name and v.display and v.conditionType ~= "bool") then
|
||||
props[v.name] = v.display
|
||||
local formatter = v.formatter
|
||||
local formatterArgs = v.formatterArgs or {}
|
||||
if not formatter then
|
||||
if v.type == "unit" then
|
||||
formatter = "Unit"
|
||||
formatterArgs = { color = "class" }
|
||||
elseif v.type == "string" then
|
||||
formatter = "string"
|
||||
end
|
||||
end
|
||||
props[v.name] = { display = v.display, formatter = formatter, formatterArgs = formatterArgs }
|
||||
end
|
||||
end
|
||||
if prototype.countEvents then
|
||||
@@ -4126,7 +4136,7 @@ function GenericTrigger.GetAdditionalProperties(data, triggernum)
|
||||
if (type(variables) == "table") then
|
||||
for var, varData in pairs(variables) do
|
||||
if (type(varData) == "table") then
|
||||
props[var] = varData.display or var
|
||||
props[var] = { display = varData.display or var, formatter = varData.formatter, formatterArgs = varData.formatterArgs }
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -4172,6 +4182,7 @@ local commonConditions = {
|
||||
duration = {
|
||||
display = L["Total Duration"],
|
||||
type = "number",
|
||||
formatter = "Number",
|
||||
},
|
||||
paused = {
|
||||
display =L["Is Paused"],
|
||||
@@ -4191,7 +4202,8 @@ local commonConditions = {
|
||||
},
|
||||
stacks = {
|
||||
display = L["Stacks"],
|
||||
type = "number"
|
||||
type = "number",
|
||||
formatter = "Number",
|
||||
},
|
||||
name = {
|
||||
display = L["Name"],
|
||||
@@ -4308,7 +4320,7 @@ function GenericTrigger.GetTriggerConditions(data, triggernum)
|
||||
if (enable) then
|
||||
result[v.name] = {
|
||||
display = v.display,
|
||||
type = v.conditionType
|
||||
type = v.conditionType,
|
||||
}
|
||||
if (result[v.name].type == "select" or result[v.name].type == "unit") then
|
||||
if (v.conditionValues) then
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@ WeakAuras.halfWidth = WeakAuras.normalWidth / 2
|
||||
WeakAuras.doubleWidth = WeakAuras.normalWidth * 2
|
||||
|
||||
local versionStringFromToc = GetAddOnMetadata("WeakAuras", "Version")
|
||||
local versionString = "5.19.12 Beta"
|
||||
local buildTime = "20250618195500"
|
||||
local versionString = "5.20.0 Beta"
|
||||
local buildTime = "20250721200906"
|
||||
local isAwesomeEnabled = C_NamePlate and C_NamePlate.GetNamePlateForUnit and true or false
|
||||
|
||||
local flavor
|
||||
|
||||
@@ -1049,10 +1049,10 @@ L["Install the addons BugSack and BugGrabber for detailed error logs."] = "Insta
|
||||
L["Instance"] = "Instanz"
|
||||
L["Instance Difficulty"] = "Instanzschwierigkeit"
|
||||
--[[Translation missing --]]
|
||||
L["Instance ID"] = "Instance ID"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Id"] = "Instance Id"
|
||||
--[[Translation missing --]]
|
||||
L["Instance ID"] = "Instance ID"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Info"] = "Instance Info"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Name"] = "Instance Name"
|
||||
@@ -1619,9 +1619,9 @@ L["Progress Total"] = "Totaler Fortschritt"
|
||||
L["Progress Value"] = "Fortschrittswert"
|
||||
L["Pulse"] = "Pulsieren"
|
||||
L["PvP Flagged"] = "PvP aktiv"
|
||||
L["PvP Talent selected"] = "Gewähltes PvP-Talent"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
L["PvP Talent selected"] = "Gewähltes PvP-Talent"
|
||||
--[[Translation missing --]]
|
||||
L["Quality Id"] = "Quality Id"
|
||||
--[[Translation missing --]]
|
||||
@@ -1970,6 +1970,8 @@ L["Stage"] = "Stage"
|
||||
--[[Translation missing --]]
|
||||
L["Stage Counter"] = "Stage Counter"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger"] = "Stagger"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger (%)"] = "Stagger (%)"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger against Target (%)"] = "Stagger against Target (%)"
|
||||
@@ -2059,8 +2061,8 @@ L["Talent |cFFFF0000Not|r Known"] = "Talent |cFFFF0000Not|r Known"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "Talent |cFFFF0000Not|r Selected"
|
||||
--[[Translation missing --]]
|
||||
L["Talent Known"] = "Talent Known"
|
||||
L["Talent selected"] = "Gewähltes Talent"
|
||||
L["Talent Selected"] = "Talent gewählt"
|
||||
L["Talent selected"] = "Gewähltes Talent"
|
||||
L["Talent Specialization"] = "Talentspezialisierung"
|
||||
L["Tanking And Highest"] = "Höchster und Aggro"
|
||||
L["Tanking But Not Highest"] = "Aggro aber nicht höchste"
|
||||
|
||||
@@ -654,8 +654,8 @@ L["Hybrid"] = "Hybrid"
|
||||
L["Icon"] = "Icon"
|
||||
L["Icon Function"] = "Icon Function"
|
||||
L["Icon Function (fallback state)"] = "Icon Function (fallback state)"
|
||||
L["ID"] = "ID"
|
||||
L["Id"] = "Id"
|
||||
L["ID"] = "ID"
|
||||
L["If you require additional assistance, please open a ticket on GitHub or visit our Discord at https://discord.gg/weakauras!"] = "If you require additional assistance, please open a ticket on GitHub or visit our Discord at https://discord.gg/weakauras!"
|
||||
L["Ignore Dead"] = "Ignore Dead"
|
||||
L["Ignore Disconnected"] = "Ignore Disconnected"
|
||||
@@ -805,8 +805,8 @@ Intermissions are .5
|
||||
E.g. 1;2;1;2;2.5;3]=] ] = [=[Matches stage number of encounter journal.
|
||||
Intermissions are .5
|
||||
E.g. 1;2;1;2;2.5;3]=]
|
||||
L["Max Char"] = "Max Char"
|
||||
L["Max Char "] = "Max Char "
|
||||
L["Max Char"] = "Max Char"
|
||||
L["Max Charges"] = "Max Charges"
|
||||
L["Max Health"] = "Max Health"
|
||||
L["Max Power"] = "Max Power"
|
||||
@@ -1070,8 +1070,8 @@ L["Progress Total"] = "Progress Total"
|
||||
L["Progress Value"] = "Progress Value"
|
||||
L["Pulse"] = "Pulse"
|
||||
L["PvP Flagged"] = "PvP Flagged"
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
L["PvP Talent selected"] = "PvP Talent selected"
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
L["Quality Id"] = "Quality Id"
|
||||
L["Quantity"] = "Quantity"
|
||||
L["Quantity earned this week"] = "Quantity earned this week"
|
||||
@@ -1288,6 +1288,7 @@ L["Stacks Function"] = "Stacks Function"
|
||||
L["Stacks Function (fallback state)"] = "Stacks Function (fallback state)"
|
||||
L["Stage"] = "Stage"
|
||||
L["Stage Counter"] = "Stage Counter"
|
||||
L["Stagger"] = "Stagger"
|
||||
L["Stagger (%)"] = "Stagger (%)"
|
||||
L["Stagger against Target (%)"] = "Stagger against Target (%)"
|
||||
L["Stagger Scale"] = "Stagger Scale"
|
||||
|
||||
@@ -1016,8 +1016,8 @@ L["Progress Total"] = "Progreso total"
|
||||
L["Progress Value"] = "Valor de progreso"
|
||||
L["Pulse"] = "Pulso"
|
||||
L["PvP Flagged"] = "Marcado JcJ"
|
||||
L["PvP Talent Selected"] = "Talento de JcJ seleccionado"
|
||||
L["PvP Talent selected"] = "Talento de JcJ seleccionado"
|
||||
L["PvP Talent Selected"] = "Talento de JcJ seleccionado"
|
||||
L["Quality Id"] = "ID de calidad"
|
||||
L["Quantity"] = "Cantidad"
|
||||
L["Quantity earned this week"] = "Cantidad ganada esta semana"
|
||||
@@ -1233,6 +1233,7 @@ L["Stacks Function"] = "Función de acumulaciones"
|
||||
L["Stacks Function (fallback state)"] = "Función de acumulaciones (estado reserva)"
|
||||
L["Stage"] = "Etapa"
|
||||
L["Stage Counter"] = "Contador de etapa"
|
||||
L["Stagger"] = "Escalonar"
|
||||
L["Stagger (%)"] = "Tambalear (%)"
|
||||
L["Stagger against Target (%)"] = "Tambalearse contra el objetivo (%)"
|
||||
L["Stagger Scale"] = "Escala escalonada"
|
||||
@@ -1283,8 +1284,8 @@ L["Talent"] = "Talento"
|
||||
L["Talent |cFFFF0000Not|r Known"] = "Talento |cFFFF0000desconocido|r"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "Talento |cFFFF0000no|r seleccionado"
|
||||
L["Talent Known"] = "Talento conocido"
|
||||
L["Talent selected"] = "Talento seleccionado"
|
||||
L["Talent Selected"] = "Talento seleccionado"
|
||||
L["Talent selected"] = "Talento seleccionado"
|
||||
L["Talent Specialization"] = "Especialización de Talentos"
|
||||
L["Tanking And Highest"] = "Tanqueando y el más alto"
|
||||
L["Tanking But Not Highest"] = "Tanqueando pero no el mas alto"
|
||||
|
||||
@@ -675,8 +675,8 @@ L["Instakill"] = "Muerte Instantanea"
|
||||
L["Install the addons BugSack and BugGrabber for detailed error logs."] = "Instala los addons BugSack y BugGrabber para obtener registros de errores detallados."
|
||||
L["Instance"] = "Instancia"
|
||||
L["Instance Difficulty"] = "Dificultad de la instancia"
|
||||
L["Instance ID"] = "ID de estancia"
|
||||
L["Instance Id"] = "ID de estancia"
|
||||
L["Instance ID"] = "ID de estancia"
|
||||
L["Instance Info"] = "Info de estancia"
|
||||
L["Instance Name"] = "Nombre de estancia"
|
||||
L["Instance Size Type"] = "Tipo de tamaño de estancia"
|
||||
@@ -787,8 +787,8 @@ L["Matches (Pattern)"] = "Corresponde (Patrón)"
|
||||
L[ [=[Matches stage number of encounter journal.
|
||||
Intermissions are .5
|
||||
E.g. 1;2;1;2;2.5;3]=] ] = "Coincide con el número de etapa del diario de encuentros. Los intermedios son .5 Por ej. 1;2;1;2;2.5;3"
|
||||
L["Max Char"] = "Carácter máximo"
|
||||
L["Max Char "] = "Caracteres máx."
|
||||
L["Max Char"] = "Carácter máximo"
|
||||
L["Max Charges"] = "Cargas máx."
|
||||
L["Max Health"] = "Salud máx."
|
||||
L["Max Power"] = "Poder máx."
|
||||
@@ -1017,8 +1017,8 @@ L["Progress Total"] = "Progreso total"
|
||||
L["Progress Value"] = "Valor de progreso"
|
||||
L["Pulse"] = "Pulso"
|
||||
L["PvP Flagged"] = "Marcado JcJ"
|
||||
L["PvP Talent Selected"] = "Talento de JcJ seleccionado"
|
||||
L["PvP Talent selected"] = "Talento de JcJ seleccionado"
|
||||
L["PvP Talent Selected"] = "Talento de JcJ seleccionado"
|
||||
L["Quality Id"] = "ID de calidad"
|
||||
L["Quantity"] = "Cantidad"
|
||||
L["Quantity earned this week"] = "Cantidad ganada esta semana"
|
||||
@@ -1234,6 +1234,7 @@ L["Stacks Function"] = "Función de acumulaciones"
|
||||
L["Stacks Function (fallback state)"] = "Función de acumulaciones (estado reserva)"
|
||||
L["Stage"] = "Etapa"
|
||||
L["Stage Counter"] = "Contador de etapa"
|
||||
L["Stagger"] = "Escalonar"
|
||||
L["Stagger (%)"] = "Tambalear (%)"
|
||||
L["Stagger against Target (%)"] = "Tambalearse contra el objetivo (%)"
|
||||
L["Stagger Scale"] = "Escala escalonada"
|
||||
@@ -1284,8 +1285,8 @@ L["Talent"] = "Talento"
|
||||
L["Talent |cFFFF0000Not|r Known"] = "Talento |cFFFF0000desconocido|r"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "Talento |cFFFF0000no|r seleccionado"
|
||||
L["Talent Known"] = "Talento conocido"
|
||||
L["Talent selected"] = "Talento seleccionado"
|
||||
L["Talent Selected"] = "Talento seleccionado"
|
||||
L["Talent selected"] = "Talento seleccionado"
|
||||
L["Talent Specialization"] = "Especialización de Talentos"
|
||||
L["Tanking And Highest"] = "Tanqueando y el más alto"
|
||||
L["Tanking But Not Highest"] = "Tanqueando pero no el mas alto"
|
||||
|
||||
@@ -1424,9 +1424,9 @@ L["Progress Total"] = "Progrès Total"
|
||||
L["Progress Value"] = "Valeur de progression"
|
||||
L["Pulse"] = "Pulsation"
|
||||
L["PvP Flagged"] = "JcJ activé"
|
||||
L["PvP Talent selected"] = "Talent JcJ sélectionné"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
L["PvP Talent selected"] = "Talent JcJ sélectionné"
|
||||
--[[Translation missing --]]
|
||||
L["Quality Id"] = "Quality Id"
|
||||
--[[Translation missing --]]
|
||||
@@ -1741,6 +1741,8 @@ L["Stage"] = "Stage"
|
||||
--[[Translation missing --]]
|
||||
L["Stage Counter"] = "Stage Counter"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger"] = "Stagger"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger (%)"] = "Stagger (%)"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger against Target (%)"] = "Stagger against Target (%)"
|
||||
@@ -1823,8 +1825,8 @@ L["Talent |cFFFF0000Not|r Known"] = "Talent |cFFFF0000Not|r Known"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "Talent |cFFFF0000Not|r Selected"
|
||||
--[[Translation missing --]]
|
||||
L["Talent Known"] = "Talent Known"
|
||||
L["Talent selected"] = "Talent sélectionné"
|
||||
L["Talent Selected"] = "Talent sélectionné"
|
||||
L["Talent selected"] = "Talent sélectionné"
|
||||
L["Talent Specialization"] = "Spécialisation"
|
||||
L["Tanking And Highest"] = "Tank et le plus haut"
|
||||
L["Tanking But Not Highest"] = "Tank mais pas le plus haut"
|
||||
|
||||
@@ -1078,10 +1078,10 @@ L["Instance"] = "Instance"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Difficulty"] = "Instance Difficulty"
|
||||
--[[Translation missing --]]
|
||||
L["Instance ID"] = "Instance ID"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Id"] = "Instance Id"
|
||||
--[[Translation missing --]]
|
||||
L["Instance ID"] = "Instance ID"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Info"] = "Instance Info"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Name"] = "Instance Name"
|
||||
@@ -1762,10 +1762,10 @@ L["Pulse"] = "Pulse"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Flagged"] = "PvP Flagged"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent selected"] = "PvP Talent selected"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
--[[Translation missing --]]
|
||||
L["Quality Id"] = "Quality Id"
|
||||
--[[Translation missing --]]
|
||||
L["Quantity"] = "Quantity"
|
||||
@@ -2196,6 +2196,8 @@ L["Stage"] = "Stage"
|
||||
--[[Translation missing --]]
|
||||
L["Stage Counter"] = "Stage Counter"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger"] = "Stagger"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger (%)"] = "Stagger (%)"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger against Target (%)"] = "Stagger against Target (%)"
|
||||
|
||||
@@ -108,7 +108,7 @@ L["Alert Type"] = "경보 종류"
|
||||
L["Alive"] = "생존"
|
||||
L["All"] = "모두"
|
||||
L["All children of this aura will also not be loaded, to minimize the chance of further corruption."] = "이 위크오라의 모든 자식 위크오라도 불러오지 않을 것입니다. 오염 가능성을 최소화하기 위함입니다."
|
||||
L["All States table contains a non table at key: '%s'."] = "All States 테이블의 키에 테이블이 아닌 데이터가 있습니다: '%s'."
|
||||
L["All States table contains a non table at key: '%s'."] = "All States 테이블 키 중 테이블에 속하지 않은 것이 있습니다: '%s'"
|
||||
L["All Triggers"] = "활성 조건 전부 발동"
|
||||
L["Alliance"] = "얼라이언스"
|
||||
L["Allow partial matches"] = "부분 일치 허용"
|
||||
@@ -300,7 +300,7 @@ L["Charging"] = "충전중"
|
||||
L["Chat Frame"] = "대화창"
|
||||
L["Chat Message"] = "대화 메시지"
|
||||
L["Check if a single talent match a Rank"] = "단일 특성이 등급과 일치하는지 확인"
|
||||
L["Check nameplate's target every 0.2s"] = "0.2초마다 이름표의 대상 확인"
|
||||
L["Check nameplate's target every 0.2s"] = "0.2초마다 이름표의 대상을 확인합니다"
|
||||
L["Chromaggus"] = "크로마구스"
|
||||
L["Circle"] = "동그라미"
|
||||
L["Circular Texture"] = "테두리 텍스처"
|
||||
@@ -675,7 +675,7 @@ L["In Group"] = "그룹 상태"
|
||||
L["In Party"] = "파티"
|
||||
L["In Pet Battle"] = "애완동물 대전 중"
|
||||
L["In Raid"] = "공격대"
|
||||
L["In Range"] = "유효 거리 범위"
|
||||
L["In Range"] = "유효 거리 이내"
|
||||
L["In Vehicle"] = "차량 탑승 중"
|
||||
L["In War Mode"] = "전쟁 모드"
|
||||
L["Include Bank"] = "은행 포함"
|
||||
@@ -805,8 +805,8 @@ L["Matches (Pattern)"] = "일치 (패턴)"
|
||||
L[ [=[Matches stage number of encounter journal.
|
||||
Intermissions are .5
|
||||
E.g. 1;2;1;2;2.5;3]=] ] = "던전 도감의 단계 번호를 기준으로 맞춥니다. 사잇단계는 .5가 됩니다. 예를 들면 1;2;1;2;2.5;3"
|
||||
L["Max Char"] = "최대 글자 수"
|
||||
L["Max Char "] = "최대 글자 수"
|
||||
L["Max Char"] = "최대 글자 수"
|
||||
L["Max Charges"] = "최대 충전량"
|
||||
L["Max Health"] = "최대 생명력"
|
||||
L["Max Power"] = "최대 자원"
|
||||
@@ -1070,8 +1070,8 @@ L["Progress Total"] = "진행 현황"
|
||||
L["Progress Value"] = "진행도 값"
|
||||
L["Pulse"] = "맥박"
|
||||
L["PvP Flagged"] = "플레이어 간 전투 활성화"
|
||||
L["PvP Talent Selected"] = "선택한 PvP 특성"
|
||||
L["PvP Talent selected"] = "선택한 PvP 특성"
|
||||
L["PvP Talent Selected"] = "선택한 PvP 특성"
|
||||
L["Quality Id"] = "품질 Id"
|
||||
L["Quantity"] = "수량"
|
||||
L["Quantity earned this week"] = "이번주 획득량"
|
||||
@@ -1128,7 +1128,7 @@ L["Requested display does not exist"] = "요청한 디스플레이가 존재하
|
||||
L["Requested display not authorized"] = "요청한 디스플레이가 올바르지 않습니다"
|
||||
L["Requesting display information from %s ..."] = "%s|1이;가; 디스플레이 정보를 요청 중입니다 ..."
|
||||
L["Require Valid Target"] = "유효한 대상 필요"
|
||||
L["Requires syncing the specialization via LibSpecialization."] = "LibSpecialization을 통한 전문화 동기화를 요구합니다."
|
||||
L["Requires syncing the specialization via LibSpecialization."] = "전문화 동기화를 위해 LibSpecialization이 필요합니다."
|
||||
L["Resilience (%)"] = "탄력 (%)"
|
||||
L["Resilience Rating"] = "탄력도 수치"
|
||||
L["Resist"] = "저항"
|
||||
@@ -1288,6 +1288,7 @@ L["Stacks Function"] = "중첩 함수"
|
||||
L["Stacks Function (fallback state)"] = "Stacks 함수 (고장 대체 상태)"
|
||||
L["Stage"] = "단계"
|
||||
L["Stage Counter"] = "단계 카운터"
|
||||
L["Stagger"] = "시간차"
|
||||
L["Stagger (%)"] = "시간차 (%)"
|
||||
L["Stagger against Target (%)"] = "대상에 대한 시간차 (%)"
|
||||
L["Stagger Scale"] = "단계적 비율 조정"
|
||||
@@ -1338,8 +1339,8 @@ L["Talent"] = "특성"
|
||||
L["Talent |cFFFF0000Not|r Known"] = "습득하지 |cFFFF0000않은|r 특성"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "선택하지 |cFFFF0000않은|r 특성"
|
||||
L["Talent Known"] = "습득한 특성"
|
||||
L["Talent selected"] = "선택한 특성"
|
||||
L["Talent Selected"] = "선택한 특성"
|
||||
L["Talent selected"] = "선택한 특성"
|
||||
L["Talent Specialization"] = "특성 전문화"
|
||||
L["Tanking And Highest"] = "탱커이면서 제일 높을 때"
|
||||
L["Tanking But Not Highest"] = "탱커지만 제일 높지 않을 때"
|
||||
|
||||
@@ -1142,10 +1142,10 @@ L["Install the addons BugSack and BugGrabber for detailed error logs."] = "Insta
|
||||
L["Instance"] = "Instance"
|
||||
L["Instance Difficulty"] = "Dificuldade da Instância"
|
||||
--[[Translation missing --]]
|
||||
L["Instance ID"] = "Instance ID"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Id"] = "Instance Id"
|
||||
--[[Translation missing --]]
|
||||
L["Instance ID"] = "Instance ID"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Info"] = "Instance Info"
|
||||
--[[Translation missing --]]
|
||||
L["Instance Name"] = "Instance Name"
|
||||
@@ -1773,10 +1773,10 @@ L["Progress Value"] = "Progress Value"
|
||||
L["Pulse"] = "Pulsar"
|
||||
L["PvP Flagged"] = "Marcado para JxJ"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent selected"] = "PvP Talent selected"
|
||||
--[[Translation missing --]]
|
||||
L["PvP Talent Selected"] = "PvP Talent Selected"
|
||||
--[[Translation missing --]]
|
||||
L["Quality Id"] = "Quality Id"
|
||||
--[[Translation missing --]]
|
||||
L["Quantity"] = "Quantity"
|
||||
@@ -2158,6 +2158,8 @@ L["Stage"] = "Stage"
|
||||
--[[Translation missing --]]
|
||||
L["Stage Counter"] = "Stage Counter"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger"] = "Stagger"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger (%)"] = "Stagger (%)"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger against Target (%)"] = "Stagger against Target (%)"
|
||||
@@ -2251,9 +2253,9 @@ L["Talent |cFFFF0000Not|r Selected"] = "Talent |cFFFF0000Not|r Selected"
|
||||
--[[Translation missing --]]
|
||||
L["Talent Known"] = "Talent Known"
|
||||
--[[Translation missing --]]
|
||||
L["Talent selected"] = "Talent selected"
|
||||
--[[Translation missing --]]
|
||||
L["Talent Selected"] = "Talent Selected"
|
||||
--[[Translation missing --]]
|
||||
L["Talent selected"] = "Talent selected"
|
||||
L["Talent Specialization"] = "Especialização de talentos"
|
||||
--[[Translation missing --]]
|
||||
L["Tanking And Highest"] = "Tanking And Highest"
|
||||
|
||||
@@ -709,8 +709,8 @@ L["Instakill"] = "Моментальное убийство"
|
||||
L["Install the addons BugSack and BugGrabber for detailed error logs."] = "Установите аддоны BugSack и BugGrabber для получения подробных записей об ошибках."
|
||||
L["Instance"] = "Подземелье"
|
||||
L["Instance Difficulty"] = "Сложность подземелья"
|
||||
L["Instance ID"] = "Идентификатор подземелья"
|
||||
L["Instance Id"] = "ID подземелья"
|
||||
L["Instance ID"] = "Идентификатор подземелья"
|
||||
L["Instance Info"] = "Информация о подземелье"
|
||||
L["Instance Name"] = "Название подземелья"
|
||||
L["Instance Size Type"] = "Тип размера подземелья"
|
||||
@@ -1060,8 +1060,8 @@ L["Progress Total"] = "Общее значение"
|
||||
L["Progress Value"] = "Текущее значение"
|
||||
L["Pulse"] = "Пульсация"
|
||||
L["PvP Flagged"] = "В режиме PvP"
|
||||
L["PvP Talent Selected"] = "PvP талант выбран"
|
||||
L["PvP Talent selected"] = "PvP талант выбран"
|
||||
L["PvP Talent Selected"] = "PvP талант выбран"
|
||||
L["Quality Id"] = "ID качества"
|
||||
L["Quantity"] = "Количество"
|
||||
L["Quantity earned this week"] = "Заработано на этой неделе"
|
||||
@@ -1284,6 +1284,8 @@ L["Stacks Function"] = "Функция стаков"
|
||||
L["Stacks Function (fallback state)"] = "Функция стаков (резервное состояние)"
|
||||
L["Stage"] = "Фаза"
|
||||
L["Stage Counter"] = "Счетчик фаз"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger"] = "Stagger"
|
||||
L["Stagger (%)"] = "Пошатывание (%)"
|
||||
L["Stagger against Target (%)"] = "Пошатывание против текущей цели (%)"
|
||||
L["Stagger Scale"] = [=[Масштаб пошатывания
|
||||
@@ -1338,8 +1340,8 @@ L["Talent"] = "Талант"
|
||||
L["Talent |cFFFF0000Not|r Known"] = "Талант |cFFFF0000НЕ|rизвестен"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "Талант |cFFFF0000НЕ|r выбран"
|
||||
L["Talent Known"] = "Талант известен"
|
||||
L["Talent selected"] = "Выбран талант"
|
||||
L["Talent Selected"] = "Талант выбран"
|
||||
L["Talent selected"] = "Выбран талант"
|
||||
L["Talent Specialization"] = "Специализация"
|
||||
L["Tanking And Highest"] = "Вы основная цель; макс. угроза"
|
||||
L["Tanking But Not Highest"] = "Вы основная цель; не макс. угроза"
|
||||
|
||||
@@ -653,8 +653,8 @@ L["Hybrid"] = "混合"
|
||||
L["Icon"] = "图标"
|
||||
L["Icon Function"] = "图标函数"
|
||||
L["Icon Function (fallback state)"] = "图标函数(后备状态)"
|
||||
L["ID"] = "ID"
|
||||
L["Id"] = "ID"
|
||||
L["ID"] = "ID"
|
||||
L["If you require additional assistance, please open a ticket on GitHub or visit our Discord at https://discord.gg/weakauras!"] = "如果你需要进一步的协助,请在 GitHub 上提交工单或是访问我们的 Discord:https://discord.gg/weakauras!"
|
||||
L["Ignore Dead"] = "忽略已死亡"
|
||||
L["Ignore Disconnected"] = "忽略已离线"
|
||||
@@ -690,8 +690,8 @@ L["Instakill"] = "秒杀"
|
||||
L["Install the addons BugSack and BugGrabber for detailed error logs."] = "安装BugSack和BugGrabber插件以获得详细错误记录。"
|
||||
L["Instance"] = "副本"
|
||||
L["Instance Difficulty"] = "副本难度"
|
||||
L["Instance ID"] = "副本ID"
|
||||
L["Instance Id"] = "副本ID"
|
||||
L["Instance ID"] = "副本ID"
|
||||
L["Instance Info"] = "副本信息"
|
||||
L["Instance Name"] = "副本名称"
|
||||
L["Instance Size Type"] = "副本大小类型"
|
||||
@@ -802,8 +802,8 @@ L["Matches (Pattern)"] = "匹配(表达式)"
|
||||
L[ [=[Matches stage number of encounter journal.
|
||||
Intermissions are .5
|
||||
E.g. 1;2;1;2;2.5;3]=] ] = "符合冒险指南的阶段。转阶段为.5。例如1;2;1;2;2.5;3"
|
||||
L["Max Char"] = "最大字符数"
|
||||
L["Max Char "] = "最大字符数"
|
||||
L["Max Char"] = "最大字符数"
|
||||
L["Max Charges"] = "最大充能次数"
|
||||
L["Max Health"] = "最大生命值"
|
||||
L["Max Power"] = "最大能量值"
|
||||
@@ -1071,8 +1071,8 @@ L["Progress Total"] = "进度总计"
|
||||
L["Progress Value"] = "进度值"
|
||||
L["Pulse"] = "脉动"
|
||||
L["PvP Flagged"] = "PvP 状态"
|
||||
L["PvP Talent Selected"] = "已选择PvP天赋"
|
||||
L["PvP Talent selected"] = "PvP 天赋选择"
|
||||
L["PvP Talent Selected"] = "已选择PvP天赋"
|
||||
L["Quality Id"] = "品质ID"
|
||||
L["Quantity"] = "数量"
|
||||
L["Quantity earned this week"] = "本周获取数量"
|
||||
@@ -1290,6 +1290,8 @@ L["Stacks Function"] = "层数函数"
|
||||
L["Stacks Function (fallback state)"] = "层数函数(后备状态)"
|
||||
L["Stage"] = "阶段"
|
||||
L["Stage Counter"] = "阶段计数"
|
||||
--[[Translation missing --]]
|
||||
L["Stagger"] = "Stagger"
|
||||
L["Stagger (%)"] = "醉拳 (%)"
|
||||
L["Stagger against Target (%)"] = "针对目标的醉拳 (%)"
|
||||
L["Stagger Scale"] = "醉拳缩放比例"
|
||||
@@ -1341,8 +1343,8 @@ L["Talent"] = "天赋"
|
||||
L["Talent |cFFFF0000Not|r Known"] = "天赋|cFFFF0000不|r可用"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "天赋|cFFFF0000未|r选择"
|
||||
L["Talent Known"] = "天赋可用"
|
||||
L["Talent selected"] = "天赋选择"
|
||||
L["Talent Selected"] = "天赋选择"
|
||||
L["Talent selected"] = "天赋选择"
|
||||
L["Talent Specialization"] = "专精"
|
||||
L["Tanking And Highest"] = "做T并且最高"
|
||||
L["Tanking But Not Highest"] = "做T但不是最高"
|
||||
|
||||
@@ -582,8 +582,7 @@ L["Global Cooldown"] = "共用冷卻 (GCD)"
|
||||
L["Glow"] = "發光"
|
||||
L["Glow External Element"] = "發光外部元素"
|
||||
L["Gluth"] = "古魯斯"
|
||||
--[[Translation missing --]]
|
||||
L["Glyph"] = "Glyph"
|
||||
L["Glyph"] = "雕紋"
|
||||
L["Gold"] = "金"
|
||||
L["Golemagg the Incinerator"] = "『焚化者』古雷曼格"
|
||||
L["Gothik the Harvester"] = "『收割者』高希"
|
||||
@@ -1046,8 +1045,8 @@ L["Progress Total"] = "總進度"
|
||||
L["Progress Value"] = "進度值"
|
||||
L["Pulse"] = "跳動"
|
||||
L["PvP Flagged"] = "PvP 標幟"
|
||||
L["PvP Talent Selected"] = "已選擇的 PvP 天賦"
|
||||
L["PvP Talent selected"] = "選擇的 PvP 天賦"
|
||||
L["PvP Talent Selected"] = "已選擇的 PvP 天賦"
|
||||
L["Quality Id"] = "品質id"
|
||||
L["Quantity"] = "數量"
|
||||
L["Quantity earned this week"] = "本週獲取數量"
|
||||
@@ -1265,6 +1264,7 @@ L["Stacks Function"] = "層數功能"
|
||||
L["Stacks Function (fallback state)"] = "層數函數 (備用狀態)"
|
||||
L["Stage"] = "階段"
|
||||
L["Stage Counter"] = "階段統計"
|
||||
L["Stagger"] = "醉酒"
|
||||
L["Stagger (%)"] = "醉仙緩勁 (%)"
|
||||
L["Stagger against Target (%)"] = "醉仙緩勁目標 (%)"
|
||||
L["Stagger Scale"] = "醉仙緩勁縮放大小"
|
||||
@@ -1319,8 +1319,8 @@ L["Talent"] = "天賦"
|
||||
L["Talent |cFFFF0000Not|r Known"] = "|cFFFF0000未知的|r天賦"
|
||||
L["Talent |cFFFF0000Not|r Selected"] = "|cFFFF0000沒有選擇|r天賦"
|
||||
L["Talent Known"] = "已知的天賦"
|
||||
L["Talent selected"] = "選擇的天賦"
|
||||
L["Talent Selected"] = "選擇的天賦"
|
||||
L["Talent selected"] = "選擇的天賦"
|
||||
L["Talent Specialization"] = "天賦專精"
|
||||
L["Tanking And Highest"] = "坦怪中並且是最高"
|
||||
L["Tanking But Not Highest"] = "坦怪中但不是最高"
|
||||
|
||||
@@ -2063,6 +2063,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "standing",
|
||||
@@ -2194,6 +2195,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
type = "header",
|
||||
@@ -2230,6 +2232,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
},
|
||||
overlayFuncs = {
|
||||
@@ -2316,7 +2319,8 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
progressTotal = "maxhealth"
|
||||
progressTotal = "maxhealth",
|
||||
formatter = "BigNumber",
|
||||
},
|
||||
{
|
||||
name = "value",
|
||||
@@ -2350,6 +2354,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "deficit",
|
||||
@@ -2362,7 +2367,8 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
progressTotal = "total"
|
||||
progressTotal = "total",
|
||||
formatter = "BigNumber",
|
||||
},
|
||||
{
|
||||
name = "maxhealth",
|
||||
@@ -2375,6 +2381,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "BigNumber",
|
||||
},
|
||||
{
|
||||
type = "header",
|
||||
@@ -2818,6 +2825,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "deficit",
|
||||
@@ -3085,7 +3093,9 @@ Private.event_prototypes = {
|
||||
hidden = "true",
|
||||
test = "true",
|
||||
store = true,
|
||||
display = L["Source GUID"]
|
||||
display = L["Source GUID"],
|
||||
formatter = "guid",
|
||||
formatterArgs = { color = "class" }
|
||||
},
|
||||
{
|
||||
name = "sourceUnit",
|
||||
@@ -3192,7 +3202,9 @@ Private.event_prototypes = {
|
||||
hidden = "true",
|
||||
test = "true",
|
||||
store = true,
|
||||
display = L["Destination GUID"]
|
||||
display = L["Destination GUID"],
|
||||
formatter = "guid",
|
||||
formatterArgs = { color = "class" }
|
||||
},
|
||||
{
|
||||
name = "destUnit",
|
||||
@@ -6045,6 +6057,8 @@ Private.event_prototypes = {
|
||||
store = true,
|
||||
hidden = true,
|
||||
test = "true",
|
||||
formatter = "guid",
|
||||
formatterArgs = { color = "class" }
|
||||
},
|
||||
{
|
||||
name = "cloneId",
|
||||
@@ -6670,6 +6684,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "rawthreatpct",
|
||||
@@ -6683,6 +6698,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "threatvalue",
|
||||
@@ -7428,6 +7444,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "hitrating",
|
||||
@@ -7452,6 +7469,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "hasterating",
|
||||
@@ -7476,6 +7494,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "expertiserating",
|
||||
@@ -7524,6 +7543,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "spellpenpercent",
|
||||
@@ -7536,6 +7556,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "resiliencerating",
|
||||
@@ -7560,6 +7581,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "attackpower",
|
||||
@@ -7685,6 +7707,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
type = "header",
|
||||
@@ -7714,6 +7737,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "parryrating",
|
||||
@@ -7738,6 +7762,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "blockpercent",
|
||||
@@ -7750,6 +7775,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
{
|
||||
name = "blockvalue",
|
||||
@@ -7786,6 +7812,7 @@ Private.event_prototypes = {
|
||||
operator = "and",
|
||||
limit = 2
|
||||
},
|
||||
formatter = "Number",
|
||||
},
|
||||
},
|
||||
automaticrequired = true,
|
||||
@@ -8225,7 +8252,9 @@ Private.event_prototypes = {
|
||||
type = "number",
|
||||
init = "min",
|
||||
store = true,
|
||||
test = "true"
|
||||
test = "true",
|
||||
conditionType = "number",
|
||||
operator_types = "without_equal",
|
||||
},
|
||||
{
|
||||
hidden = true,
|
||||
@@ -8234,7 +8263,9 @@ Private.event_prototypes = {
|
||||
type = "number",
|
||||
init = "max",
|
||||
store = true,
|
||||
test = "true"
|
||||
test = "true",
|
||||
conditionType = "number",
|
||||
operator_types = "without_equal",
|
||||
},
|
||||
{
|
||||
name = "range",
|
||||
@@ -8246,6 +8277,7 @@ Private.event_prototypes = {
|
||||
conditionTest = function(state, needle, needle2)
|
||||
return state and state.show and WeakAuras.CheckRange(state.unit, needle, needle2);
|
||||
end,
|
||||
noProgressSource = true
|
||||
},
|
||||
{
|
||||
hidden = true,
|
||||
@@ -8291,6 +8323,7 @@ Private.event_prototypes = {
|
||||
display = Private.coin_icons.gold .. L["Gold"],
|
||||
store = true,
|
||||
conditionType = "number",
|
||||
formatter = "BigNumber"
|
||||
},
|
||||
{
|
||||
name = "silver",
|
||||
|
||||
@@ -241,12 +241,20 @@ local function modify(parent, region, data)
|
||||
|
||||
local Update
|
||||
if customTextFunc and self.displayText and Private.ContainsCustomPlaceHolder(self.displayText) then
|
||||
Update = function()
|
||||
Update = function(self)
|
||||
self.values.custom = Private.RunCustomTextFunc(self, customTextFunc)
|
||||
UpdateText()
|
||||
self:UpdateProgress()
|
||||
end
|
||||
else
|
||||
Update = UpdateText or function() end
|
||||
if UpdateText then
|
||||
Update = function()
|
||||
UpdateText()
|
||||
self:UpdateProgress()
|
||||
end
|
||||
else
|
||||
Update = function() self:UpdateProgress() end
|
||||
end
|
||||
end
|
||||
|
||||
local FrameTick
|
||||
|
||||
@@ -246,6 +246,7 @@ local function modify(parent, region, parentData, data, first)
|
||||
end
|
||||
return data[fullKey]
|
||||
end
|
||||
|
||||
region.subTextFormatters, region.everyFrameFormatters = Private.CreateFormatters(texts, getter, false, parentData)
|
||||
|
||||
function region:ConfigureTextUpdate()
|
||||
|
||||
@@ -0,0 +1,347 @@
|
||||
local AddonName = ...
|
||||
local Private = select(2, ...)
|
||||
|
||||
Private.Features:Register({
|
||||
id = "undo",
|
||||
autoEnable = {"dev", "pr", "alpha"},
|
||||
enabled = true,
|
||||
persist = true,
|
||||
})
|
||||
|
||||
local TimeMachine = {
|
||||
next = {
|
||||
forward = {},
|
||||
backward = {}
|
||||
},
|
||||
transaction = false,
|
||||
changes = {},
|
||||
actions = {},
|
||||
effects = {},
|
||||
index = 0,
|
||||
sub = Private.CreateSubscribableObject(),
|
||||
}
|
||||
|
||||
Private.TimeMachine = TimeMachine
|
||||
|
||||
local function resolveKey(data, path)
|
||||
if type(path) ~= 'table' then
|
||||
return data, path
|
||||
end
|
||||
local tbl = data
|
||||
local i = 1
|
||||
while i < #path do
|
||||
if tbl[path[i]] == nil then
|
||||
tbl[path[i]] = {}
|
||||
elseif type(tbl[path[i]]) ~= 'table' then
|
||||
error("Path is not valid: " .. table.concat(path, '.') .. " at " .. path[i])
|
||||
end
|
||||
tbl = tbl[path[i]]
|
||||
i = i + 1
|
||||
end
|
||||
return tbl, path[#path]
|
||||
end
|
||||
|
||||
local function copy(tbl, key)
|
||||
if type(tbl[key]) == "table" then
|
||||
return CopyTable(tbl[key])
|
||||
else
|
||||
return tbl[key]
|
||||
end
|
||||
end
|
||||
|
||||
function TimeMachine:RegisterEffect(tag, func, idempotent)
|
||||
if self.effects[tag] then
|
||||
error("Effect already registered: " .. tag)
|
||||
end
|
||||
self.effects[tag] = {
|
||||
idempotent = idempotent,
|
||||
func = func
|
||||
}
|
||||
end
|
||||
|
||||
TimeMachine:RegisterEffect("add", function(uid, data)
|
||||
Private.Add(data)
|
||||
end, true)
|
||||
|
||||
TimeMachine:RegisterEffect("options_cu", function(uid, data)
|
||||
if WeakAuras.IsOptionsOpen() then
|
||||
WeakAuras.ClearAndUpdateOptions(data.id, true)
|
||||
end
|
||||
end, true)
|
||||
|
||||
function TimeMachine:RegisterAction(actionType, actor, inverter, autoEffects)
|
||||
if self.actions[actionType] then
|
||||
error("Action already registered: " .. actionType)
|
||||
end
|
||||
self.actions[actionType] = {
|
||||
actor = actor,
|
||||
inverter = inverter,
|
||||
autoEffects = autoEffects,
|
||||
}
|
||||
end
|
||||
TimeMachine:RegisterAction("none",
|
||||
function(_data, _path)
|
||||
end,
|
||||
function(_data, path)
|
||||
return 'none', path, nil
|
||||
end
|
||||
)
|
||||
|
||||
TimeMachine:RegisterAction("set",
|
||||
function(data, path, value)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
tbl[key] = value
|
||||
end,
|
||||
function(data, path)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
return 'set', path, copy(tbl, key)
|
||||
end,
|
||||
{"add", "options_cu"}
|
||||
)
|
||||
|
||||
TimeMachine:RegisterAction("setmany",
|
||||
function(data, path, values)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
for k, v in pairs(values) do
|
||||
tbl[key][k] = v
|
||||
end
|
||||
end,
|
||||
function(data, path, values)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
local inverse = {}
|
||||
for k, v in pairs(values) do
|
||||
inverse[k] = copy(tbl[key], k)
|
||||
end
|
||||
return 'setmany', path, inverse
|
||||
end,
|
||||
{"add", "options_cu"}
|
||||
)
|
||||
|
||||
TimeMachine:RegisterAction("insert",
|
||||
function(data, path, payload)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
if payload.index == nil then
|
||||
table.insert(tbl[key], payload.value)
|
||||
else
|
||||
table.insert(tbl[key], payload.index, payload.value)
|
||||
end
|
||||
end,
|
||||
function(data, path, payload)
|
||||
return 'remove', path, payload.index
|
||||
end,
|
||||
{"add", "options_cu"}
|
||||
)
|
||||
|
||||
TimeMachine:RegisterAction("remove",
|
||||
function(data, path, payload)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
if payload == nil then
|
||||
table.remove(tbl[key])
|
||||
else
|
||||
table.remove(tbl[key], payload)
|
||||
end
|
||||
end,
|
||||
function(data, path, payload)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
return 'insert', path, {index = payload, value = copy(tbl[key], payload or #tbl[key])}
|
||||
end,
|
||||
{"add", "options_cu"}
|
||||
)
|
||||
|
||||
TimeMachine:RegisterAction("swap",
|
||||
function(data, path, payload)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
tbl[key][payload[1]], tbl[key][payload[2]] = tbl[key][payload[2]], tbl[key][payload[1]]
|
||||
end,
|
||||
function(data, path, payload)
|
||||
return 'swap', path, {payload[2], payload[1]}
|
||||
end,
|
||||
{"add", "options_cu"}
|
||||
)
|
||||
|
||||
TimeMachine:RegisterAction("move",
|
||||
function(data, path, payload)
|
||||
local tbl, key = resolveKey(data, path)
|
||||
local value = table.remove(tbl, payload[1])
|
||||
table.insert(tbl[key], payload[2], value)
|
||||
end,
|
||||
function(data, path, payload)
|
||||
return 'move', path, {payload[2], payload[1]}
|
||||
end,
|
||||
{"add", "options_cu"}
|
||||
)
|
||||
|
||||
local function keyPathToString(path)
|
||||
if type(path) == 'table' then
|
||||
return table.concat(path, '.')
|
||||
else
|
||||
return path
|
||||
end
|
||||
end
|
||||
|
||||
local function invertEffects(effects)
|
||||
local inverted = {}
|
||||
for i = #effects, 1, -1 do
|
||||
table.insert(inverted, effects[i])
|
||||
end
|
||||
return inverted
|
||||
end
|
||||
|
||||
function TimeMachine:StartTransaction()
|
||||
if self.transaction then
|
||||
WeakAuras.prettyPrint("If you're reading this, a time machine transaction was started, but there was already one in progress. That's not supposed to happen. Please report this to the WeakAuras developers, thanks!")
|
||||
self:Reject()
|
||||
end
|
||||
self.transaction = true
|
||||
end
|
||||
|
||||
function TimeMachine:Append(record)
|
||||
local action = self.actions[record.actionType]
|
||||
Private.DebugPrint("Forward action", record.actionType, "for", record.uid, "at", keyPathToString(record.path), "with", record.payload)
|
||||
if not action then
|
||||
error("No action for actionType: " .. record.actionType)
|
||||
end
|
||||
local inverter = action.inverter
|
||||
if not inverter then
|
||||
error("No inverter for action: " .. record.actionType)
|
||||
end
|
||||
local actionType, path, payload = inverter(Private.GetDataByUID(record.uid), record.path, record.payload)
|
||||
local inverseRecord = {
|
||||
uid = record.uid,
|
||||
actionType = actionType,
|
||||
path = path,
|
||||
payload = payload,
|
||||
suppressAutoEffects = record.suppressAutoEffects and CopyTable(record.suppressAutoEffects) or nil,
|
||||
effects = record.effects and invertEffects(record.effects) or nil,
|
||||
}
|
||||
Private.DebugPrint("Backward action", actionType, "for", record.uid, "at", keyPathToString(path), "with", payload)
|
||||
table.insert(self.next.forward, record)
|
||||
table.insert(self.next.backward, 1, inverseRecord)
|
||||
if not self.transaction then
|
||||
self:Commit(true)
|
||||
end
|
||||
end
|
||||
|
||||
function TimeMachine:AppendMany(records)
|
||||
local commit = false
|
||||
if not self.transaction then
|
||||
self:StartTransaction()
|
||||
commit = true
|
||||
end
|
||||
for _, record in ipairs(records) do
|
||||
self:Append(record)
|
||||
end
|
||||
if commit then
|
||||
self:Commit()
|
||||
end
|
||||
end
|
||||
|
||||
function TimeMachine:Reject()
|
||||
self.next = {
|
||||
forward = {},
|
||||
backward = {}
|
||||
}
|
||||
self.transaction = false
|
||||
end
|
||||
|
||||
function TimeMachine:Commit(instant)
|
||||
if not self.transaction and not instant then
|
||||
WeakAuras.prettyPrint("If you're reading this, a time machine transaction was committed, but there was no transaction in progress. That's not supposed to happen. Please report this to the WeakAuras developers, thanks!")
|
||||
return
|
||||
end
|
||||
while self.index < #self.changes do
|
||||
table.remove(self.changes)
|
||||
end
|
||||
table.insert(self.changes, self.next)
|
||||
self.next = {
|
||||
forward = {},
|
||||
backward = {}
|
||||
}
|
||||
self.transaction = false
|
||||
return self:StepForward()
|
||||
end
|
||||
|
||||
function TimeMachine:Apply(records, delayedEffects)
|
||||
for _, record in ipairs(records) do
|
||||
local action = self.actions[record.actionType]
|
||||
if not action then
|
||||
error("No action for actionType: " .. record.actionType)
|
||||
end
|
||||
local data = Private.GetDataByUID(record.uid)
|
||||
action.actor(data, record.path, record.payload)
|
||||
if action.autoEffects or record.effects then
|
||||
local effects = {}
|
||||
if action.autoEffects then
|
||||
for _, effect in ipairs(action.autoEffects) do
|
||||
if not record.suppressAutoEffects or not record.suppressAutoEffects[effect] then
|
||||
table.insert(effects, effect)
|
||||
end
|
||||
end
|
||||
end
|
||||
if record.effects then
|
||||
for _, effect in ipairs(record.effects) do
|
||||
table.insert(effects, effect)
|
||||
end
|
||||
end
|
||||
for _, effectType in ipairs(effects) do
|
||||
local effect = self.effects[effectType]
|
||||
if not effect then
|
||||
error("No effect for effectType: " .. effect)
|
||||
end
|
||||
if not delayedEffects or not effect.idempotent then
|
||||
if not record.effects or record.suppressAutoEffects then
|
||||
effect.func(record.uid, data)
|
||||
end
|
||||
else
|
||||
delayedEffects[record.uid] = delayedEffects[record.uid] or {}
|
||||
delayedEffects[record.uid][effectType] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return delayedEffects
|
||||
end
|
||||
|
||||
function TimeMachine:StepForward()
|
||||
if self.index < #self.changes then
|
||||
self.index = self.index + 1
|
||||
self:Apply(self.changes[self.index].forward)
|
||||
if self.sub:HasSubscribers("Step") then
|
||||
self.sub:Notify("Step", self.index)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function TimeMachine:StepBackward()
|
||||
if self.index > 0 then
|
||||
self:Apply(self.changes[self.index].backward)
|
||||
self.index = self.index - 1
|
||||
if self.sub:HasSubscribers("Step") then
|
||||
self.sub:Notify("Step", self.index)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- much safer than the name suggests!
|
||||
function TimeMachine:DestroyTheUniverse(id)
|
||||
if self.transaction then
|
||||
WeakAuras.prettyPrint("If you're reading this, a time machine transaction was destroyed, but there was one in progress. That's not supposed to happen. Please report this to the WeakAuras developers, thanks!")
|
||||
self:Reject()
|
||||
end
|
||||
if #self.changes > 0 then
|
||||
Private.DebugPrint(string.format("Destroying the universe where %i change(s) happpened, because an unexpected change happened to %q.", #self.changes, id))
|
||||
end
|
||||
self.changes = {}
|
||||
self.index = 0
|
||||
if self.sub:HasSubscribers("Step") then
|
||||
self.sub:Notify("Step", self.index)
|
||||
end
|
||||
end
|
||||
|
||||
function TimeMachine:DescribeNext()
|
||||
return self.changes[self.index + 1] and self.changes[self.index + 1].forward
|
||||
end
|
||||
|
||||
function TimeMachine:DescribePrevious()
|
||||
return self.changes[self.index] and self.changes[self.index].backward
|
||||
end
|
||||
+111
-4
@@ -201,11 +201,51 @@ function SlashCmdList.WEAKAURAS(input)
|
||||
elseif msg == "pshow" or msg == "profiling" then
|
||||
WeakAuras.RealTimeProfilingWindow:Toggle()
|
||||
elseif msg == "minimap" then
|
||||
Private.ToggleMinimap();
|
||||
WeakAuras.ToggleMinimap();
|
||||
elseif msg == "help" then
|
||||
Private.PrintHelp();
|
||||
elseif msg == "repair" then
|
||||
StaticPopup_Show("WEAKAURAS_CONFIRM_REPAIR", nil, nil, {reason = "user"})
|
||||
elseif msg == "ff" or msg == "feat" or msg == "feature" then
|
||||
if #args < 2 then
|
||||
local features = Private.Features:ListFeatures()
|
||||
local summary = {}
|
||||
for _, feature in ipairs(features) do
|
||||
table.insert(summary, ("|c%s%s|r"):format(feature.enabled and "ff00ff00" or "ffff0000", feature.id))
|
||||
end
|
||||
prettyPrint(L["Syntax /wa feature <toggle|on|enable|disable|off> <feature>"])
|
||||
prettyPrint(L["Available features: %s"]:format(table.concat(summary, ", ")))
|
||||
else
|
||||
local action = ({
|
||||
toggle = "toggle",
|
||||
on = "enable",
|
||||
enable = "enable",
|
||||
disable = "disable",
|
||||
off = "disable"
|
||||
})[args[1]]
|
||||
if not action then
|
||||
prettyPrint(L["Unknown action %q"]:format(args[1]))
|
||||
else
|
||||
local feature = args[2]
|
||||
if not Private.Features:Exists(feature) then
|
||||
prettyPrint(L["Unknown feature %q"]:format(feature))
|
||||
elseif not Private.Features:Enabled(feature) then
|
||||
if action ~= "disable" then
|
||||
Private.Features:Enable(feature)
|
||||
prettyPrint(L["Enabled feature %q"]:format(feature))
|
||||
else
|
||||
prettyPrint(L["Feature %q is already disabled"]:format(feature))
|
||||
end
|
||||
elseif Private.Features:Enabled(feature) then
|
||||
if action ~= "enable" then
|
||||
Private.Features:Disable(feature)
|
||||
prettyPrint(L["Disabled feature %q"]:format(feature))
|
||||
else
|
||||
prettyPrint(L["Feature %q is already enabled"]:format(feature))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
WeakAuras.OpenOptions(msg);
|
||||
end
|
||||
@@ -213,7 +253,7 @@ end
|
||||
|
||||
if not WeakAuras.IsLibsOK() then return end
|
||||
|
||||
function Private.ToggleMinimap()
|
||||
function WeakAuras.ToggleMinimap()
|
||||
WeakAurasSaved.minimap.hide = not WeakAurasSaved.minimap.hide
|
||||
if WeakAurasSaved.minimap.hide then
|
||||
LDBIcon:Hide("WeakAuras");
|
||||
@@ -1137,6 +1177,8 @@ function Private.Login(takeNewSnapshots)
|
||||
db.history = nil
|
||||
end
|
||||
|
||||
|
||||
Private.Features:Hydrate()
|
||||
coroutine.yield(3000, "login check uid corruption")
|
||||
|
||||
local toAdd = {};
|
||||
@@ -1216,6 +1258,7 @@ loadedFrame:SetScript("OnEvent", function(self, event, ...)
|
||||
|
||||
db.displays = db.displays or {};
|
||||
db.registered = db.registered or {};
|
||||
db.features = db.features or {}
|
||||
db.migrationCutoff = db.migrationCutoff or 730
|
||||
db.historyCutoff = db.historyCutoff or 730
|
||||
|
||||
@@ -1772,6 +1815,7 @@ function Private.UIDtoID(uid)
|
||||
end
|
||||
|
||||
function WeakAuras.Delete(data)
|
||||
Private.TimeMachine:DestroyTheUniverse(data.id)
|
||||
local id = data.id;
|
||||
local uid = data.uid
|
||||
local parentId = data.parent
|
||||
@@ -1871,6 +1915,7 @@ function WeakAuras.Delete(data)
|
||||
end
|
||||
|
||||
function WeakAuras.Rename(data, newid)
|
||||
-- since we Add() later in this function, we need to destroy the universe first
|
||||
local oldid = data.id
|
||||
if(data.parent) then
|
||||
local parentData = db.displays[data.parent];
|
||||
@@ -1973,6 +2018,7 @@ function WeakAuras.Rename(data, newid)
|
||||
end
|
||||
|
||||
function Private.Convert(data, newType)
|
||||
Private.TimeMachine:DestroyTheUniverse(data.id)
|
||||
local id = data.id;
|
||||
Private.FakeStatesFor(id, false)
|
||||
|
||||
@@ -2361,7 +2407,7 @@ function Private.AddMany(tbl, takeSnapshots)
|
||||
Private.regions[data.id].region:ReloadControlledChildren()
|
||||
end
|
||||
else
|
||||
WeakAuras.Add(data)
|
||||
Private.Add(data)
|
||||
end
|
||||
end
|
||||
coroutine.yield(1000, "addmany reload dynamic group");
|
||||
@@ -2911,7 +2957,7 @@ function pAdd(data, simpleChange)
|
||||
end
|
||||
end
|
||||
|
||||
function WeakAuras.Add(data, simpleChange)
|
||||
function Private.Add(data, simpleChange)
|
||||
local oldSnapshot
|
||||
if Private.ModernizeNeedsOldSnapshot(data) then
|
||||
oldSnapshot = Private.GetMigrationSnapshot(data.uid)
|
||||
@@ -2927,6 +2973,11 @@ function WeakAuras.Add(data, simpleChange)
|
||||
end
|
||||
end
|
||||
|
||||
function WeakAuras.Add(data, simpleChange)
|
||||
Private.TimeMachine:DestroyTheUniverse(data.id)
|
||||
Private.Add(data, simpleChange)
|
||||
end
|
||||
|
||||
function Private.AddParents(data)
|
||||
local parent = data.parent
|
||||
if (parent) then
|
||||
@@ -4449,6 +4500,9 @@ Private.callbacks:RegisterCallback("Rename", function(_, uid, oldId, newId)
|
||||
end)
|
||||
|
||||
function Private.SendDelayedWatchedTriggers()
|
||||
if WeakAuras.IsOptionsOpen() then
|
||||
return
|
||||
end
|
||||
for id in pairs(delayed_watched_trigger) do
|
||||
local watched = delayed_watched_trigger[id]
|
||||
-- Since the observers are themselves observable, we set the list of observers to
|
||||
@@ -4933,6 +4987,59 @@ function Private.ParseTextStr(textStr, symbolCallback)
|
||||
end
|
||||
end
|
||||
|
||||
function Private.SetDefaultFormatters(data, input, keyPrefix, metaData)
|
||||
local seenSymbols = {}
|
||||
local setDefaultFormatters = function(symbol)
|
||||
if not data[keyPrefix .. symbol .. "_format"] and not seenSymbols[symbol] then
|
||||
local trigger, sym = string.match(symbol, "(.+)%.(.+)")
|
||||
sym = sym or symbol
|
||||
|
||||
local formatter, args = Private.DefaultFormatterFor(metaData, trigger, sym)
|
||||
data[keyPrefix .. symbol .. "_format"] = formatter
|
||||
for arg, value in pairs(args or {}) do
|
||||
data[keyPrefix .. symbol .. "_" .. arg] = value
|
||||
end
|
||||
end
|
||||
seenSymbols[symbol] = true
|
||||
end
|
||||
Private.ParseTextStr(input, setDefaultFormatters)
|
||||
end
|
||||
|
||||
function Private.DefaultFormatterFor(stateMetaData, trigger, sym)
|
||||
local formatter
|
||||
local args = {}
|
||||
if sym == "p" or sym == "t" then
|
||||
return "timed", { time_dynamic_threshold = 3 }
|
||||
end
|
||||
|
||||
trigger = tonumber(trigger)
|
||||
if trigger then
|
||||
local metaData = stateMetaData[trigger] and stateMetaData[trigger][sym]
|
||||
if metaData then
|
||||
formatter = metaData.formatter
|
||||
if metaData.formatterArgs then
|
||||
for arg, value in pairs(metaData.formatterArgs) do
|
||||
args[arg] = value
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
for index, perTriggerData in pairs(stateMetaData) do
|
||||
if perTriggerData[sym] then
|
||||
if not formatter then
|
||||
formatter = perTriggerData[sym].formatter
|
||||
else
|
||||
if formatter ~= perTriggerData[sym].formatter then
|
||||
return "none"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return formatter or "none", args
|
||||
end
|
||||
|
||||
function Private.CreateFormatters(input, getter, withoutColor, data)
|
||||
local seenSymbols = {}
|
||||
local formatters = {}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
## Interface: 30300
|
||||
## Title: WeakAuras
|
||||
## Author: The WeakAuras Team
|
||||
## Version: 5.19.12
|
||||
## Version: 5.20.0
|
||||
## IconTexture: Interface\AddOns\WeakAuras\Media\Textures\icon.blp
|
||||
## X-Flavor: 3.3.5
|
||||
## Notes: A powerful, comprehensive utility for displaying graphics and information based on buffs, debuffs, and other triggers.
|
||||
@@ -35,6 +35,9 @@ ArchiveTypes\Repository.lua
|
||||
DefaultOptions.lua
|
||||
|
||||
# Core files
|
||||
SubscribableObject.lua
|
||||
Features.lua
|
||||
TimeMachine.lua
|
||||
Types_ClassicPlus.lua
|
||||
Types_TBC.lua
|
||||
Types_Wrath.lua
|
||||
@@ -60,7 +63,6 @@ TSUHelpers.lua
|
||||
AuraWarnings.lua
|
||||
AuraEnvironment.lua
|
||||
DebugLog.lua
|
||||
SubscribableObject.lua
|
||||
|
||||
# Region support
|
||||
RegionTypes\SmoothStatusBarMixin.lua
|
||||
|
||||
Reference in New Issue
Block a user