Commit da89807497f99247dab8949528a61278a7e374dd

Authored by zhouhaihai
1 parent cfd68b3a

pvp 高级领奖

1 XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18" 1 XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18"
2 RESET_TIME = 4 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 MAX_ROLE_NUM = 1000000 10 MAX_ROLE_NUM = 1000000
5 -- 属性枚举 11 -- 属性枚举
6 AttsEnum = { 12 AttsEnum = {
@@ -98,17 +104,31 @@ ItemId = { @@ -98,17 +104,31 @@ ItemId = {
98 BreakCost = 10, -- 突破材料 104 BreakCost = 10, -- 突破材料
99 EquipUp = 11, -- 装备升级材料 105 EquipUp = 11, -- 装备升级材料
100 DinerCoin = 12, --后勤物资 106 DinerCoin = 12, --后勤物资
101 - LoveUp = 14, --好感度提升道具 107 + PvpCoin = 14, --挑战货币
102 OldCoin = 15, --古代金币 108 OldCoin = 15, --古代金币
103 AdvPoint = 16, -- 探险点 109 AdvPoint = 16, -- 探险点
104 DinerSpTask = 20, -- 餐厅任务采购券 110 DinerSpTask = 20, -- 餐厅任务采购券
105 LoveBreak = 21, --好感度突破道具 111 LoveBreak = 21, --好感度突破道具
106 PvpKey = 22, -- pvp钥匙 112 PvpKey = 22, -- pvp钥匙
107 LunchFragment = 23, 113 LunchFragment = 23,
108 - HeroFC = {700, 701, 702, 703}, -- 通用角色碎片 114 + HeroFC = {700, 701, 702, 703}, --通用角色碎片
109 AdvKey = 80, -- 冒险钥匙 115 AdvKey = 80, -- 冒险钥匙
110 BoxKey = 60, -- 拆解工具 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 AdvSpecialStage = { 133 AdvSpecialStage = {
114 [1]= "In", 134 [1]= "In",
src/ProtocolCode.lua
@@ -160,6 +160,8 @@ actionCodes = { @@ -160,6 +160,8 @@ actionCodes = {
160 Pvp_refreshMatchHRpc = 509, 160 Pvp_refreshMatchHRpc = 509,
161 Pvp_startBattleHRpc = 510, 161 Pvp_startBattleHRpc = 510,
162 Pvp_endBattleHRpc = 511, 162 Pvp_endBattleHRpc = 511,
  163 + Pvp_highDivisionGiftRpc = 512,
  164 + Pvp_shopBuyRpc = 513,
163 165
164 166
165 Store_rechargeRpc = 550, 167 Store_rechargeRpc = 550,
@@ -24,8 +24,10 @@ RANK_DINER = {"rank:diner1", "rank:diner2"} -- é¤åŽ…æŽ’è¡Œæ¦œ 两个æ¯å¤©äº’æ @@ -24,8 +24,10 @@ RANK_DINER = {"rank:diner1", "rank:diner2"} -- é¤åŽ…æŽ’è¡Œæ¦œ 两个æ¯å¤©äº’æ
24 RANK_DINER_INFO = "rank:diner:info" 24 RANK_DINER_INFO = "rank:diner:info"
25 25
26 RANK_PVP_COMMON = "rank:pvpc" 26 RANK_PVP_COMMON = "rank:pvpc"
  27 +RANK_PVP_COMMON_KEY = {"rank:pvpc1", "rank:pvpc2"}
27 RECORD_PVP_COMMON = "record:pvpc:%d" 28 RECORD_PVP_COMMON = "record:pvpc:%d"
28 RANK_PVP_HIGHT = "rank:pvph" 29 RANK_PVP_HIGHT = "rank:pvph"
  30 +RANK_PVP_HIGHT_KEY = {"rank:pvph1", "rank:pvph2"}
29 RECORD_PVP_HIGH = "record:pvph:%d" 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,7 +245,7 @@ function _M.commentHeroRpc(agent, data)
245 result.status = 1 245 result.status = 1
246 else 246 else
247 local commentKey = getCommentKey(heroType) 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 local legal, mod = skynet.call(SERV, "lua", "check", content) 249 local legal, mod = skynet.call(SERV, "lua", "check", content)
250 if not legal then 250 if not legal then
251 content = mod or "" 251 content = mod or ""
src/actions/HttpAction.lua
@@ -43,7 +43,7 @@ function _M.reload_csvdata(query, body) @@ -43,7 +43,7 @@ function _M.reload_csvdata(query, body)
43 return "code error" 43 return "code error"
44 end 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 if status == "ok" then 47 if status == "ok" then
48 skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body)) 48 skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body))
49 return 'success' 49 return 'success'
@@ -69,7 +69,7 @@ function _M.hotfix_csvdata(query, body) @@ -69,7 +69,7 @@ function _M.hotfix_csvdata(query, body)
69 if not ok or type(result) ~= 'table' then 69 if not ok or type(result) ~= 'table' then
70 return "decode error" 70 return "decode error"
71 end 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 if status == "ok" then 74 if status == "ok" then
75 skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body)) 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,7 +150,7 @@ function _M.hotfix_code(query, body)
150 150
151 skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body)) 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 return 'success' 154 return 'success'
155 end 155 end
156 156
src/actions/PvpAction.lua
@@ -103,6 +103,7 @@ end @@ -103,6 +103,7 @@ end
103 103
104 local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, infoCache) 104 local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, infoCache)
105 table.clear(battleCache) 105 table.clear(battleCache)
  106 + local dbKey = role:getPvpDBKey(dbKey)
