Commit cfd68b3aaba9633400e8fd6929f9dc9b77c42cb6

Authored by zhouhaihai
1 parent 875e5071

时间重置 新逻辑

src/models/Role.lua
1 1 local Role = class("Role", require("shared.ModelBase"))
2 2  
3   -local RoleLog = import(".RoleLog")
4   -local RolePlugin = import(".RolePlugin")
5   -local RoleTask = import(".RoleTask")
6   -local RoleActivity = import(".RoleActivity")
7   -local RoleChangeStruct = import(".RoleChangeStruct")
8   -local RolePvp = import(".RolePvp")
9   -local RoleCross = import(".RoleCross")
  3 +local RoleLog = import(".RoleLog") --日志相关
  4 +local RolePlugin = import(".RolePlugin") --基础功能
  5 +local RoleTimeReset = import(".RoleTimeReset") --时间重置相关
  6 +local RoleTask = import(".RoleTask") --角色任务
  7 +local RoleActivity = import(".RoleActivity") --活动相关
  8 +local RoleChangeStruct = import(".RoleChangeStruct") --角色数据额结构更改
  9 +local RolePvp = import(".RolePvp") -- pvp
  10 +local RoleCross = import(".RoleCross") -- 跨服务请求相关
10 11  
11 12 RoleLog.bind(Role)
12 13 RolePlugin.bind(Role)
  14 +RoleTimeReset.bind(Role)
