Commit da89807497f99247dab8949528a61278a7e374dd
1 parent
cfd68b3a
pvp 高级领奖
Showing
9 changed files
with
231 additions
and
63 deletions
Show diff stats
src/GlobalVar.lua
1 | 1 | XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18" |
2 | 2 | RESET_TIME = 4 |
3 | -RESET_RANK_TIME = 8 | |
3 | + | |
4 | +START_RESET_TIME_BASE = 1584921600 -- 0时区 | |
5 | +TIME_ZONE = math.floor(os.difftime(START_RESET_TIME_BASE, os.time(os.date("!*t", START_RESET_TIME_BASE))) / 3600) -- 本地时区 | |
6 | + | |
7 | +START_RESET_TIME = START_RESET_TIME_BASE - TIME_ZONE * 3600 | |
8 | + | |
9 | + | |
4 | 10 | MAX_ROLE_NUM = 1000000 |
5 | 11 | -- 属性枚举 |
6 | 12 | AttsEnum = { |
... | ... | @@ -98,17 +104,31 @@ ItemId = { |
98 | 104 | BreakCost = 10, -- 突破材料 |
99 | 105 | EquipUp = 11, -- 装备升级材料 |
100 | 106 | DinerCoin = 12, --后勤物资 |
101 | - LoveUp = 14, --好感度提升道具 | |
107 | + PvpCoin = 14, --挑战货币 | |
102 | 108 | OldCoin = 15, --古代金币 |
103 | 109 | AdvPoint = 16, -- 探险点 |
104 | 110 | DinerSpTask = 20, -- 餐厅任务采购券 |
105 | 111 | LoveBreak = 21, --好感度突破道具 |
106 | 112 | PvpKey = 22, -- pvp钥匙 |
107 | 113 | LunchFragment = 23, |
108 | - HeroFC = {700, 701, 702, 703}, -- 通用角色碎片 | |
114 | + HeroFC = {700, 701, 702, 703}, --通用角色碎片 | |
109 | 115 | AdvKey = 80, -- 冒险钥匙 |
110 | 116 | BoxKey = 60, -- 拆解工具 |
111 | 117 | } |
118 | + | |
119 | +TimeReset = { | |
120 | + CrossDay = 1, --通用跨天 | |
121 | + CrossWeek = 2, --通用跨周 | |
122 | + DinerRank = 1, -- 餐厅排行榜 | |
123 | + PvpRank = 2, -- pvp排行榜 | |
124 | + PvpHight = 11, --高级竞技场 | |
125 | + PvpCross = 12, -- 跨服竞技场 | |
126 | + PvpShop = 13, -- 竞技场商城 | |
127 | + DailyBattle1 = 14, -- 特殊-每日副本(贴纸) | |
128 | + DailyBattle2 = 15, -- 特殊-每日副本(装备) | |
129 | + DailyBattle2 = 16, -- 特殊-每日副本(时钟箱) | |
130 | +} | |
131 | + | |
112 | 132 | --客户端不需要知道这个 |
113 | 133 | AdvSpecialStage = { |
114 | 134 | [1]= "In", | ... | ... |
src/ProtocolCode.lua
src/RedisKeys.lua
... | ... | @@ -24,8 +24,10 @@ RANK_DINER = {"rank:diner1", "rank:diner2"} -- é¤åŽ…æŽ’è¡Œæ¦œ 两个æ¯å¤©äº’æ |
24 | 24 | RANK_DINER_INFO = "rank:diner:info" |
25 | 25 | |
26 | 26 | RANK_PVP_COMMON = "rank:pvpc" |
27 | +RANK_PVP_COMMON_KEY = {"rank:pvpc1", "rank:pvpc2"} | |
27 | 28 | RECORD_PVP_COMMON = "record:pvpc:%d" |
28 | 29 | RANK_PVP_HIGHT = "rank:pvph" |
30 | +RANK_PVP_HIGHT_KEY = {"rank:pvph1", "rank:pvph2"} | |
29 | 31 | RECORD_PVP_HIGH = "record:pvph:%d" |
30 | 32 | |
31 | 33 | ... | ... |
src/actions/HeroAction.lua
... | ... | @@ -245,7 +245,7 @@ function _M.commentHeroRpc(agent, data) |
245 | 245 | result.status = 1 |
246 | 246 | else |
247 | 247 | local commentKey = getCommentKey(heroType) |
248 | - local SERV = string.format("NAMED%d", math.random(1, 5)) | |
248 | + local SERV = string.format(".NAMED%d", math.random(1, 5)) | |
249 | 249 | local legal, mod = skynet.call(SERV, "lua", "check", content) |
250 | 250 | if not legal then |
251 | 251 | content = mod or "" | ... | ... |
src/actions/HttpAction.lua
... | ... | @@ -43,7 +43,7 @@ function _M.reload_csvdata(query, body) |
43 | 43 | return "code error" |
44 | 44 | end |
45 | 45 | |
46 | - local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "reload", body) | |
46 | + local ok, status = pcall(skynet.call, '.CSVDATA', "lua", "reload", body) | |
47 | 47 | if status == "ok" then |
48 | 48 | skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body)) |
49 | 49 | return 'success' |
... | ... | @@ -69,7 +69,7 @@ function _M.hotfix_csvdata(query, body) |
69 | 69 | if not ok or type(result) ~= 'table' then |
70 | 70 | return "decode error" |
71 | 71 | end |
72 | - local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "hotfix", result) | |
72 | + local ok, status = pcall(skynet.call, '.CSVDATA', "lua", "hotfix", result) | |
73 | 73 | |
74 | 74 | if status == "ok" then |
75 | 75 | skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body)) |
... | ... | @@ -150,7 +150,7 @@ function _M.hotfix_code(query, body) |
150 | 150 | |
151 | 151 | skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body)) |
152 | 152 | |
153 | - pcall(skynet.call, 'WATCHDOG', "lua", "hotfix", body) | |
153 | + pcall(skynet.call, '.WATCHDOG', "lua", "hotfix", body) | |
154 | 154 | return 'success' |
155 | 155 | end |
156 | 156 | ... | ... |
src/actions/PvpAction.lua
... | ... | @@ -103,6 +103,7 @@ end |
103 | 103 | |
104 | 104 | local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, infoCache) |
105 | 105 | table.clear(battleCache) |
106 | + local dbKey = role:getPvpDBKey(dbKey) | |
106 | 107 | local redret = redisproxy:pipelining(function(red) |
107 | 108 | for _, info in ipairs(pvpList) do |
108 | 109 | if info.t == 1 then |
... | ... | @@ -125,8 +126,9 @@ local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, inf |
125 | 126 | if k == "battleInfo" then |
126 | 127 | battleCache[curInfo.roleId] = v |
127 | 128 | else |
128 | - if k == "heros" and infoCache then | |
129 | - infoCache[curInfo.roleId] = v | |
129 | + if (k == "heros" or k == "battleV") and infoCache then | |
130 | + infoCache[curInfo.roleId] = infoCache[curInfo.roleId] or {} | |
131 | + infoCache[curInfo.roleId][k] = v | |
130 | 132 | end |
131 | 133 | curInfo[k] = v |
132 | 134 | end |
... | ... | @@ -150,9 +152,10 @@ function _M.infoRpc(agent, data) |
150 | 152 | |
151 | 153 | local response = {} |
152 | 154 | if ptype == 1 then -- 普通pvp |
155 | + local dbKey = role:getPvpDBKey(RANK_PVP_COMMON) | |
153 | 156 | local redret = redisproxy:pipelining(function(red) |
154 | - red:zscore(RANK_PVP_COMMON, roleId) | |
155 | - red:zrevrank(RANK_PVP_COMMON, roleId) | |
157 | + red:zscore(dbKey, roleId) | |
158 | + red:zrevrank(dbKey, roleId) | |
156 | 159 | end) |
157 | 160 | local score = role:unpackPvpScore(redret[1]) |
158 | 161 | local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp |
... | ... | @@ -168,9 +171,11 @@ function _M.infoRpc(agent, data) |
168 | 171 | response.score = score |
169 | 172 | response.matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC, RANK_PVP_COMMON, "pvpCInfo") |
170 | 173 | elseif ptype == 2 then -- 高级pvp |
174 | + if not role:isTimeResetOpen(TimeReset.PvpHight) then return end | |
175 | + local dbKey = role:getPvpDBKey(RANK_PVP_HIGHT) | |
171 | 176 | local redret = redisproxy:pipelining(function(red) |
172 | - red:zscore(RANK_PVP_HIGHT, roleId) | |
173 | - red:zrevrank(RANK_PVP_HIGHT, roleId) | |
177 | + red:zscore(dbKey, roleId) | |
178 | + red:zrevrank(dbKey, roleId) | |
174 | 179 | end) |
175 | 180 | local score = role:unpackPvpScore(redret[1]) |
176 | 181 | local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp |
... | ... | @@ -207,6 +212,8 @@ end |
207 | 212 | function _M.refreshMatchHRpc(agent, data) |
208 | 213 | local role = agent.role |
209 | 214 | local msg = MsgPack.unpack(data) |
215 | + if not role:isTimeResetOpen(TimeReset.PvpHight) then return end | |
216 | + | |
210 | 217 | role:refreshPvpMatchH() |
211 | 218 | |
212 | 219 | local pvpMH = role:getProperty("pvpMH") |
... | ... | @@ -397,9 +404,10 @@ function _M.startBattleHRpc(agent, data) |
397 | 404 | |
398 | 405 | local idx = msg.idx |
399 | 406 | local revenge = msg.revenge |
407 | + if not role:isTimeResetOpen(TimeReset.PvpHight) then return end | |
400 | 408 | |
401 | 409 | local pvpTH = role:getProperty("pvpTH") |
402 | - if not pvpTH.heros or not next(pvpTH.heros) then return 1 end | |
410 | + if not next(pvpTH) then return 1 end | |
403 | 411 | |
404 | 412 | -- 检查并记录玩家队伍 |
405 | 413 | local pvpTH = {} |
... | ... | @@ -460,7 +468,7 @@ function _M.startBattleHRpc(agent, data) |
460 | 468 | if not pvpMH[idx] then return 3 end |
461 | 469 | if pvpMH[idx].t == 1 then |
462 | 470 | enemyTeamRecord = _pvpBattleInfoCacheH[pvpMH[idx].id] |
463 | - enemyT = _pvpHeroInfoCacheH[temp.id] | |
471 | + enemyT = _pvpHeroInfoCacheH[pvpMH[idx].id] | |
464 | 472 | elseif pvpMH[idx].t == 2 then |
465 | 473 | enemyTeamRecord = {robot = pvpMH[idx].id} |
466 | 474 | end |
... | ... | @@ -581,7 +589,7 @@ function _M.endBattleHRpc(agent, data) |
581 | 589 | local round = #_pvpStartBattleCacheH.result + 1 |
582 | 590 | local matchInfo = nil |
583 | 591 | if _pvpStartBattleCacheH.enemyTB.robot then |
584 | - matchInfo = _pvpStartBattleCacheH.enemyTB.robot | |
592 | + matchInfo = _pvpStartBattleCacheH.enemyTB | |
585 | 593 | else |
586 | 594 | matchInfo = _pvpStartBattleCacheH.enemyTB[round] |
587 | 595 | end |
... | ... | @@ -597,10 +605,12 @@ function _M.endBattleHRpc(agent, data) |
597 | 605 | end |
598 | 606 | |
599 | 607 | -- 战斗结束了发奖 |
600 | - local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpBonus, true) | |
608 | + local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpgroupBonus, true) | |
601 | 609 | local reward = role:award({[temp[1]] = temp[2]}) |
602 | - local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreHigh(match.t == 1 and match.id or -1, isWin) | |
603 | - | |
610 | + local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, 0, 0 | |
611 | + if role:isTimeResetOpen(TimeReset.PvpHight) then | |
612 | + myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreHigh(match.t == 1 and match.id or -1, isWin) | |
613 | + end | |
604 | 614 | |
605 | 615 | -- 加入战斗记录 |
606 | 616 | local selfTeam = {} |
... | ... | @@ -608,7 +618,10 @@ function _M.endBattleHRpc(agent, data) |
608 | 618 | for _idx, info in ipairs(_pvpStartBattleCacheH.result) do |
609 | 619 | info.winId = info.isWin and roleId or match.id |
610 | 620 | info.isWin = nil |
611 | - selfTeam[_idx] = role:getTeamHerosInfo(_pvpStartBattleCacheH.pvpTH[_idx].heros) | |
621 | + selfTeam[_idx] = { | |
622 | + heros = role:getTeamHerosInfo(_pvpStartBattleCacheH.pvpTH[_idx].heros), | |
623 | + battleV = role:getTeamBattleValue(_pvpStartBattleCacheH.pvpTH[_idx].heros) | |
624 | + } | |
612 | 625 | if match.t == 1 and _pvpStartBattleCacheH.enemyT then |
613 | 626 | enemyTeam[_idx] = _pvpStartBattleCacheH.enemyT[_idx] |
614 | 627 | end |
... | ... | @@ -681,10 +694,11 @@ function _M.rankListRpc(agent, data) |
681 | 694 | |
682 | 695 | local response = {} |
683 | 696 | if ptype == 1 then -- 普通pvp |
697 | + local dbKey = role:getPvpDBKey(RANK_PVP_COMMON) | |
684 | 698 | local redret = redisproxy:pipelining(function(red) |
685 | - red:zscore(RANK_PVP_COMMON, roleId) | |
686 | - red:zrevrank(RANK_PVP_COMMON, roleId) | |
687 | - red:zrevrange(RANK_PVP_COMMON, 0, 99, "WITHSCORES") | |
699 | + red:zscore(dbKey, roleId) | |
700 | + red:zrevrank(dbKey, roleId) | |
701 | + red:zrevrange(dbKey, 0, 99, "WITHSCORES") | |
688 | 702 | end) |
689 | 703 | local score = role:unpackPvpScore(redret[1]) |
690 | 704 | local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp |
... | ... | @@ -703,10 +717,11 @@ function _M.rankListRpc(agent, data) |
703 | 717 | response.rankList = rankList |
704 | 718 | |
705 | 719 | elseif ptype == 2 then -- 高级pvp |
720 | + local dbKey = role:getPvpDBKey(RANK_PVP_HIGHT) | |
706 | 721 | local redret = redisproxy:pipelining(function(red) |
707 | - red:zscore(RANK_PVP_HIGHT, roleId) | |
708 | - red:zrevrank(RANK_PVP_HIGHT, roleId) | |
709 | - red:zrevrange(RANK_PVP_HIGHT, 0, 99, "WITHSCORES") | |
722 | + red:zscore(dbKey, roleId) | |
723 | + red:zrevrank(dbKey, roleId) | |
724 | + red:zrevrange(dbKey, 0, 99, "WITHSCORES") | |
710 | 725 | end) |
711 | 726 | local score = role:unpackPvpScore(redret[1]) |
712 | 727 | local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp |
... | ... | @@ -714,7 +729,7 @@ function _M.rankListRpc(agent, data) |
714 | 729 | for i = 1, #redret[3], 2 do |
715 | 730 | local roleId = tonumber(redret[3][i]) |
716 | 731 | local score = role:unpackPvpScore(redret[3][i + 1]) |
717 | - local online, curInfo = rpcRole(roleId, "friendSInfo") | |
732 | + local online, curInfo = rpcRole(roleId, "pvpHRankInfo") | |
718 | 733 | curInfo.score = score |
719 | 734 | curInfo.roleId = roleId |
720 | 735 | table.insert(rankList, curInfo) |
... | ... | @@ -784,4 +799,69 @@ function _M.recordListRpc(agent, data) |
784 | 799 | return true |
785 | 800 | end |
786 | 801 | |
802 | +function _M.highDivisionGiftRpc(agent, data) | |
803 | + local role = agent.role | |
804 | + local roleId = role:getProperty("id") | |
805 | + | |
806 | + local pvpHGTime = self:getProperty("pvpHGTime") | |
807 | + if pvpHGTime == 0 then return end | |
808 | + local score = role:unpackPvpScore(redisproxy:zscore(role:getPvpDBKey(RANK_PVP_HIGHT), roleId)) | |
809 | + | |
810 | + local divisionId = nil | |
811 | + for _id, division in ipairs(csvdb["pvp_group_divisionCsv"]) do | |
812 | + if score >= division.division then | |
813 | + divisionId = _id | |
814 | + else | |
815 | + break | |
816 | + end | |
817 | + end | |
818 | + | |
819 | + local newTime, newReward = role:calculatePvpHGift(divisionId) | |
820 | + if not next(newReward) then return end | |
821 | + | |
822 | + self:updateProperties({ | |
823 | + pvpHGTime = newTime, | |
824 | + pvpHGift = {}, | |
825 | + }) | |
826 | + | |
827 | + local reward = role:award(newReward) | |
828 | + | |
829 | + SendPacket(actionCodes.Pvp_highDivisionGiftRpc, MsgPack.pack({reward = reward})) | |
830 | + return true | |
831 | +end | |
832 | + | |
833 | +function _M.shopBuyRpc(agent, data) | |
834 | + local role = agent.role | |
835 | + local roleId = role:getProperty("id") | |
836 | + | |
837 | + local msg = MsgPack.unpack(data) | |
838 | + local id = msg.id | |
839 | + local count = msg.count or 1 | |
840 | + | |
841 | + local csvData = csvdb["shop_pvpCsv"][id] | |
842 | + if not csvData then return end | |
843 | + | |
844 | + local pvpShop = role:getProperty("pvpShop") | |
845 | + if csvData.limit > 0 then | |
846 | + if math.illegalNum(count, 1, csvData.limit - (pvpShop[id] or 0)) then return end | |
847 | + end | |
848 | + | |
849 | + if not role:checkItemEnough({[ItemId.PvpCoin] = csvData.cost * count}) then return end | |
850 | + | |
851 | + role:costItems({[ItemId.PvpCoin] = csvData.cost * count}) | |
852 | + if csvData.limit > 0 then | |
853 | + role:changeUpdates({{type = "pvpShop", field = id, value = (pvpShop[id] or 0) + count}}) | |
854 | + end | |
855 | + | |
856 | + local gift = csvData.gift:toNumMap() | |
857 | + for id, c in pairs(gift) do | |
858 | + gift[id] = c * count | |
859 | + end | |
860 | + local reward = role:award(gift) | |
861 | + | |
862 | + | |
863 | + SendPacket(actionCodes.Pvp_shopBuyRpc, MsgPack.pack({reward = reward})) | |
864 | + return true | |
865 | +end | |
866 | + | |
787 | 867 | return _M |
788 | 868 | \ No newline at end of file | ... | ... |
src/actions/RoleAction.lua
... | ... | @@ -22,7 +22,7 @@ local function validName(name) |
22 | 22 | local exist = redisproxy:exists(string_format("user:%s", name)) |
23 | 23 | if exist then return "existed" end |
24 | 24 | |
25 | - local SERV = string_format("NAMED%d", math.random(1, 5)) | |
25 | + local SERV = string_format(".NAMED%d", math.random(1, 5)) | |
26 | 26 | local legal = skynet.call(SERV, "lua", "check", name) |
27 | 27 | return legal and "ok" or "illegal" |
28 | 28 | end |
... | ... | @@ -119,8 +119,7 @@ function _M.loginRpc( agent, data ) |
119 | 119 | role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 |
120 | 120 | |
121 | 121 | -- 跨天登陆事件 |
122 | - role:onCrossDay(now) | |
123 | - role:onResetRank(now) | |
122 | + role:updateTimeReset(now) | |
124 | 123 | role:setProperty("ltime", now) |
125 | 124 | redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) |
126 | 125 | |
... | ... | @@ -217,7 +216,7 @@ function _M.loginRpc( agent, data ) |
217 | 216 | |
218 | 217 | -- 发下缓存的世界消息 |
219 | 218 | local worldChatResponse = {worldChats = {}} |
220 | - local ok, msgs = pcall(skynet.call, 'GLOBALD', "lua", "getWorldMsg", role._channelIdx) | |
219 | + local ok, msgs = pcall(skynet.call, '.GLOBALD', "lua", "getWorldMsg", role._channelIdx) | |
221 | 220 | if not ok then |
222 | 221 | msgs = {} |
223 | 222 | end |
... | ... | @@ -246,7 +245,7 @@ function _M.loginRpc( agent, data ) |
246 | 245 | role:saveHangTeam() |
247 | 246 | role:savePvpCTeam() |
248 | 247 | |
249 | - role:log("login", {ip = agent.ip}) | |
248 | + role:log("login", {key1 = agent.ip:toArray(false, ":")[1]}) | |
250 | 249 | |
251 | 250 | return true |
252 | 251 | end |
... | ... | @@ -297,7 +296,7 @@ function _M.createRpc(agent, data) |
297 | 296 | -- 欢迎邮件 |
298 | 297 | redisproxy:insertEmail({roleId = roleId, emailId = 1}) |
299 | 298 | |
300 | - newRole:log("create", { ip = agent.ip}) | |
299 | + newRole:log("create", {key1 = agent.ip:toArray(false, ":")[1]}) | |
301 | 300 | |
302 | 301 | SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) |
303 | 302 | return true |
... | ... | @@ -357,7 +356,7 @@ function _M.changeIntroRpc(agent, data) |
357 | 356 | local content = msg.content |
358 | 357 | if not content or type(content) ~= "string" then return end |
359 | 358 | |
360 | - local SERV = string_format("CHATED%d", math.random(1, 5)) | |
359 | + local SERV = string_format(".CHATED%d", math.random(1, 5)) | |
361 | 360 | local legal, mod = skynet.call(SERV, "lua", "check", content) |
362 | 361 | if not legal then |
363 | 362 | content = mod or "" |
... | ... | @@ -472,9 +471,8 @@ function _M.openTimeBoxRpc(agent, data) |
472 | 471 | local boxId = boxL[slot].id |
473 | 472 | local itemData = csvdb["itemCsv"][boxId] |
474 | 473 | local randomData = csvdb["item_randomCsv"][itemData.id] |
475 | - reward = randomData.gift:toNumMap() -- 固定奖励 | |
476 | 474 | -- 随机奖励 |
477 | - local reward = {} | |
475 | + reward = {} | |
478 | 476 | for i = 1, 10 do |
479 | 477 | local num = randomData["num" .. i] |
480 | 478 | local gift = randomData["gift" .. i] |
... | ... | @@ -743,7 +741,7 @@ function _M.chatRpc(agent, data) |
743 | 741 | -- 判断禁言 |
744 | 742 | local result = nil |
745 | 743 | |
746 | - local SERV = string_format("CHATED%d", math.random(1, 5)) | |
744 | + local SERV = string_format(".CHATED%d", math.random(1, 5)) | |
747 | 745 | local legal, mod = skynet.call(SERV, "lua", "check", content) |
748 | 746 | if not legal then |
749 | 747 | content = mod or "" |
... | ... | @@ -798,7 +796,7 @@ function _M.chatRpc(agent, data) |
798 | 796 | end |
799 | 797 | end |
800 | 798 | mcast_util.pub_world(actionCodes.Role_chat, MsgPack.pack(response)) |
801 | - pcall(skynet.send, 'GLOBALD', "lua", "sendWorldMsg", role._channelIdx, response) | |
799 | + pcall(skynet.send, '.GLOBALD', "lua", "sendWorldMsg", role._channelIdx, response) | |
802 | 800 | end, |
803 | 801 | -- 私聊 |
804 | 802 | [2] = function () | ... | ... |
src/agent.lua
... | ... | @@ -5,7 +5,6 @@ require "GlobalVar" |
5 | 5 | require "RedisKeys" |
6 | 6 | require "skynet.manager" |
7 | 7 | |
8 | -local harbor = require "skynet.harbor" | |
9 | 8 | local queue = require "skynet.queue" |
10 | 9 | local netpack = require "skynet.netpack" |
11 | 10 | local socket = require "skynet.socket" |
... | ... | @@ -115,7 +114,11 @@ function rpcRole(roleId, funcName, ...) |
115 | 114 | end |
116 | 115 | else |
117 | 116 | local roleCross = require("models.RoleCross") |
118 | - return false, roleCross.handle(funcName, roleId, ...) | |
117 | + if funcName == "getProperties" then | |
118 | + return false, roleCross.handle(funcName, roleId, fields) | |
119 | + else | |
120 | + return false, roleCross.handle(funcName, roleId, ...) | |
121 | + end | |
119 | 122 | end |
120 | 123 | end |
121 | 124 | |
... | ... | @@ -236,13 +239,12 @@ function CMD.close() |
236 | 239 | mcast_util.usub_union() |
237 | 240 | local role = agentInfo.role |
238 | 241 | if not role then return end |
239 | - role:log("logout", {online = skynet.timex()-role:getProperty("ltime")}) | |
242 | + role:log("logout", {int1 = skynet.timex()-role:getProperty("ltime")}) | |
240 | 243 | role:onOfflineEvent() |
241 | 244 | end |
242 | 245 | |
243 | 246 | function CMD.exit() |
244 | 247 | if agentInfo.role then |
245 | - -- role:log("logout", {online = skynet.timex()-role:getProperty("ltime")}) | |
246 | 248 | datacenter.set("agent", agentInfo.role:getProperty("id"), nil) |
247 | 249 | end |
248 | 250 | skynet.exit() |
... | ... | @@ -298,9 +300,9 @@ skynet.start(function() |
298 | 300 | end |
299 | 301 | end) |
300 | 302 | |
301 | - redisd = harbor.queryname("REDIS") | |
303 | + redisd = skynet.localname(".REDIS") | |
302 | 304 | if tonumber(skynet.getenv "logd") == 1 then |
303 | - logd = harbor.queryname("LOGD") | |
305 | + logd = skynet.localname(".LOGD") | |
304 | 306 | end |
305 | 307 | |
306 | 308 | cs = queue() | ... | ... |
src/models/RolePvp.lua
... | ... | @@ -22,13 +22,14 @@ end |
22 | 22 | |
23 | 23 | |
24 | 24 | function Role:changePvpScore(rankKey, changeScoreCallback, matchId) |
25 | + local dbKey = self:getPvpDBKey(rankKey) | |
25 | 26 | local roleId = self:getProperty("id") |
26 | 27 | local isPlayer = matchId ~= -1 |
27 | 28 | local redret = redisproxy:pipelining(function(red) |
28 | - red:zscore(rankKey, roleId) | |
29 | - red:zrevrank(rankKey, roleId) | |
29 | + red:zscore(dbKey, roleId) | |
30 | + red:zrevrank(dbKey, roleId) | |
30 | 31 | if isPlayer then |
31 | - red:zscore(rankKey, matchId) | |
32 | + red:zscore(dbKey, matchId) | |
32 | 33 | end |
33 | 34 | end) |
34 | 35 | local myScore = self:unpackPvpScore(redret[1]) |
... | ... | @@ -45,11 +46,11 @@ function Role:changePvpScore(rankKey, changeScoreCallback, matchId) |
45 | 46 | |
46 | 47 | local now = skynet.timex() |
47 | 48 | redret = redisproxy:pipelining(function(red) |
48 | - red:zadd(rankKey, self:packPvpScore(myScore, now), roleId) | |
49 | + red:zadd(dbKey, self:packPvpScore(myScore, now), roleId) | |
49 | 50 | if isPlayer then |
50 | - red:zadd(rankKey, self:packPvpScore(matchScore, now), matchId) | |
51 | + red:zadd(dbKey, self:packPvpScore(matchScore, now), matchId) | |
51 | 52 | end |
52 | - red:zrevrank(rankKey, roleId) | |
53 | + red:zrevrank(dbKey, roleId) | |
53 | 54 | end) |
54 | 55 | |
55 | 56 | local myRank |
... | ... | @@ -81,18 +82,42 @@ function Role:changePvpScoreCommon(matchId, isWin) |
81 | 82 | return table.unpack(result) |
82 | 83 | end |
83 | 84 | |
85 | +function Role:calculatePvpHGift(division) | |
86 | + local now = skynet.timex() | |
87 | + local oldTime = self:getProperty("pvpHGTime") | |
88 | + local oldReward = self:getProperty("pvpHGift") | |
89 | + | |
90 | + local newTime = oldTime | |
91 | + local newReward = clone(oldReward) | |
92 | + | |
93 | + local divisionData = csvdb["pvp_group_divisionCsv"][division] | |
94 | + if oldTime == 0 then | |
95 | + newTime = now | |
96 | + else | |
97 | + local times = math.floor((now - oldTime) / globalCsv.pvp_high_reward_add_pre) | |
98 | + newTime = oldTime + times * globalCsv.pvp_high_reward_add_pre | |
99 | + | |
100 | + for itemId, count in pairs(divisionData.reward:toNumMap()) do | |
101 | + newReward[itemId] = math.min((newReward[itemId] or 0) + count, divisionData.limit) | |
102 | + end | |
103 | + end | |
104 | + return newTime, newReward | |
105 | +end | |
106 | + | |
84 | 107 | function Role:changePvpScoreHigh(matchId, isWin) |
108 | + local oldMyDivision | |
85 | 109 | local function changeScoreCallback(myScore, matchScore) |
86 | - local myMinScore = 0 | |
87 | - local matchMinScore = 0 | |
88 | - for _, division in ipairs(csvdb["pvp_group_divisionCsv"]) do | |
110 | + local myMinId = 0 | |
111 | + local matchMinId = 0 | |
112 | + for _id, division in ipairs(csvdb["pvp_group_divisionCsv"]) do | |
89 | 113 | if myScore >= division.division then |
90 | - myMinScore = division.division | |
114 | + myMinId = _id | |
91 | 115 | end |
92 | 116 | if matchScore >= division.division then |
93 | - matchMinScore = division.division | |
117 | + matchMinId = _id | |
94 | 118 | end |
95 | 119 | end |
120 | + oldMyDivision = myMinId | |
96 | 121 | if isWin then |
97 | 122 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000))) |
98 | 123 | myScore = myScore + scoreChange |
... | ... | @@ -102,10 +127,28 @@ function Role:changePvpScoreHigh(matchId, isWin) |
102 | 127 | myScore = myScore - scoreChange |
103 | 128 | matchScore = matchScore + scoreChange |
104 | 129 | end |
105 | - return math.max(myScore, myMinScore), math.max(matchScore, matchMinScore) | |
130 | + return math.max(myScore, csvdb["pvp_group_divisionCsv"][myMinId].division), math.max(matchScore, csvdb["pvp_group_divisionCsv"][matchMinId].division) | |
106 | 131 | end |
107 | 132 | |
108 | 133 | local result = self:changePvpScore(RANK_PVP_HIGHT, changeScoreCallback, matchId) |
134 | + --{myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank} | |
135 | + local newDivision = nil | |
136 | + for _id, division in ipairs(csvdb["pvp_group_divisionCsv"]) do | |
137 | + if result[1] >= division.division then | |
138 | + newDivision = _id | |
139 | + else | |
140 | + break | |
141 | + end | |
142 | + end | |
143 | + if newDivision ~= oldMyDivision then | |
144 | + --刷新段位奖励 | |
145 | + local newTime, newReward = self:calculatePvpHGift(oldMyDivision) | |
146 | + self:updateProperties({ | |
147 | + pvpHGTime = newTime, | |
148 | + pvpHGift = newReward, | |
149 | + }) | |
150 | + end | |
151 | + | |
109 | 152 | self:refreshPvpMatchH(result[1]) |
110 | 153 | return table.unpack(result) |
111 | 154 | end |
... | ... | @@ -122,20 +165,21 @@ function Role:refreshPvpMatch(score, rankKey) |
122 | 165 | } |
123 | 166 | local mField = Fields[rankKey] |
124 | 167 | local robotCsv = RobotCsvs[rankKey] |
168 | + local dbKey = self:getPvpDBKey(rankKey) | |
125 | 169 | |
126 | 170 | local roleId = self:getProperty("id") |
127 | - score = score or self:unpackPvpScore(redisproxy:zscore(rankKey, roleId)) | |
171 | + score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId)) | |
128 | 172 | |
129 | 173 | local function getPlayers(levels) |
130 | 174 | local redret = redisproxy:pipelining(function(red) |
131 | 175 | for _, level in ipairs(levels) do |
132 | 176 | local low, high = table.unpack(level) |
133 | - red:zadd(rankKey, low * PVP_RANK_TIME_SORT_PLACE, "std_temp1") | |
134 | - red:zadd(rankKey, high * PVP_RANK_TIME_SORT_PLACE + PVP_RANK_TIME_SORT_PLACE - 1, "std_temp2") | |
135 | - red:ZREVRANK(rankKey, "std_temp1") | |
136 | - red:ZREVRANK(rankKey, "std_temp2") | |
177 | + red:zadd(dbKey, low * PVP_RANK_TIME_SORT_PLACE, "std_temp1") | |
178 | + red:zadd(dbKey, high * PVP_RANK_TIME_SORT_PLACE + PVP_RANK_TIME_SORT_PLACE - 1, "std_temp2") | |
179 | + red:ZREVRANK(dbKey, "std_temp1") | |
180 | + red:ZREVRANK(dbKey, "std_temp2") | |
137 | 181 | end |
138 | - red:zrem(rankKey, "std_temp1", "std_temp2") | |
182 | + red:zrem(dbKey, "std_temp1", "std_temp2") | |
139 | 183 | end) |
140 | 184 | |
141 | 185 | local PreGetCount = 7 |
... | ... | @@ -147,7 +191,7 @@ function Role:refreshPvpMatch(score, rankKey) |
147 | 191 | rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1) |
148 | 192 | rank1 = rank2 + PreGetCount - 1 |
149 | 193 | end |
150 | - red:ZREVRANGE(rankKey, rank2, rank1) | |
194 | + red:ZREVRANGE(dbKey, rank2, rank1) | |
151 | 195 | end |
152 | 196 | end) |
153 | 197 | return redret |
... | ... | @@ -288,6 +332,26 @@ function Role:refreshPvpMatchH(score) |
288 | 332 | self:refreshPvpMatch(score, RANK_PVP_HIGHT) |
289 | 333 | end |
290 | 334 | |
335 | +function Role:getPvpDBKey(ptype) | |
336 | + local dbList | |
337 | + local round | |
338 | + if ptype == RANK_PVP_COMMON then | |
339 | + dbList = RANK_PVP_COMMON_KEY | |
340 | + round = self:getTimeResetRound(TimeReset.PvpRank) | |
341 | + elseif ptype == RANK_PVP_HIGHT then | |
342 | + dbList = RANK_PVP_HIGHT_KEY | |
343 | + round = self:getTimeResetRound(TimeReset.PvpHight) | |
344 | + end | |
345 | + local idx = 1 | |
346 | + if round % 2 == 1 then | |
347 | + idx = 2 | |
348 | + end | |
349 | + return dbList[idx] | |
350 | +end | |
351 | + | |
352 | + | |
353 | + | |
354 | + | |
291 | 355 | end |
292 | 356 | |
293 | 357 | ... | ... |