106 local redret = redisproxy:pipelining(function(red) 107 local redret = redisproxy:pipelining(function(red)
107 for _, info in ipairs(pvpList) do 108 for _, info in ipairs(pvpList) do
108 if info.t == 1 then 109 if info.t == 1 then
@@ -125,8 +126,9 @@ local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, inf @@ -125,8 +126,9 @@ local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, inf
125 if k == "battleInfo" then 126 if k == "battleInfo" then
126 battleCache[curInfo.roleId] = v 127 battleCache[curInfo.roleId] = v
127 else 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 end 132 end
131 curInfo[k] = v 133 curInfo[k] = v
132 end 134 end
@@ -150,9 +152,10 @@ function _M.infoRpc(agent, data) @@ -150,9 +152,10 @@ function _M.infoRpc(agent, data)
150 152
151 local response = {} 153 local response = {}
152 if ptype == 1 then -- 普通pvp 154 if ptype == 1 then -- 普通pvp
  155 + local dbKey = role:getPvpDBKey(RANK_PVP_COMMON)
153 local redret = redisproxy:pipelining(function(red) 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 end) 159 end)
157 local score = role:unpackPvpScore(redret[1]) 160 local score = role:unpackPvpScore(redret[1])
158 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp 161 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp
@@ -168,9 +171,11 @@ function _M.infoRpc(agent, data) @@ -168,9 +171,11 @@ function _M.infoRpc(agent, data)
168 response.score = score 171 response.score = score
169 response.matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC, RANK_PVP_COMMON, "pvpCInfo") 172 response.matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC, RANK_PVP_COMMON, "pvpCInfo")
170 elseif ptype == 2 then -- 高级pvp 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 local redret = redisproxy:pipelining(function(red) 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 end) 179 end)
175 local score = role:unpackPvpScore(redret[1]) 180 local score = role:unpackPvpScore(redret[1])
176 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp 181 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp
@@ -207,6 +212,8 @@ end @@ -207,6 +212,8 @@ end
207 function _M.refreshMatchHRpc(agent, data) 212 function _M.refreshMatchHRpc(agent, data)
208 local role = agent.role 213 local role = agent.role
209 local msg = MsgPack.unpack(data) 214 local msg = MsgPack.unpack(data)
  215 + if not role:isTimeResetOpen(TimeReset.PvpHight) then return end
  216 +
210 role:refreshPvpMatchH() 217 role:refreshPvpMatchH()
211 218
212 local pvpMH = role:getProperty("pvpMH") 219 local pvpMH = role:getProperty("pvpMH")
@@ -397,9 +404,10 @@ function _M.startBattleHRpc(agent, data) @@ -397,9 +404,10 @@ function _M.startBattleHRpc(agent, data)
397 404
398 local idx = msg.idx 405 local idx = msg.idx
399 local revenge = msg.revenge 406 local revenge = msg.revenge
  407 + if not role:isTimeResetOpen(TimeReset.PvpHight) then return end
