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.

3153 lines
133 KiB

local addonName, Cell = ...
local L = Cell.L
local F = Cell.funcs
local I = Cell.iFuncs
function F:Revise()
local dbRevision = CellDB["revise"] and tonumber(string.match(CellDB["revise"], "%d+")) or 0
F:Debug("DBRevision:", dbRevision)
local charaDbRevision
if CellCharacterDB then
charaDbRevision = CellCharacterDB["revise"] and tonumber(string.match(CellCharacterDB["revise"], "%d+")) or 0
F:Debug("CharaDBRevision:", charaDbRevision)
end
if CellDB["revise"] and dbRevision < Cell.MIN_VERSION then -- update from an unsupported version
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", function()
f:UnregisterAllEvents()
local popup = Cell:CreateConfirmPopup(CellAnchorFrame, 260, L["RESET"].."\n"..L["RESET_YES_NO"], function()
CellDB = nil
CellCharacterDB = nil
ReloadUI()
end)
popup:SetPoint("TOPLEFT")
end)
return
end
if CellCharacterDB and CellCharacterDB["revise"] and charaDbRevision < Cell.MIN_VERSION then -- update from an unsupported version
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", function()
f:UnregisterAllEvents()
local popup = Cell:CreateConfirmPopup(CellAnchorFrame, 260, L["RESET_CHARACTER"].."\n|cFFB7B7B7"..L["RESET_INCLUDES"].."|r\n"..L["RESET_YES_NO"], function()
CellCharacterDB = nil
ReloadUI()
end)
popup:SetPoint("TOPLEFT")
end)
return
end
--[=[
-- r4-alpha add "castByMe"
if not(CellDB["revise"]) or CellDB["revise"] < "r4-alpha" then
for _, layout in pairs(CellDB["layouts"]) do
for _, indicator in pairs(layout["indicators"]) do
if indicator["auraType"] == "buff" then
if indicator["castByMe"] == nil then
indicator["castByMe"] = true
end
elseif indicator["indicatorName"] == "dispels" then
if indicator["checkbutton"] then
indicator["dispellableByMe"] = indicator["checkbutton"][2]
indicator["checkbutton"] = nil
end
end
end
end
end
-- r6-alpha
if not(CellDB["revise"]) or CellDB["revise"] < "r6-alpha" then
-- add "textWidth"
for _, layout in pairs(CellDB["layouts"]) do
if not layout["textWidth"] then
layout["textWidth"] = 0.75
end
end
-- remove old raid tools related
if CellDB["showRaidSetup"] then CellDB["showRaidSetup"] = nil end
if CellDB["pullTimer"] then CellDB["pullTimer"] = nil end
end
-- r13-release: fix all
if not(CellDB["revise"]) or dbRevision < 13 then
-- r8-beta: add "centralDebuff"
for _, layout in pairs(CellDB["layouts"]) do
if not layout["indicators"][8] or layout["indicators"][8]["indicatorName"] ~= "centralDebuff" then
tinsert(layout["indicators"], 8, {
["name"] = "Central Debuff",
["indicatorName"] = "centralDebuff",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"CENTER", "CENTER", 0, 3},
["size"] = {20, 20},
["font"] = {"Cell ".._G.DEFAULT, 11, "Outline", 2},
})
end
end
-- r9-beta: fix raidtool db
if type(CellDB["raidTools"]["showBattleRes"]) ~= "boolean" then CellDB["raidTools"]["showBattleRes"] = true end
if not CellDB["raidTools"]["buttonsPosition"] then CellDB["raidTools"]["buttonsPosition"] = {"TOPRIGHT", "CENTER", 0, 0} end
if not CellDB["raidTools"]["marksPosition"] then CellDB["raidTools"]["marksPosition"] = {"BOTTOMRIGHT", "CENTER", 0, 0} end
-- r11-release: add horizontal layout
for _, layout in pairs(CellDB["layouts"]) do
if type(layout["orientation"]) ~= "string" then
layout["orientation"] = "vertical"
end
end
-- r13 release: CellDB["appearance"]
if CellDB["texture"] then CellDB["appearance"]["texture"] = CellDB["texture"] end
if CellDB["scale"] then CellDB["appearance"]["scale"] = CellDB["scale"] end
if CellDB["font"] then CellDB["appearance"]["font"] = CellDB["font"] end
if CellDB["outline"] then CellDB["appearance"]["outline"] = CellDB["outline"] end
CellDB["texture"] = nil
CellDB["scale"] = nil
CellDB["font"] = nil
CellDB["outline"] = nil
end
-- r14-release: CellDB["general"]
if not(CellDB["revise"]) or dbRevision < 14 then
if CellDB["hideBlizzard"] then CellDB["general"]["hideBlizzard"] = CellDB["hideBlizzard"] end
if CellDB["disableTooltips"] then CellDB["general"]["disableTooltips"] = CellDB["disableTooltips"] end
if CellDB["showSolo"] then CellDB["general"]["showSolo"] = CellDB["showSolo"] end
CellDB["hideBlizzard"] = nil
CellDB["disableTooltips"] = nil
CellDB["showSolo"] = nil
end
-- r15-release
if not(CellDB["revise"]) or dbRevision < 15 then
for _, layout in pairs(CellDB["layouts"]) do
-- add powerHeight
if type(layout["powerHeight"]) ~= "number" then
layout["powerHeight"] = 2
end
-- add dispel highlight
if layout["indicators"][6] and layout["indicators"][6]["indicatorName"] == "dispels" then
if type(layout["indicators"][6]["enableHighlight"]) ~= "boolean" then
layout["indicators"][6]["enableHighlight"] = true
end
end
end
-- change showPets to showPartyPets
if type(CellDB["general"]["showPartyPets"]) ~= "boolean" then
CellDB["general"]["showPartyPets"] = CellDB["general"]["showPets"]
CellDB["general"]["showPets"] = nil
end
end
-- r22-release
if not(CellDB["revise"]) or dbRevision < 22 then
-- highlight color
if not CellDB["appearance"]["targetColor"] then CellDB["appearance"]["targetColor"] = {1, 0.19, 0.19, 0.5} end
if not CellDB["appearance"]["mouseoverColor"] then CellDB["appearance"]["mouseoverColor"] = {1, 1, 1, 0.5} end
for _, layout in pairs(CellDB["layouts"]) do
-- columns/rows
if type(layout["columns"]) ~= "number" then layout["columns"] = 8 end
if type(layout["rows"]) ~= "number" then layout["rows"] = 8 end
if type(layout["groupSpacing"]) ~= "number" then layout["groupSpacing"] = 0 end
-- targetMarker
-- if layout["indicators"][1] and layout["indicators"][1]["indicatorName"] ~= "targetMarker" then
-- tinsert(layout["indicators"], 1, {
-- ["name"] = "Target Marker",
-- ["indicatorName"] = "targetMarker",
-- ["type"] = "built-in",
-- ["enabled"] = true,
-- ["position"] = {"TOP", "TOP", 0, 3},
-- ["size"] = {14, 14},
-- ["alpha"] = 0.77,
-- })
-- end
end
end
-- r23-release
if not(CellDB["revise"]) or dbRevision < 23 then
for _, layout in pairs(CellDB["layouts"]) do
-- rename targetMarker to playerRaidIcon
if layout["indicators"][1] then
if layout["indicators"][1]["indicatorName"] == "targetMarker" then -- r22
layout["indicators"][1]["name"] = "Raid Icon (player)"
layout["indicators"][1]["indicatorName"] = "playerRaidIcon"
elseif layout["indicators"][1]["indicatorName"] == "aggroBar" then
tinsert(layout["indicators"], 1, {
["name"] = "Raid Icon (player)",
["indicatorName"] = "playerRaidIcon",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"TOP", "TOP", 0, 3},
["size"] = {14, 14},
["alpha"] = 0.77,
})
end
end
if layout["indicators"][2] and layout["indicators"][2]["indicatorName"] ~= "targetRaidIcon" then
tinsert(layout["indicators"], 2, {
["name"] = "Raid Icon (target)",
["indicatorName"] = "targetRaidIcon",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"TOP", "TOP", -14, 3},
["size"] = {14, 14},
["alpha"] = 0.77,
})
end
end
end
-- r25-release
if not(CellDB["revise"]) or dbRevision < 25 then
-- position for raidTools
if #CellDB["raidTools"]["marksPosition"] == 4 then CellDB["raidTools"]["marksPosition"] = {} end
if #CellDB["raidTools"]["buttonsPosition"] == 4 then CellDB["raidTools"]["buttonsPosition"] = {} end
-- position & anchor for layouts
for _, layout in pairs(CellDB["layouts"]) do
if type(layout["position"]) ~= "table" then
layout["position"] = {}
end
if type(layout["anchor"]) ~= "string" then
layout["anchor"] = "TOPLEFT"
end
end
-- reset CellDB["debuffBlacklist"]
CellDB["debuffBlacklist"] = I.GetDefaultDebuffBlacklist()
-- update click-castings
-- self:SetBindingClick(true, "MOUSEWHEELUP", self, "Button6")
-- self:SetBindingClick(true, "SHIFT-MOUSEWHEELUP", self, "Button7")
-- self:SetBindingClick(true, "CTRL-MOUSEWHEELUP", self, "Button8")
-- self:SetBindingClick(true, "ALT-MOUSEWHEELUP", self, "Button9")
-- self:SetBindingClick(true, "CTRL-SHIFT-MOUSEWHEELUP", self, "Button10")
-- self:SetBindingClick(true, "ALT-SHIFT-MOUSEWHEELUP", self, "Button11")
-- self:SetBindingClick(true, "ALT-CTRL-MOUSEWHEELUP", self, "Button12")
-- self:SetBindingClick(true, "ALT-CTRL-SHIFT-MOUSEWHEELUP", self, "Button13")
-- self:SetBindingClick(true, "MOUSEWHEELDOWN", self, "Button14")
-- self:SetBindingClick(true, "SHIFT-MOUSEWHEELDOWN", self, "Button15")
-- self:SetBindingClick(true, "CTRL-MOUSEWHEELDOWN", self, "Button16")
-- self:SetBindingClick(true, "ALT-MOUSEWHEELDOWN", self, "Button17")
-- self:SetBindingClick(true, "CTRL-SHIFT-MOUSEWHEELDOWN", self, "Button18")
-- self:SetBindingClick(true, "ALT-SHIFT-MOUSEWHEELDOWN", self, "Button19")
-- self:SetBindingClick(true, "ALT-CTRL-MOUSEWHEELDOWN", self, "Button20")
-- self:SetBindingClick(true, "ALT-CTRL-SHIFT-MOUSEWHEELDOWN", self, "Button21")
local replacements = {
[6] = "type-SCROLLUP",
[7] = "shift-type-SCROLLUP",
[8] = "ctrl-type-SCROLLUP",
[9] = "alt-type-SCROLLUP",
[10] = "ctrl-shift-type-SCROLLUP",
[11] = "alt-shift-type-SCROLLUP",
[12] = "alt-ctrl-type-SCROLLUP",
[13] = "alt-ctrl-shift-type-SCROLLUP",
[14] = "type-SCROLLDOWN",
[15] = "shift-type-SCROLLDOWN",
[16] = "ctrl-type-SCROLLDOWN",
[17] = "alt-type-SCROLLDOWN",
[18] = "ctrl-shift-type-SCROLLDOWN",
[19] = "alt-shift-type-SCROLLDOWN",
[20] = "alt-ctrl-type-SCROLLDOWN",
[21] = "alt-ctrl-shift-type-SCROLLDOWN",
}
for class, classTable in pairs(CellDB["clickCastings"]) do
for spec, specTable in pairs(classTable) do
if type(specTable) == "table" then -- not "useCommon"
for _, clickCastingTable in pairs(specTable) do
local keyID = tonumber(strmatch(clickCastingTable[1], "%d+"))
if keyID and keyID > 5 then
clickCastingTable[1] = replacements[keyID]
end
end
end
end
end
end
-- r29-release
if not(CellDB["revise"]) or dbRevision < 29 then
for _, layout in pairs(CellDB["layouts"]) do
for _, indicator in pairs(layout["indicators"]) do
if indicator["type"] == "built-in" then
if indicator["indicatorName"] == "playerRaidIcon" then
indicator["frameLevel"] = 1
elseif indicator["indicatorName"] == "targetRaidIcon" then
indicator["frameLevel"] = 1
elseif indicator["indicatorName"] == "aggroBar" then
indicator["frameLevel"] = 1
elseif indicator["indicatorName"] == "externalCooldowns" then
indicator["frameLevel"] = 10
elseif indicator["indicatorName"] == "defensiveCooldowns" then
indicator["frameLevel"] = 10
elseif indicator["indicatorName"] == "tankActiveMitigation" then
indicator["frameLevel"] = 1
elseif indicator["indicatorName"] == "dispels" then
indicator["frameLevel"] = 15
elseif indicator["indicatorName"] == "debuffs" then
indicator["frameLevel"] = 1
elseif indicator["indicatorName"] == "centralDebuff" then
indicator["frameLevel"] = 20
end
else
indicator["frameLevel"] = 5
end
end
end
end
-- r33-release
if CellDB["revise"] and dbRevision < 33 then
for _, layout in pairs(CellDB["layouts"]) do
-- move health text
local healthTextIndicator
if layout["indicators"][11] and layout["indicators"][11]["indicatorName"] == "healthText" then
healthTextIndicator = F:Copy(layout["indicators"][11])
layout["indicators"][11] = nil
else
healthTextIndicator = {
["name"] = "Health Text",
["indicatorName"] = "healthText",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"TOP", "CENTER", 0, -5},
["frameLevel"] = 1,
["font"] = {"Cell ".._G.DEFAULT, 10, "Shadow", 0},
["color"] = {1, 1, 1},
["format"] = "percentage",
["hideFull"] = true,
}
end
-- add new
if layout["indicators"][1]["indicatorName"] ~= "healthText" then
tinsert(layout["indicators"], 1, healthTextIndicator)
tinsert(layout["indicators"], 2, {
["name"] = "Role Icon",
["indicatorName"] = "roleIcon",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"TOPLEFT", "TOPLEFT", 0, 0},
["size"] = {11, 11},
})
tinsert(layout["indicators"], 3, {
["name"] = "Leader Icon",
["indicatorName"] = "leaderIcon",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"TOPLEFT", "TOPLEFT", 0, -11},
["size"] = {11, 11},
})
tinsert(layout["indicators"], 4, {
["name"] = "Ready Check Icon",
["indicatorName"] = "readyCheckIcon",
["type"] = "built-in",
["enabled"] = true,
["frameLevel"] = 100,
["size"] = {16, 16},
})
tinsert(layout["indicators"], 7, {
["name"] = "Aggro Indicator",
["indicatorName"] = "aggroIndicator",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"TOPLEFT", "TOPLEFT", 0, 0},
["frameLevel"] = 2,
["size"] = {10, 10},
})
end
-- update centralDebuff border
if layout["indicators"][15] and layout["indicators"][15]["indicatorName"] == "centralDebuff" then
if not layout["indicators"][15]["border"] then
layout["indicators"][15]["border"] = 2
if layout["indicators"][15]["size"][1] == 20 then
layout["indicators"][15]["size"] = {22, 22}
end
end
if type(layout["indicators"][15]["onlyShowTopGlow"]) ~= "boolean" then
layout["indicators"][15]["onlyShowTopGlow"] = true
end
end
end
if not F:TContains(CellDB["debuffBlacklist"], 160029) then
tinsert(CellDB["debuffBlacklist"], 2, 160029)
end
-- glow options for raidDebuffs
for instance, iTable in pairs(CellDB["raidDebuffs"]) do
for boss, bTable in pairs(iTable) do
for spell, sTable in pairs(bTable) do
if type(sTable[2]) ~= "boolean" then
tinsert(sTable, 2, false)
end
if sTable[3] and sTable[4] and type(sTable[4][1]) == "number" then
local color = {sTable[4][1], sTable[4][2], sTable[4][3], 1}
if sTable[3] == "None" or sTable[3] == "Normal" then
sTable[4] = {color}
elseif sTable[3] == "Pixel" then
sTable[4] = {color, 9, 0.25, 8, 2}
elseif sTable[3] == "Shine" then
sTable[4] = {color, 9, 0.5, 1}
end
end
end
end
end
-- options ui font size
if not CellDB["appearance"]["optionsFontSizeOffset"] then
CellDB["appearance"]["optionsFontSizeOffset"] = 0
end
-- tooltips
if type(CellDB["general"]["disableTooltips"]) == "boolean" then
CellDB["general"]["enableTooltips"] = not CellDB["general"]["disableTooltips"]
CellDB["general"]["disableTooltips"] = nil
end
end
-- r36-release
if CellDB["revise"] and dbRevision < 36 then
for _, layout in pairs(CellDB["layouts"]) do
-- rename Central Debuff
if layout["indicators"][15] and layout["indicators"][15]["indicatorName"] == "centralDebuff" then
layout["indicators"][15]["indicatorName"] = "raidDebuffs"
layout["indicators"][15]["name"] = "Raid Debuffs"
end
-- add Name Text
if layout["indicators"][1]["indicatorName"] ~= "nameText" then
tinsert(layout["indicators"], 1, {
["name"] = "Name Text",
["indicatorName"] = "nameText",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"CENTER", "CENTER", 0, 0},
["font"] = {"Cell ".._G.DEFAULT, 13, "Shadow"},
["nameColor"] = {"Custom Color", {1, 1, 1}},
["vehicleNamePosition"] = {"TOP", 0},
["textWidth"] = 0.75,
})
end
-- add Status Text
if layout["indicators"][2]["indicatorName"] ~= "statusText" then
tinsert(layout["indicators"], 2, {
["name"] = "Status Text",
["indicatorName"] = "statusText",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"BOTTOM", 0},
["frameLevel"] = 30,
["font"] = {"Cell ".._G.DEFAULT, 11, "Shadow"},
})
end
-- add Shiled Bar
if layout["indicators"][11]["indicatorName"] ~= "shieldBar" then
tinsert(layout["indicators"], 11, {
["name"] = "Shield Bar",
["indicatorName"] = "shieldBar",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"BOTTOMLEFT", "BOTTOMLEFT", 0, 0},
["frameLevel"] = 1,
["height"] = 4,
["color"] = {1, 1, 0, 1},
})
end
end
end
-- r37-release
if CellDB["revise"] and dbRevision < 37 then
for _, layout in pairs(CellDB["layouts"]) do
-- useCustomTexture
if layout["indicators"][4] and layout["indicators"][4]["indicatorName"] == "roleIcon" then
if type(layout["indicators"][4]["customTextures"]) ~= "table" then
layout["indicators"][4]["customTextures"] = {false, "Interface\\AddOns\\ElvUI\\Media\\Textures\\Tank.tga", "Interface\\AddOns\\ElvUI\\Media\\Textures\\Healer.tga", "Interface\\AddOns\\ElvUI\\Media\\Textures\\DPS.tga"}
end
end
end
end
-- r38-release
if CellDB["revise"] and dbRevision < 38 then
if CellDB["raidTools"]["pullTimer"][1] == "ERT" then
CellDB["raidTools"]["pullTimer"][1] = "ExRT"
end
for _, layout in pairs(CellDB["layouts"]) do
if not layout["indicators"][19] or layout["indicators"][19]["indicatorName"] ~= "targetedSpells" then
tinsert(layout["indicators"], 19, {
["name"] = "Targeted Spells",
["indicatorName"] = "targetedSpells",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"CENTER", "TOPLEFT", 7, -7},
["frameLevel"] = 50,
["size"] = {20, 20},
["border"] = 2,
["spells"] = {},
["glow"] = {"Pixel", {0.95,0.95,0.32,1}, 9, 0.25, 8, 2},
["font"] = {"Cell ".._G.DEFAULT, 12, "Outline", 2},
})
end
end
end
-- r41-release
if CellDB["revise"] and dbRevision < 41 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "targetedSpells" then
if #layout["indicators"][19]["spells"] == 0 then
layout["indicators"][19]["enabled"] = true
layout["indicators"][19]["spells"] = {320788, 344496, 319941}
end
end
end
end
-- r44-release
if CellDB["revise"] and dbRevision < 44 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][19]["spells"], 320132) then -- 暗影之怒
tinsert(layout["indicators"][19]["spells"], 320132)
end
if not F:TContains(layout["indicators"][19]["spells"], 322614) then -- 心灵连接
tinsert(layout["indicators"][19]["spells"], 322614)
end
end
end
end
-- r46-release
if CellDB["revise"] and dbRevision < 46 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][13] and layout["indicators"][13]["indicatorName"] == "externalCooldowns" then
layout["indicators"][13]["orientation"] = "right-to-left"
end
if layout["indicators"][14] and layout["indicators"][14]["indicatorName"] == "defensiveCooldowns" then
layout["indicators"][14]["orientation"] = "left-to-right"
end
if layout["indicators"][17] and layout["indicators"][17]["indicatorName"] == "debuffs" then
layout["indicators"][17]["orientation"] = "left-to-right"
end
end
CellDB["general"]["tooltipsPosition"] = {"BOTTOMLEFT", "Unit Button", "TOPLEFT", 0, 15}
end
-- r47-release
if CellDB["revise"] and dbRevision < 47 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][19]["spells"], 334053) then -- 净化冲击波
tinsert(layout["indicators"][19]["spells"], 334053)
end
end
end
if type(CellDB["appearance"]["highlightSize"]) ~= "number" then
CellDB["appearance"]["highlightSize"] = 1
end
if type(CellDB["appearance"]["outOfRangeAlpha"]) ~= "number" then
CellDB["appearance"]["outOfRangeAlpha"] = 0.45
end
end
-- r48-release
if CellDB["revise"] and dbRevision < 48 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][19]["spells"], 343556) then -- 病态凝视
tinsert(layout["indicators"][19]["spells"], 343556)
end
if not F:TContains(layout["indicators"][19]["spells"], 320596) then -- 深重呕吐
tinsert(layout["indicators"][19]["spells"], 320596)
end
end
end
end
-- r49-release
if CellDB["revise"] and dbRevision < 49 then
if type(CellDB["appearance"]["barAnimation"]) ~= "string" then
CellDB["appearance"]["barAnimation"] = "Flash"
end
end
-- r50-release
if CellDB["revise"] and dbRevision < 50 then
for _, layout in pairs(CellDB["layouts"]) do
-- add statusIcon
if layout["indicators"][4] and layout["indicators"][4]["indicatorName"] ~= "statusIcon" then
tinsert(layout["indicators"], 4, {
["name"] = "Status Icon",
["indicatorName"] = "statusIcon",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"TOP", "TOP", 0, -3},
["frameLevel"] = 10,
["size"] = {18, 18},
})
end
-- update debuffs
if layout["indicators"][18] and layout["indicators"][18]["indicatorName"] == "debuffs" then
if type(layout["indicators"][18]["bigDebuffs"]) ~= "table" then
layout["indicators"][18]["bigDebuffs"] = {
209858, -- 死疽溃烂
46392, -- 专注打击
}
layout["indicators"][18]["size"] = {layout["indicators"][18]["size"], {17, 17}} -- normalSize, bigSize
end
end
-- add targetCounter
if (not layout["indicators"][21]) or (layout["indicators"][21] and layout["indicators"][21]["indicatorName"] ~= "targetCounter") then
tinsert(layout["indicators"], 21, {
["name"] = "Target Counter",
["indicatorName"] = "targetCounter",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"TOP", "TOP", 0, 5},
["frameLevel"] = 15,
["font"] = {"Cell ".._G.DEFAULT, 15, "Outline", 0},
["color"] = {1, 0.1, 0.1},
})
end
end
end
-- r55-release
if CellDB["revise"] and dbRevision < 55 then
for _, layout in pairs(CellDB["layouts"]) do
-- update debuffs
if layout["indicators"][18] and layout["indicators"][18]["indicatorName"] == "debuffs" then
--- 焚化者阿寇拉斯
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 355732) then
tinsert(layout["indicators"][18]["bigDebuffs"], 355732) -- 融化灵魂
end
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 355738) then
tinsert(layout["indicators"][18]["bigDebuffs"], 355738) -- 灼热爆破
end
-- 凇心之欧罗斯
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 356667) then
tinsert(layout["indicators"][18]["bigDebuffs"], 356667) -- 刺骨之寒
end
-- 刽子手瓦卢斯
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 356925) then
tinsert(layout["indicators"][18]["bigDebuffs"], 356925) -- 屠戮
end
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 356923) then
tinsert(layout["indicators"][18]["bigDebuffs"], 356923) -- 撕裂
end
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 358973) then
tinsert(layout["indicators"][18]["bigDebuffs"], 358973) -- 恐惧浪潮
end
-- 粉碎者索苟冬
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 355806) then
tinsert(layout["indicators"][18]["bigDebuffs"], 355806) -- 重压
end
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 358777) then
tinsert(layout["indicators"][18]["bigDebuffs"], 358777) -- 痛苦之链
end
end
end
end
-- r56-release
if CellDB["revise"] and dbRevision < 56 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][20] and layout["indicators"][20]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][20]["spells"], 356924) then
tinsert(layout["indicators"][20]["spells"], 356924) -- 屠戮
end
if not F:TContains(layout["indicators"][20]["spells"], 356666) then -- 刺骨之寒
tinsert(layout["indicators"][20]["spells"], 356666)
end
if not F:TContains(layout["indicators"][20]["spells"], 319713) then -- 巨兽奔袭
tinsert(layout["indicators"][20]["spells"], 319713)
end
end
if layout["indicators"][18] and layout["indicators"][18]["indicatorName"] == "debuffs" then
if not F:TContains(layout["indicators"][18]["bigDebuffs"], 240559) then
tinsert(layout["indicators"][18]["bigDebuffs"], 240559) -- 重伤
end
end
end
end
-- r57-release
if CellDB["revise"] and dbRevision < 57 then
if type(CellDB["raidTools"]["deathReport"]) ~= "table" then
CellDB["raidTools"]["deathReport"] = {false, 10}
end
if type(CellDB["raidTools"]["showBuffTracker"]) ~= "boolean" then
CellDB["raidTools"]["showBuffTracker"] = false
end
if type(CellDB["raidTools"]["buffTrackerPosition"]) ~= "table" then
CellDB["raidTools"]["buffTrackerPosition"] = {}
end
end
-- r60-release
if CellDB["revise"] and dbRevision < 60 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][20] and layout["indicators"][20]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][20]["spells"], 338606) then
tinsert(layout["indicators"][20]["spells"], 338606) -- 病态凝视
end
if not F:TContains(layout["indicators"][20]["spells"], 343556) then
tinsert(layout["indicators"][20]["spells"], 343556) -- 病态凝视
end
end
if type(layout["petSize"]) ~= "table" then
layout["petSize"] = {false, 66, 46}
end
end
end
-- r61-release
if CellDB["revise"] and dbRevision < 61 then
for _, layout in pairs(CellDB["layouts"]) do
-- rename aggroIndicator
if layout["indicators"][10] and layout["indicators"][10]["indicatorName"] == "aggroIndicator" then
layout["indicators"][10]["name"] = "Aggro (blink)"
layout["indicators"][10]["indicatorName"] = "aggroBlink"
end
-- rename aggroBar
if layout["indicators"][11] and layout["indicators"][11]["indicatorName"] == "aggroBar" then
layout["indicators"][11]["name"] = "Aggro (bar)"
end
-- add aggroBorder
if layout["indicators"][12] and layout["indicators"][12]["indicatorName"] ~= "aggroBorder" then
tinsert(layout["indicators"], 12, {
["name"] = "Aggro (border)",
["indicatorName"] = "aggroBorder",
["type"] = "built-in",
["enabled"] = false,
["frameLevel"] = 1,
["thickness"] = 3,
})
end
-- update frameLevel
for _, indicator in pairs(layout["indicators"]) do
if indicator["indicatorName"] == "healthText" then
indicator["frameLevel"] = 2
elseif indicator["indicatorName"] == "playerRaidIcon" then
indicator["frameLevel"] = 2
elseif indicator["indicatorName"] == "targetRaidIcon" then
indicator["frameLevel"] = 2
elseif indicator["indicatorName"] == "aggroBlink" then
indicator["frameLevel"] = 3
elseif indicator["indicatorName"] == "shieldBar" then
indicator["frameLevel"] = 2
elseif indicator["indicatorName"] == "tankActiveMitigation" then
indicator["frameLevel"] = 2
elseif indicator["indicatorName"] == "debuffs" then
indicator["frameLevel"] = 2
end
end
end
end
-- r63-release
if CellDB["revise"] and dbRevision < 63 then
-- 起伏机动
if not F:TContains(CellDB["debuffBlacklist"], 352562) then
tinsert(CellDB["debuffBlacklist"], 352562)
Cell.vars.debuffBlacklist = F:ConvertTable(CellDB["debuffBlacklist"])
end
end
-- r64-release
if CellDB["revise"] and dbRevision < 64 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][21] and layout["indicators"][21]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][21]["spells"], 324079) then
tinsert(layout["indicators"][21]["spells"], 324079) -- 收割之镰
end
if not F:TContains(layout["indicators"][21]["spells"], 317963) then
tinsert(layout["indicators"][21]["spells"], 317963) -- 知识烦扰
end
end
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "debuffs" then
if not F:TContains(layout["indicators"][19]["bigDebuffs"], 240443) then
tinsert(layout["indicators"][19]["bigDebuffs"], 240443) -- 爆裂
end
if F:TContains(layout["indicators"][19]["bigDebuffs"], 243237) then
F:TRemove(layout["indicators"][19]["bigDebuffs"], 243237)
end
end
end
-- 审判灵魂
if not F:TContains(CellDB["debuffBlacklist"], 356419) then
tinsert(CellDB["debuffBlacklist"], 356419)
Cell.vars.debuffBlacklist = F:ConvertTable(CellDB["debuffBlacklist"])
end
end
-- r65-release
if CellDB["revise"] and dbRevision < 65 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][21] and layout["indicators"][21]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][21]["spells"], 333861) then
tinsert(layout["indicators"][21]["spells"], 333861) -- 回旋利刃
end
end
end
end
-- r66-release
if CellDB["revise"] and dbRevision < 66 then
-- always targeting
if not CellDB["clickCastings"][Cell.vars.playerClass]["alwaysTargeting"] then
CellDB["clickCastings"][Cell.vars.playerClass]["alwaysTargeting"] = {
["common"] = "disabled",
}
for sepcIndex = 1, GetNumSpecializationsForClassID(Cell.vars.playerClassID) do
local specID = GetSpecializationInfoForClassID(Cell.vars.playerClassID, sepcIndex)
CellDB["clickCastings"][Cell.vars.playerClass]["alwaysTargeting"][specID] = "disabled"
end
end
end
-- r68-release
if CellDB["revise"] and dbRevision < 68 then
if type(CellDB["appearance"]["iconAnimation"]) ~= "string" then
CellDB["appearance"]["iconAnimation"] = "duration"
end
end
-- r69-release
if CellDB["revise"] and dbRevision < 69 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][20] and layout["indicators"][20]["indicatorName"] == "raidDebuffs" then
layout["indicators"][20]["num"] = 1
layout["indicators"][20]["orientation"] = "left-to-right"
end
end
if type(CellDB["appearance"]["bgAlpha"]) ~= "number" then
CellDB["appearance"]["bgAlpha"] = 1
end
end
-- r70-release
if CellDB["revise"] and dbRevision < 70 then
for _, layout in pairs(CellDB["layouts"]) do
-- check custom indicator
for i = 23, #layout["indicators"] do
if layout["indicators"][i]["type"] == "text" then
layout["indicators"][i]["showDuration"] = true
end
end
end
if type(CellDB["appearance"]["barAlpha"]) ~= "number" then
CellDB["appearance"]["barAlpha"] = 1
end
if type(CellDB["appearance"]["lossAlpha"]) ~= "number" then
CellDB["appearance"]["lossAlpha"] = 1
end
if type(CellDB["appearance"]["lossColor"]) ~= "table" then
CellDB["appearance"]["lossColor"] = CellDB["appearance"]["bgColor"]
CellDB["appearance"]["bgColor"] = nil
end
if type(CellDB["appearance"]["healPrediction"]) ~= "boolean" then
CellDB["appearance"]["healPrediction"] = true
end
if type(CellDB["appearance"]["healAbsorb"]) ~= "boolean" then
CellDB["appearance"]["healAbsorb"] = true
end
if type(CellDB["appearance"]["shield"]) ~= "boolean" then
CellDB["appearance"]["shield"] = true
end
if type(CellDB["appearance"]["overshield"]) ~= "boolean" then
CellDB["appearance"]["overshield"] = true
end
end
-- r71-release
if CellDB["revise"] and dbRevision < 71 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][2] and layout["indicators"][2]["indicatorName"] == "statusText" and not layout["indicators"][2]["colors"] then
layout["indicators"][2]["colors"] = {
["GHOST"] = {1, 0.19, 0.19},
["DEAD"] = {1, 0.19, 0.19},
["AFK"] = {1, 0.19, 0.19},
["OFFLINE"] = {1, 0.19, 0.19},
["FEIGN"] = {1, 1, 0.12},
["DRINKING"] = {0.12, 0.75, 1},
["PENDING"] = {1, 1, 0.12},
["ACCEPTED"] = {0.12, 1, 0.12},
["DECLINED"] = {1, 0.19, 0.19},
}
end
if not layout["powerFilters"] then
layout["powerFilters"] = {
["DEATHKNIGHT"] = {["TANK"] = true, ["DAMAGER"] = true},
["DEMONHUNTER"] = {["TANK"] = true, ["DAMAGER"] = true},
["DRUID"] = {["TANK"] = true, ["DAMAGER"] = true, ["HEALER"] = true},
["HUNTER"] = true,
["MAGE"] = true,
["MONK"] = {["TANK"] = true, ["DAMAGER"] = true, ["HEALER"] = true},
["PALADIN"] = {["TANK"] = true, ["DAMAGER"] = true, ["HEALER"] = true},
["PRIEST"] = {["DAMAGER"] = true, ["HEALER"] = true},
["ROGUE"] = true,
["SHAMAN"] = {["DAMAGER"] = true, ["HEALER"] = true},
["WARLOCK"] = true,
["WARRIOR"] = {["TANK"] = true, ["DAMAGER"] = true},
["PET"] = true,
["VEHICLE"] = true,
["NPC"] = true,
}
end
end
end
-- r74-release
if CellDB["revise"] and dbRevision < 74 then
--! add "Condition"
for instance, iTable in pairs(CellDB["raidDebuffs"]) do
for boss, bTable in pairs(iTable) do
for spell, sTable in pairs(bTable) do
if type(sTable[3]) ~= "table" then
tinsert(sTable, 3, {"None"})
end
end
end
end
end
-- r77-release
if CellDB["revise"] and dbRevision < 77 then
if type(CellDB["appearance"]["useGameFont"]) ~= "boolean" then
CellDB["appearance"]["useGameFont"] = true
end
end
-- r79-release
if CellDB["revise"] and dbRevision < 79 then
-- update name text width
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][1] and layout["indicators"][1]["indicatorName"] == "nameText" then
if type(layout["indicators"][1]["textWidth"]) == "number" then
local oldWidth = layout["indicators"][1]["textWidth"]
if oldWidth == 0 then -- unlimited
layout["indicators"][1]["textWidth"] = "unlimited"
else
layout["indicators"][1]["textWidth"] = {"percentage", oldWidth}
end
end
end
end
end
-- r80-release
if CellDB["revise"] and dbRevision < 80 then
-- update name text width
for _, layout in pairs(CellDB["layouts"]) do
if type(layout["npcAnchor"]) ~= "table" then
layout["npcAnchor"] = {false, {}}
end
end
end
-- r81-release
if CellDB["revise"] and dbRevision < 81 then
-- update marks
if type(CellDB["raidTools"]["marks"]) ~= "table" then
local oldShowMarks = CellDB["raidTools"]["showMarks"]
local oldMarks = CellDB["raidTools"]["marks"]
CellDB["raidTools"]["marks"] = {oldShowMarks, oldMarks.."_h", CellDB["raidTools"]["marksPosition"]}
-- remove old
CellDB["raidTools"]["showMarks"] = nil
CellDB["raidTools"]["marksPosition"] = nil
end
-- update buffTracker
if type(CellDB["raidTools"]["buffTracker"]) ~= "table" then
CellDB["raidTools"]["buffTracker"] = {CellDB["raidTools"]["showBuffTracker"], CellDB["raidTools"]["buffTrackerPosition"]}
-- remove old
CellDB["raidTools"]["showBuffTracker"] = nil
CellDB["raidTools"]["buffTrackerPosition"] = nil
end
-- update readyAndPull
if type(CellDB["raidTools"]["readyAndPull"]) ~= "table" then
CellDB["raidTools"]["readyAndPull"] = {CellDB["raidTools"]["showButtons"], CellDB["raidTools"]["pullTimer"], CellDB["raidTools"]["buttonsPosition"]}
-- remove old
CellDB["raidTools"]["showButtons"] = nil
CellDB["raidTools"]["pullTimer"] = nil
CellDB["raidTools"]["buttonsPosition"] = nil
end
end
-- r82-release
if CellDB["revise"] and dbRevision < 82 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "debuffs" then
if not F:TContains(layout["indicators"][19]["bigDebuffs"], 366297) then
tinsert(layout["indicators"][19]["bigDebuffs"], 366297) -- 解构
end
if not F:TContains(layout["indicators"][19]["bigDebuffs"], 366288) then
tinsert(layout["indicators"][19]["bigDebuffs"], 366288) -- 猛力砸击
end
end
end
end
-- r87-release
if CellDB["revise"] and dbRevision < 87 then
-- rename raid tools
if CellDB["raidTools"] then
-- update readyAndPull
if CellDB["raidTools"]["readyAndPull"] and type(CellDB["raidTools"]["readyAndPull"][2]) == "table" then
if CellDB["raidTools"]["readyAndPull"][2][1] == "ExRT" then
CellDB["raidTools"]["readyAndPull"][2][1] = "mrt"
elseif CellDB["raidTools"]["readyAndPull"][2][1] == "DBM" then
CellDB["raidTools"]["readyAndPull"][2][1] = "dbm"
elseif CellDB["raidTools"]["readyAndPull"][2][1] == "BW" then
CellDB["raidTools"]["readyAndPull"][2][1] = "bw"
end
end
CellDB["tools"] = CellDB["raidTools"]
CellDB["raidTools"] = nil
end
for _, layout in pairs(CellDB["layouts"]) do
-- add barOrientation to layout
if type(layout["barOrientation"]) ~= "table" then
layout["barOrientation"] = {"horizontal", false}
end
-- rename powerHeight to powerSize
if type(layout["powerSize"]) ~= "number" then
layout["powerSize"] = layout["powerHeight"]
layout["powerHeight"] = nil
end
-- rname npcAnchor to friendlyNPC
if type(layout["npc"]) ~= "table" then
layout["npc"] = {true, layout["npcAnchor"][1], layout["npcAnchor"][2]}
layout["npcAnchor"] = nil
end
-- add showDuration to external
if layout["indicators"][15] and layout["indicators"][15]["indicatorName"] == "externalCooldowns" then
layout["indicators"][15]["showDuration"] = false
layout["indicators"][15]["font"] = {"Cell ".._G.DEFAULT, 11, "Outline", 2}
end
-- add showDuration to defensive
if layout["indicators"][16] and layout["indicators"][16]["indicatorName"] == "defensiveCooldowns" then
layout["indicators"][16]["showDuration"] = false
layout["indicators"][16]["font"] = {"Cell ".._G.DEFAULT, 11, "Outline", 2}
end
-- add showDuration to debuffs
if layout["indicators"][19] and layout["indicators"][19]["indicatorName"] == "debuffs" then
layout["indicators"][19]["showDuration"] = false
end
end
end
-- r90-release
if CellDB["revise"] and dbRevision < 90 then
-- separate glows from tools
CellDB["tools"]["spellRequest"] = nil
CellDB["tools"]["dispelRequest"] = nil
-- add menuPosition
if not CellDB["general"]["menuPosition"] then
CellDB["general"]["menuPosition"] = "top_bottom"
end
-- update health color
if CellDB["appearance"]["barColor"][1] == "Class Color" then
CellDB["appearance"]["barColor"][1] = "class_color"
elseif CellDB["appearance"]["barColor"][1] == "Class Color (dark)" then
CellDB["appearance"]["barColor"][1] = "class_color_dark"
elseif CellDB["appearance"]["barColor"][1] == "Gradient" then
CellDB["appearance"]["barColor"][1] = "gradient"
elseif CellDB["appearance"]["barColor"][1] == "Custom Color" then
CellDB["appearance"]["barColor"][1] = "custom"
end
-- update loss color
if CellDB["appearance"]["lossColor"][1] == "Class Color" then
CellDB["appearance"]["lossColor"][1] = "class_color"
elseif CellDB["appearance"]["lossColor"][1] == "Class Color (dark)" then
CellDB["appearance"]["lossColor"][1] = "class_color_dark"
elseif CellDB["appearance"]["lossColor"][1] == "Gradient" then
CellDB["appearance"]["lossColor"][1] = "gradient"
elseif CellDB["appearance"]["lossColor"][1] == "Custom Color" then
CellDB["appearance"]["lossColor"][1] = "custom"
end
-- update power color
if CellDB["appearance"]["powerColor"][1] == "Power Color" then
CellDB["appearance"]["powerColor"][1] = "power_color"
elseif CellDB["appearance"]["powerColor"][1] == "Power Color (dark)" then
CellDB["appearance"]["powerColor"][1] = "power_color_dark"
elseif CellDB["appearance"]["powerColor"][1] == "Class Color" then
CellDB["appearance"]["powerColor"][1] = "class_color"
elseif CellDB["appearance"]["powerColor"][1] == "Custom Color" then
CellDB["appearance"]["powerColor"][1] = "custom"
end
end
-- r91-release
if CellDB["revise"] and dbRevision < 91 then
-- update spellRequest dataStructure
if CellDB["glows"]["spellRequest"] and #CellDB["glows"]["spellRequest"] == 8 then
local srIndices = {"enabled", "checkIfExists", "knownSpellsOnly", "freeCooldownOnly", "replyCooldown", "responseType", "timeout", "spells"}
local spellIndices = {"spellId", "buffId", "keywords", "glowOptions", "isBuiltIn"}
local newSR = {}
for i, v in pairs(CellDB["glows"]["spellRequest"]) do
if i == 8 then -- spells
newSR["spells"] = {}
for j, st in pairs(v) do
newSR["spells"][j] = {}
for k, sv in pairs(st) do
newSR["spells"][j][spellIndices[k]] = sv
end
end
else
newSR[srIndices[i]] = v
end
end
CellDB["glows"]["spellRequest"] = newSR
end
-- update dispelRequest dataStructure
if CellDB["glows"]["dispelRequest"] and #CellDB["glows"]["dispelRequest"] == 6 then
local drIndices = {"enabled", "dispellableByMe", "responseType", "timeout", "debuffs", "glowOptions"}
local newDR = {}
for i, v in pairs(CellDB["glows"]["dispelRequest"]) do
newDR[drIndices[i]] = v
end
CellDB["glows"]["dispelRequest"] = newDR
end
end
-- r93-release
if CellDB["revise"] and dbRevision < 93 then
-- add layout auto switch for Mythic
for role, t in pairs(CellDB["layoutAutoSwitch"]) do
if not t["mythic"] then
t["mythic"] = "default"
end
end
-- add allCooldowns
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][17] and layout["indicators"][17]["indicatorName"] ~= "allCooldowns" then
tinsert(layout["indicators"], 17, {
["name"] = "Externals + Defensives",
["indicatorName"] = "allCooldowns",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"LEFT", "LEFT", -2, 5},
["frameLevel"] = 10,
["size"] = {12, 20},
["showDuration"] = false,
["num"] = 2,
["orientation"] = "left-to-right",
["font"] = {"Cell ".._G.DEFAULT, 11, "Outline", 2},
})
end
end
end
-- r94-release
if CellDB["revise"] and dbRevision < 94 then
-- add auraIconOptions
if not CellDB["appearance"]["auraIconOptions"] then
CellDB["appearance"]["auraIconOptions"] = {
["animation"] = CellDB["appearance"]["iconAnimation"],
["durationColorEnabled"] = false,
["durationColors"] = {{0,1,0}, {1,1,0,0.5}, {1,0,0,3}},
["durationDecimal"] = 0,
}
CellDB["appearance"]["iconAnimation"] = nil
end
-- add y offset
local modifications = {
[15] = "externalCooldowns",
[16] = "defensiveCooldowns",
[17] = "allCooldowns",
[20] = "debuffs",
[21] = "raidDebuffs",
[22] = "targetedSpells"
}
for _, layout in pairs(CellDB["layouts"]) do
for i, t in pairs(layout["indicators"]) do
if i <= Cell.defaults.builtIns then -- built-ins
if t["indicatorName"] == modifications[i] and not t["font"][5] then
t["font"][5] = 1
end
elseif t["type"] == "icon" or t["type"] == "icons" then -- custom icon/icons
if not t["font"][5] then
t["font"][5] = 1
end
end
end
end
end
-- r95-release
if CellDB["revise"] and dbRevision < 95 then
-- add round up
if type(CellDB["appearance"]["auraIconOptions"]["durationRoundUp"]) ~= "boolean" then
CellDB["appearance"]["auraIconOptions"]["durationRoundUp"] = false
end
-- change showDuration to duration for custom TEXT indicators
for _, layout in pairs(CellDB["layouts"]) do
for i, t in pairs(layout["indicators"]) do
if t["type"] == "text" then
if type(t["duration"]) ~= "table" then
-- add new
t["duration"] = {
t["showDuration"], -- show duration
false, -- round up duration
0, -- decimal
}
-- remove old
t["showDuration"] = nil
end
end
end
end
end
-- r96-release
if CellDB["revise"] and dbRevision < 96 then
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][22] and layout["indicators"][22]["indicatorName"] == "targetedSpells" then
if not F:TContains(layout["indicators"][22]["spells"], 332234) then -- 挥发精油
tinsert(layout["indicators"][22]["spells"], 332234)
end
end
end
end
-- r97-release
-- if CellDB["revise"] and dbRevision < 97 then
-- if not CellDB["general"]["nickname"] then
-- CellDB["general"]["nickname"] = {false}
-- end
-- end
-- r98-release
if CellDB["revise"] and dbRevision < 98 then
-- add deathColor
if not CellDB["appearance"]["deathColor"] then
CellDB["appearance"]["deathColor"] = {false, {0.545, 0, 0}}
end
for _, layout in pairs(CellDB["layouts"]) do
-- update frame level of aggro border
if layout["indicators"][12] and layout["indicators"][12]["indicatorName"] == "aggroBorder" and layout["indicators"][12]["frameLevel"] == 1 then
layout["indicators"][12]["frameLevel"] = 3
end
-- update roleTexture
if layout["indicators"][5] and layout["indicators"][5]["indicatorName"] == "roleIcon" and not layout["indicators"][5]["roleTexture"] then
layout["indicators"][5]["roleTexture"] = {}
layout["indicators"][5]["roleTexture"][1] = layout["indicators"][5]["customTextures"][1] and "custom" or "default"
layout["indicators"][5]["roleTexture"][2] = layout["indicators"][5]["customTextures"][2]
layout["indicators"][5]["roleTexture"][3] = layout["indicators"][5]["customTextures"][3]
layout["indicators"][5]["roleTexture"][4] = layout["indicators"][5]["customTextures"][4]
layout["indicators"][5]["customTextures"] = nil
end
end
end
-- r99-release
if CellDB["revise"] and dbRevision < 99 then
-- remove old nickname
CellDB["general"]["nickname"] = nil
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][1] and layout["indicators"][1]["indicatorName"] == "nameText" then
-- add Frame Level to Name Text indicator
if not layout["indicators"][1]["frameLevel"] then
layout["indicators"][1]["frameLevel"] = 1
end
-- update color
if layout["indicators"][1]["nameColor"][1] == "Class Color" then
layout["indicators"][1]["nameColor"][1] = "class_color"
elseif layout["indicators"][1]["nameColor"][1] == "Custom Color" then
layout["indicators"][1]["nameColor"][1] = "custom"
end
end
end
end
-- r103-release
if CellDB["revise"] and dbRevision < 103 then
if type(CellDB["appearance"]["accentColor"]) ~= "table" then
CellDB["appearance"]["accentColor"] = {"class_color", {1, 0.26667, 0.4}}
end
end
-- r107-release
if CellDB["revise"] and dbRevision < 107 then
-- add season 4 debuffs
if not F:TContains(CellDB["bigDebuffs"], 373391) then
tinsert(CellDB["bigDebuffs"], 373391) -- 梦魇
end
if not F:TContains(CellDB["bigDebuffs"], 373429) then
tinsert(CellDB["bigDebuffs"], 373429) -- 腐臭虫群
end
Cell.vars.bigDebuffs = F:ConvertTable(CellDB["bigDebuffs"])
end
-- r117-release
if CellDB["revise"] and dbRevision < 117 then
-- enable shield in WotLK
if Cell.isCata then
CellDB["appearance"]["shield"] = true
CellDB["appearance"]["overshield"] = true
end
end
-- r118-release
if CellDB["revise"] and dbRevision < 118 then
-- fix default value in Wrath Classic
if Cell.isCata and CellDB["tools"]["marks"][2] == "both_h" then
CellDB["tools"]["marks"][2] = "target_h"
end
-- add size
if not CellDB["tools"]["buffTracker"][3] then
if Cell.isRetail then
CellDB["tools"]["buffTracker"][3] = 32
else
CellDB["tools"]["buffTracker"][3] = 27
end
end
end
-- r119-release
if CellDB["revise"] and dbRevision < 119 then
-- spotlight
for _, layout in pairs(CellDB["layouts"]) do
if not layout["spotlight"] then
layout["spotlight"] = {false, {}, {}} -- enabled, units, position
end
end
end
-- r128-release
if CellDB["revise"] and dbRevision < 128 then
-- spotlight
for _, layout in pairs(CellDB["layouts"]) do
if layout["spotlight"] and #layout["spotlight"] ~= 5 then
-- sizeEnabled
layout["spotlight"][4] = false
-- size
layout["spotlight"][5] = {66, 46}
end
end
end
-- r129-release
if CellDB["revise"] and dbRevision < 129 then
if type(CellDB["general"]["hideBlizzard"]) == "boolean" then
CellDB["general"]["hideBlizzardParty"] = CellDB["general"]["hideBlizzard"]
CellDB["general"]["hideBlizzardRaid"] = CellDB["general"]["hideBlizzard"]
CellDB["general"]["hideBlizzard"] = nil
end
if type(CellDB["appearance"]["useLibHealComm"]) ~= "boolean" then
CellDB["appearance"]["useLibHealComm"] = false
end
end
-- r132-release (merge r114 r115 r117)
if CellDB["revise"] and dbRevision < 132 then
local healthThresholdsIndex = Cell.defaults.indicatorIndices.healthThresholds
local shieldBarIndex = Cell.defaults.indicatorIndices.shieldBar
local dispelsIndex = Cell.defaults.indicatorIndices.dispels
local consumablesIndex = Cell.defaults.indicatorIndices.consumables
for _, layout in pairs(CellDB["layouts"]) do
-- add healthThresholds
if layout["indicators"][healthThresholdsIndex]["indicatorName"] ~= "healthThresholds" then
tinsert(layout["indicators"], healthThresholdsIndex, {
["name"] = "Health Thresholds",
["indicatorName"] = "healthThresholds",
["type"] = "built-in",
["enabled"] = false,
["thickness"] = 1,
["thresholds"] = {
{0.35, {1, 0, 0, 1}},
},
})
end
-- add ShieldBar back (r117)
if layout["indicators"][shieldBarIndex]["indicatorName"] ~= "shieldBar" then
tinsert(layout["indicators"], shieldBarIndex, {
["name"] = "Shield Bar",
["indicatorName"] = "shieldBar",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"BOTTOMLEFT", "BOTTOMLEFT", 0, 0},
["frameLevel"] = 2,
["height"] = 4,
["color"] = {1, 1, 0, 1},
})
end
-- add Consumables (r114)
if not layout["indicators"][consumablesIndex] or layout["indicators"][consumablesIndex]["indicatorName"] ~= "consumables" then
tinsert(layout["indicators"], consumablesIndex, {
["name"] = "Consumables",
["indicatorName"] = "consumables",
["type"] = "built-in",
["enabled"] = true,
["speed"] = 1,
})
end
-- add speed to Consumables (r115)
if not layout["indicators"][consumablesIndex]["speed"] then
layout["indicators"][consumablesIndex]["speed"] = 1
end
-- add highlightType to Dispels (r115)
if not layout["indicators"][dispelsIndex]["highlightType"] then
layout["indicators"][dispelsIndex]["highlightType"] = "gradient"
end
-- add showDispelTypeIcons to Dispels (r115)
if type(layout["indicators"][dispelsIndex]["showDispelTypeIcons"]) ~= "boolean" then
layout["indicators"][dispelsIndex]["showDispelTypeIcons"] = true
end
end
end
-- r134-release add SILLY raid pets
if CellDB["revise"] and dbRevision < 134 then
for _, layout in pairs(CellDB["layouts"]) do
if not layout["pet"] then
layout["pet"] = {CellDB["general"]["showPartyPets"], false, {}, layout["petSize"][1], {layout["petSize"][2], layout["petSize"][3]}} -- partyPetsEnabled, raidPetsEnabled, raidPetsPosition, sizeEnabled, size
layout["petSize"] = nil
end
end
CellDB["general"]["showPartyPets"] = nil
end
-- r137-release
if CellDB["revise"] and dbRevision < 137 then
if not strfind(CellDB["snippets"][0]["code"], "^%-%- snippets can be found") then
CellDB["snippets"][0]["code"] = "-- snippets can be found at https://github.com/enderneko/Cell/tree/master/.snippets\n"..CellDB["snippets"][0]["code"]
end
end
-- r138-release
if CellDB["revise"] and dbRevision < 138 then
if Cell.isRetail then
-- 邪甲术
if not F:TContains(CellDB["debuffBlacklist"], 387847) then
tinsert(CellDB["debuffBlacklist"], 387847)
Cell.vars.debuffBlacklist = F:ConvertTable(CellDB["debuffBlacklist"])
end
end
for _, layout in pairs(CellDB["layouts"]) do
if layout["spacing"] then
layout["spacingX"] = layout["spacing"]
layout["spacingY"] = layout["spacing"]
layout["spacing"] = nil
end
if not layout["powerFilters"]["EVOKER"] then
layout["powerFilters"]["EVOKER"] = {["DAMAGER"] = true, ["HEALER"] = true}
end
end
end
-- r139-release
if CellDB["revise"] and dbRevision < 139 then
if Cell.isRetail then
-- 筋疲力尽
if not F:TContains(CellDB["debuffBlacklist"], 390435) then
tinsert(CellDB["debuffBlacklist"], 390435)
Cell.vars.debuffBlacklist = F:ConvertTable(CellDB["debuffBlacklist"])
end
end
end
-- r146-release
if CellDB["revise"] and dbRevision < 146 then
if Cell.isRetail then
-- add "Initials"
for class, t in pairs(CellDB["clickCastings"]) do
-- fix alwaysTargeting
if not t["alwaysTargeting"] then
t["alwaysTargeting"] = {["common"] = "disabled"}
end
-- set up initial spec
local specID = GetSpecializationInfoForClassID(F:GetClassID(class), 5)
t["alwaysTargeting"][specID] = "disabled"
t[specID] = {
{"type1", "target"},
{"type2", "togglemenu"},
}
end
end
end
-- r147-release
if CellDB["revise"] and dbRevision < 147 then
if Cell.isRetail then
for role, t in pairs(CellDB["layoutAutoSwitch"]) do
if t["raid"] then
t["raid_outdoor"] = t["raid"]
t["raid_instance"] = t["raid"]
t["raid"] = nil
end
if t["mythic"] then
t["raid_mythic"] = t["mythic"]
t["mythic"] = nil
end
end
end
-- appearance
if type(CellDB["appearance"]["healPrediction"]) == "boolean" then
CellDB["appearance"]["healPrediction"] = {CellDB["appearance"]["healPrediction"], false, {1, 1, 1, 0.4}}
end
if type(CellDB["appearance"]["shield"]) == "boolean" then
CellDB["appearance"]["shield"] = {CellDB["appearance"]["shield"], {1, 1, 1, 0.4}}
end
if type(CellDB["appearance"]["healAbsorb"]) == "boolean" then
CellDB["appearance"]["healAbsorb"] = {CellDB["appearance"]["healAbsorb"], {1, 0.1, 0.1, 0.9}}
end
-- custom indicator
for _, layout in pairs(CellDB["layouts"]) do
for _, indicator in pairs(layout["indicators"]) do
if indicator["type"] == "bar" then
if not indicator["orientation"] then indicator["orientation"] = "horizontal" end
if type(indicator["showStack"]) ~= "boolean" then
indicator["showStack"] = false
indicator["font"] = {"Cell ".._G.DEFAULT, 11, "Outline", 0, 0}
end
elseif indicator["type"] == "rect" then
if type(indicator["showStack"]) ~= "boolean" then
indicator["showStack"] = false
indicator["font"] = {"Cell ".._G.DEFAULT, 11, "Outline", 0, 0}
end
end
end
end
end
-- r148-release
if CellDB["revise"] and charaDbRevision and charaDbRevision < 148 then
for role, t in pairs(CellCharacterDB["layoutAutoSwitch"]) do
if not t["raid_outdoor"] then
t["raid_outdoor"] = t["raid25"]
end
end
end
-- r149-release
if CellDB["revise"] and dbRevision < 149 then
-- friendlyNPC -> npc
for _, layout in pairs(CellDB["layouts"]) do
if not layout["npc"] then
-- rename
layout["npc"] = layout["friendlyNPC"]
layout["friendlyNPC"] = nil
-- add sizeEnabled and size
layout["npc"][4] = false
layout["npc"][5] = {66, 46}
end
end
end
-- r150-release
if CellDB["revise"] and dbRevision < 150 then
local healthThresholds = Cell.defaults.indicatorIndices["healthThresholds"]
local dispels = Cell.defaults.indicatorIndices["dispels"]
local mitigation = Cell.defaults.indicatorIndices["tankActiveMitigation"]
local aggroBar = Cell.defaults.indicatorIndices["aggroBar"]
for _, layout in pairs(CellDB["layouts"]) do
--! check healthThresholds AGAIN
if layout["indicators"][healthThresholds]["indicatorName"] ~= "healthThresholds" then
tinsert(layout["indicators"], healthThresholds, {
["name"] = "Health Thresholds",
["indicatorName"] = "healthThresholds",
["type"] = "built-in",
["enabled"] = false,
["thickness"] = 1,
["thresholds"] = {
{0.35, {1, 0, 0, 1}},
},
})
end
-- add orientation to Dispels
if layout["indicators"][dispels] and not layout["indicators"][dispels]["orientation"] then
layout["indicators"][dispels]["orientation"] = "right-to-left"
end
-- update bars
if Cell.isRetail and mitigation and layout["indicators"][mitigation] then
layout["indicators"][mitigation]["size"][1] = layout["indicators"][mitigation]["size"][1] + 2
layout["indicators"][mitigation]["size"][2] = layout["indicators"][mitigation]["size"][2] + 2
if layout["indicators"][mitigation]["position"][3] == 10 and layout["indicators"][mitigation]["position"][4] == -1 then
layout["indicators"][mitigation]["position"][3] = 9
layout["indicators"][mitigation]["position"][4] = 0
end
end
if layout["indicators"][aggroBar] then
layout["indicators"][aggroBar]["size"][1] = layout["indicators"][aggroBar]["size"][1] + 2
layout["indicators"][aggroBar]["size"][2] = layout["indicators"][aggroBar]["size"][2] + 2
if layout["indicators"][aggroBar]["position"][3] == 1 and layout["indicators"][aggroBar]["position"][4] == 0 then
layout["indicators"][aggroBar]["position"][3] = 0
layout["indicators"][aggroBar]["position"][4] = -1
end
end
end
if Cell.isRetail then
-- targetedSpells
-- 红玉新生法池
if not F:TContains(CellDB["targetedSpellsList"], 372858) then -- 灼热打击
tinsert(CellDB["targetedSpellsList"], 372858)
end
-- 奈萨鲁斯
if not F:TContains(CellDB["targetedSpellsList"], 374533) then -- 炽热挥舞
tinsert(CellDB["targetedSpellsList"], 374533)
end
if not F:TContains(CellDB["targetedSpellsList"], 377018) then -- 熔火真金
tinsert(CellDB["targetedSpellsList"], 377018)
end
-- 蕨皮山谷
if not F:TContains(CellDB["targetedSpellsList"], 381444) then -- 野蛮冲撞
tinsert(CellDB["targetedSpellsList"], 381444)
end
if not F:TContains(CellDB["targetedSpellsList"], 373912) then -- 腐朽打击
tinsert(CellDB["targetedSpellsList"], 373912)
end
-- 英灵殿
if not F:TContains(CellDB["targetedSpellsList"], 193092) then -- 放血扫击
tinsert(CellDB["targetedSpellsList"], 193092)
end
-- debuffBlacklist
if not F:TContains(CellDB["debuffBlacklist"], 213213) then -- 伪装
tinsert(CellDB["debuffBlacklist"], 213213)
end
-- bigDebuffs
if not F:TContains(CellDB["bigDebuffs"], 240559) then -- 重伤
tinsert(CellDB["bigDebuffs"], 240559)
end
if not F:TContains(CellDB["bigDebuffs"], 396369) then -- 闪电标记
tinsert(CellDB["bigDebuffs"], 396369)
end
if not F:TContains(CellDB["bigDebuffs"], 396364) then -- 狂风标记
tinsert(CellDB["bigDebuffs"], 396364)
end
end
end
-- r152-release
if CellDB["revise"] and dbRevision < 152 then
if Cell.isRetail then
local found1, found2
for _, t in pairs(CellDB["consumables"]) do
if t[1] == 370511 then found1 = true end
if t[1] == 371024 then found2 = true end
end
if not found1 then
tinsert(CellDB["consumables"], {
370511, -- 振奋治疗药水
{"A", {1, 0.1, 0.1}},
})
end
if not found2 then
tinsert(CellDB["consumables"], {
371024, -- 元素强能药水
{"C3", {1, 1, 0}},
})
end
Cell.vars.consumables = I.ConvertConsumables(CellDB["consumables"])
-- 英灵殿
if not F:TContains(CellDB["targetedSpellsList"], 193659) then -- 邪炽冲刺
tinsert(CellDB["targetedSpellsList"], 193659)
end
end
for _, layout in pairs(CellDB["layouts"]) do
local nameText = Cell.defaults.indicatorIndices.healthText
if layout["indicators"][nameText] and layout["indicators"][nameText]["indicatorName"] == "nameText" then
if type(layout["indicators"][nameText]["hideFull"]) == "boolean" then
layout["indicators"][nameText]["hideIfEmptyOrFull"] = layout["indicators"][nameText]["hideFull"]
layout["indicators"][nameText]["hideFull"] = nil
end
end
end
end
-- r153-release
if CellDB["revise"] and dbRevision < 153 then
if Cell.isRetail then
-- targetedSpells
-- 青龙寺
if not F:TContains(CellDB["targetedSpellsList"], 106823) then -- 翔龙猛袭
tinsert(CellDB["targetedSpellsList"], 106823)
end
if not F:TContains(CellDB["targetedSpellsList"], 106841) then -- 青龙猛袭
tinsert(CellDB["targetedSpellsList"], 106841)
end
-- 群星庭院
if not F:TContains(CellDB["targetedSpellsList"], 211473) then -- 暗影鞭笞
tinsert(CellDB["targetedSpellsList"], 211473)
end
-- 英灵殿
if not F:TContains(CellDB["targetedSpellsList"], 192018) then -- 光明之盾
tinsert(CellDB["targetedSpellsList"], 192018)
end
-- 化身巨龙牢窟
if not F:TContains(CellDB["targetedSpellsList"], 375870) then -- 致死石爪
tinsert(CellDB["targetedSpellsList"], 375870)
end
if not F:TContains(CellDB["targetedSpellsList"], 395906) then -- 电化之颌
tinsert(CellDB["targetedSpellsList"], 395906)
end
if not F:TContains(CellDB["targetedSpellsList"], 372158) then -- 破甲一击
tinsert(CellDB["targetedSpellsList"], 372158)
end
if not F:TContains(CellDB["targetedSpellsList"], 372056) then -- 碾压
tinsert(CellDB["targetedSpellsList"], 372056)
end
if not F:TContains(CellDB["targetedSpellsList"], 375580) then -- 西风猛击
tinsert(CellDB["targetedSpellsList"], 375580)
end
if not F:TContains(CellDB["targetedSpellsList"], 376276) then -- 震荡猛击
tinsert(CellDB["targetedSpellsList"], 376276)
end
-- 红玉新生法池
if not F:TContains(CellDB["targetedSpellsList"], 381512) then -- 风暴猛击
tinsert(CellDB["targetedSpellsList"], 381512)
end
-- 碧蓝魔馆
if not F:TContains(CellDB["targetedSpellsList"], 374789) then -- 注能打击
tinsert(CellDB["targetedSpellsList"], 374789)
end
if not F:TContains(CellDB["targetedSpellsList"], 372222) then -- 奥术顺劈
tinsert(CellDB["targetedSpellsList"], 372222)
end
if not F:TContains(CellDB["targetedSpellsList"], 384978) then -- 巨龙打击
tinsert(CellDB["targetedSpellsList"], 384978)
end
if not F:TContains(CellDB["targetedSpellsList"], 391136) then -- 肩部猛击
tinsert(CellDB["targetedSpellsList"], 391136)
end
-- 诺库德阻击战
if not F:TContains(CellDB["targetedSpellsList"], 376827) then -- 传导打击
tinsert(CellDB["targetedSpellsList"], 376827)
end
if not F:TContains(CellDB["targetedSpellsList"], 376829) then -- 雷霆打击
tinsert(CellDB["targetedSpellsList"], 376829)
end
if not F:TContains(CellDB["targetedSpellsList"], 375937) then -- 撕裂猛击
tinsert(CellDB["targetedSpellsList"], 375937)
end
if not F:TContains(CellDB["targetedSpellsList"], 375929) then -- 野蛮打击
tinsert(CellDB["targetedSpellsList"], 375929)
end
Cell.vars.targetedSpellsList = F:ConvertTable(CellDB["targetedSpellsList"])
end
end
-- r154-release
if CellDB["revise"] and dbRevision < 154 then
if Cell.isRetail then
-- 诺库德阻击战
if not F:TContains(CellDB["targetedSpellsList"], 376644) then -- 钢铁之矛
tinsert(CellDB["targetedSpellsList"], 376644)
end
if not F:TContains(CellDB["targetedSpellsList"], 376865) then -- 静电之矛
tinsert(CellDB["targetedSpellsList"], 376865)
end
if not F:TContains(CellDB["targetedSpellsList"], 382836) then -- 残杀
tinsert(CellDB["targetedSpellsList"], 382836)
end
-- 英灵殿
if not F:TContains(CellDB["targetedSpellsList"], 196838) then -- 血之气息
tinsert(CellDB["targetedSpellsList"], 196838)
end
end
end
-- r156-release
if CellDB["revise"] and dbRevision < 156 then
if CellDB["customDefensives"] then
CellDB["defensives"]["custom"] = CellDB["customDefensives"]
CellDB["customDefensives"] = nil
end
if CellDB["customExternals"] then
CellDB["externals"]["custom"] = CellDB["customExternals"]
CellDB["customExternals"] = nil
end
end
-- r158-release
if CellDB["revise"] and dbRevision < 158 then
--! Missing Buffs indicator only works on Retail
--! because it's difficult to check Blessings on Wrath
if Cell.isRetail then
local index = Cell.defaults.indicatorIndices.missingBuffs
for _, layout in pairs(CellDB["layouts"]) do
if not layout["indicators"][index] or layout["indicators"][index]["indicatorName"] ~= "missingBuffs" then
tinsert(layout.indicators, index, {
["name"] = "Missing Buffs",
["indicatorName"] = "missingBuffs",
["type"] = "built-in",
["enabled"] = false,
-- ["trackByName"] = Cell.isCata,
["position"] = {"BOTTOMRIGHT", "BOTTOMRIGHT", 0, 4},
["frameLevel"] = 10,
["size"] = {13, 13},
["num"] = 3,
["orientation"] = "right-to-left",
})
end
end
end
end
-- r162-release
if CellDB["revise"] and dbRevision < 162 then
if type(CellDB["general"]["sortPartyByRole"]) == "boolean" then
for _, layout in pairs(CellDB["layouts"]) do
layout["sortByRole"] = CellDB["general"]["sortPartyByRole"]
end
CellDB["general"]["sortPartyByRole"] = nil
end
end
-- r163-release
if CellDB["revise"] and dbRevision < 163 then
if type(CellDB["appearance"]["strata"]) ~= "string" then
CellDB["appearance"]["strata"] = "MEDIUM"
end
end
-- r164-release
if CellDB["revise"] and dbRevision < 164 then
for class, t in pairs(CellDB["clickCastings"]) do
if type(t["smartResurrection"]) ~= "string" then
t["smartResurrection"] = "disabled"
end
end
end
-- r168-release
if CellDB["revise"] and dbRevision < 168 then
if Cell.isRetail then
-- targetedSpells
-- 亚贝鲁斯,焰影熔炉
if not F:TContains(CellDB["targetedSpellsList"], 401022) then -- 灾祸掠击
tinsert(CellDB["targetedSpellsList"], 401022)
end
if not F:TContains(CellDB["targetedSpellsList"], 407790) then -- 身影碎离
tinsert(CellDB["targetedSpellsList"], 407790)
end
end
end
-- r169-release
if CellDB["revise"] and dbRevision < 169 then
if Cell.isRetail then
local privateAuras = Cell.defaults.indicatorIndices["privateAuras"]
for _, layout in pairs(CellDB["layouts"]) do
if layout["indicators"][privateAuras]["indicatorName"] ~= "privateAuras" then
tinsert(layout["indicators"], privateAuras, {
["name"] = "Private Auras",
["indicatorName"] = "privateAuras",
["type"] = "built-in",
["enabled"] = true,
["position"] = {"TOP", "TOP", 0, 3},
["frameLevel"] = 25,
["size"] = {18, 18},
["privateAuraOptions"] = {true, false},
})
end
end
end
end
-- r170-release
if CellDB["revise"] and dbRevision < 170 then
if not strfind(CellDB["snippets"][0]["code"], "CELL_NICKTAG_ENABLED") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- Use nicknames from Details! Damage Meter (boolean, NickTag-1.0 library)\nCELL_NICKTAG_ENABLED = false"
end
if Cell.isCata then
local index = Cell.defaults.indicatorIndices.missingBuffs
for _, layout in pairs(CellDB["layouts"]) do
if not layout["indicators"][index] or layout["indicators"][index]["indicatorName"] ~= "missingBuffs" then
tinsert(layout.indicators, index, {
["name"] = "Missing Buffs",
["indicatorName"] = "missingBuffs",
["type"] = "built-in",
["enabled"] = false,
["buffByMe"] = false,
["position"] = {"BOTTOMRIGHT", "BOTTOMRIGHT", 0, 4},
["frameLevel"] = 10,
["size"] = {13, 13},
["num"] = 3,
["orientation"] = "right-to-left",
})
end
end
end
end
-- r171-release
if CellDB["revise"] and dbRevision < 171 then
if not strfind(CellDB["snippets"][0]["code"], "CELL_DISPEL_EVOKER_CAUTERIZING_FLAME") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- Add Evoker spell Cauterizing Flame into dispel checker (boolean)\nCELL_DISPEL_EVOKER_CAUTERIZING_FLAME = false"
end
end
-- r173-release
if CellDB["revise"] and dbRevision < 173 then
local leaderIcon = Cell.defaults.indicatorIndices["leaderIcon"]
for _, layout in pairs(CellDB["layouts"]) do
if type(layout["indicators"][leaderIcon]["hideInCombat"]) ~= "boolean" then
layout["indicators"][leaderIcon]["hideInCombat"] = true
end
end
end
-- r174-release
if CellDB["revise"] and dbRevision < 174 then
for _, layout in pairs(CellDB["layouts"]) do
for _, indicator in pairs(layout["indicators"]) do
local name = indicator["indicatorName"]
local type = indicator["type"]
local font = indicator["font"]
if font and #font == 5 then
if name == "debuffs" or name == "raidDebuffs" or name == "externalCooldowns" or name == "defensiveCooldowns" or name == "allCooldowns" or type == "icon" or type == "icons" then
indicator["font"] = {
{font[1], font[2], font[3], "TOPRIGHT", font[4], font[5], {1, 1, 1}}, -- stackFont
{font[1], font[2], font[3], "BOTTOMRIGHT", font[4], -font[5], {1, 1, 1}}, -- durationFont
}
elseif name == "targetedSpells" then
indicator["font"] = {font[1], font[2], font[3], "TOPRIGHT", font[4], font[5], {1, 1, 1}}
elseif type == "bar" or type == "rect" then
indicator["font"] = {font[1], font[2], font[3], "CENTER", font[4], font[5], {1, 1, 1}}
end
end
end
end
end
-- r176-release
if CellDB["revise"] and dbRevision < 176 then
-- full hp color
if type(CellDB["appearance"]["fullColor"]) ~= "table" then
CellDB["appearance"]["fullColor"] = {false, {0.2, 0.2, 0.2}}
end
end
-- r177-release
if CellDB["revise"] and dbRevision < 177 then
if Cell.isRetail then
--! evoker Augmentation 1473
if CellDB["clickCastings"]["EVOKER"] then
if not CellDB["clickCastings"]["EVOKER"][1473] then
CellDB["clickCastings"]["EVOKER"]["alwaysTargeting"][1473] = "disabled"
CellDB["clickCastings"]["EVOKER"][1473] = {
{"type1", "target"},
{"type2", "togglemenu"},
{"type-shiftR", "spell", 361227},
}
end
end
end
end
-- r178-release
if CellDB["revise"] and dbRevision < 178 then
if Cell.isCata then
for _, layout in pairs(CellDB["layouts"]) do
local index = Cell.defaults.indicatorIndices.powerWordShield
if layout["indicators"][index]["indicatorName"] ~= "powerWordShield" then
tinsert(layout["indicators"], index, {
["name"] = "PW:S",
["indicatorName"] = "powerWordShield",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"CENTER", "BOTTOMRIGHT", -7, 7},
["frameLevel"] = 10,
["size"] = {20, 20},
["shieldByMe"] = true,
})
end
end
end
end
-- r181-release
if CellDB["revise"] and dbRevision < 181 then
if Cell.isCata then
for _, layout in pairs(CellDB["layouts"]) do
local index = Cell.defaults.indicatorIndices.powerWordShield
if type(layout["indicators"][index]["shape"]) ~= "string" then
layout["indicators"][index]["shape"] = "circle"
end
end
end
end
-- r182-release
if CellDB["revise"] and dbRevision < 182 then
if Cell.isCata then
if CellDB["clickCastings"] and CellDB["clickCastings"][Cell.vars.playerClass] then
if not CellCharacterDB["clickCastings"]["processed"] then
CellCharacterDB["clickCastings"] = CellDB["clickCastings"][Cell.vars.playerClass]
Cell.vars.clickCastings = CellCharacterDB["clickCastings"]
-- flag as processed
CellCharacterDB["clickCastings"]["processed"] = true
end
end
end
for _, layout in pairs(CellDB["layouts"]) do
if not layout["main"] then
layout["main"] = {
["sortByRole"] = layout["sortByRole"],
["hideSelf"] = layout["hideSelf"],
["size"] = layout["size"],
["position"] = layout["position"],
["powerSize"] = layout["powerSize"],
["orientation"] = layout["orientation"],
["anchor"] = layout["anchor"],
["spacingX"] = layout["spacingX"],
["spacingY"] = layout["spacingY"],
["columns"] = layout["columns"],
["rows"] = layout["rows"],
["groupSpacing"] = layout["groupSpacing"],
}
layout["pet"] = {
["partyEnabled"] = layout["pet"][1],
["raidEnabled"] = layout["pet"][2],
["sameSizeAsMain"] = not layout["pet"][4],
["sameArrangementAsMain"] = true,
["size"] = layout["pet"][5],
["position"] = layout["pet"][3],
["powerSize"] = layout["powerSize"],
["orientation"] = layout["orientation"],
["anchor"] = layout["anchor"],
["spacingX"] = layout["spacingX"],
["spacingY"] = layout["spacingY"],
}
layout["npc"] = {
["enabled"] = layout["npc"][1],
["separate"] = layout["npc"][2],
["sameSizeAsMain"] = not layout["npc"][4],
["sameArrangementAsMain"] = true,
["size"] = layout["npc"][5],
["position"] = layout["npc"][3],
["powerSize"] = layout["powerSize"],
["orientation"] = layout["orientation"],
["anchor"] = layout["anchor"],
["spacingX"] = layout["spacingX"],
["spacingY"] = layout["spacingY"],
}
layout["spotlight"] = {
["enabled"] = layout["spotlight"][1],
["units"] = layout["spotlight"][2],
["sameSizeAsMain"] = not layout["spotlight"][4],
["sameArrangementAsMain"] = true,
["size"] = layout["spotlight"][5],
["position"] = layout["spotlight"][3],
["powerSize"] = layout["powerSize"],
["orientation"] = layout["orientation"],
["anchor"] = layout["anchor"],
["spacingX"] = layout["spacingX"],
["spacingY"] = layout["spacingY"],
}
end
layout["size"] = nil
layout["position"] = nil
layout["powerSize"] = nil
layout["spacingX"] = nil
layout["spacingY"] = nil
layout["orientation"] = nil
layout["anchor"] = nil
layout["columns"] = nil
layout["rows"] = nil
layout["groupSpacing"] = nil
layout["sortByRole"] = nil
layout["hideSelf"] = nil
end
end
-- r186-release
if CellDB["revise"] and dbRevision < 186 then
if CellDB["glows"] then
CellDB["spellRequest"] = CellDB["glows"]["spellRequest"]
CellDB["dispelRequest"] = CellDB["glows"]["dispelRequest"]
CellDB["glows"] = nil
CellDB["spellRequest"]["sharedIconOptions"] = {
"beat", -- [1] animation
27, -- [2] size
"BOTTOMRIGHT", -- [3] anchor
"BOTTOMRIGHT", -- [4] anchorTo
0, -- [5] x
0, -- [6] y
}
for _, t in pairs(CellDB["spellRequest"]["spells"]) do
t["type"] = "icon"
t["icon"] = select(2, F:GetSpellInfo(t["spellId"]))
t["iconColor"] = t["glowOptions"][2][1]
end
CellDB["dispelRequest"]["textOptions"] = {
"A",
{1, 0, 0, 1}, -- [1] color
32, -- [2] size
"TOPLEFT", -- [3] anchor
"TOPLEFT", -- [4] anchorTo
-1, -- [5] x
5, -- [6] y
}
CellDB["dispelRequest"]["type"] = "text"
end
if Cell.isCata then
CellCharacterDB["clickCastings"]["class"] = Cell.vars.playerClass
end
end
-- r187-release
if CellDB["revise"] and dbRevision < 187 then
if type(CellDB["dispelRequest"]["textOptions"][1]) ~= "string" then
tinsert(CellDB["dispelRequest"]["textOptions"][1], 1, "A")
end
if Cell.isRetail and type(CellDB["quickCast"]) == "table" then
for class, classTbl in pairs(CellDB["quickCast"]) do
for spec, specTbl in pairs(classTbl) do
if not specTbl["glowBuffsColor"] then
specTbl["glowBuffsColor"] = {1, 1, 0, 1}
end
if not specTbl["glowCasts"] then
specTbl["glowCasts"] = {}
specTbl["glowCastsColor"] = {1, 0, 1, 1}
end
end
end
end
end
-- r188-release
if CellDB["revise"] and dbRevision < 188 then
if Cell.isRetail and type(CellDB["quickCast"]) == "table" then
for class, classTbl in pairs(CellDB["quickCast"]) do
for spec, specTbl in pairs(classTbl) do
if strfind(specTbl["orientation"], "^vertical") or strfind(specTbl["orientation"], "^horizontal") then
specTbl["orientation"] = specTbl["orientation"]:gsub("^vertical%-", "")
specTbl["orientation"] = specTbl["orientation"]:gsub("^horizontal%-", "")
end
end
end
end
end
-- r190-beta
if CellDB["revise"] and dbRevision < 190 then
if not strfind(CellDB["snippets"][0]["code"], "CELL_TOOLTIP_REMOVE_RAID_SETUP_DETAILS") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- remove raid setup details from the tooltip of the Raid button (boolean)\nCELL_TOOLTIP_REMOVE_RAID_SETUP_DETAILS = false"
end
if Cell.isRetail then
for _, layout in pairs(CellDB["layouts"]) do
local index = Cell.defaults.indicatorIndices.crowdControls
if layout["indicators"][index]["indicatorName"] ~= "crowdControls" then
tinsert(layout["indicators"], index, {
["name"] = "Crowd Controls",
["indicatorName"] = "crowdControls",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"CENTER", "CENTER", 0, 0},
["frameLevel"] = 20,
["size"] = {22, 22},
["border"] = 2,
["num"] = 3,
["font"] = {
{"Cell ".._G.DEFAULT, 11, "Outline", "TOPRIGHT", 2, 1, {1, 1, 1}},
{"Cell ".._G.DEFAULT, 11, "Outline", "BOTTOMRIGHT", 2, -1, {1, 1, 1}},
},
["orientation"] = "left-to-right",
})
end
end
end
end
-- r195-release
if CellDB["revise"] and dbRevision < 195 then
if not strfind(CellDB["snippets"][0]["code"], "CELL_BORDER_SIZE") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- border thickness: unit button and icon (number)\nCELL_BORDER_SIZE = 1"
end
local filters
if Cell.isRetail then
filters = {
["PWF"] = true,
["MotW"] = true,
["AB"] = true,
["BS"] = true,
["BotB"] = true,
}
else
filters = {
["PWF"] = true,
["DS"] = true,
["SP"] = true,
["AB"] = true,
["MotW"] = true,
["PALADIN"] = true,
["WARRIOR"] = true,
}
end
for _, layout in pairs(CellDB["layouts"]) do
local index = Cell.defaults.indicatorIndices.missingBuffs
if type(layout["indicators"][index]["filters"]) ~= "table" then
layout["indicators"][index]["filters"] = F:Copy(filters)
layout["indicators"][index]["filters"]["buffByMe"] = layout["indicators"][index]["buffByMe"]
layout["indicators"][index]["buffByMe"] = nil
end
end
end
-- r196-release
if CellDB["revise"] and dbRevision < 196 then
if not strfind(CellDB["snippets"][0]["code"], "CELL_BORDER_COLOR") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- unit button border color ({r, g, b, a}, number: 0-1)\nCELL_BORDER_COLOR = {0, 0, 0, 1}"
end
end
-- r197-release
if CellDB["revise"] and dbRevision < 197 then
if Cell.isRetail then
for c, ct in pairs(CellDB["quickCast"]) do
for s, st in pairs(ct) do
if type(st["spacing"]) == "number" then
st["spacingX"] = st["spacing"]
st["spacingY"] = st["spacing"]
st["spacing"] = nil
st["lines"] = 6
end
end
end
end
if type(CellDB["tools"]["marks"][2]) ~= "boolean" then
tinsert(CellDB["tools"]["marks"], 2, false)
end
end
-- r198-release
-- if CellDB["revise"] and dbRevision < 198 then
-- for _, layout in pairs(CellDB["layouts"]) do
-- local index = Cell.defaults.indicatorIndices.targetCounter
-- if type(layout["indicators"][index]["filters"]) ~= "table" then
-- layout["indicators"][index]["filters"] = {
-- ["outdoor"] = false,
-- ["pve"] = false,
-- ["pvp"] = true,
-- }
-- end
-- end
-- end
-- r199-release
if CellDB["revise"] and dbRevision < 199 then
if not strfind(CellDB["snippets"][0]["code"], "CELL_SHOW_RAID_PET_OWNER_NAME") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- show raid pet owner name (\"VEHICLE\", \"NAME\", nil)\nCELL_SHOW_RAID_PET_OWNER_NAME = nil"
end
for _, layout in pairs(CellDB["layouts"]) do
for i, t in ipairs(layout["indicators"]) do
if type(t["castByMe"]) == "boolean" then
t["castBy"] = t["castByMe"] and "me" or "anyone"
t["castByMe"] = nil
end
end
end
end
]=]
-- r200-release
if CellDB["revise"] and dbRevision < 200 then
if #CellDB["tools"]["buffTracker"] ~= 4 then
-- move position from 2 to 4
CellDB["tools"]["buffTracker"][4] = CellDB["tools"]["buffTracker"][2]
-- add orientation
CellDB["tools"]["buffTracker"][2] = "left-to-right"
end
if #CellDB["tools"]["readyAndPull"] ~= 4 then
-- add style
tinsert(CellDB["tools"]["readyAndPull"], 2, "text_button")
end
end
-- r201-release
if CellDB["revise"] and dbRevision < 201 then
if Cell.isRetail then
-- 阿梅达希尔,梦境之愿
if not F:TContains(CellDB["targetedSpellsList"], 418637) then -- 狂怒冲锋
tinsert(CellDB["targetedSpellsList"], 418637)
end
end
end
-- r202-release
-- if CellDB["revise"] and dbRevision < 202 then
-- -- custom indicator
-- for _, layout in pairs(CellDB["layouts"]) do
-- for _, indicator in pairs(layout["indicators"]) do
-- if indicator["type"] == "icon" or indicator["type"] == "icons" then
-- if type(indicator["showStack"]) ~= "boolean" then
-- indicator["showStack"] = true
-- end
-- end
-- end
-- end
-- end
-- r203-release
if CellDB["revise"] and dbRevision < 203 then
for _, layout in pairs(CellDB["layouts"]) do
for i, t in pairs(layout["indicators"]) do
if t["indicatorName"] == "targetCounter" then
if type(t["filters"]) ~= "table" then
t["filters"] = {
["outdoor"] = false,
["pve"] = false,
["pvp"] = true,
}
end
break
end
end
end
end
-- r205-release
if CellDB["revise"] and dbRevision < 205 then
for _, layout in pairs(CellDB["layouts"]) do
for i, t in pairs(layout["indicators"]) do
if t["indicatorName"] == "aggroBorder" then
if t["frameLevel"] == 3 then
t["frameLevel"] = 7
end
break
end
end
end
if not CellDB["general"]["framePriority"] then
CellDB["general"]["framePriority"] = "normal_spotlight"
end
end
-- r206-release
if CellDB["revise"] and dbRevision < 206 then
for _, layout in pairs(CellDB["layouts"]) do
for _, t in pairs(layout["indicators"]) do
-- fix showStack for custom indicators
if t["type"] == "icon" or t["type"] == "icons" then
if type(t["showStack"]) ~= "boolean" then
t["showStack"] = true
end
end
if t["indicatorName"] == "statusText" then
-- add showTimer for statusText
if type(t["showTimer"]) ~= "boolean" then
t["showTimer"] = true
end
-- add showBackground for statusText
if type(t["showBackground"]) ~= "boolean" then
t["showBackground"] = true
end
end
if t["indicatorName"] == "nameText" then
-- swap en/non-en length for name text
if t["textWidth"][1] == "length" then
if not t["textWidth"][3] then -- en cilents
t["textWidth"][3] = 3
else -- aisan cilents
local temp = t["textWidth"][2]
t["textWidth"][2] = t["textWidth"][3]
t["textWidth"][3] = temp
end
end
end
end
end
if CellDB["general"]["framePriority"] == "normal_spotlight" then
CellDB["general"]["framePriority"] = "normal_spotlight_quickassist"
elseif CellDB["general"]["framePriority"] == "spotlight_normal" then
CellDB["general"]["framePriority"] = "spotlight_normal_quickassist"
end
end
-- r207-release
if CellDB["revise"] and dbRevision < 207 then
if Cell.isRetail then
for spec, t in pairs(CellDB["quickAssist"]) do
-- clickCastings -> buffs
if not t["spells"]["mine"]["buffs"] then
t["spells"]["mine"]["buffs"] = t["spells"]["mine"]["clickCastings"]
t["spells"]["mine"]["clickCastings"] = nil
for _, st in pairs(t["spells"]["mine"]["buffs"]) do
if st[1] == -1 then st[1] = 0 end
tinsert(st, 2, "icon")
end
end
-- add bar options
if not t["spells"]["mine"]["bar"] then
t["spells"]["mine"]["bar"] = {
["position"] = {"TOPRIGHT", "BOTTOMRIGHT", 0, 1},
["orientation"] = "top-to-bottom",
["size"] = {75, 4},
}
end
-- add glow options
if not t["spells"]["offensives"]["glow"] then
t["spells"]["offensives"]["glow"] = {
["fadeOut"] = false,
["options"] = {"None", {0.95,0.95,0.32,1}},
}
end
-- add filters
if not t["layout"]["filters"] then
t["layout"]["filters"] = {
t["layout"]["filter"],
{"role", {["TANK"] = false, ["HEALER"] = false, ["DAMAGER"] = true}, false},
{"role", {["TANK"] = false, ["HEALER"] = false, ["DAMAGER"] = true}, false},
{"role", {["TANK"] = false, ["HEALER"] = false, ["DAMAGER"] = true}, false},
{"role", {["TANK"] = false, ["HEALER"] = false, ["DAMAGER"] = true}, false},
["active"] = 1,
}
t["layout"]["filter"] = nil
end
end
end
end
-- r209-release
if CellDB["revise"] and dbRevision < 209 then
-- add change-over-time to custom Color indicator
for _, layout in pairs(CellDB["layouts"]) do
for _, indicator in pairs(layout["indicators"]) do
if indicator["type"] == "color" and #indicator["colors"] ~= 6 then
indicator["colors"][4] = {0,1,0} -- normal
indicator["colors"][5] = {1,1,0,0.5} -- percent
indicator["colors"][6] = {1,0,0,3} -- second
end
end
end
end
-- r210-release
if CellDB["revise"] and dbRevision < 210 then
if not CellDB["debuffTypeColor"]["Bleed"] then
CellDB["debuffTypeColor"]["Bleed"] = {r=1, g=0.2, b=0.6}
end
end
-- r213-release
if CellDB["revise"] and dbRevision < 213 then
if Cell.isRetail then
for spec, t in pairs(CellDB["quickAssist"]) do
if not t["filters"] then
t["filters"] = t["layout"]["filters"]
t["filters"]["active"] = nil
t["filters"][6] = F:Copy(t["filters"][5])
t["filters"][7] = F:Copy(t["filters"][5])
t["layout"]["filters"] = nil
end
if not t["filterAutoSwitch"] then
t["filterAutoSwitch"] = {
["party"] = 1,
["raid"] = 1,
["mythic"] = 1,
["arena"] = 1,
["battleground"] = 1,
}
end
for _, ft in pairs(t["filters"]) do
if ft[1] == "name" then
ft[3] = false
end
end
end
end
end
-- r215-release
if CellDB["revise"] and dbRevision < 215 then
for _, layout in pairs(CellDB["layouts"]) do
for i, t in pairs(layout["indicators"]) do
-- add color for tankActiveMitigation
if t["indicatorName"] == "tankActiveMitigation" then
if type(t["color"]) ~= "table" then
t["color"] = {"class_color", {0.25, 1, 0}}
end
end
-- rename nameColor to color
if t["indicatorName"] == "nameText" then
if type(t["color"]) ~= "table" then
t["color"] = t["nameColor"]
if t["color"][1] == "custom" then
t["color"][1] = "custom_color"
end
t["nameColor"] = nil
end
end
end
end
-- set alwaysUpdateDebuffs default to true
if not CellDB["general"]["alwaysUpdateDebuffs"] then
CellDB["general"]["alwaysUpdateDebuffs"] = true
end
end
-- r217-release
if CellDB["revise"] and dbRevision < 217 then
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.indicatorName == "externalCooldowns" or i.indicatorName == "defensiveCooldowns" or i.indicatorName == "allCooldowns" or i.indicatorName == "debuffs"
or i.type == "icon" or i.type == "icons" then
-- add showAnimation option
if type(i.showAnimation) ~= "boolean" then
i.showAnimation = true
end
-- update showDuration
if i.showDuration == 0 then
i.showDuration = true
end
end
end
end
if Cell.isRetail then
for spec, t in pairs(CellDB["quickAssist"]) do
-- update showDuration
if t["spells"]["mine"]["icon"]["showDuration"] == 0 then
t["spells"]["mine"]["icon"]["showDuration"] = true
end
if t["spells"]["offensives"]["icon"]["showDuration"] == 0 then
t["spells"]["offensives"]["icon"]["showDuration"] = true
end
-- add showAnimation
if type(t["spells"]["mine"]["icon"]["showAnimation"]) ~= "boolean" then
t["spells"]["mine"]["icon"]["showAnimation"] = true
end
if type(t["spells"]["offensives"]["icon"]["showAnimation"]) ~= "boolean" then
t["spells"]["offensives"]["icon"]["showAnimation"] = true
end
end
end
end
-- r218-release
if CellDB["revise"] and dbRevision < 218 then
for _, layout in pairs(CellDB["layouts"]) do
-- fix role order option
if not layout["main"]["roleOrder"] then
layout["main"]["roleOrder"] = {"TANK", "HEALER", "DAMAGER"}
end
end
end
-- r219-release
if CellDB["revise"] and dbRevision < 219 then
if not CellDB["appearance"]["gradientColors"] then
CellDB["appearance"]["gradientColors"] = {{1,0,0}, {1,0.7,0}, {0.7,1,0}}
end
end
-- r221-release
if CellDB["revise"] and dbRevision < 221 then
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.type == "icons" then
if not i.numPerLine then
i.numPerLine = i.num
end
elseif i.type == "bar" then
if #i.colors ~= 4 then
tinsert(i.colors, {0.07,0.07,0.07,0.9})
tinsert(i.colors[2], 1, true)
tinsert(i.colors[3], 1, true)
end
end
end
end
end
-- r222-release
if CellDB["revise"] and dbRevision < 222 then
for _, layout in pairs(CellDB["layouts"]) do
-- add maxColumns, unitsPerColumn
if not layout["main"]["maxColumns"] then
if layout["main"]["orientation"] == "vertical" then
layout["main"]["maxColumns"] = layout["main"]["columns"]
else
layout["main"]["maxColumns"] = layout["main"]["rows"]
end
layout["main"]["columns"] = nil
layout["main"]["rows"] = nil
end
if not layout["main"]["unitsPerColumn"] then
layout["main"]["unitsPerColumn"] = 5
end
-- update text/rect color
for _, i in pairs(layout["indicators"]) do
if i.type == "text" or i.type == "rect" then
if #i.colors[2] ~= 5 then
tinsert(i.colors[2], 1, true)
tinsert(i.colors[3], 1, true)
end
end
end
end
-- update layoutAutoSwitch
if Cell.isRetail then
if not CellDB["layoutAutoSwitch"]["role"] then
CellDB["layoutAutoSwitch"]["role"] = {
["TANK"] = CellDB["layoutAutoSwitch"]["TANK"],
["HEALER"] = CellDB["layoutAutoSwitch"]["HEALER"],
["DAMAGER"] = CellDB["layoutAutoSwitch"]["DAMAGER"],
}
F:RemoveElementsExceptKeys(CellDB["layoutAutoSwitch"], "role", Cell.vars.playerClass)
end
end
end
-- r223-release
if CellDB["revise"] and dbRevision < 223 then
-- debuffBlacklist
if not F:TContains(CellDB["debuffBlacklist"], 89798) then -- 大冒险家奖励
tinsert(CellDB["debuffBlacklist"], 89798)
Cell.vars.debuffBlacklist = F:ConvertTable(CellDB["debuffBlacklist"])
end
end
-- r224-release
if CellDB["revise"] and dbRevision < 224 then
for _, layout in pairs(CellDB["layouts"]) do
for i, t in pairs(layout["indicators"]) do
-- update health text color option
if t["indicatorName"] == "healthText" then
if #t["color"] == 3 then
t["color"] = {"custom_color", t["color"]}
end
end
-- add frameLevel to Color and Overlay
if t["type"] == "color" or t["type"] == "overlay" then
if not t["frameLevel"] then
t["frameLevel"] = 1
end
end
end
-- add power text indicator
local index = Cell.defaults.indicatorIndices.powerText
if layout["indicators"][index]["indicatorName"] ~= "powerText" then
tinsert(layout["indicators"], index, {
["name"] = "Power Text",
["indicatorName"] = "powerText",
["type"] = "built-in",
["enabled"] = false,
["position"] = {"BOTTOMRIGHT", "BOTTOMRIGHT", 0, 3},
["frameLevel"] = 2,
["font"] = {"Cell ".._G.DEFAULT, 10, "Shadow"},
["color"] = {"custom_color", {1, 1, 1}},
["format"] = "number",
["hideIfEmptyOrFull"] = true,
})
end
end
-- move "use LibHealComm" to snippetVars
if not strfind(CellDB["snippets"][0]["code"], "CELL_USE_LIBHEALCOMM") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- use LibHealComm (boolean, non-retail)\nCELL_USE_LIBHEALCOMM = false"
end
-- update overshield
if type(CellDB["appearance"]["overshield"]) ~= "table" then
local enabled = CellDB["appearance"]["overshield"] and true or false
CellDB["appearance"]["overshield"] = {enabled, {CellDB["appearance"]["shield"][2][1], CellDB["appearance"]["shield"][2][2], CellDB["appearance"]["shield"][2][3], 1}}
end
-- disable snippets
F:DisableSnippets()
end
-- r226-release
if CellDB["revise"] and dbRevision < 226 then
local function AddAlpha(t)
local temp = {}
temp[1] = t[1]
temp[2] = t[5]
temp[3] = {t[2], t[3], t[4], 1}
return temp
end
local function AddAlpha2(t)
local temp = {}
temp[1] = t[4]
temp[2] = {t[1], t[2], t[3], 1}
return temp
end
local function AddAlpha3(t)
local temp = {}
temp[1] = t[1]
temp[2] = t[6]
temp[3] = {t[2], t[3], t[4], t[5]}
return temp
end
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.indicatorName == "raidDebuffs" then
i.showDuration = true
end
-- separate "Shadow" from "Outline"
if type(i.font) == "table" then
if type(i.font[1]) == "table" then
if type(i.font[1][4]) ~= "boolean" then
if string.find(i.font[1][3], "^Shadow") then
i.font[1][3] = "None"
tinsert(i.font[1], 4, true)
else
tinsert(i.font[1], 4, false)
end
if string.find(i.font[2][3], "^Shadow") then
i.font[2][3] = "None"
tinsert(i.font[2], 4, true)
else
tinsert(i.font[2], 4, false)
end
end
else
if type(i.font[4]) ~= "boolean" then
if string.find(i.font[3], "^Shadow") then
i.font[3] = "None"
tinsert(i.font, 4, true)
else
tinsert(i.font, 4, false)
end
end
end
end
-- add alpha to "colors"
if i.colors then
if i.type == "text" then
if #i.colors[1] == 3 then
i.colors[1][4] = 1
i.colors[2] = AddAlpha(i.colors[2])
i.colors[3] = AddAlpha(i.colors[3])
end
elseif i.type == "rect" then
if #i.colors[1] == 3 then
i.colors[1][4] = 1
i.colors[2] = AddAlpha(i.colors[2])
i.colors[3] = AddAlpha(i.colors[3])
i.colors[4] = {0, 0, 0, 1}
end
elseif i.type == "bar" then
if #i.colors[1] == 3 then
i.colors[1][4] = 1
i.colors[2] = AddAlpha(i.colors[2])
i.colors[3] = AddAlpha(i.colors[3])
i.colors[5] = i.colors[4]
i.colors[4] = {0, 0, 0, 1}
end
elseif i.type == "color" then
if #i.colors[4] == 3 then
i.colors[4][4] = 1
i.colors[5] = AddAlpha2(i.colors[5])
i.colors[6] = AddAlpha2(i.colors[6])
end
elseif i.type == "overlay" then
if #i.colors[2] == 6 then
i.colors[2] = AddAlpha3(i.colors[2])
i.colors[3] = AddAlpha3(i.colors[3])
end
end
end
-- add frameLevel
if i.indicatorName == "roleIcon" then
if not i.frameLevel then
i.frameLevel = 1
end
end
end
end
-- disable snippets
F:DisableSnippets()
end
-- r227-release
if CellDB["revise"] and dbRevision < 227 then
if Cell.isRetail then
-- QuickAssist: separate "Shadow" from "Outline"
local function FixShadow(t)
if type(t[4]) ~= "boolean" then
if string.find(t[3], "^Shadow") then
t[3] = "None"
tinsert(t, 4, true)
else
tinsert(t, 4, false)
end
end
end
for _, t in pairs(CellDB["quickAssist"]) do
FixShadow(t.style.name.font)
FixShadow(t.spells.mine.icon.font[1])
FixShadow(t.spells.mine.icon.font[2])
FixShadow(t.spells.offensives.icon.font[1])
FixShadow(t.spells.offensives.icon.font[2])
end
end
end
-- r228-release
if CellDB["revise"] and dbRevision < 228 then
if type(CellDB["appearance"]["overshieldReverseFill"]) ~= "boolean" then
CellDB["appearance"]["overshieldReverseFill"] = CellDB["appearance"]["overshieldReverseFilling"] or false
CellDB["appearance"]["overshieldReverseFilling"] = nil
end
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.type == "bar" or i.type == "rect" then
-- add duration font for Bar/Rect
if #i.font ~= 2 then
i.showDuration = false
if i.showStack then
local stackFont = i.font
i.font = {
stackFont,
{"Cell ".._G.DEFAULT, 11, "Outline", false, "RIGHT", -1, 0, {1, 1, 1}},
}
else
i.font = {
{"Cell ".._G.DEFAULT, 11, "Outline", false, "LEFT", 1, 0, {1, 1, 1}},
{"Cell ".._G.DEFAULT, 11, "Outline", false, "RIGHT", -1, 0, {1, 1, 1}},
}
end
end
elseif i.type == "icons" then
-- add spacing for icons
if type(i.spacing) ~= "table" then
i.spacing = {0, 0}
end
elseif i.indicatorName == "targetedSpells" then
if not i.num then
i.num = 1
i.orientation = "left-to-right"
end
end
end
end
-- update RaidDebuffs structure
local indices = {"order", "trackByID", "condition", "glowType", "glowOptions", "glowCondition"}
for instanceId, iTable in pairs(CellDB["raidDebuffs"]) do
for bossId, bTable in pairs(iTable) do
for spellId, sTable in pairs(bTable) do
if #sTable ~= 0 then
local old = F:Copy(sTable)
wipe(sTable)
for i, index in pairs(indices) do
sTable[index] = old[i]
end
end
end
end
end
-- add "solo" for layout auto switch
if Cell.isRetail then
for role, t in pairs(CellDB["layoutAutoSwitch"]) do
for _, st in pairs(t) do
if not st.solo then st.solo = st.party end
end
end
end
end
if CellCharacterDB and CellCharacterDB["revise"] and charaDbRevision < 229 then
for _, t in pairs(CellCharacterDB["layoutAutoSwitch"]) do
if not t.solo then t.solo = t.party end
end
end
-- r230-beta
if CellDB["revise"] and dbRevision < 230 then
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.type == "color" then
-- limit frameLevel to 50
if i.frameLevel > 50 then
i.frameLevel = 50
end
end
end
end
-- CELL_COOLDOWN_STYLE
if not strfind(CellDB["snippets"][0]["code"], "CELL_COOLDOWN_STYLE") then
CellDB["snippets"][0]["code"] = CellDB["snippets"][0]["code"].."\n\n-- cooldown style for icon/block indicators (\"VERTICAL\", \"CLOCK\")\nCELL_COOLDOWN_STYLE = \"VERTICAL\""
end
-- disable snippets
F:DisableSnippets()
end
-- r231-release
if CellDB["revise"] and dbRevision < 231 then
-- consumables -> actions
if CellDB["consumables"] then
CellDB["actions"] = CellDB["consumables"]
CellDB["consumables"] = nil
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.indicatorName == "consumables" then
i.name = "Actions"
i.indicatorName = "actions"
break
end
end
end
end
-- click-castings macro -> macrotext
if Cell.isRetail then
for _, classT in pairs(CellDB["clickCastings"]) do
for k, t in pairs(classT) do
if type(k) == "number" or k == "common" then
for _, binding in pairs(t) do
if binding[2] == "macro" and binding[3] and strfind(strtrim(binding[3]), "^[/#]") then
binding[2] = "custom"
end
end
end
end
end
else
for _, t in pairs(CellCharacterDB["clickCastings"]) do
if type(k) == "number" or k == "common" then
for _, binding in pairs(t) do
if binding[2] == "macro" and binding[3] and strfind(strtrim(binding[3]), "^[/#]") then
binding[2] = "custom"
end
end
end
end
end
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.type == "block" then
-- update block, add "colorBy"
if #i.colors == 4 then
tinsert(i.colors, 1, "duration")
end
elseif i.indicatorName == "dispels" then
-- update Dispels filters
if not i.filters then
i.filters = {
["dispellableByMe"] = i.dispellableByMe,
["Curse"] = true,
["Disease"] = true,
["Magic"] = true,
["Poison"] = true,
["Bleed"] = true,
}
end
i.dispellableByMe = nil
end
end
end
end
-- r234-release
if CellDB["revise"] and dbRevision < 234 then
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.indicatorName == "readyCheckIcon" then
if not i.position then
i.position = {"CENTER", "CENTER", 0, 0}
end
end
if i.type == "overlay" then
if i.frameLevel > 50 then
i.frameLevel = 50
end
end
end
end
end
-- r235-release
if CellDB["revise"] and dbRevision < 235 then
for _, layout in pairs(CellDB["layouts"]) do
for _, i in pairs(layout["indicators"]) do
if i.indicatorName == "statusText" then
if #i.position ~= 3 then
i.position[3] = "justify"
end
end
end
end
if #CellDB["appearance"]["gradientColors"] ~= 5 then
CellDB["appearance"]["gradientColors"][4] = 0.05
CellDB["appearance"]["gradientColors"][5] = 0.95
end
if type(CellDB["general"]["showRaid"]) ~= "boolean" then
CellDB["general"]["showRaid"] = true
end
end
-- ----------------------------------------------------------------------- --
-- update from old versions, validate all indicators --
-- ----------------------------------------------------------------------- --
if CellDB["revise"] and CellDB["revise"] ~= Cell.version then
for layoutName, layout in pairs(CellDB["layouts"]) do
local toValidate = F:Copy(Cell.defaults.indicatorIndices)
local temp = {}
-- built-ins
for i, t in ipairs(layout["indicators"]) do
local name = t["indicatorName"]
if t["type"] == "built-in" and toValidate[name] then
if i == toValidate[name] then
-- copy valid indicator
-- print(layoutName, "RIGHT", i, name)
tinsert(temp, t)
else
-- search for correct indicator
local found
for j = i, #layout["indicators"] do
if name == layout["indicators"][j]["indicatorName"] then
-- print(layoutName, "WRONG_FOUND", j, "->", toValidate[name], name)
found = true
tinsert(temp, layout["indicators"][j])
break
end
end
-- not found, copy from Defaults
if not found then
-- print(layoutName, "WRONG_NOT_FOUND", i, name)
tinsert(temp, Cell.defaults.layout.indicators[toValidate[name]])
end
end
-- remove validated
toValidate[name] = nil
end
end
-- customs
for i, t in ipairs(layout["indicators"]) do
if t["type"] ~= "built-in" then
tinsert(temp, t)
end
end
layout["indicators"] = temp
end
end
--! update custom indicator names
for _, layout in pairs(CellDB["layouts"]) do
local index = 1
for i, t in ipairs(layout["indicators"]) do
if t["type"] ~= "built-in" then
t["indicatorName"] = "indicator"..index
index = index + 1
end
end
end
CellDB["revise"] = Cell.version
if CellCharacterDB then
CellCharacterDB["revise"] = Cell.version
end
end