前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >游戏活动的自动循环——定时器管理

游戏活动的自动循环——定时器管理

原创
作者头像
深雾
修改2020-07-06 10:25:43
2.2K0
修改2020-07-06 10:25:43
举报
文章被收录于专栏:工具类工具类

功能简介

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

1、数据结构

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

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()
	else
		self.data = datas.data
		self:RefreshTimeCheck()
		self.updatetime = datas.updatetime
	end
end

全局配置表

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

2、活动时间更新

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

读取配置文件的方法

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

--刷新战令活动时间
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
	else
		--再次验证是否到期
		if lua_app.now()  < self.data.endTime then
			return false
		end
		startTime = self.data.endTime + 1
		endTime = startTime + tokenTime
		season = self.data.season + 1
	end
	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
		end	
		self.TimeManage = false
	end
	if differTime < uptime and not self.TimeManage then
		--倒计时一天开启定时器
		self:SecondTimer()
		self.TimeManage = true
	end
end
 
function TokenTimeMgr:SecondTimer()
	if self.sectimer then
		lua_app.del_timer(self.sectimer)
		self.sectimer = nil
	end
	local function _DoSecond()
		self.sectimer = lua_app.add_timer(1000, _DoSecond)
		self:RefreshTimeCheck()
	end
	self.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)
	end
end
 
--发送信息
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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能简介
  • 1、数据结构
  • 2、活动时间更新
  • 3.定时器验证
  • 4、客户端协议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档