400 408
401 local pvpTH = role:getProperty("pvpTH") 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 local pvpTH = {} 413 local pvpTH = {}
@@ -460,7 +468,7 @@ function _M.startBattleHRpc(agent, data) @@ -460,7 +468,7 @@ function _M.startBattleHRpc(agent, data)
460 if not pvpMH[idx] then return 3 end 468 if not pvpMH[idx] then return 3 end
461 if pvpMH[idx].t == 1 then 469 if pvpMH[idx].t == 1 then
462 enemyTeamRecord = _pvpBattleInfoCacheH[pvpMH[idx].id] 470 enemyTeamRecord = _pvpBattleInfoCacheH[pvpMH[idx].id]
463 - enemyT = _pvpHeroInfoCacheH[temp.id] 471 + enemyT = _pvpHeroInfoCacheH[pvpMH[idx].id]
464 elseif pvpMH[idx].t == 2 then 472 elseif pvpMH[idx].t == 2 then
465 enemyTeamRecord = {robot = pvpMH[idx].id} 473 enemyTeamRecord = {robot = pvpMH[idx].id}
466 end 474 end
@@ -581,7 +589,7 @@ function _M.endBattleHRpc(agent, data) @@ -581,7 +589,7 @@ function _M.endBattleHRpc(agent, data)
581 local round = #_pvpStartBattleCacheH.result + 1 589 local round = #_pvpStartBattleCacheH.result + 1
582 local matchInfo = nil 590 local matchInfo = nil
583 if _pvpStartBattleCacheH.enemyTB.robot then 591 if _pvpStartBattleCacheH.enemyTB.robot then
584 - matchInfo = _pvpStartBattleCacheH.enemyTB.robot 592 + matchInfo = _pvpStartBattleCacheH.enemyTB
585 else 593 else
586 matchInfo = _pvpStartBattleCacheH.enemyTB[round] 594 matchInfo = _pvpStartBattleCacheH.enemyTB[round]
587 end 595 end
@@ -597,10 +605,12 @@ function _M.endBattleHRpc(agent, data) @@ -597,10 +605,12 @@ function _M.endBattleHRpc(agent, data)
597 end 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 local reward = role:award({[temp[1]] = temp[2]}) 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 local selfTeam = {} 616 local selfTeam = {}
@@ -608,7 +618,10 @@ function _M.endBattleHRpc(agent, data) @@ -608,7 +618,10 @@ function _M.endBattleHRpc(agent, data)
608 for _idx, info in ipairs(_pvpStartBattleCacheH.result) do 618 for _idx, info in ipairs(_pvpStartBattleCacheH.result) do
609 info.winId = info.isWin and roleId or match.id 619 info.winId = info.isWin and roleId or match.id
610 info.isWin = nil 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 if match.t == 1 and _pvpStartBattleCacheH.enemyT then 625 if match.t == 1 and _pvpStartBattleCacheH.enemyT then
613 enemyTeam[_idx] = _pvpStartBattleCacheH.enemyT[_idx] 626 enemyTeam[_idx] = _pvpStartBattleCacheH.enemyT[_idx]
614 end 627 end
@@ -681,10 +694,11 @@ function _M.rankListRpc(agent, data) @@ -681,10 +694,11 @@ function _M.rankListRpc(agent, data)
681 694
682 local response = {} 695 local response = {}
683 if ptype == 1 then -- 普通pvp 696 if ptype == 1 then -- 普通pvp
  697 + local dbKey = role:getPvpDBKey(RANK_PVP_COMMON)
684 local redret = redisproxy:pipelining(function(red) 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 end) 702 end)
689 local score = role:unpackPvpScore(redret[1]) 703 local score = role:unpackPvpScore(redret[1])
690 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp 704 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp
@@ -703,10 +717,11 @@ function _M.rankListRpc(agent, data) @@ -703,10 +717,11 @@ function _M.rankListRpc(agent, data)
703 response.rankList = rankList 717 response.rankList = rankList
704 718
705 elseif ptype == 2 then -- 高级pvp 719 elseif ptype == 2 then -- 高级pvp
  720 + local dbKey = role:getPvpDBKey(RANK_PVP_HIGHT)
