Commit be83d162bc6ca06281a7357740949e6494764081

Authored by zhouahaihai
1 parent 45808b0a

登陆成功。 增加数据结构修正功能

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  
... ...
src/models/RoleActivity.lua 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +
  2 +
  3 +local RoleActivity = {}
  4 +
  5 +function RoleActivity.bind(Role)
  6 +
  7 +
  8 +
  9 +
  10 +end
  11 +
  12 +return RoleActivity
0 13 \ No newline at end of file
... ...
src/models/RoleChangeStruct.lua 0 → 100644
... ... @@ -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
... ...
src/models/RolePlugin.lua 0 → 100644
... ... @@ -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
... ...
src/models/RoleTask.lua 0 → 100644
... ... @@ -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)
... ...
src/utils/TableUtil.lua 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +function table.arrayToMap(tab)
  2 + local len = #tab
  3 + local result = {}
  4 + for i = 1, len, 2 do
  5 + result[tab[i]] = tab[i + 1]
  6 + end
  7 + return result
  8 +end
0 9 \ No newline at end of file
... ...
src/utils/init.lua
1 1 require("utils.CommonFunc")
2 2 require("utils.StringUtil")
  3 +require("utils.TableUtil")
3 4 require "utils.MathUtil"
4 5 \ No newline at end of file
... ...