Commit be83d162bc6ca06281a7357740949e6494764081
1 parent
45808b0a
登陆成功。 增加数据结构修正功能
Showing
11 changed files
with
249 additions
and
139 deletions
Show diff stats
src/actions/RoleAction.lua
| ... | ... | @@ -55,11 +55,11 @@ function _M.loginRpc( agent, data ) |
| 55 | 55 | local msg = MsgPack.unpack(data) |
| 56 | 56 | local response = {} |
| 57 | 57 | |
| 58 | - if msg.version ~= globalCsv.version then | |
| 59 | - response.result = "UPDATE_TIP" | |
| 60 | - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) | |
| 61 | - return true | |
| 62 | - end | |
| 58 | + -- if msg.version ~= globalCsv.version then | |
| 59 | + -- response.result = "UPDATE_TIP" | |
| 60 | + -- SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) | |
| 61 | + -- return true | |
| 62 | + -- end | |
| 63 | 63 | |
| 64 | 64 | -- 1. |
| 65 | 65 | local roleId = redisproxy:get(string_format("user:%s", string.upper(msg.name))) |
| ... | ... | @@ -99,112 +99,42 @@ function _M.loginRpc( agent, data ) |
| 99 | 99 | role:reloadWhenLogin() |
| 100 | 100 | end |
| 101 | 101 | |
| 102 | - if not msg.isGMlogin then | |
| 103 | - local banTime = role:getProperty("banTime") | |
| 104 | - if banTime > now then | |
| 105 | - response.result = "BAN_TIP" | |
| 106 | - response.banTime = banTime | |
| 107 | - response.banType = role:getProperty("banType") | |
| 108 | - response.roleId = roleId | |
| 109 | - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) | |
| 110 | - return true | |
| 111 | - end | |
| 112 | - if banTime ~= 0 then | |
| 113 | - -- 清除封号状态 | |
| 114 | - role:setBan(0) | |
| 115 | - end | |
| 116 | - end | |
| 102 | + -- if not msg.isGMlogin then | |
| 103 | + -- local banTime = role:getProperty("banTime") | |
| 104 | + -- if banTime > now then | |
| 105 | + -- response.result = "BAN_TIP" | |
| 106 | + -- response.banTime = banTime | |
| 107 | + -- response.banType = role:getProperty("banType") | |
| 108 | + -- response.roleId = roleId | |
| 109 | + -- SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) | |
| 110 | + -- return true | |
| 111 | + -- end | |
| 112 | + -- if banTime ~= 0 then | |
| 113 | + -- -- 清除封号状态 | |
| 114 | + -- role:setBan(0) | |
| 115 | + -- end | |
| 116 | + -- end | |
| 117 | 117 | SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start") |
| 118 | 118 | local lastLoginTime = role:getProperty("lastLoginTime") |
| 119 | 119 | |
| 120 | - -- 跨天登陆事件 | |
| 121 | - if not role:onCrossDay(now) then | |
| 122 | - role:checkActivityStatus(lastLoginTime, now) | |
| 123 | - if role:getProperty("carbonDouble") == "" then | |
| 124 | - role:initCarbonDouble() | |
| 125 | - end | |
| 126 | - end | |
| 127 | - -- 登陆回复 | |
| 128 | - role:onRecoverLogin(now) | |
| 129 | - -- 引导是否连续 | |
| 130 | - role:checkGuide() | |
| 120 | + role:changeStructVersion() -- 数据结构 版本更新 | |
| 131 | 121 | |
| 122 | + -- 跨天登陆事件 | |
| 123 | + -- role:onCrossDay(now) | |
| 132 | 124 | |
| 133 | 125 | role:setProperty("lastLoginTime", now) |
| 134 | - if msg.device and type(msg.device) == "string" then | |
| 135 | - role:setProperty("device", msg.device) | |
| 136 | - end | |
| 126 | + -- if msg.device and type(msg.device) == "string" then | |
| 127 | + -- role:setProperty("device", msg.device) | |
| 128 | + -- end | |
| 137 | 129 | |
| 138 | 130 | response.role = role:data() |
| 139 | 131 | response.result = "SUCCESS" |
| 140 | 132 | response.serverTime = now |
| 141 | 133 | |
| 142 | - -- 需要加载模块数据 | |
| 143 | - local modules = { | |
| 144 | - "carbons","maps", | |
| 145 | - } | |
| 146 | - | |
| 147 | - local heroIds = {} | |
| 148 | - for heroId, _ in pairs(role.heros) do | |
| 149 | - table.insert(heroIds, heroId) | |
| 150 | - end | |
| 151 | - local heroWave = math.ceil(#heroIds / WAVE_HERO_NUMS) | |
| 152 | - | |
| 153 | - local equipIds = {} | |
| 154 | - for equipId, _ in pairs(role.equips) do | |
| 155 | - table.insert(equipIds, equipId) | |
| 156 | - end | |
| 157 | - local equipWave = math.ceil(#equipIds / WAVE_EQUIP_NUMS) | |
| 158 | - | |
| 159 | - if #heroIds <= 50 then | |
| 160 | - heroWave = 0 | |
| 161 | - table_insert(modules, "heros") | |
| 162 | - end | |
| 163 | - if #equipIds <= 50 then | |
| 164 | - equipWave = 0 | |
| 165 | - table_insert(modules, "equips") | |
| 166 | - end | |
| 167 | - | |
| 168 | - for _, name in ipairs(modules) do | |
| 169 | - response[name] = {} | |
| 170 | - for id, unit in pairs(role[name]) do | |
| 171 | - response[name][id] = unit:data() | |
| 172 | - end | |
| 173 | - end | |
| 174 | - response.wave = 1 + heroWave + equipWave | |
| 134 | + response.wave = 1 | |
| 175 | 135 | |
| 176 | 136 | SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) |
| 177 | 137 | |
| 178 | - local heroIndex = 1 | |
| 179 | - for index = 2, 1 + heroWave do | |
| 180 | - local heroResponse = {heros = {}} | |
| 181 | - for i = heroIndex, heroIndex + WAVE_HERO_NUMS do | |
| 182 | - local heroId = heroIds[i] | |
| 183 | - if not heroId then | |
| 184 | - break | |
| 185 | - end | |
| 186 | - local hero = role.heros[heroId] | |
| 187 | - table_insert(heroResponse.heros, hero:data()) | |
| 188 | - heroIndex = heroIndex + 1 | |
| 189 | - end | |
| 190 | - heroResponse.heroWave = index | |
| 191 | - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(heroResponse)) | |
| 192 | - end | |
| 193 | - local equipIndex = 1 | |
| 194 | - for index = 2 + heroWave, 1 + heroWave + equipWave do | |
| 195 | - local equipResponse = {equips = {}} | |
| 196 | - for i = equipIndex, equipIndex + WAVE_EQUIP_NUMS do | |
| 197 | - local equipId = equipIds[i] | |
| 198 | - if not equipId then | |
| 199 | - break | |
| 200 | - end | |
| 201 | - local equip = role.equips[equipId] | |
| 202 | - table_insert(equipResponse.equips, equip:data()) | |
| 203 | - equipIndex = equipIndex + 1 | |
| 204 | - end | |
| 205 | - equipResponse.equipWave = index | |
| 206 | - SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(equipResponse)) | |
| 207 | - end | |
| 208 | 138 | |
| 209 | 139 | -- role:log("login", { ip = agent.ip, diamond = role:getProperty("diamond"), reDiamond = role:getProperty("reDiamond")}) |
| 210 | 140 | |
| ... | ... | @@ -214,7 +144,6 @@ function _M.loginRpc( agent, data ) |
| 214 | 144 | gate_serv = agent.gate_serv, |
| 215 | 145 | }) |
| 216 | 146 | agent.role = role |
| 217 | - role.lessmsg = false | |
| 218 | 147 | |
| 219 | 148 | start_agent_timer() |
| 220 | 149 | -- 注册全服广播 |
| ... | ... | @@ -247,7 +176,6 @@ function _M.createRpc(agent, data) |
| 247 | 176 | return true |
| 248 | 177 | end |
| 249 | 178 | local roleName = setRoleName(msg.uid, roleId) |
| 250 | - | |
| 251 | 179 | local newRole = require("models.Role").new({ |
| 252 | 180 | key = string_format("role:%d", roleId), |
| 253 | 181 | id = roleId, |
| ... | ... | @@ -269,38 +197,6 @@ function _M.createRpc(agent, data) |
| 269 | 197 | return true |
| 270 | 198 | end |
| 271 | 199 | |
| 272 | - -- 给角色自动加载当前副本数据 | |
| 273 | - newRole:addCarbon({carbonId = 10101, status = 0, starNum = 0}) | |
| 274 | - -- 给角色自动加载农场信息 | |
| 275 | - newRole:addFarm() | |
| 276 | - -- 给角色自动加载爬塔信息 | |
| 277 | - newRole:addTower() | |
| 278 | - -- 给角色增加pvpInfo | |
| 279 | - newRole:addPvpInfo() | |
| 280 | - --给新角色增加diner | |
| 281 | - newRole:addDiner() | |
| 282 | - -- 关闭 锁定新食灵 | |
| 283 | - local autoStatus = newRole:getProperty("autoStatus") | |
| 284 | - newRole:setProperty("autoStatus", autoStatus:setv(3,1)) | |
| 285 | - | |
| 286 | - for index, hero in ipairs(globalCsv["birthHero"]) do | |
| 287 | - hero.notNotify = true | |
| 288 | - hero.desc = "birth_award" | |
| 289 | - local heroId = newRole:awardHero(hero.type, hero) | |
| 290 | - if index == 1 then | |
| 291 | - local newHero = newRole.heros[heroId] | |
| 292 | - newHero:setProperty("lock", 1) | |
| 293 | - newHero:setProperty("formation", 1) | |
| 294 | - newRole:setProperty("crown", heroId) | |
| 295 | - newRole:setProperty("formationJson", json.encode({["1"] = {list = {["1"] = heroId}, pos = {["1"] = heroId}, lock = {}}})) | |
| 296 | - end | |
| 297 | - end | |
| 298 | - -- 出生道具 | |
| 299 | - local ucode = getActionCode(newRole) | |
| 300 | - for id, num in pairs(globalCsv["birthItem"]:toNumMap()) do | |
| 301 | - newRole:awardItemCsv(id, {count = num, desc = "birth_award", notNotify = true, ucode = ucode}) | |
| 302 | - end | |
| 303 | - | |
| 304 | 200 | -- 欢迎邮件 |
| 305 | 201 | -- redisproxy:insertEmail({roleId = roleId, emailId = 1}) |
| 306 | 202 | -- redisproxy:insertEmail({roleId = roleId, emailId = 2}) | ... | ... |
src/models/Role.lua
| 1 | 1 | local Role = class("Role", require("shared.ModelBase")) |
| 2 | 2 | |
| 3 | +local RolePlugin = import(".RolePlugin") | |
| 4 | +local RoleTask = import(".RoleTask") | |
| 5 | +local RoleActivity = import(".RoleActivity") | |
| 6 | +local RoleChangeStruct = import(".RoleChangeStruct") | |
| 7 | +RolePlugin.bind(Role) | |
| 8 | +RoleTask.bind(Role) | |
| 9 | +RoleActivity.bind(Role) | |
| 10 | +RoleChangeStruct.bind(Role) | |
| 11 | + | |
| 3 | 12 | function Role:ctor( properties ) |
| 4 | 13 | Role.super.ctor(self, properties) |
| 5 | - | |
| 6 | - self.heros = {} | |
| 7 | 14 | self.ignoreHeartbeat = false |
| 8 | - | |
| 9 | 15 | end |
| 10 | 16 | |
| 11 | 17 | Role.schema = { |
| 12 | 18 | key = {"string"}, |
| 13 | 19 | id = {"number"}, |
| 14 | 20 | uid = {"string", ""}, |
| 15 | - sid = {"number", 0}, | |
| 16 | 21 | name = {"string", ""}, |
| 22 | + sid = {"number", 0}, | |
| 23 | + device = {"string", ""}, | |
| 24 | + banTime = {"number", 0}, | |
| 25 | + banType = {"number", 0}, | |
| 26 | + lastLoginTime = {"number", 0}, | |
| 27 | + createTime = {"number", skynet.timex()}, | |
| 28 | + structVersion = {"number", globalCsv.StructVersion or 0}, -- 重整数据 | |
| 29 | + | |
| 30 | + -- roleInfo | |
| 31 | + level = {"number", 0}, | |
| 32 | + diamond = {"number", 0}, | |
| 33 | + reDiamond = {"number", 0}, | |
| 34 | + items = {"string", ""} | |
| 17 | 35 | } |
| 18 | 36 | |
| 19 | 37 | Role.fields = { |
| 20 | 38 | id = true, |
| 21 | 39 | uid = true, |
| 22 | 40 | sid = true, |
| 41 | + device = true, | |
| 23 | 42 | name = true, |
| 43 | + banTime = true, | |
| 44 | + banType = true, | |
| 45 | + lastLoginTime = true, | |
| 46 | + createTime = true, | |
| 47 | + level = true, | |
| 48 | + diamond = true, | |
| 49 | + reDiamond = true, | |
| 50 | + items = true, | |
| 24 | 51 | } |
| 25 | 52 | |
| 53 | + | |
| 54 | + | |
| 26 | 55 | function Role:data() |
| 27 | 56 | return { |
| 28 | 57 | id = self:getProperty("id"), |
| 58 | + name = self:getProperty("name"), | |
| 59 | + level = self:getProperty("level"), | |
| 60 | + diamond = self:getProperty("diamond"), | |
| 61 | + reDiamond = self:getProperty("reDiamond"), | |
| 62 | + items = self:getProperty("items"):toNumMap(), | |
| 63 | + | |
| 29 | 64 | } |
| 30 | 65 | end |
| 31 | 66 | ... | ... |
| ... | ... | @@ -0,0 +1,108 @@ |
| 1 | + | |
| 2 | + | |
| 3 | +local VersionType = { | |
| 4 | + --不可复用 | |
| 5 | + DoOnly = 1, -- 严格执行 数据结构变更等 | |
| 6 | + -- 复用类型 | |
| 7 | + Add = 2, -- 可叠加执行 活动清除状态等 params需是数组 | |
| 8 | + Override = 3, -- 覆盖执行 只执行最后一个同方法变更 取最后一个的 params | |
| 9 | +} | |
| 10 | + | |
| 11 | +---------------------版本方法 start --------------------- | |
| 12 | +local function createVersionFunc(vType, func) | |
| 13 | + local v = {vType = vType} | |
| 14 | + setmetatable(v, {__call = function(cv, ...) | |
| 15 | + func( ... ) | |
| 16 | + end}) | |
| 17 | + return v | |
| 18 | +end | |
| 19 | + | |
| 20 | +-- 例子 | |
| 21 | +local clearActivity = createVersionFunc(VersionType.Add ,function(role, params) | |
| 22 | + print("clearActivity") | |
| 23 | + dump(params) | |
| 24 | +end) | |
| 25 | + | |
| 26 | +local changeStructF = createVersionFunc(VersionType.DoOnly ,function(role, params) | |
| 27 | + print("changeStructF" .. " >>> " .. params) | |
| 28 | +end) | |
| 29 | + | |
| 30 | +local awardGift = createVersionFunc(VersionType.Override ,function(role, params) | |
| 31 | + print("awardGift" .. " >>> " .. params) | |
| 32 | +end) | |
| 33 | + | |
| 34 | +---------------------版本方法 end ---------------------- | |
| 35 | + | |
| 36 | +-- version 罗列start | |
| 37 | +local versionList = {} -- version 列表 | |
| 38 | +versionList[1] = {clearActivity, {1, 2}} | |
| 39 | +versionList[2] = {clearActivity, {5, 7}} | |
| 40 | +versionList[3] = {changeStructF, "test1"} | |
| 41 | +versionList[4] = {changeStructF, "test2"} | |
| 42 | +versionList[5] = {awardGift, "test3"} | |
| 43 | +versionList[6] = {awardGift, "test4"} | |
| 44 | + | |
| 45 | +--version 罗列end | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | +local RoleChangeStruct = {} | |
| 50 | +-- 处理历史遗留问题 以及数据不兼容的问题。可用于版本间清除活动状态,发放补偿, 修改数据结构等 | |
| 51 | +function RoleChangeStruct.bind(Role) | |
| 52 | + | |
| 53 | + function Role:changeStructVersion() | |
| 54 | + globalCsv.StructVersion = 6 | |
| 55 | + local curVersion = self:getProperty("structVersion") | |
| 56 | + if not globalCsv.StructVersion or curVersion >= globalCsv.StructVersion then return end | |
| 57 | + | |
| 58 | + local jumpVersion = {} | |
| 59 | + local versionTemp = {} | |
| 60 | + for version = curVersion + 1, globalCsv.StructVersion do | |
| 61 | + local versionData = versionList[version] | |
| 62 | + if versionData then | |
| 63 | + if versionData[1].vType == VersionType.DoOnly then | |
| 64 | + elseif versionData[1].vType == VersionType.Add then | |
| 65 | + if versionTemp[versionData[1]] then | |
| 66 | + jumpVersion[versionTemp[versionData[1]].version] = true | |
| 67 | + versionTemp[versionData[1]].version = version | |
| 68 | + for _, param in ipairs(versionData[2] or {}) do | |
| 69 | + table.insert(versionTemp[versionData[1]].params, param) | |
| 70 | + end | |
| 71 | + else | |
| 72 | + local params = {} | |
| 73 | + for _, param in ipairs(versionData[2] or {}) do | |
| 74 | + table.insert(params, param) | |
| 75 | + end | |
| 76 | + versionTemp[versionData[1]] = {version = version, params = params} | |
| 77 | + end | |
| 78 | + elseif versionData[1].vType == VersionType.Override then | |
| 79 | + if versionTemp[versionData[1]] then | |
| 80 | + jumpVersion[versionTemp[versionData[1]].version] = true | |
| 81 | + versionTemp[versionData[1]].version = version | |
| 82 | + else | |
| 83 | + versionTemp[versionData[1]] = {version = version} | |
| 84 | + end | |
| 85 | + else | |
| 86 | + print(">>>>>>> error changeStruct error version Type >>>>> " .. version) | |
| 87 | + end | |
| 88 | + else | |
| 89 | + jumpVersion[version] = true | |
| 90 | + end | |
| 91 | + end | |
| 92 | + | |
| 93 | + for version = curVersion + 1, globalCsv.StructVersion do | |
| 94 | + if not jumpVersion[version] then | |
| 95 | + local versionData = versionList[version] | |
| 96 | + if versionData[1].vType == VersionType.DoOnly or versionData[1].vType == VersionType.Override then | |
| 97 | + versionData[1](self, versionData[2]) | |
| 98 | + elseif versionData[1].vType == VersionType.Add then | |
| 99 | + versionData[1](self, versionTemp[versionData[1]].params) | |
| 100 | + end | |
| 101 | + end | |
| 102 | + end | |
| 103 | + -- self:setProperty("structVersion", globalCsv.StructVersion) | |
| 104 | + end | |
| 105 | + | |
| 106 | +end | |
| 107 | + | |
| 108 | +return RoleChangeStruct | |
| 0 | 109 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,22 @@ |
| 1 | + | |
| 2 | + | |
| 3 | +local RolePlugin = {} | |
| 4 | + | |
| 5 | +function RolePlugin.bind(Role) | |
| 6 | + | |
| 7 | + function Role:log() | |
| 8 | + | |
| 9 | + end | |
| 10 | + | |
| 11 | + function Role:loadAll() | |
| 12 | + | |
| 13 | + end | |
| 14 | + | |
| 15 | + function Role:reloadWhenLogin() | |
| 16 | + | |
| 17 | + end | |
| 18 | + | |
| 19 | + | |
| 20 | +end | |
| 21 | + | |
| 22 | +return RolePlugin | |
| 0 | 23 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | + | |
| 2 | + | |
| 3 | +local TaskType = { | |
| 4 | + | |
| 5 | +} | |
| 6 | + | |
| 7 | +local RoleTask = {} | |
| 8 | + | |
| 9 | +function RoleTask.bind(Role) | |
| 10 | + | |
| 11 | + Role.TaskType = TaskType | |
| 12 | + | |
| 13 | + function Role:checkTaskEnter(taskType, ...) | |
| 14 | + | |
| 15 | + end | |
| 16 | + | |
| 17 | + | |
| 18 | + function Role:checkDailyTask() | |
| 19 | + end | |
| 20 | + | |
| 21 | + function Role:checkWeekTask() | |
| 22 | + end | |
| 23 | + | |
| 24 | + function Role:checkAchievTask() | |
| 25 | + end | |
| 26 | + | |
| 27 | +end | |
| 28 | + | |
| 29 | +return RoleTask | |
| 0 | 30 | \ No newline at end of file | ... | ... |
src/services/agent_ctrl.lua
| ... | ... | @@ -153,8 +153,7 @@ function _M:query_agent(fd, uid) |
| 153 | 153 | -- self.f2u[f] 肯定存在;self.f2e[f]不存在,则说明在线,则需要踢下线 |
| 154 | 154 | if not self.f2e[f] then |
| 155 | 155 | local head = string.pack("H", actionCodes.Sys_kickdown) |
| 156 | - -- local bin = MsgPack.pack({body = "该账号已登上其他机器"}) | |
| 157 | - local bin = MsgPack.pack({body = "既にこのアカウントを利用している端末があります。"}) | |
| 156 | + local bin = MsgPack.pack({body = "该账号已登上其他机器"}) | |
| 158 | 157 | if #bin > 0 then bin = xxtea.encrypt(bin, XXTEA_KEY) end |
| 159 | 158 | socket.write(f, netpack.pack(head .. bin)) |
| 160 | 159 | skynet.timeout(10, function () | ... | ... |
src/services/dbseed.lua
| ... | ... | @@ -38,7 +38,7 @@ skynet.start(function () |
| 38 | 38 | |
| 39 | 39 | redisproxy = require("shared.redisproxy") |
| 40 | 40 | |
| 41 | - local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) | |
| 41 | + local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) == 1 | |
| 42 | 42 | if not new then |
| 43 | 43 | print("server has been initialized...") |
| 44 | 44 | skynet.exit() | ... | ... |
src/shared/ModelBase.lua
| ... | ... | @@ -53,8 +53,8 @@ function ModelBase:load(properties) |
| 53 | 53 | |
| 54 | 54 | if not properties then |
| 55 | 55 | properties = redisproxy:hgetall(self:getKey()) |
| 56 | + properties = table.arrayToMap(properties) | |
| 56 | 57 | end |
| 57 | - | |
| 58 | 58 | if not next(properties) then return false end |
| 59 | 59 | |
| 60 | 60 | self:setProperties(properties, true) | ... | ... |