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

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


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

CommerceRelation.txt 是一张 21×21 的价格系数矩阵。文件和列数都必须正好是 22(MAX_COMMERCE_SCOPE + 1):第 1 行是表头行,内容是 0 到 21 的商区号,加载时被跳过;第 2 到 22 行是真正的源商区,每行第 1 列是自己的商区号,第 2 到 22 列是到 1 到 21 号商区的系数。样本 22 行、22 列。

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

文件位置与生效

项目 说明
运行文件 ../Public/Config/CommerceRelation.txt,路径写死在加载函数里,相对于 GameServer 工作目录。当前核对范围内客户端与 World 都不读本表。
读取程序 GameServer:TableInit::InitCommerceRelationTable 用 DBCFile::OpenFromTXT 打开 "../Public/Config/CommerceRelation.txt";读取后存进 g_CommerceRelationTbl
生效方法 停服后备份并修改实际副本,重启 Server。当前检索未发现单独重载入口。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

加载先断言行数与列数都等于 MAX_COMMERCE_SCOPE + 1(22),然后逐行取 nRecordLine = i + 1,断言第 1 列等于 i + 1,再读 21 个 FLOAT。

检查项 结论
第 1 行为什么被跳过 它是表头行,写的是目标商区号 0 到 21,不参与读取。
源商区号怎么校验 第 i+1 行的第 1 列必须等于 i+1,对不上会记错误日志并中止整表加载。
系数的取值范围 0 到 100,超出会记错误日志并把整张表清零。
矩阵是否要求对称 不要求。A 到 B 与 B 到 A 是两个独立的格子。
失败后的状态 整表 memset 清零,商路系数全部变成 0。

文件格式

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

字段详解

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

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:商区ID
商区编号。第 1 个数据行是表头行(内容是 0 到 21),加载时被整体跳过;真正被读取的是第 2 到 22 行,且第 i 行的这一列必须等于 i。 必填。第 2 行必须是 1、第 3 行必须是 2,依此类推;对不上会记错误日志并中止整表加载。
第 2 列
FLOAT:商区ID
从本行商区到 1 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 3 列
FLOAT:商区ID
从本行商区到 2 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 4 列
FLOAT:商区ID
从本行商区到 3 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 5 列
FLOAT:商区ID
从本行商区到 4 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 6 列
FLOAT:商区ID
从本行商区到 5 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 7 列
FLOAT:商区ID
从本行商区到 6 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 8 列
FLOAT:商区ID
从本行商区到 7 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 9 列
FLOAT:商区ID
从本行商区到 8 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 10 列
FLOAT:商区ID
从本行商区到 9 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 11 列
FLOAT:商区ID
从本行商区到 10 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 12 列
FLOAT:商区ID
从本行商区到 11 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 13 列
FLOAT:商区ID
从本行商区到 12 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 14 列
FLOAT:商区ID
从本行商区到 13 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 15 列
FLOAT:商区ID
从本行商区到 14 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 16 列
FLOAT:商区ID
从本行商区到 15 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 17 列
FLOAT:商区ID
从本行商区到 16 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 18 列
FLOAT:商区ID
从本行商区到 17 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 19 列
FLOAT:商区ID
从本行商区到 18 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 20 列
FLOAT:商区ID
从本行商区到 19 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 21 列
FLOAT:商区ID
从本行商区到 20 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。
第 22 列
FLOAT:商区ID
从本行商区到 21 号商区的价格系数,按 FLOAT 读取。 必须落在 0 到 100 之间,超范围会记错误日志并把整张表清零。

常用修改实例

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

把 1 号商区到 1 号商区的系数从 0.1 改为 0.2

修改前:

INT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT
商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID
1	0.1	0.5	0.5	1	1.2	2.3	2.8	2.8	2.3	1.73	1.8	2.8	2.8	2.8	2.8	1.8	2.3	2.8	2.8	2.8	2.8

修改后:

INT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT	FLOAT
商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID	商区ID
1	0.2	0.5	0.5	1	1.2	2.3	2.8	2.8	2.3	1.73	1.8	2.8	2.8	2.8	2.8	1.8	2.3	2.8	2.8	2.8	2.8

按第 1 列定位 1 号商区那一行(第 2 个数据行;第 1 个数据行是表头,值为 0 到 21,不参与读取)。第 2 列对应 1 号目标商区,样本值是 0.1,这里改成 0.2,其余 21 列与另 21 行全部保留。

系数按 FLOAT 读取,必须落在 0 到 100 之间,超出会把整张表清零——改之前先确认没有手滑多打一个零。

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

验证与排查

Server 启动日志出现 “Load CommerceRelation.txt ... OK!”。改完重启后,在两个商区之间跑一趟商路,确认买入与卖出的价格按新系数变化。若日志出现 Failed 且带 source / dest / value,说明有系数越界或源商区号错位,整张表此时已被清零。失败时恢复备份并重启。

第 1 个数据行是表头

样本第 1 行的内容是 0 到 21,是给人看的目标商区号,加载时整体跳过。不要把它当成 0 号商区的数据行。

源商区号必须等于行号

第 2 行的第 1 列必须是 1,第 3 行必须是 2。挪动行的顺序而不改第 1 列,会立刻触发错误日志并中止加载。

越界会清空整表

任何一个系数不在 0 到 100 之间,都会把 g_CommerceRelationTbl 整体 memset 成 0。后果是所有商路无利可图,而不是只有那一条出错。

常数写死 21

MAX_COMMERCE_SCOPE 是 21,行数与列数都必须正好是 22。想加一个商区必须同时改类型行、列名行、所有数据行并改这个常量。

关联与依据

Public/CityInfo.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/GameDefine_City.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/CommerceRelation.txt:实际加载、解析、字段使用或示例关联依据

本页核对 InitCommerceRelationTable 的 22×22 断言、源商区号等于行号的校验、系数的 0 到 100 范围与失败清零行为;样本 22 行的行数列数与编号递增经脚本核算。未启动服务端,商路价格的实际变化需要实测。