706 local redret = redisproxy:pipelining(function(red) 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 end) 725 end)
711 local score = role:unpackPvpScore(redret[1]) 726 local score = role:unpackPvpScore(redret[1])
712 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp 727 local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp
@@ -714,7 +729,7 @@ function _M.rankListRpc(agent, data) @@ -714,7 +729,7 @@ function _M.rankListRpc(agent, data)
714 for i = 1, #redret[3], 2 do 729 for i = 1, #redret[3], 2 do
715 local roleId = tonumber(redret[3][i]) 730 local roleId = tonumber(redret[3][i])
716 local score = role:unpackPvpScore(redret[3][i + 1]) 731 local score = role:unpackPvpScore(redret[3][i + 1])
717 - local online, curInfo = rpcRole(roleId, "friendSInfo") 732 + local online, curInfo = rpcRole(roleId, "pvpHRankInfo")
718 curInfo.score = score 733 curInfo.score = score
719 curInfo.roleId = roleId 734 curInfo.roleId = roleId
720 table.insert(rankList, curInfo) 735 table.insert(rankList, curInfo)
@@ -784,4 +799,69 @@ function _M.recordListRpc(agent, data) @@ -784,4 +799,69 @@ function _M.recordListRpc(agent, data)
784 return true 799 return true
785 end 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 return _M 867 return _M
788 \ No newline at end of file 868 \ No newline at end of file
src/actions/RoleAction.lua
@@ -22,7 +22,7 @@ local function validName(name) @@ -22,7 +22,7 @@ local function validName(name)
22 local exist = redisproxy:exists(string_format("user:%s", name)) 22 local exist = redisproxy:exists(string_format("user:%s", name))
23 if exist then return "existed" end 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 local legal = skynet.call(SERV, "lua", "check", name) 26 local legal = skynet.call(SERV, "lua", "check", name)
27 return legal and "ok" or "illegal" 27 return legal and "ok" or "illegal"
28 end 28 end
@@ -119,8 +119,7 @@ function _M.loginRpc( agent, data ) @@ -119,8 +119,7 @@ function _M.loginRpc( agent, data )
119 role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 119 role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查
120 120
121 -- 跨天登陆事件 121 -- 跨天登陆事件
122 - role:onCrossDay(now)  
123 - role:onResetRank(now) 122 + role:updateTimeReset(now)
124 role:setProperty("ltime", now) 123 role:setProperty("ltime", now)
125 redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) 124 redisproxy:zadd(FRIEND_RECOMMEND, now, roleId)
126 125
@@ -217,7 +216,7 @@ function _M.loginRpc( agent, data ) @@ -217,7 +216,7 @@ function _M.loginRpc( agent, data )
217 216
218 -- 发下缓存的世界消息 217 -- 发下缓存的世界消息
219 local worldChatResponse = {worldChats = {}} 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 if not ok then 220 if not ok then
222 msgs = {} 221 msgs = {}
223 end 222 end
@@ -246,7 +245,7 @@ function _M.loginRpc( agent, data ) @@ -246,7 +245,7 @@ function _M.loginRpc( agent, data )
246 role:saveHangTeam() 245 role:saveHangTeam()
247 role:savePvpCTeam() 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 return true 250 return true
252 end 251 end
@@ -297,7 +296,7 @@ function _M.createRpc(agent, data) @@ -297,7 +296,7 @@ function _M.createRpc(agent, data)
297 -- 欢迎邮件 296 -- 欢迎邮件
298 redisproxy:insertEmail({roleId = roleId, emailId = 1}) 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 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) 301 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response))
303 return true 302 return true
@@ -357,7 +356,7 @@ function _M.changeIntroRpc(agent, data) @@ -357,7 +356,7 @@ function _M.changeIntroRpc(agent, data)
357 local content = msg.content 356 local content = msg.content
358 if not content or type(content) ~= "string" then return end 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 local legal, mod = skynet.call(SERV, "lua", "check", content) 360 local legal, mod = skynet.call(SERV, "lua", "check", content)
362 if not legal then 361 if not legal then
363 content = mod or "" 362 content = mod or ""
@@ -472,9 +471,8 @@ function _M.openTimeBoxRpc(agent, data) @@ -472,9 +471,8 @@ function _M.openTimeBoxRpc(agent, data)
472 local boxId = boxL[slot].id 471 local boxId = boxL[slot].id
473 local itemData = csvdb["itemCsv"][boxId] 472 local itemData = csvdb["itemCsv"][boxId]
474 local randomData = csvdb["item_randomCsv"][itemData.id] 473 local randomData = csvdb["item_randomCsv"][itemData.id]
475 - reward = randomData.gift:toNumMap() -- 固定奖励  
476 -- 随机奖励 474 -- 随机奖励
477 - local reward = {} 475 + reward = {}
478 for i = 1, 10 do 476 for i = 1, 10 do
479 local num = randomData["num" .. i] 477 local num = randomData["num" .. i]
480 local gift = randomData["gift" .. i] 478 local gift = randomData["gift" .. i]
@@ -743,7 +741,7 @@ function _M.chatRpc(agent, data) @@ -743,7 +741,7 @@ function _M.chatRpc(agent, data)
743 -- 判断禁言 741 -- 判断禁言
744 local result = nil 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 local legal, mod = skynet.call(SERV, "lua", "check", content) 745 local legal, mod = skynet.call(SERV, "lua", "check", content)
748 if not legal then 746 if not legal then
749 content = mod or "" 747 content = mod or ""
@@ -798,7 +796,7 @@ function _M.chatRpc(agent, data) @@ -798,7 +796,7 @@ function _M.chatRpc(agent, data)
798 end 796 end
799 end 797 end
800 mcast_util.pub_world(actionCodes.Role_chat, MsgPack.pack(response)) 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 end, 800 end,
803 -- 私聊 801 -- 私聊
804 [2] = function () 802 [2] = function ()
@@ -5,7 +5,6 @@ require "GlobalVar" @@ -5,7 +5,6 @@ require "GlobalVar"
5 require "RedisKeys" 5 require "RedisKeys"
6 require "skynet.manager" 6 require "skynet.manager"
7 7
8 -local harbor = require "skynet.harbor"  
9 local queue = require "skynet.queue" 8 local queue = require "skynet.queue"
10 local netpack = require "skynet.netpack" 9 local netpack = require "skynet.netpack"
11 local socket = require "skynet.socket" 10 local socket = require "skynet.socket"
@@ -115,7 +114,11 @@ function rpcRole(roleId, funcName, ...) @@ -115,7 +114,11 @@ function rpcRole(roleId, funcName, ...)
115 end 114 end
116 else 115 else
117 local roleCross = require("models.RoleCross") 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 end 122 end
120 end 123 end
121 124
@@ -236,13 +239,12 @@ function CMD.close() @@ -236,13 +239,12 @@ function CMD.close()
236 mcast_util.usub_union() 239 mcast_util.usub_union()
237 local role = agentInfo.role 240 local role = agentInfo.role
238 if not role then return end 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 role:onOfflineEvent() 243 role:onOfflineEvent()
241 end 244 end
242 245
243 function CMD.exit() 246 function CMD.exit()
244 if agentInfo.role then 247 if agentInfo.role then
245 - -- role:log("logout", {online = skynet.timex()-role:getProperty("ltime")})  
246 datacenter.set("agent", agentInfo.role:getProperty("id"), nil) 248 datacenter.set("agent", agentInfo.role:getProperty("id"), nil)
247 end 249 end
248 skynet.exit() 250 skynet.exit()
@@ -298,9 +300,9 @@ skynet.start(function() @@ -298,9 +300,9 @@ skynet.start(function()
298 end 300 end
299 end) 301 end)
300 302
301 - redisd = harbor.queryname("REDIS") 303 + redisd = skynet.localname(".REDIS")
302 if tonumber(skynet.getenv "logd") == 1 then 304 if tonumber(skynet.getenv "logd") == 1 then
303 - logd = harbor.queryname("LOGD") 305 + logd = skynet.localname(".LOGD")
304 end 306 end
305 307
306 cs = queue() 308 cs = queue()
src/models/RolePvp.lua
@@ -22,13 +22,14 @@ end @@ -22,13 +22,14 @@ end
22 22
23 23
24 function Role:changePvpScore(rankKey, changeScoreCallback, matchId) 24 function Role:changePvpScore(rankKey, changeScoreCallback, matchId)
  25 + local dbKey = self:getPvpDBKey(rankKey)
