Commit 1863d5405d45f1b7744a7d6c4de535ce6d66db72

Authored by liuzujun
2 parents 93f6e69b a7b824ac

fix conflict

src/actions/AdvAction.lua
@@ -489,6 +489,10 @@ function _M.useItemRpc(agent, data) @@ -489,6 +489,10 @@ function _M.useItemRpc(agent, data)
489 adv:backUse({[itemId] = count}) 489 adv:backUse({[itemId] = count})
490 end 490 end
491 491
  492 + if itemId == 5020 then
  493 + role:finishGuide(53)
  494 + end
  495 +
492 adv:checkAchievement(adv.AchievType.UseItem, count, itemId) 496 adv:checkAchievement(adv.AchievType.UseItem, count, itemId)
493 adv:log({desc = "useItem", int1 = itemId, int2 = count}) 497 adv:log({desc = "useItem", int1 = itemId, int2 = count})
494 498
@@ -538,6 +542,8 @@ function _M.usePotionRpc(agent, data) @@ -538,6 +542,8 @@ function _M.usePotionRpc(agent, data)
538 adv:saveDB() 542 adv:saveDB()
539 role:checkTaskEnter("AdvUsePotion") 543 role:checkTaskEnter("AdvUsePotion")
540 544
  545 + role:finishGuide(61)
  546 +
541 SendPacket(actionCodes.Adv_usePotionRpc, MsgPack.pack({events = adv:popBackEvents()})) 547 SendPacket(actionCodes.Adv_usePotionRpc, MsgPack.pack({events = adv:popBackEvents()}))
542 return true 548 return true
543 end 549 end
@@ -555,6 +561,8 @@ function _M.chooseArtifactRpc(agent, data) @@ -555,6 +561,8 @@ function _M.chooseArtifactRpc(agent, data)
555 local status = adv:chooseArtifact(msg.idx) 561 local status = adv:chooseArtifact(msg.idx)
556 if not status then return 4 end 562 if not status then return 4 end
557 adv:saveDB() 563 adv:saveDB()
  564 +
  565 + role:finishGuide(54)
558 566
559 SendPacket(actionCodes.Adv_chooseArtifactRpc, '') 567 SendPacket(actionCodes.Adv_chooseArtifactRpc, '')
560 return true 568 return true
@@ -578,6 +586,8 @@ function _M.wearArtifactRpc(agent, data) @@ -578,6 +586,8 @@ function _M.wearArtifactRpc(agent, data)
578 if not status then return 3 end 586 if not status then return 3 end
579 adv:saveDB() 587 adv:saveDB()
580 588
  589 + role:finishGuide(55)
  590 +
581 SendPacket(actionCodes.Adv_wearArtifactRpc, '') 591 SendPacket(actionCodes.Adv_wearArtifactRpc, '')
582 return true 592 return true
583 end 593 end
@@ -607,6 +617,7 @@ function _M.upArtifactRpc(agent, data) @@ -607,6 +617,7 @@ function _M.upArtifactRpc(agent, data)
607 else 617 else
608 adv:updateAchievement() 618 adv:updateAchievement()
609 end 619 end
  620 +
610 SendPacket(actionCodes.Adv_upArtifactRpc, '') 621 SendPacket(actionCodes.Adv_upArtifactRpc, '')
611 return true 622 return true
612 end 623 end
@@ -616,7 +627,9 @@ function _M.exitAdvRpc(agent, data) @@ -616,7 +627,9 @@ function _M.exitAdvRpc(agent, data)
616 local role = agent.role 627 local role = agent.role
617 -- local msg = MsgPack.unpack(data) 628 -- local msg = MsgPack.unpack(data)
618 if not isCanContinue(role) then return end 629 if not isCanContinue(role) then return end
619 - 630 + if not role:checkOverGuide(57) then
  631 + role:saveGuide(57,1,true)
  632 + end
620 local adv = role:getAdvData() 633 local adv = role:getAdvData()
621 adv:log({desc = "exit"}) 634 adv:log({desc = "exit"})
622 local status = adv:exit() -- target {roomId = 1, blockId = 1} 选择的目标 635 local status = adv:exit() -- target {roomId = 1, blockId = 1} 选择的目标
@@ -677,6 +690,19 @@ function _M.endBattleRpc(agent, data) @@ -677,6 +690,19 @@ function _M.endBattleRpc(agent, data)
677 if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId then return end 690 if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId then return end
678 adv.__battleCache = nil 691 adv.__battleCache = nil
679 692
  693 + -- 打完野猪怪
  694 + role:finishGuide(52)
  695 + -- 调理剂使用引导(生命药剂)
  696 + if not role:checkOverGuide(61) then
  697 + local potionBag = role:getProperty("potionBag")
  698 + local own = potionBag[10] or 0
  699 + if own > 0 then
  700 + -- 造假
  701 + player.hp = player.hp * 0.8
  702 + role:saveGuide(61,1,true)
  703 + end
  704 + end
  705 +
680 adv:log({desc = "endBattle"}) 706 adv:log({desc = "endBattle"})
681 local status = adv:clickBlock(roomId, blockId, {player = player, bySkill = bySkill}) 707 local status = adv:clickBlock(roomId, blockId, {player = player, bySkill = bySkill})
682 708
@@ -759,7 +785,7 @@ function _M.wheelSurfRpc(agent, data) @@ -759,7 +785,7 @@ function _M.wheelSurfRpc(agent, data)
759 table.insert(backReward, gift) 785 table.insert(backReward, gift)
760 end 786 end
761 role:award(reward, {log = {desc = "advWheelSurf", int1 = ptype}}) 787 role:award(reward, {log = {desc = "advWheelSurf", int1 = ptype}})
762 - 788 + role:finishGuide(58)
763 role:checkTaskEnter("AdvDraw", {count = count, ptype = ptype}) 789 role:checkTaskEnter("AdvDraw", {count = count, ptype = ptype})
764 role:log("adv_action", {desc = "advWheelSurf", int1 = ptype, int2 = count}) 790 role:log("adv_action", {desc = "advWheelSurf", int1 = ptype, int2 = count})
765 791
@@ -814,7 +840,7 @@ function _M.finishAchievRpc(agent, data) @@ -814,7 +840,7 @@ function _M.finishAchievRpc(agent, data)
814 if not status then return end 840 if not status then return end
815 adv:updateAchievement() 841 adv:updateAchievement()
816 role:log("adv_action", {desc = "finishAchiev", short1 = ctype, int1 = chapterId, int2 = taskId}) 842 role:log("adv_action", {desc = "finishAchiev", short1 = ctype, int1 = chapterId, int2 = taskId})
817 - 843 + role:finishGuide(57)
818 SendPacket(actionCodes.Adv_finishAchievRpc, MsgPack.pack(role:packReward(reward, change))) 844 SendPacket(actionCodes.Adv_finishAchievRpc, MsgPack.pack(role:packReward(reward, change)))
819 return true 845 return true
820 end 846 end
src/actions/DinerAction.lua
@@ -104,7 +104,7 @@ function _M.addSellRpc( agent, data ) @@ -104,7 +104,7 @@ function _M.addSellRpc( agent, data )
104 if change then 104 if change then
105 role.dinerData:updateProperty({field = "customer", value = customer}) 105 role.dinerData:updateProperty({field = "customer", value = customer})
106 end 106 end
107 - 107 + role:finishGuide(28)
108 role:log("diner_action", {desc = "addSell", int1 = dish, int2 = count}) 108 role:log("diner_action", {desc = "addSell", int1 = dish, int2 = count})
109 109
110 role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) 110 role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
@@ -407,7 +407,7 @@ function _M.talentUpRpc( agent, data ) @@ -407,7 +407,7 @@ function _M.talentUpRpc( agent, data )
407 -- end 407 -- end
408 408
409 role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1], level = dishLevel + 1}) 409 role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1], level = dishLevel + 1})
410 - 410 + role:finishGuide(27)
411 role:log("diner_action", {desc = "talentUp", int1 = dish, int2 = dishLevel + 1}) 411 role:log("diner_action", {desc = "talentUp", int1 = dish, int2 = dishLevel + 1})
412 412
413 SendPacket(actionCodes.Diner_talentUpRpc, '') 413 SendPacket(actionCodes.Diner_talentUpRpc, '')
@@ -612,7 +612,7 @@ function _M.refreshTaskRpc( agent, data ) @@ -612,7 +612,7 @@ function _M.refreshTaskRpc( agent, data )
612 end 612 end
613 613
614 role:log("diner_action", {desc = "reTask"}) 614 role:log("diner_action", {desc = "reTask"})
615 - 615 + role:finishGuide(41)
616 role.dinerData:updateProperty({field = "order", value = json.encode(orders)}) 616 role.dinerData:updateProperty({field = "order", value = json.encode(orders)})
617 617
618 SendPacket(actionCodes.Diner_refreshTaskRpc, '') 618 SendPacket(actionCodes.Diner_refreshTaskRpc, '')
@@ -653,7 +653,7 @@ function _M.addWantFoodRpc(agent , data) @@ -653,7 +653,7 @@ function _M.addWantFoodRpc(agent , data)
653 end 653 end
654 654
655 role:log("diner_action", {desc = "wantFood"}) 655 role:log("diner_action", {desc = "wantFood"})
656 - 656 + role:finishGuide(36)
657 role.dinerData:updateProperty({field = "gfood", value = gfood}) 657 role.dinerData:updateProperty({field = "gfood", value = gfood})
658 658
659 SendPacket(actionCodes.Diner_addWantFoodRpc, '') 659 SendPacket(actionCodes.Diner_addWantFoodRpc, '')
@@ -832,6 +832,8 @@ function _M.entrustRpc(agent , data) @@ -832,6 +832,8 @@ function _M.entrustRpc(agent , data)
832 832
833 role:log("diner_action", {desc = "entrus", short1 = ctype, int1 = entrustId}) 833 role:log("diner_action", {desc = "entrus", short1 = ctype, int1 = entrustId})
834 834
  835 + role:finishGuide(26)
  836 +
