工程参考/配置文件/Public/SpecialObjData.txt

来自天龙知识库
跳到导航跳到搜索


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

SpecialObjData.txt 描述陷阱、机关这类特殊对象。第 1 列是编号,接着是名称、类别、逻辑编号、隐形级别、陷阱标记与可激活次数;第 9 到 18 列是客户端显示区(服务端整段跳过),第 19 到 23 列是持续时间、间隔、触发半径、影响半径与影响数目,第 24 到 28 列是预留,第 29 到 60 列是 16 对「参数说明 + 参数值」,第 61 列是内部说明。样本 289 行、61 列。

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

文件位置与生效

项目 说明
运行文件 ../Public/Config/SpecialObjData.txt(宏 FILE_SPECIAL_OBJ_DATA),相对于 GameServer 工作目录。当前核对范围内客户端不读本表。
读取程序 GameServer:TableInit::InitSpecialObjDataMgr 用 g_SpecialObjDataMgr.InitFromDB(FILE_SPECIAL_OBJ_DATA);读取实现在 Common/Combat/DataRecords.cpp;消费方有 Obj_Special.cpp 与逍遥派技能
生效方法 停服后备份并修改实际副本,重启 Server。当前检索未发现单独重载入口。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

读取由 SpecialObjData_T::InitFromDB 用一个游标 column 顺序推进:读第 1、2 列后 ++column 跳过第 3 列,读第 4 到 8 列后 column += 10 跳过第 9 到 18 列,读第 19 到 23 列后 column += 5 跳过第 24 到 28 列,然后 16 次调用 Descriptor_T::InitFromDB 每次吃掉两列,最后读第 61 列。

列区间 用途 服务端
1 到 8 编号、名称、(跳过提示)、类别、逻辑编号、隐形级别、陷阱标记、可激活次数 读取
9 到 18 客户端显示区,最后一列是子弹编号 整段跳过
19 到 23 持续时间、间隔、触发半径、影响半径、影响个体数 读取
24 到 28 预留 整段跳过
29 到 60 16 对参数说明与参数值 读取
61 内部详细说明 读取
检查项 结论
编号能不能越界 不能。必须落在 0 到 1022 之间(SpecialObjData_T::MAX_ID = 1023)。
参数有几对 16 对(DESCRIPTOR_NUMBER),固定占用 32 列。
子弹编号归谁用 第 18 列,服务端跳过;只有客户端把它和 Public/Bullet.txt 关联。
哪些列是 FLOAT 第 21、22 列(触发半径、影响半径)。
空格子怎么处理 整数经 atoi 为 0,字符串仍为空串。

文件格式

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

