You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1292 lines
43 KiB

if not WeakAuras.IsCorrectVersion() then return end
local AddonName, Private = ...
-- Takes as input a table of display data and attempts to update it to be compatible with the current version
function Private.Modernize(data)
if (not data.internalVersion or data.internalVersion < 2) then
WeakAuras.prettyPrint(string.format("Data for '%s' is too old, can't modernize.", data.id))
data.internalVersion = 2;
end
-- Version 3 was introduced April 2018 in Legion
if (data.internalVersion < 3) then
if (data.parent) then
local parentData = WeakAuras.GetData(data.parent);
if(parentData and parentData.regionType == "dynamicgroup") then
-- Version 3 allowed for offsets for dynamic groups, before that they were ignored
-- Thus reset them in the V2 to V3 upgrade
data.xOffset = 0;
data.yOffset = 0;
end
end
end
-- Version 4 was introduced July 2018 in BfA
if (data.internalVersion < 4) then
if (data.conditions) then
for conditionIndex, condition in ipairs(data.conditions) do
if (condition.check) then
local triggernum = condition.check.trigger;
if (triggernum) then
local trigger;
if (triggernum == 0) then
trigger = data.trigger;
elseif(data.additional_triggers and data.additional_triggers[triggernum]) then
trigger = data.additional_triggers[triggernum].trigger;
end
if (trigger and trigger.event == "Cooldown Progress (Spell)") then
if (condition.check.variable == "stacks") then
condition.check.variable = "charges";
end
end
end
end
end
end
end
-- Version 5 was introduced July 2018 in BfA
if data.internalVersion < 5 then
-- this is to fix hybrid sorting
if data.sortHybridTable then
if data.controlledChildren then
local newSortTable = {}
for index, isHybrid in pairs(data.sortHybridTable) do
local childID = data.controlledChildren[index]
if childID then
newSortTable[childID] = isHybrid
end
end
data.sortHybridTable = newSortTable
end
end
end
-- Version 6 was introduced July 30 2018 in BfA
if data.internalVersion < 6 then
if data.triggers then
for triggernum, triggerData in ipairs(data.triggers) do
local trigger = triggerData.trigger;
if trigger and trigger.type == "aura" then
if trigger.showOn == "showOnMissing" then
trigger.buffShowOn = "showOnMissing"
elseif trigger.showOn == "showActiveOrMissing" then
trigger.buffShowOn = "showAlways"
else
trigger.buffShowOn = "showOnActive"
end
trigger.showOn = nil
elseif trigger and trigger.type ~= "aura" then
trigger.genericShowOn = trigger.showOn or "showOnActive"
trigger.showOn = nil
trigger.use_genericShowOn = trigger.use_showOn
end
end
end
end
-- Version 7 was introduced September 1 2018 in BfA
-- Triggers were cleaned up into a 1-indexed array
if data.internalVersion < 7 then
-- migrate trigger data
data.triggers = data.additional_triggers or {}
tinsert(data.triggers, 1, {
trigger = data.trigger or {},
untrigger = data.untrigger or {},
})
data.additional_triggers = nil
data.trigger = nil
data.untrigger = nil
data.numTriggers = nil
data.triggers.customTriggerLogic = data.customTriggerLogic
data.customTriggerLogic = nil
local activeTriggerMode = data.activeTriggerMode or Private.trigger_modes.first_active
if activeTriggerMode ~= Private.trigger_modes.first_active then
activeTriggerMode = activeTriggerMode + 1
end
data.triggers.activeTriggerMode = activeTriggerMode
data.activeTriggerMode = nil
data.triggers.disjunctive = data.disjunctive
data.disjunctive = nil
-- migrate condition trigger references
local function recurseRepairChecks(checks)
if not checks then return end
for _, check in pairs(checks) do
if check.trigger and check.trigger >= 0 then
check.trigger = check.trigger + 1
end
recurseRepairChecks(check.checks)
end
end
for _, condition in pairs(data.conditions) do
if condition.check.trigger and condition.check.trigger >= 0 then
condition.check.trigger = condition.check.trigger + 1
end
recurseRepairChecks(condition.check.checks)
end
end
-- Version 8 was introduced in September 2018
-- Changes are in PreAdd
-- Version 9 was introduced in September 2018
if data.internalVersion < 9 then
local function repairCheck(check)
if check and check.variable == "buffed" then
local trigger = check.trigger and data.triggers[check.trigger] and data.triggers[check.trigger].trigger;
if (trigger) then
if(trigger.buffShowOn == "showOnActive") then
check.variable = "show";
elseif (trigger.buffShowOn == "showOnMissing") then
check.variable = "show";
check.value = check.value == 0 and 1 or 0;
end
end
end
end
local function recurseRepairChecks(checks)
if not checks then return end
for _, check in pairs(checks) do
repairCheck(check);
recurseRepairChecks(check.checks);
end
end
for _, condition in pairs(data.conditions) do
repairCheck(condition.check);
recurseRepairChecks(condition.check.checks);
end
end
-- Version 10 is skipped, due to a bad migration script (see https://github.com/WeakAuras/WeakAuras2/pull/1091)
-- Version 11 was introduced in January 2019
if data.internalVersion < 11 then
if data.url and data.url ~= "" then
local slug, version = data.url:match("wago.io/([^/]+)/([0-9]+)")
if not slug and not version then
version = 1
end
if version and tonumber(version) then
data.version = tonumber(version)
end
end
end
-- Version 12 was introduced February 2019 in BfA
if (data.internalVersion < 12) then
if data.cooldownTextEnabled ~= nil then
data.cooldownTextDisabled = not data.cooldownTextEnabled
data.cooldownTextEnabled = nil
end
end
-- Version 13 was introduced March 2019 in BfA
if data.internalVersion < 13 then
if data.regionType == "dynamicgroup" then
local selfPoints = {
default = "CENTER",
RIGHT = function(data)
if data.align == "LEFT" then
return "TOPLEFT"
elseif data.align == "RIGHT" then
return "BOTTOMLEFT"
else
return "LEFT"
end
end,
LEFT = function(data)
if data.align == "LEFT" then
return "TOPRIGHT"
elseif data.align == "RIGHT" then
return "BOTTOMRIGHT"
else
return "RIGHT"
end
end,
UP = function(data)
if data.align == "LEFT" then
return "BOTTOMLEFT"
elseif data.align == "RIGHT" then
return "BOTTOMRIGHT"
else
return "BOTTOM"
end
end,
DOWN = function(data)
if data.align == "LEFT" then
return "TOPLEFT"
elseif data.align == "RIGHT" then
return "TOPRIGHT"
else
return "TOP"
end
end,
HORIZONTAL = function(data)
if data.align == "LEFT" then
return "TOP"
elseif data.align == "RIGHT" then
return "BOTTOM"
else
return "CENTER"
end
end,
VERTICAL = function(data)
if data.align == "LEFT" then
return "LEFT"
elseif data.align == "RIGHT" then
return "RIGHT"
else
return "CENTER"
end
end,
CIRCLE = "CENTER",
COUNTERCIRCLE = "CENTER",
}
local selfPoint = selfPoints[data.grow or "DOWN"] or selfPoints.DOWN
if type(selfPoint) == "function" then
selfPoint = selfPoint(data)
end
data.selfPoint = selfPoint
end
end
-- Version 14 was introduced March 2019 in BfA
if data.internalVersion < 14 then
if data.triggers then
for triggerId, triggerData in pairs(data.triggers) do
if type(triggerData) == "table"
and triggerData.trigger
and triggerData.trigger.debuffClass
and type(triggerData.trigger.debuffClass) == "string"
and triggerData.trigger.debuffClass ~= ""
then
local idx = triggerData.trigger.debuffClass
data.triggers[triggerId].trigger.debuffClass = { [idx] = true }
end
end
end
end
-- Version 15 was introduced April 2019 in BfA
if data.internalVersion < 15 then
if data.triggers then
for triggerId, triggerData in ipairs(data.triggers) do
if triggerData.trigger.type == "status" and triggerData.trigger.event == "Spell Known" then
triggerData.trigger.use_exact_spellName = true
end
end
end
end
-- Version 16 was introduced May 2019 in BfA
if data.internalVersion < 16 then
-- first conversion: attempt to migrate texture paths to file ids
if data.regionType == "texture" and type(data.texture) == "string" then
local textureId = GetFileIDFromPath(data.texture:gsub("\\\\", "\\"))
if textureId and textureId > 0 then
data.texture = tostring(textureId)
end
end
if data.regionType == "progresstexture" then
if type(data.foregroundTexture) == "string" then
local textureId = GetFileIDFromPath(data.foregroundTexture:gsub("\\\\", "\\"))
if textureId and textureId > 0 then
data.foregroundTexture = tostring(textureId)
end
end
if type(data.backgroundTexture) == "string" then
local textureId = GetFileIDFromPath(data.backgroundTexture:gsub("\\\\", "\\"))
if textureId and textureId > 0 then
data.backgroundTexture = tostring(textureId)
end
end
end
-- second conversion: migrate name/realm conditions to tristate
if data.load.use_name == false then
data.load.use_name = nil
end
if data.load.use_realm == false then
data.load.use_realm = nil
end
end
-- Version 18 was a migration for stance/form trigger, but deleted later because of migration issue
-- Version 19 were introduced in July 2019 in BfA
if data.internalVersion < 19 then
if data.triggers then
for triggerId, triggerData in ipairs(data.triggers) do
if triggerData.trigger.type == "status" and triggerData.trigger.event == "Cast" and triggerData.trigger.unit == "multi" then
triggerData.trigger.unit = "nameplate"
end
end
end
end
-- Version 20 was introduced July 2019 in BfA
if data.internalVersion < 20 then
if data.regionType == "icon" then
local convertPoint = function(containment, point)
if not point or point == "CENTER" then
return "CENTER"
elseif containment == "INSIDE" then
return "INNER_" .. point
elseif containment == "OUTSIDE" then
return "OUTER_" .. point
end
end
local text1 = {
["type"] = "subtext",
text_visible = data.text1Enabled ~= false,
text_color = data.text1Color,
text_text = data.text1,
text_font = data.text1Font,
text_fontSize = data.text1FontSize,
text_fontType = data.text1FontFlags,
text_selfPoint = "AUTO",
text_anchorPoint = convertPoint(data.text1Containment, data.text1Point),
anchorXOffset = 0,
anchorYOffset = 0,
text_shadowColor = { 0, 0, 0, 1},
text_shadowXOffset = 0,
text_shadowYOffset = 0,
}
local usetext2 = data.text2Enabled
local text2 = {
["type"] = "subtext",
text_visible = data.text2Enabled or false,
text_color = data.text2Color,
text_text = data.text2,
text_font = data.text2Font,
text_fontSize = data.text2FontSize,
text_fontType = data.text2FontFlags,
text_selfPoint = "AUTO",
text_anchorPoint = convertPoint(data.text2Containment, data.text2Point),
anchorXOffset = 0,
anchorYOffset = 0,
text_shadowColor = { 0, 0, 0, 1},
text_shadowXOffset = 0,
text_shadowYOffset = 0,
}
data.text1Enabled = nil
data.text1Color = nil
data.text1 = nil
data.text1Font = nil
data.text1FontSize = nil
data.text1FontFlags = nil
data.text1Containment = nil
data.text1Point = nil
data.text2Enabled = nil
data.text2Color = nil
data.text2 = nil
data.text2Font = nil
data.text2FontSize = nil
data.text2FontFlags = nil
data.text2Containment = nil
data.text2Point = nil
local propertyRenames = {
text1Color = "sub.1.text_color",
text1FontSize = "sub.1.text_fontSize",
text2Color = "sub.2.text_color",
text2FontSize = "sub.2.text_fontSize"
}
data.subRegions = data.subRegions or {}
tinsert(data.subRegions, text1)
if (usetext2) then
tinsert(data.subRegions, text2)
end
if (data.conditions) then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if propertyRenames[change.property] then
change.property = propertyRenames[change.property]
end
end
end
end
end
end
-- Version 20 was introduced May 2019 in BfA
if data.internalVersion < 20 then
if data.regionType == "aurabar" then
local orientationToPostion = {
HORIZONTAL_INVERSE = { "INNER_LEFT", "INNER_RIGHT" },
HORIZONTAL = { "INNER_RIGHT", "INNER_LEFT" },
VERTICAL_INVERSE = { "INNER_BOTTOM", "INNER_TOP" },
VERTICAL = {"INNER_TOP", "INNER_BOTTOM"}
}
local positions = orientationToPostion[data.orientation] or { "INNER_LEFT", "INNER_RIGHT" }
local text1 = {
["type"] = "subtext",
text_visible = data.timer,
text_color = data.timerColor,
text_text = data.displayTextRight,
text_font = data.timerFont,
text_fontSize = data.timerSize,
text_fontType = data.timerFlags,
text_selfPoint = "AUTO",
text_anchorPoint = positions[1],
anchorXOffset = 0,
anchorYOffset = 0,
text_shadowColor = { 0, 0, 0, 1},
text_shadowXOffset = 1,
text_shadowYOffset = -1,
rotateText = data.rotateText
}
local text2 = {
["type"] = "subtext",
text_visible = data.text,
text_color = data.textColor,
text_text = data.displayTextLeft,
text_font = data.textFont,
text_fontSize = data.textSize,
text_fontType = data.textFlags,
text_selfPoint = "AUTO",
text_anchorPoint = positions[2],
anchorXOffset = 0,
anchorYOffset = 0,
text_shadowColor = { 0, 0, 0, 1},
text_shadowXOffset = 1,
text_shadowYOffset = -1,
rotateText = data.rotateText
}
local text3 = {
["type"] = "subtext",
text_visible = data.stacks,
text_color = data.stacksColor,
text_text = "%s",
text_font = data.stacksFont,
text_fontSize = data.stacksSize,
text_fontType = data.stacksFlags,
text_selfPoint = "AUTO",
text_anchorPoint = "ICON_CENTER",
anchorXOffset = 0,
anchorYOffset = 0,
text_shadowColor = { 0, 0, 0, 1},
text_shadowXOffset = 1,
text_shadowYOffset = -1,
rotateText = data.rotateText
}
data.timer = nil
data.textColor = nil
data.displayTextRight = nil
data.textFont = nil
data.textSize = nil
data.textFlags = nil
data.text = nil
data.timerColor = nil
data.displayTextLeft = nil
data.timerFont = nil
data.timerSize = nil
data.timerFlags = nil
data.stacks = nil
data.stacksColor = nil
data.stacksFont = nil
data.stacksSize = nil
data.stacksFlags = nil
data.rotateText = nil
local propertyRenames = {
timerColor = "sub.1.text_color",
timerSize = "sub.1.text_fontSize",
textColor = "sub.2.text_color",
textSize = "sub.2.text_fontSize",
stacksColor = "sub.3.text_color",
stacksSize = "sub.3.text_fontSize",
}
data.subRegions = data.subRegions or {}
tinsert(data.subRegions, text1)
tinsert(data.subRegions, text2)
tinsert(data.subRegions, text3)
if (data.conditions) then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if propertyRenames[change.property] then
change.property = propertyRenames[change.property]
end
end
end
end
end
end
if data.internalVersion < 21 then
if data.regionType == "dynamicgroup" then
data.border = data.background and data.background ~= "None"
data.borderEdge = data.border
data.borderBackdrop = data.background ~= "None" and data.background
data.borderInset = data.backgroundInset
data.background = nil
data.backgroundInset = nil
end
end
if data.internalVersion < 22 then
if data.regionType == "aurabar" then
data.subRegions = data.subRegions or {}
local border = {
["type"] = "subborder",
border_visible = data.border,
border_color = data.borderColor,
border_edge = data.borderEdge,
border_offset = data.borderOffset,
border_size = data.borderSize,
border_anchor = "bar",
}
data.border = nil
data.borderColor = nil
data.borderEdge = nil
data.borderOffset = nil
data.borderInset = nil
data.borderSize = nil
if data.borderInFront then
tinsert(data.subRegions, border)
else
tinsert(data.subRegions, 1, border)
end
local propertyRenames = {
borderColor = "sub.".. #data.subRegions..".border_color",
}
if (data.conditions) then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if propertyRenames[change.property] then
change.property = propertyRenames[change.property]
end
end
end
end
end
end
if data.internalVersion < 23 then
if data.triggers then
for triggerId, triggerData in ipairs(data.triggers) do
local trigger = triggerData.trigger
-- Stance/Form/Aura form field type changed from type="select" to type="multiselect"
if trigger and trigger.type == "status" and trigger.event == "Stance/Form/Aura" then
local value = trigger.form
if type(value) ~= "table" then
if trigger.use_form == false then
if value then
trigger.form = { multi = { [value] = true } }
else
trigger.form = { multi = { } }
end
elseif trigger.use_form then
trigger.form = { single = value }
end
end
end
end
end
end
if data.internalVersion < 24 then
if data.triggers then
for triggerId, triggerData in ipairs(data.triggers) do
local trigger = triggerData.trigger
if trigger and trigger.type == "status" and trigger.event == "Weapon Enchant" then
if trigger.use_inverse then
trigger.showOn = "showOnMissing"
else
trigger.showOn = "showOnActive"
end
trigger.use_inverse = nil
if not trigger.use_weapon then
trigger.use_weapon = "true"
trigger.weapon = "main"
end
end
end
end
end
if data.internalVersion < 25 then
if data.regionType == "icon" then
data.subRegions = data.subRegions or {}
-- Need to check if glow is needed
local prefix = "sub.".. #data.subRegions + 1 .. "."
-- For Conditions
local propertyRenames = {
glow = prefix .. "glow",
useGlowColor = prefix .. "useGlowColor",
glowColor = prefix .. "glowColor",
glowType = prefix .. "glowType",
glowLines = prefix .. "glowLines",
glowFrequency = prefix .. "glowFrequency",
glowLength = prefix .. "glowLength",
glowThickness = prefix .. "glowThickness",
glowScale = prefix .. "glowScale",
glowBorder = prefix .. "glowBorder",
glowXOffset = prefix .. "glowXOffset",
glowYOffset = prefix .. "glowYOffset",
}
local needsGlow = data.glow
if (not needsGlow and data.conditions) then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if propertyRenames[change.property] then
needsGlow = true
break
end
end
end
end
if needsGlow then
local glow = {
["type"] = "subglow",
glow = data.glow,
useGlowColor = data.useGlowColor,
glowColor = data.glowColor,
glowType = data.glowType,
glowLines = data.glowLines,
glowFrequency = data.glowFrequency,
glowLength = data.glowLength,
glowThickness = data.glowThickness,
glowScale = data.glowScale,
glowBorder = data.glowBorder,
glowXOffset = data.glowXOffset,
glowYOffset = data.glowYOffset,
}
tinsert(data.subRegions, glow)
end
data.glow = nil
data.useglowColor = nil
data.useGlowColor = nil
data.glowColor = nil
data.glowType = nil
data.glowLines = nil
data.glowFrequency = nil
data.glowLength = nil
data.glowThickness = nil
data.glowScale = nil
data.glowBorder = nil
data.glowXOffset = nil
data.glowYOffset = nil
if (data.conditions) then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if propertyRenames[change.property] then
change.property = propertyRenames[change.property]
end
end
end
end
end
end
if data.internalVersion < 26 then
if data.conditions then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if change.property == "xOffset" or change.property == "yOffset" then
change.value = (change.value or 0) - (data[change.property] or 0)
change.property = change.property .. "Relative"
end
end
end
end
end
if data.internalVersion < 28 then
if data.actions then
if data.actions.start and data.actions.start.do_glow then
data.actions.start.glow_frame_type = "FRAMESELECTOR"
end
if data.actions.finish and data.actions.finish.do_glow then
data.actions.finish.glow_frame_type = "FRAMESELECTOR"
end
end
end
if data.internalVersion < 29 then
if data.actions then
if data.actions.start
and data.actions.start.do_glow
and data.actions.start.glow_type == nil
then
data.actions.start.glow_type = "buttonOverlay"
end
if data.actions.finish
and data.actions.finish.do_glow
and data.actions.finish.glow_type == nil
then
data.actions.finish.glow_type = "buttonOverlay"
end
end
end
if data.internalVersion < 30 then
local convertLegacyPrecision = function(precision)
if not precision then
return 1
end
if precision < 4 then
return precision, false
else
return precision - 3, true
end
end
local progressPrecision = data.progressPrecision
local totalPrecision = data.totalPrecision
if data.regionType == "text" then
local seenSymbols = {}
Private.ParseTextStr(data.displayText, function(symbol)
if not seenSymbols[symbol] then
local triggerNum, sym = string.match(symbol, "(.+)%.(.+)")
sym = sym or symbol
if sym == "p" or sym == "t" then
data["displayText_format_" .. symbol .. "_format"] = "timed"
data["displayText_format_" .. symbol .. "_time_precision"], data["displayText_format_" .. symbol .. "_time_dynamic"]
= convertLegacyPrecision(sym == "p" and progressPrecision or totalPrecision)
end
end
seenSymbols[symbol] = symbol
end)
end
if data.subRegions then
for index, subRegionData in ipairs(data.subRegions) do
if subRegionData.type == "subtext" then
local seenSymbols = {}
Private.ParseTextStr(subRegionData.text_text, function(symbol)
if not seenSymbols[symbol] then
local triggerNum, sym = string.match(symbol, "(.+)%.(.+)")
sym = sym or symbol
if sym == "p" or sym == "t" then
subRegionData["text_text_format_" .. symbol .. "_format"] = "timed"
subRegionData["text_text_format_" .. symbol .. "_time_precision"], subRegionData["text_text_format_" .. symbol .. "_time_dynamic"]
= convertLegacyPrecision(sym == "p" and progressPrecision or totalPrecision)
end
end
seenSymbols[symbol] = symbol
end)
end
end
end
if data.actions then
for _, when in ipairs{ "start", "finish" } do
if data.actions[when] then
local seenSymbols = {}
Private.ParseTextStr(data.actions[when].message, function(symbol)
if not seenSymbols[symbol] then
local triggerNum, sym = string.match(symbol, "(.+)%.(.+)")
sym = sym or symbol
if sym == "p" or sym == "t" then
data.actions[when]["message_format_" .. symbol .. "_format"] = "timed"
data.actions[when]["message_format_" .. symbol .. "_time_precision"], data.actions[when]["message_format_" .. symbol .. "_time_dynamic"]
= convertLegacyPrecision(sym == "p" and progressPrecision or totalPrecision)
end
end
seenSymbols[symbol] = symbol
end)
end
end
end
if data.conditions then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if change.property == "chat" and change.value then
local seenSymbols = {}
Private.ParseTextStr(change.value.message, function(symbol)
if not seenSymbols[symbol] then
local triggerNum, sym = string.match(symbol, "(.+)%.(.+)")
sym = sym or symbol
if sym == "p" or sym == "t" then
change.value["message_format_" .. symbol .. "_format"] = "timed"
change.value["message_format_" .. symbol .. "_time_precision"], change.value["message_format_" .. symbol .. "_time_dynamic"]
= convertLegacyPrecision(sym == "p" and progressPrecision or totalPrecision)
end
end
seenSymbols[symbol] = symbol
end)
end
end
end
end
data.progressPrecision = nil
data.totalPrecision = nil
end
-- Introduced in June 2020 in BfA
if data.internalVersion < 31 then
local allowedNames
local ignoredNames
if data.load.use_name == true and data.load.name then
allowedNames = data.load.name
elseif data.load.use_name == false and data.load.name then
ignoredNames = data.load.name
end
if data.load.use_realm == true and data.load.realm then
allowedNames = (allowedNames or "") .. "-" .. data.load.realm
elseif data.load.use_realm == false and data.load.realm then
ignoredNames = (ignoredNames or "") .. "-" .. data.load.realm
end
if allowedNames then
data.load.use_namerealm = true
data.load.namerealm = allowedNames
end
if ignoredNames then
data.load.use_namerealmblack = true
data.load.namerealmblack = ignoredNames
end
data.load.use_name = nil
data.load.name = nil
data.load.use_realm = nil
data.load.realm = nil
end
-- Introduced in June 2020 in BfA
if data.internalVersion < 32 then
local replacements = {}
local function repairCheck(replacements, check)
if check and check.trigger then
if replacements[check.trigger] then
if replacements[check.trigger][check.variable] then
check.variable = replacements[check.trigger][check.variable]
end
end
end
end
if data.triggers then
for triggerId, triggerData in ipairs(data.triggers) do
if triggerData.trigger.type == "status" then
local event = triggerData.trigger.event
if event == "Unit Characteristics" or event == "Health" or event == "Power" then
replacements[triggerId] = {}
replacements[triggerId]["use_name"] = "use_namerealm"
replacements[triggerId]["name"] = "namerealm"
elseif event == "Alternate Power" then
replacements[triggerId] = {}
replacements[triggerId]["use_unitname"] = "use_namerealm"
replacements[triggerId]["unitname"] = "namerealm"
elseif event == "Cast" then
replacements[triggerId] = {}
replacements[triggerId]["use_sourceName"] = "use_sourceNameRealm"
replacements[triggerId]["sourceName"] = "sourceNameRealm"
replacements[triggerId]["use_destName"] = "use_destNameRealm"
replacements[triggerId]["destName"] = "destNameRealm"
end
if replacements[triggerId] then
for old, new in pairs(replacements[triggerId]) do
triggerData.trigger[new] = triggerData.trigger[old]
triggerData.trigger[old] = nil
end
local function recurseRepairChecks(replacements, checks)
if not checks then return end
for _, check in pairs(checks) do
repairCheck(replacements, check);
recurseRepairChecks(replacements, check.checks);
end
end
for _, condition in pairs(data.conditions) do
repairCheck(replacements, condition.check);
recurseRepairChecks(replacements, condition.check.checks);
end
end
end
end
end
end
-- Introduced in July 2020 in BfA
if data.internalVersion < 33 then
data.load.use_ignoreNameRealm = data.load.use_namerealmblack
data.load.ignoreNameRealm = data.load.namerealmblack
data.load.use_namerealmblack = nil
data.load.namerealmblack = nil
-- trigger.useBlackExactSpellId and trigger.blackauraspellids
if data.triggers then
for triggerId, triggerData in ipairs(data.triggers) do
triggerData.trigger.useIgnoreName = triggerData.trigger.useBlackName
triggerData.trigger.ignoreAuraNames = triggerData.trigger.blackauranames
triggerData.trigger.useIgnoreExactSpellId = triggerData.trigger.useBlackExactSpellId
triggerData.trigger.ignoreAuraSpellids = triggerData.trigger.blackauraspellids
triggerData.trigger.useBlackName = nil
triggerData.trigger.blackauranames = nil
triggerData.trigger.useBlackExactSpellId = nil
triggerData.trigger.blackauraspellids = nil
end
end
end
-- Introduced in July 2020 in Shadowlands
if data.internalVersion < 34 then
if data.regionType == 'dynamicgroup'
and (data.grow == "CIRCLE" or data.grow == "COUNTERCIRCLE") then
if data.arcLength == 360 then
data.fullCircle = true
else
data.fullCircle = false
end
end
end
if data.internalVersion < 35 then
if data.regionType == 'texture' then
data.textureWrapMode = "CLAMP"
end
end
if data.internalVersion < 36 then
data.ignoreOptionsEventErrors = true
end
if data.internalVersion < 37 then
for triggerId, triggerData in ipairs(data.triggers) do
if triggerData.trigger.type == "aura2" then
local group_role = triggerData.trigger.group_role
if group_role then
triggerData.trigger.group_role = {}
triggerData.trigger.group_role[group_role] = true
end
end
end
end
if data.internalVersion < 38 then
for triggerId, triggerData in ipairs(data.triggers) do
if triggerData.trigger.type == "status" then
if triggerData.trigger.event == "Item Type Equipped" then
if triggerData.trigger.itemTypeName then
if triggerData.trigger.itemTypeName.single then
triggerData.trigger.itemTypeName.single = triggerData.trigger.itemTypeName.single + 2 * 256
end
if triggerData.trigger.itemTypeName.multi then
local converted = {}
for v in pairs(triggerData.trigger.itemTypeName.multi) do
converted[v + 512] = true
end
triggerData.trigger.itemTypeName.multi = converted
end
end
end
end
end
if data.load.itemtypeequipped then
if data.load.itemtypeequipped.single then
data.load.itemtypeequipped.single = data.load.itemtypeequipped.single + 2 * 256
end
if data.load.itemtypeequipped.multi then
local converted = {}
for v in pairs(data.load.itemtypeequipped.multi) do
converted[v + 512] = true
end
data.load.itemtypeequipped.multi = converted
end
end
end
if data.internalVersion < 39 then
if data.regionType == 'icon' or data.regionType == 'aurabar' then
if data.auto then
data.iconSource = -1
else
data.iconSource = 0
end
end
end
if data.internalVersion < 40 then
data.information = data.information or {}
if data.regionType == 'group' then
data.information.groupOffset = true
end
data.information.ignoreOptionsEventErrors = data.ignoreOptionsEventErrors
data.ignoreOptionsEventErrors = nil
end
if data.internalVersion < 41 then
local newTypes = {
["Cooldown Ready (Spell)"] = "spell",
["Queued Action"] = "spell",
["Charges Changed"] = "spell",
["Action Usable"] = "spell",
["Chat Message"] = "event",
["Unit Characteristics"] = "unit",
["Cooldown Progress (Spell)"] = "spell",
["Power"] = "unit",
["PvP Talent Selected"] = "unit",
["Combat Log"] = "combatlog",
["Item Set"] = "item",
["Health"] = "unit",
["Cooldown Progress (Item)"] = "item",
["Conditions"] = "unit",
["Spell Known"] = "spell",
["Cooldown Ready (Item)"] = "item",
["Faction Reputation"] = "unit",
["Pet Behavior"] = "unit",
["Range Check"] = "unit",
["Character Stats"] = "unit",
["Talent Known"] = "unit",
["Threat Situation"] = "unit",
["Equipment Set"] = "item",
["Death Knight Rune"] = "unit",
["Cast"] = "unit",
["Item Count"] = "item",
["BigWigs Timer"] = "addons",
["Spell Activation Overlay"] = "spell",
["DBM Timer"] = "addons",
["Item Type Equipped"] = "item",
["Alternate Power"] = "unit",
["Item Equipped"] = "item",
["Item Bonus Id Equipped"] = "item",
["DBM Announce"] = "addons",
["Swing Timer"] = "unit",
["Totem"] = "spell",
["Ready Check"] = "event",
["BigWigs Message"] = "addons",
["Class/Spec"] = "unit",
["Stance/Form/Aura"] = "unit",
["Weapon Enchant"] = "item",
["Global Cooldown"] = "spell",
["Experience"] = "unit",
["GTFO"] = "addons",
["Cooldown Ready (Equipment Slot)"] = "item",
["Crowd Controlled"] = "unit",
["Cooldown Progress (Equipment Slot)"] = "item",
["Combat Events"] = "event",
}
for triggerId, triggerData in ipairs(data.triggers) do
if triggerData.trigger.type == "status" or triggerData.trigger.type == "event" then
local newType = newTypes[triggerData.trigger.event]
if newType then
triggerData.trigger.type = newType
else
WeakAuras.prettyPrint("Unknown trigger type found in, please report: ", data.id, triggerData.trigger.event)
end
end
end
end
if data.internalVersion < 43 then
-- The merging of zone ids and group ids went a bit wrong,
-- fourtunately that was caught before a actual release
-- still try to recover the data
if data.internalVersion == 42 then
if data.load.zoneIds then
local newstring = ""
local first = true
for id in data.load.zoneIds:gmatch("%d+") do
if not first then
newstring = newstring .. ", "
end
-- If the id is potentially a group, assume it is a group
if C_Map.GetMapGroupMembersInfo(tonumber(id)) then
newstring = newstring .. "g" .. id
else
newstring = newstring .. id
end
first = false
end
data.load.zoneIds = newstring
end
else
if data.load.use_zoneId == data.load.use_zonegroupId then
data.load.use_zoneIds = data.load.use_zoneId
local zoneIds = strtrim(data.load.zoneId or "")
local zoneGroupIds = strtrim(data.load.zonegroupId or "")
zoneGroupIds = zoneGroupIds:gsub("(%d+)", "g%1")
if zoneIds ~= "" or zoneGroupIds ~= "" then
data.load.zoneIds = zoneIds .. ", " .. zoneGroupIds
else
-- One of them is empty
data.load.zoneIds = zoneIds .. zoneGroupIds
end
elseif data.load.use_zoneId then
data.load.use_zoneIds = true
data.load.zoneIds = data.load.zoneId
elseif data.load.use_zonegroupId then
data.load.use_zoneIds = true
local zoneGroupIds = strtrim(data.load.zonegroupId or "")
zoneGroupIds = zoneGroupIds:gsub("(%d+)", "g%1")
data.load.zoneIds = zoneGroupIds
end
data.load.use_zoneId = nil
data.load.use_zonegroupId = nil
data.load.zoneId = nil
data.load.zonegroupId = nil
end
end
if data.internalVersion < 44 then
local function fixUp(data, prefix)
local pattern = prefix .. "(.*)_format"
local found = false
for property in pairs(data) do
local symbol = property:match(pattern)
if symbol then
found = true
break
end
end
if not found then
return
end
local old = CopyTable(data)
for property in pairs(old) do
local symbol = property:match(pattern)
if symbol then
if data[property] == "timed" then
data[prefix .. symbol .. "_time_format"] = 0
local oldDynamic = data[prefix .. symbol .. "_time_dynamic"]
data[prefix .. symbol .. "_time_dynamic_threshold"] = oldDynamic and 3 or 60
end
data[prefix .. symbol .. "_time_dynamic"] = nil
if data[prefix .. symbol .. "_time_precision"] == 0 then
data[prefix .. symbol .. "_time_precision"] = 1
data[prefix .. symbol .. "_time_dynamic_threshold"] = 0
end
end
end
end
if data.regionType == "text" then
fixUp(data, "displayText_format_")
end
if data.subRegions then
for index, subRegionData in ipairs(data.subRegions) do
if subRegionData.type == "subtext" then
fixUp(subRegionData, "text_text_format_")
end
end
end
if data.actions then
for _, when in ipairs{ "start", "finish" } do
if data.actions[when] then
fixUp(data.actions[when], "message_format_")
end
end
end
if data.conditions then
for conditionIndex, condition in ipairs(data.conditions) do
for changeIndex, change in ipairs(condition.changes) do
if change.property == "chat" and change.value then
fixUp(change.value, "message_format_")
end
end
end
end
end
if data.internalVersion < 45 then
for triggerId, triggerData in ipairs(data.triggers) do
local trigger = triggerData.trigger
if trigger.type == "unit" and trigger.event == "Conditions" then
if trigger.use_instance_size then
-- Single Selection
if trigger.instance_size.single then
if trigger.instance_size.single == "arena" then
trigger.use_instance_size = false
trigger.instance_size.multi = {
arena = true,
ratedarena = true
}
elseif trigger.instance_size.single == "pvp" then
trigger.use_instance_size = false
trigger.instance_size.multi = {
pvp = true,
ratedpvp = true
}
end
end
elseif trigger.use_instance_size == false then
-- Multi selection
if trigger.instance_size.multi then
if trigger.instance_size.multi.arena then
trigger.instance_size.multi.ratedarena = true
end
if trigger.instance_size.multi.pvp then
trigger.instance_size.multi.ratedpvp = true
end
end
end
end
end
if data.load.use_size == true then
if data.load.size.single == "arena" then
data.load.use_size = false
data.load.size.multi = {
arena = true,
ratedarena = true
}
elseif data.load.size.single == "pvp" then
data.load.use_size = false
data.load.size.multi = {
pvp = true,
ratedpvp = true
}
end
elseif data.load.use_size == false then
if data.load.size.multi then
if data.load.size.multi.arena then
data.load.size.multi.ratedarena = true
end
if data.load.size.multi.pvp then
data.load.size.multi.ratedpvp = true
end
end
end
end
data.internalVersion = max(data.internalVersion or 0, WeakAuras.InternalVersion());
end