local VersionType = { --不可复用 DoOnly = 1, -- 严格执行 数据结构变更等 -- 复用类型 Add = 2, -- 可叠加执行 活动清除状态等 params需是数组 Override = 3, -- 覆盖执行 只执行最后一个同方法变更 取最后一个的 params } ---------------------版本方法 start --------------------- local function createVersionFunc(vType, func) local v = {vType = vType} setmetatable(v, {__call = function(cv, ...) func( ... ) end}) return v end -- 例子 local clearActivity = createVersionFunc(VersionType.Add ,function(role, params) print("clearActivity") dump(params) end) local changeStructF = createVersionFunc(VersionType.DoOnly ,function(role, params) print("changeStructF" .. " >>> " .. params) end) local awardGift = createVersionFunc(VersionType.Override ,function(role, params) print("awardGift" .. " >>> " .. params) end) local bugFixSuduku = createVersionFunc(VersionType.DoOnly, function(role, params) local sudoku = role:getProperty("sudoku") local phase = sudoku[-1] or 1 local id = 9 if phase == 1 then local curData = (csvdb["guide_sudokuCsv"][phase] or {})[id] if role:checkHangPass(curData.con2) then sudoku.task = sudoku.task or {} sudoku.task[phase] = sudoku.task[phase] or {} if (sudoku.task[phase][id] or 0 == 0) then sudoku.task[phase][id] = 1 role:setProperty("sudoku", sudoku) end end end end) local bugFixRune = createVersionFunc(VersionType.DoOnly, function(role, params) local had = false for id, rune in pairs(role.runeBag) do if math.floor(rune:getProperty("id") / 1000) == 16 then local attrs = rune:getProperty("attrs") local atk = attrs:getv(2, 0) if atk ~= 0 then attrs = attrs:delk(2):setv(1, atk) had = true rune:setProperty("attrs",attrs) end end end if had then -- 补偿 end end) -- 清除 player 消失 的冒险 local bugFixAdvPlayer = createVersionFunc(VersionType.Override, function(role, params) if role:getAdvData():isRunning() and not role:getProperty("advTeam").player then role:getAdvData():forceOver(true) end end) ---------------------版本方法 end ---------------------- -- version 罗列start local versionList = {} -- version 列表 versionList[1] = {bugFixSuduku, {}} versionList[2] = {bugFixRune, {}} versionList[3] = {bugFixAdvPlayer, {}} -- versionList[2] = {clearActivity, {5, 7}} -- versionList[3] = {changeStructF, "test1"} -- versionList[4] = {changeStructF, "test2"} -- versionList[5] = {awardGift, "test3"} -- versionList[6] = {awardGift, "test4"} --version 罗列end local RoleChangeStruct = {} -- 处理历史遗留问题 以及数据不兼容的问题。可用于版本间清除活动状态,发放补偿, 修改数据结构等 function RoleChangeStruct.bind(Role) function Role:changeStructVersion() local curVersion = self:getProperty("sversion") if not STRUCT_VERSION or curVersion >= STRUCT_VERSION then return end local jumpVersion = {} local versionTemp = {} for version = curVersion + 1, STRUCT_VERSION do local versionData = versionList[version] if versionData then if versionData[1].vType == VersionType.DoOnly then elseif versionData[1].vType == VersionType.Add then if versionTemp[versionData[1]] then jumpVersion[versionTemp[versionData[1]].version] = true versionTemp[versionData[1]].version = version for _, param in ipairs(versionData[2] or {}) do table.insert(versionTemp[versionData[1]].params, param) end else local params = {} for _, param in ipairs(versionData[2] or {}) do table.insert(params, param) end versionTemp[versionData[1]] = {version = version, params = params} end elseif versionData[1].vType == VersionType.Override then if versionTemp[versionData[1]] then jumpVersion[versionTemp[versionData[1]].version] = true versionTemp[versionData[1]].version = version else versionTemp[versionData[1]] = {version = version} end else print(">>>>>>> error changeStruct error version Type >>>>> " .. version) end else jumpVersion[version] = true end end for version = curVersion + 1, STRUCT_VERSION do if not jumpVersion[version] then local versionData = versionList[version] if versionData[1].vType == VersionType.DoOnly or versionData[1].vType == VersionType.Override then versionData[1](self, versionData[2]) elseif versionData[1].vType == VersionType.Add then versionData[1](self, versionTemp[versionData[1]].params) end end end self:setProperty("sversion", STRUCT_VERSION) end end return RoleChangeStruct