Commit 3dbbc9f35e0c5d2fd897cff7815ef9c6350b7dfe
1 parent
85083dba
加上新的任务
Showing
5 changed files
with
62 additions
and
42 deletions
Show diff stats
src/actions/FriendAction.lua
| ... | ... | @@ -378,6 +378,7 @@ function _M.listRpc(agent, data) |
| 378 | 378 | end |
| 379 | 379 | if next(clearRed) then |
| 380 | 380 | redisproxy:hmset(FRIEND_KEY:format(roleId), table_unpack(clearRed)) --清除新好友标记 |
| 381 | + role:checkTaskEnter("AddFriend", {count = #friendList}) | |
| 381 | 382 | end |
| 382 | 383 | |
| 383 | 384 | SendPacket(actionCodes.Friend_listRpc, MsgPack.pack({list = friendList})) |
| ... | ... | @@ -518,6 +519,7 @@ function _M.pointRpc(agent, data) |
| 518 | 519 | redisproxy:sadd(FRIEND_POINT:format(objId), roleId) |
| 519 | 520 | giveP[objId] = 1 |
| 520 | 521 | role.dailyData:updateProperty({field = "giveFP", value = giveP}) |
| 522 | + role:checkTaskEnter("GiveFriendP", {count = 1}) | |
| 521 | 523 | rpcRole(objId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newPoint = 1, roleId = roleId})) |
| 522 | 524 | end |
| 523 | 525 | elseif cmd == 2 then -- 领取 |
| ... | ... | @@ -536,25 +538,27 @@ function _M.pointRpc(agent, data) |
| 536 | 538 | getP[objId] = 1 |
| 537 | 539 | reward = role:award({[ItemId.FriendPoint] = 1}) |
| 538 | 540 | role.dailyData:updateProperty({field = "getFP", value = getP}) |
| 541 | + role:checkTaskEnter("GetFriendP", {count = 1}) | |
| 539 | 542 | end |
| 540 | 543 | elseif cmd == 3 then -- 一键赠送领取 |
| 541 | 544 | -- 赠送 |
| 542 | 545 | local giveP = role.dailyData:getProperty("giveFP") |
| 543 | 546 | local friends = redisproxy:hgetall(FRIEND_KEY:format(roleId)) |
| 544 | - local change = false | |
| 547 | + local change = 0 | |
| 545 | 548 | redisproxy:pipelining(function(red) |
| 546 | 549 | for i = 1, #friends , 2 do |
| 547 | 550 | local objId = tonumber(friends[i]) |
| 548 | 551 | if not giveP[objId] then |
| 549 | 552 | giveP[objId] = 1 |
| 550 | - change = true | |
| 553 | + change = change + 1 | |
| 551 | 554 | red:sadd(FRIEND_POINT:format(objId), roleId) |
| 552 | 555 | rpcRole(objId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newPoint = 1, roleId = roleId})) |
| 553 | 556 | end |
| 554 | 557 | end |
| 555 | 558 | end) |
| 556 | - if change then | |
| 559 | + if change > 0 then | |
| 557 | 560 | role.dailyData:updateProperty({field = "giveFP", value = giveP}) |
| 561 | + role:checkTaskEnter("GiveFriendP", {count = change}) | |
| 558 | 562 | else |
| 559 | 563 | result = 1 |
| 560 | 564 | end |
| ... | ... | @@ -578,6 +582,7 @@ function _M.pointRpc(agent, data) |
| 578 | 582 | if getCount > 0 then |
| 579 | 583 | reward = role:award({[ItemId.FriendPoint] = getCount}) |
| 580 | 584 | role.dailyData:updateProperty({field = "getFP", value = getP}) |
| 585 | + role:checkTaskEnter("GetFriendP", {count = getCount}) | |
| 581 | 586 | else |
| 582 | 587 | result = (result or 0) + 2 |
| 583 | 588 | end | ... | ... |
src/actions/PvpAction.lua
| ... | ... | @@ -22,12 +22,12 @@ function _M.formatCommonRpc(agent , data) |
| 22 | 22 | local roleId = role:getProperty("id") |
| 23 | 23 | local msg = MsgPack.unpack(data) |
| 24 | 24 | local pvpTC = role:getProperty("pvpTC") |
| 25 | - for slot, heroId in pairs(msg.heros) do | |
| 25 | + for slot, heroId in pairs(msg.heros or {}) do | |
| 26 | 26 | if not role.heros[heroId] then |
| 27 | 27 | return |
| 28 | 28 | end |
| 29 | 29 | end |
| 30 | - if not next(msg.heros) then | |
| 30 | + if not msg.heros or not next(msg.heros) then | |
| 31 | 31 | return |
| 32 | 32 | end |
| 33 | 33 | |
| ... | ... | @@ -44,7 +44,7 @@ function _M.formatCommonRpc(agent , data) |
| 44 | 44 | end |
| 45 | 45 | |
| 46 | 46 | |
| 47 | -local function getMatchInfo(pvpList, battleCache) | |
| 47 | +local function getMatchInfo(role, pvpList, battleCache) | |
| 48 | 48 | table.clear(battleCache) |
| 49 | 49 | local redret = redisproxy:pipelining(function(red) |
| 50 | 50 | for _, info in ipairs(pvpList) do |
| ... | ... | @@ -60,7 +60,7 @@ local function getMatchInfo(pvpList, battleCache) |
| 60 | 60 | local curInfo = {idx = idx} |
| 61 | 61 | if info.t == 1 then --玩家 |
| 62 | 62 | curInfo.roleId = info.id |
| 63 | - curInfo.score = tonumber(redret[curIdx] or 0) | |
| 63 | + curInfo.score = role:unpackPvpScore(redret[curIdx] or 0) | |
| 64 | 64 | curIdx = curIdx + 1 |
| 65 | 65 | -- name, level, headId, battleV, heros |
| 66 | 66 | local online, roleInfo = rpcRole(curInfo.roleId, "pvpCInfo") |
| ... | ... | @@ -92,7 +92,7 @@ function _M.infoRpc(agent, data) |
| 92 | 92 | red:zscore(RANK_PVP_COMMON, roleId) |
| 93 | 93 | red:zrevrank(RANK_PVP_COMMON, roleId) |
| 94 | 94 | end) |
| 95 | - local score = tonumber(redret[1] or 0) | |
| 95 | + local score = role:unpackPvpScore(redret[1] or 0) | |
| 96 | 96 | local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp |
| 97 | 97 | local pvpMC = role:getProperty("pvpMC") |
| 98 | 98 | if not next(pvpMC) then --没有分配过对手 |
| ... | ... | @@ -103,7 +103,7 @@ function _M.infoRpc(agent, data) |
| 103 | 103 | |
| 104 | 104 | response.score = score |
| 105 | 105 | response.rank = rank |
| 106 | - response.matches = getMatchInfo(pvpMC, _pvpBattleInfoCacheC) | |
| 106 | + response.matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC) | |
| 107 | 107 | |
| 108 | 108 | elseif ptype == 2 then -- 高级pvp |
| 109 | 109 | return |
| ... | ... | @@ -120,7 +120,7 @@ function _M.refreshMatchCRpc(agent, data) |
| 120 | 120 | role:refreshPvpMatchC() |
| 121 | 121 | |
| 122 | 122 | local pvpMC = role:getProperty("pvpMC") |
| 123 | - local matches = getMatchInfo(pvpMC, _pvpBattleInfoCacheC) | |
| 123 | + local matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC) | |
| 124 | 124 | |
| 125 | 125 | SendPacket(actionCodes.Pvp_refreshMatchCRpc, MsgPack.pack({matches = matches})) |
| 126 | 126 | return true |
| ... | ... | @@ -151,11 +151,15 @@ function _M.startBattleRpc(agent, data) |
| 151 | 151 | local idx = msg.idx |
| 152 | 152 | local revenge = msg.revenge |
| 153 | 153 | |
| 154 | + local pvpTC = role:getProperty("pvpTC") | |
| 155 | + if not pvpTC.heros or not next(pvpTC.heros) then return 1 end | |
| 156 | + | |
| 154 | 157 | local matchInfo, result, key, wait |
| 158 | + | |
| 155 | 159 | local now = skynet.timex() |
| 156 | 160 | if revenge then --复仇 |
| 157 | 161 | local temp = _pvpRecordInfoCache[idx] |
| 158 | - if not temp then return end | |
| 162 | + if not temp then return 2 end | |
| 159 | 163 | |
| 160 | 164 | if not _responseRecord[temp.id] or now >= _responseRecord[temp.id] then |
| 161 | 165 | if temp.t == 1 then |
| ... | ... | @@ -169,7 +173,7 @@ function _M.startBattleRpc(agent, data) |
| 169 | 173 | end |
| 170 | 174 | else --打正常 |
| 171 | 175 | local pvpMC = role:getProperty("pvpMC") |
| 172 | - if not pvpMC[idx] then return end | |
| 176 | + if not pvpMC[idx] then return 3 end | |
| 173 | 177 | if pvpMC[idx].t == 1 then |
| 174 | 178 | matchInfo = _pvpBattleInfoCacheC[pvpMC[idx].id] |
| 175 | 179 | elseif pvpMC[idx].t == 2 then |
| ... | ... | @@ -177,14 +181,14 @@ function _M.startBattleRpc(agent, data) |
| 177 | 181 | end |
| 178 | 182 | end |
| 179 | 183 | |
| 180 | - if not result and not matchInfo then return end | |
| 184 | + if not result and not matchInfo then return 4 end | |
| 181 | 185 | |
| 182 | 186 | if not result then |
| 183 | 187 | -- 次数扣一波 |
| 184 | 188 | local pvpFree = role.dailyData:getProperty("pvpFree") |
| 185 | 189 | if pvpFree >= globalCsv.pvp_battle_free_count then |
| 186 | 190 | local cost = {[ItemId.PvpKey] = 1} |
| 187 | - if not role:checkItemEnough(cost) then return end | |
| 191 | + if not role:checkItemEnough(cost) then return 5 end | |
| 188 | 192 | role:costItems(cost) |
| 189 | 193 | else |
| 190 | 194 | role.dailyData:updateProperty({field = "pvpFree", delta = 1}) |
| ... | ... | @@ -192,6 +196,8 @@ function _M.startBattleRpc(agent, data) |
| 192 | 196 | |
| 193 | 197 | key = tostring(math.random()) |
| 194 | 198 | _pvpStartBattleCache = {idx = idx, key = key, revenge = revenge} |
| 199 | + | |
| 200 | + role:checkTaskEnter("PvpBattle") | |
| 195 | 201 | end |
| 196 | 202 | |
| 197 | 203 | SendPacket(actionCodes.Pvp_startBattleRpc, MsgPack.pack({matchInfo = matchInfo, key = key, result = result, wait = wait})) |
| ... | ... | @@ -206,7 +212,8 @@ function _M.endBattleRpc(agent, data) |
| 206 | 212 | if not msg.key or not _pvpStartBattleCache or msg.key ~= _pvpStartBattleCache.key then |
| 207 | 213 | return 1 |
| 208 | 214 | end |
| 209 | - if not msg.idx or not msg.idx ~= _pvpStartBattleCache.idx then | |
| 215 | + | |
| 216 | + if not msg.idx or msg.idx ~= _pvpStartBattleCache.idx then | |
| 210 | 217 | return 2 |
| 211 | 218 | end |
| 212 | 219 | |
| ... | ... | @@ -275,6 +282,10 @@ function _M.endBattleRpc(agent, data) |
| 275 | 282 | red:trim(dbKey, 0, 9) |
| 276 | 283 | end |
| 277 | 284 | end) |
| 285 | + | |
| 286 | + if isWin then | |
| 287 | + role:checkTaskEnter("PvpWin", {score = myScore}) | |
| 288 | + end | |
| 278 | 289 | |
| 279 | 290 | SendPacket(actionCodes.Pvp_endBattleRpc, MsgPack.pack({ |
| 280 | 291 | reward = reward, |
| ... | ... | @@ -301,13 +312,13 @@ function _M.rankListRpc(agent, data) |
| 301 | 312 | red:zrevrank(RANK_PVP_COMMON, roleId) |
| 302 | 313 | red:zrevrange(RANK_PVP_COMMON, 0, 99, "WITHSCORES") |
| 303 | 314 | end) |
| 304 | - local score = tonumber(redret[1] or 0) | |
| 315 | + local score = role:unpackPvpScore(redret[1] or 0) | |
| 305 | 316 | local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp |
| 306 | 317 | |
| 307 | 318 | local rankList = {} |
| 308 | 319 | for i = 1, #redret[3], 2 do |
| 309 | 320 | local roleId = tonumber(redret[i]) |
| 310 | - local score = tonumber(redret[i + 1]) | |
| 321 | + local score = role:unpackPvpScore(redret[i + 1]) | |
| 311 | 322 | local online, curInfo = rpcRole(roleId, "friendSInfo") |
| 312 | 323 | curInfo.score = score |
| 313 | 324 | curInfo.roleId = roleId |
| ... | ... | @@ -345,7 +356,7 @@ function _M.recordListRpc(agent, data) |
| 345 | 356 | end |
| 346 | 357 | _pvpRecordInfoCache = tempList |
| 347 | 358 | |
| 348 | - recordList = getMatchInfo(tempList, _pvpRecordBattleInfoCache) | |
| 359 | + recordList = getMatchInfo(role, tempList, _pvpRecordBattleInfoCache) | |
| 349 | 360 | for idx, info in ipairs(recordList) do |
| 350 | 361 | local temp = tempList[idx] |
| 351 | 362 | info.win = temp.win | ... | ... |
src/models/RolePlugin.lua
| ... | ... | @@ -835,18 +835,19 @@ function RolePlugin.bind(Role) |
| 835 | 835 | end |
| 836 | 836 | |
| 837 | 837 | function Role:getTeamBattleValue(heros) |
| 838 | - local battleV = 0 | |
| 839 | - for _, heroId in pairs(heros or {}) do | |
| 840 | - local hero = self.heros[heroId] | |
| 841 | - battleV = battleV + hero:getProperty("battleV") | |
| 842 | - end | |
| 843 | - return battleV | |
| 838 | + -- local battleV = 0 | |
| 839 | + -- for _, heroId in pairs(heros or {}) do | |
| 840 | + -- local hero = self.heros[heroId] | |
| 841 | + -- battleV = battleV + hero:getProperty("battleV") | |
| 842 | + -- end | |
| 843 | + -- return battleV | |
| 844 | + return self:getRealBattleValue(heros) | |
| 844 | 845 | end |
| 845 | 846 | |
| 846 | 847 | -- 不传参数 只修改保存的阵容信息 |
| 847 | 848 | function Role:saveHangTeam(team) |
| 848 | 849 | if not team then |
| 849 | - team = self:getProperty("pvpTSC") | |
| 850 | + team = self:getProperty("hangTeam") | |
| 850 | 851 | else |
| 851 | 852 | self:updateProperty({field = "hangTeam", value = team}) |
| 852 | 853 | end |
| ... | ... | @@ -859,9 +860,9 @@ function RolePlugin.bind(Role) |
| 859 | 860 | |
| 860 | 861 | function Role:savePvpCTeam(team) |
| 861 | 862 | if not team then |
| 862 | - team = self:getProperty("pvpTSC") | |
| 863 | + team = self:getProperty("pvpTC") | |
| 863 | 864 | else |
| 864 | - self:updateProperty({field = "pvpTSC", value = team}) | |
| 865 | + self:updateProperty({field = "pvpTC", value = team}) | |
| 865 | 866 | end |
| 866 | 867 | self:setProperties({ |
| 867 | 868 | pvpTSC = self:getTeamHerosInfo(team.heros), | ... | ... |
src/models/RolePvp.lua
| ... | ... | @@ -8,17 +8,17 @@ local PVP_RANK_TIME_SORT_PLACE = 1000000 -- 时间戳占据 6位数 |
| 8 | 8 | local PVP_RANK_TIME_SORT_PRECISION = 360 -- 时间精度 每6分钟忽略差异 |
| 9 | 9 | local PVP_RANK_ROBOT_SCORE = 1000 -- 机器人积分 |
| 10 | 10 | |
| 11 | -local function unpackScore(score) | |
| 11 | + | |
| 12 | +function Role:unpackPvpScore(score) | |
| 12 | 13 | score = tonumber(score or 0) |
| 13 | 14 | return math.floor(score / PVP_RANK_TIME_SORT_PLACE) |
| 14 | 15 | end |
| 15 | 16 | |
| 16 | -local function packScore(score, now) | |
| 17 | +function Role:packPvpScore(score, now) | |
| 17 | 18 | now = now or skynet.timex() |
| 18 | 19 | return math.floor(score * PVP_RANK_TIME_SORT_PLACE + (PVP_RANK_TIME_SORT_STD - now) / PVP_RANK_TIME_SORT_PRECISION) |
| 19 | 20 | end |
| 20 | 21 | |
| 21 | - | |
| 22 | 22 | function Role:changePvpScoreCommon(matchId, isWin) |
| 23 | 23 | local roleId = self:getProperty("id") |
| 24 | 24 | local isPlayer = matchId ~= -1 |
| ... | ... | @@ -29,11 +29,11 @@ function Role:changePvpScoreCommon(matchId, isWin) |
| 29 | 29 | red:zscore(RANK_PVP_COMMON, matchId) |
| 30 | 30 | end |
| 31 | 31 | end) |
| 32 | - local myScore = unpackScore(redret[1]) | |
| 32 | + local myScore = self:unpackPvpScore(redret[1]) | |
| 33 | 33 | local oldMyRank = tonumber(redret[2] or -2) + 1 |
| 34 | 34 | local matchScore = PVP_RANK_ROBOT_SCORE |
| 35 | 35 | if isPlayer then |
| 36 | - matchScore = unpackScore(redret[3]) | |
| 36 | + matchScore = self:unpackPvpScore(redret[3]) | |
| 37 | 37 | end |
| 38 | 38 | local oldmyScore, oldMatchScore = myScore, matchScore |
| 39 | 39 | |
| ... | ... | @@ -52,9 +52,9 @@ function Role:changePvpScoreCommon(matchId, isWin) |
| 52 | 52 | |
| 53 | 53 | local now = skynet.timex() |
| 54 | 54 | redisproxy:pipelining(function(red) |
| 55 | - red:zadd(RANK_PVP_COMMON, packScore(myScore, now), roleId) | |
| 55 | + red:zadd(RANK_PVP_COMMON, self:packPvpScore(myScore, now), roleId) | |
| 56 | 56 | if isPlayer then |
| 57 | - red:zadd(RANK_PVP_COMMON, packScore(matchScore, now), matchId) | |
| 57 | + red:zadd(RANK_PVP_COMMON, self:packPvpScore(matchScore, now), matchId) | |
| 58 | 58 | end |
| 59 | 59 | red:zrevrank(RANK_PVP_COMMON, roleId) |
| 60 | 60 | end) |
| ... | ... | @@ -70,7 +70,7 @@ end |
| 70 | 70 | |
| 71 | 71 | function Role:refreshPvpMatchC(score) |
| 72 | 72 | local roleId = self:getProperty("id") |
| 73 | - local score = score or redisproxy:zscore(RANK_PVP_COMMON, roleId) or 0 | |
| 73 | + local score = score or self:unpackPvpScore(redisproxy:zscore(RANK_PVP_COMMON, roleId)) | |
| 74 | 74 | |
| 75 | 75 | local function getPlayers(levels) |
| 76 | 76 | local redret = redisproxy:pipelining(function(red) | ... | ... |
src/models/RoleTask.lua
| ... | ... | @@ -65,22 +65,25 @@ local TaskType = { |
| 65 | 65 | OpenBox = 702, -- 拆解时间箱 |
| 66 | 66 | |
| 67 | 67 | |
| 68 | + -- pvp相关 | |
| 69 | + PvpWin = 751, -- pvp胜利 - score | |
| 70 | + PvpBattle = 752, -- pvp挑战 | |
| 71 | + | |
| 72 | + --好友相关 | |
| 73 | + GiveFriendP = 801, -- 赠送友情点 - count | |
| 74 | + AddFriend = 802, -- 加入一个好友 - count | |
| 75 | + GetFriendP = 803, -- 获得友情点 - count | |
| 76 | + | |
| 68 | 77 | --功能未实现 todo |
| 69 | - PvpWin = 1000, -- pvp胜利 - score | |
| 70 | - PvpBattle = 1001, -- pvp挑战 | |
| 71 | 78 | AdvShop = 1002, -- 冒险商城 |
| 72 | - GiveFriendP = 1003, -- 赠送友情点 | |
| 73 | 79 | UnionBoss = 1004, -- 工会boss |
| 74 | 80 | UnionBattle = 1005, -- 工会战 |
| 75 | 81 | AddUnion = 1006, -- 加入一个公会 |
| 76 | - AddFriend = 1007, -- 加入一个好友 - count | |
| 77 | 82 | BindPhone = 1008, -- 绑定手机 |
| 78 | 83 | WeChat = 1009, -- 关注微信 |
| 79 | 84 | WeBlog = 1010, -- 关注微博 |
| 80 | 85 | SignIn = 1011, -- 签到 |
| 81 | - GetFriendP = 1012, -- 获得友情点 - count | |
| 82 | 86 | ShopAll = 1013, -- 在任意商店购买 |
| 83 | - | |
| 84 | 87 | } |
| 85 | 88 | |
| 86 | 89 | local function v(value) |
| ... | ... | @@ -126,7 +129,7 @@ local CommonListener = { |
| 126 | 129 | [TaskType.HeroLevelUp] = {{v(17)}}, |
| 127 | 130 | [TaskType.Wake] = {{v(18)}}, |
| 128 | 131 | [TaskType.EquipUp] = {{v(19), f("count")}}, |
| 129 | - [TaskType.GiveFriendP] = {{v(20)}}, | |
| 132 | + [TaskType.GiveFriendP] = {{v(20), f("count")}}, | |
| 130 | 133 | [TaskType.UnionBoss] = {{v(21)}}, |
| 131 | 134 | [TaskType.GetFriendP] = {{v(22), f("count")}}, |
| 132 | 135 | [TaskType.BonusPass] = {{v(23)}}, | ... | ... |