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

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


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

CampAndStand.txt 是一张 16×16 的布尔矩阵。第 1 列是本行阵营的编号,第 2 到 17 列依次是对 0 到 15 号阵营的立场:非 0 表示友好,0 表示不友好。样本 16 行、17 列。

判定入口是 CalcRelationType(对象1阵营, 对象2阵营, 管理器):先按对象 1 的阵营取一行,再按对象 2 的阵营查一列,得到友好或敌对。查不到行或对象 2 越界时按友好处理。

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

文件位置与生效

项目 说明
运行文件 ../Public/Config/CampAndStand.txt(宏 FILE_CAMP_AND_STAND),相对于进程工作目录;客户端从资源目录按同名文件加载。
读取程序 GameServer:TableInit::InitCampAndStandDataMgr 用 g_CampAndStandDataMgr.InitFromDB(FILE_CAMP_AND_STAND);客户端经 DBC_CAMP_AND_STAND 用 InitFromDBMemory 读同一份;判定在 Common/Combat/CampAndStand.cpp 的 CalcRelationType
生效方法 停服后备份并修改实际副本,重启 Server;客户端一侧需要随资源更新并重启客户端。两处副本必须一致,否则服务端判定与客户端显示会分叉。
样本格式 ASCIICRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

加载由 TemplateManager_T 完成:第 1 列的值当作数组下标写入第 nID 项,随后由 CampStandRecord_T::InitFromDB 从第 2 列开始读 16 个整数。

检查项 结论
编号能不能越界 不能。必须在 0 到 15 之间,否则 AssertEx 并丢弃该行(CampStandRecord_T::MAX_ID = 15)。
矩阵是否要求对称 不要求。A 对 B 友好不代表 B 对 A 友好,两端各自按自己的行判定。
查不到时怎么算 CalcRelationType 取不到行、或对象 2 的阵营不在 0 到 15 之间时,按友好返回。
非 0 就等于友好吗 是。判断式是 != 0,1 与其它正数完全等价。
两端副本 服务端从文件读,客户端从自己的 DBC 读,必须同时改。

文件格式

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

字段详解

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

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:Camp\Camp
本行阵营的编号,同时是 DBC 索引列。TemplateManager_T 把它当作数组下标写入 m_vTemplateList[nID],因此必须落在 0 到 15 之间。 必填且不能重复。超出 0 到 15 会触发 AssertEx 并丢弃该行;空首列同样让整行被跳过。
第 2 列
INT:0
本阵营对 0 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 3 列
INT:1
本阵营对 1 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 4 列
INT:2
本阵营对 2 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 5 列
INT:3
本阵营对 3 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 6 列
INT:4
本阵营对 4 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 7 列
INT:5
本阵营对 5 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 8 列
INT:6
本阵营对 6 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 9 列
INT:7
本阵营对 7 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 10 列
INT:8
本阵营对 8 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 11 列
INT:9
本阵营对 9 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 12 列
INT:10
本阵营对 10 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 13 列
INT:11
本阵营对 11 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 14 列
INT:12
本阵营对 12 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 15 列
INT:13
本阵营对 13 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 16 列
INT:14
本阵营对 14 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。
第 17 列
INT:15
本阵营对 15 号阵营的立场。非 0 表示友好,0 表示不友好。CalcRelationType 先按对象 1 的阵营取这一行,再按对象 2 的阵营查这一列。 空或非数字经 atoi 视为 0,也就是不友好。矩阵不要求对称:A 对 B 友好不代表 B 对 A 友好。

常用修改实例

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

把 0 号阵营对 10 号阵营的立场从友好改为不友好

修改前:

INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
Camp\Camp	0	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15
0	0	0	0	0	0	0	0	0	0	1	1	0	0	0	0	0

修改后:

INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
Camp\Camp	0	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15
0	0	0	0	0	0	0	0	0	0	1	0	0	0	0	0	0

按第 1 列定位 0 号阵营。它第 12 列对应 10 号阵营(第 2 列对应 0 号,依次后移),样本值是 1,这里改成 0,其余 16 列与另 15 行全部保留。

改完后 0 号阵营的成员看 10 号阵营不再是友好关系。注意矩阵不对称:10 号阵营那一行仍然写着对 0 号友好,反过来判定不会变,需要同时改第 11 行第 2 列。

示例块含类型行、列名行与该行原文,不能覆盖整张表。改完需要重启 Server,并同步更新客户端资源。

验证与排查

Server 启动日志出现 “Load CampAndStand.txt ... OK!”。改完重启后,让两个阵营的角色互相接近,用可选目标的颜色或技能可否命中验证关系是否按新矩阵判定;同时确认反向(10 对 0)没有跟着变。客户端要更新资源后重启再看显示。失败时恢复备份并重启。

列名是 0 到 15,不是 1 到 16

第 2 列对应 0 号阵营,第 17 列对应 15 号阵营。改的时候别把列号当成阵营号。

矩阵不对称

判定按「对象 1 的行、对象 2 的列」,改一行只影响一个方向。想让两个阵营互相敌对,要改两个格子。

查不到按友好处理

CalcRelationType 在取不到行、或对方阵营越界时返回 RELATION_FRIEND。删掉一行的后果是「所有人看它都算友好」,而不是报错。

两端副本要同步

服务端从 FILE_CAMP_AND_STAND 指的文件读,客户端从自己的 DBC 读。只改一边会让判定和显示不一致。

关联与依据

Public/ReputationTable.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/CampAndStand.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/Combat/CampAndStand.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Common/TDDBC_Struct.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/DBC/GMDataBase.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/Procedure/GameProcedure.cpp:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/CampAndStand.txt:实际加载、解析、字段使用或示例关联依据

本页核对 TemplateManager_T 按下标写入的行为、CampStandRecord_T::InitFromDB 的 16 列循环与 MAX_ID=15、CalcRelationType 的取行查列与越界按友好处理;样本 16 行的编号范围经脚本核算。未启动服务端与客户端,实际敌我表现需要实测。