Commit 2a79cbf8c181ee8723077ee32263e33a600c3435

Authored by zhouhaihai
2 parents 80b06009 c3a70cde

Merge branch 'develop' into player

* develop: (47 commits)
  返还
  冒险bug
  签名回调地址由客户端上传
  邮件时间bug
  停止注册
  日志端口
  修改报错,下载cv奖励记录字段
  增加pay_url
  挂机选定关卡时,指定新手引导步骤
  battle bug
  引导招募必送思露德判定出了大问题
  战斗 日志
  新的被动效果
  挂机战斗胜利才触发对应的引导
  不回复 更改看板娘
  增加记录log
  log 增加
  触发神器引导的代码移到发奖励的方法里
  神器的引导步骤从55步开始
  10连保底使用池子全随机
  ...

# Conflicts:
#	src/actions/HeroAction.lua
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
... ... @@ -14,7 +14,6 @@ function Battle:ctor(adv)
14 14 self:initAfter()
15 15 if self.isNewPlayer then
16 16 self.player:triggerPassive(Passive.BORN_ONCE)
17   - self.player:addExp((self.adv.level - 1) * 40)
18 17 end
19 18 end
20 19  
... ...
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  
... ...
1   -Subproject commit f52151f947b019976eac7ef15ec914bf7d552d64
  1 +Subproject commit 2de1748bed665c9220f68eeb23a8ce3d1f810bda
... ...
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(&quot;.RoleTask&quot;) --角色任务
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  
... ...
src/models/RoleBattle.lua 0 → 100644
... ... @@ -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(&quot;models.Activity&quot;)
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[&quot;CrossDay&quot;] = 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 &quot;strh&quot;
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
... ...