课时 26 · 定时活动与全区公告

课时 26 · 定时活动与全区公告(功能开发实战):实现活动开关与全区消息。示例跑在 996 新三端引擎里,接口按本地官方文档逐个核对。

教程/第四部分 · 功能开发实战更新于 2026-10-073 个小节 教程第 31 / 41 篇 功能实战

本课的代码跑在 996 引擎里,用到的是服务端接口(changeexp、 SetInt 这类),在线运行器里没有这些函数。 每个函数的签名都能在 文档检索 里按名字查到原文。

本课目标

  • 实现活动开关与全区消息。

知识讲解

需求:周末双倍经验活动——活动期间击杀经验翻倍,开始/结束有全区公告。实现方案:用全局定时器 setontimerex 周期检查活动时间(如每分钟一次),到点切换活动开关并广播消息;杀怪经验触发中按开关翻倍经验。

示例:双倍经验活动(核心)

local ACTIVITY_ON = false

-- 全局定时器:每分钟检查一次活动窗口
setontimerex(101, 60)
function ontimerex101()
    local now = os.time()
    local wday = tonumber(os.date('%w', now))   -- 0=周日
    local inWeekend = (wday == 0 or wday == 6)
    if inWeekend and not ACTIVITY_ON then
        ACTIVITY_ON = true
        sendmsg(0, 2, '{"Msg":"周末双倍经验活动已开启!","Type":2}')
    elseif not inWeekend and ACTIVITY_ON then
        ACTIVITY_ON = false
        sendmsg(0, 2, '{"Msg":"周末双倍经验活动已结束","Type":2}')
    end
end

-- 杀怪经验触发:活动期间经验翻倍
function getexpbykillmon(actor, killer, mon, exp)
    if ACTIVITY_ON then
        -- 引擎已经发了基础经验,这里补差额即翻倍(接口/人物相关/设置人物经验值)
        changeexp(actor, '+', exp, false)
    end
end

说明:经验增减用 changeexp(actor, '+', 数量, false)(接口/人物相关),只补差额、不要重发全额;type=2 是全服;定时器回调里没有玩家对象,示例用 0 占位(文档只写了「玩家对象」,这一处以你本机版本实测为准)。活动开关是内存变量,服务端重启会重置——要跨重启就用 SetSysInt 存系统变量。

练习任务

  • 完善活动系统:① 活动开启/结束各广播一次,不重复刷屏;② 活动期间的经验翻倍逻辑用真实经验接口实现;③ 增加活动倒计时公告(sendcentermsg 的 func 回调用法)。

参考:验收要点

  • 定时器只触发一次状态切换,公告不重复;
  • 非周末活动关闭,经验不变;
  • 倒计时文案包含 %d 且回调标签在 QFunction 中可执行。
本篇依据
  • 《996 新三端 Lua 开发教学技术手册》课时 26

参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。