From e6e49b456b64470425bd7ffc5090e3fde11a1728 Mon Sep 17 00:00:00 2001 From: liuzujun <307836273@qq.com> Date: Mon, 11 Jan 2021 09:51:47 +0800 Subject: [PATCH] 一键领取成就奖励 --- src/actions/RoleAction.lua | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------- src/models/Role.lua | 1 + src/models/RoleTask.lua | 2 +- 3 files changed, 79 insertions(+), 44 deletions(-) diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index a7a0a17..2310645 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -912,62 +912,96 @@ function _M.achiveRpc(agent, data) local taskId = msg.id --任务id if not role:isFuncUnlock(FuncUnlock.TaskAchiv) then return end - - local achiveTask = csvdb["achievementCsv"][taskId] - if not achiveTask then return 1 end - local achiveT = role:getProperty("achiveT") local achiveV = role:getProperty("achiveV") + local fuxRecord = role:getProperty("fuxR") or 0 + + local groups = {} + + if not taskId then + local awards = {} + for id, cfg in pairs(csvdb["achievementCsv"]) do + -- 没领过 + if not achiveV[id] then + if (achiveT[cfg.type] or 0) >= cfg.condition1 then + local award = cfg.reward:toNumMap() + for k, v in pairs(award) do + awards[k] = (awards[k] or 0) + v + end + achiveV[id] = skynet.timex() + groups[cfg.group] = 1 + + role:log("achievement", { + achievement_id = cfg.id, -- 成就id + achievement_type = cfg.type, -- 成就类型,具体枚举表中成就类型枚举表 + achievement_reward = award, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} + }) + end + end + end + if not next(awards) then + return 5 + end + local reward, change = role:award(awards, {log = {desc = "finishAchive", int1 = 0}}) + role:updateProperty({field = "achiveV", value = achiveV}) - if achiveV[taskId] then return 2 end + SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) + else + local achiveTask = csvdb["achievementCsv"][taskId] + if not achiveTask then return 1 end - local curStatus = achiveT[achiveTask.type] or 0 - local maxc = achiveTask.condition1 + if achiveV[taskId] then return 2 end - if maxc > curStatus then - return 3 - end + local curStatus = achiveT[achiveTask.type] or 0 + local maxc = achiveTask.condition1 - local reward, change = role:award(achiveTask.reward, {log = {desc = "finishAchive", int1 = taskId}}) - role:changeUpdates({ - { type = "achiveV", field = taskId, value = skynet.timex() } - }) + if maxc > curStatus then + return 3 + end - -- 复兴奖励 - if csvdb["achievement_groupCsv"][achiveTask.group].bookmark == 3 then - local overCount = 0 - for tId, status in pairs(achiveV) do - local tData = csvdb["achievementCsv"][tId] - if tData then - local groupData = csvdb["achievement_groupCsv"][tData.group] - if groupData.bookmark == 3 then - overCount = overCount + 1 + local reward, change = role:award(achiveTask.reward, {log = {desc = "finishAchive", int1 = taskId}}) + role:changeUpdates({ + { type = "achiveV", field = taskId, value = skynet.timex() } + }) + groups[achiveTask.group] = 1 + + role:log("achievement", { + achievement_id = taskId, -- 成就id + achievement_type = achiveTask.type, -- 成就类型,具体枚举表中成就类型枚举表 + achievement_reward = reward, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} + }) + + SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) + end + + for group, _ in pairs(groups) do + -- 复兴奖励 + if csvdb["achievement_groupCsv"][group].bookmark == 3 then + local overCount = 0 + local preMaxCount = fuxRecord or 0 + for tId, status in pairs(achiveV) do + local tData = csvdb["achievementCsv"][tId] + if tData then + local groupData = csvdb["achievement_groupCsv"][tData.group] + if groupData.bookmark == 3 then + overCount = overCount + 1 + end end end - end - - for level, pData in pairs(csvdb["achievement_rewardCsv"]) do - if pData.request == overCount then - -- 发放奖励 - redisproxy:insertEmail({ - roleId = role:getProperty("id"), - emailId = 101, - attachments = pData.reward, - contentPms = {pData.level}, - }) - elseif pData.request > overCount then - break + local flag = false + for level, pData in pairs(csvdb["achievement_rewardCsv"]) do + if preMaxCount < pData.request and overCount >= pData.request then + role:sendMail(101, skynet.timex(), pData.reward, {pData.level}) + flag = true + end + end + if flag then + role:updateProperty({field = "fuxR", value = overCount, notNotify = true}) end + break end end - - role:log("achievement", { - achievement_id = taskId, -- 成就id - achievement_type = achiveTask.type, -- 成就类型,具体枚举表中成就类型枚举表 - achievement_reward = reward, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} - }) - SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) return true end diff --git a/src/models/Role.lua b/src/models/Role.lua index 6ad8695..263e1af 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -154,6 +154,7 @@ Role.schema = { achiveT = {"table", {}}, -- 成就计数统计 achivement_type {id = status} achiveV = {"table", {}}, -- 成就领奖统计 achivement {id = status} + fuxR = {"number", 0}, -- 复兴成就最大完成数量 rechargeF = {"table", {}}, -- 是否首次充值某一项 -- —{[id] = 1} -- 不存在就是没有充值过 dinerS = {"table", {}}, -- 美食币商城 购买记录 {[id] = count} diff --git a/src/models/RoleTask.lua b/src/models/RoleTask.lua index 3512b8b..c4f0994 100644 --- a/src/models/RoleTask.lua +++ b/src/models/RoleTask.lua @@ -720,7 +720,7 @@ function RoleTask.bind(Role) elseif cfg.type == 24 then -- 代理拾荒出勤人数 calTask[id] = (calTask[id] or 0) + (param1 or 0) elseif cfg.type == 28 then -- 完成指定任务 - print(actId,param2, cfg.condition2, param1) + --print(actId,param2, cfg.condition2, param1) if actId == param2 and cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + 1 end -- libgit2 0.21.2