私聊是玩家社交的私信箱:交易的对口、好友的寒暄、行会的动员暗号全走私聊。私聊协议的要点是点对点的寻址、离线的转投与骚扰的防线——一句话送不到人或送出骚扰都是事故。
---私聊的发送:在线直投与离线转投
function Chat.private(actor, toName, text)
local player = class(actor)
if not player then return false end
local target = getplayerbyname(toName)
if not target then return false end
-- 黑名单的拦截
if Friend.blacklisted(toName, actor) then
sendmsg(actor, 1, "消息无法送达")
return false
end
-- 频控:每分钟最多 20 条
if not Chat.freqOk(actor, 20, 60) then
sendmsg(actor, 1, "发送过于频繁")
return false
end
sendmsg(target, 1, "[私聊] " .. actor .. ":" .. text)
Chat.storeOffline(actor, toName, text)
return true
end
私聊的投递先过两道闸:黑名单的拦截让拉黑者安静、频控的 20 条每分钟掐住刷屏的手。在线的目标直投送达,收发双方的记录同步存储——私聊的留痕是举报取证的原料,聊天记录的保留 30 天。送达的回执给发送方确定性:消息进了对方的屏幕还是转了离线,发送的界面有状态可查。
---离线的转投:消息转邮件到达
setontimerex(99, 60)
function Chat.offlineFlush()
for uid, box in pairs(Chat.offlineBox) do
if #box > 0 and Online.isOnline(uid) then
sendmsg(uid, 1, "有 " .. #box ..
" 条离线私聊,点击查看")
-- 上线后的首屏拉取离线消息
Chat.deliverPending(uid, box)
Chat.offlineBox[uid] = nil
elseif #box > 50 then
-- 离线积压超 50 条转邮件摘要
sendmail(uid, 8010, "离线消息摘要",
table.concat(box, "\n"), "")
Chat.offlineBox[uid] = nil
end
end
end
离线的转投分两档:玩家上线后直接补投的待领箱、积压超 50 条转邮件摘要的兜底——离线的私聊不丢失也不无限积压。转投的时机按收件方的状态驱动:上线即达的体验与邮件的兜底并行。私聊的过滤与频道的同源:敏感词的筛查在私聊同样生效,引流的诈骗话术在点对点的通道同样被拦——私聊不是法外之地。私聊的已读回执做轻量的版本:送达的状态有、已读不追踪,隐私的边界比社交的确认更重要。
私聊的送达率与延迟监控,直投的延迟超 500 毫秒即网络或网关的排查;离线积压的分布统计,积压的存量反映转投机制的健康的程度。
黑名单的拦截曾经不提示发送方,发送方以为送达了反复重发,模糊化的失败提示让双方都得体。离线箱的键曾经用玩家名字,改名后离线消息找不到主人,键的统一 userId。转邮件的摘要曾经不带发送者,收到的邮件像匿名信,摘要的格式带来源。
私聊的入口与好友、行会列表联动,点名字即私聊的动线最短。陌生人私聊的开关给玩家,骚扰的拒绝权在接收者手里。私聊的记录查询进客服的取证工具,交易纠纷的调证有时效保障。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 行会系统的通病是"人多力量大"只体现在攻城:日常没有人人有份的参与结构,普通成员对行会缺少归属感与参与点。科技树把…
设计初衷 打怪掉装、强化失败、版本更替,都在往玩家背包里塞过渡装备,卖不掉、扔了心疼,压在包里发臭。回收系统的价值两条:给过…
底层原理 性能优化不靠猜,靠剖析。os.clock 返回脚本进程占用的 CPU 时间(秒,小数),两次取值之差就是中间代码的…
设计初衷 满级是长线游戏的分水岭:不转生,毕业玩家无事可做、数值通胀无处吸收;硬开新等级,老装备一夜贬值。转生系统的价值在于…
业务场景 石墓阵里 6 个精英点位驻着白野猪王,被清掉后要按周期补位。散装写法把地图、坐标、怪物名硬编码在脚本里,开新区要复…
底层原理 闭包是函数与其捕获环境的绑定:内层函数引用外层局部变量时,这份数据随函数体一起存活,外部既访问不到也改不掉。限频器…