工程参考/配置文件/Server/NPCPaoPaoIndexTable.txt

来自天龙知识库
雪舞留言 | 贡献2026年9月10日 (四) 09:18的版本 (维护配置文件知识库:完整字段、读取范围、手工修改实例与核对状态)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航跳到搜索


首页 · 配置文件索引 · 修改约定

NPCPaoPaoIndexTable.txt 规定一种 NPC 可以说哪些头顶气泡对白。服务端只挑选对白编号,再由玩家客户端到 MonsterPaoPao.txt 查找文字。本文件只有三个整数列,修改对白内容需要定位客户端文字表。

位置与生效 · 文件格式 · 字段详解 · 修改实例

文件位置与生效

项目 说明
运行文件 ./Config/NPCPaoPaoIndexTable.txt,相对于读取程序的工作目录。源码 resources/Server/Config 是样本位置,实际部署可能另有副本。
读取程序 Server 游戏进程;玩家客户端另读 MonsterPaoPao.txt 获取文字
生效方法 正常保存并停服后修改 Server 工作目录中的 Config 副本,再重启 Server。当前检索范围未发现本表的单独重载入口。不要只修改源码 resources 里的样本。
样本格式 ASCIICRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

样本有 65 条记录。以 NPC 模板编号作为数组位置写入,因此不要求按 NPCID 排序;编号必须唯一,保持原顺序更容易核对改动。

三种编号怎样对应

编号 示例与用途
NPC 模板编号 1860,在 MonsterAttrExTable.txt 第一列对应“宝藏小怪”;本表第一列填写此编号。所有使用同一模板的实例共用该范围。
NPC 场景对象 ID 游戏运行时某一只 NPC 的对象编号,用于 Lua 和消息定位。不要把模板 1860 直接当作当前对象 ID,也不要填 GUID。
气泡对白编号 本例 Base=28、Step=2,可选 28 或 29;客户端在 MonsterPaoPao.txt 第一列查编号,第二列才是文字。

文件格式

首行是类型行:INT INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。

字段详解

列号从 1 开始,源码列下标从 0 开始。

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:NPCID,NPC/怪物模板编号
按运行对象 GetDataID() 查询,关联 MonsterAttrExTable.txt 第一列。修改已有行会影响采用该模板且经过本表触发路径的 NPC;不会创建或刷新 NPC。 有效数组范围 0..65534,还必须是实际存在的模板。负数或 >=65535 触发断言;重复键由 DBC 报错。整行不存在时,范围初始为 -1、-1,本表触发路径不发送气泡。
第 2 列
INT:PAOPAPBaseID,起始对白编号
保留样本表头拼写。它是客户端 MonsterPaoPao.txt 第一列的起点,不是 NPCChat.txt 行号。Base=28、Step=2 对应 28..29,范围内每个编号都要存在。 负值使本表触发路径直接跳过。0 会参与选择,并不表示关闭;若客户端无对应编号,就没有文字可显示。空值/非数字会转为 0,不作为合法配置。
第 3 列
INT:IDStep,候选编号数量
使用 rand() % IDStep + Base 选择整数,所以末尾编号是 Base + IDStep - 1。2 表示两个连续编号,不是每隔两个编号,也不是两秒。1 表示固定起始编号。 0 不发送气泡,负数也跳过。缺少数据行末列或空值成为 0。使用与现有文字数量相符的小正整数,保证编号和 Base+Step-1 不溢出;不要通过扩大范围猜测不存在的文字。

常用修改实例

示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。

让模板 1860 在本表触发时只选择对白 28

修改前:

INT	INT	INT
NPCID	PAOPAPBaseID	IDStep
1860	28	2

修改后:

INT	INT	INT
NPCID	PAOPAPBaseID	IDStep
1860	28	1

