Commit 1b20cfdbbf56544c1a47b33f0ead1b2c473827f1

Authored by zhouhaihai
1 parent 71f716c4

赛季更新完善 无尽冒险排行榜

.gitignore
... ... @@ -2,3 +2,4 @@
2 2 dump.rdb
3 3 .DS_Store
4 4 src/.idea
  5 +*.pyc
... ...
src/ProtocolCode.lua
... ... @@ -61,6 +61,7 @@ actionCodes = {
61 61 Adv_wearArtifactRpc = 166,
62 62 Adv_upArtifactRpc = 167,
63 63 Adv_repayWheelSurfRpc = 168,
  64 + Adv_rankRpc = 169,
64 65  
65 66 Hero_loadInfos = 201,
66 67 Hero_updateProperty = 202,
... ...
src/RedisKeys.lua
... ... @@ -16,38 +16,18 @@ R_EMAIL_ITEM = "email:%d:%d" --邮件
16 16 RANK_TOWER = "rank:tower"
17 17 RANK_TOWER_INFO = "rank:tower:info"
18 18  
  19 +-- adv
  20 +RANK_ADV = "rank:adv"
  21 +RANK_ADV_INFO = "rank:adv:info"
  22 +
19 23 RANK_DINER = {"rank:diner1", "rank:diner2"} -- 餐厅排行榜 两个每天互换
20 24 RANK_DINER_INFO = "rank:diner:info"
21 25  
22 26 RANK_PVP_COMMON = "rank:pvpc"
23 27 RECORD_PVP_COMMON = "record:pvpc:%d"
24 28 RANK_PVP_HIGHT = "rank:pvph"
25   --- -- role
26   --- R_FARM_KEY = "role:%d:farm"
27   --- R_TOWER_KEY = "role:%d:tower"
28   --- R_COOKLOG_KEY = "role:%d:cooklog"
29   --- R_TRADELOG_KEY = "role:%d:tradelog"
30   --- R_PVP_KEY = "role:%d:pvp"
31   --- R_DINER_KEY = "role:%d:diner"
32   --- -- rank
33   --- RANK_PVP = "rank:pvp"
34   --- RANK_TRADE = "rank:trade"
35   --- RANK_TOWER = "rank:tower"
36   --- RANK_BOX = "rank:box" -- 盒子舒适度排行榜
37   --- MAP_LIKE = "map:box:like" --点赞个数
38   --- RANK_LEVEL = "rank:level" --等级排名
39   --- RANK_ITEM = "rank:item" --活动物品排行
40   --- -- 日志
41   --- NOTE_COOK_KEY = "note:cook:%d"
42   -
43   --- TRADE_KEY = "trade:%d"
44   --- TRADE_ID_KEY = "tradeIDs"
45 29  
46   --- TASK_ACTIVE = "task:%d:active" -- 记录激活的任务
47   --- TASK_FINISH = "task:%d:finish" -- 记录完成的任务
48 30  
49   --- BOSS_SET = "boss:%d:%d"
50   --- BOSS_INFO = "boss:battle"
51 31  
52 32 FRIEND_KEY = "role:%d:friend" --哈希表 好友
53 33 FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表
... ...
src/actions/AdvAction.lua
... ... @@ -18,6 +18,23 @@ local AdvCommon = require "adv.AdvCommon"
18 18  
19 19 local _M = {}
20 20  
  21 +-- 无尽模式是否开放
  22 +local function isOpenEndless(role)
  23 + if role.advOverTime ~= 0 and skynet.timex() >= role.advOverTime then
  24 + return false
  25 + end
  26 + return true
  27 +end
  28 +-- 冒险内的操作是否可以继续
  29 +local function isCanContinue(role)
  30 + local adv = role:getAdvData()
  31 + if not adv:isRunning() then return false end
  32 + if adv:isEndless() then
  33 + if not isOpenEndless(role) then return false end
  34 + end
  35 + return true
  36 +end
  37 +
21 38  
22 39 local function checkFormat(role, format, checkAdvTeam)
23 40 local advHang = role:getProperty("advHang")
... ... @@ -69,7 +86,7 @@ function _M.startAdvRpc( agent, data )
69 86 local format = msg.format --编队
70 87  
71 88 --上一个关卡结束才可以开始新的关卡
72   - if next(role:getProperty("advInfo")) then return 8 end
  89 + if role:getAdvData():isRunning() then return 8 end
73 90  
74 91 local chapterData = csvdb["adv_chapterCsv"][chapterId]
75 92 if not chapterData or layer < 1 then return 1 end
... ... @@ -79,6 +96,8 @@ function _M.startAdvRpc( agent, data )
79 96  
80 97 local advPass = role:getProperty("advPass")
81 98 if AdvCommon.isEndless(chapterId) then
  99 + if chapterId ~= role.advElChapter then return end -- 不是当前进行的章节
  100 + if not isOpenEndless(role) then return end
82 101 if role.dailyData:getProperty("advElC") >= role:getAdvElLimit() then return 2 end -- 是否有体力
83 102 if not role:isFuncOpen(FuncOpenType.AdvEndless) or not role:isFuncOpen(FuncOpenType.AdvRelay) then return 11 end -- 开放了中继模式 和 无尽模式 才可以玩儿无尽模式
84 103 local maxl = math.floor(role:getProperty("advElM") / 10) * 10
... ... @@ -147,7 +166,7 @@ function _M.startHangRpc(agent, data)
147 166  
148 167 if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力
149 168  
150   - if not checkFormat(role, format, next(role:getProperty("advInfo"))) then return end --编队是否正确
  169 + if not checkFormat(role, format, role:getAdvData():isRunning()) then return end --编队是否正确
151 170  
152 171 local battleV = 0
153 172 for _, heroId in pairs(format.heros) do
... ... @@ -167,7 +186,7 @@ function _M.startHangRpc(agent, data)
167 186 info.time = skynet.timex() + chapterData.idleTime --挂机时间
168 187  
169 188 -- 没有在战斗 用team来挂机了 把team清掉
170   - if not next(role:getProperty("advInfo")) then
  189 + if not role:getAdvData():isRunning() then
171 190 role:updateProperty({field = "advTeam", value = {}})
172 191 end
173 192  
... ... @@ -248,6 +267,7 @@ function _M.finishTaskRpc(agent, data)
248 267 local role = agent.role
249 268 local msg = MsgPack.unpack(data)
250 269  
  270 + if not isCanContinue(role) then return end
251 271 local adv = role:getAdvData()
252 272 local taskId = msg.taskId -- -1 则是主线任务
253 273 local status, reward
... ... @@ -270,7 +290,9 @@ function _M.clickBlockRpc(agent, data)
270 290 local role = agent.role
271 291 local msg = MsgPack.unpack(data)
272 292  
  293 + if not isCanContinue(role) then return end
273 294 local adv = role:getAdvData()
  295 +
274 296 if adv:isWaitChooseArtifact() then return end
275 297 local status, errorCode = adv:clickBlock(msg.roomId, msg.blockId, msg)
276 298 if not status then return errorCode end
... ... @@ -290,6 +312,7 @@ function _M.useItemRpc(agent, data)
290 312 local itemData = csvdb["adv_itemCsv"][itemId]
291 313 if not itemData then return end
292 314  
  315 + if not isCanContinue(role) then return end
293 316 local adv = role:getAdvData()
294 317 if adv:isWaitChooseArtifact() then return end
295 318 --重置数量
... ... @@ -337,7 +360,8 @@ function _M.usePotionRpc(agent, data)
337 360 local potionBag = role:getProperty("potionBag")
338 361 local own = potionBag[potionId] or 0
339 362 if own <= 0 then return 4 end
340   -
  363 +
  364 + if not isCanContinue(role) then return end
341 365 local adv = role:getAdvData()
342 366 if adv:isWaitChooseArtifact() then return end
343 367  
... ... @@ -359,8 +383,10 @@ end
359 383 function _M.chooseArtifactRpc(agent, data)
360 384 local role = agent.role
361 385 local msg = MsgPack.unpack(data)
362   - local adv = role:getAdvData()
363 386  
  387 + if not isCanContinue(role) then return end
  388 +
  389 + local adv = role:getAdvData()
364 390 if not msg.idx then return end
365 391 if not adv:isWaitChooseArtifact() then return end
366 392 local status = adv:chooseArtifact(msg.idx)
... ... @@ -378,6 +404,8 @@ function _M.wearArtifactRpc(agent, data)
378 404 local slot = msg.slot
379 405 local id = msg.id
380 406  
  407 + if not isCanContinue(role) then return end
  408 +
381 409 local adv = role:getAdvData()
382 410  
383 411 if math.illegalNum(slot, 1, 5) then return 1 end
... ... @@ -398,6 +426,8 @@ function _M.upArtifactRpc(agent, data)
398 426 local msg = MsgPack.unpack(data)
399 427 local id = msg.id
400 428  
  429 + if not isCanContinue(role) then return end
  430 +
401 431 local adv = role:getAdvData()
402 432 if adv:isWaitChooseArtifact() then return 1 end
403 433 local curLevel = adv:isHaveArtifact(id)
... ... @@ -421,6 +451,8 @@ end
421 451 function _M.exitAdvRpc(agent, data)
422 452 local role = agent.role
423 453 -- local msg = MsgPack.unpack(data)
  454 + if not isCanContinue(role) then return end
  455 +
424 456 local adv = role:getAdvData()
425 457 local status = adv:exit() -- target {roomId = 1, blockId = 1} 选择的目标
426 458 SendPacket(actionCodes.Adv_exitAdvRpc, MsgPack.pack({events = adv:popBackEvents()}))
... ... @@ -438,8 +470,10 @@ function _M.startBattleRpc(agent, data)
438 470 local monsterId = msg.monsterId
439 471 local enemyId = msg.enemyId
440 472 if not enemyId then return end
  473 + if not isCanContinue(role) then return end
441 474  
442 475 local adv = role:getAdvData()
  476 +
443 477 if adv:isWaitChooseArtifact() then return end
444 478 local enemy = adv.battle:getEnemyById(enemyId)
445 479  
... ... @@ -467,6 +501,8 @@ function _M.endBattleRpc(agent, data)
467 501 local bySkill = msg.bySkill --死于 技能
468 502  
469 503 if not player or not player.hp or not player.sp or not enemyId or not key then return end
  504 + if not isCanContinue(role) then return end
  505 +
470 506 local adv = role:getAdvData()
471 507 if adv:isWaitChooseArtifact() then return end
472 508 -- 校验
... ... @@ -597,7 +633,7 @@ function _M.finishAchievRpc(agent, data)
597 633 local taskId = msg.taskId -- 领取id
598 634  
599 635 local adv = role:getAdvData()
600   -
  636 +
601 637 local status, reward
602 638 -- if ctype == 1 then
603 639 -- status = adv:finishAchievement(chapterId, taskId)
... ... @@ -610,5 +646,40 @@ function _M.finishAchievRpc(agent, data)
610 646 return true
611 647 end
612 648  
  649 +function _M.rankRpc(agent, data)
  650 + local role = agent.role
  651 +
  652 + local list = {}
  653 + local ids = redisproxy:zrevrange(RANK_ADV, 0 , 99)
  654 + local redret = {}
  655 + if ids and next(ids) then
  656 + redret = redisproxy:pipelining(function (red)
  657 + for i = 1, #ids do
  658 + local roleId = ids[i]
  659 + table.insert(list, {roleId = tonumber(roleId)})
  660 + red:hget(RANK_ADV_INFO, roleId)
  661 + end
  662 + end)
  663 + end
  664 + for i = 1, #redret do
  665 + local player = MsgPack.unpack(redret[i])
  666 + player.format = nil
  667 + list[i].player = player
  668 + end
  669 + local redret = redisproxy:pipelining(function(red)
  670 + red:ZREVRANK(RANK_ADV, role:getProperty("id"))
  671 + red:zscore(RANK_ADV, role:getProperty("id"))
  672 + end)
  673 + local rank = redret[1]
  674 + if not rank then
  675 + rank = -1
  676 + else
  677 + rank = redret[1] + 1
  678 + end
  679 + local score = tonum(redret[2], 0)
  680 +
  681 + SendPacket(actionCodes.Adv_rankRpc, MsgPack.pack({list = list, rank = rank, score = score}))
  682 + return true
  683 +end
613 684  
614 685 return _M
615 686 \ No newline at end of file
... ...
src/actions/GmAction.lua
... ... @@ -204,13 +204,7 @@ end
204 204  
205 205 table.insert(helpDes, {"冒险清除" , "advc"})
206 206 function _M.advc(role, pms)
207   - role:updateProperty({field = "advInfo", value = {}})
208   - role:updateProperty({field = "advTask", value = {}})
209   - role:updateProperty({field = "advItems", value = ""})
210   - role:updateProperty({field = "advTeam", value = {}})
211   - role:updateProperty({field = "advAFGet", value = {}})
212   - role:updateProperty({field = "advAFWear", value = {}})
213   - role.advData = nil
  207 + role:getAdvData():forceOver()
214 208 return "成功"
215 209 end
216 210  
... ...
src/actions/RoleAction.lua
... ... @@ -116,7 +116,7 @@ function _M.loginRpc( agent, data )
116 116 SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start")
117 117  
118 118 role:changeStructVersion() -- 数据结构 版本更新
119   - role:advEndlessSeasonCheck() -- 冒险赛季更新检查
  119 + role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查
120 120  
121 121 -- 跨天登陆事件
122 122 role:onCrossDay(now)
... ...
src/adv/Adv.lua
... ... @@ -99,9 +99,30 @@ function Adv:clear()
99 99 self.shopStatus = {}
100 100 end
101 101  
  102 +function Adv:isRunning()
  103 + if self.chapterId then return true end
  104 + return false
  105 +end
  106 +
  107 +-- 强制结束
  108 +function Adv:forceOver(notNotify)
  109 + if self:isRunning() then
  110 + self:clear()
  111 + local advTeam = self.owner:getProperty("advTeam")
  112 + advTeam.player = nil
  113 + self.owner:updateProperties({
  114 + advInfo = {},
  115 + advTeam = advTeam,
  116 + advItems = "",
  117 + advAFGet = {},
  118 + advAFWear = {},
  119 + }, notNotify)
  120 + end
  121 +end
  122 +
102 123 function Adv:saveDB(notNotify)
103 124 local advInfo, advTeam = {}, self.owner:getProperty("advTeam")
104   - if self.chapterId then
  125 + if self:isRunning() then
105 126  
106 127 advInfo.chapterId = self.chapterId
107 128 advInfo.level = self.level
... ... @@ -401,14 +422,33 @@ function Adv:over(success, isAllPass)
401 422 self.owner:checkTaskEnter("AdvAllPass", {id = self.chapterId})
402 423 end
403 424  
  425 + local roleId = self.owner:getProperty("id")
  426 + local oldMaxScore = tonum(redisproxy:zscore(RANK_ADV, roleId))
  427 + if score > oldMaxScore then
  428 + local team = self.owner:getProperty("advTeam")
  429 + local curInfo = {
  430 + name = self.owner:getProperty("name"),
  431 + headId = self.owner:getProperty("headId"),
  432 + lv = self.owner:getProperty("level"),
  433 + batteV = self:getTeamBattleValue(team.heros),
  434 + chapter = self.chapterId,
  435 + format = self.owner:getTeamHerosInfo(team.heros),
  436 + }
  437 + redisproxy:pipelining(function (red)
  438 + red:zadd(RANK_ADV, score, roleId) --更新分数
  439 + red:hset(RANK_ADV_INFO, roleId, MsgPack.pack(curInfo))
  440 + end)
  441 + end
404 442 end
405 443 self:clearAdvUnlockCache()
406 444 self:clear()
407 445 self.owner:checkTaskEnter("AdvScore", {score = score})
408   - self.owner:updateProperty({field = "advItems", value = ""})
409   - self.owner:updateProperty({field = "advAFGet", value = {}})
410   - self.owner:updateProperty({field = "advAFWear", value = {}})
411 446  
  447 + self.owner:updateProperties({
  448 + advItems = "",
  449 + advAFGet = {},
  450 + advAFWear = {},
  451 + })
412 452 self:backEnd(success, score, scoreInfo, reward)
413 453 end
414 454  
... ...
src/models/Role.lua
... ... @@ -21,6 +21,9 @@ function Role:ctor( properties )
21 21 self.heros = {}
22 22 self.runeBag = {}
23 23 self.advData = nil
  24 +
  25 + self.advElChapter = tonum(redisproxy:hget("adv_season", "chapter"), globalCsv.adv_endless_default_chapter) -- 无尽模式记录的赛季对应章节
  26 + self.advOverTime = tonum(redisproxy:hget("adv_season", "overTime")) -- 无尽模式关闭时间戳
24 27 end
25 28  
26 29 Role.schema = {
... ... @@ -64,7 +67,7 @@ Role.schema = {
64 67 advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status, -1 = pt, pts = {}}, }
65 68 advL = {"table", {0, 0}}, -- 冒险队等级 {lv, exp}
66 69 advElM = {"number", 0}, -- 无尽模式通关的最高层数 endless max layer
67   - advElS = {"number", globalCsv.adv_endless_season}, -- 无尽模式记录的赛季 endless season
  70 + advElS = {"number", 0}, -- 无尽模式记录的赛季 endless season
68 71 advAFOpen = {"table", {}}, -- 解锁的神器 {[id] = 1}
69 72 advAFGet = {"table", {}}, -- 当前拥有的神器 {[id] = 等级}
70 73 advAFWear = {"table", {}}, -- 当前拥有的神器 {[slot] = id}
... ... @@ -254,6 +257,8 @@ function Role:data()
254 257 advAchiev = self:getProperty("advAchiev"),
255 258 advL = self:getProperty("advL"),
256 259 advElM = self:getProperty("advElM"),
  260 + advElChapter = self.advElChapter,
  261 + advOverTime = self.advOverTime,
257 262 advAFGet = self:getProperty("advAFGet"),
258 263 advAFWear = self:getProperty("advAFWear"),
259 264 advDrawB = self:getProperty("advDrawB"),
... ...
src/models/RolePlugin.lua
... ... @@ -772,12 +772,36 @@ function RolePlugin.bind(Role)
772 772 end
773 773  
774 774 -- 赛季检查
775   - function Role:advEndlessSeasonCheck()
776   - if self:getProperty("advElS") ~= globalCsv.adv_endless_season then
  775 + function Role:advEndlessSeasonCheck(notNotify)
  776 + -- 重置一下冒险
  777 + local nowSeason = tonum(redisproxy:hget("adv_season", "idx"))
  778 + if self:getProperty("advElS") ~= nowSeason then
777 779 local ml = self:getProperty("advElM")
  780 +
778 781 local nl = math.max(0, ml - (math.floor(ml / 50) + 2) * 10)
779 782 self:setProperty("advElM", math.floor(nl / 10) * 10)
780   - self:setProperty("advElS", globalCsv.adv_endless_season)
  783 + self:setProperty("advElS", nowSeason)
  784 +
  785 + -- 正在无尽冒险清掉
  786 + local adv = self:getAdvData()
  787 + if adv:isRunning() and adv:isEndless() then
  788 + adv:forceOver()
  789 + end
  790 +
  791 + -- 重新设定冒险章节和冒险结束时间
  792 + self.advElChapter = tonum(redisproxy:hget("adv_season", "chapter"), globalCsv.adv_endless_default_chapter)
  793 + self.advOverTime = tonum(redisproxy:hget("adv_season", "overTime"))
  794 +
  795 + if not notNotify then
  796 + SendPacket(actionCodes.Role_updateProperties, MsgPack.pack({
  797 + advElChapter = self.advElChapter,
  798 + advOverTime = self.advOverTime,
  799 + }))
  800 + end
  801 + -- 清掉冒险手册
  802 + self:updateProperties({
  803 + advEAchiev = {},
  804 + }, notNotify)
781 805 end
782 806 end
783 807  
... ...
src/python/adv_season.py 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +
  2 +from redisCommon import redis, pipe, decode, encode
  3 +
  4 +import time, datetime
  5 +
  6 +
  7 +lastOverTime = int(time.mktime(datetime.date.today().timetuple())) + 3600 * 24 * 14 #取当天0点
  8 +
  9 +
  10 +
  11 +
  12 +
... ...
src/python/redisCommon.py 0 → 100644
... ... @@ -0,0 +1,78 @@
  1 +from redis import Redis
  2 +import msgpack
  3 +
  4 +redisConf = {
  5 + "host" : "127.0.0.1",
  6 + "port" : 6100,
  7 + "db" : 1,
  8 + "password" : None,
  9 +}
  10 +
  11 +
  12 +def numberUnpack(n) :
  13 + if isinstance(n, bytes) :
  14 + try:
  15 + return int(n)
  16 + except ValueError:
  17 + try:
  18 + return float(n)
  19 + except ValueError:
  20 + pass
  21 + return n.decode()
  22 + else :
  23 + return n
  24 +
  25 +def stringUnpack(s) :
  26 + if isinstance(s, bytes) :
  27 + return n.decode()
  28 + else :
  29 + return s
  30 +
  31 +def tableUnpack(t) :
  32 + if isinstance(t, bytes) :
  33 + return msgpack.unpackb(t, raw = False) #解包
  34 + else :
  35 + return t
  36 +
  37 +redisUnpack = {
  38 + "number" : numberUnpack,
  39 + "string" : stringUnpack,
  40 + "table" : tableUnpack,
  41 + "default" : numberUnpack,
  42 +}
  43 +def commonPack(w) :
  44 + return w
  45 +
  46 +def tablePack(t):
  47 + return msgpack.packb(t, use_bin_type = True)
  48 +
  49 +redisPack = {
  50 + "default" : commonPack,
  51 + "table" : tablePack,
  52 +}
  53 +
  54 +
  55 +
  56 +
  57 +redis = Redis(
  58 + host = redisConf["host"],
  59 + port = redisConf["port"],
  60 + db = redisConf["db"],
  61 + password = redisConf["password"]
  62 +)
  63 +
  64 +pipe = redis.pipeline()
  65 +
  66 +def decode(w, t = "default"):
  67 + return redisUnpack[t](w)
  68 +
  69 +def encode(w, t = "default") :
  70 + return redisPack[t](w)
  71 +
  72 +
  73 +
  74 +
  75 +
  76 +
  77 +
  78 +
... ...
src/python/requirements.txt 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +redis
  2 +msgpack
0 3 \ No newline at end of file
... ...
src/services/dbseed.lua
... ... @@ -23,6 +23,9 @@ local function initRedisDb( ... )
23 23 redisproxy:hsetnx("autoincrement_set", "email", 0)
24 24 redisproxy:hsetnx("autoincrement_set", "emailTimestamp", 0)
25 25 redisproxy:hsetnx("autoincrement_set", "delay_email", 0)
  26 + redisproxy:hsetnx("adv_season", "idx", 0)
  27 + redisproxy:hsetnx("adv_season", "chapter", globalCsv.adv_endless_default_chapter)
  28 + redisproxy:hsetnx("adv_season", "overTime", 0)
26 29 end
27 30 end
28 31  
... ...