一周七天排满不同活动:周一攻城、周三双倍、周末跨服,玩家打开日历一眼看到今天有什么、几点开始。活动日历统一管理开启判定,所有玩法模块向日历注册自己的时间窗口,判定逻辑一处维护,预告推送把人按时拉回,晚间八点的在线峰值因此稳了一截。
local ACT_CALENDAR = {
{ wday = 1, name = "攻城战", open = { { 20, 0, 22, 0 } } },
{ wday = 3, name = "双倍经验", open = { { 12, 0, 14, 0 }, { 19, 0, 23, 0 } } },
{ wday = 6, name = "跨服战场", open = { { 14, 0, 17, 0 } } },
}
function Calendar.isOpen(actId, now)
local act = ACT_CALENDAR[actId]
local wd = tonumber(os.date("%w", now))
if wd ~= act.wday then return false end
local hhmm = tonumber(os.date("%H%M", now))
for _, win in ipairs(act.open) do
if hhmm >= win[1] * 100 + win[2] and hhmm <= win[3] * 100 + win[4] then
return true
end
end
return false
end
开启窗口按星期与时段配置,多窗口支持午间与晚间双场,时间全部走配置热重载,运营调整不发版。判定函数无状态,玩家请求时实时计算,缓存一天的判定结果也没必要,计算本身微不足道。
function Calendar.preNotify(now)
for actId, act in ipairs(ACT_CALENDAR) do
local nextAt = Calendar.nextOpen(act, now)
if nextAt - now <= 600 and not act.notified then
act.notified = true
QF_PushAll("「" .. act.name .. "」10 分钟后开启")
end
end
end
开启前 10 分钟全服推送,notified 标记防止重复打扰,开启后重置,活动结束同样推一条战报摘要。推送文案带活动入口深链,点开直达报名界面,转化路径一屏内完成。日历界面用 GUI:Calendar 控件按周渲染,进行中的活动角标高亮呼吸,未开始的展示倒计时。
推送触达与活动进场率按场次统计,进场率低于均值三成的活动重新评估时段。
日历的时区处理在海外服上线时翻过车,北京时间晚八点对当地玩家是清晨,活动面板显示的开启时间按服务器时区硬编码,海外服按注册地区本地化后参与率回升。深链降级路径的测试用例覆盖了每个渠道包,黑屏两周的事故复盘会上定了这条军规。活动预告的文案模板带剩余场次信息,本周还剩两场攻城战的提示让玩家对稀缺性有感,参与率提升的关键有时只是一句文案。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…