Commit 0a07bdd981c3ccb5305c53746d63f284ca5ac78b
1 parent
6871f4f6
角色升级 。gm
Showing
10 changed files
with
336 additions
and
298 deletions
Show diff stats
src/ProtocolCode.lua
... | ... | @@ -15,235 +15,14 @@ actionCodes = { |
15 | 15 | Role_queryLoginRpc = 101, |
16 | 16 | Role_createRpc = 102, |
17 | 17 | Role_loginRpc = 103, |
18 | + Role_syncTimeRpc = 104, | |
18 | 19 | Role_updateProperty = 105, |
19 | 20 | Role_updateProperties = 106, |
20 | - Role_changeFormationRpc = 107, | |
21 | - Role_setCrownRpc = 108, | |
22 | - Role_formationPosRpc = 109, | |
23 | - Role_entrustRpc = 110, | |
24 | - Role_finishEntrustRpc = 111, | |
25 | - Role_updateStoryBook = 112, | |
26 | - Role_finishTalkRpc = 113, | |
27 | - Role_updateHeroBook = 114, | |
28 | - Role_guideRpc = 115, | |
29 | - Role_changeAutoSateRpc = 116, | |
30 | - Role_signRpc = 117, | |
31 | - Role_dailyTaskRpc = 118, | |
32 | - Role_mainTaskRpc = 119, | |
33 | - Role_missionRpc = 120, | |
34 | - Role_formationQuickRpc = 121, | |
35 | - Role_changeNameRpc = 122, | |
36 | - Role_changeHomeBgRpc = 123, | |
37 | - Role_changeHeadIconRpc = 124, | |
38 | - Role_changeHeadFrameRpc = 125, | |
39 | - Role_cookNotesRpc = 126, | |
40 | - Role_cookAddFavoritesRpc = 127, | |
41 | - Role_cookDelFavoritesRpc = 128, | |
42 | - Role_drawCodeRpc = 129, | |
43 | - Role_chat = 130, | |
44 | - Role_signGiftRpc = 131, | |
45 | - Role_changeToRealUserRpc = 132, | |
46 | - Role_cafeSignRpc = 133, | |
47 | - Role_syncTimeRpc = 134, | |
48 | - Role_getLevelRankRpc = 135, | |
49 | - Role_deletAccountRpc = 136, | |
50 | - Role_getItemRankRpc = 137, | |
51 | 21 | |
52 | 22 | Hero_loadInfos = 201, |
53 | 23 | Hero_updateProperty = 202, |
54 | - Hero_decomposeRpc = 203, | |
55 | - Hero_qualityRpc = 204, | |
56 | - Hero_strengthRpc = 205, | |
57 | - Hero_lockRpc = 206, | |
58 | - Hero_researchRpc = 207, | |
59 | - Hero_finishResearchRpc = 208, | |
60 | - Hero_treatRpc = 209, | |
61 | - Hero_finishTreatRpc = 210, | |
62 | - Hero_loveItemRpc = 211, | |
63 | - Hero_finishLoveTaskRpc = 212, | |
64 | - Hero_changeDressRpc = 213, | |
65 | - Hero_quickTreatRpc = 214, | |
66 | - Hero_skillUpRpc = 215, | |
67 | - Hero_changeNameRpc = 216, | |
68 | - Hero_likeHeroRpc = 217, | |
69 | - Hero_commentHeroRpc = 218, | |
70 | - Hero_getCommentsRpc = 219, | |
71 | - Hero_likeCommentRpc = 220, | |
24 | + Hero_levelUpRpc = 203, | |
72 | 25 | |
73 | - | |
74 | - | |
75 | - Item_updateProperty = 301, | |
76 | - | |
77 | - Store_produceRpc = 401, | |
78 | - Store_finishBuildRpc = 402, | |
79 | - Store_diamondBuyRpc = 403, | |
80 | - Store_itemBuyRpc = 404, | |
81 | - Store_rechargeRpc = 405, | |
82 | - Store_ayncPurchaseRpc = 406, | |
83 | - Store_purchaseOrderResult = 407, | |
84 | - Store_iapPurchaseRpc = 408, | |
85 | - Store_iapCancelPurchase = 409, | |
86 | - Store_restorePurchaseRpc = 410, | |
87 | - Store_googlePurchaseRpc = 411, | |
88 | - Store_googleCancelPurchase = 412, | |
89 | - Store_samsungPurchaseRpc = 413, | |
90 | - Store_samsungCancelPurchase = 414, | |
91 | - | |
92 | - Trade_getInfoRpc = 450, | |
93 | - Trade_sellRpc = 451, | |
94 | - Trade_buyRpc = 452, | |
95 | - Trade_giveUpRpc = 453, | |
96 | - Trade_cleanBuyRpc = 454, | |
97 | - | |
98 | - Carbon_arrangeCarbonRpc = 500, | |
99 | - Carbon_moveRpc = 501, | |
100 | - Carbon_actionEndRpc = 502, | |
101 | - Carbon_beginGameRpc = 503, | |
102 | - Carbon_endGameRpc = 504, | |
103 | - Carbon_cancelMoveRpc = 505, | |
104 | - Carbon_updateProperty = 506, | |
105 | - Carbon_endCarbonRpc = 507, | |
106 | - Carbon_exitTeamRpc = 508, | |
107 | - Carbon_supplyRpc = 509, | |
108 | - Map_updateProperty = 510, | |
109 | - Carbon_changePosRpc = 511, | |
110 | - Carbon_generateBoss = 512, | |
111 | - Carbon_givpUpBoss = 513, | |
112 | - Carbon_drawBossAward = 514, | |
113 | - Carbon_SelectRpc = 515, | |
114 | - | |
115 | - Friend_updateProperty = 550, | |
116 | - Friend_listRpc = 551, | |
117 | - Friend_searchRpc = 552, | |
118 | - Friend_randomRpc = 553, | |
119 | - Friend_deleteRpc = 554, | |
120 | - Friend_applyRpc = 555, | |
121 | - Friend_applyListRpc = 556, | |
122 | - Friend_handleApplyRpc = 557, | |
123 | - Friend_report = 558, | |
124 | - | |
125 | - Farm_updateProperty = 600, | |
126 | - Farm_drawMaterial = 601, | |
127 | - Farm_levelUpBuilding = 602, | |
128 | - Farm_changeShowMedal = 603, | |
129 | - Farm_plantRpc = 604, | |
130 | - Farm_useItemRpc = 605, | |
131 | - Farm_getPlantRpc = 606, | |
132 | - Farm_farmInfoRpc = 607, | |
133 | - Farm_changeFarmerRpc = 608, | |
134 | - | |
135 | - Tower_updateProperty = 630, | |
136 | - Tower_battleBeginRpc = 631, | |
137 | - Tower_battleEndRpc = 632, | |
138 | - Tower_resetRpc = 633, | |
139 | - Tower_cureRpc = 634, | |
140 | - Tower_changeFormatRpc = 635, | |
141 | - Tower_getRankRpc = 636, | |
142 | - Tower_formatQuickRpc = 637, | |
143 | - Tower_formationPosRpc = 638, | |
144 | - Tower_breakRpc = 639, | |
145 | - | |
146 | - Email_listRpc = 650, | |
147 | - Email_drawAttachRpc = 651, | |
148 | - Email_checkRpc = 652, | |
149 | - Email_delRpc = 653, | |
150 | - Email_drawAllAttachRpc = 654, | |
151 | - | |
152 | - Pvp_updateProperty = 670, | |
153 | - Pvp_battleBeginRpc = 671, | |
154 | - Pvp_battleEndRpc = 672, | |
155 | - Pvp_resetRpc = 673, | |
156 | - Pvp_enterPvpRpc = 674, | |
157 | - Pvp_getRankRpc = 675, | |
158 | - Pvp_changeFormatRpc = 676, | |
159 | - Pvp_formatQuickRpc = 677, | |
160 | - Pvp_formationPosRpc = 678, | |
161 | - Pvp_skillOrderRpc = 679, | |
162 | - Pvp_shopBuyRpc = 680, | |
163 | - | |
164 | - Equip_updateProperty = 750, | |
165 | - Equip_wearEquipRpc = 751, | |
166 | - Equip_repairEquipRpc = 752, | |
167 | - Equip_forgeEquipAttrsRpc = 753, | |
168 | - Equip_replaceEquipAttrRpc = 754, | |
169 | - Equip_buildEquipRpc = 755, | |
170 | - Equip_finishBuildEquipRpc = 756, | |
171 | - Equip_decomposEquipRpc = 757, | |
172 | - Equip_resetEquipRpc = 758, | |
173 | - Equip_upEquipRpc = 759, | |
174 | - | |
175 | - Activity_getRewardRpc = 801, | |
176 | - Activity_lotteryGiftRpc = 802, | |
177 | - Activity_shopBuyRpc = 803, | |
178 | - Activity_puzzleRewardRpc = 804, | |
179 | - Activity_inheritRewardRpc = 805, | |
180 | - Activity_midAutRewardRpc = 806, | |
181 | - Activity_clearRed = 807, | |
182 | - Activity_halloweenMoveRpc = 808, | |
183 | - Activity_halloweenResetRpc = 809, | |
184 | - Activity_halloweenRewardRpc = 810, | |
185 | - Activity_traditionalRewardRpc = 811, | |
186 | - Activity_africanRpc = 812, | |
187 | - Activity_oldBackRpc = 813, | |
188 | - Activity_orderRewardRpc = 814, | |
189 | - Activity_cookHeroRpc = 815, | |
190 | - | |
191 | - Moon_arrangeCarbonRpc = 850, | |
192 | - Moon_moveRpc = 851, | |
193 | - Moon_actionEndRpc = 852, | |
194 | - Moon_beginGameRpc = 853, | |
195 | - Moon_endGameRpc = 854, | |
196 | - Moon_cancelMoveRpc = 855, | |
197 | - Moon_updateProperty = 856, | |
198 | - Moon_endCarbonRpc = 857, | |
199 | - Moon_exitTeamRpc = 858, | |
200 | - Moon_supplyRpc = 859, | |
201 | - Moon_changePosRpc = 860, | |
202 | - Moon_generateBoss = 861, | |
203 | - Moon_givpUpBoss = 862, | |
204 | - Moon_drawBossAward = 863, | |
205 | - Moon_SelectRpc = 864, | |
206 | - | |
207 | - Paradise_arrangeCarbonRpc = 875, | |
208 | - Paradise_moveRpc = 876, | |
209 | - Paradise_actionEndRpc = 877, | |
210 | - Paradise_beginGameRpc = 878, | |
211 | - Paradise_endGameRpc = 879, | |
212 | - Paradise_cancelMoveRpc = 880, | |
213 | - Paradise_updateProperty = 881, | |
214 | - Paradise_endCarbonRpc = 882, | |
215 | - Paradise_exitTeamRpc = 883, | |
216 | - Paradise_supplyRpc = 884, | |
217 | - Paradise_changePosRpc = 885, | |
218 | - Paradise_SelectRpc = 886, | |
219 | - Paradise_buyCountRpc = 887, | |
220 | - | |
221 | - Diner_loadRpc = 900, | |
222 | - Diner_updateProperty = 901, | |
223 | - Diner_updateProperties = 902, | |
224 | - Diner_accessoryUpdateProperty = 903, | |
225 | - Diner_itemUpdateProperty = 904, | |
226 | - Diner_wearAccessoryRpc = 905, | |
227 | - Diner_upLevelAccessoryRpc = 906, | |
228 | - Diner_supplyMaterialRpc = 907, | |
229 | - Diner_changeCarRpc = 908, | |
230 | - Diner_recycleAccessoryRpc = 909, | |
231 | - Diner_heroToBoxRpc = 910, | |
232 | - Diner_saveBoxFitmentRpc = 911, | |
233 | - Diner_recycleFitmentsRpc = 912, | |
234 | - Diner_sellRpc = 913, | |
235 | - Diner_finishSellRpc = 914, | |
236 | - Diner_shopBuyRpc = 915, | |
237 | - Diner_drawRewardRpc = 916, | |
238 | - Diner_talentUpdateProperty = 917, | |
239 | - | |
240 | - Diner_likeOtherBoxRpc = 918, | |
241 | - Diner_comfortRankRpc = 919, | |
242 | - Diner_nearLikeMeRpc = 920, | |
243 | - Diner_friendListRpc = 921, | |
244 | - Diner_getBoxDataRpc = 922, | |
245 | - Diner_changeTalkRpc = 923, | |
246 | - Diner_changeTalkBgRpc = 924, | |
247 | 26 | } |
248 | 27 | |
249 | 28 | rpcResponseBegin = 10000 | ... | ... |
src/RedisKeys.lua
1 | --- role | |
2 | -R_FARM_KEY = "role:%d:farm" | |
3 | -R_TOWER_KEY = "role:%d:tower" | |
4 | -R_COOKLOG_KEY = "role:%d:cooklog" | |
5 | -R_TRADELOG_KEY = "role:%d:tradelog" | |
6 | -R_PVP_KEY = "role:%d:pvp" | |
7 | -R_DINER_KEY = "role:%d:diner" | |
8 | --- rank | |
9 | -RANK_PVP = "rank:pvp" | |
10 | -RANK_TRADE = "rank:trade" | |
11 | -RANK_TOWER = "rank:tower" | |
12 | -RANK_BOX = "rank:box" -- 盒子舒适度排行榜 | |
13 | -MAP_LIKE = "map:box:like" --点赞个数 | |
14 | -RANK_LEVEL = "rank:level" --等级排名 | |
15 | -RANK_ITEM = "rank:item" --活动物品排行 | |
16 | --- 日志 | |
17 | -NOTE_COOK_KEY = "note:cook:%d" | |
18 | - | |
19 | -TRADE_KEY = "trade:%d" | |
20 | -TRADE_ID_KEY = "tradeIDs" | |
21 | - | |
22 | -TASK_ACTIVE = "task:%d:active" -- 记录激活的任务 | |
23 | -TASK_FINISH = "task:%d:finish" -- 记录完成的任务 | |
24 | - | |
25 | -BOSS_SET = "boss:%d:%d" | |
26 | -BOSS_INFO = "boss:battle" | |
27 | - | |
28 | -FRIEND_KEY = "role:%d:friend" --哈希表 | |
29 | -FRIEND_APPLY_KEY = "role:%d:apply" -- set | |
30 | -FRIEND_DINER_LIKE_KEY = "role:%d:diner:like" -- list | |
31 | - | |
32 | -UNION_SET = "global:union" | |
33 | -UNION_KEY = "union:%d" | |
34 | -UNION_ROLE = "union:%d:%d" | |
35 | -UNION_ROLE_SET = "union:%d:roleList" | |
36 | -UNION_APPLY_SET = "union:%d:applyList" | |
37 | - | |
38 | -PVP_KING = "pvp:king" --王者传奇组 | |
39 | -PVP_HONOR = "pvp:honor" --荣耀咸鱼组 | |
40 | -PVP_NOOB = "pvp:noob" --菜鸟组 | |
41 | -PVP_INFO = "pvp:info" --玩家信息组 | |
42 | 1 | \ No newline at end of file |
2 | + | |
3 | + | |
4 | +R_INCR = "role:%d:autoincr" | |
5 | +R_HEROS = "role:%d:heroIds" | |
6 | +R_HERO = "hero:%d:%d" | |
7 | + | |
8 | +-- -- role | |
9 | +-- R_FARM_KEY = "role:%d:farm" | |
10 | +-- R_TOWER_KEY = "role:%d:tower" | |
11 | +-- R_COOKLOG_KEY = "role:%d:cooklog" | |
12 | +-- R_TRADELOG_KEY = "role:%d:tradelog" | |
13 | +-- R_PVP_KEY = "role:%d:pvp" | |
14 | +-- R_DINER_KEY = "role:%d:diner" | |
15 | +-- -- rank | |
16 | +-- RANK_PVP = "rank:pvp" | |
17 | +-- RANK_TRADE = "rank:trade" | |
18 | +-- RANK_TOWER = "rank:tower" | |
19 | +-- RANK_BOX = "rank:box" -- 盒子舒适度排行榜 | |
20 | +-- MAP_LIKE = "map:box:like" --点赞个数 | |
21 | +-- RANK_LEVEL = "rank:level" --等级排名 | |
22 | +-- RANK_ITEM = "rank:item" --活动物品排行 | |
23 | +-- -- 日志 | |
24 | +-- NOTE_COOK_KEY = "note:cook:%d" | |
25 | + | |
26 | +-- TRADE_KEY = "trade:%d" | |
27 | +-- TRADE_ID_KEY = "tradeIDs" | |
28 | + | |
29 | +-- TASK_ACTIVE = "task:%d:active" -- 记录激活的任务 | |
30 | +-- TASK_FINISH = "task:%d:finish" -- 记录完成的任务 | |
31 | + | |
32 | +-- BOSS_SET = "boss:%d:%d" | |
33 | +-- BOSS_INFO = "boss:battle" | |
34 | + | |
35 | +-- FRIEND_KEY = "role:%d:friend" --哈希表 | |
36 | +-- FRIEND_APPLY_KEY = "role:%d:apply" -- set | |
37 | +-- FRIEND_DINER_LIKE_KEY = "role:%d:diner:like" -- list | |
38 | + | |
39 | +-- UNION_SET = "global:union" | |
40 | +-- UNION_KEY = "union:%d" | |
41 | +-- UNION_ROLE = "union:%d:%d" | |
42 | +-- UNION_ROLE_SET = "union:%d:roleList" | |
43 | +-- UNION_APPLY_SET = "union:%d:applyList" | |
44 | + | |
45 | +-- PVP_KING = "pvp:king" --王者传奇组 | |
46 | +-- PVP_HONOR = "pvp:honor" --荣耀咸鱼组 | |
47 | +-- PVP_NOOB = "pvp:noob" --菜鸟组 | |
48 | +-- PVP_INFO = "pvp:info" --玩家信息组 | |
43 | 49 | \ No newline at end of file | ... | ... |
src/actions/GmAction.lua
... | ... | @@ -0,0 +1,31 @@ |
1 | +local ipairs = ipairs | |
2 | +local table = table | |
3 | +local math = math | |
4 | +local next = next | |
5 | +local string = string | |
6 | +local redisproxy = redisproxy | |
7 | +local MsgPack = MsgPack | |
8 | +local getRandomName = getRandomName | |
9 | +local mcast_util = mcast_util | |
10 | +local string_format = string.format | |
11 | +local tonumber = tonumber | |
12 | +local require = require | |
13 | +local table_insert = table.insert | |
14 | +local tconcat = table.concat | |
15 | + | |
16 | +local _M = {} | |
17 | +function _M.levelUpRpc( agent, data ) | |
18 | + local role = agent.role | |
19 | + local msg = MsgPack.unpack(data) | |
20 | + local hero = role.heros[msg.id] | |
21 | + if not hero then return end | |
22 | + | |
23 | + if hero:getProperty("level") >= hero:getMaxLevel() then return end | |
24 | + hero:updateProperty({field = "level", delta = 1}) | |
25 | + | |
26 | + SendPacket(actionCodes.Hero_levelUpRpc, '') | |
27 | + return true | |
28 | +end | |
29 | + | |
30 | + | |
31 | +return _M | |
0 | 32 | \ No newline at end of file | ... | ... |
src/actions/RoleAction.lua
... | ... | @@ -74,7 +74,7 @@ function _M.loginRpc( agent, data ) |
74 | 74 | --维护不能登录 |
75 | 75 | local maintain = tonumber(redisproxy:hget("autoincrement_set", "maintain")) |
76 | 76 | if maintain and maintain > 0 then |
77 | - if tonumber(redisproxy:hget(string_format("role:%d", roleId), "ignoreMaintain")) ~= 1 then | |
77 | + if tonumber(redisproxy:hget(string_format("role:%d", roleId), "ignoreMt")) ~= 1 then | |
78 | 78 | response.result = "MAINTAIN_TIP" |
79 | 79 | SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) |
80 | 80 | return true |
... | ... | @@ -99,42 +99,73 @@ 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 | - local lastLoginTime = role:getProperty("lastLoginTime") | |
118 | + local ltime = role:getProperty("ltime") | |
119 | 119 | |
120 | 120 | role:changeStructVersion() -- 数据结构 版本更新 |
121 | 121 | |
122 | 122 | -- 跨天登陆事件 |
123 | - -- role:onCrossDay(now) | |
124 | - | |
125 | - role:setProperty("lastLoginTime", now) | |
126 | - -- if msg.device and type(msg.device) == "string" then | |
127 | - -- role:setProperty("device", msg.device) | |
128 | - -- end | |
123 | + role:onCrossDay(now) | |
129 | 124 | |
125 | + role:setProperty("ltime", now) | |
126 | + | |
130 | 127 | response.role = role:data() |
131 | 128 | response.result = "SUCCESS" |
132 | 129 | response.serverTime = now |
133 | 130 | |
134 | - response.wave = 1 | |
131 | + local modules = {} | |
132 | + | |
133 | + local heroIds = {} | |
134 | + for heroId, _ in pairs(role.heros) do | |
135 | + table.insert(heroIds, heroId) | |
136 | + end | |
137 | + local heroWave = math.ceil(#heroIds / WAVE_HERO_NUMS) | |
138 | + if #heroIds <= 0 then | |
139 | + heroWave = 0 | |
140 | + table_insert(modules, "heros") | |
141 | + end | |
142 | + | |
143 | + for _, name in ipairs(modules) do | |
144 | + response[name] = {} | |
145 | + for id, unit in pairs(role[name]) do | |
146 | + response[name][id] = unit:data() | |
147 | + end | |
148 | + end | |
149 | + | |
150 | + response.wave = 1 + heroWave | |
135 | 151 | |
136 | 152 | SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(response)) |
137 | 153 | |
154 | + local heroIndex = 1 | |
155 | + for index = 2, 1 + heroWave do | |
156 | + local heroResponse = {heros = {}} | |
157 | + for i = heroIndex, heroIndex + WAVE_HERO_NUMS do | |
158 | + local heroId = heroIds[i] | |
159 | + if not heroId then | |
160 | + break | |
161 | + end | |
162 | + local hero = role.heros[heroId] | |
163 | + table_insert(heroResponse.heros, hero:data()) | |
164 | + heroIndex = heroIndex + 1 | |
165 | + end | |
166 | + heroResponse.heroWave = index | |
167 | + SendPacket(actionCodes.Role_loginRpc, MsgPack.pack(heroResponse)) | |
168 | + end | |
138 | 169 | |
139 | 170 | -- role:log("login", { ip = agent.ip, diamond = role:getProperty("diamond"), reDiamond = role:getProperty("reDiamond")}) |
140 | 171 | ... | ... |
src/agent.lua
... | ... | @@ -221,13 +221,13 @@ function CMD.close() |
221 | 221 | |
222 | 222 | local role = agentInfo.role |
223 | 223 | if not role then return end |
224 | - role:log("logout", {online = skynet.timex()-role:getProperty("lastLoginTime")}) | |
224 | + role:log("logout", {online = skynet.timex()-role:getProperty("ltime")}) | |
225 | 225 | role:onOfflineEvent() |
226 | 226 | end |
227 | 227 | |
228 | 228 | function CMD.exit() |
229 | 229 | if agentInfo.role then |
230 | - -- role:log("logout", {online = skynet.timex()-role:getProperty("lastLoginTime")}) | |
230 | + -- role:log("logout", {online = skynet.timex()-role:getProperty("ltime")}) | |
231 | 231 | datacenter.set("agent", agentInfo.role:getProperty("id"), nil) |
232 | 232 | end |
233 | 233 | skynet.exit() | ... | ... |
... | ... | @@ -0,0 +1,71 @@ |
1 | +local Hero = class("Hero", require("shared.ModelBase")) | |
2 | + | |
3 | +Hero.schema = { | |
4 | + key = { "string" }, | |
5 | + id = {"number"}, | |
6 | + type = {"number", 0}, | |
7 | + level = {"number", 1}, -- 等级 | |
8 | +} | |
9 | + | |
10 | +Hero.fields = { | |
11 | + id = true, | |
12 | + type = true, | |
13 | + level = true, | |
14 | +} | |
15 | + | |
16 | +function Hero:ctor( properties ) | |
17 | + Hero.super.ctor(self, properties) | |
18 | +end | |
19 | + | |
20 | +function Hero:notifyUpdateProperty(field, newValue, oldValue) | |
21 | + local updateData = { | |
22 | + id = self:getProperty("id"), | |
23 | + datas = { | |
24 | + { | |
25 | + key = field, | |
26 | + newValue = newValue, | |
27 | + oldValue = oldValue or "", | |
28 | + }, | |
29 | + } | |
30 | + } | |
31 | + | |
32 | + SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) | |
33 | +end | |
34 | + | |
35 | +function Hero:notifyUpdateProperties(params) | |
36 | + local updateData = { | |
37 | + id = self:getProperty("id"), | |
38 | + datas = params | |
39 | + } | |
40 | + | |
41 | + SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) | |
42 | +end | |
43 | + | |
44 | +function Hero:updateProperty(params) | |
45 | + if not params.field or (not params.delta and not params.value) then | |
46 | + return | |
47 | + end | |
48 | + if params.delta then | |
49 | + self:incrProperty(params.field, params.delta) | |
50 | + elseif params.value then | |
51 | + self:setProperty(params.field, params.value) | |
52 | + end | |
53 | + local datas = {} | |
54 | + table.insert(datas, {key = params.field, newValue = self:getProperty(params.field)}) | |
55 | + | |
56 | + self:notifyUpdateProperties(datas) | |
57 | +end | |
58 | + | |
59 | +function Hero:getMaxLevel() | |
60 | + return #csvdb["unit_expCsv"] | |
61 | +end | |
62 | + | |
63 | +function Hero:data() | |
64 | + return { | |
65 | + id = self:getProperty("id"), | |
66 | + type = self:getProperty("type"), | |
67 | + level = self:getProperty("level"), | |
68 | + } | |
69 | +end | |
70 | + | |
71 | +return Hero | |
0 | 72 | \ No newline at end of file | ... | ... |
src/models/Role.lua
... | ... | @@ -12,6 +12,7 @@ RoleChangeStruct.bind(Role) |
12 | 12 | function Role:ctor( properties ) |
13 | 13 | Role.super.ctor(self, properties) |
14 | 14 | self.ignoreHeartbeat = false |
15 | + self.heros = {} | |
15 | 16 | end |
16 | 17 | |
17 | 18 | Role.schema = { |
... | ... | @@ -23,9 +24,10 @@ Role.schema = { |
23 | 24 | device = {"string", ""}, |
24 | 25 | banTime = {"number", 0}, |
25 | 26 | banType = {"number", 0}, |
26 | - lastLoginTime = {"number", 0}, | |
27 | - createTime = {"number", skynet.timex()}, | |
28 | - structVersion = {"number", globalCsv.StructVersion or 0}, -- 重整数据 | |
27 | + ltime = {"number", 0}, -- 最后登录时间 | |
28 | + ctime = {"number", skynet.timex()}, -- 创建时间 | |
29 | + ignoreMt = {"number", 0}, -- 忽略维护拦截 | |
30 | + sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本 | |
29 | 31 | |
30 | 32 | -- roleInfo |
31 | 33 | level = {"number", 0}, |
... | ... | @@ -42,8 +44,9 @@ Role.fields = { |
42 | 44 | name = true, |
43 | 45 | banTime = true, |
44 | 46 | banType = true, |
45 | - lastLoginTime = true, | |
46 | - createTime = true, | |
47 | + ltime = true, | |
48 | + ctime = true, | |
49 | + sversion = true, | |
47 | 50 | level = true, |
48 | 51 | diamond = true, |
49 | 52 | reDiamond = true, |
... | ... | @@ -51,6 +54,52 @@ Role.fields = { |
51 | 54 | } |
52 | 55 | |
53 | 56 | |
57 | +function Role:notifyUpdateProperty(field, newValue, oldValue, extraValue) | |
58 | + local updateData = { | |
59 | + { | |
60 | + key = field, | |
61 | + newValue = newValue, | |
62 | + oldValue = oldValue or "", | |
63 | + extraValue = extraValue, | |
64 | + } | |
65 | + } | |
66 | + | |
67 | + SendPacket(actionCodes.Role_updateProperty, MsgPack.pack(updateData)) | |
68 | +end | |
69 | + | |
70 | +function Role:updateProperty(params) | |
71 | + params = params or {} | |
72 | + if not self.fields[params.field] then return end | |
73 | + local oldValue = self:getProperty(params.field) | |
74 | + local ret = {key = params.field, oldValue = oldValue} | |
75 | + if params.value then | |
76 | + ret.newValue = params.value | |
77 | + self:setProperty(params.field, params.value) | |
78 | + elseif params.delta then | |
79 | + self:incrProperty(params.field, params.delta) | |
80 | + ret.newValue = self:getProperty(params.field) | |
81 | + else | |
82 | + return | |
83 | + end | |
84 | + if not params.notNotify then | |
85 | + SendPacket(actionCodes.Role_updateProperty, MsgPack.pack({ret})) | |
86 | + end | |
87 | +end | |
88 | + | |
89 | +function Role:updateProperties(params, notNotify) | |
90 | + for field, value in pairs(params) do | |
91 | + self:setProperty(field, value) | |
92 | + end | |
93 | + if not notNotify then | |
94 | + SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params)) | |
95 | + end | |
96 | +end | |
97 | + | |
98 | +function Role:notifyUpdateProperties(params) | |
99 | + SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params)) | |
100 | +end | |
101 | + | |
102 | + | |
54 | 103 | |
55 | 104 | function Role:data() |
56 | 105 | return { | ... | ... |
src/models/RoleChangeStruct.lua
... | ... | @@ -51,7 +51,7 @@ local RoleChangeStruct = {} |
51 | 51 | function RoleChangeStruct.bind(Role) |
52 | 52 | |
53 | 53 | function Role:changeStructVersion() |
54 | - local curVersion = self:getProperty("structVersion") | |
54 | + local curVersion = self:getProperty("sversion") | |
55 | 55 | if not globalCsv.StructVersion or curVersion >= globalCsv.StructVersion then return end |
56 | 56 | |
57 | 57 | local jumpVersion = {} |
... | ... | @@ -99,7 +99,7 @@ function RoleChangeStruct.bind(Role) |
99 | 99 | end |
100 | 100 | end |
101 | 101 | end |
102 | - self:setProperty("structVersion", globalCsv.StructVersion) | |
102 | + self:setProperty("sversion", globalCsv.StructVersion) | |
103 | 103 | end |
104 | 104 | |
105 | 105 | end | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -9,14 +9,78 @@ function RolePlugin.bind(Role) |
9 | 9 | end |
10 | 10 | |
11 | 11 | function Role:loadAll() |
12 | - | |
12 | + self:loadHeros() | |
13 | 13 | end |
14 | 14 | |
15 | 15 | function Role:reloadWhenLogin() |
16 | + end | |
17 | + | |
18 | + function Role:onCrossDay(now) | |
19 | + | |
20 | + end | |
21 | + | |
22 | + function Role:addHero(params) | |
23 | + local roleId = self:getProperty("id") | |
24 | + local heroId = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "hero", 1)) | |
25 | + | |
26 | + local heroType = params.type | |
27 | + local unitData = csvdb["unitCsv"][heroType] | |
16 | 28 | |
29 | + redisproxy:sadd(string.format(R_HEROS, roleId), heroId) | |
30 | + | |
31 | + local heroInfo = { | |
32 | + key = string.format(R_HERO, roleId, heroId), | |
33 | + id = heroId, | |
34 | + type= heroType, | |
35 | + } | |
36 | + | |
37 | + local newHero = require("models.Hero").new(heroInfo) | |
38 | + newHero:create() | |
39 | + newHero.owner = self | |
40 | + self.heros[heroId] = newHero | |
41 | + | |
42 | + if not params.notNotify then | |
43 | + local heroResponse = {} | |
44 | + table.insert(heroResponse, newHero:data()) | |
45 | + local bin = MsgPack.pack(heroResponse) | |
46 | + SendPacket(actionCodes.Hero_loadInfos, bin) | |
47 | + end | |
17 | 48 | end |
18 | 49 | |
50 | + function Role:delHero(params) | |
51 | + local roleId = self:getProperty('id') | |
52 | + local hero = self.heros[heroId] | |
53 | + if not hero then return end | |
54 | + | |
55 | + self.heros[heroId] = nil | |
56 | + redisproxy:pipelining(function (red) | |
57 | + red:del(string.format(R_HERO, roleId, heroId)) | |
58 | + red:srem(string.format(R_HEROS, roleId), heroId) | |
59 | + end) | |
60 | + SendPacket(actionCodes.Hero_loadInfos, MsgPack.pack({{id = heroId, bDel = true}})) | |
61 | + end | |
19 | 62 | |
63 | + function Role:loadHeros() | |
64 | + local roleId = self:getProperty("id") | |
65 | + local heroIds = redisproxy:smembers(string.format(R_HEROS, roleId)) | |
66 | + local redret = redisproxy:pipelining(function (red) | |
67 | + for _, heroId in ipairs(heroIds) do | |
68 | + red:hgetall(string.format(R_HERO, roleId, heroId)) | |
69 | + end | |
70 | + end) | |
71 | + for index, heroId in ipairs(heroIds) do | |
72 | + local hero = require("models.Hero").new({key = string.format(R_HERO, roleId, heroId)}) | |
73 | + if hero:load(table.array2Table(redret[index])) then | |
74 | + hero.owner = self | |
75 | + self.heros[tonumber(heroId)] = hero | |
76 | + end | |
77 | + end | |
78 | + end | |
79 | + | |
80 | + -- 发奖功能入口 | |
81 | + function Role:award() | |
82 | + | |
83 | + end | |
20 | 84 | end |
21 | 85 | |
22 | 86 | return RolePlugin |
23 | 87 | \ No newline at end of file | ... | ... |