私聊广告与骚扰让玩家直接关掉私聊,真实好友的消息也被一刀切掉;深夜挂机的玩家被交易消息反复吵醒。免打扰封装:按时间窗静默指定类型的消息,窗口内私聊进静默箱不弹屏、退出窗口一键翻阅——屏蔽有粒度、有期限,不需要一刀切。
窗口设置与判定。示例代码如下:
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
私聊投递接线。示例代码如下:
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:if price < WATCH[goods] then notify end —— 关注降价的…
【游戏】 一、业务场景:赛季结算发现一名玩家胜率 10% 却排在黄金段——历史计分只加不减,积分体系失效 3 个月;积分赛—…
【语法】 一、抛坑提问:3 对括号能组成多少种合法序列?答案是 5——卡塔兰数列:每一项等于前一项乘 2 倍的 2n 减 1…
【语法】 一、抛坑提问:不想用全局随机函数(怕多处共享种子互相干扰),可自实现一个独立随机序列——线性同余法三行核心:乘、加…
【游戏】 一、一行代码拆解:PENDING[outId] = {by = actor, at = now} —— 双人复核的…
【语法】 一、隐蔽陷阱:圆周率小数位背不出更多就不算理解随机模拟?用蒙地卡罗法随机撒点统计,10 万个点能把圆周率估到两位小…