在原表第一列找到 1860,确认该行原为 1860、28、2,只将第 3 列 2 改为 1。第 1、2 列以及其余 64 行均保留。客户端现有编号 28 的文字是“宝藏是我们主人的,你休想拿走!”,29 是“嘿!又来了一个送死的!”。修改后,本表的触发路径只发送 28;它不会改变同范围的模板 1861,也不会改 NPC 名称。此例使用已有文字,无须改客户端表。其他脚本若直接指定对白编号,仍可能让该 NPC 说其他话。

验证与排查

检查 Load NPCPaoPaoIndexTable.txt ... OK!、三列和 NPC 模板引用,再确认客户端实际加载的 MonsterPaoPao.txt 有候选编号。用已有模板 1860 的测试 NPC,等待冷却后观察进入视野、锁定目标或正常脚本触发;比较 1861 作为未改行的对照。没有显示时逐项检查场景对象 ID、NPC 是否有 AI、冷却、客户端对象/名称板可见状态和文字资源。PaoPao 返回 -1 不代表屏幕上已显示。实际触发时机、区域广播范围、资源包更新和画面需要实测。恢复时停服还原本表并重启 Server;修改过客户端文字时同时恢复其资源并重启 Game.exe。

从哪里修改文字

客户端以 General 资源组加载 MonsterPaoPao.txt。查看正在使用的 Client/Bin/FairyResources.cfg 的 [General]:FileSystem=*../Data/Config 对应 Client/Data/Config/MonsterPaoPao.txt;AxpFileSystem=../Data/Config.axp 则应更新资源包内同名成员。使用其他映射时以实际配置为准。不要把本页的三列表复制成客户端的两列文字表。新增编号或修改文字时须更新所有参与测试的客户端,并重新启动 Game.exe;仅使用既有编号时无需同步本表到客户端。NPCChat.txt 不参与这里已核对的文字查询链。

冷却与其他触发入口

本表触发经过 AI 的拒绝气泡计时:已有正计时就返回,允许尝试时先设为 20000,之后由逻辑时间递减。即使没有有效范围,也已经设置了该计时。IDStep 不控制间隔,频繁点击不保证立刻再说一句;计时及自动触发的真实表现需要实测。直接指定编号的 PaoPaoEx、巡逻和 AI 动作入口可绕过本表范围,不能用本表承诺关闭所有对白。

服务端 Lua 关联

在已有服务端脚本事件中,使用该事件提供的有效 sceneId、selfId、npcId:

PaoPao(sceneId, selfId, npcId)

参数依次为场景 ID、玩家场景对象 ID、NPC 场景对象 ID。注册名称是 PaoPaoPaoPaoEx(sceneId, selfId, npcId, paoPaoId) 的第四项是直接指定的对白编号,适合排查客户端是否有该文字,但不能用它证明本表范围修改生效。两接口的正常结束分支返回一个 -1,异常路径可能无返回值,不提供“实际显示成功”的返回标志。详见 PaoPaoPaoPaoEx。这些调用属于服务端 Lua。

关联与依据

其他配置及整理状态 · 服务端外网设置 · Lua 接口索引

  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据
  • Common/GameDefine.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/AI/AI_Monster.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/AI/AI_Monster_Def.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/AI/AIScriptFunction.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Obj/Obj_Monster.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Scene/Scene.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Packets/CGLockTargetHandler.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Script/LuaFnTbl_Monster.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Script/LuaFnRegister.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/DBC/GMDataBase.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Common/TDDBC_Struct.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/Interface/GMInterface_Script_Talk.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Render/ResourceProvider.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Render/RenderSystem.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Core/Core/FairySystem.cpp:实际加载、解析、字段使用或示例关联依据
  • resources/Client/Bin/FairyResources.cfg:实际加载、解析、字段使用或示例关联依据
  • resources/Client/Data/Config/MonsterPaoPao.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/MonsterAttrExTable.txt:实际加载、解析、字段使用或示例关联依据

已隔离验证原始 DBC、服务端加载、AI 触发与随机范围发送函数;样本全部 65 行的模板及候选文字编号均核对存在。网络与场景对象使用测试替身,客户端只核对资源映射、查表和显示条件;未启动游戏或服务进程。