835 SendPacket(actionCodes.Diner_entrustRpc, MsgPack.pack({reward = reward, change = change})) 837 SendPacket(actionCodes.Diner_entrustRpc, MsgPack.pack({reward = reward, change = change}))
836 return true 838 return true
837 end 839 end
src/actions/EmailAction.lua
@@ -53,7 +53,6 @@ function _M.listRpc(agent, data) @@ -53,7 +53,6 @@ function _M.listRpc(agent, data)
53 content = email.content, 53 content = email.content,
54 attachments = email.attachments 54 attachments = email.attachments
55 }) 55 })
56 - role:log("mail_action", {desc = "get_global", key1 = email.title, key2 = email.attachments})  
57 end 56 end
58 end 57 end
59 end 58 end
@@ -90,21 +89,17 @@ function _M.drawAllAttachRpc(agent, data) @@ -90,21 +89,17 @@ function _M.drawAllAttachRpc(agent, data)
90 local ids = {} 89 local ids = {}
91 90
92 local emails = loadEmails(roleId) 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[emailId] = 1
  98 + for key, v in pairs(attachments:toNumMap()) do
  99 + reward[key] = (reward[key] or 0) + v
105 end 100 end
106 end 101 end
107 - end) 102 + end
108 reward, change = role:award(reward, {log = {desc = "draw_attach"}}) 103 reward, change = role:award(reward, {log = {desc = "draw_attach"}})
109 SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change})) 104 SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change}))
110 return true 105 return true
@@ -125,10 +120,10 @@ function _M.drawAttachRpc(agent, data) @@ -125,10 +120,10 @@ function _M.drawAttachRpc(agent, data)
125 if attachments == "" then return end 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")}}) 122 local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title")}})
128 - redisproxy:hset(rds, "status", 2) -- 领取标记 123 + email:setProperty("status", 2)
  124 + email:log(role, 2)
129 SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change})) 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 return true 127 return true
133 end 128 end
134 129
@@ -139,11 +134,11 @@ function _M.checkRpc(agent, data) @@ -139,11 +134,11 @@ function _M.checkRpc(agent, data)
139 local msg = MsgPack.unpack(data) 134 local msg = MsgPack.unpack(data)
140 local id = msg.id 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 email = require("models.Email").new({key = rds})
  138 + if not email:load() then return end
144 139
145 - redisproxy:hset(rds, "status", 1)  
146 - role:log("mail_action", {desc = "check_mail", int1 = id}) 140 + email:setProperty(rds, "status", 1)
  141 + email:log(role, 1)
147 142
148 SendPacket(actionCodes.Email_checkRpc, '') 143 SendPacket(actionCodes.Email_checkRpc, '')
149 return true 144 return true
@@ -171,6 +166,7 @@ function _M.delRpc(agent, data) @@ -171,6 +166,7 @@ function _M.delRpc(agent, data)
171 attachments = emailData.attachment 166 attachments = emailData.attachment
172 end 167 end
173 if status == 2 or (status == 1 and attachments:len() == 0) then 168 if status == 2 or (status == 1 and attachments:len() == 0) then
  169 + email:log(role, 3)
174 red:lrem(rds, 0, id) 170 red:lrem(rds, 0, id)
175 red:del(emailRds) 171 red:del(emailRds)
176 result[tonum(id)] = 1 172 result[tonum(id)] = 1
@@ -178,9 +174,6 @@ function _M.delRpc(agent, data) @@ -178,9 +174,6 @@ function _M.delRpc(agent, data)
178 end 174 end
179 end 175 end
180 end) 176 end)
181 - for delId, _ in ipairs(result) do  
182 - role:log("mail_action", {desc = "del_mail", int1 = delId})  
183 - end  
184 SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result})) 177 SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result}))
185 return true 178 return true
186 end 179 end
src/actions/HangAction.lua
@@ -250,6 +250,23 @@ function _M.endBattleRpc(agent, data) @@ -250,6 +250,23 @@ function _M.endBattleRpc(agent, data)
250 local team = role:getProperty("pvpTC") 250 local team = role:getProperty("pvpTC")
251 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)}) 251 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)})
252 252
  253 + -- 引导
  254 + if carbonId == 10101 then
  255 + role:finishGuide(5)
  256 + elseif carbonId == 10102 then
  257 + role:finishGuide(8)
  258 + elseif carbonId == 10103 then
  259 + role:finishGuide(9)
  260 + elseif carbonId == 10220 then
  261 + role:finishGuide(22)
  262 + end
  263 + for _, guideData in pairs(csvdb["guide_unlockCsv"]) do
  264 + if guideData.type == 3 and guideData.carbonId == carbonId then
  265 + role:saveGuide(guideData.guideId,1,true)
  266 + break
  267 + end
  268 + end
  269 +
