Commit 2a79cbf8c181ee8723077ee32263e33a600c3435
Merge branch 'develop' into player
* develop: (47 commits) 返还 冒险bug 签名回调地址由客户端上传 邮件时间bug 停止注册 日志端口 修改报错,下载cv奖励记录字段 增加pay_url 挂机选定关卡时,指定新手引导步骤 battle bug 引导招募必送思露德判定出了大问题 战斗 日志 新的被动效果 挂机战斗胜利才触发对应的引导 不回复 更改看板娘 增加记录log log 增加 触发神器引导的代码移到发奖励的方法里 神器的引导步骤从55步开始 10连保底使用池子全随机 ... # Conflicts: # src/actions/HeroAction.lua
Showing
39 changed files
with
1813 additions
and
1201 deletions
Show diff stats
src/GlobalVar.lua
... | ... | @@ -290,12 +290,24 @@ MailId = { |
290 | 290 | SuperMonthCardEx = 204, |
291 | 291 | BattleCardAward = 210, |
292 | 292 | |
293 | - ActDrawCard = 231, | |
294 | - ActOpenBox = 232, | |
293 | + ActSellFood = 231, | |
294 | + ActDrawCard = 232, | |
295 | 295 | ActAdvDraw = 233, |
296 | - ActSellFood = 234, | |
297 | - ActDrawCardReward = 221, | |
298 | - ActOpenBoxReward = 222, | |
296 | + ActOpenBox = 234, | |
297 | + ActSellFoodReward = 221, | |
298 | + ActDrawCardReward = 222, | |
299 | 299 | ActAdvDrawReward = 223, |
300 | - ActSellFoodReward = 224, | |
300 | + ActOpenBoxReward = 224, | |
301 | 301 | } |
302 | + | |
303 | +TriggerEventType = { | |
304 | + HangPass = 1, | |
305 | + LevelUp = 2, | |
306 | + TowerPass = 3, | |
307 | +} | |
308 | + | |
309 | +DrawCardType = { | |
310 | + SpecifyDraw = 1, | |
311 | + NormalDraw = 2, | |
312 | + FriendDraw = 3 | |
313 | +} | |
302 | 314 | \ No newline at end of file | ... | ... |
src/ProtocolCode.lua
... | ... | @@ -44,6 +44,7 @@ actionCodes = { |
44 | 44 | Role_guideRpc = 129, |
45 | 45 | Role_getRandomNameRpc = 130, |
46 | 46 | Role_goldBuyRpc = 131, |
47 | + Role_getDownloadCvRewardRpc = 132, | |
47 | 48 | |
48 | 49 | Adv_startAdvRpc = 151, |
49 | 50 | Adv_startHangRpc = 152, |
... | ... | @@ -89,6 +90,7 @@ actionCodes = { |
89 | 90 | Hero_drawHeroRpc = 220, |
90 | 91 | Hero_repayHeroRpc = 221, |
91 | 92 | Hero_unlockPoolRpc = 222, |
93 | + Hero_changeCrown = 223, | |
92 | 94 | |
93 | 95 | Hang_startRpc = 251, |
94 | 96 | Hang_checkRpc = 252, | ... | ... |
src/actions/ActivityAction.lua
... | ... | @@ -65,7 +65,11 @@ function _M.sudokuRpc(agent, data) |
65 | 65 | |
66 | 66 | role:updateProperty({field = "sudoku", value = sudoku}) |
67 | 67 | |
68 | - role:log("act_action", {desc = "sudoku", int1 = id, int2 = phase}) | |
68 | + role:log("activity", { | |
69 | + activity_id = id, -- 活动ID(或活动指定任务的ID) | |
70 | + activity_type = 0, -- 活动类型,见活动类型枚举表 | |
71 | + activity_reward = reward or {}, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
72 | + }) | |
69 | 73 | |
70 | 74 | SendPacket(actionCodes.Activity_sudokuRpc, MsgPack.pack({task = role:packReward(task, tchange), reward = role:packReward(reward, rchange), rId = rId})) |
71 | 75 | return true |
... | ... | @@ -100,6 +104,12 @@ function _M.sudokuRewardRpc(agent, data) |
100 | 104 | end |
101 | 105 | role:updateProperty({field = "sudoku", value = sudoku}) |
102 | 106 | |
107 | + role:log("activity", { | |
108 | + activity_id = 10000 + phase, -- 活动ID(或活动指定任务的ID) | |
109 | + activity_type = 0, -- 活动类型,见活动类型枚举表 | |
110 | + activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
111 | + }) | |
112 | + | |
103 | 113 | SendPacket(actionCodes.Activity_sudokuRewardRpc, MsgPack.pack(role:packReward(reward, change))) |
104 | 114 | return true |
105 | 115 | end |
... | ... | @@ -156,6 +166,13 @@ function _M.actSignRpc(agent, data) |
156 | 166 | role.activity:updateActData("Sign", curData) |
157 | 167 | reward, change = role:award(reward, {log = {desc = "actSign"}}) |
158 | 168 | end |
169 | + | |
170 | + role:log("activity", { | |
171 | + activity_id = curData[0], -- 活动ID(或活动指定任务的ID) | |
172 | + activity_type = role.activity.ActivityType.Sign, -- 活动类型,见活动类型枚举表 | |
173 | + activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
174 | + }) | |
175 | + | |
159 | 176 | SendPacket(actionCodes.Activity_actSignRpc, MsgPack.pack(role:packReward(reward, change))) |
160 | 177 | return true |
161 | 178 | end | ... | ... |
src/actions/AdvAction.lua
... | ... | @@ -90,7 +90,7 @@ function _M.startAdvRpc( agent, data ) |
90 | 90 | --上一个关卡结束才可以开始新的关卡 |
91 | 91 | if role:getAdvData():isRunning() then return 8 end |
92 | 92 | local advHang = role:getProperty("advHang") |
93 | - if advHang[chapterId] then return 9 end --正在挂机 | |
93 | + -- if advHang[chapterId] then return 9 end --正在挂机 | |
94 | 94 | |
95 | 95 | |
96 | 96 | local chapterData = csvdb["adv_chapterCsv"][chapterId] |
... | ... | @@ -174,7 +174,6 @@ function _M.startAdvRpc( agent, data ) |
174 | 174 | role:checkTaskEnter("AdvStart", {id = chapterId}) |
175 | 175 | role:checkTaskEnter("AdvStartSelf", {id = chapterId}) |
176 | 176 | role:getAdvData():popBackEvents() -- 清一下事件 |
177 | - role:getAdvData():log({desc = "start", int1 = supportIdx}) | |
178 | 177 | |
179 | 178 | SendPacket(actionCodes.Adv_startAdvRpc, '') |
180 | 179 | return true |
... | ... | @@ -184,16 +183,28 @@ function _M.startHangRpc(agent, data) |
184 | 183 | local role = agent.role |
185 | 184 | local msg = MsgPack.unpack(data) |
186 | 185 | local chapterId = msg.chapterId --关卡id |
186 | + local campId = msg.campId or 2 --营地id | |
187 | 187 | local format = msg.format --编队 |
188 | + local index = msg.index or 1--时间索引id | |
188 | 189 | |
189 | - local chapterData = csvdb["adv_chapterCsv"][chapterId] | |
190 | + local chapterData = csvdb["adv_chapter_campsiteCsv"][chapterId] | |
190 | 191 | if not chapterData then return 1 end |
191 | - if chapterData.idleReward == "" then return 2 end --没有奖励 没有挂机 | |
192 | + local campSiteData = chapterData[campId] | |
193 | + if not campSiteData then return 1 end | |
194 | + if campSiteData.idleReward_1 == "" and campSiteData.idleReward_2 == "" then return 2 end --没有奖励 没有挂机 | |
195 | + | |
196 | + local adv_idle_time = globalCsv.adv_idle_time[index] | |
197 | + local adv_idle_energy = globalCsv.adv_idle_energy[index] | |
198 | + local adv_idle_reward_coef = globalCsv.adv_idle_reward[index] | |
199 | + if not adv_idle_time or not adv_idle_energy or not adv_idle_reward_coef then | |
200 | + return 2 | |
201 | + end | |
202 | + adv_idle_time = adv_idle_time * 60 | |
192 | 203 | |
193 | 204 | local advHang = role:getProperty("advHang") |
194 | 205 | if advHang[chapterId] then return 3 end --正在挂机 |
195 | 206 | |
196 | - if role:getAdvData():isRunning() and role:getAdvData().chapterId == chapterId then return 4 end | |
207 | + -- if role:getAdvData():isRunning() and role:getAdvData().chapterId == chapterId then return 4 end | |
197 | 208 | |
198 | 209 | if AdvCommon.isEndless(chapterId) then return 5 end -- 无尽没有代理 |
199 | 210 | |
... | ... | @@ -201,7 +212,7 @@ function _M.startHangRpc(agent, data) |
201 | 212 | if not next(advRelay[chapterId] or {}) then return 6 end -- 没有开放 |
202 | 213 | |
203 | 214 | |
204 | - if not role:checkAdvCount(chapterData.limitlevel) then return 7 end -- 是否有体力 | |
215 | + if not role:checkAdvCount(adv_idle_energy) then return 7 end -- 是否有体力 | |
205 | 216 | |
206 | 217 | if not checkFormat(role, format, role:getAdvData():isRunning()) then return 8 end --编队是否正确 |
207 | 218 | |
... | ... | @@ -220,7 +231,7 @@ function _M.startHangRpc(agent, data) |
220 | 231 | + 0.226 * player["hit"] |
221 | 232 | + 0.26 * player["miss"] |
222 | 233 | |
223 | - if battleV < chapterData.idleValue then return 9 end -- 战斗力是否满足 | |
234 | + if battleV < campSiteData.idleValue then return 9 end -- 战斗力是否满足 | |
224 | 235 | |
225 | 236 | local info = {} |
226 | 237 | info.format = {} |
... | ... | @@ -230,7 +241,9 @@ function _M.startHangRpc(agent, data) |
230 | 241 | for slot, heroId in pairs(format.heros) do |
231 | 242 | info.format.heros[slot] = heroId |
232 | 243 | end |
233 | - info.time = skynet.timex() + chapterData.idleTime --挂机时间 | |
244 | + info.time = skynet.timex() + adv_idle_time --挂机时间 | |
245 | + info.campId = campId | |
246 | + info.index = index | |
234 | 247 | |
235 | 248 | -- 没有在战斗 用team来挂机了 把team清掉 |
236 | 249 | if not role:getAdvData():isRunning() then |
... | ... | @@ -239,9 +252,8 @@ function _M.startHangRpc(agent, data) |
239 | 252 | |
240 | 253 | role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) |
241 | 254 | |
242 | - role:changeAdvCount(chapterData.limitlevel) | |
255 | + role:changeAdvCount(adv_idle_energy) | |
243 | 256 | role:checkTaskEnter("AdvStart", {id = chapterId}) |
244 | - role:log("adv_action", {desc = "startHang", int1 = chapterId}) | |
245 | 257 | |
246 | 258 | SendPacket(actionCodes.Adv_startHangRpc, '') |
247 | 259 | return true |
... | ... | @@ -257,21 +269,30 @@ function _M.quickHangRpc(agent, data) |
257 | 269 | local info = advHang[chapterId] |
258 | 270 | if not info then return end |
259 | 271 | |
260 | - local chapterData = csvdb["adv_chapterCsv"][chapterId] | |
272 | + local index = info.index | |
273 | + local chapterData = csvdb["adv_chapter_campsiteCsv"][chapterId] | |
261 | 274 | if not chapterData then return end |
275 | + | |
276 | + local campSiteData = chapterData[info.campId] | |
277 | + if not campSiteData then return 1 end | |
278 | + if campSiteData.idleReward_1 == "" and campSiteData.idleReward_2 == "" then return 2 end --没有奖励 没有挂机 | |
279 | + | |
280 | + local adv_idle_time = globalCsv.adv_idle_time[index] | |
281 | + if not adv_idle_time then | |
282 | + return 2 | |
283 | + end | |
284 | + adv_idle_time = adv_idle_time * 60 | |
262 | 285 | |
263 | 286 | local reward, isFull |
264 | 287 | if skynet.timex() >= info.time then return end -- 已经完成了 |
265 | 288 | |
266 | - local cost = math.ceil((info.time - skynet.timex()) / chapterData.idleTime * chapterData.accelerate) | |
289 | + local cost = math.ceil((info.time - skynet.timex()) / 3600 * globalCsv.adv_idle_quicken) | |
267 | 290 | |
268 | 291 | if not role:checkItemEnough({[ItemId.Diamond] = cost}) then return end |
269 | 292 | role:costItems({[ItemId.Diamond] = cost}, {log = {desc = "advQuickHang", int1 = chapterId}}) |
270 | 293 | info.time = 0 |
271 | 294 | role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) |
272 | 295 | |
273 | - role:log("adv_action", {desc = "advQuickHang", int1 = chapterId}) | |
274 | - | |
275 | 296 | SendPacket(actionCodes.Adv_quickHangRpc, '') |
276 | 297 | return true |
277 | 298 | end |
... | ... | @@ -287,11 +308,25 @@ function _M.endHangRpc(agent, data) |
287 | 308 | local info = advHang[chapterId] |
288 | 309 | if not info then return end |
289 | 310 | |
290 | - local chapterData = csvdb["adv_chapterCsv"][chapterId] | |
311 | + local index = info.index or 1 | |
312 | + local chapterData = csvdb["adv_chapter_campsiteCsv"][chapterId] | |
291 | 313 | if not chapterData then return end |
314 | + local campSiteData = chapterData[info.campId or 2] | |
315 | + if not campSiteData then return 1 end | |
316 | + if campSiteData.idleReward_1 == "" and campSiteData.idleReward_2 == "" then return 2 end --没有奖励 没有挂机 | |
317 | + | |
318 | + local adv_idle_time = globalCsv.adv_idle_time[index] | |
319 | + local adv_idle_energy = globalCsv.adv_idle_energy[index] | |
320 | + local adv_idle_reward_coef = globalCsv.adv_idle_reward[index] | |
321 | + if not adv_idle_time or not adv_idle_energy or not adv_idle_reward_coef then | |
322 | + return 2 | |
323 | + end | |
324 | + adv_idle_time = adv_idle_time * 60 | |
292 | 325 | |
293 | 326 | local reward, isFull, change |
294 | 327 | if skynet.timex() >= info.time then |
328 | + -- 最新需求加成取消 | |
329 | + --[[ | |
295 | 330 | -- 英雄加成 |
296 | 331 | local idleUnit = chapterData.idleUnit:toNumMap() |
297 | 332 | local upUnit = 0 |
... | ... | @@ -316,15 +351,17 @@ function _M.endHangRpc(agent, data) |
316 | 351 | end |
317 | 352 | |
318 | 353 | if not maxCampsite then return end |
354 | + ]] | |
355 | + local totalReward = campSiteData.idleReward_1 .. " " .. campSiteData.idleReward_2 | |
319 | 356 | |
320 | - local idleReward = chapterData.idleReward:toNumMap() | |
357 | + local idleReward = totalReward:toNumMap() | |
321 | 358 | for itemId, count in pairs(idleReward) do |
322 | - idleReward[itemId] = math.floor(count * (maxCampsite.idleValue + upUnit) / 100) | |
359 | + idleReward[itemId] = count * adv_idle_reward_coef | |
323 | 360 | end |
324 | 361 | reward, change = role:award(idleReward, {log = {desc = "advHang", int1 = chapterId}}) |
325 | 362 | else |
326 | 363 | if cancel then |
327 | - role:changeAdvCount(-chapterData.limitlevel) | |
364 | + --role:changeAdvCount(-chapterData.limitlevel) | |
328 | 365 | -- if role:getProperty("advC") <= 0 then |
329 | 366 | -- isFull = true |
330 | 367 | -- else |
... | ... | @@ -337,8 +374,6 @@ function _M.endHangRpc(agent, data) |
337 | 374 | |
338 | 375 | role:changeUpdates({{type = "advHang", field = chapterId, value = nil}}) |
339 | 376 | |
340 | - role:log("adv_action", {desc = "endHang", int1 = chapterId, short1 = cancel and 1 or 0}) | |
341 | - | |
342 | 377 | SendPacket(actionCodes.Adv_endHangRpc, MsgPack.pack({reward = reward, change = change, isFull = isFull})) |
343 | 378 | return true |
344 | 379 | end |
... | ... | @@ -360,7 +395,7 @@ function _M.buyAdvCountRpc(agent , data) |
360 | 395 | |
361 | 396 | |
362 | 397 | if not role:checkItemEnough(cost) then return end |
363 | - role:costItems(cost, {log = {desc = "buyAdvCount", short1 = isEl and 1 or 0, int1 = count}}) | |
398 | + role:costItems(cost, {log = {desc = "buyAdvCount", int1 = isEl and 1 or 0, int2 = count}}) | |
364 | 399 | if isEl then |
365 | 400 | role.dailyData:updateProperty({field = "advElC", delta = -count}) |
366 | 401 | role.dailyData:updateProperty({field = "advElBC", delta = count}) |
... | ... | @@ -368,7 +403,6 @@ function _M.buyAdvCountRpc(agent , data) |
368 | 403 | role:changeAdvCount(-count * globalCsv.adv_daily_buy_num) |
369 | 404 | role.dailyData:updateProperty({field = "advBC", delta = count}) |
370 | 405 | end |
371 | - role:log("adv_action", {desc = "buyAdvCount", short1 = isEl and 1 or 0, int1 = count}) | |
372 | 406 | |
373 | 407 | SendPacket(actionCodes.Adv_buyAdvCountRpc, '') |
374 | 408 | return true |
... | ... | @@ -393,8 +427,6 @@ function _M.finishTaskRpc(agent, data) |
393 | 427 | if not status then return end |
394 | 428 | role:checkTaskEnter("AdvOverTask", {id = taskId}) |
395 | 429 | |
396 | - adv:log({desc = "finishTask", int1 = taskId}) | |
397 | - | |
398 | 430 | SendPacket(actionCodes.Adv_finishTaskRpc, MsgPack.pack(role:packReward(reward, change))) |
399 | 431 | return true |
400 | 432 | end |
... | ... | @@ -416,8 +448,6 @@ function _M.clickBlockRpc(agent, data) |
416 | 448 | |
417 | 449 | if adv:isWaitChooseArtifact() then return returnFail() end |
418 | 450 | |
419 | - adv:log({desc = "clickBlock", int1 = msg.roomId, int2 = msg.blockId}) | |
420 | - | |
421 | 451 | local status, errorCode = adv:clickBlock(msg.roomId, msg.blockId, msg) |
422 | 452 | if not status then return returnFail(errorCode) end |
423 | 453 | |
... | ... | @@ -450,8 +480,11 @@ function _M.useItemRpc(agent, data) |
450 | 480 | adv:backUse({[itemId] = count}) |
451 | 481 | end |
452 | 482 | |
483 | + if itemId == 5020 then | |
484 | + role:finishGuide(53) | |
485 | + end | |
486 | + | |
453 | 487 | adv:checkAchievement(adv.AchievType.UseItem, count, itemId) |
454 | - adv:log({desc = "useItem", int1 = itemId, int2 = count}) | |
455 | 488 | |
456 | 489 | for i = 1, count do |
457 | 490 | adv:doActive(itemData.effect, target) -- target |
... | ... | @@ -487,7 +520,6 @@ function _M.usePotionRpc(agent, data) |
487 | 520 | local adv = role:getAdvData() |
488 | 521 | if adv:isWaitChooseArtifact() then return end |
489 | 522 | |
490 | - adv:log({desc = "usePotion", int1 = potionId}) | |
491 | 523 | |
492 | 524 | local status = adv:doActive(potionData.effect, target) -- target |
493 | 525 | if not status then return end |
... | ... | @@ -499,6 +531,8 @@ function _M.usePotionRpc(agent, data) |
499 | 531 | adv:saveDB() |
500 | 532 | role:checkTaskEnter("AdvUsePotion") |
501 | 533 | |
534 | + role:finishGuide(61) | |
535 | + | |
502 | 536 | SendPacket(actionCodes.Adv_usePotionRpc, MsgPack.pack({events = adv:popBackEvents()})) |
503 | 537 | return true |
504 | 538 | end |
... | ... | @@ -539,6 +573,8 @@ function _M.wearArtifactRpc(agent, data) |
539 | 573 | if not status then return 3 end |
540 | 574 | adv:saveDB() |
541 | 575 | |
576 | + role:finishGuide(55) | |
577 | + | |
542 | 578 | SendPacket(actionCodes.Adv_wearArtifactRpc, '') |
543 | 579 | return true |
544 | 580 | end |
... | ... | @@ -568,6 +604,7 @@ function _M.upArtifactRpc(agent, data) |
568 | 604 | else |
569 | 605 | adv:updateAchievement() |
570 | 606 | end |
607 | + | |
571 | 608 | SendPacket(actionCodes.Adv_upArtifactRpc, '') |
572 | 609 | return true |
573 | 610 | end |
... | ... | @@ -577,9 +614,10 @@ function _M.exitAdvRpc(agent, data) |
577 | 614 | local role = agent.role |
578 | 615 | -- local msg = MsgPack.unpack(data) |
579 | 616 | if not isCanContinue(role) then return end |
580 | - | |
617 | + if not role:checkOverGuide(57) then | |
618 | + role:saveGuide(57,1,true) | |
619 | + end | |
581 | 620 | local adv = role:getAdvData() |
582 | - adv:log({desc = "exit"}) | |
583 | 621 | local status = adv:exit() -- target {roomId = 1, blockId = 1} 选择的目标 |
584 | 622 | SendPacket(actionCodes.Adv_exitAdvRpc, MsgPack.pack({events = adv:popBackEvents()})) |
585 | 623 | return true |
... | ... | @@ -638,7 +676,19 @@ function _M.endBattleRpc(agent, data) |
638 | 676 | if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId then return end |
639 | 677 | adv.__battleCache = nil |
640 | 678 | |
641 | - adv:log({desc = "endBattle"}) | |
679 | + -- 打完野猪怪 | |
680 | + role:finishGuide(52) | |
681 | + -- 调理剂使用引导(生命药剂) | |
682 | + if not role:checkOverGuide(61) then | |
683 | + local potionBag = role:getProperty("potionBag") | |
684 | + local own = potionBag[10] or 0 | |
685 | + if own > 0 then | |
686 | + -- 造假 | |
687 | + player.hp = player.hp * 0.8 | |
688 | + role:saveGuide(61,1,true) | |
689 | + end | |
690 | + end | |
691 | + | |
642 | 692 | local status = adv:clickBlock(roomId, blockId, {player = player, bySkill = bySkill}) |
643 | 693 | |
644 | 694 | if not status then return end |
... | ... | @@ -720,9 +770,8 @@ function _M.wheelSurfRpc(agent, data) |
720 | 770 | table.insert(backReward, gift) |
721 | 771 | end |
722 | 772 | role:award(reward, {log = {desc = "advWheelSurf", int1 = ptype}}) |
723 | - | |
773 | + role:finishGuide(58) | |
724 | 774 | role:checkTaskEnter("AdvDraw", {count = count, ptype = ptype}) |
725 | - role:log("adv_action", {desc = "advWheelSurf", int1 = ptype, int2 = count}) | |
726 | 775 | |
727 | 776 | SendPacket(actionCodes.Adv_wheelSurfRpc, MsgPack.pack({reward = backReward})) |
728 | 777 | return true |
... | ... | @@ -751,7 +800,6 @@ function _M.repayWheelSurfRpc(agent, data) |
751 | 800 | local gift = drawData["pool3"]:randWeight(true) |
752 | 801 | local reward, change = {[gift[1]] = gift[2]} |
753 | 802 | reward, change = role:award(reward, {log = {desc = "advRepayWheelSurf", int1 = ptype}}) |
754 | - role:log("adv_action", {desc = "advRepayWheelSurf", int1 = ptype}) | |
755 | 803 | |
756 | 804 | SendPacket(actionCodes.Adv_repayWheelSurfRpc, MsgPack.pack(role:packReward(reward, change))) |
757 | 805 | return true |
... | ... | @@ -774,8 +822,7 @@ function _M.finishAchievRpc(agent, data) |
774 | 822 | end |
775 | 823 | if not status then return end |
776 | 824 | adv:updateAchievement() |
777 | - role:log("adv_action", {desc = "finishAchiev", short1 = ctype, int1 = chapterId, int2 = taskId}) | |
778 | - | |
825 | + role:finishGuide(57) | |
779 | 826 | SendPacket(actionCodes.Adv_finishAchievRpc, MsgPack.pack(role:packReward(reward, change))) |
780 | 827 | return true |
781 | 828 | end |
... | ... | @@ -831,7 +878,6 @@ function _M.refreshSupportRpc(agent, data) |
831 | 878 | end |
832 | 879 | |
833 | 880 | role:advRandomSupportEffect() |
834 | - role:log("adv_action", {desc = "advSupRe", short1 = cr < al and 0 or 1}) | |
835 | 881 | |
836 | 882 | SendPacket(actionCodes.Adv_refreshSupportRpc, '') |
837 | 883 | return true | ... | ... |
src/actions/CarAction.lua
... | ... | @@ -40,7 +40,13 @@ function _M.makePotionRpc( agent, data ) |
40 | 40 | role:updateProperty({field = "potionBag", value = potionBag}) |
41 | 41 | role:checkTaskEnter("PotionMake", {count = count, id = potionId}) |
42 | 42 | |
43 | - role:log("role_action", {desc = "makePotion", int1 = potionId, int2 = count}) | |
43 | + role:log("carriage_cook", { | |
44 | + item_id = potionId, -- 道具id | |
45 | + item_level = potionLv, -- 道具等级 | |
46 | + item_type = 0, -- 道具类型,具体见枚举表中道具类型枚举表 | |
47 | + carriage_cook_amount = count, -- 制作总量 | |
48 | + carriage_cook_cost = cost, -- 制作消耗道具,json格式记录,{'itemid1':10,'itemid2':5,…………..} | |
49 | + }) | |
44 | 50 | SendPacket(actionCodes.Car_makePotionRpc, MsgPack.pack({potionBag = potionBag})) |
45 | 51 | return true |
46 | 52 | end |
... | ... | @@ -91,7 +97,14 @@ function _M.equipUpRpc( agent, data ) |
91 | 97 | role:addEquip(typ, nextLv ,count, {log = {desc = "equipUp"}}) |
92 | 98 | role:checkTaskEnter("EquipUp", {count = count}) |
93 | 99 | |
94 | - role:log("role_action", {desc = "equipUp", int1 = id, int2 = count}) | |
100 | + role:log("equip_upgrade", { | |
101 | + equip_upgrade_part = typ, -- 升级部位,记录部位ID | |
102 | + equip_id = nextLv, -- 升级后的装备ID | |
103 | + equip_upgrade_amount = count, -- 升级获取的装备数量 | |
104 | + equip_upgrade_usedid = lv, -- 升级消耗的装备ID | |
105 | + equip_upgrade_cost = costCount, -- 升级操作消耗装备数量 | |
106 | + equip_upgrade_current = cost, -- 升级消耗的货币类型 | |
107 | + }) | |
95 | 108 | |
96 | 109 | SendPacket(actionCodes.Car_equipUpRpc, '') |
97 | 110 | return true |
... | ... | @@ -167,8 +180,6 @@ function _M.saleEquipRpc(agent, data ) |
167 | 180 | role:checkTaskEnter("SaleEquip", {count = allCount}) |
168 | 181 | reward, change = role:award(reward, {log = {desc = "saleEquip"}}) |
169 | 182 | |
170 | - role:log("role_action", {desc = "saleEquip", int1 = allCount}) | |
171 | - | |
172 | 183 | SendPacket(actionCodes.Car_saleEquipRpc, MsgPack.pack(role:packReward(reward, change))) |
173 | 184 | return true |
174 | 185 | end | ... | ... |
src/actions/DinerAction.lua
... | ... | @@ -104,8 +104,7 @@ function _M.addSellRpc( agent, data ) |
104 | 104 | if change then |
105 | 105 | role.dinerData:updateProperty({field = "customer", value = customer}) |
106 | 106 | end |
107 | - | |
108 | - role:log("diner_action", {desc = "addSell", int1 = dish, int2 = count}) | |
107 | + role:finishGuide(28) | |
109 | 108 | |
110 | 109 | role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) |
111 | 110 | SendPacket(actionCodes.Diner_addSellRpc, "") |
... | ... | @@ -140,7 +139,7 @@ function _M.removeSellRpc( agent, data ) |
140 | 139 | return 5 |
141 | 140 | end |
142 | 141 | |
143 | - role.dinerData:updateSell(slot) | |
142 | + local temp = role.dinerData:updateSell(slot) | |
144 | 143 | local reward, change = {} |
145 | 144 | local cost = dishData.material:toNumMap() |
146 | 145 | for k, n in pairs(cost) do |
... | ... | @@ -150,7 +149,14 @@ function _M.removeSellRpc( agent, data ) |
150 | 149 | reward, change = role:award(reward, {log = {desc = "removeSell"}}) |
151 | 150 | sells[slot].count = 0 |
152 | 151 | |
153 | - role:log("diner_action", {desc = "removeSell", int1 = dish}) | |
152 | + role:log("restaurant_sale", { | |
153 | + item_id = dish, -- 售卖物品ID | |
154 | + restaurant_sale_seat = slot, -- 售卖物品所在位置 | |
155 | + restaurant_sale_time = temp.deltaTime or 0, -- 售卖时长 | |
156 | + restaurant_sale_type = 2, -- 售卖方式,正常售卖:0, 加速:1,移除售卖:2 | |
157 | + restaurant_sale_coin = reward[ItemId.DinerCoin] or 0, -- 售卖获得美食币 | |
158 | + restaurant_sale_gear = reward[ItemId.Gold] or 0, -- 售卖获得齿轮 | |
159 | + }) | |
154 | 160 | |
155 | 161 | role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) |
156 | 162 | SendPacket(actionCodes.Diner_removeSellRpc, MsgPack.pack({reward = reward, change = change})) |
... | ... | @@ -162,8 +168,11 @@ function _M.getSellRewardRpc( agent, data ) |
162 | 168 | local dirty = false |
163 | 169 | local reward, popular = "", 0 |
164 | 170 | local sells = json.decode(role.dinerData:getProperty("sells")) |
171 | + | |
172 | + local deltaTimes = {} | |
165 | 173 | for slot, _ in pairs(sells) do |
166 | - role.dinerData:updateSell(slot) | |
174 | + local temp = role.dinerData:updateSell(slot) | |
175 | + deltaTimes[slot] = temp.deltaTime | |
167 | 176 | end |
168 | 177 | sells = json.decode(role.dinerData:getProperty("sells")) |
169 | 178 | for slot, sell in pairs(sells) do |
... | ... | @@ -187,6 +196,15 @@ function _M.getSellRewardRpc( agent, data ) |
187 | 196 | end |
188 | 197 | sells[slot].reward = "" |
189 | 198 | sells[slot].popular = 0 |
199 | + | |
200 | + role:log("restaurant_sale", { | |
201 | + item_id = sell.dish, -- 售卖物品ID | |
202 | + restaurant_sale_seat = slot, -- 售卖物品所在位置 | |
203 | + restaurant_sale_time = deltaTimes[slot] or 0, -- 售卖时长 | |
204 | + restaurant_sale_type = 0, -- 售卖方式,正常售卖:0, 加速:1,移除售卖:2 | |
205 | + restaurant_sale_coin = rewards[ItemId.DinerCoin] or 0, -- 售卖获得美食币 | |
206 | + restaurant_sale_gear = rewards[ItemId.Gold] or 0, -- 售卖获得齿轮 | |
207 | + }) | |
190 | 208 | end |
191 | 209 | role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) |
192 | 210 | local gift = reward:toNumMap() |
... | ... | @@ -204,7 +222,7 @@ function _M.getSellRewardRpc( agent, data ) |
204 | 222 | role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) |
205 | 223 | end |
206 | 224 | |
207 | - role:log("diner_action", {desc = "sell"}) | |
225 | + | |
208 | 226 | |
209 | 227 | SendPacket(actionCodes.Diner_getSellRewardRpc, MsgPack.pack({reward = reward, change = change})) |
210 | 228 | return true |
... | ... | @@ -254,6 +272,15 @@ function _M.expediteSellRpc( agent, data ) |
254 | 272 | dirty = true |
255 | 273 | end |
256 | 274 | end |
275 | + | |
276 | + role:log("restaurant_sale", { | |
277 | + item_id = sell.dish, -- 售卖物品ID | |
278 | + restaurant_sale_seat = slot, -- 售卖物品所在位置 | |
279 | + restaurant_sale_time = result.deltaTime or 0, -- 售卖时长 | |
280 | + restaurant_sale_type = 1, -- 售卖方式,正常售卖:0, 加速:1,移除售卖:2 | |
281 | + restaurant_sale_coin = rewards[ItemId.DinerCoin] or 0, -- 售卖获得美食币 | |
282 | + restaurant_sale_gear = rewards[ItemId.Gold] or 0, -- 售卖获得齿轮 | |
283 | + }) | |
257 | 284 | end |
258 | 285 | end |
259 | 286 | |
... | ... | @@ -284,8 +311,6 @@ function _M.expediteSellRpc( agent, data ) |
284 | 311 | end |
285 | 312 | role:checkTaskEnter("FoodSellQuick") |
286 | 313 | |
287 | - role:log("diner_action", {desc = "sellQ"}) | |
288 | - | |
289 | 314 | SendPacket(actionCodes.Diner_expediteSellRpc, MsgPack.pack({reward = reward, change = change, popular = popular})) |
290 | 315 | return true |
291 | 316 | end |
... | ... | @@ -325,7 +350,13 @@ function _M.levelUpRpc( agent, data ) |
325 | 350 | role.dinerData:updateProperty({field = "buildL", value = buildL:setv(index, curLevel + 1)}) |
326 | 351 | role:checkTaskEnter("DinerLevelUp", {type = index, level = curLevel + 1}) |
327 | 352 | |
328 | - role:log("diner_action", {desc = "buildUp", int1 = index, int2 = curLevel + 1}) | |
353 | + role:log("restaurant_up", { | |
354 | + restaurant_up_type = index - 1, --升级部件类型,店面:0, 接客:1, 满意度:2, 宣传:3, 广告:4, 周边:5 | |
355 | + restaurant_up_gear = cost[ItemId.Gold] or 0, --消耗齿轮数量 | |
356 | + restaurant_up_coin = cost[ItemId.DinerCoin] or 0, --花费美食币数量 | |
357 | + restaurant_up_effectbef = curLevel, --升级前加成 | |
358 | + restaurant_up_effect = curLevel + 1, --升级后加成 | |
359 | + }) | |
329 | 360 | |
330 | 361 | SendPacket(actionCodes.Diner_levelUpRpc, '') |
331 | 362 | return true |
... | ... | @@ -407,9 +438,14 @@ function _M.talentUpRpc( agent, data ) |
407 | 438 | -- end |
408 | 439 | |
409 | 440 | role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1], level = dishLevel + 1}) |
410 | - | |
411 | - role:log("diner_action", {desc = "talentUp", int1 = dish, int2 = dishLevel + 1}) | |
412 | - | |
441 | + role:finishGuide(27) | |
442 | + role:log("carriage_logistics", { | |
443 | + carriage_logistics_type = typ, -- 后勤室制作类型ID,变异:0,通常:1,魔法:2 | |
444 | + carriage_logistics_itemid = dish, -- 后勤室升级物品或技能ID | |
445 | + carriage_logistics_itemlv = dishLevel + 1, -- 升级后物品或技能等级 | |
446 | + carriage_logistics_gear = cost[ItemId.Gold] or 0, -- 后勤室升级花费齿轮数量 | |
447 | + carriage_logistics_coin = cost[ItemId.DinerCoin] or 0, -- 后勤室升级花费美食币数量 | |
448 | + }) | |
413 | 449 | SendPacket(actionCodes.Diner_talentUpRpc, '') |
414 | 450 | return true |
415 | 451 | end |
... | ... | @@ -443,7 +479,6 @@ function _M.skillUpRpc( agent, data ) |
443 | 479 | |
444 | 480 | role:costItems(cost, {log = {desc = "dinerSkillUp", int1 = skill, int2 = skillLevel + 1}}) |
445 | 481 | role.dinerData:updateProperty({field = "skillTree", value = skillTree:setv(skill, skillLevel + 1)}) |
446 | - role:log("diner_action", {desc = "skillUp", int1 = skill, int2 = skillLevel + 1}) | |
447 | 482 | |
448 | 483 | SendPacket(actionCodes.Diner_skillUpRpc, '') |
449 | 484 | return true |
... | ... | @@ -471,8 +506,6 @@ function _M.lockTaskRpc( agent, data ) |
471 | 506 | end |
472 | 507 | role.dinerData:updateProperty({field = "order", value = json.encode(orders)}) |
473 | 508 | |
474 | - role:log("diner_action", {desc = "lockTask", int1 = order.id}) | |
475 | - | |
476 | 509 | SendPacket(actionCodes.Diner_lockTaskRpc, MsgPack.pack({lock = order.lock})) |
477 | 510 | return true |
478 | 511 | end |
... | ... | @@ -509,8 +542,6 @@ function _M.updateTaskRpc( agent, data ) |
509 | 542 | orders[index].status = 1 |
510 | 543 | orders[index].lock = 1 |
511 | 544 | |
512 | - role:log("diner_action", {desc = "getTask", int1 = order.id}) | |
513 | - | |
514 | 545 | role:checkTaskEnter("GetOderTask", {rarity = taskSet.rarity}) |
515 | 546 | elseif cmd == 1 then |
516 | 547 | if order.status ~= 1 then |
... | ... | @@ -519,8 +550,6 @@ function _M.updateTaskRpc( agent, data ) |
519 | 550 | orders[index].status = 0 |
520 | 551 | orders[index].lock = 0 |
521 | 552 | |
522 | - role:log("diner_action", {desc = "deleteTask", int1 = order.id}) | |
523 | - | |
524 | 553 | elseif cmd == 2 then |
525 | 554 | if order.status ~= 1 then |
526 | 555 | return 32 |
... | ... | @@ -528,7 +557,6 @@ function _M.updateTaskRpc( agent, data ) |
528 | 557 | if order.n < taskData.value then |
529 | 558 | return 6 |
530 | 559 | end |
531 | - role:log("diner_action", {desc = "finishTask", int1 = order.id}) | |
532 | 560 | |
533 | 561 | reward, change = role:award(taskData.reward, {log = {desc = "dinerFinishTask", int1 = order.id}}) |
534 | 562 | table.remove(orders,index) |
... | ... | @@ -537,6 +565,14 @@ function _M.updateTaskRpc( agent, data ) |
537 | 565 | return 33 |
538 | 566 | end |
539 | 567 | |
568 | + | |
569 | + role:log("restaurant_order", { | |
570 | + restaurant_order_id = order.id, -- 订单任务ID | |
571 | + restaurant_order_status = cmd, -- 订单任务状态,接受:0, 拒绝:1, 完成:2 | |
572 | + restaurant_order_rwd = reward, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
573 | + restaurant_order_lv = taskSet.rarity, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3 | |
574 | + }) | |
575 | + | |
540 | 576 | role.dinerData:updateProperty({field = "order", value = json.encode(orders)}) |
541 | 577 | SendPacket(actionCodes.Diner_updateTaskRpc, MsgPack.pack({reward = reward, change = change})) |
542 | 578 | return true |
... | ... | @@ -611,8 +647,7 @@ function _M.refreshTaskRpc( agent, data ) |
611 | 647 | end |
612 | 648 | end |
613 | 649 | |
614 | - role:log("diner_action", {desc = "reTask"}) | |
615 | - | |
650 | + role:finishGuide(41) | |
616 | 651 | role.dinerData:updateProperty({field = "order", value = json.encode(orders)}) |
617 | 652 | |
618 | 653 | SendPacket(actionCodes.Diner_refreshTaskRpc, '') |
... | ... | @@ -652,8 +687,7 @@ function _M.addWantFoodRpc(agent , data) |
652 | 687 | gfood[slot] = {id = itemId, st = skynet.timex()} |
653 | 688 | end |
654 | 689 | |
655 | - role:log("diner_action", {desc = "wantFood"}) | |
656 | - | |
690 | + role:finishGuide(36) | |
657 | 691 | role.dinerData:updateProperty({field = "gfood", value = gfood}) |
658 | 692 | |
659 | 693 | SendPacket(actionCodes.Diner_addWantFoodRpc, '') |
... | ... | @@ -687,12 +721,19 @@ function _M.getGreenhouseRpc( agent, data ) |
687 | 721 | else |
688 | 722 | gfood[k].st = st + speed * reward[itemId] |
689 | 723 | end |
724 | + | |
725 | + role:log("restaurant_material", { | |
726 | + item_id = itemId, -- 获取物品ID | |
727 | + restaurant_material_start = st, -- 申请获取时间 | |
728 | + restaurant_material_time = endTime2 - st, -- 申请到领取耗时 | |
729 | + restaurant_material_num = reward[itemId], -- 获取物品数量 | |
730 | + }) | |
731 | + | |
690 | 732 | end |
691 | 733 | role.dinerData:updateProperty({field = "gfood", value = gfood}) |
692 | 734 | local reward, change = role:award(reward, {log = {desc = "greenHourse", int1 = level}}) |
693 | 735 | role:checkTaskEnter("FoodMGet") |
694 | 736 | |
695 | - role:log("diner_action", {desc = "greenHourse"}) | |
696 | 737 | |
697 | 738 | SendPacket(actionCodes.Diner_getGreenhouseRpc, MsgPack.pack({reward = reward, change = change})) |
698 | 739 | return true |
... | ... | @@ -830,7 +871,7 @@ function _M.entrustRpc(agent , data) |
830 | 871 | end |
831 | 872 | role.dinerData:updateProperty({field = "entrust", value = entrust}) |
832 | 873 | |
833 | - role:log("diner_action", {desc = "entrus", short1 = ctype, int1 = entrustId}) | |
874 | + role:finishGuide(26) | |
834 | 875 | |
835 | 876 | SendPacket(actionCodes.Diner_entrustRpc, MsgPack.pack({reward = reward, change = change})) |
836 | 877 | return true |
... | ... | @@ -856,7 +897,17 @@ function _M.collectRpc(agent , data) |
856 | 897 | local reward, change = role:award(customerData.reward, {log = {desc = "dinerCollect", int1 = id}}) |
857 | 898 | customer[id] = 1 |
858 | 899 | role.dinerData:updateProperty({field = "customer", value = customer}) -- 解锁了 |
859 | - role:log("diner_action", {desc = "collect", int1 = id}) | |
900 | + | |
901 | + local count = 0 | |
902 | + for c_, v in pairs(customer) do | |
903 | + count = count + 1 | |
904 | + end | |
905 | + | |
906 | + role:log("restaurant_collect", { | |
907 | + restaurant_collect_id = id, -- 图谱收集ID | |
908 | + restaurant_collect_rwd = reward, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
909 | + restaurant_collect_plan = count, -- 收集进度,即解锁顾客,数字表示 | |
910 | + }) | |
860 | 911 | |
861 | 912 | SendPacket(actionCodes.Diner_collectRpc, MsgPack.pack({reward = reward, change = change})) |
862 | 913 | return true |
... | ... | @@ -886,8 +937,6 @@ function _M.comboRewardRpc(agent , data) |
886 | 937 | |
887 | 938 | role.dinerData:updateProperty({field = "comboStatus", value = comboStatus}) -- 解锁了 |
888 | 939 | |
889 | - role:log("diner_action", {desc = "combo", int1 = id}) | |
890 | - | |
891 | 940 | SendPacket(actionCodes.Diner_comboRewardRpc, MsgPack.pack({reward = reward, change = change})) |
892 | 941 | return true |
893 | 942 | end | ... | ... |
src/actions/EmailAction.lua
... | ... | @@ -53,7 +53,6 @@ function _M.listRpc(agent, data) |
53 | 53 | content = email.content, |
54 | 54 | attachments = email.attachments |
55 | 55 | }) |
56 | - role:log("mail_action", {desc = "get_global", key1 = email.title, key2 = email.attachments}) | |
57 | 56 | end |
58 | 57 | end |
59 | 58 | end |
... | ... | @@ -90,21 +89,17 @@ function _M.drawAllAttachRpc(agent, data) |
90 | 89 | local ids = {} |
91 | 90 | |
92 | 91 | local emails = loadEmails(roleId) |
93 | - redisproxy:pipelining(function (red) | |
94 | - for _, email in ipairs(emails) do | |
95 | - local attachments = getEmailAttachments(email) | |
96 | - if attachments ~= "" then | |
97 | - local emailId = email:getProperty("id") | |
98 | - ids[emailId] = 1 | |
99 | - red:hset(string.format(R_EMAIL_ITEM, roleId, emailId), "status", 2) | |
100 | - role:log("mail_action", {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title"), key2 = attachments}) | |
101 | - | |
102 | - for key, v in pairs(attachments:toNumMap()) do | |
103 | - reward[key] = (reward[key] or 0) + v | |
104 | - end | |
92 | + for _, email in ipairs(emails) do | |
93 | + local attachments = getEmailAttachments(email) | |
94 | + if attachments ~= "" then | |
95 | + email:setProperty("status", 2) | |
96 | + email:log(role, 2) | |
97 | + ids[email:getProperty("id")] = 1 | |
98 | + for key, v in pairs(attachments:toNumMap()) do | |
99 | + reward[key] = (reward[key] or 0) + v | |
105 | 100 | end |
106 | 101 | end |
107 | - end) | |
102 | + end | |
108 | 103 | reward, change = role:award(reward, {log = {desc = "draw_attach"}}) |
109 | 104 | SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change})) |
110 | 105 | return true |
... | ... | @@ -124,11 +119,11 @@ function _M.drawAttachRpc(agent, data) |
124 | 119 | local attachments = getEmailAttachments(email) |
125 | 120 | if attachments == "" then return end |
126 | 121 | |
127 | - local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title")}}) | |
128 | - redisproxy:hset(rds, "status", 2) -- 领取标记 | |
122 | + local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId}}) | |
123 | + email:setProperty("status", 2) | |
124 | + email:log(role, 2) | |
129 | 125 | SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change})) |
130 | 126 | |
131 | - role:log("mail_action", {desc = "draw_attach", int1 = id, key1 = email:getProperty("title"), key2 = attachments}) | |
132 | 127 | return true |
133 | 128 | end |
134 | 129 | |
... | ... | @@ -139,11 +134,12 @@ function _M.checkRpc(agent, data) |
139 | 134 | local msg = MsgPack.unpack(data) |
140 | 135 | local id = msg.id |
141 | 136 | |
142 | - local rds = string.format(R_EMAIL_ITEM, roleId, id) | |
143 | - if not redisproxy:exists(rds) then return end | |
137 | + local emailRds = string.format("email:%d:%s", roleId, id) | |
138 | + local email = require("models.Email").new({key = emailRds}) | |
139 | + if not email:load() then return end | |
144 | 140 | |
145 | - redisproxy:hset(rds, "status", 1) | |
146 | - role:log("mail_action", {desc = "check_mail", int1 = id}) | |
141 | + email:setProperty("status", 1) | |
142 | + email:log(role, 1) | |
147 | 143 | |
148 | 144 | SendPacket(actionCodes.Email_checkRpc, '') |
149 | 145 | return true |
... | ... | @@ -171,6 +167,7 @@ function _M.delRpc(agent, data) |
171 | 167 | attachments = emailData.attachment |
172 | 168 | end |
173 | 169 | if status == 2 or (status == 1 and attachments:len() == 0) then |
170 | + email:log(role, 3) | |
174 | 171 | red:lrem(rds, 0, id) |
175 | 172 | red:del(emailRds) |
176 | 173 | result[tonum(id)] = 1 |
... | ... | @@ -178,9 +175,6 @@ function _M.delRpc(agent, data) |
178 | 175 | end |
179 | 176 | end |
180 | 177 | end) |
181 | - for delId, _ in ipairs(result) do | |
182 | - role:log("mail_action", {desc = "del_mail", int1 = delId}) | |
183 | - end | |
184 | 178 | SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result})) |
185 | 179 | return true |
186 | 180 | end | ... | ... |
src/actions/FriendAction.lua
... | ... | @@ -111,7 +111,6 @@ function _M.searchRpc(agent, data) |
111 | 111 | })) |
112 | 112 | end |
113 | 113 | |
114 | - role:log("role_action", {desc = "searchFriend"}) | |
115 | 114 | SendPacket(actionCodes.Friend_searchRpc, MsgPack.pack({searchList = searchList})) |
116 | 115 | return true |
117 | 116 | end |
... | ... | @@ -178,8 +177,6 @@ function _M.applyRpc(agent, data) |
178 | 177 | myInfo.online = true |
179 | 178 | myInfo.hadApply = true |
180 | 179 | |
181 | - role:log("role_action", {desc = "addFriend", int1 = 1}) | |
182 | - | |
183 | 180 | rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newApply = 1, info = {myInfo}})) -- 通知对方 |
184 | 181 | end |
185 | 182 | |
... | ... | @@ -217,6 +214,7 @@ local function checkHandleApply(roleId, objectId, needAddNew) |
217 | 214 | red:sismember(FRIEND_BLACK_KEY:format(objectId), roleId) |
218 | 215 | red:sismember(FRIEND_BLACK_KEY:format(roleId), objectId) |
219 | 216 | end) |
217 | + | |
220 | 218 | --自己好友满了 |
221 | 219 | if (redret[1] + needAddNew) >= globalCsv.friendListLimit then |
222 | 220 | return 1 |
... | ... | @@ -233,6 +231,8 @@ local function checkHandleApply(roleId, objectId, needAddNew) |
233 | 231 | if redret[4] == 1 then |
234 | 232 | return 4 |
235 | 233 | end |
234 | + | |
235 | + return nil, redret[1] | |
236 | 236 | end |
237 | 237 | |
238 | 238 | function _M.handleApplyRpc(agent, data) |
... | ... | @@ -251,7 +251,8 @@ function _M.handleApplyRpc(agent, data) |
251 | 251 | if not redisproxy:zscore(FRIEND_APPLY_KEY:format(roleId), objectId) then |
252 | 252 | return |
253 | 253 | end |
254 | - result = checkHandleApply(roleId, objectId) | |
254 | + local curCount | |
255 | + result, curCount = checkHandleApply(roleId, objectId) | |
255 | 256 | |
256 | 257 | if not result then |
257 | 258 | redisproxy:pipelining(function (red) |
... | ... | @@ -277,8 +278,11 @@ function _M.handleApplyRpc(agent, data) |
277 | 278 | otherInfo.pGet = redret[2] == 1 and 1 or nil |
278 | 279 | SendPacket(actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = {otherInfo}})) |
279 | 280 | |
280 | - role:log("role_action", {desc = "addFriend", int1 = 1}) | |
281 | - | |
281 | + role:log("friend_opt", { | |
282 | + friend_opt_type = 100, -- 好友操作类型,见枚举表中 好友操作类型枚举表 | |
283 | + friend_roleid = objectId, -- 好友账户下的角色id | |
284 | + friend_cnt = curCount + 1, -- 操作后好友数量 | |
285 | + }) | |
282 | 286 | end |
283 | 287 | |
284 | 288 | elseif cmd == 0 then -- 不同意 |
... | ... | @@ -301,7 +305,7 @@ function _M.handleApplyRpc(agent, data) |
301 | 305 | local needAddInfo = {} |
302 | 306 | for _, objId in ipairs(allIds) do |
303 | 307 | objId = tonumber(objId) |
304 | - local cr = checkHandleApply(roleId, objId, #needAdd) | |
308 | + local cr, curCount = checkHandleApply(roleId, objId, #needAdd) | |
305 | 309 | if not cr then |
306 | 310 | table.insert(needAdd, objId) |
307 | 311 | table.insert(needAddMy, objId) |
... | ... | @@ -312,6 +316,12 @@ function _M.handleApplyRpc(agent, data) |
312 | 316 | otherInfo.isFriend = true |
313 | 317 | otherInfo.pGet = fpoint[objId] and 1 or nil |
314 | 318 | table.insert(needAddInfo, otherInfo) |
319 | + | |
320 | + role:log("friend_opt", { | |
321 | + friend_opt_type = 100, -- 好友操作类型,见枚举表中 好友操作类型枚举表 | |
322 | + friend_roleid = objId, -- 好友账户下的角色id | |
323 | + friend_cnt = curCount + 1, -- 操作后好友数量 | |
324 | + }) | |
315 | 325 | end |
316 | 326 | end |
317 | 327 | |
... | ... | @@ -337,8 +347,6 @@ function _M.handleApplyRpc(agent, data) |
337 | 347 | rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = {myInfo}})) -- 通知对方 |
338 | 348 | end |
339 | 349 | if next(needAdd) then |
340 | - role:log("role_action", {desc = "addFriend", int1 = #needAdd}) | |
341 | - | |
342 | 350 | SendPacket(actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = needAddInfo})) |
343 | 351 | else |
344 | 352 | result = 1 |
... | ... | @@ -420,6 +428,11 @@ function _M.deleteRpc(agent, data) |
420 | 428 | end |
421 | 429 | rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({deleteFriend = 1, roleId = roleId})) |
422 | 430 | |
431 | + role:log("friend_opt", { | |
432 | + friend_opt_type = 200, -- 好友操作类型,见枚举表中 好友操作类型枚举表 | |
433 | + friend_roleid = objectId, -- 好友账户下的角色id | |
434 | + friend_cnt = 0, -- 操作后好友数量 | |
435 | + }) | |
423 | 436 | SendPacket(actionCodes.Friend_deleteRpc, MsgPack.pack("")) |
424 | 437 | return true |
425 | 438 | end |
... | ... | @@ -449,15 +462,18 @@ function _M.blockRpc(agent, data) |
449 | 462 | red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId) |
450 | 463 | red:sadd(FRIEND_BLACK_KEY:format(roleId), objectId) |
451 | 464 | end) |
452 | - rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({deleteFriend = 1, roleId = roleId})) | |
453 | - | |
465 | + rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({deleteFriend = 1, roleId = roleId})) | |
466 | + role:log("friend_opt", { | |
467 | + friend_opt_type = 300, -- 好友操作类型,见枚举表中 好友操作类型枚举表 | |
468 | + friend_roleid = objectId, -- 好友账户下的角色id | |
469 | + friend_cnt = 0, -- 操作后好友数量 | |
470 | + }) | |
454 | 471 | end |
455 | 472 | elseif cmd == 2 then |
456 | 473 | redisproxy:SREM(FRIEND_BLACK_KEY:format(roleId), objectId) |
457 | 474 | else |
458 | 475 | return |
459 | 476 | end |
460 | - | |
461 | 477 | SendPacket(actionCodes.Friend_blockRpc, MsgPack.pack({result = result})) |
462 | 478 | return true |
463 | 479 | end |
... | ... | @@ -537,8 +553,6 @@ function _M.pointRpc(agent, data) |
537 | 553 | role.dailyData:updateProperty({field = "giveFP", value = giveP}) |
538 | 554 | role:checkTaskEnter("GiveFriendP", {count = 1}) |
539 | 555 | rpcRole(objId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newPoint = 1, roleId = roleId})) |
540 | - | |
541 | - role:log("role_action", {desc = "giveFPoint", int1 = 1}) | |
542 | 556 | end |
543 | 557 | elseif cmd == 2 then -- 领取 |
544 | 558 | local objId = msg.roleId |
... | ... | @@ -558,7 +572,6 @@ function _M.pointRpc(agent, data) |
558 | 572 | role.dailyData:updateProperty({field = "getFP", value = getP}) |
559 | 573 | role:checkTaskEnter("GetFriendP", {count = 1}) |
560 | 574 | |
561 | - role:log("role_action", {desc = "getFPoint", int1 = 1}) | |
562 | 575 | end |
563 | 576 | elseif cmd == 3 then -- 一键赠送领取 |
564 | 577 | -- 赠送 |
... | ... | @@ -580,8 +593,6 @@ function _M.pointRpc(agent, data) |
580 | 593 | role.dailyData:updateProperty({field = "giveFP", value = giveP}) |
581 | 594 | role:checkTaskEnter("GiveFriendP", {count = change}) |
582 | 595 | |
583 | - role:log("role_action", {desc = "giveFPoint", int1 = change}) | |
584 | - | |
585 | 596 | else |
586 | 597 | result = 1 |
587 | 598 | end |
... | ... | @@ -606,7 +617,6 @@ function _M.pointRpc(agent, data) |
606 | 617 | reward = role:award({[ItemId.FriendPoint] = getCount}, {log = {desc = "friendPoint"}}) |
607 | 618 | role.dailyData:updateProperty({field = "getFP", value = getP}) |
608 | 619 | role:checkTaskEnter("GetFriendP", {count = getCount}) |
609 | - role:log("role_action", {desc = "getFPoint", int1 = getCount}) | |
610 | 620 | else |
611 | 621 | result = (result or 0) + 2 |
612 | 622 | end | ... | ... |
src/actions/GmAction.lua
... | ... | @@ -27,7 +27,6 @@ function _M.ignoreout(role, pms) |
27 | 27 | else -- 解除 |
28 | 28 | role:updateProperty({field = "ignoreMt", value = 0}) |
29 | 29 | end |
30 | - role:log("gm_action", {desc = "ignoreout", key1 = pms.sender}) | |
31 | 30 | return "指令生效" |
32 | 31 | end |
33 | 32 | |
... | ... | @@ -47,17 +46,11 @@ function _M.ban(role, pms) |
47 | 46 | end) |
48 | 47 | end |
49 | 48 | end |
50 | - | |
51 | - role:log("gm_action", {desc = "ban", int1 = time, int2 = ctype, key1 = pms.sender}) | |
52 | - | |
53 | 49 | return isBan and "解封杀成功" or "封杀成功" |
54 | 50 | end |
55 | 51 | |
56 | 52 | function _M.unban(role, pms) |
57 | 53 | role:setBan(0, 0) |
58 | - | |
59 | - role:log("gm_action", {desc = "unban", key1 = pms.sender}) | |
60 | - | |
61 | 54 | return "解封杀成功" |
62 | 55 | end |
63 | 56 | |
... | ... | @@ -70,8 +63,6 @@ function _M.gmmsg(role, pms) |
70 | 63 | skynet.call(agent.gate_serv, "lua", "forcekick", agent.fd) |
71 | 64 | end) |
72 | 65 | end |
73 | - role:log("gm_action", {desc = "gmmsg", text1 = pms.pm1, key1 = pms.sender}) | |
74 | - | |
75 | 66 | return "指令成功" |
76 | 67 | end |
77 | 68 | |
... | ... | @@ -82,8 +73,6 @@ function _M.silent(role, pms) |
82 | 73 | return "解禁言成功" |
83 | 74 | end |
84 | 75 | role:updateProperty({field = "silent", value = specTime({hour = 0}, skynet.timex()) + pm1 * 86400}) |
85 | - | |
86 | - role:log("gm_action", {desc = "silent", int1 = pms.pm1, key1 = pms.sender}) | |
87 | 76 | return "禁言成功" |
88 | 77 | end |
89 | 78 | |
... | ... | @@ -101,8 +90,6 @@ function _M.hero(role, pms) |
101 | 90 | if not role:addHero({type = heroType, log = {desc = "gm"}}) then |
102 | 91 | return "失败" |
103 | 92 | end |
104 | - | |
105 | - role:log("gm_action", {desc = "hero", int1 = heroType, key1 = pms.sender}) | |
106 | 93 | return "成功" |
107 | 94 | end |
108 | 95 | |
... | ... | @@ -135,8 +122,6 @@ function _M.herol(role, pms) |
135 | 122 | hero:updateProperty({field = "level", delta = addLevel}) |
136 | 123 | role:checkTaskEnter("HeroLevelUp", {level = hero:getProperty("level")}) |
137 | 124 | |
138 | - role:log("gm_action", {desc = "herol", int1 = heroType, int2 = addLevel, key1 = pms.sender}) | |
139 | - | |
140 | 125 | return "成功" |
141 | 126 | end |
142 | 127 | |
... | ... | @@ -148,8 +133,6 @@ function _M.herola(role, pms) |
148 | 133 | _M.herol(role, {pm1 = hero:getProperty("type"), pm2 = addLevel}) |
149 | 134 | end |
150 | 135 | |
151 | - role:log("gm_action", {desc = "herola", int1 = addLevel, key1 = pms.sender}) | |
152 | - | |
153 | 136 | return "成功" |
154 | 137 | end |
155 | 138 | |
... | ... | @@ -160,7 +143,6 @@ function _M.equip(role, pms) |
160 | 143 | local level = tonum(pms.pm2) |
161 | 144 | local count = tonum(pms.pm3) |
162 | 145 | role:addEquip(typ, level, count, {log = {desc = "gm"}}) |
163 | - role:log("gm_action", {desc = "equip", int1 = typ, int2 = level, long1 = count, key1 = pms.sender}) | |
164 | 146 | return "成功" |
165 | 147 | end |
166 | 148 | |
... | ... | @@ -169,7 +151,6 @@ function _M.rune(role, pms) |
169 | 151 | local typ = tonum(pms.pm1) |
170 | 152 | local id = tonum(pms.pm2) |
171 | 153 | local result = role:addRune({type = typ,id = id, log = {desc = "gm"}}) |
172 | - role:log("gm_action", {desc = "rune", int1 = typ, int2 = id, key1 = pms.sender}) | |
173 | 154 | |
174 | 155 | return result |
175 | 156 | end |
... | ... | @@ -190,8 +171,6 @@ function _M.fb(role, pms) -- 直接通关 |
190 | 171 | role:hangFinish(carbonId) |
191 | 172 | addPre(carbonId) |
192 | 173 | |
193 | - role:log("gm_action", {desc = "fb", int1 = carbonId, key1 = pms.sender}) | |
194 | - | |
195 | 174 | role:checkTaskEnter("HangPass", {id = carbonId}) |
196 | 175 | return "成功" |
197 | 176 | end |
... | ... | @@ -212,8 +191,6 @@ function _M.fbc(role, pms) -- 直接通关 |
212 | 191 | end |
213 | 192 | role:updateProperty({field = "hangPass", value = {}}) |
214 | 193 | addPre(carbonId) |
215 | - | |
216 | - role:log("gm_action", {desc = "fbc", int1 = carbonId, key1 = pms.sender}) | |
217 | 194 | |
218 | 195 | return "成功" |
219 | 196 | end |
... | ... | @@ -247,8 +224,6 @@ function _M.exp(role, pms) |
247 | 224 | exp = math.floor(math.max(exp, 0)) |
248 | 225 | role:addPlayExp(exp, {log = {desc = "gm"}}) |
249 | 226 | |
250 | - role:log("gm_action", {desc = "exp", int1 = exp, key1 = pms.sender}) | |
251 | - | |
252 | 227 | return "成功" |
253 | 228 | end |
254 | 229 | |
... | ... | @@ -305,7 +280,6 @@ function _M.get(role, pms) |
305 | 280 | end |
306 | 281 | local count = tonum(pms.pm2, 1) |
307 | 282 | role:award({[itemId] = count}, {log = {desc = "gm"}}) |
308 | - role:log("gm_action", {desc = "get", int1 = itemId, int2 = count, key1 = pms.sender}) | |
309 | 283 | end |
310 | 284 | return "成功" |
311 | 285 | end |
... | ... | @@ -329,9 +303,6 @@ function _M.advc(role, pms) |
329 | 303 | advAFWear = {}, |
330 | 304 | }, notNotify) |
331 | 305 | role.advData = nil |
332 | - | |
333 | - role:log("gm_action", {desc = "advc", key1 = pms.sender}) | |
334 | - | |
335 | 306 | return "成功" |
336 | 307 | end |
337 | 308 | |
... | ... | @@ -340,8 +311,6 @@ function _M.advf(role, pms) |
340 | 311 | role:updateProperty({field = "advC", value = 0}) |
341 | 312 | role.dailyData:updateProperty({field = "advElC", value = 0}) |
342 | 313 | |
343 | - role:log("gm_action", {desc = "advf", key1 = pms.sender}) | |
344 | - | |
345 | 314 | return "成功" |
346 | 315 | end |
347 | 316 | |
... | ... | @@ -361,7 +330,6 @@ function _M.adv(role, pms) |
361 | 330 | advPass[chapterId] = layer |
362 | 331 | role:updateProperty({field = "advPass", value = advPass}) |
363 | 332 | end |
364 | - role:log("gm_action", {desc = "adv", int1 = chapterId, int2 = layer, key1 = pms.sender}) | |
365 | 333 | |
366 | 334 | return "成功" |
367 | 335 | end |
... | ... | @@ -388,7 +356,6 @@ function _M.advt(role, pms) |
388 | 356 | isEnter = true, |
389 | 357 | debugMapId = mapId, |
390 | 358 | }) |
391 | - role:log("gm_action", {desc = "advt", int1 = chapterId, int2 = layer, key1 = pms.sender}) | |
392 | 359 | return "成功" |
393 | 360 | end |
394 | 361 | |
... | ... | @@ -397,8 +364,6 @@ function _M.advl(role, pms) |
397 | 364 | local exp = tonum(pms.pm1) |
398 | 365 | role:addAdvLvExp(math.max(0, exp)) |
399 | 366 | |
400 | - role:log("gm_action", {desc = "advl", int1 = exp, key1 = pms.sender}) | |
401 | - | |
402 | 367 | return "成功" |
403 | 368 | end |
404 | 369 | |
... | ... | @@ -412,7 +377,6 @@ function _M.advcl(role, pms) |
412 | 377 | end |
413 | 378 | advData.battle.player:addExp(exp) |
414 | 379 | advData:saveDB() |
415 | - role:log("gm_action", {desc = "advcl", int1 = exp, key1 = pms.sender}) | |
416 | 380 | |
417 | 381 | return "成功" |
418 | 382 | end |
... | ... | @@ -422,7 +386,6 @@ function _M.idlec(role, pms) |
422 | 386 | role:updateProperty({field = "hangTeam", value = {}}) |
423 | 387 | role:updateProperty({field = "hangInfo", value = {}}) |
424 | 388 | role:updateProperty({field = "hangBag", value = {}}) |
425 | - role:log("gm_action", {desc = "idlec", key1 = pms.sender}) | |
426 | 389 | |
427 | 390 | role.advData = nil |
428 | 391 | return "成功" |
... | ... | @@ -447,8 +410,6 @@ function _M.advit(role, pms) |
447 | 410 | local itemId = tonum(pms.pm1) |
448 | 411 | local count = tonum(pms.pm2) |
449 | 412 | reward[itemId] = count |
450 | - | |
451 | - role:log("gm_action", {desc = "advit", int1 = itemId, int2 = count, key1 = pms.sender}) | |
452 | 413 | end |
453 | 414 | |
454 | 415 | |
... | ... | @@ -464,8 +425,6 @@ function _M.tower(role, pms) |
464 | 425 | if not csvdb["tower_battleCsv"][level] then return "不存在" end |
465 | 426 | role:updateProperty({field = "towerInfo", value = {c = globalCsv.tower_count_limit, l = level}}) |
466 | 427 | |
467 | - role:log("gm_action", {desc = "tower", int1 = level, key1 = pms.sender}) | |
468 | - | |
469 | 428 | return "成功" |
470 | 429 | end |
471 | 430 | |
... | ... | @@ -484,8 +443,6 @@ function _M.email(role, pms) |
484 | 443 | rewardPms = id ~= 0 and reward or nil, |
485 | 444 | }) |
486 | 445 | |
487 | - role:log("gm_action", {desc = "email", int1 = id, key1 = pms.sender}) | |
488 | - | |
489 | 446 | return "成功" |
490 | 447 | end |
491 | 448 | |
... | ... | @@ -503,7 +460,6 @@ function _M.cguide(role, pms) |
503 | 460 | role:updateProperty({field = "funcGuide", value = ""}) |
504 | 461 | end |
505 | 462 | |
506 | - role:log("gm_action", {desc = "cguide", int1 = id, key1 = pms.sender}) | |
507 | 463 | return "成功" |
508 | 464 | end |
509 | 465 | ... | ... |
src/actions/HangAction.lua
... | ... | @@ -39,9 +39,9 @@ local function checkReward(role) |
39 | 39 | |
40 | 40 | local items = role:getProperty("hangBag") |
41 | 41 | coinCount = coinCount + coinDoubleCount |
42 | - items[ItemId.Gold] = (items[ItemId.Gold] or 0) + coinCount * carbonData.money | |
43 | - items[ItemId.Exp] = (items[ItemId.Exp] or 0) + coinCount * carbonData.exp | |
44 | - items[ItemId.PlayerExp] = (items[ItemId.PlayerExp] or 0) + coinCount * carbonData.playerExp | |
42 | + items[ItemId.Gold] = math.floor((items[ItemId.Gold] or 0) + coinCount * carbonData.money) | |
43 | + items[ItemId.Exp] = math.floor((items[ItemId.Exp] or 0) + coinCount * carbonData.exp) | |
44 | + items[ItemId.PlayerExp] = math.floor((items[ItemId.PlayerExp] or 0) + coinCount * carbonData.playerExp) | |
45 | 45 | |
46 | 46 | local pool = {} |
47 | 47 | for _, temp in pairs(carbonData.item:toArray()) do |
... | ... | @@ -69,7 +69,7 @@ local function checkReward(role) |
69 | 69 | while #tempPool > 0 do |
70 | 70 | local idx = math.randWeight(tempPool, 3) |
71 | 71 | local cur = clone(pool[idx]) |
72 | - if cur[1] ~= 1 then -- 轮空 id | |
72 | + if cur[1] ~= 0 then -- 轮空 id | |
73 | 73 | if cur[1] == ItemId.BreakCost and doubleTime > 0 then |
74 | 74 | cur[2] = cur[2] * 2 |
75 | 75 | end |
... | ... | @@ -156,7 +156,16 @@ function _M.startRpc( agent, data ) |
156 | 156 | end |
157 | 157 | role:updateProperty({field = "hangInfo", value = hangInfo}) |
158 | 158 | |
159 | - role:log("hang_action", {desc = "startHang", int1 = carbonId}) | |
159 | + -- 指定当前引导的步骤 | |
160 | + if carbonId == 10101 then | |
161 | + role:saveGuide(5,11) | |
162 | + elseif carbonId == 10102 then | |
163 | + role:saveGuide(8,2) | |
164 | + elseif carbonId == 10103 then | |
165 | + role:saveGuide(9,2) | |
166 | + elseif carbonId == 10220 then | |
167 | + role:saveGuide(22,1) | |
168 | + end | |
160 | 169 | |
161 | 170 | SendPacket(actionCodes.Hang_startRpc, '') |
162 | 171 | return true |
... | ... | @@ -211,6 +220,7 @@ function _M.endBattleRpc(agent, data) |
211 | 220 | return true |
212 | 221 | end |
213 | 222 | local carbonId = msg.carbonId |
223 | + local isWin = msg.starNum and msg.starNum > 0 | |
214 | 224 | local carbonData = csvdb["idle_battleCsv"][carbonId] |
215 | 225 | if not carbonData then |
216 | 226 | return 2 |
... | ... | @@ -224,8 +234,9 @@ function _M.endBattleRpc(agent, data) |
224 | 234 | if role:checkHangPass(carbonId) then |
225 | 235 | return 4 |
226 | 236 | end |
237 | + | |
227 | 238 | local reward, change |
228 | - if msg.starNum and msg.starNum > 0 then --win | |
239 | + if isWin then --win | |
229 | 240 | role:hangFinish(carbonId) |
230 | 241 | if carbonData.main ~= 1 then |
231 | 242 | hangInfo.bossTime = nil |
... | ... | @@ -241,11 +252,35 @@ function _M.endBattleRpc(agent, data) |
241 | 252 | reward, change = role:award(reward, {log = {desc = "hangBattle", int1 = carbonId}}) |
242 | 253 | |
243 | 254 | role:checkTaskEnter("HangPass", {id = carbonId}) |
255 | + | |
256 | + -- 引导 | |
257 | + if carbonId == 10101 then | |
258 | + role:finishGuide(5) | |
259 | + elseif carbonId == 10102 then | |
260 | + role:finishGuide(8) | |
261 | + elseif carbonId == 10103 then | |
262 | + role:finishGuide(9) | |
263 | + elseif carbonId == 10220 then | |
264 | + role:finishGuide(22) | |
265 | + end | |
266 | + for _, guideData in pairs(csvdb["guide_unlockCsv"]) do | |
267 | + if guideData.type == 3 and guideData.carbonId == carbonId then | |
268 | + role:saveGuide(guideData.guideId,1,true) | |
269 | + break | |
270 | + end | |
271 | + end | |
272 | + end | |
273 | + if hangInfo.carbonId < carbonId then | |
274 | + hangInfo.carbonId = carbonId | |
244 | 275 | end |
245 | 276 | role:updateProperty({field = "hangInfo", value = hangInfo}) |
246 | 277 | |
247 | - local team = role:getProperty("pvpTC") | |
248 | - role:log("hang_action", {desc = "hangBattle", short1 = msg.starNum > 0 and 1 or 0, int1 = carbonId, int2 = role:getProperty("hangTBV"), cint1 = role:getHerosCamp(team.heros)}) | |
278 | + role:checkBattle("hang", { | |
279 | + id = carbonId, | |
280 | + isWin = isWin, | |
281 | + info = msg.info, | |
282 | + reward = reward, | |
283 | + }) | |
249 | 284 | |
250 | 285 | SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({ |
251 | 286 | starNum = msg.starNum, |
... | ... | @@ -312,6 +347,17 @@ function _M.getRewardRpc(agent , data) |
312 | 347 | if reward[ItemId.Gold] then |
313 | 348 | role:checkTaskEnter("HangGetGold", {count = reward[ItemId.Gold]}) |
314 | 349 | end |
350 | + | |
351 | + role:log("residence_reward", { | |
352 | + mission_threadid = math.floor(hangInfo.carbonId / 10000), --大关卡ID | |
353 | + mission_id = hangInfo.carbonId, --关卡ID | |
354 | + mission_type = 100, --关卡类型,见关卡类型枚举表 | |
355 | + residence_reward_type = 0, --领取奖励方式,快速(超前领取)记录为1,正常领取记录为0 | |
356 | + residence_time = 0, --挂机或排名时长 | |
357 | + residence_reward = reward, --获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
358 | + }) | |
359 | + | |
360 | + | |
315 | 361 | SendPacket(actionCodes.Hang_getRewardRpc, MsgPack.pack({ |
316 | 362 | reward = reward, |
317 | 363 | change = change |
... | ... | @@ -319,65 +365,6 @@ function _M.getRewardRpc(agent , data) |
319 | 365 | return true |
320 | 366 | end |
321 | 367 | |
322 | --- function _M.getRewardItemRpc(agent , data) | |
323 | --- local role = agent.role | |
324 | --- checkReward(role) | |
325 | --- local items = role:getProperty("hangBag") | |
326 | --- if not next(items) then return end | |
327 | - | |
328 | --- local notNeed = {[ItemId.Gold] = 1, [ItemId.Exp] = 1, [ItemId.PlayerExp] = 1} | |
329 | --- local reward = {} | |
330 | --- for itemId , count in pairs(items) do | |
331 | --- if not notNeed[itemId] then | |
332 | --- reward[itemId] = count | |
333 | --- items[itemId] = nil | |
334 | --- end | |
335 | --- end | |
336 | --- if not next(reward) then return end | |
337 | --- local reward = role:award(reward) | |
338 | - | |
339 | --- local hangInfo = role:getProperty("hangInfo") | |
340 | --- local nowTime = skynet.timex() | |
341 | --- hangInfo.endItemTime = nowTime + globalCsv.idle_producetime_max | |
342 | --- hangInfo.itemTime = nowTime | |
343 | --- role:updateProperty({field = "hangBag", value = items}) | |
344 | --- role:updateProperty({field = "hangInfo", value = hangInfo}) | |
345 | - | |
346 | --- SendPacket(actionCodes.Hang_getRewardItemRpc, MsgPack.pack({ | |
347 | --- reward = reward | |
348 | --- })) | |
349 | --- return true | |
350 | --- end | |
351 | - | |
352 | --- function _M.getRewardCoinRpc(agent , data) | |
353 | --- local role = agent.role | |
354 | --- checkReward(role) | |
355 | --- local items = role:getProperty("hangBag") | |
356 | --- if not next(items) then return end | |
357 | - | |
358 | --- local need = {[ItemId.Gold] = 1, [ItemId.Exp] = 1, [ItemId.PlayerExp] = 1} | |
359 | --- local reward = {} | |
360 | --- for itemId , count in pairs(items) do | |
361 | --- if need[itemId] then | |
362 | --- reward[itemId] = count | |
363 | --- items[itemId] = nil | |
364 | --- end | |
365 | --- end | |
366 | --- local reward = role:award(reward) | |
367 | - | |
368 | --- local hangInfo = role:getProperty("hangInfo") | |
369 | --- local nowTime = skynet.timex() | |
370 | --- hangInfo.endCoinTime = nowTime + globalCsv.idle_producetime_max | |
371 | --- hangInfo.coinTime = nowTime | |
372 | --- role:updateProperty({field = "hangBag", value = items}) | |
373 | --- role:updateProperty({field = "hangInfo", value = hangInfo}) | |
374 | - | |
375 | --- SendPacket(actionCodes.Hang_getRewardCoinRpc, MsgPack.pack({ | |
376 | --- reward = reward | |
377 | --- })) | |
378 | --- return true | |
379 | --- end | |
380 | - | |
381 | 368 | function _M.quickRpc(agent , data) |
382 | 369 | local role = agent.role |
383 | 370 | |
... | ... | @@ -400,8 +387,9 @@ function _M.quickRpc(agent , data) |
400 | 387 | |
401 | 388 | local coinCount = math.floor(time / globalCsv.idle_money_produce_cd) |
402 | 389 | local itemCount = math.floor(time / globalCsv.idle_item_produce_cd) |
403 | - reward[ItemId.Gold] = (reward[ItemId.Gold] or 0) + coinCount * carbonData.money | |
404 | - reward[ItemId.Exp] = (reward[ItemId.Exp] or 0) + coinCount * carbonData.exp | |
390 | + reward[ItemId.Gold] = math.floor((reward[ItemId.Gold] or 0) + coinCount * carbonData.money) | |
391 | + reward[ItemId.Exp] = math.floor((reward[ItemId.Exp] or 0) + coinCount * carbonData.exp) | |
392 | + reward[ItemId.PlayerExp] = math.floor((reward[ItemId.PlayerExp] or 0) + coinCount * carbonData.playerExp) | |
405 | 393 | |
406 | 394 | local pool = {} |
407 | 395 | for _, temp in pairs(carbonData.item:toArray()) do |
... | ... | @@ -412,11 +400,13 @@ function _M.quickRpc(agent , data) |
412 | 400 | reward[cur[1]] = (reward[cur[1]] or 0) + cur[2] |
413 | 401 | end |
414 | 402 | |
403 | + local doubleCoef = role.activity:isOpen("DoubleDrop") and 2 or 1 | |
404 | + | |
415 | 405 | -- 特权卡获取加速获得额外道具 |
416 | 406 | local coef = role.storeData:getProduceItemSpeedCoef() |
417 | 407 | if coef > 1 then |
418 | 408 | for k, cnt in pairs(reward) do |
419 | - reward[k] = math.floor(cnt * coef) | |
409 | + reward[k] = math.floor(cnt * coef * doubleCoef) | |
420 | 410 | end |
421 | 411 | end |
422 | 412 | |
... | ... | @@ -426,6 +416,15 @@ function _M.quickRpc(agent , data) |
426 | 416 | role:checkTaskEnter("HangGetGold", {count = reward[ItemId.Gold]}) |
427 | 417 | end |
428 | 418 | role:checkTaskEnter("HangQuick") |
419 | + | |
420 | + role:log("residence_reward", { | |
421 | + mission_threadid = math.floor(hangInfo.carbonId / 10000), --大关卡ID | |
422 | + mission_id = hangInfo.carbonId, --关卡ID | |
423 | + mission_type = 100, --关卡类型,见关卡类型枚举表 | |
424 | + residence_reward_type = 1, --领取奖励方式,快速(超前领取)记录为1,正常领取记录为0 | |
425 | + residence_time = time, --挂机或排名时长 | |
426 | + residence_reward = reward, --获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
427 | + }) | |
429 | 428 | SendPacket(actionCodes.Hang_quickRpc, MsgPack.pack({ |
430 | 429 | reward = reward, |
431 | 430 | change = change |
... | ... | @@ -480,7 +479,7 @@ function _M.buyBonusCountRpc(agent, data) |
480 | 479 | |
481 | 480 | if not role:checkItemEnough({[ItemId.Diamond] = globalCsv.bonus_buy_cost * count}) then return 2 end |
482 | 481 | |
483 | - role:costItems({[ItemId.Diamond] = globalCsv.bonus_buy_cost * count}, {log = {desc = "buyBonusCount", short1 = btype, int1 = count}}) | |
482 | + role:costItems({[ItemId.Diamond] = globalCsv.bonus_buy_cost * count}, {log = {desc = "buyBonusCount", int1 = btype, int2 = count}}) | |
484 | 483 | bonusC[btype]["b"] = bonusC[btype]["b"] + count |
485 | 484 | bonusC[btype]["c"] = bonusC[btype]["c"] - count |
486 | 485 | |
... | ... | @@ -551,8 +550,12 @@ function _M.endBonusBattleRpc(agent, data) |
551 | 550 | role:checkTaskEnter("BonusPass", {id = id}) |
552 | 551 | end |
553 | 552 | |
554 | - role:log("hang_action", {desc = "bonusBattle", short1 = msg.starNum > 0 and 1 or 0, int1 = id}) | |
555 | - | |
553 | + role:checkBattle("bonus", { | |
554 | + id = id, | |
555 | + isWin = starNum and starNum > 0, | |
556 | + info = msg.info, | |
557 | + reward = reward, | |
558 | + }) | |
556 | 559 | SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({ |
557 | 560 | starNum = starNum, |
558 | 561 | reward = reward, |
... | ... | @@ -573,7 +576,6 @@ function _M.hangGiftRpc(agent, data) |
573 | 576 | if hangGift[id] then return 2 end |
574 | 577 | |
575 | 578 | local reward, change = role:award(carbonData.item_clear_special, {log = {desc = "hangGift", int1 = id}}) |
576 | - role:log("hang_action", {desc = "hangGift", int1 = id}) | |
577 | 579 | |
578 | 580 | role:changeUpdates({{type = "hangGift", field = id, value = 1}}) |
579 | 581 | ... | ... |
src/actions/HeroAction.lua
... | ... | @@ -16,6 +16,18 @@ local table_unpack = table.unpack |
16 | 16 | |
17 | 17 | local _M = {} |
18 | 18 | |
19 | +local function getChangeAttrJson(oldAttr, newAttr) | |
20 | + local change = {} | |
21 | + for k, v in pairs(newAttr) do | |
22 | + change[k] = v - oldAttr[k] | |
23 | + change[k] = math.ceil(change[k]) | |
24 | + if change[k] == 0 then | |
25 | + change[k] = nil | |
26 | + end | |
27 | + end | |
28 | + return change | |
29 | +end | |
30 | + | |
19 | 31 | function _M.levelUpRpc( agent, data ) |
20 | 32 | local role = agent.role |
21 | 33 | local msg = MsgPack.unpack(data) |
... | ... | @@ -28,9 +40,23 @@ function _M.levelUpRpc( agent, data ) |
28 | 40 | local cost = {[ItemId.Exp] = curData.exp, [ItemId.Gold] = curData.gold} |
29 | 41 | if not role:checkItemEnough(cost) then return 3 end |
30 | 42 | role:costItems(cost, {log = {desc = "heroLevelUp", int1 = msg.id, int2 = hero:getProperty("type")}}) |
43 | + | |
44 | + local oldAttr = hero:getTotalAttrs() | |
45 | + local oldBattleV = hero:getProperty("battleV") | |
31 | 46 | hero:updateProperty({field = "level", delta = 1}) |
32 | 47 | |
33 | - hero:log({desc = "levelUp", int1 = hero:getProperty("level")}) | |
48 | + role:log("hero_upgrade", { | |
49 | + hero_id = hero:getProperty("type"), --英雄ID | |
50 | + hero_upgrade_cost = cost, -- 英雄升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
51 | + hero_upgrade_result = getChangeAttrJson(oldAttr, hero:getTotalAttrs()), -- 英雄升级效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
52 | + hero_upgrade_type = 0, -- 英雄升级方式,连续升级:1,单击升级:0 | |
53 | + hero_upgrade_score = hero:getProperty("battleV"), -- 英雄升级后评分 | |
54 | + hero_upgrade_scoreget = hero:getProperty("battleV") - oldBattleV, -- 通过英雄升级提升的评分 | |
55 | + }) | |
56 | + | |
57 | + if hero:getProperty("type") == 103 then | |
58 | + role:finishGuide(7) | |
59 | + end | |
34 | 60 | |
35 | 61 | role:checkTaskEnter("HeroLevelUp", {level = hero:getProperty("level")}) |
36 | 62 | SendPacket(actionCodes.Hero_levelUpRpc, '') |
... | ... | @@ -49,9 +75,15 @@ function _M.breakRpc( agent, data ) |
49 | 75 | local cost = {[ItemId.BreakCost] = curData.cost, [ItemId.Gold] = curData.gold} |
50 | 76 | if not role:checkItemEnough(cost) then return 4 end |
51 | 77 | role:costItems(cost, {log = {desc = "heroBreak", int1 = msg.id, int2 = hero:getProperty("type")}}) |
78 | + local oldAttr = hero:getTotalAttrs() | |
52 | 79 | hero:updateProperty({field = "breakL", delta = 1}) |
53 | 80 | |
54 | - hero:log({desc = "break", int1 = hero:getProperty("breakL")}) | |
81 | + role:log("hero_break", { | |
82 | + hero_id = hero:getProperty("type"), --英雄ID | |
83 | + hero_break_cost = cost, -- 英雄突破消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
84 | + hero_break_result = getChangeAttrJson(oldAttr, hero:getTotalAttrs()), -- 英雄突破效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
85 | + hero_break_level = hero:getMaxLevel(), -- 英雄突破后等级上限 | |
86 | + }) | |
55 | 87 | |
56 | 88 | SendPacket(actionCodes.Hero_breakRpc, '') |
57 | 89 | return true |
... | ... | @@ -74,6 +106,7 @@ function _M.wakeRpc(agent, data) |
74 | 106 | |
75 | 107 | role:costItems(cost, {log = {desc = "heroWake", int1 = msg.id, int2 = hero:getProperty("type")}}) |
76 | 108 | |
109 | + local oldAttr = hero:getTotalAttrs() | |
77 | 110 | hero:updateProperty({field = "wakeL", delta = 1}) |
78 | 111 | |
79 | 112 | local curLevel = hero:getProperty("wakeL") |
... | ... | @@ -81,9 +114,14 @@ function _M.wakeRpc(agent, data) |
81 | 114 | if curLevel == 4 then -- 解锁cg |
82 | 115 | role:checkTaskEnter("WakeCG", {heroType = typ}) |
83 | 116 | end |
84 | - hero:log({desc = "wake", int1 = hero:getProperty("wakeL")}) | |
85 | 117 | |
86 | - | |
118 | + role:log("hero_rise", { | |
119 | + hero_id = typ, --英雄ID | |
120 | + hero_rise_cost = cost, --英雄觉醒消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
121 | + hero_rise_score = hero:getProperty("battleV"), --英雄觉醒后评分提升 | |
122 | + hero_rise_result = getChangeAttrJson(oldAttr, hero:getTotalAttrs()), --英雄觉醒效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
123 | + }) | |
124 | + | |
87 | 125 | SendPacket(actionCodes.Hero_wakeRpc, '') |
88 | 126 | return true |
89 | 127 | end |
... | ... | @@ -103,7 +141,10 @@ function _M.talentRpc(agent, data) |
103 | 141 | local curStage = talent:getv(0, 1) |
104 | 142 | local curData = csvdb["unit_talentCsv"][curStage] |
105 | 143 | if not curData then return 4 end |
144 | + local oldSkillLv = hero:getSkillLevel(1) | |
145 | + | |
106 | 146 | |
147 | + local cost = {} | |
107 | 148 | if index == 0 then |
108 | 149 | --是否进阶 |
109 | 150 | local max = true |
... | ... | @@ -131,7 +172,7 @@ function _M.talentRpc(agent, data) |
131 | 172 | |
132 | 173 | if talentData.lvRequire > hero:getProperty("level") then return 6 end |
133 | 174 | |
134 | - local cost = talentData.money:toNumMap() | |
175 | + cost = talentData.money:toNumMap() | |
135 | 176 | local cost2 = talentData.cost:toNumMap() |
136 | 177 | for k,v in pairs(cost2) do |
137 | 178 | cost[globalCsv.unit_talent_cost[csvdb["unitCsv"][hero:getProperty("type")].camp][k]] = v |
... | ... | @@ -152,7 +193,12 @@ function _M.talentRpc(agent, data) |
152 | 193 | |
153 | 194 | hero:updateProperty({field = "talent", value = talent}) |
154 | 195 | |
155 | - hero:log({desc = "talent", int1 = index, int2 = talent:getv(index, 0)}) | |
196 | + role:log("hero_talent", { | |
197 | + hero_id = hero:getProperty("type"), --英雄ID | |
198 | + hero_talent_cost = cost, -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
199 | + hero_talent_levelbef = oldSkillLv, -- 英雄技能升级前等级 | |
200 | + hero_talent_level = hero:getSkillLevel(1), -- 英雄技能升级后等级 | |
201 | + }) | |
156 | 202 | |
157 | 203 | SendPacket(actionCodes.Hero_talentRpc, '') |
158 | 204 | return true |
... | ... | @@ -252,6 +298,14 @@ function _M.commentHeroRpc(agent, data) |
252 | 298 | comment.like = 0 |
253 | 299 | result.comment = comment |
254 | 300 | role.dailyData:setProperty("commentHero", curStutus:setv(heroType, 1)) |
301 | + | |
302 | + | |
303 | + role:log("hero_note", { | |
304 | + hero_id = heroType, -- 英雄ID | |
305 | + hero_note_action = 0, -- 英雄评价界面操作,发布评论:0,点赞:1,反对:2 | |
306 | + hero_note_id = commentId, -- 操作的评价ID | |
307 | + hero_note_text = content, -- 操作的评价内容 | |
308 | + }) | |
255 | 309 | end |
256 | 310 | SendPacket(actionCodes.Hero_commentHeroRpc, MsgPack.pack(result)) |
257 | 311 | return true |
... | ... | @@ -322,7 +376,7 @@ function _M.likeCommentRpc(agent, data) |
322 | 376 | local commentIndex = heroType .. ":" .. commentId |
323 | 377 | local commentRoleKey = string.format("comment:%d:like", role:getProperty("id")) |
324 | 378 | local redret = redisproxy:pipelining(function (red) |
325 | - red:hexists(commentKey.commentKey, commentId) | |
379 | + red:hget(commentKey.commentKey, commentId) | |
326 | 380 | red:lrem(commentRoleKey, 1, commentIndex) |
327 | 381 | red:lpush(commentRoleKey, commentIndex) |
328 | 382 | red:ltrim(commentRoleKey, 0, 999) |
... | ... | @@ -330,7 +384,8 @@ function _M.likeCommentRpc(agent, data) |
330 | 384 | if (tonumber(redret[2]) or 0) > 0 then |
331 | 385 | result.status = 1 |
332 | 386 | else |
333 | - if redret[1] == 1 then-- 查不到也返回ture | |
387 | + if redret[1] then-- 查不到也返回ture | |
388 | + local comment = json.decode(redret[1]) | |
334 | 389 | local redret2 = redisproxy:pipelining(function (red) |
335 | 390 | red:zrevrange(commentKey.commentRankKey, 0, RankLikeNum - 1) --热门 |
336 | 391 | red:zincrby(commentKey.commentRankKey, add, commentId) |
... | ... | @@ -356,6 +411,13 @@ function _M.likeCommentRpc(agent, data) |
356 | 411 | red:lrem(commentKey.commentListKey, 0, tempId) |
357 | 412 | end |
358 | 413 | end) |
414 | + | |
415 | + role:log("hero_note", { | |
416 | + hero_id = heroType, -- 英雄ID | |
417 | + hero_note_action = add > 0 and 1 or 2, -- 英雄评价界面操作,发布评论:0,点赞:1,反对:2 | |
418 | + hero_note_id = commentId, -- 操作的评价ID | |
419 | + hero_note_text = comment.content, -- 操作的评价内容 | |
420 | + }) | |
359 | 421 | end |
360 | 422 | end |
361 | 423 | |
... | ... | @@ -363,108 +425,6 @@ function _M.likeCommentRpc(agent, data) |
363 | 425 | return true |
364 | 426 | end |
365 | 427 | |
366 | --- function _M.loveItemRpc(agent, data) | |
367 | --- local role = agent.role | |
368 | --- local msg = MsgPack.unpack(data) | |
369 | --- local hero = role.heros[msg.heroId] | |
370 | --- if not hero then | |
371 | --- return | |
372 | --- end | |
373 | --- local curL = hero:getProperty("loveL") | |
374 | --- local curExp = hero:getProperty("loveExp") | |
375 | --- local curType = hero:getProperty("type") | |
376 | --- local curPlus = csvdb["unit_love_plusCsv"][curType] | |
377 | --- if not curPlus then | |
378 | --- return | |
379 | --- end | |
380 | --- if curL >= curPlus.limit then | |
381 | --- SendPacket(actionCodes.Hero_loveItemRpc, MsgPack.pack({errMsg = 1})) --已满级 | |
382 | --- return true | |
383 | --- end | |
384 | --- local curEffect = csvdb["unit_love_effectCsv"][curL] | |
385 | --- if not curEffect then | |
386 | --- return | |
387 | --- end | |
388 | --- if curExp >= curEffect.loveValue and not msg.bBreak then | |
389 | --- SendPacket(actionCodes.Hero_loveItemRpc, MsgPack.pack({errMsg = 2})) --当前等级经验已满 | |
390 | --- return true | |
391 | --- end | |
392 | - | |
393 | --- if msg.bBreak then | |
394 | --- local cost = curEffect.cost:toArray(true, "=") | |
395 | --- if not role:checkItemEnough({[cost[1]] = cost[2]}) then | |
396 | --- SendPacket(actionCodes.Hero_loveItemRpc, MsgPack.pack({errMsg = 3, itemId = cost[1]})) --物品不足 | |
397 | --- return true | |
398 | --- end | |
399 | --- role:costItems({[cost[1]] = cost[2]}) | |
400 | --- local newLevel = curL + 1 | |
401 | --- hero:updateProperty({field = "loveL", value = newLevel}) | |
402 | --- hero:updateProperty({field = "loveExp", value = 0}) | |
403 | - | |
404 | --- if role:getProperty("loveStatus"):getv(curType, 0) < newLevel then | |
405 | --- role:changeUpdates({{type = "loveStatus", field = curType, value = newLevel}}) -- 总的 | |
406 | --- end | |
407 | - | |
408 | --- role:checkTaskEnter("LoveBreak", {heroType = curType, loveL = newLevel}) | |
409 | - | |
410 | --- else | |
411 | --- local delta = globalCsv.unit_love_presentValue[msg.itemId] | |
412 | --- if not delta then | |
413 | --- return | |
414 | --- end | |
415 | --- if not role:checkItemEnough({[msg.itemId] = 1}) then | |
416 | --- SendPacket(actionCodes.Hero_loveItemRpc, MsgPack.pack({errMsg = 3, itemId = msg.itemId})) | |
417 | --- return true | |
418 | --- end | |
419 | --- local newExp = curExp + delta | |
420 | --- if newExp > curEffect.loveValue then | |
421 | --- newExp = curEffect.loveValue | |
422 | --- end | |
423 | --- role:costItems({[msg.itemId] = 1}) | |
424 | --- hero:updateProperty({field = "loveExp", value = newExp}) | |
425 | --- end | |
426 | --- SendPacket(actionCodes.Hero_loveItemRpc, "") | |
427 | --- return true | |
428 | --- end | |
429 | - | |
430 | --- function _M.loveTaskRpc(agent, data) | |
431 | --- local role = agent.role | |
432 | --- local msg = MsgPack.unpack(data) | |
433 | --- local hero = role.heros[msg.id] | |
434 | --- if not hero then return end | |
435 | - | |
436 | --- local curL = hero:getProperty("loveL") | |
437 | --- local curExp = hero:getProperty("loveExp") | |
438 | --- local curType = hero:getProperty("type") | |
439 | --- local curPlus = csvdb["unit_love_plusCsv"][curType] | |
440 | --- if not curPlus or curL >= curPlus.limit then return end | |
441 | - | |
442 | --- local curEffect = csvdb["unit_love_effectCsv"][curL] | |
443 | --- if not curEffect or curExp < curEffect.loveValue then return end | |
444 | - | |
445 | --- local lastEffect = csvdb["unit_love_effectCsv"][curL + 1] | |
446 | --- local newExp = curExp - curEffect.loveValue | |
447 | --- if lastEffect and curL + 1 < curPlus.limit then | |
448 | --- if newExp >= lastEffect.loveValue then | |
449 | --- -- todo 发任务 | |
450 | --- end | |
451 | --- else | |
452 | --- newExp = 0 | |
453 | --- end | |
454 | --- local newLevel = curL + 1 | |
455 | --- hero:updateProperty({field = "loveExp", value = newExp}) | |
456 | --- hero:updateProperty({field = "loveL", value = newLevel}) | |
457 | - | |
458 | --- if role:getProperty("loveStatus"):getv(curType, 0) < newLevel then | |
459 | --- role:changeUpdates({{type = "loveStatus", field = curType, value = newLevel}}) -- 总的 | |
460 | --- end | |
461 | - | |
462 | --- role:checkTaskEnter("LoveBreak", {heroType = curType, loveL = newLevel}) | |
463 | - | |
464 | --- SendPacket(actionCodes.Hero_loveTaskRpc, "") | |
465 | --- return true | |
466 | --- end | |
467 | - | |
468 | 428 | function _M.createHeroRpc(agent, data) |
469 | 429 | local role = agent.role |
470 | 430 | local msg = MsgPack.unpack(data) |
... | ... | @@ -493,6 +453,7 @@ function _M.referEquipsRpc(agent, data) |
493 | 453 | local hero = role.heros[msg.id] |
494 | 454 | if not hero then return 10 end |
495 | 455 | local equips = msg.equips |
456 | + local isAuto = msg.isAuto | |
496 | 457 | if not equips or not next(equips) then return 11 end |
497 | 458 | |
498 | 459 | for typ = 1, 4 do -- 4件装备 |
... | ... | @@ -502,6 +463,11 @@ function _M.referEquipsRpc(agent, data) |
502 | 463 | end |
503 | 464 | end |
504 | 465 | end |
466 | + | |
467 | + local oldAttr = hero:getTotalAttrs() | |
468 | + local oldBattleV = hero:getProperty("battleV") | |
469 | + local wear = {} | |
470 | + | |
505 | 471 | local curEquip = hero:getProperty("equip") |
506 | 472 | for typ = 1, 4 do -- 4件装备 |
507 | 473 | if equips[typ] then |
... | ... | @@ -512,17 +478,37 @@ function _M.referEquipsRpc(agent, data) |
512 | 478 | else |
513 | 479 | role:addEquip(typ, equips[typ], -1, {log = {desc = "refer"}}) -- 穿上 |
514 | 480 | curEquip = curEquip:setv(typ, equips[typ]) |
481 | + | |
482 | + wear[typ] = {id = equips[typ], act = 0} | |
515 | 483 | end |
516 | 484 | |
517 | 485 | if cur ~= 0 then |
518 | 486 | role:addEquip(typ, cur, 1, {log = {desc = "refer"}}) -- 脱掉 |
487 | + | |
488 | + wear[typ] = {id = cur, act = 1} | |
519 | 489 | end |
520 | 490 | end |
521 | 491 | end |
522 | 492 | end |
493 | + | |
523 | 494 | -- 更新角色 |
524 | 495 | hero:updateProperty({field = "equip", value = curEquip}) |
525 | 496 | |
497 | + role:finishGuide(23) | |
498 | + | |
499 | + local curAttr = hero:getTotalAttrs() | |
500 | + local attrChange = getChangeAttrJson(oldAttr, curAttr) | |
501 | + for typ, data in pairs(wear) do | |
502 | + role:log("equip_wear", { | |
503 | + hero_id = hero:getProperty("type"), --英雄ID | |
504 | + equip_id = data.id, --装备ID | |
505 | + equip_wear_action = data.act, --装备操作类型:装备:0,卸载:1 | |
506 | + equip_wear_part = typ, --装备部位,记录部位ID | |
507 | + equip_wear_result = curAttr, --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567} | |
508 | + equip_wear_change = attrChange, --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45} | |
509 | + equip_wear_mode = isAuto and 0 or 1, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1 | |
510 | + }) | |
511 | + end | |
526 | 512 | SendPacket(actionCodes.Hero_referEquipsRpc, "") |
527 | 513 | return true |
528 | 514 | end |
... | ... | @@ -559,6 +545,9 @@ function _M.referRunesRpc(agent, data) |
559 | 545 | chero:updateProperty({field = "rune", value = hrunes}) |
560 | 546 | end |
561 | 547 | |
548 | + local oldAttr = hero:getTotalAttrs() | |
549 | + local oldBattleV = hero:getProperty("battleV") | |
550 | + local wear = {} | |
562 | 551 | local curRune = hero:getProperty("rune") |
563 | 552 | for typ = 1, 6 do |
564 | 553 | if runes[typ] then |
... | ... | @@ -570,6 +559,7 @@ function _M.referRunesRpc(agent, data) |
570 | 559 | local newRune = role.runeBag[runes[typ]] |
571 | 560 | newRune:updateProperty({field = "refer",value = hero:getProperty("id")}) |
572 | 561 | curRune = curRune:setv(typ, runes[typ]) |
562 | + wear[runes[typ]] = typ | |
573 | 563 | end |
574 | 564 | |
575 | 565 | if cur ~= 0 then |
... | ... | @@ -581,7 +571,22 @@ function _M.referRunesRpc(agent, data) |
581 | 571 | end |
582 | 572 | end |
583 | 573 | end |
574 | + | |
584 | 575 | hero:updateProperty({field = "rune", value = curRune}) |
576 | + | |
577 | + local attrChange = getChangeAttrJson(oldAttr, hero:getTotalAttrs()) | |
578 | + for runeId, typ in pairs(wear) do | |
579 | + local ownRune = role.runeBag[runeId] | |
580 | + role:log("hero_jewel", { | |
581 | + hero_id = hero:getProperty("type"), -- 英雄ID | |
582 | + hero_jewel_id = ownRune:getProperty("id"), -- 铭文ID | |
583 | + hero_jewel_part = typ, -- 铭文装备部位 | |
584 | + hero_jewel_score = hero:getProperty("battleV"), -- 铭文装备后的英雄分值 | |
585 | + hero_jewel_scorebefore = oldBattleV, -- 铭文装备前的英雄分值 | |
586 | + hero_jewel_result = attrChange, -- 铭文装备后效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
587 | + }) | |
588 | + end | |
589 | + | |
585 | 590 | SendPacket(actionCodes.Hero_referRunesRpc, "") |
586 | 591 | return true |
587 | 592 | end |
... | ... | @@ -666,256 +671,39 @@ function _M.getResetRewardRpc(agent, data) |
666 | 671 | end |
667 | 672 | end |
668 | 673 | |
669 | - hero:updateProperty({field = "level", value = level}) | |
670 | - hero:updateProperty({field = "breakL", value = breakL}) | |
671 | - hero:updateProperty({field = "talent", value = ""}) | |
672 | - hero:log({desc = "resetHero"}) | |
673 | - | |
674 | - for itemId, count in pairs(reward) do | |
675 | - reward[itemId] = math.floor(count * globalCsv.unit_back_discount) | |
676 | - end | |
677 | - local change | |
678 | - reward, change = role:award(reward, {log = {desc = "resetHero", int1 = msg.id, int2 = hero:getProperty("type")}}) | |
679 | - | |
680 | - SendPacket(actionCodes.Hero_getResetRewardRpc, MsgPack.pack(role:packReward(reward, change))) | |
681 | - return true | |
682 | -end | |
683 | - | |
684 | -function _M.unuse_drawHeroRpc(agent, data) | |
685 | - local role = agent.role | |
686 | - local msg = MsgPack.unpack(data) | |
687 | - | |
688 | - if not role:isFuncUnlock(FuncUnlock.GetHero) then return end | |
689 | - local btype = msg.pool -- 1 2 3 4 | |
690 | - local drawType = msg.type -- 1 单抽 2 十连 | |
691 | - local guide = msg.guide -- 是否是引导抽的 | |
692 | - | |
693 | - local buildTypeData = csvdb["build_typeCsv"][btype] | |
694 | - if not buildTypeData then return 1 end | |
695 | - | |
696 | - local drawCount = {1, 10} -- 抽取次数 | |
697 | - if not drawCount[drawType] then return 2 end | |
698 | - | |
699 | - local newerDraw | |
700 | - if btype == 4 then | |
701 | - newerDraw = role:getProperty("newerDraw") | |
702 | - if math.illegalNum(globalCsv.draw_newer[2] - (newerDraw[1] or 0), drawCount[drawType], globalCsv.draw_newer[2]) then return 11 end | |
703 | - end | |
704 | - | |
705 | - local cost = {} | |
706 | - local lastCount = drawCount[drawType] | |
707 | - for _, costType in ipairs({"draw_card", "draw_coin"}) do | |
708 | - if buildTypeData[costType] ~= "" then | |
709 | - local curCost = buildTypeData[costType]:toArray(true, "=") | |
710 | - local hadCount = role:getItemCount(curCost[1]) | |
711 | - local curCount = math.floor(hadCount / curCost[2]) | |
712 | - if curCount >= lastCount then | |
713 | - cost[curCost[1]] = curCost[2] * lastCount | |
714 | - lastCount = 0 | |
715 | - break | |
716 | - elseif curCount > 0 then | |
717 | - cost[curCost[1]] = curCost[2] * curCount | |
718 | - lastCount = lastCount - curCount | |
719 | - end | |
720 | - end | |
674 | + local equip = hero:getProperty("equip") | |
675 | + for k, v in pairs(equip:toNumMap()) do | |
676 | + role:addEquip(k, v, 1, {log = {desc = "resetHero", int1 = msg.id, int2 = hero:getProperty("type")}}) | |
721 | 677 | end |
722 | - if lastCount > 0 then -- 钱不够 | |
723 | - return 3 | |
724 | - end | |
725 | - | |
726 | - -- pool 固定的 | |
727 | - local poolEnum = { | |
728 | - [1] = { | |
729 | - [1] = 1, | |
730 | - [2] = 2, | |
731 | - [3] = 3, | |
732 | - }, | |
733 | - [2] = 10, | |
734 | - [3] = 11, | |
735 | - [4] = 12, | |
736 | - } | |
737 | 678 | |
738 | - -- 抽取的池子 | |
739 | - local pool = poolEnum[btype] | |
740 | - if btype == 1 then | |
741 | - -- 超级卡池子 每周轮换 有活动覆盖之 | |
742 | - --TODO 活动判断 | |
743 | - if false then | |
744 | - else | |
745 | - for idx, poolId in pairs(pool) do | |
746 | - if role:isTimeResetOpen(TimeReset["DrawType" .. idx]) then | |
747 | - pool = poolId | |
748 | - break | |
749 | - end | |
750 | - end | |
751 | - if type(pool) ~= "number" then | |
752 | - pool = -1 | |
753 | - end | |
679 | + local rune = hero:getProperty("rune") | |
680 | + for _, id in pairs(rune:toNumMap()) do | |
681 | + local curRune = role.runeBag[id] | |
682 | + if curRune then | |
683 | + curRune:updateProperty({field = "refer", value = 0}) | |
754 | 684 | end |
755 | 685 | end |
756 | - local unitPool = csvdb["build_unitCsv"][pool] | |
757 | - if not unitPool then return 4 end | |
758 | 686 | |
759 | - -- 开始抽 | |
760 | - local resultPool = {} | |
761 | - local function fillDrawPool(fixRare, fixCamp, ssrUp, floorBack) | |
762 | - local condition = {"rare", "camp"} | |
763 | - local values = {fixRare, fixCamp} | |
687 | + hero:updateProperties({ | |
688 | + level = level, | |
689 | + breakL = breakL, | |
690 | + talent = "", | |
691 | + equip = "", | |
692 | + rune = "", | |
693 | + }) | |
764 | 694 | |
765 | - for idx, field in ipairs(condition) do | |
766 | - if not values[idx] then | |
767 | - local lpool = {} | |
768 | - local curIdx = 1 | |
769 | - while unitPool[field .. "_" .. curIdx] do | |
770 | - lpool[curIdx] = {unitPool[field .. "_" .. curIdx]} | |
771 | - curIdx = curIdx + 1 | |
772 | - end | |
773 | - | |
774 | - -- 稀有度 ssr up | |
775 | - if field == "rare" then | |
776 | - local all = 0 | |
777 | - for _, weight in pairs(lpool) do | |
778 | - all = all + weight[1] | |
779 | - end | |
780 | - --[[ | |
781 | - SSR概率值:初始概率 + 步长概率 | |
782 | - SR概率值:初始概率 * [ (初始概率+R初始概率) - 步长概率 ] /(初始概率+R初始概率) | |
783 | - R概率值:初始概率 * [ (初始概率+SR初始概率) - 步长概率 ] /(初始概率+SR初始概率) | |
784 | - ]] | |
785 | - local ssrAdd = (ssrUp or 0) * all | |
786 | - local last = all - lpool[4][1] | |
787 | - lpool[4][1] = lpool[4][1] + ssrAdd | |
788 | - lpool[3][1] = lpool[3][1] * (last - ssrAdd) / last | |
789 | - lpool[2][1] = lpool[2][1] * (last - ssrAdd) / last | |
790 | - end | |
791 | - | |
792 | - if next(lpool) then | |
793 | - values[idx] = math.randWeight(lpool, 1) | |
794 | - end | |
795 | - end | |
796 | - end | |
797 | - | |
798 | - for itemId, oneData in pairs(floorBack and csvdb["build_floorCsv"] or csvdb["build_poolCsv"]) do | |
799 | - if oneData["pool_" .. pool] and oneData["pool_" .. pool] ~= "" then | |
800 | - local itemData = csvdb["itemCsv"][itemId] | |
801 | - while itemData do | |
802 | - if itemData.type ~= ItemType.Hero then break end | |
803 | - local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] | |
804 | - if not heroData then break end | |
805 | - local ok = true | |
806 | - for idx, field in ipairs(condition) do | |
807 | - if heroData[field] ~= values[idx] then ok = false break end | |
808 | - end | |
809 | - if not ok then break end | |
810 | - if oneData["pool_" .. pool] > 0 then | |
811 | - resultPool[itemId] = {oneData["pool_" .. pool]} -- itemId, count, 概率 | |
812 | - end | |
813 | - break | |
814 | - end | |
815 | - end | |
816 | - end | |
817 | - end | |
818 | - | |
819 | - role:costItems(cost, {log = {desc = "drawHero", short1 = btype, int1 = pool}}) | |
820 | - | |
821 | - local draw_floor_back_counts = globalCsv.draw_floor_back_counts[btype] | |
822 | - local draw_ssr_up_count_rate = globalCsv.draw_ssr_up_count_rate[btype] | |
823 | - local floorHeroCount = role:getProperty("floorHero")[btype] or 0 | |
824 | - local ssrUpCount = role:getProperty("ssrUp")[btype] or 0 | |
825 | - | |
826 | - local newerDrawCount, newerHadSSR | |
827 | - if btype == 4 then | |
828 | - newerDrawCount = newerDraw[1] or 0 | |
829 | - newerHadSSR = newerDraw[2] or 0 | |
830 | - end | |
831 | - | |
832 | - local ssrCount = 0 | |
833 | - local reward = {} | |
834 | - for i = 1, drawCount[drawType] do | |
835 | - floorHeroCount = floorHeroCount + 1 | |
836 | - if btype == 4 then | |
837 | - newerDrawCount = newerDrawCount + 1 | |
838 | - end | |
839 | - | |
840 | - resultPool = {} | |
841 | - local isFloorBack = draw_floor_back_counts and floorHeroCount >= draw_floor_back_counts | |
842 | - local isNewerSSR = btype == 4 and (newerHadSSR == 0 and newerDrawCount >= globalCsv.draw_newer[1]) or false | |
843 | - | |
844 | - local ssrUp = 0 | |
845 | - if draw_ssr_up_count_rate and ssrUpCount > draw_ssr_up_count_rate[1] then | |
846 | - ssrUp = math.min((ssrUpCount - draw_ssr_up_count_rate[1]) * draw_ssr_up_count_rate[2], draw_ssr_up_count_rate[3]) / 100 | |
847 | - end | |
848 | - while not next(resultPool) do | |
849 | - if isNewerSSR then | |
850 | - fillDrawPool(4) -- 新手保底的 ssr | |
851 | - elseif isFloorBack then | |
852 | - -- 保底 sr 【郑斌】明确 | |
853 | - -- 保底 sr 改为 池子随机 sr 或者 ssr【郑斌】 | |
854 | - fillDrawPool(nil, nil, nil, true) | |
855 | - else | |
856 | - fillDrawPool(nil, nil, ssrUp) | |
857 | - end | |
858 | - end | |
859 | - | |
860 | - -- 引导必送 613 丝路德 | |
861 | - local itemId = (guide and drawType == 1) and 613 or math.randWeight(resultPool, 1) | |
862 | - local itemData = csvdb["itemCsv"][itemId] | |
863 | - if itemData.quality == 4 then | |
864 | - ssrCount = ssrCount + 1 | |
865 | - ssrUpCount = 0 | |
866 | - if btype == 4 then | |
867 | - newerHadSSR = newerHadSSR + 1 | |
868 | - end | |
869 | - else | |
870 | - ssrUpCount = ssrUpCount + 1 | |
871 | - end | |
872 | - | |
873 | - if itemData.quality >= 3 then | |
874 | - floorHeroCount = 0 | |
875 | - end | |
876 | - | |
877 | - if role:isHaveHero(itemData.id - ItemStartId.Hero) then | |
878 | - local fragId = itemData.id - ItemStartId.Hero | |
879 | - local heroData = csvdb["unitCsv"][fragId] | |
880 | - local count = globalCsv.draw_unit_tofragment[heroData.rare] | |
881 | - role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = btype, int1 = pool}}) | |
882 | - table.insert(reward, {id = fragId, count = count, from = itemId, fcount = 1}) | |
883 | - else | |
884 | - role:award({[itemId] = 1}, {log = {desc = "drawHero", short1 = btype, int1 = pool}}) | |
885 | - table.insert(reward, {id = itemId, count = 1}) | |
886 | - end | |
887 | - end | |
888 | - | |
889 | - if draw_floor_back_counts then | |
890 | - local floorHero = role:getProperty("floorHero") | |
891 | - floorHero[btype] = floorHeroCount | |
892 | - role:setProperty("floorHero", floorHero) | |
893 | - end | |
894 | - | |
895 | - if draw_ssr_up_count_rate then | |
896 | - local ssrUp = role:getProperty("ssrUp") | |
897 | - ssrUp[btype] = ssrUpCount | |
898 | - role:setProperty("ssrUp", ssrUp) | |
899 | - end | |
900 | - | |
901 | - if btype == 4 then | |
902 | - newerDraw[1] = newerDrawCount | |
903 | - newerDraw[2] = newerHadSSR | |
904 | - role:updateProperty({field = "newerDraw", value = newerDraw}) | |
695 | + for itemId, count in pairs(reward) do | |
696 | + reward[itemId] = math.floor(count * globalCsv.unit_back_discount) | |
905 | 697 | end |
698 | + local change | |
699 | + reward, change = role:award(reward, {log = {desc = "resetHero", int1 = msg.id, int2 = hero:getProperty("type")}}) | |
906 | 700 | |
907 | - -- if pool == 1 then | |
908 | - -- local repayHero = role:getProperty("repayHero") | |
909 | - -- repayHero = math.min(globalCsv.draw_super_repay_count, repayHero + drawCount[drawType]) | |
910 | - -- role:updateProperty({field = "repayHero", value = repayHero}) | |
911 | - -- end | |
912 | - | |
913 | - role:checkTaskEnter("DrawHero", {pool = btype, count = drawCount[drawType]}) | |
914 | - if ssrCount > 0 then | |
915 | - role:checkTaskEnter("DrawSSR", {count = ssrCount}) | |
916 | - end | |
917 | - role:log("hero_action", {desc = "drawHero", short1 = btype, int1 = drawCount[drawType], int2 = pool}) | |
918 | - SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 | |
701 | + role:log("hero_recycle", { | |
702 | + hero_recycle_list = {[hero:getProperty("type")] = 1}, -- 回收的英雄id列表,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
703 | + hero_recycle_reward = reward, -- 回收后获得的奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
704 | + hero_recycle_cnt = 1, -- 总回收英雄量 | |
705 | + }) | |
706 | + SendPacket(actionCodes.Hero_getResetRewardRpc, MsgPack.pack(role:packReward(reward, change))) | |
919 | 707 | return true |
920 | 708 | end |
921 | 709 | |
... | ... | @@ -927,7 +715,6 @@ function _M.drawHeroRpc(agent, data) |
927 | 715 | local btype = msg.pool -- 1 2 3 卡池类型 |
928 | 716 | local subType = msg.subType or 1-- 定向卡池需要传 子类型 |
929 | 717 | local drawType = msg.type -- 1 单抽 2 十连 |
930 | - local guide = msg.guide -- 是否是引导抽的 | |
931 | 718 | if btype ~= 1 then |
932 | 719 | subType = 1 |
933 | 720 | end |
... | ... | @@ -938,6 +725,9 @@ function _M.drawHeroRpc(agent, data) |
938 | 725 | local drawCount = {1, 10} -- 抽取次数 |
939 | 726 | if not drawCount[drawType] then return 2 end |
940 | 727 | |
728 | + local draw_floor_back_counts = globalCsv.draw_floor_back_counts[btype] | |
729 | + local floorHeroCount = role:getProperty("floorHero")[btype] or 0 | |
730 | + | |
941 | 731 | -- 计算抽卡消耗品 |
942 | 732 | local cost = {} |
943 | 733 | local lastCount = drawCount[drawType] |
... | ... | @@ -976,16 +766,21 @@ function _M.drawHeroRpc(agent, data) |
976 | 766 | end |
977 | 767 | |
978 | 768 | --TODO 活动覆盖 |
769 | + local actPoolId = role.activity:getActivityPool(btype, subType) | |
770 | + if actPoolId ~= 0 then | |
771 | + poolId = actPoolId | |
772 | + end | |
979 | 773 | |
980 | 774 | local unitPool = csvdb["build_unitCsv"][poolId] |
981 | 775 | if not unitPool then return 4 end |
982 | 776 | |
983 | 777 | -- 开始抽 |
984 | 778 | local resultPool = {} |
985 | - local function fillDrawPool() | |
779 | + local function fillDrawPool(isFloorBack) | |
986 | 780 | local condition = {"rare", "camp"} |
987 | 781 | local values = {} |
988 | 782 | |
783 | + | |
989 | 784 | for idx, field in ipairs(condition) do |
990 | 785 | if not values[idx] then |
991 | 786 | local lpool = {} |
... | ... | @@ -1001,20 +796,24 @@ function _M.drawHeroRpc(agent, data) |
1001 | 796 | end |
1002 | 797 | end |
1003 | 798 | |
1004 | - for itemId, oneData in pairs(csvdb["build_poolCsv"]) do | |
1005 | - if oneData["pool_" .. poolId] and oneData["pool_" .. poolId] ~= "" then | |
799 | + for itemId, oneData in pairs(isFloorBack and csvdb["build_floorCsv"] or csvdb["build_poolCsv"]) do | |
800 | + local pool_str = "pool_" .. poolId | |
801 | + if oneData[pool_str] and oneData[pool_str] ~= "" then | |
1006 | 802 | local itemData = csvdb["itemCsv"][itemId] |
1007 | 803 | while itemData do |
1008 | 804 | if itemData.type ~= ItemType.Hero then break end |
1009 | 805 | local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] |
1010 | 806 | if not heroData then break end |
1011 | 807 | local ok = true |
1012 | - for idx, field in ipairs(condition) do | |
1013 | - if heroData[field] ~= values[idx] then ok = false break end | |
808 | + -- 保底是全随机,不用比较类型 | |
809 | + if not isFloorBack then | |
810 | + for idx, field in ipairs(condition) do | |
811 | + if heroData[field] ~= values[idx] then ok = false break end | |
812 | + end | |
1014 | 813 | end |
1015 | 814 | if not ok then break end |
1016 | - if oneData["pool_" .. poolId] > 0 then | |
1017 | - resultPool[itemId] = {oneData["pool_" .. poolId]} -- itemId, count, 概率 | |
815 | + if oneData[pool_str] > 0 then | |
816 | + resultPool[itemId] = {oneData[pool_str]} -- itemId, count, 概率 | |
1018 | 817 | end |
1019 | 818 | break |
1020 | 819 | end |
... | ... | @@ -1022,35 +821,58 @@ function _M.drawHeroRpc(agent, data) |
1022 | 821 | end |
1023 | 822 | end |
1024 | 823 | |
1025 | - role:costItems(cost, {log = {desc = "drawHero", short1 = btype, int1 = poolId}}) | |
824 | + role:costItems(cost, {log = {desc = "drawHero", int1 = btype, int2 = poolId}}) | |
825 | + | |
826 | + local guideHero | |
827 | + if role:getProperty("newerGuide") == "11=1" then | |
828 | + guideHero = 613 | |
829 | + end | |
1026 | 830 | |
1027 | 831 | local ssrCount = 0 |
1028 | 832 | local reward = {} |
1029 | 833 | for i = 1, drawCount[drawType] do |
834 | + floorHeroCount = floorHeroCount + 1 | |
835 | + local isFloorBack = draw_floor_back_counts and floorHeroCount >= draw_floor_back_counts | |
1030 | 836 | resultPool = {} |
1031 | - while not next(resultPool) do | |
1032 | - fillDrawPool() | |
837 | + fillDrawPool(isFloorBack) | |
838 | + if not next(resultPool) then | |
839 | + skynet.error("random pool error, poolId:" .. poolId) | |
840 | + return | |
841 | + end | |
842 | + | |
843 | + local itemId = math.randWeight(resultPool, 1) | |
844 | + if guideHero then | |
845 | + itemId = guideHero | |
846 | + guideHero = nil | |
1033 | 847 | end |
1034 | 848 | |
1035 | - -- 引导必送 613 丝路德 | |
1036 | - local itemId = guide and 613 or math.randWeight(resultPool, 1) | |
1037 | 849 | local itemData = csvdb["itemCsv"][itemId] |
1038 | 850 | if itemData.quality == HeroQuality.SSR then |
1039 | 851 | ssrCount = ssrCount + 1 |
1040 | 852 | end |
1041 | 853 | |
854 | + if itemData.quality >= HeroQuality.SR then | |
855 | + floorHeroCount = 0 | |
856 | + end | |
857 | + | |
1042 | 858 | if role:isHaveHero(itemData.id - ItemStartId.Hero) then |
1043 | 859 | local fragId = itemData.id - ItemStartId.Hero |
1044 | 860 | local heroData = csvdb["unitCsv"][fragId] |
1045 | 861 | local count = globalCsv.draw_unit_tofragment[heroData.rare] |
1046 | - role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = btype, int1 = poolId}}) | |
862 | + role:award({[fragId] = count}, {log = {desc = "drawHero", int1 = btype, int2 = poolId}}) | |
1047 | 863 | table.insert(reward, {id = fragId, count = count, from = itemId, fcount = 1}) |
1048 | 864 | else |
1049 | - role:award({[itemId] = 1}, {log = {desc = "drawHero", short1 = btype, int1 = poolId}}) | |
865 | + role:award({[itemId] = 1}, {log = {desc = "drawHero", int1 = btype, int2 = poolId}}) | |
1050 | 866 | table.insert(reward, {id = itemId, count = 1}) |
1051 | 867 | end |
1052 | 868 | end |
1053 | 869 | |
870 | + if draw_floor_back_counts then | |
871 | + local floorHero = role:getProperty("floorHero") | |
872 | + floorHero[btype] = floorHeroCount | |
873 | + role:setProperty("floorHero", floorHero) | |
874 | + end | |
875 | + | |
1054 | 876 | if btype == 1 or btype == 2 then |
1055 | 877 | local repayHero = role:getProperty("repayHero") or 0 |
1056 | 878 | repayHero = repayHero + drawCount[drawType] |
... | ... | @@ -1061,7 +883,16 @@ function _M.drawHeroRpc(agent, data) |
1061 | 883 | if ssrCount > 0 then |
1062 | 884 | role:checkTaskEnter("DrawSSR", {count = ssrCount}) |
1063 | 885 | end |
1064 | - role:log("hero_action", {desc = "drawHero", short1 = btype, int1 = drawCount[drawType], int2 = poolId}) | |
886 | + role:finishGuide(11) | |
887 | + | |
888 | + role:log("gacha", { | |
889 | + gacha_id = poolId, -- 卡池ID | |
890 | + gacha_type = btype, -- 卡池类型 | |
891 | + gacha_up = 0, -- 卡池UP角色 | |
892 | + gacha_times = drawCount[drawType], -- 抽卡次数 | |
893 | + gacha_reward = reward, -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
894 | + currency = cost, -- 购买道具消耗的货币 | |
895 | + }) | |
1065 | 896 | SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 |
1066 | 897 | return true |
1067 | 898 | end |
... | ... | @@ -1091,7 +922,6 @@ function _M.repayHeroRpc(agent, data) |
1091 | 922 | role:award({[id] = 1}, {log = {desc = "heroRepay"}}) |
1092 | 923 | reward = {id = id, count = 1} |
1093 | 924 | end |
1094 | - role:log("hero_action", {desc = "heroRepay", int1=result}) | |
1095 | 925 | SendPacket(actionCodes.Hero_repayHeroRpc, MsgPack.pack({reward = reward})) |
1096 | 926 | return true |
1097 | 927 | end |
... | ... | @@ -1114,7 +944,7 @@ function _M.unlockPoolRpc(agent, data) |
1114 | 944 | end |
1115 | 945 | |
1116 | 946 | if needCost then |
1117 | - if not role:costDiamond({count = globalCsv.draw_unlock_pool_diamond or 300, log = {desc = "unlockPool", short1 = type}}) then | |
947 | + if not role:costDiamond({count = globalCsv.draw_unlock_pool_diamond or 300, log = {desc = "unlockPool", int1 = type}}) then | |
1118 | 948 | return |
1119 | 949 | end |
1120 | 950 | end |
... | ... | @@ -1123,9 +953,24 @@ function _M.unlockPoolRpc(agent, data) |
1123 | 953 | role.dailyData:updateProperty({field="unlockPool", value = unlockPool}) |
1124 | 954 | role.dailyData:updateProperty({field="curPool", value = type}) |
1125 | 955 | |
1126 | - role:log("hero_action", {desc = "unlockPool", short1=type}) | |
956 | + --role:log("hero_action", {desc = "unlockPool", int1=type}) | |
1127 | 957 | SendPacket(actionCodes.Hero_unlockPoolRpc, MsgPack.pack({})) |
1128 | 958 | return true |
1129 | 959 | end |
1130 | 960 | |
961 | +function _M.changeCrown(agnet, data) | |
962 | + local role = agent.role | |
963 | + local msg = MsgPack.unpack(data) | |
964 | + | |
965 | + local heroType = msg.heroType | |
966 | + | |
967 | + if not role:isHaveHero(heroType) then return true end | |
968 | + role:setProperty("crown", heroType) | |
969 | + | |
970 | + role:log("hero_show", { | |
971 | + hero_id = heroType, | |
972 | + }) | |
973 | + return true | |
974 | +end | |
975 | + | |
1131 | 976 | return _M |
1132 | 977 | \ No newline at end of file | ... | ... |
src/actions/PvpAction.lua
... | ... | @@ -287,7 +287,7 @@ function _M.startBattleRpc(agent, data) |
287 | 287 | if pvpFree >= globalCsv.pvp_battle_free_count then |
288 | 288 | local cost = {[ItemId.PvpKey] = 1} |
289 | 289 | if not role:checkItemEnough(cost) then return 5 end |
290 | - role:costItems(cost, {log = {desc = "startPvp", short1 = 1}}) | |
290 | + role:costItems(cost, {log = {desc = "startPvp", int1 = 1}}) | |
291 | 291 | else |
292 | 292 | role.dailyData:updateProperty({field = "pvpFree", delta = 1}) |
293 | 293 | end |
... | ... | @@ -296,9 +296,6 @@ function _M.startBattleRpc(agent, data) |
296 | 296 | _pvpStartBattleCacheC = {idx = idx, key = key, revenge = revenge} |
297 | 297 | |
298 | 298 | role:checkTaskEnter("PvpBattle") |
299 | - | |
300 | - | |
301 | - role:log("pvp_action", {desc = "startBattle", short1 = 1, int1 = revenge and 1 or 0}) | |
302 | 299 | end |
303 | 300 | |
304 | 301 | SendPacket(actionCodes.Pvp_startBattleRpc, MsgPack.pack({matchInfo = matchInfo, key = key, result = result, wait = wait})) |
... | ... | @@ -338,11 +335,6 @@ function _M.endBattleRpc(agent, data) |
338 | 335 | local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleC"}}) |
339 | 336 | local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreCommon(match.t == 1 and match.id or -1, isWin) |
340 | 337 | |
341 | - _pvpBattleInfoCacheC = {} --重新发阵容了 没毛病 | |
342 | - _pvpRecordInfoCacheC = {} -- 记录刷新了 | |
343 | - _pvpRecordBattleInfoCacheC = {} -- 取新纪录的时候搞 | |
344 | - _pvpStartBattleCacheC = nil | |
345 | - | |
346 | 338 | -- 请求上传录像 |
347 | 339 | local params = { |
348 | 340 | ["roleid"] = roleId, |
... | ... | @@ -392,8 +384,21 @@ function _M.endBattleRpc(agent, data) |
392 | 384 | role:checkTaskEnter("PvpWin", {score = myScore}) |
393 | 385 | end |
394 | 386 | |
395 | - role:log("pvp_action", {desc = "battleEnd", short1 = 1, int1 = isWin and 1 or 0, int2 = revenge and 1 or 0}) | |
387 | + role:checkBattle("pvpc", { | |
388 | + isWin = isWin, | |
389 | + info = msg.info, | |
390 | + robotId = match.t == 2 and match.id or nil, | |
391 | + enemy = match.t == 1 and _pvpBattleInfoCacheC[match.id] or nil, | |
392 | + score = myScore, | |
393 | + reward = reward, | |
394 | + rank = myRank, | |
395 | + }) | |
396 | 396 | |
397 | + _pvpBattleInfoCacheC = {} --重新发阵容了 没毛病 | |
398 | + _pvpRecordInfoCacheC = {} -- 记录刷新了 | |
399 | + _pvpRecordBattleInfoCacheC = {} -- 取新纪录的时候搞 | |
400 | + _pvpStartBattleCacheC = nil | |
401 | + | |
397 | 402 | SendPacket(actionCodes.Pvp_endBattleRpc, MsgPack.pack({ |
398 | 403 | reward = reward, |
399 | 404 | change = change, |
... | ... | @@ -494,7 +499,7 @@ function _M.startBattleHRpc(agent, data) |
494 | 499 | if pvpFreeH >= globalCsv.pvp_battle_free_count_high then |
495 | 500 | local cost = {[ItemId.PvpKey] = globalCsv.pvp_battle_high_cost} |
496 | 501 | if not role:checkItemEnough(cost) then return 5 end |
497 | - role:costItems(cost, {log = {desc = "startPvp", short1 = 2}}) | |
502 | + role:costItems(cost, {log = {desc = "startPvp", int1 = 2}}) | |
498 | 503 | else |
499 | 504 | role.dailyData:updateProperty({field = "pvpFreeH", delta = 1}) |
500 | 505 | end |
... | ... | @@ -520,8 +525,6 @@ function _M.startBattleHRpc(agent, data) |
520 | 525 | |
521 | 526 | role:checkTaskEnter("PvpBattle") |
522 | 527 | |
523 | - role:log("pvp_action", {desc = "startBattle", short1 = 2, int1 = revenge and 1 or 0}) | |
524 | - | |
525 | 528 | end |
526 | 529 | |
527 | 530 | SendPacket(actionCodes.Pvp_startBattleHRpc, MsgPack.pack({ |
... | ... | @@ -683,6 +686,17 @@ function _M.endBattleHRpc(agent, data) |
683 | 686 | end |
684 | 687 | end) |
685 | 688 | |
689 | + role:checkBattle("pvph", { | |
690 | + isWin = isWin, | |
691 | + info = msg.info, | |
692 | + robotId = match.t == 2 and match.id or nil, | |
693 | + enemy = match.t == 1 and (revenge and _pvpRecordBattleInfoCacheH[match.id] or _pvpBattleInfoCacheH[match.id]) or nil, | |
694 | + score = myScore, | |
695 | + reward = reward, | |
696 | + rank = myRank, | |
697 | + }) | |
698 | + | |
699 | + | |
686 | 700 | _pvpBattleInfoCacheH = {} --重新发阵容了 没毛病 |
687 | 701 | _pvpRecordInfoCacheH = {} -- 记录刷新了 |
688 | 702 | _pvpRecordBattleInfoCacheH = {} -- 取新纪录的时候搞 |
... | ... | @@ -693,8 +707,7 @@ function _M.endBattleHRpc(agent, data) |
693 | 707 | if isWin then |
694 | 708 | role:checkTaskEnter("PvpWin", {score = myScore}) |
695 | 709 | end |
696 | - role:log("pvp_action", {desc = "battleEnd", short1 = 2, int1 = isWin and 1 or 0, int2 = revenge and 1 or 0}) | |
697 | - | |
710 | + | |
698 | 711 | SendPacket(actionCodes.Pvp_endBattleHRpc, MsgPack.pack({ |
699 | 712 | reward = reward, |
700 | 713 | change = change, |
... | ... | @@ -842,7 +855,6 @@ function _M.highDivisionGiftRpc(agent, data) |
842 | 855 | }) |
843 | 856 | |
844 | 857 | local reward, change = role:award(newReward, {log = {desc = "pvpDivisionH"}}) |
845 | - role:log("pvp_action", {desc = "pvpDivisionH"}) | |
846 | 858 | |
847 | 859 | SendPacket(actionCodes.Pvp_highDivisionGiftRpc, MsgPack.pack(role:packReward(reward, change))) |
848 | 860 | return true |
... | ... | @@ -877,8 +889,6 @@ function _M.shopBuyRpc(agent, data) |
877 | 889 | end |
878 | 890 | local reward, change = role:award(gift, {log = {desc = "pvpShop", int1 = id, int2 = count}}) |
879 | 891 | |
880 | - role:log("pvp_action", {desc = "pvpShop", int1 = id, int2 = count}) | |
881 | - | |
882 | 892 | SendPacket(actionCodes.Pvp_shopBuyRpc, MsgPack.pack(role:packReward(reward, change))) |
883 | 893 | return true |
884 | 894 | end |
... | ... | @@ -970,7 +980,6 @@ function _M.crossBetRpc(agent, data) |
970 | 980 | local result, code = role:setCrossServerPvpBet(msg.idx) |
971 | 981 | if not result then return 10 + code end |
972 | 982 | |
973 | - role:log("pvp_action", {desc = "crossBet"}) | |
974 | 983 | SendPacket(actionCodes.Pvp_crossBetRpc, MsgPack.pack(result)) |
975 | 984 | return true |
976 | 985 | end | ... | ... |
src/actions/RoleAction.lua
... | ... | @@ -99,6 +99,29 @@ function _M.loginRpc( agent, data ) |
99 | 99 | role:reloadWhenLogin() |
100 | 100 | end |
101 | 101 | |
102 | + | |
103 | + role.sysVersion = msg.sysVersion | |
104 | + role.ip = agent.ip:toArray(false, ":")[1] | |
105 | + role.clientVersion = msg.clientVersion | |
106 | + role.network = msg.network | |
107 | + | |
108 | + if msg.subId then | |
109 | + role:setProperty("sid", msg.subId) | |
110 | + end | |
111 | + | |
112 | + if msg.deviceMode then | |
113 | + local deviceMode = tostring(msg.deviceMode) | |
114 | + if role:getProperty("dmode") ~= deviceMode then | |
115 | + role:setProperty("dmode", deviceMode) | |
116 | + end | |
117 | + end | |
118 | + if msg.device then | |
119 | + local device = tostring(msg.device) | |
120 | + if role:getProperty("device") ~= device then | |
121 | + role:setProperty("device", device) | |
122 | + end | |
123 | + end | |
124 | + | |
102 | 125 | if not msg.isGMlogin then |
103 | 126 | local banTime = role:getProperty("banTime") |
104 | 127 | if banTime > now then |
... | ... | @@ -114,6 +137,20 @@ function _M.loginRpc( agent, data ) |
114 | 137 | role:setBan(0) |
115 | 138 | end |
116 | 139 | end |
140 | + | |
141 | + if msg.deviceMode then | |
142 | + local deviceMode = tostring(msg.deviceMode) | |
143 | + if role:getProperty("dmode") ~= deviceMode then | |
144 | + role:setProperty("dmode", deviceMode) | |
145 | + end | |
146 | + end | |
147 | + if msg.device then | |
148 | + local device = tostring(msg.device) | |
149 | + if role:getProperty("device") ~= device then | |
150 | + role:setProperty("device", device) | |
151 | + end | |
152 | + end | |
153 | + | |
117 | 154 | SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start") |
118 | 155 | |
119 | 156 | role:changeStructVersion() -- 数据结构 版本更新 |
... | ... | @@ -253,7 +290,7 @@ function _M.loginRpc( agent, data ) |
253 | 290 | role:savePvpHTeam() |
254 | 291 | |
255 | 292 | local hangPass = role:getProperty("hangPass") |
256 | - role:log("login", {key1 = agent.ip:toArray(false, ":")[1], int1 = hangPass[1] or 0}) | |
293 | + role:log("onLogin") | |
257 | 294 | |
258 | 295 | return true |
259 | 296 | end |
... | ... | @@ -271,6 +308,13 @@ function _M.createRpc(agent, data) |
271 | 308 | SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) |
272 | 309 | return true |
273 | 310 | end |
311 | + local stopcreate = tonumber(redisproxy:hget("autoincrement_set", "stopcreate")) | |
312 | + if stopcreate and stopcreate > 0 then | |
313 | + response.result = "STOP_CREATE" | |
314 | + SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) | |
315 | + return true | |
316 | + end | |
317 | + | |
274 | 318 | |
275 | 319 | local roleId = getNextRoleId() |
276 | 320 | if not roleId then |
... | ... | @@ -286,7 +330,8 @@ function _M.createRpc(agent, data) |
286 | 330 | sid = msg.subId or 0, |
287 | 331 | name = roleName, |
288 | 332 | uname = msg.uname or "", |
289 | - device = tostring(msg.device) | |
333 | + device = tostring(msg.device), | |
334 | + dmode = msg.deviceMode and tostring(msg.deviceMode) or nil | |
290 | 335 | }) |
291 | 336 | |
292 | 337 | if newRole:create() then |
... | ... | @@ -300,11 +345,20 @@ function _M.createRpc(agent, data) |
300 | 345 | return true |
301 | 346 | end |
302 | 347 | newRole:startActionUcode() |
348 | + newRole.sysVersion = msg.sysVersion | |
349 | + newRole.ip = agent.ip:toArray(false, ":")[1] | |
350 | + newRole.clientVersion = msg.clientVersion | |
351 | + newRole.network = msg.network | |
352 | + | |
303 | 353 | newRole:award(globalCsv.birthItem, {log = {desc = "birth"}, notNotify = true}) |
304 | 354 | -- 欢迎邮件 |
305 | 355 | redisproxy:insertEmail({roleId = roleId, emailId = 1}) |
306 | 356 | |
307 | - newRole:log("create", {key1 = agent.ip:toArray(false, ":")[1]}) | |
357 | + if msg.newuser then | |
358 | + newRole:log("onCreateAccount") | |
359 | + end | |
360 | + newRole:log("onCreateRole") | |
361 | + | |
308 | 362 | |
309 | 363 | SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) |
310 | 364 | return true |
... | ... | @@ -406,11 +460,21 @@ function _M.saleItemRpc(agent, data) |
406 | 460 | end |
407 | 461 | local sellEffect = itemData.sell_effect:toArray(true, "=") |
408 | 462 | reward[sellEffect[1]] = (reward[sellEffect[1]] or 0) + sellEffect[2] * count |
463 | + | |
464 | + role:log("carriage_decals", { | |
465 | + item_id = itemId, --道具id | |
466 | + item_type = itemData.type, --道具类型,具体见枚举表中道具类型枚举表 | |
467 | + item_level = 0, --道具等级 | |
468 | + item_number = count, --道具变化数量的绝对值 | |
469 | + carriage_decals_rwdid = sellEffect[1], --拆解获得物资ID | |
470 | + carriage_decals_rwdnum = sellEffect[2] * count, --拆解获得物资数量 | |
471 | + }) | |
409 | 472 | end |
410 | 473 | |
411 | 474 | role:costItems(backs, {log = {desc = "saleItem"}}) |
412 | 475 | local reward, change = role:award(reward, {log = {desc = "saleItem"}}) |
413 | 476 | role:checkTaskEnter("DecoFrag", {count = fragCount}) |
477 | + | |
414 | 478 | SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack(role:packReward(reward, change))) |
415 | 479 | return true |
416 | 480 | end |
... | ... | @@ -483,12 +547,14 @@ function _M.openTimeBoxRpc(agent, data) |
483 | 547 | elseif oper == 2 then -- 领取 |
484 | 548 | local quick = msg.quick |
485 | 549 | if not boxL[slot] then return end |
550 | + local costKey = 0 | |
551 | + local costTime = skynet.timex() - boxL[slot].time | |
486 | 552 | if boxL[slot].time > skynet.timex() then -- 没开完 |
487 | 553 | if not quick then return end |
488 | 554 | local cost_pre = globalCsv.box_timeOpen_diamond:toArray(true, "=") |
489 | - local costD = math.ceil((boxL[slot].time - skynet.timex()) / (cost_pre[1] * 60)) * cost_pre[2] | |
490 | - if not role:checkItemEnough({[ItemId.BoxKey] = costD}) then return end | |
491 | - role:costItems({[ItemId.BoxKey] = costD}, {log = {desc = "openTimeBox"}}) | |
555 | + local costKey = math.ceil((boxL[slot].time - skynet.timex()) / (cost_pre[1] * 60)) * cost_pre[2] | |
556 | + if not role:checkItemEnough({[ItemId.BoxKey] = costKey}) then return end | |
557 | + role:costItems({[ItemId.BoxKey] = costKey}, {log = {desc = "openTimeBox"}}) | |
492 | 558 | end |
493 | 559 | local boxId = boxL[slot].id |
494 | 560 | local itemData = csvdb["itemCsv"][boxId] |
... | ... | @@ -518,6 +584,17 @@ function _M.openTimeBoxRpc(agent, data) |
518 | 584 | boxL[slot] = nil |
519 | 585 | reward, change = role:award(reward, {log = {desc = "openTimeBox", int1 = boxId}}) |
520 | 586 | role:checkTaskEnter("OpenBox", {id = boxId, count=1}) |
587 | + | |
588 | + role:log("carriage_dismantle", { | |
589 | + item_id = boxId, -- 道具id | |
590 | + item_type = itemData.type, -- 道具类型,具体见枚举表中道具类型枚举表 | |
591 | + item_level = 0, -- 道具等级 | |
592 | + item_number = 1, -- 道具变化数量的绝对值 | |
593 | + carriage_dismantle_type = quick and 1 or 0, -- 拆解方式,时间到期:0,钥匙开启:1 | |
594 | + carriage_dismantle_time = costTime, -- 拆解耗时,填写实际耗时 | |
595 | + carriage_dismantle_cost = costKey, -- 拆解花费钥匙数量,未使用填写0 | |
596 | + carriage_dismantle_rwd = reward, -- 拆解获得物资,json格式记录,{'itemid1':2,'itemid2':3,…………..} | |
597 | + }) | |
521 | 598 | else |
522 | 599 | return |
523 | 600 | end |
... | ... | @@ -605,6 +682,15 @@ function _M.storyBookRewardRpc(agent, data) |
605 | 682 | storyStatus[storyId].s = -1 |
606 | 683 | role:changeUpdates({{ type = "storyB", field = storyId, value = storyStatus[storyId] }}) |
607 | 684 | local reward, change = role:award(storyBookData.gift, {log = {desc = "storybookReward", int1 = storyId}}) |
685 | + | |
686 | + role:log("carriage_decals", { | |
687 | + carriage_video_type = storyBookData.type, --放映室类型,剧情CG:0, 角色CG:1, 主线剧情:2, 角色剧情:3, 活动剧情:4, 图鉴:5 | |
688 | + carriage_video_id = storyId, --放映室片段ID | |
689 | + carriage_video_coinid = reward[ItemId.Gold] and ItemId.Gold or 0, --放映奖励货币类型,无奖励则填写0 | |
690 | + carriage_video_coinnum = reward[ItemId.Gold] or 0, --放映奖励货币数量,无奖励则填写0 | |
691 | + carriage_video_item = reward, --放映奖励其他物品数量,json格式记录,{'itemid1':10,'itemid2':5,…………..},无奖励则填写0 | |
692 | + }) | |
693 | + | |
608 | 694 | SendPacket(actionCodes.Role_storyBookRewardRpc, MsgPack.pack(role:packReward(reward, change))) |
609 | 695 | return true |
610 | 696 | end |
... | ... | @@ -667,6 +753,12 @@ function _M.taskRpc(agent, data) |
667 | 753 | local oldVal = role:getProperty("battlePoint") or 0 |
668 | 754 | role:updateProperty({field = "battlePoint", value = oldVal + taskData.active}) |
669 | 755 | |
756 | + role:log("task_reward", { | |
757 | + task_reward_id = taskId, --任务奖励ID | |
758 | + task_reward_type = taskType, --任务奖励类型,见 任务奖励类型枚举表 | |
759 | + task_reward_detail = reward, --任务奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
760 | + }) | |
761 | + | |
670 | 762 | SendPacket(actionCodes.Role_taskRpc, MsgPack.pack(role:packReward(reward, change))) |
671 | 763 | return true |
672 | 764 | end |
... | ... | @@ -756,6 +848,12 @@ function _M.achiveRpc(agent, data) |
756 | 848 | end |
757 | 849 | end |
758 | 850 | |
851 | + role:log("achievement", { | |
852 | + achievement_id = taskId, -- 成就id | |
853 | + achievement_type = achiveTask.type, -- 成就类型,具体枚举表中成就类型枚举表 | |
854 | + achievement_reward = reward, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
855 | + }) | |
856 | + | |
759 | 857 | SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) |
760 | 858 | return true |
761 | 859 | end |
... | ... | @@ -874,6 +972,13 @@ function _M.chatRpc(agent, data) |
874 | 972 | if not result then |
875 | 973 | check[cmd]() |
876 | 974 | end |
975 | + | |
976 | + role:log("communication", { | |
977 | + publish_type = cmd, --发言类型,1,世界 2私聊 | |
978 | + publish_status = 0, --发送状态,发送成功:0,发送失败:1,被屏蔽:2,其他:3 | |
979 | + publish_receive_roleid = msg.roleId, --接收者角色ID | |
980 | + publish_text = content, --发言内容 | |
981 | + }) | |
877 | 982 | SendPacket(actionCodes.Role_chatRpc, MsgPack.pack({result = result, waitTime = waitTime})) |
878 | 983 | return true |
879 | 984 | end |
... | ... | @@ -902,8 +1007,6 @@ function _M.changeSettingRpc(agent, data) |
902 | 1007 | setting[id] = status |
903 | 1008 | role:updateProperty({field = "setting", value = setting}) |
904 | 1009 | |
905 | - role:log("role_action", {desc = "changeSetting", int1 = id, int2 = status}) | |
906 | - | |
907 | 1010 | SendPacket(actionCodes.Role_changeSettingRpc, '') |
908 | 1011 | return true |
909 | 1012 | end |
... | ... | @@ -932,8 +1035,15 @@ function _M.drawCodeRpc(agent, data) |
932 | 1035 | if ret == 0 then |
933 | 1036 | local giftId = tonumber(result.giftId) |
934 | 1037 | role:setProperty("codeStr", codestr:setv(giftId, 1)) |
935 | - local reward, change = role:award(result.gift, {log = {desc = "drawCode", key1 = code, int1 = giftId}}) | |
1038 | + local reward, change = role:award(result.gift, {log = {desc = "drawCode", int1 = giftId}}) | |
936 | 1039 | |
1040 | + role:log("get_gift", { | |
1041 | + gift_id = giftId, -- 礼包ID | |
1042 | + gift_key = code, -- 礼包key | |
1043 | + gift_reward = reward, -- 礼包奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
1044 | + gift_name = "", -- 礼包名称 | |
1045 | + gift_reason = 0, -- 礼包发放原因,见发放原因枚举表 | |
1046 | + }) | |
937 | 1047 | SendPacket(actionCodes.Role_drawCodeRpc, MsgPack.pack({ |
938 | 1048 | result = ret, |
939 | 1049 | reward = reward, |
... | ... | @@ -988,17 +1098,15 @@ function _M.guideRpc(agent, data) |
988 | 1098 | local cmdType = msg.cmdType |
989 | 1099 | |
990 | 1100 | local funcGuide = role:getProperty("funcGuide") |
991 | - local newerGuide = role:getProperty("newerGuide") | |
992 | 1101 | if cmdType == 1 then |
993 | 1102 | -- 新手引导 |
994 | 1103 | local master = msg.master or -1 |
995 | 1104 | local slave = msg.slave or -1 |
996 | 1105 | if master < 0 or slave < 0 then return end |
997 | - newerGuide = string.format("%d=%d",master,slave) | |
998 | - role:updateProperty({field = "newerGuide", value = newerGuide}) | |
999 | - role:log("guide", {desc = "guide_new",int1 = master*1000+slave}) | |
1106 | + | |
1107 | + role:saveGuide(master, slave) | |
1000 | 1108 | elseif cmdType == 2 then |
1001 | - -- 系统引导 | |
1109 | + -- 系统引导(玩家可选择是否进行) | |
1002 | 1110 | if not msg.skip then return end |
1003 | 1111 | local new = math.min(funcGuide:getv(0, 0), msg.skip) |
1004 | 1112 | if new < 0 then |
... | ... | @@ -1009,15 +1117,23 @@ function _M.guideRpc(agent, data) |
1009 | 1117 | |
1010 | 1118 | if msg.funcType then |
1011 | 1119 | funcGuide = funcGuide:setv(msg.funcType, 1) |
1012 | - role:log("guide", {desc = "guide_sys", int1 = msg.funcType}) | |
1120 | + role:log("onGuidePoint", {guild_type = 2, guild_id = msg.funcType, guild_point = 0, guild_pass = 0}) | |
1013 | 1121 | end |
1014 | 1122 | role:updateProperty({field = "funcGuide", value = funcGuide}) |
1015 | 1123 | elseif cmdType == 3 then |
1016 | - -- 弱引导 | |
1124 | + -- 系统引导(强制进行) | |
1125 | + if msg.funcType and csvdb["guide_unlockCsv"][msg.funcType] then | |
1126 | + role:saveGuide(csvdb["guide_unlockCsv"][msg.funcType].guideId,1) | |
1127 | + funcGuide = funcGuide:setv(msg.funcType, 1) | |
1128 | + role:updateProperty({field = "funcGuide", value = funcGuide}) | |
1129 | + role:log("onGuidePoint", {guild_type = 1, guild_id = msg.funcType, guild_point = 0, guild_pass = 0}) | |
1130 | + end | |
1131 | + elseif cmdType == 4 then | |
1132 | + -- 弹出一个tips(进入功能界面也许要自动弹说明,value要区分1、2) | |
1017 | 1133 | if msg.funcType then |
1018 | 1134 | local value = msg.value or 1 |
1019 | 1135 | for _, funcIdx in pairs(msg.funcType:toArray(true,"=")) do |
1020 | - role:log("guide", {desc = "guide_weak", int1 = funcIdx}) | |
1136 | + role:log("onGuidePoint", {guild_type = 3, guild_id = funcIdx, guild_point = 0, guild_pass = 0}) | |
1021 | 1137 | funcGuide = funcGuide:setv(funcIdx, value) |
1022 | 1138 | end |
1023 | 1139 | role:updateProperty({field = "funcGuide", value = funcGuide}) |
... | ... | @@ -1065,4 +1181,17 @@ function _M.goldBuyRpc(agent, data) |
1065 | 1181 | return true |
1066 | 1182 | end |
1067 | 1183 | |
1184 | +function _M.getDownloadCvRewardRpc(agent, data) | |
1185 | + local role = agent.role | |
1186 | + local flag = role:getProperty("downCvR") or 0 | |
1187 | + if flag ~= 0 then | |
1188 | + return 1 | |
1189 | + end | |
1190 | + local r = globalCsv.role_download_cv_reward | |
1191 | + local reward, change = role:award(r, {log = {desc = "downloadCv"}}) | |
1192 | + role:updateProperty({field="downCvR", value=1}) | |
1193 | + SendPacket(actionCodes.Role_getDownloadCvRewardRpc, MsgPack.pack(role:packReward(reward, change))) | |
1194 | + return true | |
1195 | +end | |
1196 | + | |
1068 | 1197 | return _M |
1069 | 1198 | \ No newline at end of file | ... | ... |
src/actions/StoreAction.lua
... | ... | @@ -31,6 +31,7 @@ function _M.rechargeRpc(agent , data) |
31 | 31 | local partnerOrderId = makeOrder(roleId, id) |
32 | 32 | SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) |
33 | 33 | |
34 | + | |
34 | 35 | -- 测试的 直接发奖励了 |
35 | 36 | skynet.timeout(10, function () |
36 | 37 | role:handlePurchase({ |
... | ... | @@ -84,7 +85,7 @@ function _M.googleRechargeRpc(agent, data) |
84 | 85 | money = dataSet.rmb * 100, |
85 | 86 | game_money = dataSet.diamond, |
86 | 87 | product_id = dataSet.productId, |
87 | - notify_url = "http://l11-ts-pub-all-wasteland.komoejoy.com/pay/google" | |
88 | + notify_url = msg.notifyUrl | |
88 | 89 | } |
89 | 90 | local sign = signPms(need, secret_key) |
90 | 91 | |
... | ... | @@ -110,7 +111,7 @@ function _M.myCardRechargeRpc(agent, data) |
110 | 111 | out_trade_no = partnerOrderId, |
111 | 112 | money = dataSet.rmb * 100, |
112 | 113 | game_money = dataSet.diamond, |
113 | - notify_url = "http://l11-ts-pub-all-wasteland.komoejoy.com/pay/mycard" | |
114 | + notify_url = msg.notifyUrl | |
114 | 115 | } |
115 | 116 | local sign = signPms(need, secret_key) |
116 | 117 | |
... | ... | @@ -137,7 +138,7 @@ function _M.iosRechargeRpc(agent, data) |
137 | 138 | money = dataSet.rmb * 100, |
138 | 139 | game_money = dataSet.diamond, |
139 | 140 | product_id = dataSet.iap_product_id, |
140 | - notify_url = "http://l11-ts-pub-all-wasteland.komoejoy.com/pay/ios" | |
141 | + notify_url = msg.notifyUrl | |
141 | 142 | } |
142 | 143 | local sign = signPms(need, secret_key) |
143 | 144 | |
... | ... | @@ -164,6 +165,22 @@ function _M.purchaseOrderResult(agent, data) |
164 | 165 | |
165 | 166 | if msg.status == "success" then |
166 | 167 | orderObject:setProperty("transactionId", msg.platformOrder or "") |
168 | + local rechargeId = orderObject:getProperty("rechargeId") | |
169 | + local dataSet = csvdb["shop_rechargeCsv"][rechargeId] | |
170 | + | |
171 | + role:log("setOrder", { | |
172 | + order_status = 100, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" | |
173 | + item_id = rechargeId, -- 道具id | |
174 | + item_type = dataSet.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 | |
175 | + item_name = dataSet.title, -- 购买的道具名 | |
176 | + item_number = 1, -- 购买的道具数量 | |
177 | + item_level = 1, -- 购买的道具等级 | |
178 | + order_cost = dataSet.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' | |
179 | + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 | |
180 | + order_type = self.getProperty("rmbC") > 0 and 0 or 1, -- 订单类型,首充记录为1,否则为0 | |
181 | + order_id = msg.platformOrder, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' | |
182 | + }) | |
183 | + | |
167 | 184 | return true |
168 | 185 | end |
169 | 186 | |
... | ... | @@ -178,82 +195,6 @@ function _M.purchaseOrderResult(agent, data) |
178 | 195 | end |
179 | 196 | |
180 | 197 | |
181 | -function _M.dailyBuyRpc(agent , data) | |
182 | - local role = agent.role | |
183 | - local msg = MsgPack.unpack(data) | |
184 | - local id = msg.id | |
185 | - local count = msg.count or 1 | |
186 | - | |
187 | - local dataSet = csvdb["shop_diamondCsv"][id] | |
188 | - if not dataSet then return 1 end | |
189 | - | |
190 | - local dailySDC = role.dailyData:getProperty("dailySDC") | |
191 | - | |
192 | - if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (dailySDC[id] or 0))) then return 1 end | |
193 | - | |
194 | - local cost = dataSet.cost | |
195 | - | |
196 | - local dailySDD = role.dailyData:getProperty("dailySDD") | |
197 | - if dailySDD[id] then -- 折扣 | |
198 | - cost = math.ceil(cost * (1 - dataSet.disount / 100)) | |
199 | - end | |
200 | - | |
201 | - if not role:costDiamond({count = cost * count, log = {desc = "dailyShop", int1 = id, int2 = count}}) then | |
202 | - return 4 | |
203 | - end | |
204 | - | |
205 | - if dataSet.limit ~= 0 then | |
206 | - dailySDC[id] = (dailySDC[id] or 0) + count | |
207 | - role.dailyData:updateProperty({field = "dailySDC", value = dailySDC}) | |
208 | - end | |
209 | - local gift = {} | |
210 | - for itemId, count_ in pairs(dataSet.gift:toNumMap()) do | |
211 | - gift[itemId] = count_ * count | |
212 | - end | |
213 | - local reward = role:award(gift, {log = {desc = "dailyShop", int1 = id, int2 = count}}) | |
214 | - role:checkTaskEnter("ShopAll", {count = count}) | |
215 | - | |
216 | - role:log("role_action", {desc = "dailyShop", int1 = id, int2 = count}) | |
217 | - | |
218 | - SendPacket(actionCodes.Store_dailyBuyRpc, MsgPack.pack({reward = reward})) | |
219 | - return true | |
220 | -end | |
221 | - | |
222 | - | |
223 | -function _M.dinerBuyRpc(agent , data) | |
224 | - local role = agent.role | |
225 | - local msg = MsgPack.unpack(data) | |
226 | - local id = msg.id | |
227 | - local count = msg.count or 1 | |
228 | - | |
229 | - local dataSet = csvdb["shop_dinerCsv"][id] | |
230 | - if not dataSet then return end | |
231 | - | |
232 | - local dinerS = role:getProperty("dinerS") | |
233 | - if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (dinerS[id] or 0))) then return 1 end | |
234 | - | |
235 | - local cost = {[ItemId.DinerCoin] = dataSet.cost * count} | |
236 | - if not role:checkItemEnough(cost) then return end | |
237 | - | |
238 | - if dataSet.limit ~= 0 then | |
239 | - dinerS[id] = (dinerS[id] or 0) + count | |
240 | - role:updateProperty({field = "dinerS", value = dinerS}) | |
241 | - end | |
242 | - | |
243 | - role:costItems(cost, {log = {desc = "dinerShop", int1 = id, int2 = count}}) | |
244 | - | |
245 | - local gift = {} | |
246 | - for _id, _count in pairs(dataSet.gift:toNumMap()) do | |
247 | - gift[_id] = _count * count | |
248 | - end | |
249 | - local reward = role:award(gift, {log = {desc = "dinerShop", int1 = id, int2 = count}}) | |
250 | - | |
251 | - role:log("role_action", {desc = "dinerShop", int1 = id, int2 = count}) | |
252 | - | |
253 | - SendPacket(actionCodes.Store_dinerBuyRpc, MsgPack.pack({reward = reward})) | |
254 | - return true | |
255 | -end | |
256 | - | |
257 | 198 | function _M.shopBuyRpc(agent , data) |
258 | 199 | local role = agent.role |
259 | 200 | local msg = MsgPack.unpack(data) |
... | ... | @@ -263,6 +204,13 @@ function _M.shopBuyRpc(agent , data) |
263 | 204 | local dataSet = csvdb["shop_normalCsv"][id] |
264 | 205 | if not dataSet then return end |
265 | 206 | |
207 | + if dataSet.unlock ~= "" then | |
208 | + if not role:checkHangPass(tonumber(config.unlock)) then | |
209 | + skynet.error(string.format("shopBuyRpc,user do not finish hang pass, user_id:%d", role:getProperty("id"))) | |
210 | + return 1 | |
211 | + end | |
212 | + end | |
213 | + | |
266 | 214 | local buyRecord = role.storeData:getProperty("buyR") |
267 | 215 | if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (buyRecord[id] or 0))) then |
268 | 216 | skynet.error(string.format("shop buy over limit, user_id:%d, goods_id:%d", role:getProperty("id"), id)) |
... | ... | @@ -301,8 +249,17 @@ function _M.shopBuyRpc(agent , data) |
301 | 249 | if dataSet.shop == 1 then |
302 | 250 | role:checkTaskEnter("ShopAll", {count = count}) |
303 | 251 | end |
304 | - role:log("role_action", {desc = desc, int1 = id, int2 = count}) | |
305 | - | |
252 | + local costId, costCount = next(cost) | |
253 | + | |
254 | + role:log("shop_purchase", { | |
255 | + item_id = id, -- 道具id | |
256 | + item_type = 0, -- 道具类型,具体见枚举表中道具类型枚举表 | |
257 | + item_level = 0, -- 道具等级 | |
258 | + item_cnt = count, -- 购买数量技术 | |
259 | + currency_type = costId or 0, -- 购买道具消耗的货币类型,记录货币ID | |
260 | + shop_purchase_current = costCount or 0, -- 购买道具消耗的货币数量 | |
261 | + shop_id = dataSet.shop, -- 商店ID | |
262 | + }) | |
306 | 263 | SendPacket(actionCodes.Store_shopBuyRpc, MsgPack.pack({reward = reward})) |
307 | 264 | return true |
308 | 265 | end | ... | ... |
src/actions/TowerAction.lua
... | ... | @@ -76,8 +76,6 @@ function _M.startBattleRpc(agent, data) |
76 | 76 | role:updateProperty({field = "towerInfo", value = towerInfo}) |
77 | 77 | role:checkTaskEnter("TowerBattle", {level = towerInfo.l}) |
78 | 78 | |
79 | - role:log("tower_action", {desc = "startBattle", int1 = id}) | |
80 | - | |
81 | 79 | SendPacket(actionCodes.Tower_startBattleRpc, '') |
82 | 80 | return true |
83 | 81 | end |
... | ... | @@ -116,7 +114,20 @@ function _M.endBattleRpc(agent, data) |
116 | 114 | towerInfo.k = nil |
117 | 115 | role:updateProperty({field = "towerInfo", value = towerInfo}) |
118 | 116 | |
119 | - role:log("tower_action", {desc = "endBattle", short1 = msg.starNum > 0 and 1 or 0, int1 = id}) | |
117 | + | |
118 | + local rank = redisproxy:ZREVRANK(RANK_TOWER, role:getProperty("id")) | |
119 | + if not rank then | |
120 | + rank = -1 | |
121 | + else | |
122 | + rank = rank + 1 | |
123 | + end | |
124 | + role:checkBattle("tower", { | |
125 | + id = id, | |
126 | + isWin = msg.starNum and msg.starNum > 0, | |
127 | + info = msg.info, | |
128 | + reward = reward, | |
129 | + rank = rank, | |
130 | + }) | |
120 | 131 | |
121 | 132 | SendPacket(actionCodes.Tower_endBattleRpc, MsgPack.pack({reward = reward, change = change})) |
122 | 133 | return true |
... | ... | @@ -140,7 +151,6 @@ function _M.bugCountRpc(agent, data) |
140 | 151 | towerInfo.c = curCount |
141 | 152 | towerInfo.t = nextTime |
142 | 153 | role:updateProperty({field = "towerInfo", value = towerInfo}) |
143 | - role:log("tower_action", {desc = "bugCount"}) | |
144 | 154 | |
145 | 155 | SendPacket(actionCodes.Tower_bugCountRpc, '') |
146 | 156 | return true | ... | ... |
src/adv/Adv.lua
... | ... | @@ -24,17 +24,6 @@ function Adv:ctor(owner) |
24 | 24 | self:initByInfo(self.owner:getProperty("advInfo")) |
25 | 25 | end |
26 | 26 | |
27 | -function Adv:log(contents) | |
28 | - contents = contents or {} | |
29 | - if contents["cint1"] or contents["cint2"] or contents["cint3"] then | |
30 | - print("advLog error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
31 | - end | |
32 | - contents["cint1"] = self.chapterId | |
33 | - contents["cint2"] = self.level | |
34 | - | |
35 | - self.owner:log("adv_action", contents) | |
36 | -end | |
37 | - | |
38 | 27 | --初始化adv 信息 |
39 | 28 | function Adv:initByInfo(advInfo) |
40 | 29 | if not next(advInfo) then return end --还没有 开始新地图 |
... | ... | @@ -509,18 +498,18 @@ function Adv:awardArtifact(id, params) |
509 | 498 | self:checkAchievement(Adv.AchievType.GetMWeapon, 1, id) |
510 | 499 | |
511 | 500 | |
512 | - if params.log then | |
513 | - local log = clone(params.log) | |
514 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
515 | - print("awardArtifact error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
516 | - end | |
517 | - log["cint1"] = self.chapterId | |
518 | - log["cint2"] = self.level | |
519 | - log["cint3"] = id | |
520 | - self.owner:log("in_artifact", log) | |
521 | - else | |
522 | - print("awardArtifact no log ", debug.traceback()) | |
523 | - end | |
501 | + -- if params.log then | |
502 | + -- local log = clone(params.log) | |
503 | + -- if log["cint1"] or log["cint2"] or log["cint3"] then | |
504 | + -- print("awardArtifact error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
505 | + -- end | |
506 | + -- log["cint1"] = self.chapterId | |
507 | + -- log["cint2"] = self.level | |
508 | + -- log["cint3"] = id | |
509 | + -- self.owner:log("in_artifact", log) | |
510 | + -- else | |
511 | + -- print("awardArtifact no log ", debug.traceback()) | |
512 | + -- end | |
524 | 513 | if not params.isChoose then |
525 | 514 | self:pushBackEvent(AdvBackEventType.Artifact, {id = id}) |
526 | 515 | end |
... | ... | @@ -609,7 +598,6 @@ function Adv:wearArtifact(slot, id) |
609 | 598 | else |
610 | 599 | id = nil |
611 | 600 | end |
612 | - self:log({desc = "wearArtifact", int1 = id}) | |
613 | 601 | |
614 | 602 | self.owner:changeUpdates({{type = "advAFWear", field = slot, value = id}}) |
615 | 603 | return true |
... | ... | @@ -668,9 +656,6 @@ function Adv:artifactLevelUp(id, level) |
668 | 656 | end |
669 | 657 | if newLv == advAFGet[id] then return end |
670 | 658 | |
671 | - self:log({desc = "artifactLevelUp", int1 = id, int2 = level}) | |
672 | - | |
673 | - | |
674 | 659 | local status = 0 |
675 | 660 | if curWear[id] then -- 穿着呢 |
676 | 661 | local oldData = csvdb["adv_artifactCsv"][id][advAFGet[id]] |
... | ... | @@ -715,8 +700,6 @@ function Adv:chooseArtifact(index) |
715 | 700 | if not self.waitArtifact or not self.waitArtifact[index] then return end |
716 | 701 | self:award({[self.waitArtifact[index]] = 1}, {log = {desc = "chooseArtifact"}, isChoose = true}) |
717 | 702 | |
718 | - self:log({desc = "chooseArtifact", int1 = self.waitArtifact[index]}) | |
719 | - | |
720 | 703 | self.waitArtifact = nil |
721 | 704 | |
722 | 705 | -- 支援效果继续选择 |
... | ... | @@ -809,8 +792,6 @@ function Adv:over(success, rewardRatio, overType) |
809 | 792 | end |
810 | 793 | self:clearAdvUnlockCache() |
811 | 794 | |
812 | - self:log({desc = "over", short1 = success and 1 or 0, int1 = overType}) | |
813 | - | |
814 | 795 | local chapterId = self.chapterId |
815 | 796 | self:clear() |
816 | 797 | self.owner:checkTaskEnter("AdvScore", {score = score}) |
... | ... | @@ -903,6 +884,9 @@ function Adv:award(gift, params) |
903 | 884 | |
904 | 885 | if csvdb["adv_artifactCsv"][itemId] then -- 获得神器 |
905 | 886 | self:awardArtifact(itemId, params) |
887 | + if not self.owner:checkOverGuide(55) then | |
888 | + self.owner:saveGuide(55,1,true) | |
889 | + end | |
906 | 890 | else |
907 | 891 | if nums <= 0 then |
908 | 892 | items = items:delk(itemId) |
... | ... | @@ -911,23 +895,23 @@ function Adv:award(gift, params) |
911 | 895 | items = items:setv(itemId, nums) |
912 | 896 | end |
913 | 897 | |
914 | - if params.log then | |
915 | - local log = clone(params.log) | |
916 | - if log["cint1"] or log["cint2"] or log["cint3"] or log["long1"] then | |
917 | - print("addAdvItem error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
918 | - end | |
919 | - log["cint1"] = itemId | |
920 | - log["cint2"] = math.abs(count) | |
921 | - log["cint3"] = self.chapterId | |
922 | - log["long1"] = self.level | |
923 | - if count >= 0 then | |
924 | - self.owner:log("in_adv", log) | |
925 | - else | |
926 | - self.owner:log("out_adv", log) | |
927 | - end | |
928 | - else | |
929 | - print("addAdvItem no log ", debug.traceback()) | |
930 | - end | |
898 | + -- if params.log then | |
899 | + -- local log = clone(params.log) | |
900 | + -- if log["cint1"] or log["cint2"] or log["cint3"] or log["long1"] then | |
901 | + -- print("addAdvItem error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
902 | + -- end | |
903 | + -- log["cint1"] = itemId | |
904 | + -- log["cint2"] = math.abs(count) | |
905 | + -- log["cint3"] = self.chapterId | |
906 | + -- log["long1"] = self.level | |
907 | + -- if count >= 0 then | |
908 | + -- self.owner:log("in_adv", log) | |
909 | + -- else | |
910 | + -- self.owner:log("out_adv", log) | |
911 | + -- end | |
912 | + -- else | |
913 | + -- print("addAdvItem no log ", debug.traceback()) | |
914 | + -- end | |
931 | 915 | end |
932 | 916 | end |
933 | 917 | if items ~= oldItems then |
... | ... | @@ -1021,7 +1005,6 @@ local function clickOut(self, room, block, params, isExit) |
1021 | 1005 | isRelay = true, |
1022 | 1006 | }) |
1023 | 1007 | else |
1024 | - self:log({desc = "pass"}) | |
1025 | 1008 | self:initByChapter({ |
1026 | 1009 | chapterId = self.chapterId, |
1027 | 1010 | level = self.level + 1, |
... | ... | @@ -1357,6 +1340,10 @@ local function clickDrop(self, room, block, params) |
1357 | 1340 | |
1358 | 1341 | local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}}) |
1359 | 1342 | -- local reward = self:award({[5801] = 1}) |
1343 | + -- 获取绷带的引导 | |
1344 | + if block.event.item[1] == 5020 and not self.owner:checkOverGuide(53,2) then | |
1345 | + self.owner:saveGuide(53,2) | |
1346 | + end | |
1360 | 1347 | block:clear() |
1361 | 1348 | self:backReward(reward, {roomId = room.roomId, blockId = block.blockId}) |
1362 | 1349 | return true | ... | ... |
src/adv/AdvBattle.lua
src/adv/AdvMap.lua
... | ... | @@ -523,7 +523,7 @@ createMap = function(self, mapId, isEnter, isNewRelay) |
523 | 523 | --开放出口 |
524 | 524 | randomFunc[AdvEventType.Diner] = function() |
525 | 525 | -- if not self.adv.isRelay or isEnter or isNewRelay then return false end |
526 | - if not self.adv.isRelay or isEnter then return false end | |
526 | + -- if not self.adv.isRelay or isEnter then return false end | |
527 | 527 | end |
528 | 528 | |
529 | 529 | --boss |
... | ... | @@ -567,7 +567,7 @@ createMap = function(self, mapId, isEnter, isNewRelay) |
567 | 567 | end |
568 | 568 | --建筑 |
569 | 569 | randomFunc[AdvEventType.Build] = function() |
570 | - if self.adv.isRelay and isEnter then return false end | |
570 | + -- if self.adv.isRelay and isEnter then return false end | |
571 | 571 | return randomCommon() |
572 | 572 | end |
573 | 573 | --陷阱 | ... | ... |
src/adv/AdvPassive.lua
... | ... | @@ -300,8 +300,8 @@ function Passive:canEffect(effType, effValue) |
300 | 300 | return |
301 | 301 | end |
302 | 302 | --禁用被动技 |
303 | - local count, bc = self.owner:getDisablePassiveCount() | |
304 | - if bc > 0 and (count == 0 or self.owner:getPassiveIdx(self) <= count) then | |
303 | + local count = self.owner:getDisablePassiveCount() | |
304 | + if count and (count == 0 or self.owner:getPassiveIdx(self) <= count) then | |
305 | 305 | return |
306 | 306 | end |
307 | 307 | return true |
... | ... | @@ -466,7 +466,8 @@ function Passive:effect8(dropId) |
466 | 466 | skynet.error(string.format("CSVDATA Error adv_map_passive %s effect 8 not id %s in event_drop", self.id, dropId)) |
467 | 467 | end |
468 | 468 | local item = dropData["range"]:randWeight(true) |
469 | - self.owner.battle.adv:award({[item[1]] = item[2]}, {log = {desc = "passive", int1 = self.id}}) | |
469 | + self.owner.battle.adv:backReward(self.owner.battle.adv:award({[item[1]] = item[2]}, {log = {desc = "passive", int1 = self.id}}), {roomId = self.owner.roomId, blockId = self.owner.blockId}) | |
470 | + | |
470 | 471 | end |
471 | 472 | |
472 | 473 | --9=直接获得item(可在结算触发时使用) |
... | ... | @@ -480,7 +481,7 @@ function Passive:effect9(itemId, triggerPms, ratio, max) |
480 | 481 | return |
481 | 482 | end |
482 | 483 | if not cond then return end |
483 | - self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio)))}, {log = {desc = "passive", int1 = self.id}}) | |
484 | + self.owner.battle.adv:backReward(self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio)))}, {log = {desc = "passive", int1 = self.id}}), {roomId = self.owner.roomId, blockId = self.owner.blockId}) | |
484 | 485 | end |
485 | 486 | |
486 | 487 | --10=战斗额外掉落次数 |
... | ... | @@ -520,5 +521,17 @@ function Passive:effect13(eventType, triggerPms, eventId, count) |
520 | 521 | end |
521 | 522 | end |
522 | 523 | |
524 | +--14=给所有场上怪物增加buff 《 限定 怪 id》 除了自己 | |
525 | +function Passive:effect14(value, triggerPms, enemyId) | |
526 | + local aims = self.owner.battle.player:getTeam(2) | |
527 | + for k , aim in pairs(aims) do | |
528 | + if aim ~= self.owner then | |
529 | + if not enemyId or enemyId == 0 or aim.monsterId == enemyId then | |
530 | + aim:addBuff(value, self.owner) | |
531 | + end | |
532 | + end | |
533 | + end | |
534 | +end | |
535 | + | |
523 | 536 | |
524 | 537 | return Passive |
525 | 538 | \ No newline at end of file | ... | ... |
src/adv/AdvPlayer.lua
... | ... | @@ -122,14 +122,16 @@ function BaseObject:getPassiveIdx(passive) |
122 | 122 | end |
123 | 123 | |
124 | 124 | function BaseObject:getDisablePassiveCount() |
125 | - local count, bc = 0, 0 | |
125 | + local count | |
126 | 126 | for _, buff in ipairs(self.buffs) do |
127 | 127 | if not buff.isDel and buff:getType() == Buff.DISABLE_BUFF then |
128 | - count = count + buff:effect() | |
129 | - bc = bc + 1 | |
128 | + if buff:effect() == 0 then | |
129 | + return 0 | |
130 | + end | |
131 | + count = (count or 0) + buff:effect() | |
130 | 132 | end |
131 | 133 | end |
132 | - return count, bc | |
134 | + return count | |
133 | 135 | end |
134 | 136 | |
135 | 137 | function BaseObject:addBuff(buffId, releaser) |
... | ... | @@ -208,6 +210,9 @@ function BaseObject:hadBuffById(bId) |
208 | 210 | end |
209 | 211 | end |
210 | 212 | |
213 | +function BaseObject:reSetSpMax() | |
214 | +end | |
215 | + | |
211 | 216 | |
212 | 217 | -- 通用的buff 效果汇总 -- 0 固定 1百分比 两种分类 |
213 | 218 | function BaseObject:getCommonBuffEffect(bType, otherCond) | ... | ... |
src/adv/AdvTask.lua
... | ... | @@ -365,7 +365,6 @@ function AdvTask.bind(Adv) |
365 | 365 | else |
366 | 366 | if (status or -1) >= data.value1 then |
367 | 367 | status = -1 |
368 | - self.owner:log("adv_action", {desc = "finishAchiev", short1 = 1, int1 = self.chapterId, int2 = taskId}) | |
369 | 368 | end |
370 | 369 | if status and status ~= oldStatus then |
371 | 370 | insertChange(self, self.chapterId, taskId, status) | ... | ... |
src/agent.lua
... | ... | @@ -282,7 +282,7 @@ function CMD.close() |
282 | 282 | mcast_util.usub_union() |
283 | 283 | local role = agentInfo.role |
284 | 284 | if not role then return end |
285 | - role:log("logout", {int1 = skynet.timex()-role:getProperty("ltime")}) | |
285 | + role:log("onLogout", {logtime = skynet.timex()-role:getProperty("ltime")}) | |
286 | 286 | role:onOfflineEvent() |
287 | 287 | end |
288 | 288 | ... | ... |
src/models/Activity.lua
... | ... | @@ -8,6 +8,8 @@ Activity.ActivityType = { |
8 | 8 | DrawHero = 4, --抽卡周 招募 |
9 | 9 | AdvDraw = 5, --拾荒抽周 资助 |
10 | 10 | OpenBox = 6, --拆解周 时钟箱 |
11 | + | |
12 | + SsrUpPoolChange = 10, -- 特定英雄活动,切卡池 | |
11 | 13 | } |
12 | 14 | |
13 | 15 | |
... | ... | @@ -181,13 +183,16 @@ activityFunc[Activity.ActivityType.Sign] = { |
181 | 183 | --loop2:累计招募N次 |
182 | 184 | --loop3:累计资助N次 |
183 | 185 | --loop4:时钟箱拆解N个 |
184 | -function Activity:checkWeeklyAct(actType, notify, count) | |
186 | +function Activity:checkWeeklyAct(actType, notify, count, pool) | |
185 | 187 | local actInfoMap = { |
186 | 188 | [Activity.ActivityType.DrawHero] = {mailId = MailId.ActDrawCardReward, table = "activity_loop2Csv"}, |
187 | 189 | [Activity.ActivityType.AdvDraw] = {mailId = MailId.ActAdvDrawReward, table = "activity_loop3Csv"}, |
188 | 190 | [Activity.ActivityType.OpenBox] = {mailId = MailId.ActOpenBoxReward, table = "activity_loop4Csv"}, |
189 | 191 | [Activity.ActivityType.FoodSell] = {mailId = MailId.ActSellFoodReward, table = "activity_loop1Csv"} |
190 | 192 | } |
193 | + if actType == Activity.ActivityType.DrawHero and pool == DrawCardType.FriendDraw then | |
194 | + return | |
195 | + end | |
191 | 196 | local info = actInfoMap[actType] |
192 | 197 | if not info then return end |
193 | 198 | |
... | ... | @@ -210,6 +215,13 @@ function Activity:checkWeeklyAct(actType, notify, count) |
210 | 215 | end |
211 | 216 | if not curData[cfg.id] and curData[0] >= cfg.condition1 then |
212 | 217 | if info.mailId then |
218 | + | |
219 | + self.owner:log("activity", { | |
220 | + activity_id = cfg.id, -- 活动ID(或活动指定任务的ID) | |
221 | + activity_type = actType, -- 活动类型,见活动类型枚举表 | |
222 | + activity_reward = cfg.reward:toNumMap(), -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
223 | + }) | |
224 | + | |
213 | 225 | self.owner:sendMail(info.mailId, nil, cfg.reward, {cfg.condition1}) |
214 | 226 | curData[cfg.id] = 1 |
215 | 227 | end |
... | ... | @@ -234,8 +246,8 @@ end |
234 | 246 | |
235 | 247 | -- 抽卡周 |
236 | 248 | activityFunc[Activity.ActivityType.DrawHero] = { |
237 | - ["check"] = function(self, actType, notify, count) -- 检查 | |
238 | - self:checkWeeklyAct(actType, notify, count) | |
249 | + ["check"] = function(self, actType, notify, count, pool) -- 检查 | |
250 | + self:checkWeeklyAct(actType, notify, count, pool) | |
239 | 251 | end, |
240 | 252 | ["init"] = function(self, actType, isCrossDay, notify) |
241 | 253 | local roundData = self:getProperty("round") |
... | ... | @@ -281,7 +293,6 @@ activityFunc[Activity.ActivityType.AdvDraw] = { |
281 | 293 | -- ["close"] = function(self, actType, notify) |
282 | 294 | -- end, |
283 | 295 | ["crossDay"] = function(self, actType, notify) |
284 | - print("cross day act adv cost") | |
285 | 296 | self.owner:sendMail(MailId.ActAdvDraw) |
286 | 297 | end, |
287 | 298 | } |
... | ... | @@ -355,5 +366,23 @@ function Activity:getActHangDoubleTime(lastTs, nowTs) |
355 | 366 | return 0 |
356 | 367 | end |
357 | 368 | |
369 | +-- 获取活动卡池id | |
370 | +function Activity:getActivityPool(mainType, subType) | |
371 | + if not self:isOpen(Activity.ActivityType.SsrUpPoolChange) then | |
372 | + return 0 | |
373 | + end | |
374 | + local actData = csvdb["activity_ctrlCsv"][Activity.ActivityType.SsrUpPoolChange] | |
375 | + if not actData then return 0 end | |
376 | + | |
377 | + local poolMap = actData.condition2:toMap(true, "=") | |
378 | + local key = mainType .. "_" .. subType | |
379 | + for k, v in pairs(poolMap) do | |
380 | + if k == key then | |
381 | + return v | |
382 | + end | |
383 | + end | |
384 | + return 0 | |
385 | +end | |
386 | + | |
358 | 387 | |
359 | 388 | return Activity | ... | ... |
src/models/Diner.lua
... | ... | @@ -70,12 +70,10 @@ function Diner:refreshDailyData(notify) |
70 | 70 | end |
71 | 71 | end |
72 | 72 | |
73 | - local guide = self.owner:getProperty("newerGuide") | |
74 | - local master, slave = string.match(guide,"(%d+)=(%d+)") | |
75 | - if self.owner:getProperty("funcGuide"):getv(51,0) == 0 or tonumber(master) <= 26 then | |
73 | + if self.owner:getProperty("funcGuide"):getv(51,0) == 0 or (not self.owner:checkOverGuide(27) and self.owner:checkOverGuide(25)) then | |
76 | 74 | entrust[1] = 1001 |
77 | 75 | entrust[2] = 1 |
78 | - elseif tonumber(master) <= 29 then | |
76 | + elseif not self.owner:checkOverGuide(29,4) and self.owner:checkOverGuide(29) then | |
79 | 77 | local temp = entrust[1] |
80 | 78 | entrust[1] = 1 |
81 | 79 | entrust[2] = temp |
... | ... | @@ -306,6 +304,7 @@ function Diner:expediteSell(slot) |
306 | 304 | lastCount = lastCount, |
307 | 305 | reward = reward, |
308 | 306 | popular = popular, |
307 | + deltaTime = deltaTime, | |
309 | 308 | } |
310 | 309 | end |
311 | 310 | ... | ... |
src/models/Email.lua
... | ... | @@ -18,6 +18,23 @@ Email.schema = { |
18 | 18 | rewardPms = {"table", {}}, |
19 | 19 | } |
20 | 20 | |
21 | +function Email:log(role, action) | |
22 | + role:log("onMail", { | |
23 | + mail_action_type = action, -- 操作(1=收,2=领,3=删) | |
24 | + mail_receivetime = self:getProperty("createtime"), -- 收件时间 | |
25 | + mail_textid = self:getProperty("emailId"), -- 邮件文本ID | |
26 | + mial_title = self:getProperty("title"), -- 邮件标题参数 | |
27 | + mail_content = json.encode(self:getProperty("contentPms")), -- 邮件内容参数 | |
28 | + mail_attach = self:getProperty("attachments"), -- 邮件附件 | |
29 | + mail_reason = self:getProperty("stitle"), -- 原因 | |
30 | + mail_readstatus = self:getProperty("status") >= 1 and 1 or 0, -- 邮件读取状态 | |
31 | + mail_attachstatus = self:getProperty("status") >= 2 and 1 or 0, -- 邮件附件状态 | |
32 | + mail_timeout = 0, -- 邮件超时时间 | |
33 | + mail_friend_id = 0, -- 收件方账号id | |
34 | + mail_friend_roleid = 0, -- 收件方角色id | |
35 | + }) | |
36 | +end | |
37 | + | |
21 | 38 | function Email:data() |
22 | 39 | local emailId = self:getProperty("emailId") |
23 | 40 | local title = self:getProperty("title") | ... | ... |
src/models/Role.lua
... | ... | @@ -7,6 +7,7 @@ local RoleTask = import(".RoleTask") --角色任务 |
7 | 7 | local RoleChangeStruct = import(".RoleChangeStruct") --角色数据额结构更改 |
8 | 8 | local RolePvp = import(".RolePvp") -- pvp |
9 | 9 | local RoleCross = import(".RoleCross") -- 跨服务请求相关 |
10 | +local RoleBattle = import(".RoleBattle") -- 跨服务请求相关 | |
10 | 11 | |
11 | 12 | RoleLog.bind(Role) |
12 | 13 | RolePlugin.bind(Role) |
... | ... | @@ -15,6 +16,7 @@ RoleTask.bind(Role) |
15 | 16 | RoleChangeStruct.bind(Role) |
16 | 17 | RolePvp.bind(Role) |
17 | 18 | RoleCross.bind(Role) |
19 | +RoleBattle.bind(Role) | |
18 | 20 | |
19 | 21 | function Role:ctor( properties ) |
20 | 22 | Role.super.ctor(self, properties) |
... | ... | @@ -38,6 +40,8 @@ Role.schema = { |
38 | 40 | headId = {"number", globalCsv.defaultHead}, |
39 | 41 | sid = {"number", 0}, |
40 | 42 | device = {"string", ""}, |
43 | + dmode = {"string", ""}, | |
44 | + lday = {"number", 0}, | |
41 | 45 | banTime = {"number", 0}, |
42 | 46 | banType = {"number", 0}, |
43 | 47 | heartWarning = {"number", 0}, |
... | ... | @@ -159,6 +163,8 @@ Role.schema = { |
159 | 163 | redp = {"table", {}}, -- 待消除红点 -- 通常打开对应界面就消除的红点 红点消除的方法 在对应的协议中使用 {tag = pms } |
160 | 164 | |
161 | 165 | chatline = {"table", {}}, -- 奖励发放 id=时间 |
166 | + | |
167 | + downCvR = {"number", 0}, -- 下载cv扩展包奖励 | |
162 | 168 | } |
163 | 169 | |
164 | 170 | |
... | ... | @@ -375,6 +381,8 @@ function Role:data() |
375 | 381 | |
376 | 382 | redp = self:getProperty("redp"), |
377 | 383 | chatline = self:getProperty("chatline"), |
384 | + | |
385 | + downCvR = self:getProperty("downCvR"), -- 下载cv扩展包奖励 | |
378 | 386 | } |
379 | 387 | end |
380 | 388 | ... | ... |
... | ... | @@ -0,0 +1,185 @@ |
1 | +local RoleBattle = {} | |
2 | + | |
3 | +--[[ | |
4 | + 100 剧情关卡类 | |
5 | + 200 非剧情类普通关卡 | |
6 | + 300 每日任务类、日常本类 | |
7 | + 400 资源获取类关卡 | |
8 | + 500 PVP关卡 | |
9 | + 1000 活动期间限定类关卡 | |
10 | + 2000 其他 | |
11 | +]] | |
12 | + | |
13 | +local BattleType = { | |
14 | + hang = 100, | |
15 | + tower = 200, | |
16 | + bonus = 300, | |
17 | + pvpc = 500, | |
18 | + pvph = 501, | |
19 | +} | |
20 | + | |
21 | +RoleBattle.bind = function (Role) | |
22 | + | |
23 | + | |
24 | +-- TODO 检查战斗是否作弊 | |
25 | +local function checkBattleCheat() | |
26 | + | |
27 | +end | |
28 | + | |
29 | + | |
30 | + | |
31 | +function Role:checkBattle(battleType, params) | |
32 | + local clientInfo = params.info or {} | |
33 | + | |
34 | + if not BattleType[battleType] then | |
35 | + print(string.format("NO find battleType: %s", battleType)) | |
36 | + return | |
37 | + end | |
38 | + | |
39 | + local selflist = {} | |
40 | + local heroscore = 0 | |
41 | + local teamskill = {} | |
42 | + local enemylist = {} | |
43 | + | |
44 | + local fixData = { | |
45 | + hang = function() | |
46 | + for slot, hero in pairs(self:getProperty("hangTS")) do | |
47 | + selflist[slot] = hero.type | |
48 | + end | |
49 | + heroscore = self:getProperty("hangTBV") | |
50 | + for slot , one in pairs(self:getProperty("hangTB").supports) do | |
51 | + teamskill[one[1]] = one[2] | |
52 | + end | |
53 | + local carbonData = csvdb["idle_battleCsv"][params.id] | |
54 | + local monsterData = csvdb[carbonData.monster:match("/([^/]*)$") .. "Csv"] | |
55 | + for slot, one in pairs(monsterData[1]) do | |
56 | + enemylist[#enemylist + 1] = one["unitType"] | |
57 | + end | |
58 | + end, | |
59 | + tower = function() | |
60 | + local towerF = self:getProperty("towerF") | |
61 | + for slot, hero in pairs(self:getTeamHerosInfo(towerF.heros)) do | |
62 | + selflist[slot] = hero.type | |
63 | + end | |
64 | + heroscore = self:getTeamBattleValue(towerF.heros) | |
65 | + for slot , one in pairs(self:getTeamBattleInfo(towerF).supports) do | |
66 | + teamskill[one[1]] = one[2] | |
67 | + end | |
68 | + local carbonData = csvdb["tower_battleCsv"][params.id] | |
69 | + local monsterData = csvdb[carbonData.monster:match("/([^/]*)$") .. "Csv"] | |
70 | + for slot, one in pairs(monsterData[1]) do | |
71 | + enemylist[#enemylist + 1] = one["unitType"] | |
72 | + end | |
73 | + end, | |
74 | + bonus = function() | |
75 | + local bTeam = self:getProperty("bTeam") | |
76 | + for slot, hero in pairs(self:getTeamHerosInfo(bTeam.heros)) do | |
77 | + selflist[slot] = hero.type | |
78 | + end | |
79 | + heroscore = self:getTeamBattleValue(bTeam.heros) | |
80 | + for slot , one in pairs(self:getTeamBattleInfo(bTeam).supports) do | |
81 | + teamskill[one[1]] = one[2] | |
82 | + end | |
83 | + local carbonData = csvdb["tower_battleCsv"][params.id] | |
84 | + local monsterData = csvdb[carbonData.monster:match("/([^/]*)$") .. "Csv"] | |
85 | + for slot, one in pairs(monsterData[1]) do | |
86 | + enemylist[#enemylist + 1] = one["unitType"] | |
87 | + end | |
88 | + end, | |
89 | + pvpc = function() | |
90 | + for slot, hero in pairs(self:getProperty("pvpTSC")) do | |
91 | + selflist[slot] = hero.type | |
92 | + end | |
93 | + heroscore = self:getProperty("pvpTBVC") | |
94 | + for slot , one in pairs(self:getProperty("pvpTBC").supports) do | |
95 | + teamskill[one[1]] = one[2] | |
96 | + end | |
97 | + if params.robotId then | |
98 | + local carbonData = csvdb["pvp_robotCsv"][params.robotId] | |
99 | + local monsterData = csvdb[carbonData.monster:match("/([^/]*)$") .. "Csv"] | |
100 | + for slot, one in pairs(monsterData[1]) do | |
101 | + enemylist[#enemylist + 1] = one["unitType"] | |
102 | + end | |
103 | + else | |
104 | + for slot, one in pairs((params.enemy or {})["heros"] or {}) do | |
105 | + enemylist[slot] = one["type"] | |
106 | + end | |
107 | + end | |
108 | + end, | |
109 | + pvph = function() | |
110 | + for idx, team in pairs(self:getProperty("pvpTSH")) do | |
111 | + selflist[idx] = selflist[idx] or {} | |
112 | + for slot, hero in pairs(team) do | |
113 | + selflist[idx][slot] = hero.type | |
114 | + end | |
115 | + end | |
116 | + for _, one in pairs(self:getProperty("pvpTBVH")) do | |
117 | + heroscore = heroscore + one | |
118 | + end | |
119 | + for idx, team in pairs(self:getProperty("pvpTBH")) do | |
120 | + for slot , one in pairs(team.supports) do | |
121 | + teamskill[one[1]] = one[2] | |
122 | + end | |
123 | + end | |
124 | + | |
125 | + if params.robotId then | |
126 | + local carbonData = csvdb["pvp_robot_groupCsv"][params.robotId] | |
127 | + for idx = 1, 3 do | |
128 | + enemylist[idx] = enemylist[idx] or {} | |
129 | + local monsterData = csvdb[carbonData["monster" .. idx]:match("/([^/]*)$") .. "Csv"] | |
130 | + for slot, one in pairs(monsterData[1]) do | |
131 | + enemylist[idx][#enemylist + 1] = one["unitType"] | |
132 | + end | |
133 | + end | |
134 | + else | |
135 | + for idx, team in pairs(params.enemy or {}) do | |
136 | + enemylist[idx] = enemylist[idx] or {} | |
137 | + for slot, one in pairs(team["heros"] or {}) do | |
138 | + enemylist[idx][slot] = one["type"] | |
139 | + end | |
140 | + end | |
141 | + end | |
142 | + end | |
143 | + } | |
144 | + | |
145 | + if fixData[battleType] then | |
146 | + fixData[battleType]() | |
147 | + end | |
148 | + | |
149 | + -- robotId = match.t == 2 and match.id or nil, | |
150 | + -- enemy = match.t == 1 and (revenge and _pvpRecordBattleInfoCacheH[match.id] or _pvpBattleInfoCacheH[match.id]) or nil, | |
151 | + -- score = myScore, | |
152 | + -- reward = reward, | |
153 | + self:log("mission", { | |
154 | + mission_threadid = battleType == "hang" and math.floor((params.id % 100) / 100) or 0, -- 大关卡ID | |
155 | + mission_id = params.id or 0, -- 关卡ID | |
156 | + mission_type = BattleType[battleType], -- 关卡类型,见关卡类型枚举表 | |
157 | + mission_herolist = selflist, -- 英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]] | |
158 | + mission_heroscore = heroscore, -- 编队总评分 | |
159 | + mission_enemylist = enemylist, -- 地方英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]] | |
160 | + mission_damage = clientInfo.damage or {}, -- 英雄输出值。示例:{'heroid1':1000,'heroid2':2000,………..} | |
161 | + mission_ultskill = clientInfo.ultskill or {}, -- 大招使用情况。示例:{'heroid1':1000,'heroid2':2000,………..} | |
162 | + mission_reward = params.reward or {}, -- 获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
163 | + mission_starttime = clientInfo.start or 0, -- 战斗开始时间,格式 unixtime 秒级 | |
164 | + mission_roundtime = clientInfo.atime or 0, -- 对局时长(秒) | |
165 | + mission_result = params.isWin and 1 or 2, -- 战斗结果(0-无效,1-胜利,2-失败) | |
166 | + mission_star = 0, -- 战斗完成星数,无星级的话填写0 | |
167 | + mission_restriction = 0, -- 周期内参与限制(0表示没有上限) | |
168 | + mission_difficulty = 0, -- 关卡困难度,无难度区分的话填写0 | |
169 | + mission_strength = 1, -- 消耗的体力或次数 | |
170 | + mission_score = params.score or 0, -- 本局分数,PVP玩法记录为对战后积分,无得分的填0 | |
171 | + mission_cleartype = 1, -- 1正常通关;2代理拾荒 | |
172 | + mission_rank = params.rank, -- 对战后排名,适用于PVP玩法和电波塔,其他玩法留空 | |
173 | + misson_monsterkill = clientInfo.kill or {}, -- 击杀怪物ID和数量,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
174 | + misson_teamskill = teamskill, -- 编队支援技能和技能等级情况,json格式记录,{"teamskill1":1,"teamskill2":2,………..} | |
175 | + }) | |
176 | +end | |
177 | + | |
178 | + | |
179 | + | |
180 | + | |
181 | + | |
182 | +end | |
183 | + | |
184 | + | |
185 | +return RoleBattle | |
0 | 186 | \ No newline at end of file | ... | ... |
src/models/RoleLog.lua
1 | +local server_id = (skynet.getenv("serverType") or "localtest") .. "_" .. skynet.getenv("servId") | |
1 | 2 | |
2 | --- logType | |
3 | -local LogType = { | |
4 | - create = "common", | |
5 | - login = "common", | |
6 | - logout = "common", | |
7 | - guide = "common", | |
3 | +--[[ | |
4 | + 100 购买/兑换行为 | |
5 | + 200 交易行为(与其他玩家) | |
6 | + 300 通过关卡产出或消耗 | |
7 | + 400 通过任务产出或消耗 | |
8 | + 500 通过公会产出或消耗 | |
9 | + 600 通过成就产出或消耗 | |
10 | + 700 通过邮件产出或消耗 | |
11 | + 1000 其他行为 | |
12 | +--]] | |
13 | +local ItemReason = { | |
14 | + recharge = 100, | |
15 | + advWheelSurf = 101, -- 资助 | |
16 | + advRepayWheelSurf = 102, -- 资助回馈 | |
17 | + saleEquip = 103, -- 卖装备 | |
18 | + saleRune = 104, -- 卖铭文 | |
19 | + drawHero = 105, -- 抽卡 | |
20 | + pvpShop = 106, -- pvp商店 | |
21 | + saleItem = 107, -- 售卖道具 | |
22 | + openItem = 108, -- 打开箱子 | |
23 | + openTimeBox = 109, -- 打开时间箱 | |
24 | + speedUpBox = 110, -- 速度箱 | |
25 | + dailyShop = 111, -- 每日商城 | |
26 | + dinershop = 112, -- 餐厅商店 | |
27 | + goldBuy = 113, -- 购买金币 | |
28 | + buyAdvCount = 114, -- 购买冒险次数 | |
29 | + advReSupport = 115, -- 刷新拾荒支援技 | |
30 | + advQuickHang = 116, -- 冒险快速挂机 | |
31 | + makePotion = 117, -- 制造药剂 | |
32 | + equipUp = 118, -- 装备升级 | |
33 | + runeUp = 119, -- 符文升级 | |
34 | + talentUp = 120, -- 天赋升级 | |
35 | + buyBonusCount = 121, -- 购买奖励副本次数 | |
36 | + bagField = 122, -- 背包栏位 | |
37 | + buyPvpKey = 123, -- 购买pvp钥匙 | |
38 | + startPvp = 124, -- 开始pvp | |
39 | + unlockStory = 125, -- 解锁剧情 | |
40 | + towerCount = 126, -- 电波塔次数 | |
41 | + | |
42 | + | |
43 | + advHang = 301, -- 拾荒挂机 | |
44 | + hangBattle = 302, -- 挂机战斗 | |
45 | + hangReward = 303, -- 挂机奖励 | |
46 | + quickHang = 304, -- 快速挂机 | |
47 | + bonusBattle = 305, -- 奖励副本 | |
48 | + hangGift = 306, -- 奖励关卡奖励 | |
49 | + pvpBattleC = 307, -- pvp战斗普通 | |
50 | + pvpBattleH = 308, -- pvp战斗高级 | |
51 | + pvpDivisionH = 309, -- pvp高级段位奖励 | |
52 | + towerBattle = 310, -- 电波塔战斗 | |
53 | + advOver = 311, -- 冒险结算 | |
54 | + advUnlock = 312, -- 拾荒解锁 | |
8 | 55 | |
9 | - in_item = "common", | |
10 | - out_item = "common", | |
11 | - in_diamond = "common", | |
12 | - out_diamond = "common", | |
13 | - in_hero = "common", | |
14 | - out_hero = "common", | |
15 | - in_equip = "common", | |
16 | - out_equip = "common", | |
17 | - in_rune = "common", | |
18 | - out_rune = "common", | |
19 | - player_exp = "common", | |
20 | - func_open = "common", | |
21 | - in_adv = "common", | |
22 | - out_adv = "common", | |
23 | - in_artifact = "common", | |
24 | - | |
25 | - mail_action = "common", | |
26 | - role_action = "common", | |
27 | - hang_action = "common", | |
28 | - hero_action = "common", | |
29 | - adv_action = "common", | |
30 | - rune_action = "common", | |
31 | - pvp_action = "common", | |
32 | - diner_action = "common", | |
33 | - tower_action = "common", | |
34 | - gm_action = "common", | |
35 | - act_action = "common", | |
56 | + dinerFinishTask = 401, -- 餐厅完成任务 | |
57 | + storybookReward = 402, -- 剧情奖励 | |
58 | + finishTask = 403, -- 任务 | |
59 | + taskActive = 404, -- 完成活跃任务 | |
60 | + advMainTask = 405, -- 拾荒主线 | |
61 | + | |
62 | + finishAchive = 601, -- 完成成就 | |
63 | + advAchiev = 602, -- 拾荒成就 | |
64 | + advAchievReward = 603, -- 拾慌成就奖励 | |
65 | + | |
66 | + draw_attach = 701, -- 邮件奖励 | |
67 | + | |
68 | + gm = 1000, -- 获取途径:GM | |
69 | + | |
70 | + -- 活动 | |
71 | + sudoku = 1001, -- 九宫格 | |
72 | + sudokuR = 1002, -- 九宫格连线奖励 | |
73 | + sudokuRP = 1003, -- 九宫格阶段奖励 | |
74 | + sign = 1004, -- 签到 | |
75 | + friendPoint = 1005, -- 友情 | |
76 | + birth = 1006, -- 出生奖励 | |
77 | + actSign = 1007, -- 活动签到 | |
78 | + | |
79 | + -- 餐厅 | |
80 | + greenHourse = 1101, -- 食材获得 | |
81 | + dinerEntrus = 1102, -- 餐厅委托 | |
82 | + dinerCollect = 1103, -- 餐厅小人收集 | |
83 | + dinerCombo = 1104, -- 小人组合 | |
84 | + dinerSkillUp = 1105, -- 餐厅技能升级 | |
85 | + dinerReTask = 1106, -- 餐厅刷新任务 | |
86 | + addSell = 1107, -- 餐厅贩卖 | |
87 | + dinerBuildUp = 1108, -- 建筑升级 | |
88 | + removeSell = 1109, -- 移除售卖 | |
89 | + dinerSell = 1110, -- 餐饮售卖 | |
90 | + | |
91 | + -- 英雄 | |
92 | + heroLevelUp = 1201, -- 英雄升级 | |
93 | + heroBreak = 1202, -- 英雄突破 | |
94 | + heroWake = 1203, -- 英雄觉醒 | |
95 | + heroTalent = 1204, -- 英雄天赋 | |
96 | + createHero = 1205, -- 碎片合成 | |
97 | + createHeroRandom = 1206, -- 随机合成 | |
98 | + resetHero = 1207, -- 重置养成 | |
99 | + unlockPool = 1208, -- 解锁英雄定向抽卡池 | |
100 | + downloadCv = 1209, -- 下载 cv包奖励 | |
101 | + refer = 1210, -- 穿戴 | |
36 | 102 | } |
37 | 103 | |
38 | --- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-* | |
39 | -local Mapping = { | |
40 | - -- 预留一些数据格式 担心integer 范围不够用 将 通用的int* 全部换为long | |
41 | - common = { | |
42 | - desc = "keyword",--索引的短字符串 | |
43 | - ucode = "keyword",--关联日志对应ucode | |
44 | - key1 = "keyword", --可索引的短字符串 | |
45 | - key2 = "keyword", --可索引的短字符串 | |
46 | - -- 几乎不用的长文本 | |
47 | - text1 = "text", --长字符串不索引的类型 | |
48 | - -- 五个不同类型的数字 基本上满足数量要求 尽量从低到高用 | |
49 | - short1 = "short", | |
50 | - int1 = "long", | |
51 | - int2 = "long", | |
52 | - long1 = "long", | |
53 | - float1 = "float", | |
54 | - | |
55 | - -- 底层使用的 一些参数 | |
56 | - cint1 = "long", | |
57 | - cint2 = "long", | |
58 | - cint3 = "long", | |
59 | - } | |
104 | + | |
105 | +--[[ | |
106 | +100 教学 | |
107 | +200 主线 | |
108 | +300 日常 | |
109 | +400 周常 | |
110 | +500 联盟 | |
111 | +1000 限时任务 | |
112 | +2000 其他 | |
113 | +--]] | |
114 | +local TaskType = { | |
115 | + | |
60 | 116 | } |
61 | 117 | |
62 | --- 所有的日志都包括的部分 role 里面的信息 -- mapping 信息在 gamelog-role | |
63 | -local commonRoleField = { | |
64 | - name = "keyword", | |
65 | - id = "integer", | |
66 | - uid = "keyword", | |
67 | - sid = "short", | |
68 | - device = "keyword", | |
69 | - ctime = "integer", | |
70 | - ltime = "integer", | |
71 | - level = "short", | |
72 | - rmbC = "integer", | |
118 | + | |
119 | +local MethodType = { | |
120 | + onCreateAccount = {}, -- 创建游戏账号 | |
121 | + onCreateRole = {}, -- 创建游戏角色 | |
122 | + onLogin = {}, -- 玩家登录 | |
123 | + onLogout = { -- 登出 | |
124 | + logtime = true, --登录时长 | |
125 | + }, | |
126 | + setLevel = { -- 设置等级 | |
127 | + level_before = true, -- 变动前的等级,可以跳级 | |
128 | + level_changemain = true, -- 等级变动原因,副本通关:mission,领取奖励:reward | |
129 | + level_changedetail = true, -- 等级变动原因明细,副本通关则记录关卡ID,领取奖励则记录奖励ID | |
130 | + level_reward = "json", -- 等级变动奖励,json格式记录,{道具ID1:道具数量,道具ID2:道具数量} | |
131 | + }, | |
132 | + onGuidePoint = { --游戏引导 | |
133 | + guild_type = true, --引导类型,新手引导:0,系统引导:1,弱引导:2 | |
134 | + guild_id = true, --节点ID | |
135 | + guild_point = true, --步骤ID | |
136 | + guild_pass = true, --正常操作:0,自动播放:1,跳过:2 | |
137 | + }, | |
138 | + setOrder = { --玩家订单记录 | |
139 | + order_status = true, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" | |
140 | + item_id = true, -- 道具id | |
141 | + item_type = true, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 | |
142 | + item_name = true, -- 购买的道具名 | |
143 | + item_number = true, -- 购买的道具数量 | |
144 | + item_level = true, -- 购买的道具等级 | |
145 | + order_cost = true, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' | |
146 | + order_currency = true, -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 | |
147 | + order_type = true, -- 订单类型,首充记录为1,否则为0 | |
148 | + order_id = true, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' | |
149 | + }, | |
150 | + onMail = { --玩家邮件操作 | |
151 | + mail_action_type = true, -- 操作(1=收,2=领,3=删) | |
152 | + mail_receivetime = true, -- 收件时间 | |
153 | + mail_textid = true, -- 邮件文本ID | |
154 | + mial_title = true, -- 邮件标题参数 | |
155 | + mail_content = true, -- 邮件内容参数 | |
156 | + mail_attach = true, -- 邮件附件 | |
157 | + mail_reason = true, -- 原因 | |
158 | + mail_readstatus = true, -- 邮件读取状态 | |
159 | + mail_attachstatus = true, -- 邮件附件状态 | |
160 | + mail_timeout = true, -- 邮件超时时间 | |
161 | + mail_friend_id = true, -- 收件方账号id | |
162 | + mail_friend_roleid = true, -- 收件方角色id | |
163 | + }, | |
164 | + onItems = { --道具流通 | |
165 | + item_id = true, -- 道具id | |
166 | + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形 | |
167 | + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表 | |
168 | + item_level = true, -- 道具等级 | |
169 | + item_number = true, -- 道具变化数量的绝对值 | |
170 | + action_type = true, -- 变化类型(玩家获取:1,玩家消耗:0) | |
171 | + item_before = true, -- 道具变化前的数量 | |
172 | + item_after = true, -- 道具变化后的数量 | |
173 | + item_reason = true, -- 道具流动一级原因,如抽卡、装备强化、副本掉落,可参考道具动作类型枚举表 | |
174 | + item_subreason = true, -- 道具流动二级原因,抽卡:卡池ID,装备强化:装备ID,副本掉落:副本ID | |
175 | + item_other = true, -- 其他(可包含阶数,强化等级,随机属性) | |
176 | + }, | |
177 | + mission = { --玩家副本完成情况 | |
178 | + mission_threadid = true, -- 大关卡ID | |
179 | + mission_id = true, -- 关卡ID | |
180 | + mission_type = true, -- 关卡类型,见关卡类型枚举表 | |
181 | + mission_sequenceid = "ucode", -- 本次对战ID,用于关联一次动作产生多条不同类型的日志 | |
182 | + mission_herolist = "json", -- 英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]] | |
183 | + mission_heroscore = true, -- 编队总评分 | |
184 | + mission_enemylist = "json", -- 地方英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]] | |
185 | + mission_damage = "json", -- 英雄输出值。示例:{'heroid1':1000,'heroid2':2000,………..} | |
186 | + mission_ultskill = "json", -- 大招使用情况。示例:{'heroid1':1000,'heroid2':2000,………..} | |
187 | + mission_reward = "json", -- 获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
188 | + mission_starttime = true, -- 战斗开始时间,格式 unixtime 秒级 | |
189 | + mission_roundtime = true, -- 对局时长(秒) | |
190 | + mission_result = true, -- 战斗结果(0-无效,1-胜利,2-失败) | |
191 | + mission_star = true, -- 战斗完成星数,无星级的话填写0 | |
192 | + mission_restriction = true, -- 周期内参与限制(0表示没有上限) | |
193 | + mission_difficulty = true, -- 关卡困难度,无难度区分的话填写0 | |
194 | + mission_strength = true, -- 消耗的体力或次数 | |
195 | + mission_score = true, -- 本局分数,PVP玩法记录为对战后积分,无得分的填0 | |
196 | + mission_cleartype = true, -- 1正常通关;2代理拾荒 | |
197 | + mission_rank = true, -- 对战后排名,适用于PVP玩法和电波塔,其他玩法留空 | |
198 | + misson_monsterkill = "json", -- 击杀怪物ID和数量,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
199 | + misson_teamskill = "json", -- 编队支援技能和技能等级情况,json格式记录,{"teamskill1":1,"teamskill2":2,………..} | |
200 | + misson_teambond = "json", -- 编队羁绊和羁绊等级,json格式记录,{"bondid1":1,"bondid2":2,………..} | |
201 | + }, | |
202 | + residence_reward = { --玩家挂机或排名奖励 | |
203 | + mission_threadid = true, --大关卡ID | |
204 | + mission_id = true, --关卡ID | |
205 | + mission_type = true, --关卡类型,见关卡类型枚举表 | |
206 | + residence_reward_type = true, --领取奖励方式,快速(超前领取)记录为1,正常领取记录为0 | |
207 | + residence_time = true, --挂机或排名时长 | |
208 | + residence_reward = "json", --获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
209 | + }, | |
210 | + hero_rise = { --英雄觉醒 | |
211 | + hero_id = true, --英雄ID | |
212 | + hero_rise_cost = "json", --英雄觉醒消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
213 | + hero_rise_score = true, --英雄觉醒后评分提升 | |
214 | + hero_rise_result = "json", --英雄觉醒效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
215 | + }, | |
216 | + hero_upgrade = { --英雄升级 | |
217 | + hero_id = true, -- 英雄ID | |
218 | + hero_upgrade_cost = "json", -- 英雄升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
219 | + hero_upgrade_result = "json", -- 英雄升级效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
220 | + hero_upgrade_type = true, -- 英雄升级方式,连续升级:1,单击升级:0 | |
221 | + hero_upgrade_score = true, -- 英雄升级后评分 | |
222 | + hero_upgrade_scoreget = true, -- 通过英雄升级提升的评分 | |
223 | + }, | |
224 | + hero_break = { --英雄突破 | |
225 | + hero_id = true, -- 英雄ID | |
226 | + hero_break_cost = "json", -- 英雄突破消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
227 | + hero_break_result = "json", -- 英雄突破效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
228 | + hero_break_level = true, -- 英雄突破后等级上限 | |
229 | + }, | |
230 | + hero_talent = { --英雄天赋升级 | |
231 | + hero_id = true, -- 英雄ID | |
232 | + hero_talent_cost = "json", -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
233 | + hero_talent_levelbef = true, -- 英雄技能升级前等级 | |
234 | + hero_talent_level = true, -- 英雄技能升级后等级 | |
235 | + }, | |
236 | + hero_jewel = { --英雄铭文 | |
237 | + hero_id = true, -- 英雄ID | |
238 | + hero_jewel_sequence = "ucode", -- 铭文装备编号,用以关联一次装备时产生的多条日志 | |
239 | + hero_jewel_id = true, -- 铭文ID | |
240 | + hero_jewel_part = true, -- 铭文装备部位 | |
241 | + hero_jewel_score = true, -- 铭文装备后的英雄分值 | |
242 | + hero_jewel_scorebefore = true, -- 铭文装备前的英雄分值 | |
243 | + hero_jewel_result = "json", -- 铭文装备后效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..} | |
244 | + }, | |
245 | + hero_note = { --英雄评价 | |
246 | + hero_id = true, -- 英雄ID | |
247 | + hero_note_action = true, -- 英雄评价界面操作,发布评论:0,点赞:1,反对:2 | |
248 | + hero_note_id = true, -- 操作的评价ID | |
249 | + hero_note_text = true, -- 操作的评价内容 | |
250 | + }, | |
251 | + hero_show = { --展示英雄 | |
252 | + hero_id = true, -- 英雄ID | |
253 | + }, | |
254 | + hero_recycle = { --英雄回收 | |
255 | + hero_recycle_list = "json", -- 回收的英雄id列表,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
256 | + hero_recycle_reward = "json", -- 回收后获得的奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
257 | + hero_recycle_cnt = true, -- 总回收英雄量 | |
258 | + }, | |
259 | + gacha = { --英雄招募 | |
260 | + gacha_id = true, -- 卡池ID | |
261 | + gacha_type = true, -- 卡池类型 | |
262 | + gacha_up = true, -- 卡池UP角色 | |
263 | + gacha_times = true, -- 抽卡次数 | |
264 | + gacha_reward = "json", -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"} | |
265 | + currency = "json", -- 消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...} | |
266 | + }, | |
267 | + equip_wear = { --装备穿戴与卸载 | |
268 | + hero_id = true, --英雄ID | |
269 | + equip_id = true, --装备ID | |
270 | + equip_wear_action = true, --装备操作类型:装备:0,卸载:1 | |
271 | + equip_wear_part = true, --装备部位,记录部位ID | |
272 | + equip_wear_result = "json", --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567} | |
273 | + equip_wear_change = "json", --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45} | |
274 | + equip_wear_mode = true, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1 | |
275 | + equip_wear_seqid = "ucode", --自动穿戴时记录的系列ID,用以关联一次性装备时候产生的多条记录 | |
276 | + }, | |
277 | + equip_upgrade = { --装备升级 | |
278 | + equip_upgrade_part = true, -- 升级部位,记录部位ID | |
279 | + equip_id = true, -- 升级后的装备ID | |
280 | + equip_upgrade_amount = true, -- 升级获取的装备数量 | |
281 | + equip_upgrade_usedid = true, -- 升级消耗的装备ID | |
282 | + equip_upgrade_cost = true, -- 升级操作消耗装备数量 | |
283 | + equip_upgrade_current = true, -- 升级操作消耗货币数量 | |
284 | + }, | |
285 | + carriage_dismantle = { --物资拆解 | |
286 | + item_id = true, -- 道具id | |
287 | + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形 | |
288 | + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表 | |
289 | + item_level = true, -- 道具等级 | |
290 | + item_number = true, -- 道具变化数量的绝对值 | |
291 | + carriage_dismantle_type = true, -- 拆解方式,时间到期:0,钥匙开启:1 | |
292 | + carriage_dismantle_time = true, -- 拆解耗时,填写实际耗时 | |
293 | + carriage_dismantle_cost = true, -- 拆解花费钥匙数量,未使用填写0 | |
294 | + carriage_dismantle_rwd = "json", -- 拆解获得物资,json格式记录,{'itemid1':2,'itemid2':3,…………..} | |
295 | + }, | |
296 | + carriage_logistics = { --后勤室 | |
297 | + carriage_logistics_type = true, -- 后勤室制作类型ID,变异:0,通常:1,魔法:2 | |
298 | + carriage_logistics_itemid = true, -- 后勤室升级物品或技能ID | |
299 | + carriage_logistics_itemlv = true, -- 升级后物品或技能等级 | |
300 | + carriage_logistics_gear = true, -- 后勤室升级花费齿轮数量 | |
301 | + carriage_logistics_coin = true, -- 后勤室升级花费美食币数量 | |
302 | + }, | |
303 | + carriage_decals = { --贴纸拆解 | |
304 | + item_id = true, --道具id | |
305 | + item_sequenceid = "ucode", --道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形 | |
306 | + item_type = true, --道具类型,具体见枚举表中道具类型枚举表 | |
307 | + item_level = true, --道具等级 | |
308 | + item_number = true, --道具变化数量的绝对值 | |
309 | + carriage_decals_rwdid = true, --拆解获得物资ID | |
310 | + carriage_decals_rwdnum = true, --拆解获得物资数量 | |
311 | + }, | |
312 | + carriage_video = { --放映室 | |
313 | + carriage_video_type = true, --放映室类型,剧情CG:0, 角色CG:1, 主线剧情:2, 角色剧情:3, 活动剧情:4, 图鉴:5 | |
314 | + carriage_video_id = true, --放映室片段ID | |
315 | + carriage_video_coinid = true, --放映奖励货币类型,无奖励则填写0 | |
316 | + carriage_video_coinnum = true, --放映奖励货币数量,无奖励则填写0 | |
317 | + carriage_video_item = "json", --放映奖励其他物品数量,json格式记录,{'itemid1':10,'itemid2':5,…………..},无奖励则填写0 | |
318 | + }, | |
319 | + carriage_cook = { --调理室 | |
320 | + item_id = true, -- 道具id | |
321 | + item_level = true, -- 道具等级 | |
322 | + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表 | |
323 | + carriage_cook_amount = true, -- 制作总量 | |
324 | + carriage_cook_cost = "json", -- 制作消耗道具,json格式记录,{'itemid1':10,'itemid2':5,…………..} | |
325 | + }, | |
326 | + activity = { --活动或指南奖励 | |
327 | + activity_id = true, -- 活动ID(或活动指定任务的ID) | |
328 | + activity_type = true, -- 活动类型,见活动类型枚举表 | |
329 | + activity_reward = "json", -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
330 | + }, | |
331 | + task_reward = { --任务奖励 | |
332 | + task_reward_id = true, --任务奖励ID | |
333 | + task_reward_type = true, --任务奖励类型,见 任务奖励类型枚举表 | |
334 | + task_reward_detail = "json", --任务奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
335 | + }, | |
336 | + shop_purchase = { --商店购买行为 | |
337 | + item_id = true, -- 道具id | |
338 | + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个购买礼包多个物品等情形 | |
339 | + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表 | |
340 | + item_level = true, -- 道具等级 | |
341 | + item_cnt = true, -- 购买数量技术 | |
342 | + currency_type = true, -- 购买道具消耗的货币类型,记录货币ID | |
343 | + shop_purchase_current = true, -- 购买道具消耗的货币数量 | |
344 | + shop_id = true, -- 商店ID | |
345 | + }, | |
346 | + --[[ | |
347 | + 100 添加好友 | |
348 | + 200 删除好友 | |
349 | + 300 屏蔽/拉黑 | |
350 | + 1000 其他 | |
351 | + --]] | |
352 | + friend_opt = { --好友操作 | |
353 | + friend_opt_type = true, -- 好友操作类型,见枚举表中 好友操作类型枚举表 | |
354 | + friend_accountid = true, -- 好友账户id | |
355 | + friend_roleid = true, -- 好友账户下的角色id | |
356 | + friend_cnt = true, -- 操作后好友数量 | |
357 | + }, | |
358 | + communication = { --玩家发言 | |
359 | + publish_type = true, --发言类型,全部:0,公告:1,世界:2,联盟:3,私聊:4 | |
360 | + publish_status = true, --发送状态,发送成功:0,发送失败:1,被屏蔽:2,其他:3 | |
361 | + publish_receive_roleid = true, --接收者角色ID | |
362 | + publish_text = true, --发言内容 | |
363 | + }, | |
364 | + restaurant_up = { --摊位升级 | |
365 | + restaurant_up_type = true, --升级部件类型,店面:0, 接客:1, 满意度:2, 宣传:3, 广告:4, 周边:5 | |
366 | + restaurant_up_gear = true, --消耗齿轮数量 | |
367 | + restaurant_up_coin = true, --花费美食币数量 | |
368 | + restaurant_up_effectbef = true, --升级前加成 | |
369 | + restaurant_up_effect = true, --升级后加成 | |
370 | + }, | |
371 | + restaurant_sale = { --摊位售卖 | |
372 | + item_id = true, -- 售卖物品ID | |
373 | + restaurant_sale_seat = true, -- 售卖物品所在位置 | |
374 | + restaurant_sale_time = true, -- 售卖时长 | |
375 | + restaurant_sale_type = true, -- 售卖方式,正常售卖:0, 加速:1,移除售卖:2 | |
376 | + restaurant_sale_coin = true, -- 售卖获得美食币 | |
377 | + restaurant_sale_gear = true, -- 售卖获得齿轮 | |
378 | + }, | |
379 | + restaurant_material = { --食材获取 | |
380 | + item_id = true, -- 获取物品ID | |
381 | + restaurant_material_seqid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一次获取两件道具情况 | |
382 | + restaurant_material_start = true, -- 申请获取时间 | |
383 | + restaurant_material_time = true, -- 申请到领取耗时 | |
384 | + restaurant_material_num = true, -- 获取物品数量 | |
385 | + }, | |
386 | + restaurant_order = { --订单任务 | |
387 | + restaurant_order_id = true, -- 订单任务ID | |
388 | + restaurant_order_status = true, -- 订单任务状态,接受:0, 拒绝:1, 完成:2 | |
389 | + restaurant_order_rwd = "json", -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
390 | + restaurant_order_lv = true, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3 | |
391 | + }, | |
392 | + restaurant_collect = { --餐厅顾客图谱 | |
393 | + restaurant_collect_id = true, -- 图谱收集ID | |
394 | + restaurant_collect_rwd = "json", -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
395 | + restaurant_collect_plan = true, -- 收集进度,即解锁顾客,数字表示 | |
396 | + }, | |
397 | + achievement = { --成就达成 | |
398 | + achievement_id = true, -- 成就id | |
399 | + achievement_type = true, -- 成就类型,具体枚举表中成就类型枚举表 | |
400 | + achievement_reward = "json", -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
401 | + }, | |
402 | + get_gift = { --礼包兑换 | |
403 | + gift_id = true, -- 礼包ID | |
404 | + gift_key = true, -- 礼包key | |
405 | + gift_reward = "json", -- 礼包奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
406 | + gift_name = true, -- 礼包名称 | |
407 | + gift_reason = true, -- 礼包发放原因,见发放原因枚举表 | |
408 | + }, | |
73 | 409 | } |
74 | 410 | |
75 | 411 | local function printError(info) |
... | ... | @@ -77,138 +413,119 @@ local function printError(info) |
77 | 413 | print(debug.traceback()) |
78 | 414 | end |
79 | 415 | |
80 | -local function checkType(logType, field, value, ctype) | |
81 | - local typecheckfunc = { | |
82 | - keyword = function() | |
83 | - --长度不超过256 | |
84 | - if type(value) ~= "string" then | |
85 | - value = tostring(value) | |
86 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [keyword], value : %s", logType, field, value)) | |
87 | - else | |
88 | - if #value > 256 then | |
89 | - printError(string.format("LOG ERROR: logType [%s] field [%s] [keyword] type to long. value : %s", logType, field, value)) | |
90 | - end | |
91 | - end | |
92 | - return value | |
93 | - end, | |
94 | - text = function() | |
95 | - if type(value) ~= "string" then | |
96 | - value = tostring(value) | |
97 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [text], value : %s", logType, field, value)) | |
98 | - end | |
99 | - return value | |
100 | - end, | |
101 | - integer = function() | |
102 | - if type(value) ~= "number" then | |
103 | - value = tonumber(value) | |
104 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], value : %s", logType, field, value)) | |
105 | - end | |
106 | - if value then | |
107 | - if math.type(value) ~= "integer" then | |
108 | - local oldValue = value | |
109 | - value = math.floor(value) | |
110 | - if value ~= oldValue then | |
111 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], is float, value : %s", logType, field, value)) | |
112 | - end | |
113 | - end | |
114 | - if -2147483648 > value or value > 2147483647 then | |
115 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], too big, value : %s", logType, field, value)) | |
116 | - value = nil | |
117 | - end | |
118 | - end | |
119 | - return value | |
120 | - end, | |
121 | - short = function() | |
122 | - if type(value) ~= "number" then | |
123 | - value = tonumber(value) | |
124 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], value : %s", logType, field, value)) | |
125 | - end | |
126 | - if value then | |
127 | - if math.type(value) ~= "integer" then | |
128 | - local oldValue = value | |
129 | - value = math.floor(value) | |
130 | - if value ~= oldValue then | |
131 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], is float, value : %s", logType, field, value)) | |
132 | - end | |
133 | - end | |
416 | +local function jsonEncode(tab) | |
417 | + local newTab = {} | |
418 | + for k , v in pairs(tab) do | |
419 | + newTab[tostring(k)] = v | |
420 | + end | |
421 | + return json.encode(newTab) | |
422 | +end | |
134 | 423 | |
135 | - if -32768 > value or value > 32768 then | |
136 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], too big, value : %s", logType, field, value)) | |
137 | - value = nil | |
138 | - end | |
139 | - end | |
140 | - return value | |
141 | - end, | |
142 | - long = function() | |
143 | - if type(value) ~= "number" then | |
144 | - value = tonumber(value) | |
145 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], value : %s", logType, field, value)) | |
146 | - end | |
147 | - if value then | |
148 | - if math.type(value) ~= "integer" then | |
149 | - local oldValue = value | |
150 | - value = math.floor(value) | |
151 | - if type(value) ~= "integer" then | |
152 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], too big, value : %s", logType, field, value)) | |
153 | - value = nil | |
154 | - elseif value ~= oldValue then | |
155 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], is float, value : %s", logType, field, value)) | |
156 | - end | |
157 | - end | |
158 | - end | |
159 | - return value | |
160 | - end, | |
161 | - float = function() | |
162 | - if type(value) ~= "number" then | |
163 | - value = tonumber(value) | |
164 | - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [float], value : %s", logType, field, value)) | |
165 | - end | |
166 | - return value | |
167 | - end, | |
168 | - } | |
424 | +local function isIos(self) | |
425 | + local sid = self:getProperty("sid") | |
426 | + return sid == 2 | |
427 | +end | |
169 | 428 | |
170 | - if typecheckfunc[ctype] then | |
171 | - return typecheckfunc[ctype]() | |
172 | - else | |
173 | - printError(string.format("LOG ERROR: logType [%s] field [%s] have a new type [%s] need add check.", logType, field, ctype)) | |
174 | - return nil | |
429 | +local appid, sdkId | |
430 | +local function getBaseLog(self) | |
431 | + local uid = self:getProperty("uid") | |
432 | + if not appid then | |
433 | + appid, sdkId = string.match(uid, "(.*)_(.*)") | |
434 | + if not appid then | |
435 | + sdkId = uid | |
436 | + appid = 0 | |
437 | + end | |
175 | 438 | end |
439 | + local log = { | |
440 | + server_id = server_id, | |
441 | + timestamp = skynet.timex(), | |
442 | + app_id = appid, | |
443 | + plat_id = isIos(self) and 0 or 1, | |
444 | + sdk_uid = sdkId, | |
445 | + account_id = uid, | |
446 | + role_id = self:getProperty("id"), | |
447 | + role_name = self:getProperty("name"), | |
448 | + level = self:getProperty("level"), | |
449 | + vip = 0, | |
450 | + device_id = self:getProperty("device"), | |
451 | + device_model = self:getProperty("dmode"), | |
452 | + version = "v2.0.1", | |
453 | + client_version = self.clientVersion or "1.0.0", | |
454 | + sys_version = self.sysVersion or "unknow", | |
455 | + ip = self.ip or "0.0.0.0", | |
456 | + network = self.network or "unknow", | |
457 | + record_date = os.date("%Y%m%d"), | |
458 | + } | |
459 | + return log | |
176 | 460 | end |
177 | 461 | |
462 | + | |
463 | + | |
178 | 464 | local RoleLog = {} |
179 | 465 | function RoleLog.bind(Role) |
180 | 466 | function Role:log(logType, contents) |
181 | 467 | contents = contents or {} |
182 | - local _logType = LogType[logType] | |
183 | - if not _logType then | |
184 | - printError(string.format("LOG ERROR: new logType [%s] need Add Maping.", logType)) | |
468 | + local schema = MethodType[logType] | |
469 | + if not schema then | |
470 | + printError(string.format("LOG ERROR: new logType [%s].", logType)) | |
185 | 471 | return |
186 | 472 | end |
187 | - local doc = {} | |
188 | - for field, ctype in pairs(commonRoleField) do | |
189 | - if contents[field] then | |
190 | - printError(string.format("LOG ERROR: logType [%s] had field [%s] overwrite default.", logType, field)) | |
191 | - end | |
192 | - doc[field] = checkType("commonRoleField", field, self:getProperty(field), ctype) | |
193 | - end | |
194 | - | |
195 | - local mapping = Mapping[_logType] | |
196 | - if mapping["ucode"] and not contents["ucode"] then | |
197 | - contents["ucode"] = self:getActionUcode() | |
198 | - end | |
473 | + local doc = getBaseLog(self) | |
199 | 474 | |
475 | + doc["method"] = logType | |
200 | 476 | for field, value in pairs(contents) do |
201 | - local ftype = mapping[field] | |
202 | - if ftype then | |
203 | - doc[field] = checkType(logType, field, value, ftype) | |
477 | + if not schema[field] then | |
478 | + printError(string.format("LOG ERROR: logType [%s] have new field [%s], call.", logType, field)) | |
204 | 479 | else |
205 | - printError(string.format("LOG ERROR: logType [%s] have new field [%s] no type in mapping.", logType, field)) | |
480 | + if schema[field] == 'json' then | |
481 | + value = jsonEncode(value) | |
482 | + end | |
483 | + doc[field] = value | |
484 | + end | |
485 | + end | |
486 | + | |
487 | + for field, tag in pairs(schema) do | |
488 | + if not contents[field] then | |
489 | + if tag == "ucode" then | |
490 | + contents[field] = self:getActionUcode() | |
491 | + else | |
492 | + printError(string.format("LOG ERROR: logType [%s] lose field [%s].", logType, field)) | |
493 | + end | |
206 | 494 | end |
207 | 495 | end |
208 | 496 | if not logd then return end |
209 | - pcall(skynet.send, logd, "lua", "log", logType, doc, _logType) | |
497 | + pcall(skynet.send, logd, "lua", "log", doc) | |
498 | + end | |
499 | + | |
500 | + function Role:logItems(itemId, before, after, log) | |
501 | + if not log then | |
502 | + print("logItems no log ", debug.traceback()) | |
503 | + end | |
504 | + local reason = log.desc | |
505 | + local subreason = log.int1 or 0 | |
506 | + local other = log.int2 or 0 | |
507 | + | |
508 | + local reasonType = ItemReason[reason] | |
509 | + if not reasonType then | |
510 | + printError(string.format("LOG ERROR: onItems no reasonType [%s].", reason)) | |
511 | + end | |
512 | + local itemData = csvdb["itemCsv"][itemId] | |
513 | + if not itemData then return end | |
514 | + self:log("onItems", { | |
515 | + item_id = itemId, -- 道具id | |
516 | + item_type = itemData.type, -- 道具类型,具体见枚举表中道具类型枚举表 | |
517 | + item_level = 0, -- 道具等级 | |
518 | + item_number = math.abs(after - before), -- 道具变化数量的绝对值 | |
519 | + action_type = after - before > 0 and 1 or 0, -- 变化类型(玩家获取:1,玩家消耗:0) | |
520 | + item_before = before, -- 道具变化前的数量 | |
521 | + item_after = after, -- 道具变化后的数量 | |
522 | + item_reason = reasonType, -- 道具流动一级原因,如抽卡、装备强化、副本掉落,可参考道具动作类型枚举表 | |
523 | + item_subreason = subreason, -- 道具流动二级原因,抽卡:卡池ID,装备强化:装备ID,副本掉落:副本ID | |
524 | + item_other = other, -- 其他(可包含阶数,强化等级,随机属性) | |
525 | + }) | |
210 | 526 | end |
211 | 527 | |
528 | + | |
212 | 529 | function Role:startActionUcode() |
213 | 530 | if not self._uniqueCount then |
214 | 531 | self._uniqueCount = 0 |
... | ... | @@ -225,7 +542,8 @@ function RoleLog.bind(Role) |
225 | 542 | |
226 | 543 | function Role:getActionUcode() |
227 | 544 | return self._actionUcode |
228 | - end | |
545 | + end | |
546 | + | |
229 | 547 | |
230 | 548 | end |
231 | 549 | return RoleLog |
232 | 550 | \ No newline at end of file | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -207,6 +207,7 @@ function RolePlugin.bind(Role) |
207 | 207 | |
208 | 208 | function Role:addPlayExp(addExp, params) |
209 | 209 | local level = self:getProperty("level") |
210 | + local oldLevel = level | |
210 | 211 | if not csvdb["player_expCsv"][level + 1] then |
211 | 212 | return |
212 | 213 | end |
... | ... | @@ -217,24 +218,24 @@ function RolePlugin.bind(Role) |
217 | 218 | if csvdb["player_expCsv"][level + 1] then -- 有下一级 |
218 | 219 | newExp = newExp - csvdb["player_expCsv"][level].exp |
219 | 220 | level = level + 1 |
221 | + self:checkTaskEnter("RoleLevelUp", {level = level}) | |
220 | 222 | else |
221 | 223 | newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除 |
222 | 224 | end |
223 | 225 | end |
224 | - | |
225 | - if params.log then | |
226 | - local log = clone(params.log) | |
227 | - if log["cint1"] or log["cint2"] then | |
228 | - print("addPlayExp error log have cint1 or cint2 or cint3", debug.traceback()) | |
226 | + if level > oldLevel then | |
227 | + if params.log then | |
228 | + local log = params.log | |
229 | + self:log("setLevel", { | |
230 | + level_before = oldLevel, | |
231 | + level_changemain = log.desc, | |
232 | + level_changedetail = log.sub or "", | |
233 | + level_reward = {}, | |
234 | + }) | |
235 | + else | |
236 | + print("addPlayExp no log ", debug.traceback()) | |
229 | 237 | end |
230 | - | |
231 | - log["cint1"] = addExp | |
232 | - log["cint2"] = newExp | |
233 | - log["cint3"] = level | |
234 | - | |
235 | - self:log("player_exp", log) | |
236 | - else | |
237 | - print("addPlayExp no log ", debug.traceback()) | |
238 | + | |
238 | 239 | end |
239 | 240 | |
240 | 241 | self:updateProperties({level = level, exp = newExp}) |
... | ... | @@ -257,21 +258,7 @@ function RolePlugin.bind(Role) |
257 | 258 | items = items:incrv(params.itemId, params.count) |
258 | 259 | end |
259 | 260 | |
260 | - if params.log then | |
261 | - local log = clone(params.log) | |
262 | - if log["cint1"] or log["cint2"] then | |
263 | - print("addItem error log have cint1 or cint2 ", debug.traceback()) | |
264 | - end | |
265 | - log["cint1"] = params.itemId | |
266 | - log["cint2"] = math.abs(params.count) | |
267 | - if params.count <= 0 then | |
268 | - self:log("out_item", log) | |
269 | - else | |
270 | - self:log("in_item", log) | |
271 | - end | |
272 | - else | |
273 | - print("addItem no log ", debug.traceback()) | |
274 | - end | |
261 | + self:logItems(params.itemId, origin, nums, params.log) | |
275 | 262 | |
276 | 263 | self:setProperty("items", items) |
277 | 264 | if not params.notNotify then |
... | ... | @@ -341,22 +328,12 @@ function RolePlugin.bind(Role) |
341 | 328 | self:incrProperty("diamond", count) |
342 | 329 | end |
343 | 330 | |
344 | - if params.log then | |
345 | - local log = clone(params.log) | |
346 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
347 | - print("costDiamond error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
348 | - end | |
349 | - log["cint1"] = origin | |
350 | - log["cint2"] = count | |
351 | - self:log("in_diamond", log) | |
352 | - else | |
353 | - print("gainDiamond no log ", debug.traceback()) | |
354 | - end | |
355 | - | |
331 | + self:logItems(ItemId.Diamond, origin, count, params.log) | |
356 | 332 | self:notifyUpdateProperty("diamond", self:getAllDiamond()) |
357 | 333 | return true |
358 | 334 | end |
359 | 335 | |
336 | + | |
360 | 337 | function Role:costDiamond(params) |
361 | 338 | if not params or type(params) ~= "table" then return false end |
362 | 339 | local count = tonum(params.count) |
... | ... | @@ -389,17 +366,8 @@ function RolePlugin.bind(Role) |
389 | 366 | self:incrProperty(costFirst[2], -last) |
390 | 367 | end |
391 | 368 | |
392 | - if params.log then | |
393 | - local log = clone(params.log) | |
394 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
395 | - print("costDiamond error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
396 | - end | |
397 | - log["cint1"] = origin | |
398 | - log["cint2"] = count | |
399 | - self:log("out_diamond", log) | |
400 | - else | |
401 | - print("costDiamond no log ", debug.traceback()) | |
402 | - end | |
369 | + | |
370 | + self:logItems(ItemId.Diamond, origin, count, params.log) | |
403 | 371 | |
404 | 372 | self:notifyUpdateProperty("diamond", self:getAllDiamond()) |
405 | 373 | return true |
... | ... | @@ -435,17 +403,9 @@ function RolePlugin.bind(Role) |
435 | 403 | local bin = MsgPack.pack(heroResponse) |
436 | 404 | SendPacket(actionCodes.Hero_loadInfos, bin) |
437 | 405 | end |
438 | - if params.log then | |
439 | - local log = clone(params.log) | |
440 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
441 | - print("addHero error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
442 | - end | |
443 | - log["cint1"] = heroId | |
444 | - log["cint2"] = heroType | |
445 | - self:log("in_hero", log) | |
446 | - else | |
447 | - print("addHero no log ", debug.traceback()) | |
448 | - end | |
406 | + | |
407 | + self:logItems(heroType + ItemStartId.Hero, 0, 1, params.log) | |
408 | + | |
449 | 409 | return true, newHero |
450 | 410 | end |
451 | 411 | |
... | ... | @@ -458,33 +418,6 @@ function RolePlugin.bind(Role) |
458 | 418 | end |
459 | 419 | end |
460 | 420 | |
461 | - function Role:delHero(heroId, params) | |
462 | - params = params or {} | |
463 | - local roleId = self:getProperty('id') | |
464 | - local hero = self.heros[heroId] | |
465 | - local heroType = hero:getProperty("type") | |
466 | - if not hero then return end | |
467 | - | |
468 | - self.heros[heroId] = nil | |
469 | - redisproxy:pipelining(function (red) | |
470 | - red:del(string.format(R_HERO, roleId, heroId)) | |
471 | - red:srem(string.format(R_HEROS, roleId), heroId) | |
472 | - end) | |
473 | - | |
474 | - if params.log then | |
475 | - local log = clone(params.log) | |
476 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
477 | - print("delHero error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
478 | - end | |
479 | - log["cint1"] = heroId | |
480 | - log["cint2"] = heroType | |
481 | - self:log("out_hero", log) | |
482 | - else | |
483 | - print("delHero no log ", debug.traceback()) | |
484 | - end | |
485 | - | |
486 | - SendPacket(actionCodes.Hero_loadInfos, MsgPack.pack({{id = heroId, bDel = true}})) | |
487 | - end | |
488 | 421 | |
489 | 422 | function Role:loadHeros() |
490 | 423 | local roleId = self:getProperty("id") |
... | ... | @@ -563,7 +496,8 @@ function RolePlugin.bind(Role) |
563 | 496 | if not equipCsv then return end |
564 | 497 | local equips = self:getProperty("equips") |
565 | 498 | local curTypeEquips = equips[equipType] or {} |
566 | - local curCount = (curTypeEquips[equipLv] or 0) + count | |
499 | + local oldCount = curTypeEquips[equipLv] or 0 | |
500 | + local curCount = oldCount + count | |
567 | 501 | |
568 | 502 | -- 是否足够上层判断 |
569 | 503 | if curCount < 0 then |
... | ... | @@ -581,22 +515,7 @@ function RolePlugin.bind(Role) |
581 | 515 | |
582 | 516 | self:setProperty("equips", equips) |
583 | 517 | |
584 | - if pms.log then | |
585 | - local log = clone(pms.log) | |
586 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
587 | - print("addEquip error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
588 | - end | |
589 | - log["cint1"] = equipType | |
590 | - log["cint2"] = equipLv | |
591 | - log["cint3"] = math.abs(count) | |
592 | - if count < 0 then | |
593 | - self:log("out_equip", log) | |
594 | - else | |
595 | - self:log("in_equip", log) | |
596 | - end | |
597 | - else | |
598 | - print("addEquip no log ", debug.traceback()) | |
599 | - end | |
518 | + self:logItems(equipCsv.id, oldCount, curCount, pms.log) | |
600 | 519 | |
601 | 520 | if not pms.notNotify then |
602 | 521 | self:changeUpdates({{type = "equips", field = {equipType, equipLv}, value = curCount, isOnlyToC = true}}) -- 通知客户端 |
... | ... | @@ -656,20 +575,7 @@ function RolePlugin.bind(Role) |
656 | 575 | end |
657 | 576 | self:checkTaskEnter("AddRune", {id = params.id, type = params.type, rarity = data.rarity}, params.notNotify) |
658 | 577 | |
659 | - if params.log then | |
660 | - local log = clone(params.log) | |
661 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
662 | - print("addRune error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
663 | - end | |
664 | - | |
665 | - log["cint1"] = runeUid | |
666 | - log["cint2"] = params.type | |
667 | - log["cint3"] = params.id | |
668 | - | |
669 | - self:log("in_rune", log) | |
670 | - else | |
671 | - print("addRune no log ", debug.traceback()) | |
672 | - end | |
578 | + self:logItems(params.id, 0, 1, params.log) | |
673 | 579 | |
674 | 580 | return 0, newRune |
675 | 581 | else |
... | ... | @@ -685,20 +591,7 @@ function RolePlugin.bind(Role) |
685 | 591 | local rune = self.runeBag[runeId] |
686 | 592 | if rune and rune:getProperty("refer") == 0 then |
687 | 593 | |
688 | - if params.log then | |
689 | - local log = clone(params.log) | |
690 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
691 | - print("delRunes error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
692 | - end | |
693 | - | |
694 | - log["cint1"] = runeId | |
695 | - log["cint2"] = rune:getProperty("type") | |
696 | - log["cint3"] = rune:getProperty("id") | |
697 | - | |
698 | - self:log("out_rune", log) | |
699 | - else | |
700 | - print("delRunes no log ", debug.traceback()) | |
701 | - end | |
594 | + self:logItems(rune:getProperty("id"), 1, 0, params.log) | |
702 | 595 | |
703 | 596 | self.runeBag[runeId] = nil |
704 | 597 | table.insert(bDel, runeId) |
... | ... | @@ -944,19 +837,7 @@ function RolePlugin.bind(Role) |
944 | 837 | |
945 | 838 | count = count or 1 |
946 | 839 | |
947 | - if params.log then | |
948 | - local log = clone(params.log) | |
949 | - if log["cint1"] or log["cint2"] or log["cint3"] then | |
950 | - print("funcOpen error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
951 | - end | |
952 | - | |
953 | - log["cint1"] = func | |
954 | - log["cint2"] = count | |
955 | - | |
956 | - self:log("func_open", log) | |
957 | - else | |
958 | - print("funcOpen no log ", debug.traceback()) | |
959 | - end | |
840 | + self:logItems(func, 0, count, params.log) | |
960 | 841 | |
961 | 842 | if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then |
962 | 843 | local unlockData = csvdb["unlockCsv"][func] |
... | ... | @@ -1467,15 +1348,6 @@ function RolePlugin.bind(Role) |
1467 | 1348 | return RANK_ADV[idx] |
1468 | 1349 | end |
1469 | 1350 | |
1470 | - -- 是否需要进行引导 | |
1471 | - function Role:checkOverGuide(guideId) | |
1472 | - local funcGuide = self:getProperty("funcGuide") | |
1473 | - if funcGuide:getv(guideId, 0) > 0 then | |
1474 | - return true | |
1475 | - end | |
1476 | - return false | |
1477 | - end | |
1478 | - | |
1479 | 1351 | -- 消除指定tag 红点 |
1480 | 1352 | function Role:clearRedPTag(tag) |
1481 | 1353 | local redp = self:getProperty("redp") |
... | ... | @@ -1510,8 +1382,8 @@ function RolePlugin.bind(Role) |
1510 | 1382 | SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) |
1511 | 1383 | return |
1512 | 1384 | end |
1513 | - | |
1514 | - local rechargeData = csvdb["shop_rechargeCsv"][orderObject:getProperty("rechargeId")] | |
1385 | + local rechargeId = orderObject:getProperty("rechargeId") | |
1386 | + local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] | |
1515 | 1387 | if rechargeData.rmb ~= tonumber(params.amount) then |
1516 | 1388 | skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s", |
1517 | 1389 | params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount |
... | ... | @@ -1519,16 +1391,34 @@ function RolePlugin.bind(Role) |
1519 | 1391 | return |
1520 | 1392 | end |
1521 | 1393 | |
1522 | - local reward = self:recharge({ | |
1523 | - id = orderObject:getProperty("rechargeId"), | |
1524 | - transactionId = params.transactionId, | |
1525 | - pay_time = params.pay_time, | |
1526 | - order = partnerOrderStr | |
1394 | + local order_type = self:getProperty("rmbC") > 0 and 0 or 1 | |
1395 | + local status, reward = self:recharge({ | |
1396 | + id = rechargeId | |
1527 | 1397 | }) |
1528 | 1398 | orderObject:setProperty("finishTime", skynet.time()) |
1529 | 1399 | orderObject:setProperty("status", "finish") |
1530 | 1400 | |
1531 | 1401 | redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) |
1402 | + | |
1403 | + if not status then | |
1404 | + status = 200 | |
1405 | + else | |
1406 | + status = 1000 + status | |
1407 | + end | |
1408 | + self:log("setOrder", { | |
1409 | + order_status = status, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" | |
1410 | + item_id = rechargeId, -- 道具id | |
1411 | + item_type = rechargeData.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 | |
1412 | + item_name = rechargeData.title, -- 购买的道具名 | |
1413 | + item_number = 1, -- 购买的道具数量 | |
1414 | + item_level = 1, -- 购买的道具等级 | |
1415 | + order_cost = rechargeData.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' | |
1416 | + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 | |
1417 | + order_type = order_type, -- 订单类型,首充记录为1,否则为0 | |
1418 | + order_id = params.transactionId, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' | |
1419 | + }) | |
1420 | + if status ~= 200 then return end | |
1421 | + | |
1532 | 1422 | SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, |
1533 | 1423 | result = "success", reward = reward})) |
1534 | 1424 | |
... | ... | @@ -1541,11 +1431,11 @@ function RolePlugin.bind(Role) |
1541 | 1431 | local rechargeData = csvdb["shop_rechargeCsv"][id] |
1542 | 1432 | if not rechargeData then |
1543 | 1433 | skynet.error("recharge id not exist", id) |
1544 | - return | |
1434 | + return 1 | |
1545 | 1435 | end |
1546 | 1436 | |
1547 | 1437 | if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then |
1548 | - return 1 | |
1438 | + return 2 | |
1549 | 1439 | end |
1550 | 1440 | |
1551 | 1441 | local diamondCount = 0 |
... | ... | @@ -1560,13 +1450,13 @@ function RolePlugin.bind(Role) |
1560 | 1450 | end |
1561 | 1451 | self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) |
1562 | 1452 | elseif rechargeData.shop == 2 then --通行证商店 |
1563 | - reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) | |
1453 | + reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}}) | |
1564 | 1454 | self.storeData:onBuyCard(rechargeData.type, rechargeData.time) |
1565 | 1455 | elseif rechargeData.shop == 3 then -- 礼包商店 |
1566 | - reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) | |
1456 | + reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}}) | |
1567 | 1457 | else |
1568 | 1458 | skynet.error("invalid recharge shop type " .. id) |
1569 | - return | |
1459 | + return 3 | |
1570 | 1460 | end |
1571 | 1461 | |
1572 | 1462 | if diamondCount > 0 then |
... | ... | @@ -1576,10 +1466,8 @@ function RolePlugin.bind(Role) |
1576 | 1466 | -- 累充 |
1577 | 1467 | local rmb = rechargeData.rmb |
1578 | 1468 | self:updateProperty({field = "rmbC", delta = rmb}) |
1579 | - | |
1580 | - self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time}) | |
1581 | 1469 | |
1582 | - return reward | |
1470 | + return nil, reward | |
1583 | 1471 | end |
1584 | 1472 | |
1585 | 1473 | --直接给玩家发送邮件,立即推送小红点 |
... | ... | @@ -1600,6 +1488,50 @@ function RolePlugin.bind(Role) |
1600 | 1488 | self.sendMailFlag = true |
1601 | 1489 | end |
1602 | 1490 | |
1491 | + -- 是否需要进行引导 | |
1492 | + function Role:checkOverGuide(guideId,slave) | |
1493 | + local funcGuide = self:getProperty("funcGuide") | |
1494 | + if funcGuide:getv(guideId * 1000 + (slave or 0), 0) > 0 then | |
1495 | + return true | |
1496 | + end | |
1497 | + return false | |
1498 | + end | |
1499 | + | |
1500 | + -- 保存引导步骤 | |
1501 | + function Role:saveGuide(master,slave,force) | |
1502 | + local newerGuide = self:getProperty("newerGuide") | |
1503 | + local guide = newerGuide:toArray(true,"=") | |
1504 | + local sMaster, sSlave = guide[1], guide[2] | |
1505 | + | |
1506 | + if not force and master < sMaster then return end | |
1507 | + if not force and master <= sMaster and slave < sSlave then return end | |
1508 | + | |
1509 | + local funcGuide = self:getProperty("funcGuide") | |
1510 | + funcGuide = funcGuide:setv(master * 1000 + slave, 1) | |
1511 | + if funcGuide:getv(master * 1000,0) == 0 then | |
1512 | + funcGuide = funcGuide:setv(master * 1000, 1) | |
1513 | + end | |
1514 | + self:updateProperty({field = "funcGuide", value = funcGuide}) | |
1515 | + self:log("onGuidePoint", {guild_type = 0, guild_id = master, guild_point = slave, guild_pass = 0}) | |
1516 | + | |
1517 | + newerGuide = string.format("%d=%d",master,slave) | |
1518 | + self:updateProperty({field = "newerGuide", value = newerGuide}) | |
1519 | + end | |
1520 | + | |
1521 | + -- 引导大步骤结束 | |
1522 | + function Role:finishGuide(master) | |
1523 | + local newerGuide = self:getProperty("newerGuide") | |
1524 | + local guide = newerGuide:toArray(true,"=") | |
1525 | + if guide[1] > master then return end | |
1526 | + | |
1527 | + local guideCsv = csvdb["guide_mainCsv"] | |
1528 | + local lastStep = guideCsv[master][#guideCsv[master]] | |
1529 | + if guideCsv[master + 1] then | |
1530 | + self:updateProperty({field = "newerGuide", value = string.format("%d=%d",master + 1,1)}) | |
1531 | + else | |
1532 | + self:updateProperty({field = "newerGuide", value = "9999=1"}) | |
1533 | + end | |
1534 | + end | |
1603 | 1535 | end |
1604 | 1536 | |
1605 | 1537 | return RolePlugin |
1606 | 1538 | \ No newline at end of file | ... | ... |
src/models/RolePvp.lua
... | ... | @@ -500,7 +500,7 @@ function Role:setCrossServerPvpBet(idx) |
500 | 500 | local ok, result = pcall(skynet.call, pvpd, "lua", "setBet", idx, self:getProperty("id"), costNum) |
501 | 501 | if ok then |
502 | 502 | if result then |
503 | - self:costItems(cost, {log = {desc = "crossPvpBet", short1 = day}}) | |
503 | + self:costItems(cost, {log = {desc = "crossPvpBet", int1 = day}}) | |
504 | 504 | pvpBet[day] = {idx, cost[ItemId.Gold]} |
505 | 505 | self:setProperty("pvpBet", pvpBet) |
506 | 506 | end | ... | ... |
src/models/RoleTask.lua
... | ... | @@ -76,6 +76,9 @@ local TaskType = { |
76 | 76 | AddFriend = 802, -- 加入一个好友 - count |
77 | 77 | GetFriendP = 803, -- 获得友情点 - count |
78 | 78 | |
79 | + -- 角色相关 | |
80 | + RoleLevelUp = 901, -- 角色升级 - curlevel | |
81 | + | |
79 | 82 | --功能未实现 todo |
80 | 83 | AdvShop = 1002, -- 冒险商城 |
81 | 84 | UnionBoss = 1004, -- 工会boss |
... | ... | @@ -209,13 +212,22 @@ local Activity = require("models.Activity") |
209 | 212 | local ActivityListener = { |
210 | 213 | func = "checkActivityTask", |
211 | 214 | listen = { |
212 | - [TaskType.DrawHero] = {{Activity.ActivityType.DrawHero, f("count")}}, | |
215 | + [TaskType.DrawHero] = {{Activity.ActivityType.DrawHero, f("count"), f("pool")}}, | |
213 | 216 | [TaskType.FoodSell] = {{Activity.ActivityType.FoodSell, f("count")}}, |
214 | 217 | [TaskType.AdvDraw] = {{Activity.ActivityType.AdvDraw, f("count")}}, |
215 | 218 | [TaskType.OpenBox] = {{Activity.ActivityType.OpenBox, f("count")}}, |
216 | 219 | } |
217 | 220 | } |
218 | 221 | |
222 | +local StoreListener = { | |
223 | + func = "checkStoreTask", | |
224 | + listen = { | |
225 | + [TaskType.HangPass] = {{TriggerEventType.HangPass, f("id")}}, | |
226 | + [TaskType.RoleLevelUp] = {{TriggerEventType.LevelUp, f("level")}}, | |
227 | + [TaskType.TowerPass] = {{TriggerEventType.TowerPass, f("level")}}, | |
228 | + } | |
229 | +} | |
230 | + | |
219 | 231 | |
220 | 232 | local TaskListeners = { |
221 | 233 | StoryListener, |
... | ... | @@ -223,6 +235,7 @@ local TaskListeners = { |
223 | 235 | AchievListener, |
224 | 236 | SudokuListener, |
225 | 237 | ActivityListener, |
238 | + StoreListener, | |
226 | 239 | } |
227 | 240 | |
228 | 241 | local RoleTask = {} |
... | ... | @@ -533,6 +546,10 @@ function RoleTask.bind(Role) |
533 | 546 | self.activity:checkActivity(notNotify, activityType, ...) |
534 | 547 | end |
535 | 548 | |
549 | + function Role:checkStoreTask(notNotify, triggerType, param) | |
550 | + self.storeData:OnTriggerLimitTimePack(triggerType, param) | |
551 | + end | |
552 | + | |
536 | 553 | end |
537 | 554 | |
538 | 555 | return RoleTask |
539 | 556 | \ No newline at end of file | ... | ... |
src/models/RoleTimeReset.lua
... | ... | @@ -13,6 +13,7 @@ ResetFunc["CrossDay"] = function(self, notify, response, now) |
13 | 13 | self.storeData:onCrossDay() |
14 | 14 | |
15 | 15 | self:setProperty("dTask", {}) |
16 | + self:incrProperty("lday", 1) | |
16 | 17 | self:advRandomSupportEffect(not notify) |
17 | 18 | |
18 | 19 | self:checkExpireItem(not notify) | ... | ... |
src/models/Rune.lua
... | ... | @@ -27,15 +27,15 @@ function Rune:notifyUpdateProperty(field, newValue, oldValue) |
27 | 27 | end |
28 | 28 | |
29 | 29 | function Rune:log(contents) |
30 | - contents = contents or {} | |
31 | - if contents["cint1"] or contents["cint2"] or contents["cint3"] then | |
32 | - print("heroLog error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
33 | - end | |
34 | - contents["cint1"] = self:getProperty("uid") | |
35 | - contents["cint2"] = self:getProperty("type") | |
36 | - contents["cint3"] = self:getProperty("id") | |
30 | + -- contents = contents or {} | |
31 | + -- if contents["cint1"] or contents["cint2"] or contents["cint3"] then | |
32 | + -- print("heroLog error log have cint1 or cint2 or cint3 ", debug.traceback()) | |
33 | + -- end | |
34 | + -- contents["cint1"] = self:getProperty("uid") | |
35 | + -- contents["cint2"] = self:getProperty("type") | |
36 | + -- contents["cint3"] = self:getProperty("id") | |
37 | 37 | |
38 | - self.owner:log("rune_action", contents) | |
38 | + -- self.owner:log("rune_action", contents) | |
39 | 39 | end |
40 | 40 | |
41 | 41 | function Rune:notifyUpdateProperties(params) | ... | ... |
src/models/Store.lua
... | ... | @@ -20,6 +20,7 @@ Store.schema = { |
20 | 20 | privCardEx = {"number", 0}, -- 特权卡过期时间戳 |
21 | 21 | getMailT1 = {"number",0}, -- 上次发送月卡福利邮件的时间 |
22 | 22 | getMailT2 = {"number",0}, -- 上次发送超级月卡福利邮件的时间 |
23 | + packTrigger = {"table", {}} -- 礼包触发记录 {关卡难度1={id, 通关关卡数,升级数,爬塔层数}, ...} | |
23 | 24 | } |
24 | 25 | |
25 | 26 | function Store:updateProperty(params) |
... | ... | @@ -60,7 +61,7 @@ end |
60 | 61 | -- 发送月卡邮件 |
61 | 62 | function Store:sendMonthCardEmail() |
62 | 63 | local timeNow = skynet.timex() |
63 | - local tabs = {{ex="monthCardEx", t="getMailT1", mail=MailId.MonthCard, alert=MailId.MonthCardEx}, | |
64 | + local tabs = {{ex="monthCardEx", t="getMailT1", mail=MailId.MonthCard, alert=MailId.MonthCardEx}, | |
64 | 65 | {ex="smonthCardEx", t="getMailT2", mail=MailId.SuperMonthCard, alert=MailId.SuperMonthCardEx}} |
65 | 66 | for _, v in ipairs(tabs) do |
66 | 67 | local ex = self:getProperty(v.ex) |
... | ... | @@ -216,7 +217,7 @@ function Store:onBattleCardReset() |
216 | 217 | if config then |
217 | 218 | local freeFlag = string.char(string.getbit(battleCardFreeRecord, id)) |
218 | 219 | local limitFlag = string.char(string.getbit(battleCardLimitRecord, id)) |
219 | - | |
220 | + | |
220 | 221 | if battlePoint < config.point then |
221 | 222 | break |
222 | 223 | end |
... | ... | @@ -227,7 +228,7 @@ function Store:onBattleCardReset() |
227 | 228 | concatGift(config.giftLimit) |
228 | 229 | end |
229 | 230 | end |
230 | - end | |
231 | + end | |
231 | 232 | self.owner:sendMail(MailId.BattleCardAward, nil, gift) |
232 | 233 | -- 计算剩余奖励 |
233 | 234 | self:updateProperty({field = "battleCard", value=0}) |
... | ... | @@ -266,6 +267,69 @@ function Store:resetStoreReored(resetId) |
266 | 267 | self:updateProperty({field = "buyR", value = buyRecord}) |
267 | 268 | end |
268 | 269 | |
270 | +--触发限时礼包 | |
271 | +function Store:OnTriggerLimitTimePack(eventType, param) | |
272 | + local limitPack = self:getProperty("limitTPack") | |
273 | + local payRecord = self:getProperty("payR") | |
274 | + local timeNow = skynet.timex() | |
275 | + local find = false | |
276 | + -- 有未过期的限时礼包不再推送 | |
277 | + for k, v in pairs(limitPack) do | |
278 | + if v > timeNow and not payRecord[k] then | |
279 | + find = true | |
280 | + break | |
281 | + end | |
282 | + end | |
283 | + if find == true then | |
284 | + return | |
285 | + end | |
286 | + limitPack = {} | |
287 | + local hangPass = self.owner:getProperty("hangPass") | |
288 | + local triggerRecord = self:getProperty("packTrigger") | |
289 | + local result = {} | |
290 | + local maxDiff = 0 | |
291 | + -- 取满足限时礼包关卡要求的对应数据 | |
292 | + for diff, maxCarbonId in pairs(hangPass) do | |
293 | + for id, cfg in pairs(csvdb["shop_packCsv"]) do | |
294 | + local range = cfg.showRange:toArray(true, "=") | |
295 | + local beginRange = range[1] or 0 | |
296 | + local endRange = range[2] or 0 | |
297 | + if maxCarbonId > beginRange and maxCarbonId <= endRange and cfg.type == eventType then | |
298 | + result[diff] = cfg | |
299 | + maxDiff = math.max(maxDiff, diff) | |
300 | + break | |
301 | + end | |
302 | + end | |
303 | + end | |
304 | + local shopGoodsId = 0 | |
305 | + for diff, cfg in pairs(result) do | |
306 | + if diff == maxDiff then | |
307 | + local record = triggerRecord[diff] or {} | |
308 | + if (record[0] or 0) ~= cfg.id and next(record) then | |
309 | + record = {} | |
310 | + end | |
311 | + record[0] = cfg.id | |
312 | + record[eventType] = (record[eventType] or 0) + 1 | |
313 | + if record[eventType] > 0 and record[eventType] % 10 == 0 then | |
314 | + local pool = cfg.packId:toArray(true, "=") | |
315 | + local idx = math.random(1, #pool) | |
316 | + shopGoodsId = pool[idx] | |
317 | + end | |
318 | + triggerRecord[diff] = record | |
319 | + end | |
320 | + end | |
321 | + if shopGoodsId ~= 0 then | |
322 | + local rechargeCfg = csvdb["shop_rechargeCsv"][shopGoodsId] | |
323 | + if rechargeCfg then | |
324 | + limitPack[rechargeCfg.id] = timeNow + rechargeCfg.time | |
325 | + self:updateProperty({field = "limitTPack", value = limitPack}) | |
326 | + end | |
327 | + end | |
328 | + if next(result) then | |
329 | + self:updateProperty({field = "packTrigger", value = triggerRecord}) | |
330 | + end | |
331 | +end | |
332 | + | |
269 | 333 | function Store:data() |
270 | 334 | return { |
271 | 335 | buyR = self:getProperty("buyR"), |
... | ... | @@ -279,6 +343,7 @@ function Store:data() |
279 | 343 | battleLR = self:getProperty("battleLR"), |
280 | 344 | limitTPack = self:getProperty("limitTPack"), |
281 | 345 | privCardEx = self:getProperty("privCardEx"), |
346 | + packTrigger = self:getProperty("packTrigger") | |
282 | 347 | } |
283 | 348 | end |
284 | 349 | ... | ... |
src/services/agent_ctrl.lua
... | ... | @@ -128,7 +128,7 @@ function _M:check_agent_status() |
128 | 128 | next_log_time = now + 60 |
129 | 129 | local count = table_nums(self.u2f) |
130 | 130 | datacenter.set("onlineCount", count) |
131 | - pcall(skynet.send, logd, "lua", "log", "online", {count = count}, "online") | |
131 | + -- pcall(skynet.send, logd, "lua", "log", "online", {count = count}, "online") | |
132 | 132 | end |
133 | 133 | end |
134 | 134 | ... | ... |
src/services/globald.lua
... | ... | @@ -60,25 +60,25 @@ local function mailQuene() |
60 | 60 | if email.mid then |
61 | 61 | redisproxy:hmset(string_format("globalEmail:%s", gid), |
62 | 62 | "id", gid, |
63 | - "createtime", email.endTime, | |
63 | + "createtime", email.startTime, | |
64 | 64 | "title", email.title, |
65 | 65 | "stitle", email.stitle, |
66 | 66 | "content", email.content, |
67 | 67 | "attachments", email.attachments, |
68 | 68 | "endtime", email.endTime, |
69 | 69 | "mid", email.mid, |
70 | - "timestamp", email.startTime | |
70 | + "timestamp", now | |
71 | 71 | ) |
72 | 72 | else |
73 | 73 | redisproxy:hmset(string_format("globalEmail:%s", gid), |
74 | 74 | "id", gid, |
75 | - "createtime", email.endTime, | |
75 | + "createtime", email.startTime, | |
76 | 76 | "title", email.title, |
77 | 77 | "stitle", email.stitle, |
78 | 78 | "content", email.content, |
79 | 79 | "attachments", email.attachments, |
80 | 80 | "endtime", email.endTime, |
81 | - "timestamp", email.startTime | |
81 | + "timestamp", now | |
82 | 82 | ) |
83 | 83 | end |
84 | 84 | end | ... | ... |
src/services/logd.lua
... | ... | @@ -55,44 +55,17 @@ skynet.register_protocol { |
55 | 55 | end |
56 | 56 | } |
57 | 57 | |
58 | - | |
59 | - | |
60 | --- 日志 index 不包含 日期的 index_suffix | |
61 | -local IndexNoDate = { | |
62 | - online = true, | |
63 | -} | |
64 | --- 不走 role log 的日志都要自行注意 mapping 设置【重要】 | |
65 | --- index_suffix index 后缀 默认为 common | |
66 | -function CMD.log(logType, doc, index_suffix) | |
67 | - index_suffix = index_suffix or "common" | |
68 | - if index_suffix == "common" then | |
69 | - doc["@type"] = logType | |
70 | - else | |
71 | - if logType ~= index_suffix then -- 定制后缀 不一定有type 不相等时才有type | |
72 | - doc["@type"] = logType | |
73 | - end | |
74 | - end | |
75 | - | |
76 | - local now = skynet.timex() | |
77 | - doc["timestamp"] = now | |
78 | - doc["timestamp_f"] = os.date("%Y-%m-%d %H:%M:%S", now) | |
79 | - doc["server"] = serverId | |
80 | - | |
81 | - -- 自己加好 index | |
82 | - if IndexNoDate[index_suffix] then | |
83 | - doc["@index"] = string.format("gamelog-%s", index_suffix) | |
84 | - else | |
85 | - doc["@index"] = string.format("gamelog-%s-%s", os.date("%Y%m%d", now), index_suffix) | |
86 | - end | |
58 | +function CMD.log(doc) | |
87 | 59 | if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then |
88 | 60 | if not connecting then |
89 | 61 | CMD.open() -- 连一下试试 |
62 | + socketdriver.send(log_fd, json.encode(doc) .. "\n") | |
90 | 63 | end |
91 | 64 | end |
92 | 65 | end |
93 | 66 | |
94 | 67 | function CMD.open() |
95 | - log_fd = socketdriver.connect("127.0.0.1", 5170) | |
68 | + log_fd = socketdriver.connect("127.0.0.1", 13001) | |
96 | 69 | connecting = true |
97 | 70 | end |
98 | 71 | ... | ... |
src/utils/StringUtil.lua
... | ... | @@ -13,7 +13,7 @@ local strh = require "strh" |
13 | 13 | function string.setv(str, k, v, delimiter) |
14 | 14 | delimiter = delimiter or " " |
15 | 15 | -- 若存在则替换,若无则append |
16 | - return strh.modify(str, {[tonumber(k)]=tonumber(v)}, false, delimiter) | |
16 | + return strh.modify(str, {[tonumber(k)]=math.floor(tonumber(v))}, false, delimiter) | |
17 | 17 | end |
18 | 18 | |
19 | 19 | function string.msetv(str, vs, delimiter) |
... | ... | @@ -24,7 +24,7 @@ end |
24 | 24 | |
25 | 25 | function string.incrv(str, k, delta, delimiter) |
26 | 26 | delimiter = delimiter or " " |
27 | - return strh.modify(str, {[tonumber(k)]=tonumber(delta)}, true, delimiter) | |
27 | + return strh.modify(str, {[tonumber(k)]=math.floor(tonumber(delta))}, true, delimiter) | |
28 | 28 | end |
29 | 29 | |
30 | 30 | function string.mincrv(str, ds, delimiter) |
... | ... | @@ -331,4 +331,20 @@ function string.setbit(str, pos, yes) |
331 | 331 | else |
332 | 332 | return str:sub(1, pos-1) .. yes .. str:sub(pos+1, -1) |
333 | 333 | end |
334 | +end | |
335 | + | |
336 | +--[[ | |
337 | +from: 1=2 3=4 | |
338 | +to: {["1"]="2" or 2,["3"]="4" or 4} | |
339 | +]] | |
340 | +function string.toMap(str, tonum, sep) | |
341 | + local str_vec = string.split(str, " ") | |
342 | + local tab = {} | |
343 | + for _, v in pairs(str_vec) do | |
344 | + local vec = string.split(v, sep) | |
345 | + if #vec == 2 then | |
346 | + tab[vec[1]] = tonum and tonumber(vec[2]) or vec[2] | |
347 | + end | |
348 | + end | |
349 | + return tab | |
334 | 350 | end |
335 | 351 | \ No newline at end of file | ... | ... |