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

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


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

ActivityRuler.txt 给活动规则配场景分组。第 1 列是规则号,之后每两列为一组:场景号与权重,最多 10 组。样本 23 行、21 列。

规则号由 Public/ActivityNotice.txt 的第 29 列指向。加载时把每组的场景号与权重存进 m_idScene[j]m_nRate[j],并用 m_sizGroup 记录有效组数。

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

文件位置与生效

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

加载时先取行数作为规则数(上限 MAX_ACTIVITY_NOTICE = 256),再对每一行从第 1 组开始扫:读出场景号与权重后,只要其中一个是 -1 就 break,否则把有效组数更新为 j + 1

检查项 结论
一组几列 2 列。第 j 组(j 从 0 起)占第 2 + 2j3 + 2j 列。
最多几组 10 组,对应 MAX_ACTIVITY_SCENE_GROUP = 10,正好用完 21 列。
怎样表示没有更多组 把场景号或权重填 -1,扫描到此停止。
有效组数 m_sizGroup 只在读到有效组时才更新;第一组就是 -1 时它保持全局零初始化的 0。
权重是否要归一 只断言非负,不要求各组合计等于某个值。

文件格式

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

字段详解

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

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:actid
活动规则编号,同时是 DBC 索引列。由 Public/ActivityNotice.txt 的第 29 列指向这里。加载时只断言非负,不校验它是否等于行号。 必填且不能重复。空首列会让整行被跳过。
第 2 列
INT:sceneid_0
第 1 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 3 列
INT:rate_0
第 1 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 4 列
INT:sceneid_1
第 2 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 5 列
INT:rate_1
第 2 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 6 列
INT:sceneid_2
第 3 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 7 列
INT:rate_2
第 3 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 8 列
INT:sceneid_3
第 4 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 9 列
INT:rate_3
第 4 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 10 列
INT:sceneid_4
第 5 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 11 列
INT:rate_4
第 5 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 12 列
INT:sceneid_5
第 6 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 13 列
INT:rate_5
第 6 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 14 列
INT:sceneid_6
第 7 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 15 列
INT:rate_6
第 7 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 16 列
INT:sceneid_7
第 8 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 17 列
INT:rate_7
第 8 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 18 列
INT:sceneid_8
第 9 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 19 列
INT:rate_8
第 9 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。
第 20 列
INT:sceneid_9
第 10 组的场景 ID。与同一组的权重配对使用;遇到 -1 就停止读取后面的组。 必填。填 -1 表示这一组及之后都不启用。样本第 1 组常用 0 与 1,其余组全是 -1。
第 21 列
INT:rate_9
第 10 组的权重。与同一组的场景 ID 配对使用;遇到 -1 同样停止读取。 必填。只断言非负,不要求各组合计等于某个值。

常用修改实例

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

把 0 号规则第 2 组的权重从 1 改为 3

修改前:

INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
actid	sceneid_0	rate_0	sceneid_1	rate_1	sceneid_2	rate_2	sceneid_3	rate_3	sceneid_4	rate_4	sceneid_5	rate_5	sceneid_6	rate_6	sceneid_7	rate_7	sceneid_8	rate_8	sceneid_9	rate_9
0	0	1	1	1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1

修改后:

INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
actid	sceneid_0	rate_0	sceneid_1	rate_1	sceneid_2	rate_2	sceneid_3	rate_3	sceneid_4	rate_4	sceneid_5	rate_5	sceneid_6	rate_6	sceneid_7	rate_7	sceneid_8	rate_8	sceneid_9	rate_9
0	0	1	1	3	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1

按第 1 列定位 0 号规则。它的第 1 组是场景 0 权重 1,第 2 组是场景 1 权重 1;这里只把第 5 列(第 2 组的权重)改成 3,其余 20 列与另 22 行全部保留。

第 2 组之后的列全是 -1,扫描在第 3 组停止,所以有效组数仍是 2。改权重不会改变组数,也不会触发任何合计校验。

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

验证与排查

World 启动日志出现 “Load ActivityRuler.txt ... OK!”。改完重启 World,让对应活动多次触发,统计它把玩家分到各场景的比例是否接近新的权重比。样本里多数规则只有第 1 组有效,改后面的组可能看不出差别。失败时恢复备份并重启。

-1 是终止符

场景号与权重任意一个为 -1 就停止扫描,后面即使填了值也不会被读入。想启用更多组,必须把前面的 -1 改成真实值。

有效组数只在读到有效组时更新

m_sizGroup = j + 1 写在 break 之前,所以扫到第 j 组就把组数记成 j+1。若第一组就是 -1,这个字段保持全局零初始化得到的 0。

21 列正好是 10 组

1 列编号加 10 组 × 2 列。想加第 11 组就必须同时给类型行、列名行和所有数据行补两列,并改 MAX_ACTIVITY_SCENE_GROUP。

关联与依据

Public/ActivityNotice.txt

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

  • Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/WorldServer/World/Main/WorldTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/WorldServer/World/Main/WorldTable.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/ActivityRuler.txt:实际加载、解析、字段使用或示例关联依据

本页核对 Init_ActivityRulerTable 的 2 列循环、MAX_ACTIVITY_SCENE_GROUP=10 的上限、-1 终止条件与 m_sizGroup 的更新时机;样本 23 行的列宽与编号唯一性经脚本核算。未启动服务端,实际分组效果需要实测。