25 local roleId = self:getProperty("id") 26 local roleId = self:getProperty("id")
26 local isPlayer = matchId ~= -1 27 local isPlayer = matchId ~= -1
27 local redret = redisproxy:pipelining(function(red) 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 if isPlayer then 31 if isPlayer then
31 - red:zscore(rankKey, matchId) 32 + red:zscore(dbKey, matchId)
32 end 33 end
33 end) 34 end)
34 local myScore = self:unpackPvpScore(redret[1]) 35 local myScore = self:unpackPvpScore(redret[1])
@@ -45,11 +46,11 @@ function Role:changePvpScore(rankKey, changeScoreCallback, matchId) @@ -45,11 +46,11 @@ function Role:changePvpScore(rankKey, changeScoreCallback, matchId)
45 46
46 local now = skynet.timex() 47 local now = skynet.timex()
47 redret = redisproxy:pipelining(function(red) 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 if isPlayer then 50 if isPlayer then
50 - red:zadd(rankKey, self:packPvpScore(matchScore, now), matchId) 51 + red:zadd(dbKey, self:packPvpScore(matchScore, now), matchId)
51 end 52 end
52 - red:zrevrank(rankKey, roleId) 53 + red:zrevrank(dbKey, roleId)
53 end) 54 end)
54 55
55 local myRank 56 local myRank
@@ -81,18 +82,42 @@ function Role:changePvpScoreCommon(matchId, isWin) @@ -81,18 +82,42 @@ function Role:changePvpScoreCommon(matchId, isWin)
81 return table.unpack(result) 82 return table.unpack(result)
82 end 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 function Role:changePvpScoreHigh(matchId, isWin) 107 function Role:changePvpScoreHigh(matchId, isWin)
  108 + local oldMyDivision
