如何设置定时器每天执行一次_游戏活动的自动循环——定时器管理

功能简介

类似王者荣耀的战令活动。活动管理是后面写的我也就拆分开来说了。这是现在的活动表,以前配置每期的开启到结束时间,不过那样每期的时间都得手动控制,现在是做成自动循环的形式。

1、数据结构

需要记录开始时间和结束时间,为了后续方便,我加了战令活动期数,服务器启动初始加载全局配置表的数据

data = {startTime = startTime,endTime = endTime,season = season}

--战令活动时间管理local TokenTimeMgr = {} function TokenTimeMgr:Init()--获取库数据local datas = server.settingCenter:GetData(SettingConfig.SettingType.TokenTimeMgr)self.TimeManage = falseif not datas then--初始化时间self:RefreshTime()elseself.data = datas.dataself:RefreshTimeCheck()self.updatetime = datas.updatetimeendend

全局配置表

setting = {columns = {{ "dbid","bigint(20)",0,"设置类型id" },{ "data","mediumblob",{},"设置数据" },{ "updatetime" ,"int(11)",0,"更新时间" },},prikey = { "dbid" },comment = "全局设置表",},

2、活动时间更新

fa2bbccbd787bc8331d96a91ec5b3ee7.png

添加描述

初始读取配置表TokenStartTime即可,结束时间由活动持续时间计算可得,然后保存数据,是不是很简单。

在此还有一些变种,如果两个活动之间有休息时间,下期开始时间往后延。或者是比较复杂的攻城战,多个阶段的功能,可以加个state记录活动状态等等

--刷新战令活动时间function TokenTimeMgr:RefreshTime()local startTime = 0local endTime = 0local season = 0local tokencfg = server.configCenter.TokenConfiglocal tokenTime = lua_util.getDateTimeLength(tokencfg[TokenConfig.Key.TokenTime].value,"w") - 1 --持续时间weekif not self.data then--初始读取配置表开始时间startTime = lua_util.getDateTimeStamp(tokencfg[TokenConfig.Key.TokenStartTime].value,",")endTime = startTime + tokenTimeseason = 1else--再次验证是否到期if lua_app.now()  < self.data.endTime thenreturn falseendstartTime = self.data.endTime + 1endTime = startTime + tokenTimeseason = self.data.season + 1endself.data = {startTime = startTime,endTime = endTime,season = season}self.updatetime = lua_app.now()server.settingCenter:SetData(SettingConfig.SettingType.TokenTimeMgr,self.data)self:sendRecordToClient()    return trueend

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 * 60if differTime < 0 thenself:RefreshTime()--活动赛季更新,关闭定时器if self.sectimer thenlua_app.del_timer(self.sectimer)self.sectimer = nilendself.TimeManage = falseendif differTime < uptime and not self.TimeManage then--倒计时一天开启定时器self:SecondTimer()self.TimeManage = trueendend function TokenTimeMgr:SecondTimer()if self.sectimer thenlua_app.del_timer(self.sectimer)self.sectimer = nilendlocal function _DoSecond()self.sectimer = lua_app.add_timer(1000, _DoSecond)self:RefreshTimeCheck()endself.sectimer = lua_app.add_timer(1000, _DoSecond)end 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)endend --发送信息function TokenTimeMgr:SendMsg(player)local tokentimeinfo = {startTime =  self.data.startTime,endTime =  self.data.endTime,    }server.sendReq(player, "sc_token_time_info", tokentimeinfo)end

功能类中玩家登陆也会发送一次

-- 发送战令数据function TokenPlug:SendTokenInfo()    local tokeninfo = {tokenreward =  self:GetTokenRewardMsg(),tasklist =  self:GetTokenTaskMsg(),level = self.cache.level,exp   = self.cache.exp,isactive = self.cache.isactive,point = self.point,buyexptimes = self.cache.buyexptimes,    }server.sendReq(self.player, "sc_token_info", tokeninfo)end -- 发送活动时间数据function TokenPlug:SendTokenTimeInfo()server.luckyShop:SendMsg(self.player)end

活动时间、状态固定的,都可以做成这样自动循环管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值