功能简介
类似王者荣耀的战令活动。活动管理是后面写的我也就拆分开来说了。这是现在的活动表,以前配置每期的开启到结束时间,不过那样每期的时间都得手动控制,现在是做成自动循环的形式。
1、数据结构
需要记录开始时间和结束时间,为了后续方便,我加了战令活动期数,服务器启动初始加载全局配置表的数据
data = {startTime = startTime,endTime = endTime,season = season}
代码语言:lua复制--战令活动时间管理
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
全局配置表
代码语言:javascript复制setting = {
columns = {
{ "dbid" ,"bigint(20)" ,0 ,"设置类型id" },
{ "data" ,"mediumblob" ,{} ,"设置数据" },
{ "updatetime" ,"int(11)" ,0 ,"更新时间" },
},
prikey = { "dbid" },
comment = "全局设置表",
},
2、活动时间更新
初始读取配置表TokenStartTime即可,结束时间由活动持续时间计算可得,然后保存数据,是不是很简单。
读取配置文件的方法
在此还有一些变种,如果两个活动之间有休息时间,下期开始时间往后延。或者是比较复杂的攻城战,多个阶段的功能,可以加个state记录活动状态等等
代码语言:lua复制--刷新战令活动时间
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秒后执行,调用定时任务
代码语言:lua复制--验证是否需要刷新
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、客户端协议
这边只需要发送活动开始和结束时间,赛季更新时发送给当前在线玩家
代码语言:lua复制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
功能类中玩家登陆也会发送一次
代码语言:lua复制-- 发送战令数据
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
活动时间、状态固定的,都可以做成这样自动循环管理。