13 15 RoleTask.bind(Role)
14 16 RoleActivity.bind(Role)
15 17 RoleChangeStruct.bind(Role)
... ... @@ -42,6 +44,7 @@ Role.schema = {
42 44 ctime = {"number", skynet.timex()}, -- 创建时间
43 45 ignoreMt = {"number", 0}, -- 忽略维护拦截
44 46 sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本
  47 + timeReset = {"table", {}}, --重置轮回记录
45 48 diamond = {"number", 0},
46 49 reDiamond = {"number", 0},
47 50 setting = {"table", {}}, --设置
... ... @@ -107,6 +110,9 @@ Role.schema = {
107 110 pvpTBH = {"table", {}}, -- pvp 他人可用的战斗信息
108 111 pvpTBVH = {"table", {}}, -- pvp 他人可用的战斗力
109 112 pvpMH = {"table", {}}, -- pvp 匹配的对手 高级 {{t = 1, id = roleId}, {t = 2, id = id}, {t = 2, id = id}} -- t 1 玩家 2 机器人
  113 + pvpHGift = {"table", {}}, -- pvp 高级段位每小时奖励缓存
  114 + pvpHGTime = {"number", 0}, -- pvp 高级段位上次奖励刷新时间
  115 + pvpShop = {"table", {}}, -- pvp 商店{id = count} 对应商店id 购买次数
110 116  
111 117  
112 118 potionBag = {"table", {}}, -- 营养剂背包
... ... @@ -247,6 +253,7 @@ function Role:data()
247 253 funcOpen = self:getProperty("funcOpen"),
248 254 funcLv = self:getProperty("funcLv"),
249 255 -- loveStatus = self:getProperty("loveStatus"):toNumMap(),
  256 + timeReset = self:getProperty("timeReset"),
250 257 diamond = self:getAllDiamond(),
251 258 bagLimit = self:getProperty("bagLimit"),
252 259 silent = self:getProperty("silent"),
... ... @@ -284,6 +291,9 @@ function Role:data()
284 291  
285 292 pvpTC = self:getProperty("pvpTC"),
286 293 pvpTH = self:getProperty("pvpTH"),
  294 + pvpHGift = self:getProperty("pvpHGift"),
  295 + pvpHGTime = self:getProperty("pvpHGTime"),
  296 + pvpShop = self:getProperty("pvpShop"),
287 297  
288 298 potionBag = self:getProperty("potionBag"),
289 299 storyB = self:getProperty("storyB"),
... ...
src/models/RoleCross.lua
... ... @@ -55,6 +55,18 @@ RoleCross.bind = function (Role)
55 55 return info
56 56 end
57 57  
  58 + -- 高级pvp 排行榜
  59 + function Role:pvpHRankInfo()
  60 + local info = {
  61 + name = self:getProperty("name"),
  62 + level = self:getProperty("level"),
  63 + headId = self:getProperty("headId"),
  64 + ltime = self:getProperty("ltime"),
  65 + battleV = self:getProperty("pvpTBVH"),
  66 + }
  67 + return info
  68 + end
  69 +
58 70 function Role:accountInit(initData)
59 71 -- 道具
60 72 local reward = {}
... ... @@ -295,6 +307,19 @@ function CMD.pvpHInfo(roleId)
295 307 }
296 308 end
297 309  
  310 +-- 高级pvp 排行榜
  311 +function CMD:pvpHRankInfo()
  312 + local info = CMD.getProperties(roleId, {"name", "level", "headId", "pvpTBVH", "ltime"})
  313 + local info = {
  314 + name = info.name,
  315 + level = info.level,
  316 + headId = info.headId,
  317 + ltime = info.ltime,
  318 + battleV = info.pvpTBVH,
  319 + }
  320 + return info
  321 +end
  322 +
298 323 RoleCross.handle = function(cmd, roleId, ...)
299 324 SRole = SRole or require("models.Role")
300 325 if CMD[cmd] then
... ...
src/models/RolePlugin.lua
... ... @@ -19,64 +19,6 @@ function RolePlugin.bind(Role)
19 19 SendPacket(...)
20 20 end
21 21  
22   - function Role:onCrossDay(now, notify)
23   - local ltime = self:getProperty("ltime")
24   -
25   - if isCrossDay(ltime, now) then
26   - local response = {}
27   -
28   - self.dailyData:refreshDailyData(notify)
29   - self.dinerData:refreshDailyData(notify)
30   - self:setProperty("dTask", {})
31   - self:advRandomSupportEffect()
32   - response.dTask = {}
33   - response.advSup = self:getProperty("advSup")
34   -
35   -
36   - if isCrossWeek(ltime, now) then
37   - self:setProperties({
38   - wTask = {},
39   - dinerS = {},
40   - })
41   - response.wTask = {}
42   - response.dinerS = {}
43   - end
44   -
45   - if notify then
46   - self:notifyUpdateProperties(response)
47   - end
48   -
49   - if RESET_TIME == RESET_RANK_TIME then
50   - self:onResetRank_raw(ltime, now, notify)
51   - end
52   - self:setProperty("ltime", now)
53   -
54   - return true
55   - end
56   - end
57   -
58   - function Role:onResetRank(now, notify)
59   - local ltime = self:getProperty("ltime")
60   - if isCrossDay(ltime, now, RESET_RANK_TIME) then
61   - local response = self:onResetRank_raw(ltime, now, notify)
62   -
63   - if notify and next(response) then
64   - self:notifyUpdateProperties(response)
65   - end
66   -
67   - self:setProperty("ltime", now)
68   - return true
69   - end
70   - end
71   -
72   - function Role:onResetRank_raw(ltime, now, notify)
73   - local response = {}
74   -
75   - self.dinerData:rankResetData(notify)
76   -
77   - return response
78   - end
79   -
80 22 function Role:onOfflineEvent()
81 23 -- 设置最新的登录时间
82 24 self:setProperty("ltime", skynet.timex())
... ... @@ -884,8 +826,9 @@ function RolePlugin.bind(Role)
884 826 self:updateProperty({field = "advSup", value = advSup, notNotify = notNotify})
885 827 end
886 828  
887   - local StdDinerRankTime = toUnixtime("20190101"..string.format("%02x", RESET_RANK_TIME)) --跨天时间
  829 +
888 830 function Role:getCurDinerRankKey()
  831 + local StdDinerRankTime = toUnixtime("20190101"..string.format("%02x", math.floor(self:getTimeResetDataStart(TimeReset.DinerRank) / 3600))) --跨天时间
889 832 local now = skynet.timex()
890 833 local idx = 1
891 834 if math.floor((now - StdDinerRankTime) / 86400) % 2 == 1 then
... ... @@ -1121,6 +1064,7 @@ function RolePlugin.bind(Role)
1121 1064  
1122 1065 -- update
1123 1066 function Role:onRecoverTimer(now)
  1067 + self:updateTimeReset(now, true)
1124 1068 self:checkNewEvent(now)
1125 1069 end
1126 1070  
... ...
src/models/RoleTimeReset.lua 0 → 100644
... ... @@ -0,0 +1,124 @@
  1 +local RoleTimeReset = {}
  2 +
  3 +RoleTimeReset.bind = function (Role)
  4 +
  5 +-- 重置内容 对应 GlobalVar TimeReset
  6 +local ResetFunc = {}
  7 +ResetFunc["CrossDay"] = function(self, notify, response)
  8 + self.dailyData:refreshDailyData(notify)
  9 + self.dinerData:refreshDailyData(notify)
  10 +
  11 + self:setProperty("dTask", {})
  12 + self:advRandomSupportEffect()
  13 +
  14 + response.dTask = {}
  15 + response.advSup = self:getProperty("advSup")
  16 +end
  17 +
  18 +ResetFunc["CrossWeek"] = function(self, notify, response)
  19 + self:setProperties({
  20 + wTask = {},
  21 + dinerS = {},
  22 + })
  23 + response.wTask = {}
  24 + response.dinerS = {}
  25 +end
  26 +
  27 +
  28 +ResetFunc["DinerRank"] = function(self, notify, response)
  29 + self.dinerData:rankResetData(notify)
  30 +end
  31 +
  32 +ResetFunc["PvpShop"] = function(self, notify, response)
  33 + self:setProperty("pvpShop", {})
  34 + response.pvpShop = {}
  35 +end
  36 +
  37 +
  38 +function Role:updateTimeReset(now, notify)
  39 + local timeReset = self:getProperty("timeReset")
  40 +
  41 + local passTime = now - START_RESET_TIME
  42 +
  43 + local needResetId = {}
  44 + for resetId, resetData in pairs(csvdb["time_resetCsv"]) do
  45 + local curRound = math.floor((passTime - resetData.start) / resetData.interval)
  46 + if not timeReset[resetId] or curRound ~= timeReset[resetId] then
  47 + needResetId[resetId] = curRound
  48 + end
  49 + end
  50 + if not next(needResetId) then return end
  51 +
  52 + local response = {}
  53 + for funcName, resetId in pairs(TimeReset) do
  54 + if needResetId[resetId] and ResetFunc[funcName] then
  55 + ResetFunc[funcName](self, notify, response)
  56 + end
  57 + end
  58 +
  59 + for resetId, round in pairs(needResetId) do
  60 + timeReset[resetId] = round
  61 + end
  62 + self:setProperty("timeReset", timeReset)
  63 + response.timeReset = timeReset
  64 +
  65 + if notify then
  66 + self:notifyUpdateProperties(response)
  67 + end
  68 +end
  69 +
  70 +-- 持续时间取 min(interval, duration) duration 填 0 默认使用 interval 作为持续时间
  71 +local function getTimeResetDuration(rtype)
  72 + local resetData = csvdb["time_resetCsv"][rtype]
  73 + if not resetData then return 0 end
  74 + return resetData.duration == 0 and resetData.interval or math.min(resetData.interval, resetData.duration)
  75 +end
  76 +
  77 +--检查功能是否是在开放期
  78 +function Role:isTimeResetOpen(rtype)
  79 + local resetData = csvdb["time_resetCsv"][rtype]
  80 + if not resetData or getTimeResetDuration(rtype) >= resetData.interval then
  81 + return true
  82 + end
  83 +
  84 + return self:getTimeResetEndTime(rtype) > skynet.timex()
  85 +end
  86 +
  87 +-- 当前轮次 开始时间
  88 +function Role:getTimeResetStartTime(rtype)
  89 + local timeReset = self:getProperty("timeReset")
  90 + if not timeReset[rtype] then return 0 end
  91 + local resetData = csvdb["time_resetCsv"][rtype]
  92 + if not resetData then return 0 end
  93 + return START_RESET_TIME + timeReset[rtype] * resetData.interval + resetData.start
  94 +end
  95 +
  96 +-- 当前轮次 结束时间
  97 +function Role:getTimeResetEndTime(rtype)
  98 + return self:getTimeResetStartTime(rtype) + getTimeResetDuration(rtype)
  99 +end
  100 +
  101 +function Role:getTimeResetRound(rtype)
  102 + local timeReset = self:getProperty("timeReset")
  103 + return timeReset[rtype] or 0
  104 +end
  105 +
  106 +function Role:getTimeResetDataStart(rtype)
  107 + local resetData = csvdb["time_resetCsv"][rtype]
  108 + if not resetData then return 0 end
  109 + return resetData.start
  110 +end
  111 +
  112 +
  113 +
  114 +
  115 +
  116 +
  117 +
  118 +end
  119 +
  120 +
  121 +
  122 +
  123 +
  124 +return RoleTimeReset
0 125 \ No newline at end of file
... ...
src/services/agent_util.lua
... ... @@ -39,43 +39,6 @@ local function check_heart_beat(agent, now)
39 39 end
40 40 end
41 41  
42   -local PointDataMark = {}
43   -local resetTimeStr = string.format("%02d00", RESET_TIME)
44   -local resetRankTimeStr = string.format("%02d00", RESET_RANK_TIME)
45   -
46   -local function check_daily_reset(agent, now)
47   - local date = os.date("*t", now)
48   - local timeStr = string.format("%02d%02d", date.hour, date.min)
49   - local dataStr = date.year .. string.format("%02d", date.month) .. string.format("%02d", date.day)
50   -
51   - local function timeEffect(checkTimeStr)
52   - if timeStr ~= checkTimeStr then
53   - return false
54   - end
55   - if PointDataMark[dataStr] and PointDataMark[dataStr][checkTimeStr] then
56   - return false
57   - end
58   - PointDataMark[dataStr] = PointDataMark[dataStr] or {}
59   - PointDataMark[dataStr][checkTimeStr] = true
60   - return true
61   - end
62   -
63   - if timeEffect(resetTimeStr) then
64   - -- 刷新每日数据
65   - local role = agent.role
66   - if role then
67   - role:onCrossDay(now, true)
68   - end
69   - end
70   - if resetTimeStr ~= resetRankTimeStr and timeEffect(resetRankTimeStr) then
71   - -- 刷新排行榜需要重置的数据
72   - local role = agent.role
73   - if role then
74   - role:onResetRank(now, true)
75   - end
76   - end
77   -end
78   -
79 42 function _M:update(agent)
80 43 local now = skynet.timex()
81 44 local role = agent.role
... ... @@ -83,7 +46,6 @@ function _M:update(agent)
83 46 pcall(check_heart_beat, agent, now)
84 47 nextCheckTime = now + HEART_TIMER_INTERVAL
85 48 end
86   - pcall(check_daily_reset, agent, now)
87 49 pcall(role.onRecoverTimer, role, now)
88 50 end
89 51  
... ...