工程参考/配置文件/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-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
加载时先取行数作为规则数(上限 MAX_ACTIVITY_NOTICE = 256),再对每一行从第 1 组开始扫:读出场景号与权重后,只要其中一个是 -1 就 break,否则把有效组数更新为 j + 1。
| 检查项 | 结论 |
|---|---|
| 一组几列 | 2 列。第 j 组(j 从 0 起)占第 2 + 2j 与 3 + 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。
关联与依据
其他配置及整理状态 · 服务端外网设置 · 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 行的列宽与编号唯一性经脚本核算。未启动服务端,实际分组效果需要实测。