字段详解

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

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:ID
数据编号,同时是 DBC 索引列。TemplateManager_T 把它当作数组下标写入 m_vTemplateList[nID],必须落在 0 到 1022 之间;Obj_Special 与逍遥派技能按它取模板。 必填且不能重复。超出范围会触发 AssertEx 并丢弃该行。
第 2 列
STRING:名称$1$
名称。保存为字符串指针。 只在需要显示名称的地方使用。
第 3 列
STRING:ToolTips$1$
悬浮提示。服务端读取时用 ++column 整列跳过,不保存。 服务端不生效;改它不会影响任何逻辑。
第 4 列
INT:类别
类别。保存为 m_nClass,供按类别分支的代码使用。 空为 0。
第 5 列
INT:逻辑ID
逻辑编号。保存为 m_nLogicID,是这个类对象的行为编号。 空为 0。
第 6 列
INT:隐形级别
隐形级别。保存为 m_nStealthLevel,决定是否以及如何对敌方隐藏。 空为 0,等于不隐藏。
第 7 列
INT:陷阱专用标记
陷阱专用标记。保存为 m_nTrapUsedFlags,是一组位标记的合集。 空为 0。
第 8 列
INT:可激活次数
可激活次数。保存为 m_nActiveTimes,触发多少次后失效。 空为 0,等于不能触发。
第 9 列
STRING:生存期持续特效
客户端显示区的「生存期持续特效」(STRING 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 10 列
INT:生存期持续音效
客户端显示区的「生存期持续音效」(INT 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 11 列
STRING:激发特效
客户端显示区的「激发特效」(STRING 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 12 列
INT:激发音效
客户端显示区的「激发音效」(INT 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 13 列
STRING:死亡特效
客户端显示区的「死亡特效」(STRING 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 14 列
INT:死亡音效
客户端显示区的「死亡音效」(INT 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 15 列
INT:预留
客户端显示区的「预留」(INT 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 16 列
INT:预留
客户端显示区的「预留」(INT 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 17 列
INT:预留
客户端显示区的「预留」(INT 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。客户端用它挂特效与音效;三列预留当前没有内容。
第 18 列
STRING: 子弹ID
客户端显示区的「子弹ID」(STRING 列)。服务端在读完第 8 列后执行 column += 10,把第 9 到 18 列整段跳过。 服务端不读取。子弹编号只在客户端把本对象和 Public/Bullet.txt 关联起来时用。
第 19 列
INT:持续时间
持续时间。保存为 m_nContinuance,单位与计时器一致。 空为 0,等于不持续。
第 20 列
INT:激活或触发时间间隔
激活或触发的时间间隔。保存为 m_nInterval。 空为 0。
第 21 列
FLOAT:触发半径
触发半径,按 FLOAT 读取。保存为 m_fTriggerRadius。 空为 0,等于只有正中心才触发。
第 22 列
FLOAT:影响半径
影响半径,按 FLOAT 读取。保存为 m_fEffectRadius。 空为 0,等于只影响触发点。
第 23 列
INT:影响个体数目
影响个体的最大数目。保存为 m_nEffectedObjNumber。 空为 0,等于不影响任何对象。
第 24 列
INT:预留
预留列。服务端在读完第 23 列后执行 column += 5,把第 24 到 28 列整段跳过。 服务端不读取。
第 25 列
INT:预留
预留列。服务端在读完第 23 列后执行 column += 5,把第 24 到 28 列整段跳过。 服务端不读取。
第 26 列
INT:预留
预留列。服务端在读完第 23 列后执行 column += 5,把第 24 到 28 列整段跳过。 服务端不读取。
第 27 列
INT:预留
预留列。服务端在读完第 23 列后执行 column += 5,把第 24 到 28 列整段跳过。 服务端不读取。
第 28 列
INT:预留
预留列。服务端在读完第 23 列后执行 column += 5,把第 24 到 28 列整段跳过。 服务端不读取。
第 29 列
STRING:参数说明
第 1 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 30 列
INT:参数值
第 1 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 31 列
STRING:参数说明
第 2 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 32 列
INT:参数值
第 2 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 33 列
STRING:参数说明
第 3 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 34 列
INT:参数值
第 3 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 35 列
STRING:参数说明
第 4 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 36 列
INT:参数值
第 4 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 37 列
STRING:参数说明
第 5 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 38 列
INT:参数值
第 5 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 39 列
STRING:参数说明
第 6 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 40 列
INT:参数值
第 6 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 41 列
STRING:参数说明
第 7 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 42 列
INT:参数值
第 7 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 43 列
STRING:参数说明
第 8 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 44 列
INT:参数值
第 8 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 45 列
STRING:参数说明
第 9 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 46 列
INT:参数值
第 9 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 47 列
STRING:参数说明
第 10 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 48 列
INT:参数值
第 10 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 49 列
STRING:参数说明
第 11 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 50 列
INT:参数值
第 11 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 51 列
STRING:参数说明
第 12 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 52 列
INT:参数值
第 12 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 53 列
STRING:参数说明
第 13 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 54 列
INT:参数值
第 13 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 55 列
STRING:参数说明
第 14 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 56 列
INT:参数值
第 14 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 57 列
STRING:参数说明
第 15 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 58 列
INT:参数值
第 15 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 59 列
STRING:参数说明
第 16 个参数的说明文字。与下一列成对读入 Descriptor_T。 不参与逻辑。
第 60 列
INT:参数值
第 16 个参数的值。与上一列成对读入 Descriptor_T 的 m_nValue。 空为 0。
第 61 列
STRING:详细说明(内部使用)
内部详细说明。保存为 m_szDescription,在描述符之后读入。 不生效,仅供阅读。

常用修改实例

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

把 10 号特殊对象的持续时间从 30000 改为 60000

修改前:

INT	STRING	STRING	INT	INT	INT	INT	INT	STRING	INT	STRING	INT	STRING	INT	INT	INT	INT	STRING	INT	INT	FLOAT	FLOAT	INT	INT	INT	INT	INT	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING
ID	名称$1$	ToolTips$1$	类别	逻辑ID	隐形级别	陷阱专用标记	可激活次数	生存期持续特效	生存期持续音效	激发特效	激发音效	死亡特效	死亡音效	预留	预留	预留	 子弹ID	持续时间	激活或触发时间间隔	触发半径	影响半径	影响个体数目	预留	预留	预留	预留	预留	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	详细说明(内部使用)
10	萤火虫	萤火虫	0	1	0	0	0	萤火虫烟花	-1									30000	500	0	0	0						效果1	-1	效果2	-1	效果3几率	-1	效果3	-1																									

修改后:

INT	STRING	STRING	INT	INT	INT	INT	INT	STRING	INT	STRING	INT	STRING	INT	INT	INT	INT	STRING	INT	INT	FLOAT	FLOAT	INT	INT	INT	INT	INT	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING	INT	STRING
ID	名称$1$	ToolTips$1$	类别	逻辑ID	隐形级别	陷阱专用标记	可激活次数	生存期持续特效	生存期持续音效	激发特效	激发音效	死亡特效	死亡音效	预留	预留	预留	 子弹ID	持续时间	激活或触发时间间隔	触发半径	影响半径	影响个体数目	预留	预留	预留	预留	预留	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	参数说明	参数值	详细说明(内部使用)
10	萤火虫	萤火虫	0	1	0	0	0	萤火虫烟花	-1									60000	500	0	0	0						效果1	-1	效果2	-1	效果3几率	-1	效果3	-1																									

按第 1 列定位 10 号对象(萤火虫)。第 19 列是持续时间,样本值 30000,这里改成 60000,其余 60 列与另 288 行全部保留。

注意列号容易数错:第 9 到 18 列是服务端跳过的客户端显示区,第 18 列名叫「子弹ID」,持续时间在它之后一格。改之前先按列号数一遍。

示例块含类型行、列名行与该行原文,不能覆盖整张表。改完需要重启 Server。

验证与排查

Server 启动日志出现 “Load SpecialObjData.txt ... OK!”。改完重启后,让对应陷阱或机关触发一次,确认持续时间、触发半径与影响个体数符合新值;若改的是参数值,确认效果确实读到了新的 Descriptor。若整行没生效,先检查第 1 列是否落在 0 到 1022 之间。失败时恢复备份并重启。

有两段整列跳过

读完第 8 列后跳过 10 列(9 到 18),读完第 23 列后跳过 5 列(24 到 28)。在这两个区间里填任何值服务端都看不到,也不要指望靠它们调整行为。

子弹 ID 在跳过区里

第 18 列叫「子弹ID」,但服务端读第 9 到 18 列时是整段跳过的。它只在客户端把本对象和 Public/Bullet.txt 关联起来时起作用。

16 对参数是固定的

DESCRIPTOR_NUMBER 是 16,固定吃掉第 29 到 60 列。想加一对参数必须同时改类型行、列名行、所有数据行并改这个常量。

半径是 FLOAT

第 21、22 列按 FLOAT 读取,其余整数列按 INT 读取。类型行写错会让解析出来的值完全不对。

关联与依据

Public/Bullet.txt · Public/IDCollections.txt

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

  • Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.h:实际加载、解析、字段使用或示例关联依据
  • Common/Combat/DataRecords.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/Combat/DataRecords.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Obj/Obj_Special.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Skills/SkillLogic/Human/XiaoYaoSkill001.cpp:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/SpecialObjData.txt:实际加载、解析、字段使用或示例关联依据

本页核对 SpecialObjData_T::InitFromDB 的游标推进(两次整段跳过与 16 次 Descriptor_T)、MAX_ID=1023 与 DESCRIPTOR_NUMBER=16 两个上限、第 21/22 列的 FLOAT 读取;样本 289 行的编号范围与列宽经脚本核算。未启动服务端,陷阱的实际触发效果需要实测。