253 SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({ 270 SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({
254 starNum = msg.starNum, 271 starNum = msg.starNum,
255 reward = reward, 272 reward = reward,
src/actions/HeroAction.lua
@@ -32,6 +32,10 @@ function _M.levelUpRpc( agent, data ) @@ -32,6 +32,10 @@ function _M.levelUpRpc( agent, data )
32 32
33 hero:log({desc = "levelUp", int1 = hero:getProperty("level")}) 33 hero:log({desc = "levelUp", int1 = hero:getProperty("level")})
34 34
  35 + if hero:getProperty("type") == 103 then
  36 + role:finishGuide(7)
  37 + end
  38 +
35 role:checkTaskEnter("HeroLevelUp", {level = hero:getProperty("level")}) 39 role:checkTaskEnter("HeroLevelUp", {level = hero:getProperty("level")})
36 SendPacket(actionCodes.Hero_levelUpRpc, '') 40 SendPacket(actionCodes.Hero_levelUpRpc, '')
37 return true 41 return true
@@ -523,6 +527,8 @@ function _M.referEquipsRpc(agent, data) @@ -523,6 +527,8 @@ function _M.referEquipsRpc(agent, data)
523 -- 更新角色 527 -- 更新角色
524 hero:updateProperty({field = "equip", value = curEquip}) 528 hero:updateProperty({field = "equip", value = curEquip})
525 529
  530 + role:finishGuide(23)
  531 +
526 SendPacket(actionCodes.Hero_referEquipsRpc, "") 532 SendPacket(actionCodes.Hero_referEquipsRpc, "")
527 return true 533 return true
528 end 534 end
@@ -688,7 +694,6 @@ function _M.unuse_drawHeroRpc(agent, data) @@ -688,7 +694,6 @@ function _M.unuse_drawHeroRpc(agent, data)
688 if not role:isFuncUnlock(FuncUnlock.GetHero) then return end 694 if not role:isFuncUnlock(FuncUnlock.GetHero) then return end
689 local btype = msg.pool -- 1 2 3 4 695 local btype = msg.pool -- 1 2 3 4
690 local drawType = msg.type -- 1 单抽 2 十连 696 local drawType = msg.type -- 1 单抽 2 十连
691 - local guide = msg.guide -- 是否是引导抽的  
692 697
693 local buildTypeData = csvdb["build_typeCsv"][btype] 698 local buildTypeData = csvdb["build_typeCsv"][btype]
694 if not buildTypeData then return 1 end 699 if not buildTypeData then return 1 end
@@ -829,6 +834,12 @@ function _M.unuse_drawHeroRpc(agent, data) @@ -829,6 +834,12 @@ function _M.unuse_drawHeroRpc(agent, data)
829 newerHadSSR = newerDraw[2] or 0 834 newerHadSSR = newerDraw[2] or 0
830 end 835 end
831 836
  837 + local guideHero
  838 + local funcGuide = role:getProperty("funcGuide")
  839 + if funcGuide:getv(11001,0) == 1 and funcGuide:getv(12001,0) == 0 then
  840 + guideHero = 613
  841 + end
  842 +
832 local ssrCount = 0 843 local ssrCount = 0
833 local reward = {} 844 local reward = {}
834 for i = 1, drawCount[drawType] do 845 for i = 1, drawCount[drawType] do
@@ -858,7 +869,11 @@ function _M.unuse_drawHeroRpc(agent, data) @@ -858,7 +869,11 @@ function _M.unuse_drawHeroRpc(agent, data)
858 end 869 end
859 870
860 -- 引导必送 613 丝路德 871 -- 引导必送 613 丝路德
861 - local itemId = guide and 613 or math.randWeight(resultPool, 1) 872 + local itemId = math.randWeight(resultPool, 1)
  873 + if guideHero then
  874 + itemId = guideHero
  875 + guideHero = nil
  876 + end
862 local itemData = csvdb["itemCsv"][itemId] 877 local itemData = csvdb["itemCsv"][itemId]
863 if itemData.quality == 4 then 878 if itemData.quality == 4 then
864 ssrCount = ssrCount + 1 879 ssrCount = ssrCount + 1
@@ -910,6 +925,8 @@ function _M.unuse_drawHeroRpc(agent, data) @@ -910,6 +925,8 @@ function _M.unuse_drawHeroRpc(agent, data)
910 -- role:updateProperty({field = "repayHero", value = repayHero}) 925 -- role:updateProperty({field = "repayHero", value = repayHero})
911 -- end 926 -- end
912 927
  928 + role:finishGuide(11)
  929 +
913 role:checkTaskEnter("DrawHero", {pool = btype, count = drawCount[drawType]}) 930 role:checkTaskEnter("DrawHero", {pool = btype, count = drawCount[drawType]})
914 if ssrCount > 0 then 931 if ssrCount > 0 then
915 role:checkTaskEnter("DrawSSR", {count = ssrCount}) 932 role:checkTaskEnter("DrawSSR", {count = ssrCount})
src/actions/RoleAction.lua
@@ -99,6 +99,29 @@ function _M.loginRpc( agent, data ) @@ -99,6 +99,29 @@ function _M.loginRpc( agent, data )
99 role:reloadWhenLogin() 99 role:reloadWhenLogin()
100 end 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 if not msg.isGMlogin then 125 if not msg.isGMlogin then
103 local banTime = role:getProperty("banTime") 126 local banTime = role:getProperty("banTime")
104 if banTime > now then 127 if banTime > now then
@@ -114,6 +137,7 @@ function _M.loginRpc( agent, data ) @@ -114,6 +137,7 @@ function _M.loginRpc( agent, data )
114 role:setBan(0) 137 role:setBan(0)
115 end 138 end
116 end 139 end
  140 +
117 if msg.deviceMode then 141 if msg.deviceMode then
118 local deviceMode = tostring(msg.deviceMode) 142 local deviceMode = tostring(msg.deviceMode)
119 if role:getProperty("dmode") ~= deviceMode then 143 if role:getProperty("dmode") ~= deviceMode then
@@ -266,7 +290,7 @@ function _M.loginRpc( agent, data ) @@ -266,7 +290,7 @@ function _M.loginRpc( agent, data )
266 role:savePvpHTeam() 290 role:savePvpHTeam()
267 291
268 local hangPass = role:getProperty("hangPass") 292 local hangPass = role:getProperty("hangPass")
269 - role:log("login", {key1 = agent.ip:toArray(false, ":")[1], int1 = hangPass[1] or 0}) 293 + role:log("onLogin")
270 294
271 return true 295 return true
272 end 296 end
@@ -314,11 +338,20 @@ function _M.createRpc(agent, data) @@ -314,11 +338,20 @@ function _M.createRpc(agent, data)
314 return true 338 return true
315 end 339 end
316 newRole:startActionUcode() 340 newRole:startActionUcode()
  341 + newRole.sysVersion = msg.sysVersion
  342 + newRole.ip = agent.ip:toArray(false, ":")[1]
  343 + newRole.clientVersion = msg.clientVersion
  344 + newRole.network = msg.network
  345 +
317 newRole:award(globalCsv.birthItem, {log = {desc = "birth"}, notNotify = true}) 346 newRole:award(globalCsv.birthItem, {log = {desc = "birth"}, notNotify = true})
318 -- 欢迎邮件 347 -- 欢迎邮件
319 redisproxy:insertEmail({roleId = roleId, emailId = 1}) 348 redisproxy:insertEmail({roleId = roleId, emailId = 1})
320 349
321 - newRole:log("create", {key1 = agent.ip:toArray(false, ":")[1]}) 350 + if msg.newuser then
  351 + newRole:log("onCreateAccount")
  352 + end
  353 + newRole:log("onCreateRole")
  354 +
322 355
323 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) 356 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response))
324 return true 357 return true
@@ -1002,17 +1035,15 @@ function _M.guideRpc(agent, data) @@ -1002,17 +1035,15 @@ function _M.guideRpc(agent, data)
1002 local cmdType = msg.cmdType 1035 local cmdType = msg.cmdType
1003 1036
1004 local funcGuide = role:getProperty("funcGuide") 1037 local funcGuide = role:getProperty("funcGuide")
1005 - local newerGuide = role:getProperty("newerGuide")  
1006 if cmdType == 1 then 1038 if cmdType == 1 then
1007 -- 新手引导 1039 -- 新手引导
1008 local master = msg.master or -1 1040 local master = msg.master or -1
1009 local slave = msg.slave or -1 1041 local slave = msg.slave or -1
1010 if master < 0 or slave < 0 then return end 1042 if master < 0 or slave < 0 then return end
1011 - newerGuide = string.format("%d=%d",master,slave)  
1012 - role:updateProperty({field = "newerGuide", value = newerGuide})  
1013 - role:log("guide", {desc = "guide_new",int1 = master*1000+slave}) 1043 +
  1044 + role:saveGuide(master, slave)
1014 elseif cmdType == 2 then 1045 elseif cmdType == 2 then
1015 - -- 系统引导 1046 + -- 系统引导(玩家可选择是否进行)
1016 if not msg.skip then return end 1047 if not msg.skip then return end
1017 local new = math.min(funcGuide:getv(0, 0), msg.skip) 1048 local new = math.min(funcGuide:getv(0, 0), msg.skip)
1018 if new < 0 then 1049 if new < 0 then
@@ -1023,15 +1054,23 @@ function _M.guideRpc(agent, data) @@ -1023,15 +1054,23 @@ function _M.guideRpc(agent, data)
1023 1054
1024 if msg.funcType then 1055 if msg.funcType then
1025 funcGuide = funcGuide:setv(msg.funcType, 1) 1056 funcGuide = funcGuide:setv(msg.funcType, 1)
1026 - role:log("guide", {desc = "guide_sys", int1 = msg.funcType}) 1057 + role:log("onGuidePoint", {guild_type = 2, guild_id = msg.funcType, guild_point = 0, guild_pass = 0})
1027 end 1058 end
1028 role:updateProperty({field = "funcGuide", value = funcGuide}) 1059 role:updateProperty({field = "funcGuide", value = funcGuide})
1029 elseif cmdType == 3 then 1060 elseif cmdType == 3 then
1030 - -- 弱引导 1061 + -- 系统引导(强制进行)
  1062 + if msg.funcType and csvdb["guide_unlockCsv"][msg.funcType] then
  1063 + role:saveGuide(csvdb["guide_unlockCsv"][msg.funcType].guideId,1)
  1064 + funcGuide = funcGuide:setv(msg.funcType, 1)
  1065 + role:updateProperty({field = "funcGuide", value = funcGuide})
  1066 + role:log("onGuidePoint", {guild_type = 1, guild_id = msg.funcType, guild_point = 0, guild_pass = 0})
  1067 + end
  1068 + elseif cmdType == 4 then
  1069 + -- 弹出一个tips(进入功能界面也许要自动弹说明,value要区分1、2)
1031 if msg.funcType then 1070 if msg.funcType then
1032 local value = msg.value or 1 1071 local value = msg.value or 1
1033 for _, funcIdx in pairs(msg.funcType:toArray(true,"=")) do 1072 for _, funcIdx in pairs(msg.funcType:toArray(true,"=")) do
1034 - role:log("guide", {desc = "guide_weak", int1 = funcIdx}) 1073 + role:log("onGuidePoint", {guild_type = 3, guild_id = funcIdx, guild_point = 0, guild_pass = 0})
1035 funcGuide = funcGuide:setv(funcIdx, value) 1074 funcGuide = funcGuide:setv(funcIdx, value)
1036 end 1075 end
1037 role:updateProperty({field = "funcGuide", value = funcGuide}) 1076 role:updateProperty({field = "funcGuide", value = funcGuide})
src/actions/StoreAction.lua
@@ -31,6 +31,7 @@ function _M.rechargeRpc(agent , data) @@ -31,6 +31,7 @@ function _M.rechargeRpc(agent , data)
31 local partnerOrderId = makeOrder(roleId, id) 31 local partnerOrderId = makeOrder(roleId, id)
32 SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) 32 SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId }))
33 33
  34 +
