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

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


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

GeneralSets.txt 只有一行、18 列:第 1 列是集合编号,第 2 列是说明文字,第 3 到 18 列是这个集合里的 16 个整数元素。

当前只有一个集合类型生效:第 0 行是**允许做银行操作的场景 ID 清单**。某个场景不在清单里时,玩家在该场景打开银行会被服务端拒绝。

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

文件位置与生效

项目 说明
运行文件 ./Config/GeneralSets.txt,由 FileDef.h 的 FILE_GENERAL_SETS 定义,相对于 Server 工作目录。当前检索没有发现客户端读取这份文件。
读取程序 Server 进程:TableInit::InitGeneralSetsTable 打开 FILE_GENERAL_SETS;六处 CGBank*Handler 用 g_GeneralSetsTbl.Contains(GENERAL_SET_BANK, 场景ID) 判定
生效方法 正常保存并停服后重启 Server。当前检索未发现单独重载本文件的可用入口。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

加载时先断言行数**恰好等于** GENERAL_SET_NUM(1)、列数至少 2 + GENERAL_SET_SIZE(16),然后对每个集合读 16 个整数到 m_aSets[i][j]

约束 说明
行数 必须正好 1 行数据(GENERAL_SET_NUM)。多一行少一行都会断言。
列数 至少 18 列(索引、描述、16 个元素)。多出来的列不影响,少了直接返回。
集合类型 枚举只有 GENERAL_SET_BANK = 0 一种,GENERAL_SET_NUM = 1 表示就这一个集合。
元素个数 固定读 16 个;样本只用了 5 个场景,其余填 -1 占位。

消费点是 Contains(集合类型, 值),它线性扫 16 个元素做相等判断,命中即通过。样本开放的场景是 0、1、2、186、420。

文件格式

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

字段详解

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

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:索引
集合编号。必须为 0,因为代码只认 GENERAL_SET_BANK = 0;这一行的行号才是集合下标,列值不参与寻址。 行数必须正好 1;重复行会让行数断言失败。
第 2 列
STRING:描述
人工说明文字(样本「银行所在地」)。Search_Posistion 只读整数元素,这一列服务端不读。 不读取;写什么都不会影响银行判定。
第 3 列
INT:Element0
集合的第 0 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 4 列
INT:Element1
集合的第 1 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 5 列
INT:Element2
集合的第 2 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 6 列
INT:Element3
集合的第 3 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 7 列
INT:Element4
集合的第 4 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 8 列
INT:Element5
集合的第 5 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 9 列
INT:Element6
集合的第 6 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 10 列
INT:Element7
集合的第 7 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 11 列
INT:Element8
集合的第 8 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 12 列
INT:Element9
集合的第 9 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 13 列
INT:Element10
集合的第 10 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 14 列
INT:Element11
集合的第 11 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 15 列
INT:Element12
集合的第 12 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 16 列
INT:Element13
集合的第 13 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 17 列
INT:Element14
集合的第 14 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。
第 18 列
INT:Element15
集合的第 15 个元素,对第 0 行来说就是一个**允许做银行操作的场景 ID**。Contains 逐个比较这 16 个值。 必须填整数。用不到的位置填 -1 占位(-1 不会等于任何合法场景 ID);留空会被 atoi 解析成 0,等于把场景 0 也算进清单,与样本第 3 列重复但无害——不过建议显式写 -1 以免误会。

常用修改实例

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

给银行清单再开放一个场景(把第一个空位从 -1 改成 431)

修改前:

INT	STRING	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
索引	描述	Element0	Element1	Element2	Element3	Element4	Element5	Element6	Element7	Element8	Element9	Element10	Element11	Element12	Element13	Element14	Element15
0	银行所在地	0	1	2	186	420	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1

修改后:

INT	STRING	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
索引	描述	Element0	Element1	Element2	Element3	Element4	Element5	Element6	Element7	Element8	Element9	Element10	Element11	Element12	Element13	Element14	Element15
0	银行所在地	0	1	2	186	420	431	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1

按第 1 列定位唯一的那一行。样本前 5 个位置依次是 0、1、2、186、420,第 6 个位置(第 8 列 Element5)原本是 -1,改成 431——这是一个教学用的场景号,实际开放时填真实的目标场景 ID。

改完重启 Server,在 431 场景里尝试打开银行应当成功,在清单外的场景里会被拒绝。只改这一列,其余 17 列保持原样。示例块含类型行、列名行与该行原文,不能覆盖整表。

验证与排查

改动后重启 Server,分别到清单内的场景和清单外的场景执行银行操作:清单内可以打开界面并存、取、换位置的钱物;清单外服务端不会处理对应的 CG 包。想确认改动是否生效,最省事的办法是临时把自己的目标场景从清单里删掉,看该场景是否立刻不能开银行。

行数或列数不对会在启动时 Assert;元素写成负数(除 -1 外)不会报错,只会永远匹配不到。

这张表看着像通用机制,其实只有一个用途

GENERAL_SET_TYPE 里只有 GENERAL_SET_BANK 一项,GENERAL_SET_NUM = 1。别指望加第二行就能开出一个新的开关——加行会先撞上行数断言。

元素是 16 个固定槽位,不是列表

没有「元素个数」这一列,永远是 16 个。写不下就放不下;留空会被解析成 0 而不是「无」。

描述列不参与逻辑

第 2 列是人看的说明,改成什么都行,但保持与实际内容一致能少踩坑。

与 IPRange.ini 是两套东西

这里管的是「哪些场景能用银行」,不是访问限制;IP 白名单在别的文件里。

关联与依据

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

  • Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Packets/CGBankMoneyHandler.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据
  • resources/Server/Config/GeneralSets.txt:实际加载、解析、字段使用或示例关联依据

本页核对 InitGeneralSetsTable 的行列断言与 16 元素读取循环、GENERAL_SET_TYPE 枚举,以及 CGBank*Handler 里 Contains(GENERAL_SET_BANK, 场景ID) 的调用方式;未启动服务端与游戏,银行界面的实际表现需要实测。