Commit cfd68b3aaba9633400e8fd6929f9dc9b77c42cb6

Authored by zhouhaihai
1 parent 875e5071

时间重置 新逻辑

src/models/Role.lua
1 local Role = class("Role", require("shared.ModelBase")) 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 RoleLog.bind(Role) 12 RoleLog.bind(Role)
12 RolePlugin.bind(Role) 13 RolePlugin.bind(Role)
  14 +RoleTimeReset.bind(Role)
13 RoleTask.bind(Role) 15 RoleTask.bind(Role)
14 RoleActivity.bind(Role) 16 RoleActivity.bind(Role)
15 RoleChangeStruct.bind(Role) 17 RoleChangeStruct.bind(Role)
@@ -42,6 +44,7 @@ Role.schema = { @@ -42,6 +44,7 @@ Role.schema = {
42 ctime = {"number", skynet.timex()}, -- 创建时间 44 ctime = {"number", skynet.timex()}, -- 创建时间
43 ignoreMt = {"number", 0}, -- 忽略维护拦截 45 ignoreMt = {"number", 0}, -- 忽略维护拦截
44 sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本 46 sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本
  47 + timeReset = {"table", {}}, --重置轮回记录
45 diamond = {"number", 0}, 48 diamond = {"number", 0},
46 reDiamond = {"number", 0}, 49 reDiamond = {"number", 0},
47 setting = {"table", {}}, --设置 50 setting = {"table", {}}, --设置
@@ -107,6 +110,9 @@ Role.schema = { @@ -107,6 +110,9 @@ Role.schema = {
107 pvpTBH = {"table", {}}, -- pvp 他人可用的战斗信息 110 pvpTBH = {"table", {}}, -- pvp 他人可用的战斗信息
108 pvpTBVH = {"table", {}}, -- pvp 他人可用的战斗力 111 pvpTBVH = {"table", {}}, -- pvp 他人可用的战斗力
109 pvpMH = {"table", {}}, -- pvp 匹配的对手 高级 {{t = 1, id = roleId}, {t = 2, id = id}, {t = 2, id = id}} -- t 1 玩家 2 机器人 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 potionBag = {"table", {}}, -- 营养剂背包 118 potionBag = {"table", {}}, -- 营养剂背包
@@ -247,6 +253,7 @@ function Role:data() @@ -247,6 +253,7 @@ function Role:data()
247 funcOpen = self:getProperty("funcOpen"), 253 funcOpen = self:getProperty("funcOpen"),
248 funcLv = self:getProperty("funcLv"), 254 funcLv = self:getProperty("funcLv"),
249 -- loveStatus = self:getProperty("loveStatus"):toNumMap(), 255 -- loveStatus = self:getProperty("loveStatus"):toNumMap(),
  256 + timeReset = self:getProperty("timeReset"),
250 diamond = self:getAllDiamond(), 257 diamond = self:getAllDiamond(),
251 bagLimit = self:getProperty("bagLimit"), 258 bagLimit = self:getProperty("bagLimit"),
252 silent = self:getProperty("silent"), 259 silent = self:getProperty("silent"),
@@ -284,6 +291,9 @@ function Role:data() @@ -284,6 +291,9 @@ function Role:data()
284 291
285 pvpTC = self:getProperty("pvpTC"), 292 pvpTC = self:getProperty("pvpTC"),
286 pvpTH = self:getProperty("pvpTH"), 293 pvpTH = self:getProperty("pvpTH"),
  294 + pvpHGift = self:getProperty("pvpHGift"),
  295 + pvpHGTime = self:getProperty("pvpHGTime"),
  296 + pvpShop = self:getProperty("pvpShop"),
287 297
288 potionBag = self:getProperty("potionBag"), 298 potionBag = self:getProperty("potionBag"),
289 storyB = self:getProperty("storyB"), 299 storyB = self:getProperty("storyB"),
src/models/RoleCross.lua
@@ -55,6 +55,18 @@ RoleCross.bind = function (Role) @@ -55,6 +55,18 @@ RoleCross.bind = function (Role)
55 return info 55 return info
56 end 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 function Role:accountInit(initData) 70 function Role:accountInit(initData)
59 -- 道具 71 -- 道具
60 local reward = {} 72 local reward = {}
@@ -295,6 +307,19 @@ function CMD.pvpHInfo(roleId) @@ -295,6 +307,19 @@ function CMD.pvpHInfo(roleId)
295 } 307 }
296 end 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 RoleCross.handle = function(cmd, roleId, ...) 323 RoleCross.handle = function(cmd, roleId, ...)
299 SRole = SRole or require("models.Role") 324 SRole = SRole or require("models.Role")
300 if CMD[cmd] then 325 if CMD[cmd] then
src/models/RolePlugin.lua
@@ -19,64 +19,6 @@ function RolePlugin.bind(Role) @@ -19,64 +19,6 @@ function RolePlugin.bind(Role)
19 SendPacket(...) 19 SendPacket(...)
20 end 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 function Role:onOfflineEvent() 22 function Role:onOfflineEvent()
81 -- 设置最新的登录时间 23 -- 设置最新的登录时间
82 self:setProperty("ltime", skynet.timex()) 24 self:setProperty("ltime", skynet.timex())
@@ -884,8 +826,9 @@ function RolePlugin.bind(Role) @@ -884,8 +826,9 @@ function RolePlugin.bind(Role)
884 self:updateProperty({field = "advSup", value = advSup, notNotify = notNotify}) 826 self:updateProperty({field = "advSup", value = advSup, notNotify = notNotify})
885 end 827 end
886 828
887 - local StdDinerRankTime = toUnixtime("20190101"..string.format("%02x", RESET_RANK_TIME)) --跨天时间 829 +
888 function Role:getCurDinerRankKey() 830 function Role:getCurDinerRankKey()
  831 + local StdDinerRankTime = toUnixtime("20190101"..string.format("%02x", math.floor(self:getTimeResetDataStart(TimeReset.DinerRank) / 3600))) --跨天时间
889 local now = skynet.timex() 832 local now = skynet.timex()
890 local idx = 1 833 local idx = 1
891 if math.floor((now - StdDinerRankTime) / 86400) % 2 == 1 then 834 if math.floor((now - StdDinerRankTime) / 86400) % 2 == 1 then
@@ -1121,6 +1064,7 @@ function RolePlugin.bind(Role) @@ -1121,6 +1064,7 @@ function RolePlugin.bind(Role)
1121 1064
1122 -- update 1065 -- update
1123 function Role:onRecoverTimer(now) 1066 function Role:onRecoverTimer(now)
  1067 + self:updateTimeReset(now, true)
1124 self:checkNewEvent(now) 1068 self:checkNewEvent(now)
1125 end 1069 end
1126 1070
src/models/RoleTimeReset.lua 0 → 100644
@@ -0,0 +1,124 @@ @@ -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 \ No newline at end of file 125 \ No newline at end of file
src/services/agent_util.lua
@@ -39,43 +39,6 @@ local function check_heart_beat(agent, now) @@ -39,43 +39,6 @@ local function check_heart_beat(agent, now)
39 end 39 end
40 end 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 function _M:update(agent) 42 function _M:update(agent)
80 local now = skynet.timex() 43 local now = skynet.timex()
81 local role = agent.role 44 local role = agent.role
@@ -83,7 +46,6 @@ function _M:update(agent) @@ -83,7 +46,6 @@ function _M:update(agent)
83 pcall(check_heart_beat, agent, now) 46 pcall(check_heart_beat, agent, now)
84 nextCheckTime = now + HEART_TIMER_INTERVAL 47 nextCheckTime = now + HEART_TIMER_INTERVAL
85 end 48 end
86 - pcall(check_daily_reset, agent, now)  
87 pcall(role.onRecoverTimer, role, now) 49 pcall(role.onRecoverTimer, role, now)
88 end 50 end
89 51