34 -- 测试的 直接发奖励了 35 -- 测试的 直接发奖励了
35 skynet.timeout(10, function () 36 skynet.timeout(10, function ()
36 role:handlePurchase({ 37 role:handlePurchase({
@@ -164,6 +165,22 @@ function _M.purchaseOrderResult(agent, data) @@ -164,6 +165,22 @@ function _M.purchaseOrderResult(agent, data)
164 165
165 if msg.status == "success" then 166 if msg.status == "success" then
166 orderObject:setProperty("transactionId", msg.platformOrder or "") 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 return true 184 return true
168 end 185 end
169 186
@@ -1357,6 +1357,10 @@ local function clickDrop(self, room, block, params) @@ -1357,6 +1357,10 @@ local function clickDrop(self, room, block, params)
1357 1357
1358 local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}}) 1358 local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}})
1359 -- local reward = self:award({[5801] = 1}) 1359 -- local reward = self:award({[5801] = 1})
  1360 + -- 获取绷带的引导
  1361 + if block.event.item[1] == 5020 and not self.owner:checkOverGuide(53,2) then
  1362 + self.owner:saveGuide(53,2)
  1363 + end
1360 block:clear() 1364 block:clear()
1361 self:backReward(reward, {roomId = room.roomId, blockId = block.blockId}) 1365 self:backReward(reward, {roomId = room.roomId, blockId = block.blockId})
1362 return true 1366 return true
@@ -282,7 +282,7 @@ function CMD.close() @@ -282,7 +282,7 @@ function CMD.close()
282 mcast_util.usub_union() 282 mcast_util.usub_union()
283 local role = agentInfo.role 283 local role = agentInfo.role
284 if not role then return end 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 role:onOfflineEvent() 286 role:onOfflineEvent()
287 end 287 end
288 288
src/models/Diner.lua
@@ -70,12 +70,10 @@ function Diner:refreshDailyData(notify) @@ -70,12 +70,10 @@ function Diner:refreshDailyData(notify)
70 end 70 end
71 end 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:checkOverGuide(26) and not self.owner:checkOverGuide(27) then
76 entrust[1] = 1001 74 entrust[1] = 1001
77 entrust[2] = 1 75 entrust[2] = 1
78 - elseif tonumber(master) <= 29 then 76 + elseif self.owner:checkOverGuide(29) then
79 local temp = entrust[1] 77 local temp = entrust[1]
80 entrust[1] = 1 78 entrust[1] = 1
81 entrust[2] = temp 79 entrust[2] = temp
src/models/Email.lua
@@ -18,6 +18,23 @@ Email.schema = { @@ -18,6 +18,23 @@ Email.schema = {
18 rewardPms = {"table", {}}, 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 function Email:data() 38 function Email:data()
22 local emailId = self:getProperty("emailId") 39 local emailId = self:getProperty("emailId")
23 local title = self:getProperty("title") 40 local title = self:getProperty("title")
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 +
  78 + -- 餐厅
  79 + greenHourse = 1101, -- 食材获得
  80 + dinerEntrus = 1102, -- 餐厅委托
  81 + dinerCollect = 1103, -- 餐厅小人收集
  82 + dinerCombo = 1104, -- 小人组合
  83 + dinerSkillUp = 1105, -- 餐厅技能升级
  84 + dinerReTask = 1106, -- 餐厅刷新任务
  85 + addSell = 1107, -- 餐厅贩卖
  86 + dinerBuildUp = 1108, -- 建筑升级
  87 + removeSell = 1109, -- 移除售卖
  88 + dinerSell = 1110, -- 餐饮售卖
  89 +
  90 + -- 英雄
  91 + heroLevelUp = 1201, -- 英雄升级
  92 + heroBreak = 1202, -- 英雄突破
  93 + heroWake = 1203, -- 英雄觉醒
  94 + heroTalent = 1204, -- 英雄天赋
  95 + createHero = 1205, -- 碎片合成
  96 + createHeroRandom = 1206, -- 随机合成
  97 + resetHero = 1207, -- 重置养成
36 } 98 }
37 99
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 - } 100 +
  101 +--[[
  102 +100 教学
  103 +200 主线
  104 +300 日常
  105 +400 周常
  106 +500 联盟
  107 +1000 限时任务
  108 +2000 其他
  109 +--]]
  110 +local TaskType = {
  111 +
60 } 112 }
61 113
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", 114 +
  115 +local MethodType = {
  116 + onCreateAccount = {}, -- 创建游戏账号
  117 + onCreateRole = {}, -- 创建游戏角色
  118 + onLogin = {}, -- 玩家登录
  119 + onLogout = { -- 登出
  120 + logtime = true, --登录时长
  121 + },
  122 + setLevel = { -- 设置等级 --TODO
  123 + level_before = true, -- 变动前的等级,可以跳级
  124 + level_changemain = true, -- 等级变动原因,副本通关:mission,领取奖励:reward
  125 + level_changedetail = true, -- 等级变动原因明细,副本通关则记录关卡ID,领取奖励则记录奖励ID
  126 + level_reward = true, -- 等级变动奖励,json格式记录,{道具ID1:道具数量,道具ID2:道具数量}
  127 + },
  128 + onGuidePoint = { --游戏引导
  129 + guild_type = true, --引导类型,新手引导:0,系统引导:1,弱引导:2
  130 + guild_id = true, --节点ID
  131 + guild_point = true, --步骤ID
  132 + guild_pass = true, --正常操作:0,自动播放:1,跳过:2
  133 + },
  134 + setOrder = { --玩家订单记录
  135 + order_status = true, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他"
  136 + item_id = true, -- 道具id
  137 + item_type = true, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表
  138 + item_name = true, -- 购买的道具名
  139 + item_number = true, -- 购买的道具数量
  140 + item_level = true, -- 购买的道具等级
  141 + order_cost = true, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee'
  142 + order_currency = true, -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范
  143 + order_type = true, -- 订单类型,首充记录为1,否则为0
  144 + order_id = true, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no'
  145 + },
  146 + onMail = { --玩家邮件操作
  147 + mail_action_type = true, -- 操作(1=收,2=领,3=删)
  148 + mail_receivetime = true, -- 收件时间
  149 + mail_textid = true, -- 邮件文本ID
  150 + mial_title = true, -- 邮件标题参数
  151 + mail_content = true, -- 邮件内容参数
  152 + mail_attach = true, -- 邮件附件
  153 + mail_reason = true, -- 原因
  154 + mail_readstatus = true, -- 邮件读取状态
  155 + mail_attachstatus = true, -- 邮件附件状态
  156 + mail_timeout = true, -- 邮件超时时间
  157 + mail_friend_id = true, -- 收件方账号id
  158 + mail_friend_roleid = true, -- 收件方角色id
  159 + },
  160 + onItems = { --道具流通 --TODO
  161 + item_id = true, -- 道具id
  162 + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形
  163 + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表
  164 + item_level = true, -- 道具等级
  165 + item_number = true, -- 道具变化数量的绝对值
  166 + action_type = true, -- 变化类型(玩家获取:1,玩家消耗:0)
  167 + item_before = true, -- 道具变化前的数量
  168 + item_after = true, -- 道具变化后的数量
  169 + item_reason = true, -- 道具流动一级原因,如抽卡、装备强化、副本掉落,可参考道具动作类型枚举表
  170 + item_subreason = true, -- 道具流动二级原因,抽卡:卡池ID,装备强化:装备ID,副本掉落:副本ID
  171 + item_other = true, -- 其他(可包含阶数,强化等级,随机属性)
  172 + },
  173 + mission = { --玩家副本完成情况 --TODO
  174 + mission_threadid = true, -- 大关卡ID
  175 + mission_id = true, -- 关卡ID
  176 + mission_type = true, -- 关卡类型,见关卡类型枚举表
  177 + mission_sequenceid = "ucode", -- 本次对战ID,用于关联一次动作产生多条不同类型的日志
  178 + mission_herolist = true, -- 英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]]
  179 + mission_heroscore = true, -- 编队总评分
  180 + mission_enemylist = true, -- 地方英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]]
  181 + mission_damage = true, -- 英雄输出值。示例:{'heroid1':1000,'heroid2':2000,………..}
  182 + mission_ultskill = true, -- 大招使用情况。示例:{'heroid1':1000,'heroid2':2000,………..}
  183 + mission_reward = true, -- 获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  184 + mission_starttime = true, -- 战斗开始时间,格式 unixtime 秒级
  185 + mission_roundtime = true, -- 对局时长(秒)
  186 + mission_result = true, -- 战斗结果(0-无效,1-胜利,2-失败)
  187 + mission_star = true, -- 战斗完成星数,无星级的话填写0
  188 + mission_restriction = true, -- 周期内参与限制(0表示没有上限)
  189 + mission_difficulty = true, -- 关卡困难度,无难度区分的话填写0
  190 + mission_strength = true, -- 消耗的体力或次数
  191 + mission_score = true, -- 本局分数,PVP玩法记录为对战后积分,无得分的填0
  192 + mission_cleartype = true, -- 1正常通关;2代理拾荒
  193 + mission_rank = true, -- 对战后排名,适用于PVP玩法和电波塔,其他玩法留空
  194 + misson_monsterkill = true, -- 击杀怪物ID和数量,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  195 + misson_teamskill = true, -- 编队支援技能和技能等级情况,json格式记录,{"teamskill1":1,"teamskill2":2,………..}
  196 + misson_teambond = true, -- 编队羁绊和羁绊等级,json格式记录,{"bondid1":1,"bondid2":2,………..}
  197 + },
  198 + residence_reward = { --玩家挂机或排名奖励 --TODO
  199 + mission_threadid = true, --大关卡ID
  200 + mission_id = true, --关卡ID
  201 + mission_type = true, --关卡类型,见关卡类型枚举表
  202 + residence_reward_type = true, --领取奖励方式,快速(超前领取)记录为1,正常领取记录为0
  203 + residence_time = true, --挂机或排名时长
  204 + residence_reward = true, --获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  205 + },
  206 + hero_rise = { --英雄觉醒 --TODO
  207 + hero_id = true, --英雄ID
  208 + hero_rise_cost = true, --英雄觉醒消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  209 + hero_rise_score = true, --英雄觉醒后评分提升
  210 + hero_rise_result = true, --英雄觉醒效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  211 + },
  212 + hero_upgrade = { --英雄升级 --TODO
  213 + hero_id = true, -- 英雄ID
  214 + hero_upgrade_cost = true, -- 英雄升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  215 + hero_upgrade_result = true, -- 英雄升级效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  216 + hero_upgrade_type = true, -- 英雄升级方式,连续升级:1,单击升级:0
  217 + hero_upgrade_score = true, -- 英雄升级后评分
  218 + hero_upgrade_scoreget = true, -- 通过英雄升级提升的评分
  219 + },
  220 + hero_break = { --英雄突破 --TODO
  221 + hero_id = true, -- 英雄ID
  222 + hero_break_cost = true, -- 英雄突破消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  223 + hero_break_result = true, -- 英雄突破效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  224 + hero_break_level = true, -- 英雄突破后等级上限
  225 + },
  226 + hero_talent = { --英雄天赋升级 --TODO
  227 + hero_id = true, -- 英雄ID
  228 + hero_talent_cost = true, -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  229 + hero_talent_levelbef = true, -- 英雄技能升级前等级
  230 + hero_talent_level = true, -- 英雄技能升级后等级
  231 + },
  232 + hero_jewel = { --英雄铭文 --TODO
  233 + hero_id = true, -- 英雄ID
  234 + hero_jewel_sequence = true, -- 铭文装备编号,用以关联一次装备时产生的多条日志
  235 + hero_jewel_id = true, -- 铭文ID
  236 + hero_jewel_part = true, -- 铭文装备部位
  237 + hero_jewel_score = true, -- 铭文装备后的英雄分值
  238 + hero_jewel_scorebefore = true, -- 铭文装备前的英雄分值
  239 + hero_jewel_result = true, -- 铭文装备后效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  240 + },
  241 + hero_note = { --英雄评价 --TODO
  242 + hero_id = true, -- 英雄ID
  243 + hero_note_action = true, -- 英雄评价界面操作,发布评论:0,点赞:1,反对:2
  244 + hero_note_id = true, -- 操作的评价ID
  245 + hero_note_text = true, -- 操作的评价内容
  246 + },
  247 + hero_show = { --展示英雄 --TODO
  248 + hero_id = true, -- 英雄ID
  249 + },
  250 + hero_recycle = { --英雄回收
  251 + hero_recycle_list = true, -- 回收的英雄id列表,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  252 + hero_recycle_reward = true, -- 回收后获得的奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  253 + hero_recycle_cnt = true, -- 总回收英雄量
  254 + },
  255 + gacha = { --英雄招募 --TODO
  256 + gacha_id = true, -- 卡池ID
  257 + gacha_type = true, -- 卡池类型
  258 + gacha_up = true, -- 卡池UP角色
  259 + gacha_times = true, -- 抽卡次数
  260 + gacha_reward = true, -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  261 + currency_type = true, -- 购买道具消耗的货币类型,记录货币ID
  262 + gacha_current = true, -- 购买道具消耗的货币数量
  263 + gacha_cnt = true, -- 此卡池内的计数器
  264 + },
  265 + equip_wear = { --装备穿戴与卸载 --TODO
  266 + hero_id = true, --英雄ID
  267 + equip_id = true, --装备ID
  268 + equip_wear_action = true, --装备操作类型:装备:0,卸载:1
  269 + equip_wear_part = true, --装备部位,记录部位ID
  270 + equip_wear_result = true, --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567}
  271 + equip_wear_change = true, --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45}
  272 + equip_wear_mode = true, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1
  273 + equip_wear_seqid = true, --自动穿戴时记录的系列ID,用以关联一次性装备时候产生的多条记录
  274 + },
  275 + equip_upgrade = { --装备升级 --TODO
  276 + hero_id = true, -- 英雄ID
  277 + equip_upgrade_part = true, -- 升级部位,记录部位ID
  278 + equip_id = true, -- 升级后的装备ID
  279 + equip_upgrade_amount = true, -- 升级获取的装备数量
  280 + equip_upgrade_usedid = true, -- 升级消耗的装备ID
  281 + equip_upgrade_cost = true, -- 升级操作消耗装备数量
  282 + equip_upgrade_currentid = true, -- 升级消耗的货币类型
  283 + equip_upgrade_current = true, -- 升级操作消耗货币数量
  284 + },
  285 + carriage_dismantle = { --物资拆解 --TODO
  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 = true, -- 拆解获得物资,json格式记录,{'itemid1':2,'itemid2':3,…………..}
  295 + },
  296 + carriage_logistics = { --后勤室 --TODO
  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 = { --贴纸拆解 --TODO
  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 = { --放映室 --TODO
  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 = true, --放映奖励其他物品数量,json格式记录,{'itemid1':10,'itemid2':5,…………..},无奖励则填写0
  318 + },
  319 + carriage_cook = { --调理室 --TODO
  320 + item_id = true, -- 道具id
  321 + item_level = true, -- 道具等级
  322 + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表
  323 + carriage_cook_amount = true, -- 制作总量
  324 + carriage_cook_cost = true, -- 制作消耗道具,json格式记录,{'itemid1':10,'itemid2':5,…………..}
  325 + },
  326 + activity = { --活动或指南奖励 --TODO
  327 + activity_id = true, -- 活动ID(或活动指定任务的ID)
  328 + activity_type = true, -- 活动类型,见活动类型枚举表
  329 + activity_reward = true, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  330 + },
  331 + task_reward = { --任务奖励 --TODO
  332 + task_reward_id = true, --任务奖励ID
  333 + task_reward_type = true, --任务奖励类型,见 任务奖励类型枚举表
  334 + task_reward_detail = true, --任务奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  335 + },
  336 + shop_purchase = { --商店购买行为 --TODO
  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 + friend_opt = { --好友操作 --TODO
  347 + friend_opt_type = true, -- 好友操作类型,见枚举表中 好友操作类型枚举表
  348 + friend_accountid = true, -- 好友账户id
  349 + friend_roleid = true, -- 好友账户下的角色id
  350 + friend_cnt = true, -- 操作后好友数量
  351 + },
  352 + friend_list = { --好友列表 --TODO
  353 + friend_accountid = true, --好友账户id
  354 + friend_roleid = true, --好友账户下的角色id
  355 + },
  356 + friend_black = { --黑名单列表 --TODO
  357 + friend_accountid = true, -- 好友账户id
  358 + friend_roleid = true, -- 好友账户下的角色id
  359 + },
  360 + communication = { --玩家发言 --TODO
  361 + publish_type = true, --发言类型,全部:0,公告:1,世界:2,联盟:3,私聊:4
  362 + publish_status = true, --发送状态,发送成功:0,发送失败:1,被屏蔽:2,其他:3
  363 + publish_receive_accid = true, --接收者账户ID
  364 + publish_receive_roleid = true, --接收者角色ID
  365 + publish_text = true, --发言内容
  366 + },
  367 + restaurant_up = { --摊位升级 --TODO
  368 + restaurant_up_type = true, --升级部件类型,店面:0, 接客:1, 满意度:2, 宣传:3, 广告:4, 周边:5
  369 + restaurant_up_gear = true, --消耗齿轮数量
  370 + restaurant_up_coin = true, --花费美食币数量
  371 + restaurant_up_effectbef = true, --升级前加成
  372 + restaurant_up_effect = true, --升级后加成
  373 + },
  374 + restaurant_sale = { --摊位售卖 --TODO
  375 + item_id = true, -- 售卖物品ID
  376 + restaurant_sale_seat = true, -- 售卖物品所在位置
  377 + restaurant_sale_time = true, -- 售卖时长
  378 + restaurant_sale_type = true, -- 售卖方式,正常售卖:0, 加速:1,移除售卖:2
  379 + restaurant_sale_coin = true, -- 售卖获得美食币
  380 + restaurant_sale_gear = true, -- 售卖获得齿轮
  381 + },
  382 + restaurant_material = { --食材获取 --TODO
  383 + item_id = true, -- 获取物品ID
  384 + restaurant_material_seqid = true, -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一次获取两件道具情况
  385 + restaurant_material_start = true, -- 申请获取时间
  386 + restaurant_material_time = true, -- 申请到领取耗时
  387 + restaurant_material_num = true, -- 获取物品数量
  388 + },
  389 + restaurant_order = { --订单任务 --TODO
  390 + restaurant_order_id = true, -- 订单任务ID
  391 + restaurant_order_status = true, -- 订单任务状态,接受:0, 拒绝:1, 完成:2
  392 + restaurant_order_start = true, -- 订单接收时间,timestamp格式记录
  393 + restaurant_order_rwd = true, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  394 + restaurant_order_lv = true, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3
  395 + },
  396 + restaurant_collect = { --餐厅顾客图谱 --TODO
  397 + restaurant_collect_id = true, -- 图谱收集ID
  398 + restaurant_collect_rwd = true, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  399 + restaurant_collect_plan = true, -- 收集进度,即解锁顾客,数字表示
  400 + },
  401 + achievement = { --成就达成 --TODO
  402 + achievement_id = true, -- 成就id
  403 + achievement_type = true, -- 成就类型,具体枚举表中成就类型枚举表
  404 + achievement_name = true, -- 成就名称
  405 + achievement_score = true, -- 领取成就后成就点数
  406 + achievement_subscore = true, -- 领取成就后小类成就点数
  407 + achievement_reward = true, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  408 + },
  409 + get_gift = { --礼包兑换 --TODO
  410 + gift_id = true, -- 礼包ID
  411 + gift_key = true, -- 礼包key
  412 + gift_reward = true, -- 礼包奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  413 + gift_name = true, -- 礼包名称
  414 + gift_reason = true, -- 礼包发放原因,见发放原因枚举表
  415 + },
73 } 416 }
74 417
75 -local function printError(info)  
76 - print(info)  
77 - print(debug.traceback()) 418 +local function isIos(self)
  419 + local sid = self:getProperty("sid")
  420 + return sid == 2
78 end 421 end
79 422
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  
134 -  
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, 423 +local appid, sdkId
  424 +local function getBaseLog(self)
  425 + local uid = self:getProperty("uid")
  426 + if not appid then
  427 + appid, sdkId = string.match(uid, "(.*)_(.*)")
  428 + if not appid then
  429 + sdkId = uid
  430 + appid = 0
  431 + end
  432 + end
  433 + local log = {
  434 + server_id = server_id,
  435 + timestamp = skynet.timex(),
  436 + app_id = appid,
  437 + plat_id = isIos(self) and 0 or 1,
  438 + sdk_uid = sdkId,
  439 + account_id = uid,
  440 + role_id = self:getProperty("id"),
  441 + role_name = self:getProperty("name"),
  442 + level = self:getProperty("level"),
  443 + vip = 0,
  444 + device_id = self:getProperty("device"),
  445 + device_model = self:getProperty("dmode"),
  446 + version = "v2.0.1",
  447 + client_version = self.clientVersion or "1.0.0",
  448 + sys_version = self.sysVersion or "unknow",
  449 + ip = self.ip or "0.0.0.0",
  450 + network = self.network or "unknow",
  451 + record_date = os.date("%Y%m%d"),
168 } 452 }
  453 + return log
  454 +end
