前言
接到一个需求的时候,首先会想有没有类似功能,或者以后再碰到这类功能如何处理,这次接到一个每周限时活动的任务,把具有共通点的活动时间统一管理,以后写活动只需专注业务功能即可
每周活动限时管理
需求:活动日程为每周x日x点到y点
时间数据
时间放在全局配置表,对应活动id
代码语言:lua复制--全局变量
SettingConfig.SettingType = {
LuckyShop = 1, --幸运商店
TokenTimeMgr = 2, --战令活动时间管理
WeeklyActivityMgr = 3, --限时活动管理
}
function WeeklyActivityMgr:Init()
--获取库数据
self.cache = server.settingCenter:GetData(SettingConfig.SettingType.WeeklyActivityMgr)
--初始化活动数据
self.cache = self.cache or {}
self.cache.data = self.cache.data or {}
for _, id in pairs(WeeklyActivityConfig.ActiveType) do
self.cache.data[id] = self.cache.data[id] or {id = id,state = 0,startTime = 0,endTime = 0}
end
server.settingCenter:SetData(SettingConfig.SettingType.WeeklyActivityMgr,self.cache.data)
end
设置活动开始和结束时间
方式:每天判定当日有活动,则设置当日活动时间
代码语言:lua复制--每天检测活动
function WeeklyActivityMgr:onDayTimer()
self:RefreshAcitvityTime()
self:SendClientMsg()
end
--设置当天活动时间
function WeeklyActivityMgr:RefreshAcitvityTime()
if not self.cache or not self.cache.data then
return
end
for id, data in pairs(self.cache.data) do
if self:isTodayOpen(id) then
--刷新今天活动开启时间
self:SetActivityTime(data)
end
end
end
--今天活动是否开启
function WeeklyActivityMgr:isTodayOpen(activityid)
local acitvitycfg = self:GetAcitvitiTimeConfig(activityid)
local isweekday = false
--判断周几
local nowTime = lua_app.now()
local today = tonumber(os.date("%d",nowTime))
local month = tonumber(os.date("%m",nowTime))
local year = tonumber(os.date("%Y",nowTime))
if acitvitycfg.week then
local weekday = lua_util.getWeekComm(year,month,today)
--本日是否开启
for _, day in pairs(acitvitycfg.week) do
if weekday == day then
isweekday = true
break
end
end
else
isweekday = true
end
return isweekday
end
活动时间设置
代码语言:lua复制--设置活动时间
function WeeklyActivityMgr:SetActivityTime(data)
local acitvitycfg = self:GetAcitvitiTimeConfig(data.id)
local nowTime = lua_app.now()
local today = tonumber(os.date("%d",nowTime))
local month = tonumber(os.date("%m",nowTime))
local year = tonumber(os.date("%Y",nowTime))
if acitvitycfg.time2 then
--此时是否为开启时间段
-- 指定时间的时间戳
local startmin = acitvitycfg.time2[1]
local endmin = acitvitycfg.time2[2]
local startTime = os.time({day=today,month=month,year=year,hour=startmin[1],min=startmin[2],sec=0})
local endTime = os.time({day=today,month=month,year=year,hour=endmin[1],min=endmin[2],sec=0})
if data.startTime == startTime then
-- 已经设置好了
return
end
data.startTime = startTime
data.endTime = endTime - 1
end
return true
end
定时器管理活动状态
这里可以活动触发事件,传activityid触发活动开始或结束事件
代码语言:lua复制function WeeklyActivityMgr:SecondTimer()
if self.sectimer then
lua_app.del_timer(self.sectimer)
self.sectimer = nil
end
local function _DoSecond()
self.sectimer = lua_app.add_timer(5 * 1000, _DoSecond)
self:CheckTerm()
end
self.sectimer = lua_app.add_timer(5 * 1000, _DoSecond)
end
-- 检测活动时间
function WeeklyActivityMgr:CheckTerm()
for _, data in pairs(self.cache.data) do
if data.state == 0 then
--当达到开启时间刷新
if lua_app.now() >= data.startTime and lua_app.now() < data.endTime then
--活动开启初始化数据 最好是事件
data.state = 1
end
elseif data.state == 1 then
--超过结束时间刷新
if lua_app.now() > data.endTime then
--活动关闭处理
data.state = 0
end
end
end
end
羹火活动示例
当活动开始,updateTime没更新时活动重置,活动结束时出啊一次AcitvityEnd,这里需要每分钟场景发放一次奖励,就一起放定时器了
代码语言:lua复制-- 检测活动时间
function GuildBonfireCtrl:CheckTerm()
local data = self:GetActivityTime()
if not data then
return
end
if data.state == 1 then
--是否需要重置 下次活动开始时间
if self.cache.updateTime < data.startTime then
self:AcitvityResert()
end
self:SendReward()
self:SendClientMsg()
elseif data.state == 0 then
--活动关闭,是否触发活动结束
if self.cache.updateTime >= data.startTime and self.cache.updateTime <= data.endTime and lua_app.now() >= data.endTime then
self:AcitvityEnd()
end
end
end