85 local function changeScoreCallback(myScore, matchScore) 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 if myScore >= division.division then 113 if myScore >= division.division then
90 - myMinScore = division.division 114 + myMinId = _id
91 end 115 end
92 if matchScore >= division.division then 116 if matchScore >= division.division then
93 - matchMinScore = division.division 117 + matchMinId = _id
94 end 118 end
95 end 119 end
  120 + oldMyDivision = myMinId
96 if isWin then 121 if isWin then
97 local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000))) 122 local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000)))
98 myScore = myScore + scoreChange 123 myScore = myScore + scoreChange
@@ -102,10 +127,28 @@ function Role:changePvpScoreHigh(matchId, isWin) @@ -102,10 +127,28 @@ function Role:changePvpScoreHigh(matchId, isWin)
102 myScore = myScore - scoreChange 127 myScore = myScore - scoreChange
103 matchScore = matchScore + scoreChange 128 matchScore = matchScore + scoreChange
104 end 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 end 131 end
107 132
108 local result = self:changePvpScore(RANK_PVP_HIGHT, changeScoreCallback, matchId) 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 self:refreshPvpMatchH(result[1]) 152 self:refreshPvpMatchH(result[1])
110 return table.unpack(result) 153 return table.unpack(result)
111 end 154 end
@@ -122,20 +165,21 @@ function Role:refreshPvpMatch(score, rankKey) @@ -122,20 +165,21 @@ function Role:refreshPvpMatch(score, rankKey)
122 } 165 }
123 local mField = Fields[rankKey] 166 local mField = Fields[rankKey]
124 local robotCsv = RobotCsvs[rankKey] 167 local robotCsv = RobotCsvs[rankKey]
  168 + local dbKey = self:getPvpDBKey(rankKey)
125 169
126 local roleId = self:getProperty("id") 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 local function getPlayers(levels) 173 local function getPlayers(levels)
130 local redret = redisproxy:pipelining(function(red) 174 local redret = redisproxy:pipelining(function(red)
131 for _, level in ipairs(levels) do 175 for _, level in ipairs(levels) do
132 local low, high = table.unpack(level) 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 end 181 end
138 - red:zrem(rankKey, "std_temp1", "std_temp2") 182 + red:zrem(dbKey, "std_temp1", "std_temp2")
139 end) 183 end)
140 184
141 local PreGetCount = 7 185 local PreGetCount = 7
@@ -147,7 +191,7 @@ function Role:refreshPvpMatch(score, rankKey) @@ -147,7 +191,7 @@ function Role:refreshPvpMatch(score, rankKey)
147 rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1) 191 rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1)
148 rank1 = rank2 + PreGetCount - 1 192 rank1 = rank2 + PreGetCount - 1
149 end 193 end
150 - red:ZREVRANGE(rankKey, rank2, rank1) 194 + red:ZREVRANGE(dbKey, rank2, rank1)
151 end 195 end
152 end) 196 end)
153 return redret 197 return redret
@@ -288,6 +332,26 @@ function Role:refreshPvpMatchH(score) @@ -288,6 +332,26 @@ function Role:refreshPvpMatchH(score)
288 self:refreshPvpMatch(score, RANK_PVP_HIGHT) 332 self:refreshPvpMatch(score, RANK_PVP_HIGHT)
289 end 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 end 355 end
292 356
293 357