diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index 7f7dcbd..72e4f6f 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -55,11 +55,11 @@ function _M.loginRpc( agent, data ) local msg = MsgPack.unpack(data) local response = {} - if msg.version ~= globalCsv.version then - response.result = "UPDATE_TIP" - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) - return true - end + -- if msg.version ~= globalCsv.version then + -- response.result = "UPDATE_TIP" + -- SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) + -- return true + -- end -- 1. local roleId = redisproxy:get(string_format("user:%s", string.upper(msg.name))) @@ -99,112 +99,42 @@ function _M.loginRpc( agent, data ) role:reloadWhenLogin() end - if not msg.isGMlogin then - local banTime = role:getProperty("banTime") - if banTime > now then - response.result = "BAN_TIP" - response.banTime = banTime - response.banType = role:getProperty("banType") - response.roleId = roleId - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) - return true - end - if banTime ~= 0 then - -- 清除封号状态 - role:setBan(0) - end - end + -- if not msg.isGMlogin then + -- local banTime = role:getProperty("banTime") + -- if banTime > now then + -- response.result = "BAN_TIP" + -- response.banTime = banTime + -- response.banType = role:getProperty("banType") + -- response.roleId = roleId + -- SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) + -- return true + -- end + -- if banTime ~= 0 then + -- -- 清除封号状态 + -- role:setBan(0) + -- end + -- end SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start") local lastLoginTime = role:getProperty("lastLoginTime") - -- 跨天登陆事件 - if not role:onCrossDay(now) then - role:checkActivityStatus(lastLoginTime, now) - if role:getProperty("carbonDouble") == "" then - role:initCarbonDouble() - end - end - -- 登陆回复 - role:onRecoverLogin(now) - -- 引导是否连续 - role:checkGuide() + role:changeStructVersion() -- 数据结构 版本更新 + -- 跨天登陆事件 + -- role:onCrossDay(now) role:setProperty("lastLoginTime", now) - if msg.device and type(msg.device) == "string" then - role:setProperty("device", msg.device) - end + -- if msg.device and type(msg.device) == "string" then + -- role:setProperty("device", msg.device) + -- end response.role = role:data() response.result = "SUCCESS" response.serverTime = now - -- 需要加载模块数据 - local modules = { - "carbons","maps", - } - - local heroIds = {} - for heroId, _ in pairs(role.heros) do - table.insert(heroIds, heroId) - end - local heroWave = math.ceil(#heroIds / WAVE_HERO_NUMS) - - local equipIds = {} - for equipId, _ in pairs(role.equips) do - table.insert(equipIds, equipId) - end - local equipWave = math.ceil(#equipIds / WAVE_EQUIP_NUMS) - - if #heroIds <= 50 then - heroWave = 0 - table_insert(modules, "heros") - end - if #equipIds <= 50 then - equipWave = 0 - table_insert(modules, "equips") - end - - for _, name in ipairs(modules) do - response[name] = {} - for id, unit in pairs(role[name]) do - response[name][id] = unit:data() - end - end - response.wave = 1 + heroWave + equipWave + response.wave = 1 SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) - local heroIndex = 1 - for index = 2, 1 + heroWave do - local heroResponse = {heros = {}} - for i = heroIndex, heroIndex + WAVE_HERO_NUMS do - local heroId = heroIds[i] - if not heroId then - break - end - local hero = role.heros[heroId] - table_insert(heroResponse.heros, hero:data()) - heroIndex = heroIndex + 1 - end - heroResponse.heroWave = index - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(heroResponse)) - end - local equipIndex = 1 - for index = 2 + heroWave, 1 + heroWave + equipWave do - local equipResponse = {equips = {}} - for i = equipIndex, equipIndex + WAVE_EQUIP_NUMS do - local equipId = equipIds[i] - if not equipId then - break - end - local equip = role.equips[equipId] - table_insert(equipResponse.equips, equip:data()) - equipIndex = equipIndex + 1 - end - equipResponse.equipWave = index - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(equipResponse)) - end -- role:log("login", { ip = agent.ip, diamond = role:getProperty("diamond"), reDiamond = role:getProperty("reDiamond")}) @@ -214,7 +144,6 @@ function _M.loginRpc( agent, data ) gate_serv = agent.gate_serv, }) agent.role = role - role.lessmsg = false start_agent_timer() -- 注册全服广播 @@ -247,7 +176,6 @@ function _M.createRpc(agent, data) return true end local roleName = setRoleName(msg.uid, roleId) - local newRole = require("models.Role").new({ key = string_format("role:%d", roleId), id = roleId, @@ -269,38 +197,6 @@ function _M.createRpc(agent, data) return true end - -- 给角色自动加载当前副本数据 - newRole:addCarbon({carbonId = 10101, status = 0, starNum = 0}) - -- 给角色自动加载农场信息 - newRole:addFarm() - -- 给角色自动加载爬塔信息 - newRole:addTower() - -- 给角色增加pvpInfo - newRole:addPvpInfo() - --给新角色增加diner - newRole:addDiner() - -- 关闭 锁定新食灵 - local autoStatus = newRole:getProperty("autoStatus") - newRole:setProperty("autoStatus", autoStatus:setv(3,1)) - - for index, hero in ipairs(globalCsv["birthHero"]) do - hero.notNotify = true - hero.desc = "birth_award" - local heroId = newRole:awardHero(hero.type, hero) - if index == 1 then - local newHero = newRole.heros[heroId] - newHero:setProperty("lock", 1) - newHero:setProperty("formation", 1) - newRole:setProperty("crown", heroId) - newRole:setProperty("formationJson", json.encode({["1"] = {list = {["1"] = heroId}, pos = {["1"] = heroId}, lock = {}}})) - end - end - -- 出生道具 - local ucode = getActionCode(newRole) - for id, num in pairs(globalCsv["birthItem"]:toNumMap()) do - newRole:awardItemCsv(id, {count = num, desc = "birth_award", notNotify = true, ucode = ucode}) - end - -- 欢迎邮件 -- redisproxy:insertEmail({roleId = roleId, emailId = 1}) -- redisproxy:insertEmail({roleId = roleId, emailId = 2}) diff --git a/src/models/Role.lua b/src/models/Role.lua index 5abfb0e..74a0998 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -1,31 +1,66 @@ local Role = class("Role", require("shared.ModelBase")) +local RolePlugin = import(".RolePlugin") +local RoleTask = import(".RoleTask") +local RoleActivity = import(".RoleActivity") +local RoleChangeStruct = import(".RoleChangeStruct") +RolePlugin.bind(Role) +RoleTask.bind(Role) +RoleActivity.bind(Role) +RoleChangeStruct.bind(Role) + function Role:ctor( properties ) Role.super.ctor(self, properties) - - self.heros = {} self.ignoreHeartbeat = false - end Role.schema = { key = {"string"}, id = {"number"}, uid = {"string", ""}, - sid = {"number", 0}, name = {"string", ""}, + sid = {"number", 0}, + device = {"string", ""}, + banTime = {"number", 0}, + banType = {"number", 0}, + lastLoginTime = {"number", 0}, + createTime = {"number", skynet.timex()}, + structVersion = {"number", globalCsv.StructVersion or 0}, -- 重整数据 + + -- roleInfo + level = {"number", 0}, + diamond = {"number", 0}, + reDiamond = {"number", 0}, + items = {"string", ""} } Role.fields = { id = true, uid = true, sid = true, + device = true, name = true, + banTime = true, + banType = true, + lastLoginTime = true, + createTime = true, + level = true, + diamond = true, + reDiamond = true, + items = true, } + + function Role:data() return { id = self:getProperty("id"), + name = self:getProperty("name"), + level = self:getProperty("level"), + diamond = self:getProperty("diamond"), + reDiamond = self:getProperty("reDiamond"), + items = self:getProperty("items"):toNumMap(), + } end diff --git a/src/models/RoleActivity.lua b/src/models/RoleActivity.lua new file mode 100644 index 0000000..36b520b --- /dev/null +++ b/src/models/RoleActivity.lua @@ -0,0 +1,12 @@ + + +local RoleActivity = {} + +function RoleActivity.bind(Role) + + + + +end + +return RoleActivity \ No newline at end of file diff --git a/src/models/RoleChangeStruct.lua b/src/models/RoleChangeStruct.lua new file mode 100644 index 0000000..7291d99 --- /dev/null +++ b/src/models/RoleChangeStruct.lua @@ -0,0 +1,108 @@ + + +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) + +---------------------版本方法 end ---------------------- + +-- version 罗列start +local versionList = {} -- version 列表 +versionList[1] = {clearActivity, {1, 2}} +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() + globalCsv.StructVersion = 6 + local curVersion = self:getProperty("structVersion") + if not globalCsv.StructVersion or curVersion >= globalCsv.StructVersion then return end + + local jumpVersion = {} + local versionTemp = {} + for version = curVersion + 1, globalCsv.StructVersion 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, globalCsv.StructVersion 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("structVersion", globalCsv.StructVersion) + end + +end + +return RoleChangeStruct \ No newline at end of file diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua new file mode 100644 index 0000000..6601749 --- /dev/null +++ b/src/models/RolePlugin.lua @@ -0,0 +1,22 @@ + + +local RolePlugin = {} + +function RolePlugin.bind(Role) + + function Role:log() + + end + + function Role:loadAll() + + end + + function Role:reloadWhenLogin() + + end + + +end + +return RolePlugin \ No newline at end of file diff --git a/src/models/RoleTask.lua b/src/models/RoleTask.lua new file mode 100644 index 0000000..c8e7503 --- /dev/null +++ b/src/models/RoleTask.lua @@ -0,0 +1,29 @@ + + +local TaskType = { + +} + +local RoleTask = {} + +function RoleTask.bind(Role) + + Role.TaskType = TaskType + + function Role:checkTaskEnter(taskType, ...) + + end + + + function Role:checkDailyTask() + end + + function Role:checkWeekTask() + end + + function Role:checkAchievTask() + end + +end + +return RoleTask \ No newline at end of file diff --git a/src/services/agent_ctrl.lua b/src/services/agent_ctrl.lua index 44d1b21..d22e679 100644 --- a/src/services/agent_ctrl.lua +++ b/src/services/agent_ctrl.lua @@ -153,8 +153,7 @@ function _M:query_agent(fd, uid) -- self.f2u[f] 肯定存在;self.f2e[f]不存在,则说明在线,则需要踢下线 if not self.f2e[f] then local head = string.pack("H", actionCodes.Sys_kickdown) - -- local bin = MsgPack.pack({body = "该账号已登上其他机器"}) - local bin = MsgPack.pack({body = "既にこのアカウントを利用している端末があります。"}) + local bin = MsgPack.pack({body = "该账号已登上其他机器"}) if #bin > 0 then bin = xxtea.encrypt(bin, XXTEA_KEY) end socket.write(f, netpack.pack(head .. bin)) skynet.timeout(10, function () diff --git a/src/services/dbseed.lua b/src/services/dbseed.lua index b7eff0f..3a889e8 100644 --- a/src/services/dbseed.lua +++ b/src/services/dbseed.lua @@ -38,7 +38,7 @@ skynet.start(function () redisproxy = require("shared.redisproxy") - local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) + local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) == 1 if not new then print("server has been initialized...") skynet.exit() diff --git a/src/shared/ModelBase.lua b/src/shared/ModelBase.lua index f020b74..4ef9e3e 100644 --- a/src/shared/ModelBase.lua +++ b/src/shared/ModelBase.lua @@ -53,8 +53,8 @@ function ModelBase:load(properties) if not properties then properties = redisproxy:hgetall(self:getKey()) + properties = table.arrayToMap(properties) end - if not next(properties) then return false end self:setProperties(properties, true) diff --git a/src/utils/TableUtil.lua b/src/utils/TableUtil.lua new file mode 100644 index 0000000..b2fa1b6 --- /dev/null +++ b/src/utils/TableUtil.lua @@ -0,0 +1,8 @@ +function table.arrayToMap(tab) + local len = #tab + local result = {} + for i = 1, len, 2 do + result[tab[i]] = tab[i + 1] + end + return result +end \ No newline at end of file diff --git a/src/utils/init.lua b/src/utils/init.lua index ba79bdc..1d8e231 100644 --- a/src/utils/init.lua +++ b/src/utils/init.lua @@ -1,3 +1,4 @@ require("utils.CommonFunc") require("utils.StringUtil") +require("utils.TableUtil") require "utils.MathUtil" \ No newline at end of file -- libgit2 0.21.2