日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時間:2023/12/19 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何设置定时器每天执行一次_游戏活动的自动循环——定时器管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

功能簡介

類似王者榮耀的戰(zhàn)令活動。活動管理是后面寫的我也就拆分開來說了。這是現(xiàn)在的活動表,以前配置每期的開啟到結(jié)束時間,不過那樣每期的時間都得手動控制,現(xiàn)在是做成自動循環(huán)的形式。

1、數(shù)據(jù)結(jié)構(gòu)

需要記錄開始時間和結(jié)束時間,為了后續(xù)方便,我加了戰(zhàn)令活動期數(shù),服務(wù)器啟動初始加載全局配置表的數(shù)據(jù)

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

--戰(zhàn)令活動時間管理local TokenTimeMgr = {} function TokenTimeMgr:Init()--獲取庫數(shù)據(jù)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,"設(shè)置類型id" },{ "data","mediumblob",{},"設(shè)置數(shù)據(jù)" },{ "updatetime" ,"int(11)",0,"更新時間" },},prikey = { "dbid" },comment = "全局設(shè)置表",},

2、活動時間更新

添加描述

初始讀取配置表TokenStartTime即可,結(jié)束時間由活動持續(xù)時間計算可得,然后保存數(shù)據(jù),是不是很簡單。

在此還有一些變種,如果兩個活動之間有休息時間,下期開始時間往后延。或者是比較復(fù)雜的攻城戰(zhàn),多個階段的功能,可以加個state記錄活動狀態(tài)等等

--刷新戰(zhàn)令活動時間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 --持續(xù)時間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.定時器驗證

沒有必要浪費資源,我設(shè)置每天驗證一次。在最后24小時內(nèi)才會啟動定時器。

Lua用的也不是很久,定時器是這么嵌套

1、_DoSecond方法設(shè)置1秒后執(zhí)行,調(diào)用定時任務(wù)

2、設(shè)置1秒后執(zhí)行_DoSecond方法

3、_DoSecond方法設(shè)置1秒后執(zhí)行,調(diào)用定時任務(wù)

--驗證是否需要刷新function TokenTimeMgr:RefreshTimeCheck()local differTime = self.data.endTime - lua_app.now() --距離活動結(jié)束時間local uptime = 24 * 60 * 60if differTime < 0 thenself:RefreshTime()--活動賽季更新,關(guān)閉定時器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、客戶端協(xié)議

這邊只需要發(fā)送活動開始和結(jié)束時間,賽季更新時發(fā)送給當(dāng)前在線玩家

function TokenTimeMgr:sendRecordToClient()--通知所有在線玩家local players = server.playerCenter:GetOnlinePlayers()for _, player in pairs(players) do player.tokenPlug:Resert()self:SendMsg(player)endend --發(fā)送信息function TokenTimeMgr:SendMsg(player)local tokentimeinfo = {startTime = self.data.startTime,endTime = self.data.endTime, }server.sendReq(player, "sc_token_time_info", tokentimeinfo)end

功能類中玩家登陸也會發(fā)送一次

-- 發(fā)送戰(zhàn)令數(shù)據(jù)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 -- 發(fā)送活動時間數(shù)據(jù)function TokenPlug:SendTokenTimeInfo()server.luckyShop:SendMsg(self.player)end

活動時間、狀態(tài)固定的,都可以做成這樣自動循環(huán)管理。

總結(jié)

以上是生活随笔為你收集整理的如何设置定时器每天执行一次_游戏活动的自动循环——定时器管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。