169 455
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  
175 - end 456 +local function printError(info)
  457 + print(info)
  458 + print(debug.traceback())
176 end 459 end
177 460
178 local RoleLog = {} 461 local RoleLog = {}
179 function RoleLog.bind(Role) 462 function RoleLog.bind(Role)
180 - function Role:log(logType, contents) 463 +
  464 + function Role:log()
  465 + end
  466 +
  467 + function Role:log_new(logType, contents)
181 contents = contents or {} 468 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)) 469 + local schema = MethodType[logType]
  470 + if not schema then
  471 + printError(string.format("LOG ERROR: new logType [%s].", logType))
185 return 472 return
186 end 473 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 474 + local doc = getBaseLog(self)
194 475
195 - local mapping = Mapping[_logType]  
196 - if mapping["ucode"] and not contents["ucode"] then  
197 - contents["ucode"] = self:getActionUcode() 476 + doc["method"] = logType
  477 + for field, value in pairs(contents) do
  478 + if not schema[ftype] then
  479 + printError(string.format("LOG ERROR: logType [%s] have new field [%s], call yunying.", logType, field))
  480 + end
198 end 481 end
199 482
200 - for field, value in pairs(contents) do  
201 - local ftype = mapping[field]  
202 - if ftype then  
203 - doc[field] = checkType(logType, field, value, ftype)  
204 - else  
205 - printError(string.format("LOG ERROR: logType [%s] have new field [%s] no type in mapping.", logType, field)) 483 + for field, tag in pairs(schema) do
  484 + if not contents[field] then
  485 + if tag == "ucode" then
  486 + contents[field] = self:getActionUcode()
  487 + else
  488 + printError(string.format("LOG ERROR: logType [%s] lose field [%s].", logType, field))
  489 + end
