CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
网络通信

【网络通信】NPC 对话协议:菜单交互的请求响应

2026-09-23 16:58 作者:996 技术组 996引擎Lua教程传奇脚本

实战应用:用在哪里

与 NPC 的每一次对话都是一次协议往返:玩家点击 NPC 拉起菜单,选择一项,服务器返回结果或下一级菜单。NPC 对话协议的设计要点是会话的绑定、菜单的编号与防重放的选择记忆。

菜单的下发

lua

---NPC 菜单的下发:项与编号绑定
function Npc.menu(actor, npcId)
    local player = getplayerbyname(actor)
    if not player then return end
    -- 距离校验:远离 NPC 的对话无效
    if Npc.dist(player, npcId) > 5 then
        sendmsg(player, 1, "距离太远,走近些再对话")
        return
    end
    local items = {
        "查看装备店", "出售物品", "行会仓库", "任务委托",
    }
    Npc.send(player, npcId, "铁匠老板:需要点什么?", items)
end

对话的发起先过距离校验:离 NPC 五格以外的点击无效——改包的远程菜单调用在距离上现形。菜单的四项与编号绑定下发,玩家的选择按编号回传,服务器按编号查表执行而不是按文本比对——菜单文案改了编号不变,协议的稳定性靠编号不靠文案。

选择的回执

lua

---选择的处理:会话校验后执行
function Npc.onSelect(actor, npcId, idx)
    local player = getplayerbyname(actor)
    if not player then return end
    -- 会话校验:30 秒内未对话过的选择无效
    local sess = Npc.session(player)
    if not sess or sess.npcId ~= npcId
        or os.time() - sess.at > 30 then
        sendmsg(player, 1, "对话已超时,请重新打开菜单")
        return
    end
    if idx == 1 then
        Npc.openShop(player, npcId)
    elseif idx == 2 then
        Npc.openSell(player, npcId)
    elseif idx == 3 then
        callscript(player, "guild_repo")
    elseif idx == 4 then
        Npc.openQuest(player, npcId)
    end
end

选择的处理先验会话:菜单的下发时登记会话(NPC、时刻),选择到达时核对会话的存在与时效——30 秒前的菜单点了也白点,伪造的选择在没有会话的情况下无门而入。执行的分支按编号走:装备店与出售走商店的通用通道,行会仓库转 callscript 调用仓库脚本,任务委托开任务面板。二级菜单的层数限制两层,更深的交互改走界面面板——NPC 对话框塞不下复杂的功能,协议保持轻。菜单的动态项按玩家的状态裁剪:行会仓库只对有行会的玩家显示,无行会者看到的菜单少一项,菜单的个性化让 NPC 有脑子。

验证与监控

菜单的会话校验拒绝率监控,高拒绝率的来源 IP 进风控观察;对话的频次统计,单玩家每分钟对同一 NPC 的对话超过 20 次按脚本处理。

踩坑记录

菜单的选择曾经按文本比对,文案改一个字全服的选择失灵,编号制的改造一次到位。会话的登记曾经在距离校验之前,远程拉菜单的会话被登记后选择放行,登记挪到校验之后。动态菜单的裁剪曾经客户端自判,改包的客户端看到了隐藏项,裁剪收口到服务器下发侧。

上线要点

NPC 的菜单表集中配置:文案、编号、执行的动作一格一行,策划可维护。对话的文案带 NPC 的性格语气,同一铁匠与同一药剂师的措辞不同。高频功能的 NPC 位置优化:修理与药店放主城动线的主干道,玩家的脚步是最好的埋点。

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

作者履历与出处

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

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

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

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

引擎触发沃玛祭坛祭品召唤

【引擎触发】沃玛祭坛:祭品投放的召唤触发设计

实战应用:用在哪里 沃玛祭坛是沃玛森林深处的隐藏玩法:玩家投放指定祭品积累召唤进度,进度满格召唤出沃玛教主之影,全服玩家都可…

2026-09-23 20:13 996 技术组
玩法策划魔军压境前哨预警

【玩法策划】魔军压境前哨:入侵事件的预警哨塔设计

实战应用:用在哪里 全服入侵事件最大的问题是玩家总是在事后才知道。魔军压境前哨把预警做成玩法的一部分:入侵前三哨塔依次亮起,…

2026-09-23 20:13 996 技术组
后端接口坐骑喂养加成

【后端接口】坐骑喂养:坐骑饱食度与加成接口

实战应用:用在哪里 坐骑不喂会饿、喂饱了跑得快,饱食度是坐骑系统的核心状态。坐骑喂养接口管理饱食度的增减与加成联动:饱食度一…

2026-09-23 20:13 996 技术组
前端接口宠物合成分解预览

【前端接口】宠物合成分解页:材料消耗的预览

实战应用:用在哪里 宠物合成要消耗材料与金币,分解返还多少材料,玩家在操作前就该知道。宠物合成分解页把合成消耗、分解返还、成…

2026-09-23 20:13 996 技术组
数据存储异库备份分离订单

【数据存储】异库备份:角色与订单的分离备份

实战应用:用在哪里 角色数据与订单数据曾共用一套备份,订单回滚时把角色也卷了回去,玩家充了钱角色却回到三天前。异库备份把角色…

2026-09-23 20:13 996 技术组
玩法策划师门切磋周切磋积分赛

【玩法策划】师门切磋周:门内切磋的积分赛设计

实战应用:用在哪里 师门成员平日各忙各的,同门之间几乎零交流。师门切磋周把门内切磋变成积分赛:一周内师门成员互相发起切磋,胜…

2026-09-23 20:13 996 技术组