data = {startTime = startTime,endTime = endTime,season = season}
--战令活动时间管理
local TokenTimeMgr = {}
function TokenTimeMgr:Init()
--获取库数据
local datas = server.settingCenter:GetData(SettingConfig.SettingType.TokenTimeMgr)
self.TimeManage = false
if not datas then
--初始化时间
self:RefreshTime()
self.data = datas.data
self:RefreshTimeCheck()
self.updatetime = datas.updatetime
end
--刷新战令活动时间
function TokenTimeMgr:RefreshTime()
local startTime = 0
local endTime = 0
local season = 0
local tokencfg = server.configCenter.TokenConfig
local tokenTime = lua_util.getDateTimeLength(tokencfg[TokenConfig.Key.TokenTime].value,"w") - 1 --持续时间week
if not self.data then
--初始读取配置表开始时间
startTime = lua_util.getDateTimeStamp(tokencfg[TokenConfig.Key.TokenStartTime].value,",")
endTime = startTime + tokenTime
season = 1
--再次验证是否到期
if lua_app.now() < self.data.endTime then
return false
startTime = self.data.endTime + 1
endTime = startTime + tokenTime
season = self.data.season + 1
self.data = {startTime = startTime,endTime = endTime,season = season}
self.updatetime = lua_app.now()
server.settingCenter:SetData(SettingConfig.SettingType.TokenTimeMgr,self.data)
self:sendRecordToClient()
return true
end
3.定时器验证
没有必要浪费资源,我设置每天验证一次。在最后24小时内才会启动定时器。
Lua用的也不是很久,定时器是这么嵌套
1、_DoSecond方法设置1秒后执行,调用定时任务
2、设置1秒后执行_DoSecond方法
3、_DoSecond方法设置1秒后执行,调用定时任务
--验证是否需要刷新
function TokenTimeMgr:RefreshTimeCheck()
local differTime = self.data.endTime - lua_app.now() --距离活动结束时间
local uptime = 24 * 60 * 60
if differTime < 0 then
self:RefreshTime()
--活动赛季更新,关闭定时器
if self.sectimer then
lua_app.del_timer(self.sectimer)
self.sectimer = nil
self.TimeManage = false
if differTime < uptime and not self.TimeManage then
--倒计时一天开启定时器
self:SecondTimer()
self.TimeManage = true
function TokenTimeMgr:SecondTimer()
if self.sectimer then
lua_app.del_timer(self.sectimer)
self.sectimer = nil
local function _DoSecond()
self.sectimer = lua_app.add_timer(1000, _DoSecond)
self:RefreshTimeCheck()
self.sectimer = lua_app.add_timer(1000, _DoSecond)
function TokenTimeMgr:onDayTimer()
self:RefreshTimeCheck()
end
4、客户端协议
这边只需要发送活动开始和结束时间,赛季更新时发送给当前在线玩家
function TokenTimeMgr:sendRecordToClient()
--通知所有在线玩家
local players = server.playerCenter:GetOnlinePlayers()
for _, player in pairs(players) do
player.tokenPlug:Resert()
self:SendMsg(player)
--发送信息
function TokenTimeMgr:SendMsg(player)
local tokentimeinfo = {
startTime = self.data.startTime,
endTime = self.data.endTime,
server.sendReq(player, "sc_token_time_info", tokentimeinfo)
end