206 end 490 end
207 end 491 end
208 if not logd then return end 492 if not logd then return end
209 - pcall(skynet.send, logd, "lua", "log", logType, doc, _logType) 493 + pcall(skynet.send, logd, "lua", "log", doc)
  494 + end
  495 +
  496 + function Role:logItems(itemId, before, after, reason, subreason, other)
  497 + local reasonType = ItemReason[reason]
  498 + if not reasonType then
  499 + printError(string.format("LOG ERROR: onItems no reasonType [%s].", reason))
  500 + end
  501 + local itemData = csvdb["itemCsv"][itemId]
  502 + if not itemData then return end
  503 + self:log("onItems", {
  504 + item_id = itemId, -- 道具id
  505 + item_type = itemData.type, -- 道具类型,具体见枚举表中道具类型枚举表
  506 + item_level = 0, -- 道具等级
  507 + item_number = math.abs(after - before), -- 道具变化数量的绝对值
  508 + action_type = after - before > 0 and 1 or 0, -- 变化类型(玩家获取:1,玩家消耗:0)
  509 + item_before = before, -- 道具变化前的数量
  510 + item_after = after, -- 道具变化后的数量
  511 + item_reason = reasonType, -- 道具流动一级原因,如抽卡、装备强化、副本掉落,可参考道具动作类型枚举表
  512 + item_subreason = subreason, -- 道具流动二级原因,抽卡:卡池ID,装备强化:装备ID,副本掉落:副本ID
  513 + item_other = other, -- 其他(可包含阶数,强化等级,随机属性)
  514 + })
