From d6ae3e020bc81d590ba02b2c5648822158a4d28d Mon Sep 17 00:00:00 2001 From: NoM0Re Date: Tue, 22 Jul 2025 16:49:18 +0200 Subject: [PATCH] 5.20.0 --- .luacheckrc | 3 +- WeakAuras/BuffTrigger2.lua | 60 +-- WeakAuras/DiscordList.lua | 8 +- WeakAuras/Features.lua | 143 ++++++++ WeakAuras/GenericTrigger.lua | 20 +- WeakAuras/Init.lua | 4 +- WeakAuras/Locales/deDE.lua | 10 +- WeakAuras/Locales/enUS.lua | 7 +- WeakAuras/Locales/esES.lua | 5 +- WeakAuras/Locales/esMX.lua | 9 +- WeakAuras/Locales/frFR.lua | 6 +- WeakAuras/Locales/itIT.lua | 10 +- WeakAuras/Locales/koKR.lua | 15 +- WeakAuras/Locales/ptBR.lua | 14 +- WeakAuras/Locales/ruRU.lua | 8 +- WeakAuras/Locales/zhCN.lua | 12 +- WeakAuras/Locales/zhTW.lua | 8 +- WeakAuras/Prototypes.lua | 45 ++- WeakAuras/RegionTypes/Text.lua | 12 +- WeakAuras/SubRegionTypes/SubText.lua | 1 + WeakAuras/TimeMachine.lua | 347 ++++++++++++++++++ WeakAuras/WeakAuras.lua | 115 +++++- WeakAuras/WeakAuras.toc | 6 +- WeakAurasModelPaths/WeakAurasModelPaths.toc | 2 +- .../AceGUIWidget-WeakAurasToolbarButton.lua | 10 +- WeakAurasOptions/AuthorOptions.lua | 3 +- WeakAurasOptions/Changelog.lua | 70 +++- WeakAurasOptions/InformationOptions.lua | 13 +- WeakAurasOptions/Locales/deDE.lua | 5 +- WeakAurasOptions/Locales/enUS.lua | 7 +- WeakAurasOptions/Locales/esES.lua | 5 +- WeakAurasOptions/Locales/esMX.lua | 3 +- WeakAurasOptions/Locales/frFR.lua | 7 +- WeakAurasOptions/Locales/itIT.lua | 10 +- WeakAurasOptions/Locales/koKR.lua | 13 +- WeakAurasOptions/Locales/ptBR.lua | 8 +- WeakAurasOptions/Locales/ruRU.lua | 9 +- WeakAurasOptions/Locales/zhCN.lua | 7 +- WeakAurasOptions/Locales/zhTW.lua | 5 +- .../OptionsFrames/OptionsFrame.lua | 150 +++++--- WeakAurasOptions/RegionOptions/Text.lua | 4 + WeakAurasOptions/SubRegionOptions/SubText.lua | 4 +- WeakAurasOptions/TriggerOptions.lua | 35 ++ WeakAurasOptions/VersionCheck.lua | 2 +- WeakAurasOptions/WeakAurasOptions.lua | 4 +- WeakAurasOptions/WeakAurasOptions.toc | 2 +- WeakAurasTemplates/WeakAurasTemplates.toc | 2 +- 47 files changed, 1056 insertions(+), 192 deletions(-) create mode 100644 WeakAuras/Features.lua create mode 100644 WeakAuras/TimeMachine.lua diff --git a/.luacheckrc b/.luacheckrc index 7fc1481..d76c156 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -155,6 +155,7 @@ globals = { "ChatFontNormal", "GameFontNormal", "GameFontNormalHuge", + "GameFontNormalSmall", "GameFontNormalSmall2", "GameFontHighlight", "GameFontHighlightLarge", @@ -19557,7 +19558,7 @@ globals = { "BNGetNumFriendToons", "BNGetFriendToonInfo", "KuiNameplates", "TidyPlatesThreat", "UnitIsPartyLeader", "EasyMenu", "SELECTED_CHAT_FRAME", "handler", "InterfaceOptions_AddCategory", "PanelTemplates_SetDisabledTabState", "PanelTemplates_SelectTab", "PanelTemplates_DeselectTab", - "PanelTemplates_TabResize", "GameFontNormalSmall", "ColorPickerFrame", "OpacitySliderFrame", + "PanelTemplates_TabResize", "ColorPickerFrame", "OpacitySliderFrame", "AceGUIEditBoxInsertLink", "AceGUIMultiLineEditBoxInsertLink", "ObjectPoolMixin", "FramePoolMixin", "FramePool_Hide", "FramePool_HideAndClearAnchors", "TexturePoolMixin", "TexturePool_Hide", "TexturePool_HideAndClearAnchors", "CreateTexturePool", diff --git a/WeakAuras/BuffTrigger2.lua b/WeakAuras/BuffTrigger2.lua index adc2005..61d37ca 100644 --- a/WeakAuras/BuffTrigger2.lua +++ b/WeakAuras/BuffTrigger2.lua @@ -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"] = { diff --git a/WeakAuras/DiscordList.lua b/WeakAuras/DiscordList.lua index 3f55735..de1aff7 100644 --- a/WeakAuras/DiscordList.lua +++ b/WeakAuras/DiscordList.lua @@ -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 = { } diff --git a/WeakAuras/Features.lua b/WeakAuras/Features.lua new file mode 100644 index 0000000..a1a88db --- /dev/null +++ b/WeakAuras/Features.lua @@ -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) diff --git a/WeakAuras/GenericTrigger.lua b/WeakAuras/GenericTrigger.lua index 98ae05a..8e59082 100644 --- a/WeakAuras/GenericTrigger.lua +++ b/WeakAuras/GenericTrigger.lua @@ -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 diff --git a/WeakAuras/Init.lua b/WeakAuras/Init.lua index 1164c4c..6a118d1 100644 --- a/WeakAuras/Init.lua +++ b/WeakAuras/Init.lua @@ -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 diff --git a/WeakAuras/Locales/deDE.lua b/WeakAuras/Locales/deDE.lua index ece2a48..647401a 100644 --- a/WeakAuras/Locales/deDE.lua +++ b/WeakAuras/Locales/deDE.lua @@ -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" diff --git a/WeakAuras/Locales/enUS.lua b/WeakAuras/Locales/enUS.lua index 8869801..a35bce7 100644 --- a/WeakAuras/Locales/enUS.lua +++ b/WeakAuras/Locales/enUS.lua @@ -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" diff --git a/WeakAuras/Locales/esES.lua b/WeakAuras/Locales/esES.lua index e43ddc3..ad8dd7c 100644 --- a/WeakAuras/Locales/esES.lua +++ b/WeakAuras/Locales/esES.lua @@ -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" diff --git a/WeakAuras/Locales/esMX.lua b/WeakAuras/Locales/esMX.lua index c1954bf..294f74e 100644 --- a/WeakAuras/Locales/esMX.lua +++ b/WeakAuras/Locales/esMX.lua @@ -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" diff --git a/WeakAuras/Locales/frFR.lua b/WeakAuras/Locales/frFR.lua index 4f6eae3..1cf61e3 100644 --- a/WeakAuras/Locales/frFR.lua +++ b/WeakAuras/Locales/frFR.lua @@ -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" diff --git a/WeakAuras/Locales/itIT.lua b/WeakAuras/Locales/itIT.lua index 3452934..6a1d0e2 100644 --- a/WeakAuras/Locales/itIT.lua +++ b/WeakAuras/Locales/itIT.lua @@ -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 (%)" diff --git a/WeakAuras/Locales/koKR.lua b/WeakAuras/Locales/koKR.lua index bbbac65..68c09a6 100644 --- a/WeakAuras/Locales/koKR.lua +++ b/WeakAuras/Locales/koKR.lua @@ -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"] = "탱커지만 제일 높지 않을 때" diff --git a/WeakAuras/Locales/ptBR.lua b/WeakAuras/Locales/ptBR.lua index fcccb73..0ea141e 100644 --- a/WeakAuras/Locales/ptBR.lua +++ b/WeakAuras/Locales/ptBR.lua @@ -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" diff --git a/WeakAuras/Locales/ruRU.lua b/WeakAuras/Locales/ruRU.lua index 4f7c456..dc97967 100644 --- a/WeakAuras/Locales/ruRU.lua +++ b/WeakAuras/Locales/ruRU.lua @@ -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"] = "Вы основная цель; не макс. угроза" diff --git a/WeakAuras/Locales/zhCN.lua b/WeakAuras/Locales/zhCN.lua index 5a01c32..13cb63f 100644 --- a/WeakAuras/Locales/zhCN.lua +++ b/WeakAuras/Locales/zhCN.lua @@ -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但不是最高" diff --git a/WeakAuras/Locales/zhTW.lua b/WeakAuras/Locales/zhTW.lua index 22c3532..591f0b1 100644 --- a/WeakAuras/Locales/zhTW.lua +++ b/WeakAuras/Locales/zhTW.lua @@ -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"] = "坦怪中但不是最高" diff --git a/WeakAuras/Prototypes.lua b/WeakAuras/Prototypes.lua index a99f4c2..5dfea40 100644 --- a/WeakAuras/Prototypes.lua +++ b/WeakAuras/Prototypes.lua @@ -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", diff --git a/WeakAuras/RegionTypes/Text.lua b/WeakAuras/RegionTypes/Text.lua index d00756f..29fd404 100644 --- a/WeakAuras/RegionTypes/Text.lua +++ b/WeakAuras/RegionTypes/Text.lua @@ -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 diff --git a/WeakAuras/SubRegionTypes/SubText.lua b/WeakAuras/SubRegionTypes/SubText.lua index eb4545c..298c5bd 100644 --- a/WeakAuras/SubRegionTypes/SubText.lua +++ b/WeakAuras/SubRegionTypes/SubText.lua @@ -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() diff --git a/WeakAuras/TimeMachine.lua b/WeakAuras/TimeMachine.lua new file mode 100644 index 0000000..32a6aa0 --- /dev/null +++ b/WeakAuras/TimeMachine.lua @@ -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 diff --git a/WeakAuras/WeakAuras.lua b/WeakAuras/WeakAuras.lua index a6914dc..e47845e 100644 --- a/WeakAuras/WeakAuras.lua +++ b/WeakAuras/WeakAuras.lua @@ -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 "]) + 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 = {} diff --git a/WeakAuras/WeakAuras.toc b/WeakAuras/WeakAuras.toc index b588ef6..448a2dd 100644 --- a/WeakAuras/WeakAuras.toc +++ b/WeakAuras/WeakAuras.toc @@ -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 diff --git a/WeakAurasModelPaths/WeakAurasModelPaths.toc b/WeakAurasModelPaths/WeakAurasModelPaths.toc index d6c9fa6..238cd71 100644 --- a/WeakAurasModelPaths/WeakAurasModelPaths.toc +++ b/WeakAurasModelPaths/WeakAurasModelPaths.toc @@ -1,7 +1,7 @@ ## Interface: 30300 ## Title: WeakAuras Model Paths ## Author: The WeakAuras Team -## Version: 5.19.12 +## Version: 5.20.0 ## Notes: Model paths for WeakAuras ## Notes-esES: Las rutas de modelos para WeakAuras ## Notes-esMX: Las rutas de modelos para WeakAuras diff --git a/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasToolbarButton.lua b/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasToolbarButton.lua index 5e37c55..6e0c055 100644 --- a/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasToolbarButton.lua +++ b/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasToolbarButton.lua @@ -3,7 +3,7 @@ if not WeakAuras.IsLibsOK() then return end ToolbarButton Widget, based on AceGUI Button Graphical Button. -------------------------------------------------------------------------------]] -local Type, Version = "WeakAurasToolbarButton", 6 +local Type, Version = "WeakAurasToolbarButton", 7 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -51,6 +51,7 @@ local methods = { self:SetText() self.hTex:SetVertexColor(1, 1, 1, 0.1) self:SetSmallFont(false) + self.text:SetTextColor(GameFontNormal:GetTextColor()) end, -- ["OnRelease"] = nil, @@ -72,8 +73,14 @@ local methods = { self.disabled = disabled if disabled then self.frame:Disable() + self.text:SetTextColor(0.5, 0.5, 0.5) else self.frame:Enable() + if self.smallFont then + self.text:SetTextColor(GameFontNormalSmall:GetTextColor()) + else + self.text:SetTextColor(GameFontNormal:GetTextColor()) + end end end, @@ -94,6 +101,7 @@ local methods = { end end, ["SetSmallFont"] = function(self, small) + self.smallFont = small if small then self.text:SetFontObject("GameFontNormalSmall") else diff --git a/WeakAurasOptions/AuthorOptions.lua b/WeakAurasOptions/AuthorOptions.lua index 4ad3fce..86f2176 100644 --- a/WeakAurasOptions/AuthorOptions.lua +++ b/WeakAurasOptions/AuthorOptions.lua @@ -2500,8 +2500,6 @@ local function mergeOptions(mergedOptions, data, options, config, prepath, paren break end end - else - nextInsert = #mergedOptions + 1 end -- now we know at what point to add nextToMerge if shouldMerge then @@ -2557,6 +2555,7 @@ local function mergeOptions(mergedOptions, data, options, config, prepath, paren end end else + nextInsert = #mergedOptions + 1 -- can't merge, should insert instead local newOption = CopyTable(nextToMerge) initReferences(newOption, data, options, i, config, path, parent) diff --git a/WeakAurasOptions/Changelog.lua b/WeakAurasOptions/Changelog.lua index 3a9c7ac..bcb917b 100644 --- a/WeakAurasOptions/Changelog.lua +++ b/WeakAurasOptions/Changelog.lua @@ -4,19 +4,73 @@ local AddonName = ... local OptionsPrivate = select(2, ...) OptionsPrivate.changelog = { - versionString = '5.19.12', - dateString = '2025-06-17', - fullChangeLogUrl = 'https://github.com/WeakAuras/WeakAuras2/compare/5.19.11...5.19.12', + versionString = '5.20.0', + dateString = '2025-07-21', + fullChangeLogUrl = 'https://github.com/WeakAuras/WeakAuras2/compare/5.19.12...5.20.0', highlightText = [==[ -- Bugfixes and performance improvements]==], commitText = [==[Stanzilla (2): +- **Added Undo & Redo Framework:** This lays the groundwork for undoing and redoing all aura edits. While the feature is still in development, you can test it now on URL edits. To enable it, type `/wa feature enable undo`. +- **New default formatters**: Setting `%unit` or `%guid` or `%p` will now auto select proper formatting options +- **Mists of Pandaria Updates:** Lots of Template updates and bug fixes to WA features. +- **Performance and Stability:** Addressed various bugs.]==], commitText = [==[InfusOnWoW (16): -- chore(toc): bump version for retail patch 11.5.7 +- Update Atlas File List from wago.tools +- Update Discord List +- Mop templates: Druid, Monk, DK, Warlock and Paladin Update +- Don't announce destroyng an empty universe +- Update WeakAurasModelPaths from wago.tools +- Update Discord List +- Update Atlas File List from wago.tools +- Mists: Add Power/Stagger trigger +- Don't send watch trigger events while Options are open +- Text: Call UpdateProgress so that relative animations work +- Progress Settings: Adjust on moving/deleting triggers +- Range Trigger: Fix progress source setting +- Add Default Formatters for text replacements +- Fix locale on english realms +- Update Discord List +- Update Discord List + +Stanzilla (3): + +- Update WeakAurasModelPaths from wago.tools +- Update WeakAurasModelPaths from wago.tools - Update WeakAurasModelPaths from wago.tools -mrbuds (2): +emptyrivers (2): -- Health trigger: add absorb options on Mists -- Don't trigger partyX unit event with the filter :group when in raid +- always advance mergeOptions pointer to the end if no merge is found +- undo & redo support (#4863) + +github-actions[bot] (2): + +- Update Discord List (#5943) +- Update WeakAurasModelPaths from wago.tools (#5944) + +mopstats (1): + +- Add pet battle events for mop (#5938) + +mrbuds (19): + +- LibSpecialization tiny update +- LibSpecialization update +- Mists rogue templates +- Mists priest templates +- Load the Time Machine on Mists +- Mists mage templates +- Mists shaman templates +- Fix Mists talent known trigger +- Add missing shaman talents +- Fix Glyph data on first load +- Mists use a dedicated file for modelpaths +- Remove missing "Blizzard Alerts" textures on Mists +- timed format default set time_dynamic_threshold = 3 +- default color for guid +- Fix formatter type test +- Allow default formatter to have sub formatter options +- Mists Template: Hunter +- Mists Template: Warrior +- Fix error with talent tree on 11.2.0 beta ]==] } diff --git a/WeakAurasOptions/InformationOptions.lua b/WeakAurasOptions/InformationOptions.lua index 8f04042..4e2edfd 100644 --- a/WeakAurasOptions/InformationOptions.lua +++ b/WeakAurasOptions/InformationOptions.lua @@ -69,13 +69,16 @@ function OptionsPrivate.GetInformationOptions(data) return sameURL and commonURL or "" end, set = function(info, v) + OptionsPrivate.Private.TimeMachine:StartTransaction() for child in traverseForUrl(data) do - child.url = v - WeakAuras.Add(child) - OptionsPrivate.ClearOptions(child.id) + OptionsPrivate.Private.TimeMachine:Append({ + uid = child.uid, + actionType = "set", + path = {"url"}, + payload = v + }) end - - WeakAuras.ClearAndUpdateOptions(data.id) + OptionsPrivate.Private.TimeMachine:Commit() end, desc = sameURL and "" or desc, order = order diff --git a/WeakAurasOptions/Locales/deDE.lua b/WeakAurasOptions/Locales/deDE.lua index 46ee94c..419b7c3 100644 --- a/WeakAurasOptions/Locales/deDE.lua +++ b/WeakAurasOptions/Locales/deDE.lua @@ -983,6 +983,8 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] --[[Translation missing --]] L["Reciprocal TRIGGER:# requests will be ignored!"] = "Reciprocal TRIGGER:# requests will be ignored!" --[[Translation missing --]] + L["Redo"] = "Redo" + --[[Translation missing --]] L["Regions of type \"%s\" are not supported."] = "Regions of type \"%s\" are not supported." L["Remove"] = "Entfernen" --[[Translation missing --]] @@ -1155,7 +1157,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] L["Stack Info"] = "Stapelinfo" --[[Translation missing --]] L["Stacks - The number of stacks of an aura (usually)"] = "Stacks - The number of stacks of an aura (usually)" - L["Stagger"] = "Taumeln" --[[Translation missing --]] L["Standby"] = "Standby" L["Star"] = "Stern" @@ -1302,6 +1303,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger Combination"] = "Trigger Combination" --[[Translation missing --]] L["Type 'select' for '%s' requires a values member'"] = "Type 'select' for '%s' requires a values member'" + --[[Translation missing --]] + L["Undo"] = "Undo" L["Ungroup"] = "Gruppierung aufheben" --[[Translation missing --]] L["Unit %s is not a valid unit for RegisterUnitEvent"] = "Unit %s is not a valid unit for RegisterUnitEvent" diff --git a/WeakAurasOptions/Locales/enUS.lua b/WeakAurasOptions/Locales/enUS.lua index b0b3197..fa742c3 100644 --- a/WeakAurasOptions/Locales/enUS.lua +++ b/WeakAurasOptions/Locales/enUS.lua @@ -1,6 +1,6 @@ if not WeakAuras.IsLibsOK() then return end -if ((GAME_LOCALE or GetLocale()) ~= "enUS") or ((GAME_LOCALE or GetLocale()) ~= "enGB") then +if ((GAME_LOCALE or GetLocale()) ~= "enUS") and ((GAME_LOCALE or GetLocale()) ~= "enGB") then return end @@ -683,6 +683,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] L["Re-center X"] = "Re-center X" L["Re-center Y"] = "Re-center Y" L["Reciprocal TRIGGER:# requests will be ignored!"] = "Reciprocal TRIGGER:# requests will be ignored!" + L["Redo"] = "Redo" L["Regions of type \"%s\" are not supported."] = "Regions of type \"%s\" are not supported." L["Remove"] = "Remove" L["Remove All Sounds"] = "Remove All Sounds" @@ -794,7 +795,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] L["Spell Selection Filters"] = "Spell Selection Filters" L["Stack Info"] = "Stack Info" L["Stacks - The number of stacks of an aura (usually)"] = "Stacks - The number of stacks of an aura (usually)" - L["Stagger"] = "Stagger" L["Standby"] = "Standby" L["Star"] = "Star" L["Start"] = "Start" @@ -885,6 +885,7 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "Trigger %i: %s" L["Trigger Combination"] = "Trigger Combination" L["Type 'select' for '%s' requires a values member'"] = "Type 'select' for '%s' requires a values member'" + L["Undo"] = "Undo" L["Ungroup"] = "Ungroup" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "Unit %s is not a valid unit for RegisterUnitEvent" L["Unit Count"] = "Unit Count" @@ -900,8 +901,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Url: %s"] = "Url: %s" L["Use Display Info Id"] = "Use Display Info Id" L["Use SetTransform"] = "Use SetTransform" - L["Used in auras:"] = "Used in auras:" L["Used in Auras:"] = "Used in Auras:" + L["Used in auras:"] = "Used in auras:" L["Uses Texture Coordinates to rotate the texture."] = "Uses Texture Coordinates to rotate the texture." L["Uses UnitIsVisible() to check if game client has loaded a object for this unit. This distance is around 100 yards. This is polled every second."] = "Uses UnitIsVisible() to check if game client has loaded a object for this unit. This distance is around 100 yards. This is polled every second." L["Value"] = "Value" diff --git a/WeakAurasOptions/Locales/esES.lua b/WeakAurasOptions/Locales/esES.lua index 788b604..5e5573b 100644 --- a/WeakAurasOptions/Locales/esES.lua +++ b/WeakAurasOptions/Locales/esES.lua @@ -143,8 +143,8 @@ Enable this setting if you want this timer to be hidden, or when using a WeakAur L["Anchor Mode"] = "Modo de anclaje" L["Anchor Point"] = "Punto de anclaje" L["Anchored To"] = "Anclado a" - L["and"] = "y" L["And "] = "y" + L["and"] = "y" L["and %s"] = "y %s" L["and aligned left"] = "y alineado a la izquierda" L["and aligned right"] = "y alineado a la derecha" @@ -642,6 +642,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = "Ocurrencia d L["Re-center X"] = "Re-centrar X" L["Re-center Y"] = "Re-centrar Y" L["Reciprocal TRIGGER:# requests will be ignored!"] = "ACTIVADOR recíproco: # solicitudes serán ignoradas." + L["Redo"] = "Rehacer" L["Regions of type \"%s\" are not supported."] = "Las regiones del tipo \"%s\" no son compatibles." L["Remove"] = "Eliminar" L["Remove All Sounds"] = "Eliminar todos los sonidos" @@ -753,7 +754,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = "Ocurrencia d L["Spell Selection Filters"] = "Filtros de selección de hechizo" L["Stack Info"] = "Información de Acumulaciones" L["Stacks - The number of stacks of an aura (usually)"] = "Acumulaciones - El número de acumulaciones de un aura (usualmente)" - L["Stagger"] = "Tambaleo" L["Standby"] = "En espera" L["Star"] = "Estrella" L["Start"] = "Empezar" @@ -843,6 +843,7 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "Activador %i:%s" L["Trigger Combination"] = "Combinación de activadores" L["Type 'select' for '%s' requires a values member'"] = "Tipo 'select' para '%s' requiere un miembro de valores'" + L["Undo"] = "Deshacer" L["Ungroup"] = "Desagrupar" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "La unidad %s no es una unidad válida para RegisterUnitEvent" L["Unit Count"] = "Recuento de unidad" diff --git a/WeakAurasOptions/Locales/esMX.lua b/WeakAurasOptions/Locales/esMX.lua index 9b33daa..f042d9a 100644 --- a/WeakAurasOptions/Locales/esMX.lua +++ b/WeakAurasOptions/Locales/esMX.lua @@ -642,6 +642,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = "Ocurrencia d L["Re-center X"] = "Re-centrar X" L["Re-center Y"] = "Re-centrar Y" L["Reciprocal TRIGGER:# requests will be ignored!"] = "ACTIVADOR recíproco: # solicitudes serán ignoradas." + L["Redo"] = "Rehacer" L["Regions of type \"%s\" are not supported."] = "Las regiones del tipo \"%s\" no son compatibles." L["Remove"] = "Eliminar" L["Remove All Sounds"] = "Eliminar todos los sonidos" @@ -753,7 +754,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = "Ocurrencia d L["Spell Selection Filters"] = "Filtros de selección de hechizo" L["Stack Info"] = "Información de Acumulaciones" L["Stacks - The number of stacks of an aura (usually)"] = "Acumulaciones - El número de acumulaciones de un aura (usualmente)" - L["Stagger"] = "Tambaleo" L["Standby"] = "En espera" L["Star"] = "Estrella" L["Start"] = "Empezar" @@ -843,6 +843,7 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "Activador %i:%s" L["Trigger Combination"] = "Combinación de activadores" L["Type 'select' for '%s' requires a values member'"] = "Tipo 'select' para '%s' requiere un miembro de valores'" + L["Undo"] = "Deshacer" L["Ungroup"] = "Desagrupar" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "La unidad %s no es una unidad válida para RegisterUnitEvent" L["Unit Count"] = "Recuento de unidad" diff --git a/WeakAurasOptions/Locales/frFR.lua b/WeakAurasOptions/Locales/frFR.lua index 6521137..4732927 100644 --- a/WeakAurasOptions/Locales/frFR.lua +++ b/WeakAurasOptions/Locales/frFR.lua @@ -849,6 +849,8 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] L["Re-center Y"] = "Rec-entrer Y" --[[Translation missing --]] L["Reciprocal TRIGGER:# requests will be ignored!"] = "Reciprocal TRIGGER:# requests will be ignored!" + --[[Translation missing --]] + L["Redo"] = "Redo" L["Regions of type \"%s\" are not supported."] = "Les régions de type \"%s\" ne sont pas prises en charge." L["Remove"] = "Retirer" --[[Translation missing --]] @@ -1006,7 +1008,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] L["Stack Info"] = "Info de Piles" --[[Translation missing --]] L["Stacks - The number of stacks of an aura (usually)"] = "Stacks - The number of stacks of an aura (usually)" - L["Stagger"] = "Report" --[[Translation missing --]] L["Standby"] = "Standby" L["Star"] = "Étoile" @@ -1144,6 +1145,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger Combination"] = "Trigger Combination" --[[Translation missing --]] L["Type 'select' for '%s' requires a values member'"] = "Type 'select' for '%s' requires a values member'" + --[[Translation missing --]] + L["Undo"] = "Undo" L["Ungroup"] = "Dissocier" --[[Translation missing --]] L["Unit %s is not a valid unit for RegisterUnitEvent"] = "Unit %s is not a valid unit for RegisterUnitEvent" @@ -1166,8 +1169,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Url: %s"] = "Url: %s" L["Use Display Info Id"] = "Utiliser les informations d'identifiant de l'affichage" L["Use SetTransform"] = "Utiliser SetTransform" - L["Used in auras:"] = "Utilisé dans les auras:" L["Used in Auras:"] = "Utilisé(e) dans les Auras:" + L["Used in auras:"] = "Utilisé dans les auras:" --[[Translation missing --]] L["Uses Texture Coordinates to rotate the texture."] = "Uses Texture Coordinates to rotate the texture." --[[Translation missing --]] diff --git a/WeakAurasOptions/Locales/itIT.lua b/WeakAurasOptions/Locales/itIT.lua index f5c1ca3..f3ff788 100644 --- a/WeakAurasOptions/Locales/itIT.lua +++ b/WeakAurasOptions/Locales/itIT.lua @@ -1039,6 +1039,8 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] --[[Translation missing --]] L["Reciprocal TRIGGER:# requests will be ignored!"] = "Reciprocal TRIGGER:# requests will be ignored!" --[[Translation missing --]] + L["Redo"] = "Redo" + --[[Translation missing --]] L["Regions of type \"%s\" are not supported."] = "Regions of type \"%s\" are not supported." --[[Translation missing --]] L["Remove"] = "Remove" @@ -1261,8 +1263,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] --[[Translation missing --]] L["Stacks - The number of stacks of an aura (usually)"] = "Stacks - The number of stacks of an aura (usually)" --[[Translation missing --]] - L["Stagger"] = "Stagger" - --[[Translation missing --]] L["Standby"] = "Standby" --[[Translation missing --]] L["Star"] = "Star" @@ -1437,6 +1437,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi --[[Translation missing --]] L["Type 'select' for '%s' requires a values member'"] = "Type 'select' for '%s' requires a values member'" --[[Translation missing --]] + L["Undo"] = "Undo" + --[[Translation missing --]] L["Ungroup"] = "Ungroup" --[[Translation missing --]] L["Unit %s is not a valid unit for RegisterUnitEvent"] = "Unit %s is not a valid unit for RegisterUnitEvent" @@ -1467,10 +1469,10 @@ Upgrade your version of WeakAuras or wait for next release before installing thi --[[Translation missing --]] L["Use SetTransform"] = "Use SetTransform" --[[Translation missing --]] - L["Used in auras:"] = "Used in auras:" - --[[Translation missing --]] L["Used in Auras:"] = "Used in Auras:" --[[Translation missing --]] + L["Used in auras:"] = "Used in auras:" + --[[Translation missing --]] L["Uses Texture Coordinates to rotate the texture."] = "Uses Texture Coordinates to rotate the texture." --[[Translation missing --]] L["Uses UnitIsVisible() to check if game client has loaded a object for this unit. This distance is around 100 yards. This is polled every second."] = "Uses UnitIsVisible() to check if game client has loaded a object for this unit. This distance is around 100 yards. This is polled every second." diff --git a/WeakAurasOptions/Locales/koKR.lua b/WeakAurasOptions/Locales/koKR.lua index 664489a..20470e3 100644 --- a/WeakAurasOptions/Locales/koKR.lua +++ b/WeakAurasOptions/Locales/koKR.lua @@ -39,7 +39,7 @@ local L = WeakAuras.L L["%s - Main"] = "%s - 메인" L["%s - OnLoad"] = "%s - 활성화 시" L["%s - OnUnload"] = "%s - 비활성화 시" - L["%s - Option #%i has the key %s. Please choose a different option key."] = "%s - #%i 옵션이 %s 키를 갖고 있습니다. 다른 옵션 키를 산택해주세요." + L["%s - Option #%i has the key %s. Please choose a different option key."] = "%s - #%i 옵션이 %s 키를 사용중입니다. 다른 옵션 키를 사용하세요." L["%s - Rotate Animation"] = "%s - 애니메이션 회전" L["%s - Scale Animation"] = "%s - 애니메이션 크기" L["%s - Start"] = "%s - 시작" @@ -158,8 +158,8 @@ Enable this setting if you want this timer to be hidden, or when using a WeakAur L["Anchor Mode"] = "고정 모드" L["Anchor Point"] = "고정 지점" L["Anchored To"] = "고정 위치:" - L["and"] = "그리고" L["And "] = "And" + L["and"] = "그리고" L["and %s"] = "and %s" L["and aligned left"] = ", 왼쪽 정렬" L["and aligned right"] = ", 오른쪽 정렬" @@ -214,7 +214,7 @@ Off Screen]=] ] = "위크오라가 화면 밖에 있습니다" L["Blue Rune"] = "푸른색 룬" L["Blue Sparkle Orb"] = "푸른 불꽃 구슬" L["Border %s"] = "테두리 %s" - L["Border Anchor"] = "테두리 고정" + L["Border Anchor"] = "테두리 고정점" L["Border Color"] = "테두리색" L["Border in Front"] = "앞쪽 테두리" L["Border Inset"] = "테두리 삽입" @@ -690,6 +690,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[이벤트 L["Re-center X"] = "내부 X 좌표" L["Re-center Y"] = "내부 Y 좌표" L["Reciprocal TRIGGER:# requests will be ignored!"] = "서로 상응하는 활성 조건 # 요청은 무시됩니다!" + L["Redo"] = "다시 실행" L["Regions of type \"%s\" are not supported."] = "\"%s\" 종류의 구역(Region)은 지원하지 않습니다." L["Remove"] = "제거" L["Remove All Sounds"] = "모든 소리 설정 제거" @@ -702,7 +703,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[이벤트 L["Report bugs on our issue tracker."] = "이슈 트래커에 버그를 제보해 주세요." L["Require unit from trigger"] = "활성 조건에서 유닛 필요" L["Required for Activation"] = "활성화 필수 조건" - L["Requires LibSpecialization, that is e.g. a up-to date WeakAuras version"] = "LibSpecialization이 필요합니다. 예를 들면 최신 WeakAuras 버전으로 업데이트하면 됩니다" + L["Requires LibSpecialization, that is e.g. a up-to date WeakAuras version"] = "LibSpecialization이 필요하며, WeakAuras 버전을 최신으로 유지하면 됩니다." L["Reset all options to their default values."] = "모든 옵션을 기본값으로 초기화합니다." L["Reset Entry"] = "항목 초기화" L["Reset to Defaults"] = "기본값으로 재설정" @@ -749,7 +750,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[이벤트 L["Show Icon"] = "아이콘 표시" L["Show If Unit Does Not Exist"] = "유닛이 없으면 표시" L["Show Linear Texture"] = "직진 텍스처 표시" - L["Show Matches for"] = "표시할 대상" + L["Show Matches for"] = "표시 조건" L["Show Matches for Units"] = "유닛별로 일치하는 조건 표시" L["Show Model"] = "모델 표시" L["Show model of unit "] = "유닛의 모델 표시" @@ -801,7 +802,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[이벤트 L["Spell Selection Filters"] = "주문 선정 필터" L["Stack Info"] = "중첩 정보" L["Stacks - The number of stacks of an aura (usually)"] = "중첩 - 오라의 중첩 갯수입니다 (일반적으로)" - L["Stagger"] = "계단식 배치" L["Standby"] = "대기 중" L["Star"] = "별" L["Start"] = "시작" @@ -889,6 +889,7 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "활성 조건 %i: %s" L["Trigger Combination"] = "활성 조건 조합" L["Type 'select' for '%s' requires a values member'"] = "'%s'에서 'select' 유형은 값들의 구성원을 필요로 합니다" + L["Undo"] = "실행 취소" L["Ungroup"] = "그룹 해제" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "%s 유닛은 RegisterUnitEvent에 적합하지 않습니다." L["Unit Count"] = "유닛 수" diff --git a/WeakAurasOptions/Locales/ptBR.lua b/WeakAurasOptions/Locales/ptBR.lua index 00a6c59..c8381d1 100644 --- a/WeakAurasOptions/Locales/ptBR.lua +++ b/WeakAurasOptions/Locales/ptBR.lua @@ -224,9 +224,9 @@ Enable this setting if you want this timer to be hidden, or when using a WeakAur L["Anchor Mode"] = "Anchor Mode" L["Anchor Point"] = "Ponto da âncora" L["Anchored To"] = "Ancorado a" + L["And "] = "E" --[[Translation missing --]] L["and"] = "and" - L["And "] = "E" --[[Translation missing --]] L["and %s"] = "and %s" L["and aligned left"] = "e alinhado à esquerda" @@ -1083,6 +1083,8 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] --[[Translation missing --]] L["Reciprocal TRIGGER:# requests will be ignored!"] = "Reciprocal TRIGGER:# requests will be ignored!" --[[Translation missing --]] + L["Redo"] = "Redo" + --[[Translation missing --]] L["Regions of type \"%s\" are not supported."] = "Regions of type \"%s\" are not supported." L["Remove"] = "Remover" --[[Translation missing --]] @@ -1273,8 +1275,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] --[[Translation missing --]] L["Stacks - The number of stacks of an aura (usually)"] = "Stacks - The number of stacks of an aura (usually)" --[[Translation missing --]] - L["Stagger"] = "Stagger" - --[[Translation missing --]] L["Standby"] = "Standby" --[[Translation missing --]] L["Star"] = "Star" @@ -1440,6 +1440,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi --[[Translation missing --]] L["Type 'select' for '%s' requires a values member'"] = "Type 'select' for '%s' requires a values member'" --[[Translation missing --]] + L["Undo"] = "Undo" + --[[Translation missing --]] L["Ungroup"] = "Ungroup" --[[Translation missing --]] L["Unit %s is not a valid unit for RegisterUnitEvent"] = "Unit %s is not a valid unit for RegisterUnitEvent" diff --git a/WeakAurasOptions/Locales/ruRU.lua b/WeakAurasOptions/Locales/ruRU.lua index 29e8f60..fda5706 100644 --- a/WeakAurasOptions/Locales/ruRU.lua +++ b/WeakAurasOptions/Locales/ruRU.lua @@ -148,8 +148,8 @@ Enable this setting if you want this timer to be hidden, or when using a WeakAur L["Anchor Mode"] = "Режим крепления" L["Anchor Point"] = "Точка крепления" L["Anchored To"] = "Прикрепить к" - L["and"] = "и" L["And "] = "И " + L["and"] = "и" L["and %s"] = "и %s" L["and aligned left"] = "Выранивание по левому краю;" L["and aligned right"] = "Выранивание по правому краю;" @@ -671,6 +671,8 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = "Время L["Re-center X"] = "Рецентрировать по X" L["Re-center Y"] = "Рецентрировать по Y" L["Reciprocal TRIGGER:# requests will be ignored!"] = "Ответный TRIGGER:# запрос будет проигнорирован!" + --[[Translation missing --]] + L["Redo"] = "Redo" L["Regions of type \"%s\" are not supported."] = "Регионы типа \"%s\" не поддерживаются." L["Remove"] = "Удалить" L["Remove All Sounds"] = "Удалить все звуки" @@ -789,7 +791,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = "Время L["Spell Selection Filters"] = "Фильтры выбора заклинания" L["Stack Info"] = "Информация о стаках" L["Stacks - The number of stacks of an aura (usually)"] = "Стаки - количество стаков ауры (обычно)" - L["Stagger"] = "Выступ (смещение уровня)" L["Standby"] = "Ожидает" L["Star"] = "Звезда" L["Start"] = "Начальная" @@ -884,6 +885,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "Триггер %i: %s" L["Trigger Combination"] = "Комбинация триггеров" L["Type 'select' for '%s' requires a values member'"] = "Для переменной %s типа select необходимо свойство values." + --[[Translation missing --]] + L["Undo"] = "Undo" L["Ungroup"] = "Разгруппировать" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "%s не является допустимой единицей для метода RegisterUnitEvent" L["Unit Count"] = "Количество единиц" @@ -900,8 +903,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Url: %s"] = "URL-адрес: %s" L["Use Display Info Id"] = "Использовать ID отображения существа" L["Use SetTransform"] = "Использовать ф. SetTransform" - L["Used in auras:"] = "Использовано в индикациях:" L["Used in Auras:"] = "Использовано в индикациях:" + L["Used in auras:"] = "Использовано в индикациях:" L["Uses Texture Coordinates to rotate the texture."] = "Использует координаты текстуры для её вращения." L["Uses UnitIsVisible() to check if game client has loaded a object for this unit. This distance is around 100 yards. This is polled every second."] = "Использует функцию UnitIsVisible для проверки, может ли клиент игры видеть указанную единицу (загружен ли объект). Не определяет, находится ли единица в поле зрения. Расстояние составляет 100 метров. Опрос происходит каждую секунду." L["Value"] = "Значение" diff --git a/WeakAurasOptions/Locales/zhCN.lua b/WeakAurasOptions/Locales/zhCN.lua index 96c0969..9aa2774 100644 --- a/WeakAurasOptions/Locales/zhCN.lua +++ b/WeakAurasOptions/Locales/zhCN.lua @@ -151,8 +151,8 @@ Enable this setting if you want this timer to be hidden, or when using a WeakAur L["Anchor Mode"] = "定位模式" L["Anchor Point"] = "锚点指向" L["Anchored To"] = "对齐到" - L["and"] = "和" L["And "] = "和" + L["and"] = "和" L["and %s"] = "并且 %s" L["and aligned left"] = "并且左对齐" L["and aligned right"] = "并且右对齐" @@ -673,6 +673,8 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[事件发 L["Re-center X"] = "到中心 X 偏移" L["Re-center Y"] = "到中心 Y 偏移" L["Reciprocal TRIGGER:# requests will be ignored!"] = "相互的TRIGGER:#请求将被忽略!" + --[[Translation missing --]] + L["Redo"] = "Redo" L["Regions of type \"%s\" are not supported."] = "%s 区域类型不被支持。" L["Remove"] = "移除" L["Remove All Sounds"] = "移除所有音效" @@ -784,7 +786,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[事件发 L["Spell Selection Filters"] = "法术选择过滤器" L["Stack Info"] = "层数信息" L["Stacks - The number of stacks of an aura (usually)"] = "堆叠 - 光环的堆叠层数(通常是)" - L["Stagger"] = "交错" L["Standby"] = "已就绪" L["Star"] = "星星" L["Start"] = "开始" @@ -873,6 +874,8 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "触发器%i:%s" L["Trigger Combination"] = "触发器组合" L["Type 'select' for '%s' requires a values member'"] = "'%s'的类型'select'需要至少一个'values'成员。" + --[[Translation missing --]] + L["Undo"] = "Undo" L["Ungroup"] = "不分组" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "单位 %s 并不是 RegisterUnitEvent 的有效单位" L["Unit Count"] = "单位计数" diff --git a/WeakAurasOptions/Locales/zhTW.lua b/WeakAurasOptions/Locales/zhTW.lua index 83a7da8..c63d25a 100644 --- a/WeakAurasOptions/Locales/zhTW.lua +++ b/WeakAurasOptions/Locales/zhTW.lua @@ -143,8 +143,8 @@ Enable this setting if you want this timer to be hidden, or when using a WeakAur L["Anchor Mode"] = "定位模式" L["Anchor Point"] = "對齊點" L["Anchored To"] = "對齊到" - L["and"] = "和" L["And "] = "和 " + L["and"] = "和" L["and %s"] = "以及 %s" L["and aligned left"] = "和靠左對齊" L["and aligned right"] = "和靠右對齊" @@ -663,6 +663,7 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[事件發 L["Re-center X"] = "重新水平置中" L["Re-center Y"] = "重新垂直置中" L["Reciprocal TRIGGER:# requests will be ignored!"] = "對應的觸發器:# 請求將被忽略!" + L["Redo"] = "重做" L["Regions of type \"%s\" are not supported."] = "不支援區域類型 \"%s\"。" L["Remove"] = "移除" L["Remove All Sounds"] = "移除所有音效" @@ -774,7 +775,6 @@ every 3 events starting from 2nd and ending at 11th: 2-11/3]=] ] = [=[事件發 L["Spell Selection Filters"] = "法術選擇過濾器" L["Stack Info"] = "堆疊層數資訊" L["Stacks - The number of stacks of an aura (usually)"] = "層數 - 光環的疊加數(通常)" - L["Stagger"] = "醉仙緩勁" L["Standby"] = "準備就緒" L["Star"] = "星星" L["Start"] = "開始" @@ -863,6 +863,7 @@ Upgrade your version of WeakAuras or wait for next release before installing thi L["Trigger %i: %s"] = "觸發器 %i: %s" L["Trigger Combination"] = "觸發組合" L["Type 'select' for '%s' requires a values member'"] = "'%s' 的類型 'select' 需要 values member" + L["Undo"] = "復原" L["Ungroup"] = "解散群組" L["Unit %s is not a valid unit for RegisterUnitEvent"] = "%s 不是 RegisterUnitEvent 的有效單位" L["Unit Count"] = "單位數量" diff --git a/WeakAurasOptions/OptionsFrames/OptionsFrame.lua b/WeakAurasOptions/OptionsFrames/OptionsFrame.lua index 2659998..aa0ad36 100644 --- a/WeakAurasOptions/OptionsFrames/OptionsFrame.lua +++ b/WeakAurasOptions/OptionsFrames/OptionsFrame.lua @@ -8,8 +8,8 @@ local pairs, type, error = pairs, type, error local _G = _G -- WoW APIs -local GetScreenWidth, GetScreenHeight, CreateFrame, GetAddOnInfo, UnitName - = GetScreenWidth, GetScreenHeight, CreateFrame, GetAddOnInfo, UnitName +local GetScreenWidth, GetScreenHeight, CreateFrame, GetAddOnInfo + = GetScreenWidth, GetScreenHeight, CreateFrame, GetAddOnInfo local AceGUI = LibStub("AceGUI-3.0") local AceConfigDialog = LibStub("AceConfigDialog-3.0") @@ -88,6 +88,8 @@ local defaultHeight = 665 local minWidth = 750 local minHeight = 240 + + function OptionsPrivate.CreateFrame() CreateFrame("Frame", "WeakAuras_DropDownMenu", nil, "UIDropDownMenuTemplate") local frame @@ -339,7 +341,7 @@ function OptionsPrivate.CreateFrame() tipFrame:Hide() frame.tipFrame = tipFrame - local tipPopup = CreateFrame("Frame", "WeakAuras_TipPopup", frame) + local tipPopup = CreateFrame("Frame", nil, frame) tipPopup:SetFrameStrata("FULLSCREEN") tipPopup:SetBackdrop({ bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", @@ -452,13 +454,13 @@ function OptionsPrivate.CreateFrame() local lineLength = 0 local currentLine = {} for _, patreon in ipairs(list) do - if lineLength + #patreon + 2 * #currentLine > 130 then + if lineLength + #patreon + 2 > 130 then tinsert(patreonLines, table.concat(currentLine, ", ") .. ", ") currentLine = {} tinsert(currentLine, patreon) - lineLength = #patreon + lineLength = #patreon + 2 else - lineLength = lineLength + #patreon + lineLength = lineLength + #patreon + 2 tinsert(currentLine, patreon) end end @@ -485,7 +487,6 @@ function OptionsPrivate.CreateFrame() local thanksListCJ = lineWrapDiscordList(OptionsPrivate.Private.DiscordListCJ) local thanksListK = lineWrapDiscordList(OptionsPrivate.Private.DiscordListK) - local discordButton = addFooter(L["Discord"], [[Interface\AddOns\WeakAuras\Media\Textures\discord.tga]], "https://discord.gg/UXSc7nt", L["Chat with WeakAuras experts on our Discord server."]) discordButton:SetParent(tipFrame) @@ -652,7 +653,85 @@ function OptionsPrivate.CreateFrame() -- Toolbar local toolbarContainer = CreateFrame("Frame", nil, buttonsContainer.frame) toolbarContainer:SetParent(buttonsContainer.frame) - toolbarContainer:Hide() + -- toolbarContainer:Hide() + toolbarContainer:SetPoint("TOPLEFT", buttonsContainer.frame, "TOPLEFT", 30, 30) + toolbarContainer:SetPoint("BOTTOMRIGHT", buttonsContainer.frame, "TOPRIGHT", 0, 0) + + local undo = AceGUI:Create("WeakAurasToolbarButton") + undo:SetText(L["Undo"]) + undo:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\upleft") + undo:SetCallback("OnClick", function() + OptionsPrivate.Private.TimeMachine:StepBackward() + frame:FillOptions() + end) + undo.frame:SetParent(toolbarContainer) + if OptionsPrivate.Private.Features:Enabled("undo") then + undo.frame:Show() + else + undo.frame:Hide() + end + undo:SetPoint("LEFT") + + local redo = AceGUI:Create("WeakAurasToolbarButton") + redo:SetText(L["Redo"]) + redo:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\upright") + redo:SetCallback("OnClick", function() + OptionsPrivate.Private.TimeMachine:StepForward() + frame:FillOptions() + end) + redo.frame:SetParent(toolbarContainer) + if OptionsPrivate.Private.Features:Enabled("undo") then + redo.frame:Show() + else + redo.frame:Hide() + end + redo:SetPoint("LEFT", undo.frame, "RIGHT", 10, 0) + if OptionsPrivate.Private.TimeMachine:DescribeNext() ~= nil then + redo.frame:Enable() + else + redo.frame:Disable() + end + OptionsPrivate.Private.Features:Subscribe("undo", + function() + undo.frame:Show() + redo.frame:Show() + end, + function() + undo.frame:Hide() + redo.frame:Hide() + end + ) + + local tmControls = { + undo = undo, + redo = redo, + } + + function tmControls:Step() + -- slightly annoying workaround + -- Buttons behave in a strange way if they are disabled inside of the OnClick handler + -- where the pushed texture refuses to vanish until the button is enabled & user clicks it again + -- so, just disable the button after next frame draw, so it's imperceptible to the user but we're not in the OnClick handler + WeakAuras.timer:ScheduleTimer(function() + self.undo:SetDisabled(OptionsPrivate.Private.TimeMachine:DescribePrevious() == nil) + self.redo:SetDisabled(OptionsPrivate.Private.TimeMachine:DescribeNext() == nil) + end, 0) + end + tmControls:Step() + OptionsPrivate.Private.TimeMachine.sub:AddSubscriber("Step", tmControls) + + + local newButton = AceGUI:Create("WeakAurasToolbarButton") + newButton:SetText(L["New Aura"]) + newButton:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\newaura") + newButton.frame:SetParent(toolbarContainer) + newButton.frame:Show() + newButton:SetPoint("LEFT", redo.frame, "RIGHT", 10, 0) + frame.toolbarContainer = toolbarContainer + + newButton:SetCallback("OnClick", function() + frame:NewAura() + end) local importButton = AceGUI:Create("WeakAurasToolbarButton") importButton:SetText(L["Import"]) @@ -660,20 +739,28 @@ function OptionsPrivate.CreateFrame() importButton:SetCallback("OnClick", OptionsPrivate.ImportFromString) importButton.frame:SetParent(toolbarContainer) importButton.frame:Show() - importButton:SetPoint("RIGHT", filterInput, "RIGHT") - importButton:SetPoint("BOTTOM", frame, "TOP", 0, -55) + importButton:SetPoint("LEFT", newButton.frame, "RIGHT", 10, 0) - local newButton = AceGUI:Create("WeakAurasToolbarButton") - newButton:SetText(L["New Aura"]) - newButton:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\newaura") - newButton.frame:SetParent(toolbarContainer) - newButton.frame:Show() - newButton:SetPoint("RIGHT", importButton.frame, "LEFT", -10, 0) - frame.toolbarContainer = toolbarContainer - - newButton:SetCallback("OnClick", function() - frame:NewAura() + local lockButton = AceGUI:Create("WeakAurasToolbarButton") + lockButton:SetText(L["Lock Positions"]) + lockButton:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\lockPosition") + lockButton:SetCallback("OnClick", function(self) + if WeakAurasOptionsSaved.lockPositions then + lockButton:SetStrongHighlight(false) + lockButton:UnlockHighlight() + WeakAurasOptionsSaved.lockPositions = false + else + lockButton:SetStrongHighlight(true) + lockButton:LockHighlight() + WeakAurasOptionsSaved.lockPositions = true + end end) + if WeakAurasOptionsSaved.lockPositions then + lockButton:LockHighlight() + end + lockButton.frame:SetParent(toolbarContainer) + lockButton.frame:Show() + lockButton:SetPoint("LEFT", importButton.frame, "RIGHT", 10, 0) local magnetButton = AceGUI:Create("WeakAurasToolbarButton") magnetButton:SetText(L["Magnetically Align"]) @@ -695,28 +782,8 @@ function OptionsPrivate.CreateFrame() end magnetButton.frame:SetParent(toolbarContainer) magnetButton.frame:Show() - magnetButton:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -17, -55) + magnetButton:SetPoint("LEFT", lockButton.frame, "RIGHT", 10, 0) - local lockButton = AceGUI:Create("WeakAurasToolbarButton") - lockButton:SetText(L["Lock Positions"]) - lockButton:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\lockPosition") - lockButton:SetCallback("OnClick", function(self) - if WeakAurasOptionsSaved.lockPositions then - lockButton:SetStrongHighlight(false) - lockButton:UnlockHighlight() - WeakAurasOptionsSaved.lockPositions = false - else - lockButton:SetStrongHighlight(true) - lockButton:LockHighlight() - WeakAurasOptionsSaved.lockPositions = true - end - end) - if WeakAurasOptionsSaved.lockPositions then - lockButton:LockHighlight() - end - lockButton.frame:SetParent(toolbarContainer) - lockButton.frame:Show() - lockButton:SetPoint("RIGHT", magnetButton.frame, "LEFT", -10, 0) local loadProgress = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal") loadProgress:SetPoint("TOP", buttonsContainer.frame, "TOP", 0, -4) @@ -728,7 +795,6 @@ function OptionsPrivate.CreateFrame() self:UpdateFrameVisible() end - local buttonsScroll = AceGUI:Create("ScrollFrame") buttonsScroll:SetLayout("ButtonsScrollLayout") buttonsScroll.width = "fill" diff --git a/WeakAurasOptions/RegionOptions/Text.lua b/WeakAurasOptions/RegionOptions/Text.lua index ff38940..47859ca 100644 --- a/WeakAurasOptions/RegionOptions/Text.lua +++ b/WeakAurasOptions/RegionOptions/Text.lua @@ -57,6 +57,10 @@ local function createOptions(id, data) end, set = function(info, v) data.displayText = OptionsPrivate.Private.ReplaceLocalizedRaidMarkers(v); + + local metaData = OptionsPrivate.Private.GetAdditionalProperties(data) + OptionsPrivate.Private.SetDefaultFormatters(data, data.displayText, "displayText_format_", metaData) + WeakAuras.Add(data); WeakAuras.ClearAndUpdateOptions(data.id) WeakAuras.UpdateThumbnail(data); diff --git a/WeakAurasOptions/SubRegionOptions/SubText.lua b/WeakAurasOptions/SubRegionOptions/SubText.lua index a6f87d9..af09f18 100644 --- a/WeakAurasOptions/SubRegionOptions/SubText.lua +++ b/WeakAurasOptions/SubRegionOptions/SubText.lua @@ -53,6 +53,9 @@ local function createOptions(parentData, data, index, subIndex) order = 11, set = function(info, v) data.text_text = OptionsPrivate.Private.ReplaceLocalizedRaidMarkers(v) + local metaData = OptionsPrivate.Private.GetAdditionalProperties(parentData) + OptionsPrivate.Private.SetDefaultFormatters(data, data.text_text, "text_text_format_", metaData) + WeakAuras.Add(parentData) WeakAuras.ClearAndUpdateOptions(parentData.id) end, @@ -530,7 +533,6 @@ local function createOptions(parentData, data, index, subIndex) end end end - OptionsPrivate.AddTextFormatOption(texts, true, get, addOption, hidden, setHidden, false, listIndex, #list) end diff --git a/WeakAurasOptions/TriggerOptions.lua b/WeakAurasOptions/TriggerOptions.lua index d2933e3..083b8fe 100644 --- a/WeakAurasOptions/TriggerOptions.lua +++ b/WeakAurasOptions/TriggerOptions.lua @@ -222,6 +222,23 @@ local function DeleteConditionsForTrigger(data, triggernum) end end +local function FixUpProgressSourceAfterDelete(data, triggernum) + local function FixUpProgressSource(data) + if data.progressSource then + local trigger, property = unpack(data.progressSource) + if trigger > triggernum then + data.progressSource = {trigger - 1, property} + end + end + end + + FixUpProgressSource(data) + + for _, subRegionData in ipairs(data.subRegions) do + FixUpProgressSource(subRegionData) + end +end + local function moveTriggerDownConditionCheck(check, i) if (check.trigger == i) then check.trigger = i + 1; @@ -244,6 +261,23 @@ local function moveTriggerDownImpl(data, i) moveTriggerDownConditionCheck(condition.check, i); end + local function fixUpProgressSource(data) + if data.progressSource then + local trigger, property = unpack(data.progressSource) + if trigger == i then + data.progressSource = {i + 1, property} + elseif trigger == i + 1 then + data.progressSource = {i, property} + end + end + end + + fixUpProgressSource(data) + + for _, subRegionData in ipairs(data.subRegions) do + fixUpProgressSource(subRegionData) + end + return true; end @@ -352,6 +386,7 @@ function OptionsPrivate.AddTriggerMetaFunctions(options, data, triggernum) if #child.triggers > 1 and #child.triggers >= triggernum then tremove(child.triggers, triggernum) DeleteConditionsForTrigger(child, triggernum) + FixUpProgressSourceAfterDelete(child, triggernum) WeakAuras.Add(child) OptionsPrivate.RemoveCollapsed(collapsedId, "trigger", {triggernum}) OptionsPrivate.ClearOptions(child.id) diff --git a/WeakAurasOptions/VersionCheck.lua b/WeakAurasOptions/VersionCheck.lua index e8cf344..b6aee23 100644 --- a/WeakAurasOptions/VersionCheck.lua +++ b/WeakAurasOptions/VersionCheck.lua @@ -3,7 +3,7 @@ local Private = select(2, ...) local L = WeakAuras.L -local optionsVersion = "5.19.12 Beta" +local optionsVersion = "5.20.0 Beta" if optionsVersion ~= WeakAuras.versionString then local message = string.format(L["The WeakAuras Options Addon version %s doesn't match the WeakAuras version %s. If you updated the addon while the game was running, try restarting World of Warcraft. Otherwise try reinstalling WeakAuras"], diff --git a/WeakAurasOptions/WeakAurasOptions.lua b/WeakAurasOptions/WeakAurasOptions.lua index 4120945..61f1fa7 100644 --- a/WeakAurasOptions/WeakAurasOptions.lua +++ b/WeakAurasOptions/WeakAurasOptions.lua @@ -1772,8 +1772,8 @@ function OptionsPrivate.UpdateTextReplacements(frame, data) local tempProps = {} -- Add the properties to the temporary table - for name, desc in pairs(triggerProps) do - table.insert(tempProps, {triggerNum = triggerNum, name = name, desc = desc}) + for name, data in pairs(triggerProps) do + table.insert(tempProps, {triggerNum = triggerNum, name = name, desc = data.display}) end -- Sort the temporary table by name diff --git a/WeakAurasOptions/WeakAurasOptions.toc b/WeakAurasOptions/WeakAurasOptions.toc index dfdcef4..b6d5a31 100644 --- a/WeakAurasOptions/WeakAurasOptions.toc +++ b/WeakAurasOptions/WeakAurasOptions.toc @@ -1,7 +1,7 @@ ## Interface: 30300 ## Title: WeakAuras Options ## Author: The WeakAuras Team -## Version: 5.19.12 +## Version: 5.20.0 ## IconTexture: Interface\AddOns\WeakAuras\Media\Textures\icon.blp ## Notes: Options for WeakAuras ## Notes-esES: Opciones para WeakAuras diff --git a/WeakAurasTemplates/WeakAurasTemplates.toc b/WeakAurasTemplates/WeakAurasTemplates.toc index 6631845..282070e 100644 --- a/WeakAurasTemplates/WeakAurasTemplates.toc +++ b/WeakAurasTemplates/WeakAurasTemplates.toc @@ -1,7 +1,7 @@ ## Interface: 30300 ## Title: WeakAuras Templates ## Author: The WeakAuras Team -## Version: 5.19.12 +## Version: 5.20.0 ## Notes: Templates for WeakAuras ## Notes-esES: Plantillas para WeakAuras ## Notes-esMX: Plantillas para WeakAuras