CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战996引擎免打扰时间窗

【进阶实战】免打扰时段:私聊屏蔽的时间窗封装

2026-09-25 13:18 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本进阶实战996引擎Lua免打扰时间窗

业务场景

私聊广告与骚扰让玩家直接关掉私聊,真实好友的消息也被一刀切掉;深夜挂机的玩家被交易消息反复吵醒。免打扰封装:按时间窗静默指定类型的消息,窗口内私聊进静默箱不弹屏、退出窗口一键翻阅——屏蔽有粒度、有期限,不需要一刀切。

核心实现

窗口设置与判定。示例代码如下:

lua
local function setQuiet(actor, startH, endH)
    setplayvar(actor, 1, "QuietStart", startH, 1)
    setplayvar(actor, 1, "QuietEnd", endH, 1)
    sendmsg(actor, 1, "免打扰 " .. startH .. " 点至 " .. endH .. " 点生效。")
end
local function isQuietNow(actor)
    local s = tonumber(getplayvar(actor, 1, "QuietStart")) or -1
    local e = tonumber(getplayvar(actor, 1, "QuietEnd")) or -1
    if s < 0 then
        return false
    end
    local h = tonumber(os.date("%H")) or 12
    if s <= e then
        return h >= s and h < e
    end
    return h >= s or h < e
end

私聊投递接线。示例代码如下:

lua
local function onWhisper(fromActor, toActor, text)
    if isQuietNow(toActor) then
        local box = tostring(getplayvar(toActor, 1, "QuietBox") or "")
        if #box < 1200 then
            setplayvar(toActor, 1, "QuietBox",
                box .. tostring(getplayvar(fromActor, 0, "ShowName") or "匿名")
                    .. ":" .. text .. ";", 1)
        end
        return
    end
    sendmsg(toActor, 1, "[私聊] " .. text)
end

接口拆解

setQuiet 把窗口的小时数写入玩家变量(isSave=1 落盘,重登仍生效);isQuietNow 的关键在跨零点窗口:23 点到 7 点这种 start 大于 end 的区间用 or 逻辑跨天判定,普通窗口用 and 区间判定。onWhisper 在投递前查收件方状态,静默期消息写入 QuietBox(1200 字节上限防刷爆),消息不弹屏但一条不丢——屏蔽的是打扰,不是沟通。

踩坑记录

免打扰踩过三个坑:一是窗口判定最初没考虑跨零点,设 23 到 7 点的玩家全天生效,补上 start 大于 end 的跨天分支后修复;二是静默箱没有上限,被恶意连发撑爆变量导致写入失败,加了 1200 字节上限与满箱丢弃最旧条目的策略;三是免打扰把行会求救也屏蔽了,沙巴克开战期间的求救类消息改走白名单通道不受窗口约束——屏蔽必须分级,一刀切会把救命消息一起挡掉。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

入门夯实游戏功能

关注降价:关注商品的降价提醒

【游戏】 一、一行代码拆解:if price < WATCH[goods] then notify end —— 关注降价的…

2026-09-26 22:24 996 技术组 · 0 阅读
进阶实战游戏功能

竞技场积分赛:胜负积分的晋级规则

【游戏】 一、业务场景:赛季结算发现一名玩家胜率 10% 却排在黄金段——历史计分只加不减,积分体系失效 3 个月;积分赛—…

2026-09-26 22:24 996 技术组 · 0 阅读
进阶实战语法算法

Lua卡塔兰数:合法括号序列的计数

【语法】 一、抛坑提问:3 对括号能组成多少种合法序列?答案是 5——卡塔兰数列:每一项等于前一项乘 2 倍的 2n 减 1…

2026-09-26 22:24 996 技术组 · 0 阅读
进阶实战语法算法

Lua线性同余:自实现随机数生成器

【语法】 一、抛坑提问:不想用全局随机函数(怕多处共享种子互相干扰),可自实现一个独立随机序列——线性同余法三行核心:乘、加…

2026-09-26 22:24 996 技术组 · 0 阅读
策划架构游戏功能

双人复核:大额支取的双人确认

【游戏】 一、一行代码拆解:PENDING[outId] = {by = actor, at = now} —— 双人复核的…

2026-09-26 22:24 996 技术组 · 0 阅读
进阶实战语法算法

Lua蒙地卡罗:随机撒点估算圆周率

【语法】 一、隐蔽陷阱:圆周率小数位背不出更多就不算理解随机模拟?用蒙地卡罗法随机撒点统计,10 万个点能把圆周率估到两位小…

2026-09-26 22:24 996 技术组 · 0 阅读