210 end 515 end
211 516
212 function Role:startActionUcode() 517 function Role:startActionUcode()
@@ -225,7 +530,8 @@ function RoleLog.bind(Role) @@ -225,7 +530,8 @@ function RoleLog.bind(Role)
225 530
226 function Role:getActionUcode() 531 function Role:getActionUcode()
227 return self._actionUcode 532 return self._actionUcode
228 - end 533 + end
  534 +
229 535
230 end 536 end
231 return RoleLog 537 return RoleLog
232 \ No newline at end of file 538 \ No newline at end of file
src/models/RolePlugin.lua
@@ -207,6 +207,7 @@ function RolePlugin.bind(Role) @@ -207,6 +207,7 @@ function RolePlugin.bind(Role)
207 207
208 function Role:addPlayExp(addExp, params) 208 function Role:addPlayExp(addExp, params)
209 local level = self:getProperty("level") 209 local level = self:getProperty("level")
  210 + local oldLevel = level
210 if not csvdb["player_expCsv"][level + 1] then 211 if not csvdb["player_expCsv"][level + 1] then
211 return 212 return
212 end 213 end
@@ -222,20 +223,19 @@ function RolePlugin.bind(Role) @@ -222,20 +223,19 @@ function RolePlugin.bind(Role)
222 newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除 223 newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除
223 end 224 end
224 end 225 end
225 -  
226 - if params.log then  
227 - local log = clone(params.log)  
228 - if log["cint1"] or log["cint2"] then  
229 - 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,
  233 + level_reward = "{}",
  234 + })
  235 + else
  236 + print("addPlayExp no log ", debug.traceback())
230 end 237 end
231 -  
232 - log["cint1"] = addExp  
233 - log["cint2"] = newExp  
234 - log["cint3"] = level  
235 -  
236 - self:log("player_exp", log)  
237 - else  
238 - print("addPlayExp no log ", debug.traceback()) 238 +
239 end 239 end
240 240
241 self:updateProperties({level = level, exp = newExp}) 241 self:updateProperties({level = level, exp = newExp})
@@ -259,17 +259,8 @@ function RolePlugin.bind(Role) @@ -259,17 +259,8 @@ function RolePlugin.bind(Role)
259 end 259 end
260 260
261 if params.log then 261 if params.log then
262 - local log = clone(params.log)  
263 - if log["cint1"] or log["cint2"] then  
264 - print("addItem error log have cint1 or cint2 ", debug.traceback())  
265 - end  
266 - log["cint1"] = params.itemId  
267 - log["cint2"] = math.abs(params.count)  
268 - if params.count <= 0 then  
269 - self:log("out_item", log)  
270 - else  
271 - self:log("in_item", log)  
272 - end 262 + local log = params.log
  263 + self:logItems(params.itemId, origin, nums, log.desc, log.sub, log.other)
273 else 264 else
274 print("addItem no log ", debug.traceback()) 265 print("addItem no log ", debug.traceback())
275 end 266 end
@@ -344,12 +335,7 @@ function RolePlugin.bind(Role) @@ -344,12 +335,7 @@ function RolePlugin.bind(Role)
344 335
345 if params.log then 336 if params.log then
346 local log = clone(params.log) 337 local log = clone(params.log)
347 - if log["cint1"] or log["cint2"] or log["cint3"] then  
348 - print("costDiamond error log have cint1 or cint2 or cint3 ", debug.traceback())  
349 - end  
350 - log["cint1"] = origin  
351 - log["cint2"] = count  
352 - self:log("in_diamond", log) 338 + self:logItems(ItemId.Diamond, origin, count, log.desc, log.sub, log.other)
353 else 339 else
354 print("gainDiamond no log ", debug.traceback()) 340 print("gainDiamond no log ", debug.traceback())
355 end 341 end
@@ -358,6 +344,7 @@ function RolePlugin.bind(Role) @@ -358,6 +344,7 @@ function RolePlugin.bind(Role)
358 return true 344 return true
359 end 345 end
360 346
  347 +
361 function Role:costDiamond(params) 348 function Role:costDiamond(params)
362 if not params or type(params) ~= "table" then return false end 349 if not params or type(params) ~= "table" then return false end
363 local count = tonum(params.count) 350 local count = tonum(params.count)
@@ -392,12 +379,7 @@ function RolePlugin.bind(Role) @@ -392,12 +379,7 @@ function RolePlugin.bind(Role)
392 379
393 if params.log then 380 if params.log then
394 local log = clone(params.log) 381 local log = clone(params.log)
395 - if log["cint1"] or log["cint2"] or log["cint3"] then  
396 - print("costDiamond error log have cint1 or cint2 or cint3 ", debug.traceback())  
397 - end  
398 - log["cint1"] = origin  
399 - log["cint2"] = count  
400 - self:log("out_diamond", log) 382 + self:logItems(ItemId.Diamond, origin, count, log.desc, log.sub, log.other)
401 else 383 else
402 print("costDiamond no log ", debug.traceback()) 384 print("costDiamond no log ", debug.traceback())
403 end 385 end
@@ -438,12 +420,7 @@ function RolePlugin.bind(Role) @@ -438,12 +420,7 @@ function RolePlugin.bind(Role)
438 end 420 end
439 if params.log then 421 if params.log then
440 local log = clone(params.log) 422 local log = clone(params.log)
441 - if log["cint1"] or log["cint2"] or log["cint3"] then  
442 - print("addHero error log have cint1 or cint2 or cint3 ", debug.traceback())  
443 - end  
444 - log["cint1"] = heroId  
445 - log["cint2"] = heroType  
446 - self:log("in_hero", log) 423 + self:logItems(heroType + ItemStartId.Hero, 0, 1, log.desc, log.sub, log.other)
447 else 424 else
448 print("addHero no log ", debug.traceback()) 425 print("addHero no log ", debug.traceback())
449 end 426 end
@@ -459,33 +436,6 @@ function RolePlugin.bind(Role) @@ -459,33 +436,6 @@ function RolePlugin.bind(Role)
459 end 436 end
460 end 437 end
461 438
462 - function Role:delHero(heroId, params)  
463 - params = params or {}  
464 - local roleId = self:getProperty('id')  
465 - local hero = self.heros[heroId]  
466 - local heroType = hero:getProperty("type")  
467 - if not hero then return end  
468 -  
469 - self.heros[heroId] = nil  
470 - redisproxy:pipelining(function (red)  
471 - red:del(string.format(R_HERO, roleId, heroId))  
472 - red:srem(string.format(R_HEROS, roleId), heroId)  
473 - end)  
474 -  
475 - if params.log then  
476 - local log = clone(params.log)  
477 - if log["cint1"] or log["cint2"] or log["cint3"] then  
478 - print("delHero error log have cint1 or cint2 or cint3 ", debug.traceback())  
479 - end  
480 - log["cint1"] = heroId  
481 - log["cint2"] = heroType  
482 - self:log("out_hero", log)  
483 - else  
484 - print("delHero no log ", debug.traceback())  
485 - end  
486 -  
487 - SendPacket(actionCodes.Hero_loadInfos, MsgPack.pack({{id = heroId, bDel = true}}))  
488 - end  
489 439
490 function Role:loadHeros() 440 function Role:loadHeros()
491 local roleId = self:getProperty("id") 441 local roleId = self:getProperty("id")
@@ -1468,15 +1418,6 @@ function RolePlugin.bind(Role) @@ -1468,15 +1418,6 @@ function RolePlugin.bind(Role)
1468 return RANK_ADV[idx] 1418 return RANK_ADV[idx]
1469 end 1419 end
1470 1420
1471 - -- 是否需要进行引导  
1472 - function Role:checkOverGuide(guideId)  
1473 - local funcGuide = self:getProperty("funcGuide")  
1474 - if funcGuide:getv(guideId, 0) > 0 then  
1475 - return true  
1476 - end  
1477 - return false  
1478 - end  
1479 -  
1480 -- 消除指定tag 红点 1421 -- 消除指定tag 红点
1481 function Role:clearRedPTag(tag) 1422 function Role:clearRedPTag(tag)
1482 local redp = self:getProperty("redp") 1423 local redp = self:getProperty("redp")
@@ -1511,8 +1452,8 @@ function RolePlugin.bind(Role) @@ -1511,8 +1452,8 @@ function RolePlugin.bind(Role)
1511 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) 1452 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" }))
1512 return 1453 return
1513 end 1454 end
1514 -  
1515 - local rechargeData = csvdb["shop_rechargeCsv"][orderObject:getProperty("rechargeId")] 1455 + local rechargeId = orderObject:getProperty("rechargeId")
  1456 + local rechargeData = csvdb["shop_rechargeCsv"][rechargeId]
1516 if rechargeData.rmb ~= tonumber(params.amount) then 1457 if rechargeData.rmb ~= tonumber(params.amount) then
1517 skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s", 1458 skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s",
1518 params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount 1459 params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount
@@ -1520,16 +1461,34 @@ function RolePlugin.bind(Role) @@ -1520,16 +1461,34 @@ function RolePlugin.bind(Role)
1520 return 1461 return
1521 end 1462 end
1522 1463
1523 - local reward = self:recharge({  
1524 - id = orderObject:getProperty("rechargeId"),  
1525 - transactionId = params.transactionId,  
1526 - pay_time = params.pay_time,  
1527 - order = partnerOrderStr 1464 + local order_type = self:getProperty("rmbC") > 0 and 0 or 1
  1465 + local status, reward = self:recharge({
  1466 + id = rechargeId
1528 }) 1467 })
1529 orderObject:setProperty("finishTime", skynet.time()) 1468 orderObject:setProperty("finishTime", skynet.time())
1530 orderObject:setProperty("status", "finish") 1469 orderObject:setProperty("status", "finish")
1531 1470
1532 redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) 1471 redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr)
  1472 +
  1473 + if not status then
  1474 + status = 200
  1475 + else
  1476 + status = 1000 + status
  1477 + end
  1478 + self:log("setOrder", {
  1479 + order_status = status, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他"
  1480 + item_id = rechargeId, -- 道具id
  1481 + item_type = rechargeData.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表
  1482 + item_name = rechargeData.title, -- 购买的道具名
  1483 + item_number = 1, -- 购买的道具数量
  1484 + item_level = 1, -- 购买的道具等级
  1485 + order_cost = rechargeData.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee'
  1486 + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范
  1487 + order_type = order_type, -- 订单类型,首充记录为1,否则为0
  1488 + order_id = params.transactionId, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no'
  1489 + })
  1490 + if status ~= 200 then return end
  1491 +
1533 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, 1492 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr,
1534 result = "success", reward = reward})) 1493 result = "success", reward = reward}))
1535 1494
@@ -1542,11 +1501,11 @@ function RolePlugin.bind(Role) @@ -1542,11 +1501,11 @@ function RolePlugin.bind(Role)
1542 local rechargeData = csvdb["shop_rechargeCsv"][id] 1501 local rechargeData = csvdb["shop_rechargeCsv"][id]
1543 if not rechargeData then 1502 if not rechargeData then
1544 skynet.error("recharge id not exist", id) 1503 skynet.error("recharge id not exist", id)
1545 - return 1504 + return 1
1546 end 1505 end
1547 1506
1548 if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then 1507 if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then
1549 - return 1 1508 + return 2
1550 end 1509 end
1551 1510
1552 local diamondCount = 0 1511 local diamondCount = 0
@@ -1561,13 +1520,13 @@ function RolePlugin.bind(Role) @@ -1561,13 +1520,13 @@ function RolePlugin.bind(Role)
1561 end 1520 end
1562 self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) 1521 self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}})
1563 elseif rechargeData.shop == 2 then --通行证商店 1522 elseif rechargeData.shop == 2 then --通行证商店
1564 - reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) 1523 + reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}})
1565 self.storeData:onBuyCard(rechargeData.type, rechargeData.time) 1524 self.storeData:onBuyCard(rechargeData.type, rechargeData.time)
1566 elseif rechargeData.shop == 3 then -- 礼包商店 1525 elseif rechargeData.shop == 3 then -- 礼包商店
1567 - reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) 1526 + reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}})
1568 else 1527 else
1569 skynet.error("invalid recharge shop type " .. id) 1528 skynet.error("invalid recharge shop type " .. id)
1570 - return 1529 + return 3
1571 end 1530 end
1572 1531
1573 if diamondCount > 0 then 1532 if diamondCount > 0 then
@@ -1577,10 +1536,8 @@ function RolePlugin.bind(Role) @@ -1577,10 +1536,8 @@ function RolePlugin.bind(Role)
1577 -- 累充 1536 -- 累充
1578 local rmb = rechargeData.rmb 1537 local rmb = rechargeData.rmb
1579 self:updateProperty({field = "rmbC", delta = rmb}) 1538 self:updateProperty({field = "rmbC", delta = rmb})
1580 -  
1581 - self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time})  
1582 1539
1583 - return reward 1540 + return nil, reward
1584 end 1541 end
1585 1542
1586 --直接给玩家发送邮件,立即推送小红点 1543 --直接给玩家发送邮件,立即推送小红点
@@ -1601,6 +1558,50 @@ function RolePlugin.bind(Role) @@ -1601,6 +1558,50 @@ function RolePlugin.bind(Role)
1601 self.sendMailFlag = true 1558 self.sendMailFlag = true
1602 end 1559 end
1603 1560
  1561 + -- 是否需要进行引导
  1562 + function Role:checkOverGuide(guideId,slave)
  1563 + local funcGuide = self:getProperty("funcGuide")
  1564 + if funcGuide:getv(guideId * 1000 + (slave or 0), 0) > 0 then
  1565 + return true
  1566 + end
  1567 + return false
  1568 + end
  1569 +
  1570 + -- 保存引导步骤
  1571 + function Role:saveGuide(master,slave,force)
  1572 + local newerGuide = self:getProperty("newerGuide")
  1573 + local guide = newerGuide:toArray(true,"=")
  1574 + local sMaster, sSlave = guide[1], guide[2]
  1575 +
  1576 + if not force and master < sMaster then return end
  1577 + if not force and master <= sMaster and slave < sSlave then return end
  1578 +
  1579 + local funcGuide = self:getProperty("funcGuide")
  1580 + funcGuide = funcGuide:setv(master * 1000 + slave, 1)
  1581 + if funcGuide:getv(master * 1000,0) == 0 then
  1582 + funcGuide = funcGuide:setv(master * 1000, 1)
  1583 + end
  1584 + self:updateProperty({field = "funcGuide", value = funcGuide})
  1585 + self:log("onGuidePoint", {guild_type = 0, guild_id = master, guild_point = slave, guild_pass = 0})
  1586 +
  1587 + newerGuide = string.format("%d=%d",master,slave)
  1588 + self:updateProperty({field = "newerGuide", value = newerGuide})
  1589 + end
  1590 +
  1591 + -- 引导大步骤结束
  1592 + function Role:finishGuide(master)
  1593 + local newerGuide = self:getProperty("newerGuide")
  1594 + local guide = newerGuide:toArray(true,"=")
  1595 + if guide[1] > master then return end
  1596 +
  1597 + local guideCsv = csvdb["guide_mainCsv"]
  1598 + local lastStep = guideCsv[master][#guideCsv[master]]
  1599 + if guideCsv[master + 1] then
  1600 + self:updateProperty({field = "newerGuide", value = string.format("%d=%d",master + 1,1)})
  1601 + else
  1602 + self:updateProperty({field = "newerGuide", value = "9999=1"})
  1603 + end
  1604 + end
1604 end 1605 end
1605 1606
1606 return RolePlugin 1607 return RolePlugin
1607 \ No newline at end of file 1608 \ No newline at end of file
src/services/agent_ctrl.lua
@@ -128,7 +128,7 @@ function _M:check_agent_status() @@ -128,7 +128,7 @@ function _M:check_agent_status()
128 next_log_time = now + 60 128 next_log_time = now + 60
129 local count = table_nums(self.u2f) 129 local count = table_nums(self.u2f)
130 datacenter.set("onlineCount", count) 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 end 132 end
133 end 133 end
134 134
src/services/logd.lua
@@ -55,38 +55,11 @@ skynet.register_protocol { @@ -55,38 +55,11 @@ skynet.register_protocol {
55 end 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 if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then 59 if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then
88 if not connecting then 60 if not connecting then
89 CMD.open() -- 连一下试试 61 CMD.open() -- 连一下试试
  62 + socketdriver.send(log_fd, json.encode(doc) .. "\n")
90 end 63 end
91 end 64 end
92 end 65 end