查看“︁工程参考/配置文件/Public/ActivityNotice.txt”︁的源代码
来自天龙知识库
←
工程参考/配置文件/Public/ActivityNotice.txt
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{DISPLAYTITLE:<span style="font-size:24px;line-height:1.4;overflow-wrap:anywhere;">工程参考/配置文件/Public/ActivityNotice.txt</span>}} __NOTOC__ <div class="config-file-reference" style="max-width:1200px;margin:0 auto;line-height:1.8;color:#29343a;font-family:Arial,'Microsoft YaHei',sans-serif;letter-spacing:0;overflow-wrap:anywhere;"> [[首页|首页]] · [[工程参考/配置文件索引|配置文件索引]] · [[工程参考/配置文件修改约定|修改约定]] ActivityNotice.txt 是活动公告与广播表。第 1 列是活动编号,第 4 列是开始时间点,第 7 列是持续格数,第 8 到 12 列是交给脚本的预留参数,第 13 到 28 列是五段广播的频道、间隔、文案与结束时间点,第 29 列指向 Public/ActivityRuler.txt 的规则号,第 30 列是活动名称,第 31 列是失效时间点。样本 148 行、31 列。 这张表被两个进程分成两段读:World 只关心编号、操作类型、时间类型、开始时间、场景、脚本、持续格数、五个预留参数与规则号;GameServer 的 Activity.cpp 只关心编号、时间类型、开始时间、场景、脚本、预留参数、五段广播,以及名称与失效时间。两段的并集正好覆盖全部 31 列。 [[#文件位置与生效|位置与生效]] · [[#文件格式|文件格式]] · [[#字段详解|字段详解]] · [[#常用修改实例|修改实例]] == 文件位置与生效 == {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 项目 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 说明 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 运行文件 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">../Public/Config/ActivityNotice.txt</code>,路径分别写死在 WorldTable.cpp 与 Activity.cpp 里,相对于各自进程的工作目录。客户端不加载本表。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读取程序 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | World 进程:TableInit::Init_ActivityNoticeTable;GameServer 进程:SActivity_Notice_Table::LoadActivityNoticeTable(构造时加载)。两个进程各读一半列 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 生效方法 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 停服后备份并修改 Public/Config 下的实际副本,再重启 World 与 Server。Activity 侧的表在 SActivity_Notice_Table 构造时加载一次,当前检索未发现单独重载入口。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 样本格式 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">GB18030-compatible</code>,<code style="white-space:normal;overflow-wrap:anywhere;">CRLF</code>。保留原编码;源码读取器不会自动把中文转为 UTF-8。 |} === 两个进程各读一半 === {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:34%;text-align:left;background:#edf3f2;padding:8px;" | 进程与函数 ! scope="col" style="width:42%;text-align:left;background:#edf3f2;padding:8px;" | 读取的列 ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 用途 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | World · Init_ActivityNoticeTable | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">1 到 12、29</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 编号、操作类型、时间类型、开始时间、场景、脚本、持续格数、五个预留参数,以及规则号。持续格数为 0 时结束时间直接等于开始时间。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | GameServer · SActivity_Notice_Table | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">1、3、4、5、6、8 到 28、30、31</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 广播频道、五段广播的间隔 / 文案 / 结束时间点,编号、时间类型、开始时间、场景、脚本、预留参数,以及名称与失效时间。间隔与开始时间统一乘 60000 转毫秒。 |} 时间点的编码是:低两位为按 15 分钟一格的序号(0 到 95,覆盖 0:00 到 23:45),高位为天数偏移。World 侧据此算结束时间:<code style="white-space:normal;overflow-wrap:anywhere;">tick = 开始时间 % 100 + 持续格数</code>,<code style="white-space:normal;overflow-wrap:anywhere;">结束时间 = 100 * (开始时间 / 100) + 100 * (tick / 96) + tick % 96</code>,其中的 <code style="white-space:normal;overflow-wrap:anywhere;">/ 96</code> 就是向高位进位。 {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 检查项 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 结论 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 编号怎么定位 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | World 侧写入 m_id 只断言非负;Activity 侧把它当作数组下标 m_aActivity_Notice[uIndex],必须小于 MAX_NOTICE_NUM(256)。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 行数上限 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 两端都断言不超过 MAX_ACTIVITY_NOTICE(256)。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 间隔的单位 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 分钟。Activity 侧乘 60000 转成毫秒。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 文案长度 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 按 255 字节截断,缓冲区 256 字节;汉字会被截在字节边界上。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 规则号给谁用 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只有 World 侧读第 29 列,Activity.cpp 不读。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读了但没再用的列 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只有第 30 列活动名称:Activity.cpp 存进 m_szName 后,服务端源码里没有再读它的地方。 |} == 文件格式 == 首行是类型行:<code style="white-space:normal;overflow-wrap:anywhere;">INT INT INT INT INT INT INT INT INT INT INT INT INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT</code>;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。 == 字段详解 == 列号从 1 开始,源码列下标从 0 开始。 {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:34%;text-align:left;background:#edf3f2;padding:8px;" | 字段与类型 ! scope="col" style="width:42%;text-align:left;background:#edf3f2;padding:8px;" | 含义与修改要点 ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 缺项或特殊值 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 1 列</code><br>INT:id | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动编号。World 侧写入 m_id 并断言非负;Activity 侧把它当作数组下标 m_aActivity_Notice[uIndex],因此必须落在 0 到 255 之间。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填且不能重复。超过 255 会被 Activity.cpp 断言并跳过该行,两进程读到的数据就对不上了。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 2 列</code><br>INT:opt_type | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 操作类型。World 侧写入 m_OptType 并断言非负。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。当前核对范围内没有按它分支的代码,语义由脚本决定。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 3 列</code><br>INT:time_type | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 时间类型。World 侧写入 m_TimeType、Activity 侧写入 m_nTimeType,都断言非负。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。取值含义由脚本解释,源码里没有枚举。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 4 列</code><br>INT:time_start | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动开始时间点。World 侧写入 m_TimeStart,Activity 侧乘 60000 转成毫秒存为 m_uBeforeHand_Start_Time。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。低两位是按 15 分钟一格的序号(0 到 95),高位是天数偏移;World 侧算结束时间时用 tick/96 向高位进位。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 5 列</code><br>INT:sceneid | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动所在场景 ID。两端都读,Activity 侧断言不小于 -1。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。-1 表示不限场景。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 6 列</code><br>INT:scriptid | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动脚本 ID。两端都读,Activity 侧断言不小于 -1。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。-1 表示不挂脚本。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 7 列</code><br>INT:time_slice | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动持续的格数。World 侧只在它大于 0 时才推进结束时间,等于 0 时结束时间直接等于开始时间。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 空或非数字经 atoi 视为 0,等于「没有持续」。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 8 列</code><br>INT:reserve1 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 预留参数 1。World 侧写入 m_Param1,Activity 侧写入 m_ActivityReserveParam[0]。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 空为 0。两端都原样保存,语义由脚本决定。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 9 列</code><br>INT:reserve2 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 预留参数 2。写入 m_Param2 与 m_ActivityReserveParam[1]。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 空为 0。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 10 列</code><br>INT:reserve3 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 预留参数 3。写入 m_Param3 与 m_ActivityReserveParam[2]。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 空为 0。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 11 列</code><br>INT:reserve4 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 预留参数 4。写入 m_Param4 与 m_ActivityReserveParam[3]。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 空为 0。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 12 列</code><br>INT:reserve5 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 预留参数 5。写入 m_Param5 与 m_ActivityReserveParam[4]。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 空为 0。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 13 列</code><br>INT:广播类型 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 广播频道。Activity 侧写入 m_uBroadCastType,缺省值是 CHAT_TYPE_SYSTEM(4)。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。落在不同频道枚举范围外会让广播发不出去。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 14 列</code><br>INT:慢报间隔 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 提前广播的时间间隔,单位是分钟。Activity 侧乘 60000 转毫秒。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。0 表示该段不按间隔重复。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 15 列</code><br>STRING:慢报内容$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 提前广播的文案。按 255 字节截断后补零,缓冲区是 256 字节。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。写满 255 个汉字会被截成半个字。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 16 列</code><br>INT:慢报结束时间点 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 提前广播的结束时间点,原样保存,不乘 60000。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。与开始时间点是同一套编码。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 17 列</code><br>INT:快报间隔 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 即将开始广播的时间间隔,单位是分钟。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 18 列</code><br>STRING:快报内容$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 即将开始广播的文案。同样按 255 字节截断。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 19 列</code><br>INT:快报结束时间点 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 即将开始广播的结束时间点。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 20 列</code><br>INT:刚开报间隔 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 刚开始广播的时间间隔,单位是分钟。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 21 列</code><br>STRING:刚开报内容$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 刚开始广播的文案。同样按 255 字节截断。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 22 列</code><br>INT:刚开报结束时间点 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 刚开始广播的结束时间点。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 23 列</code><br>INT:进行中报间隔 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 进行中广播的时间间隔,单位是分钟。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 24 列</code><br>STRING:进行中报内容$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 进行中广播的文案。同样按 255 字节截断。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 25 列</code><br>INT:进行中报结束时间点 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 进行中广播的结束时间点。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 26 列</code><br>INT:快结束报间隔 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 即将结束广播的时间间隔,单位是分钟。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 27 列</code><br>STRING:快结束报内容$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 即将结束广播的文案。同样按 255 字节截断。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 28 列</code><br>INT:结束时间点 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动结束时间点,原样保存,不乘 60000。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 Activity.cpp 读取。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 29 列</code><br>INT:ruler | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动规则编号,指向 Public/ActivityRuler.txt 的第 1 列。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只在 World 侧读取,写入 m_nRuler。Activity.cpp 不读本列,所以规则只对 World 侧生效。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 30 列</code><br>STRING:活动名称$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 活动名称。只有 GameServer 的 Activity.cpp 读它,按 31 字节截断存进 m_szName(缓冲区 32 字节)。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读了但没有后续代码使用它,改名不会改变任何广播或界面。汉字同样会被截在字节边界。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">第 31 列</code><br>INT:失效时间 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 失效时间点。只有 GameServer 的 Activity.cpp 读它,存进 m_nTimeInvalid,在 Activity::CheckActiviyValidity 里参与判定。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 填 0 或负数表示不校验、活动一直有效;填正数时按第 3 列时间类型算出当前时间点,只有它大于当前值活动才有效。 |} == 常用修改实例 == 示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。 === 把 0 号活动的提前广播间隔从 30 分钟改为 45 分钟 === 修改前: <pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">INT INT INT INT INT INT INT INT INT INT INT INT INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT id opt_type time_type time_start sceneid scriptid time_slice reserve1 reserve2 reserve3 reserve4 reserve5 广播类型 慢报间隔 慢报内容$1$ 慢报结束时间点 快报间隔 快报内容$1$ 快报结束时间点 刚开报间隔 刚开报内容$1$ 刚开报结束时间点 进行中报间隔 进行中报内容$1$ 进行中报结束时间点 快结束报间隔 快结束报内容$1$ 结束时间点 ruler 活动名称$1$ 失效时间 0 0 1 66 0 808000 0 0 0 0 0 0 4 30 #{QJ_20080317_01} 230 3 #{QJ_20080317_02} 240 10 #{QJ_20080317_03} 320 3 #{QJ_20080317_04} 329 1 #{QJ_20080317_05} 330 0 棋局 -1</pre> 修改后: <pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">INT INT INT INT INT INT INT INT INT INT INT INT INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT INT STRING INT id opt_type time_type time_start sceneid scriptid time_slice reserve1 reserve2 reserve3 reserve4 reserve5 广播类型 慢报间隔 慢报内容$1$ 慢报结束时间点 快报间隔 快报内容$1$ 快报结束时间点 刚开报间隔 刚开报内容$1$ 刚开报结束时间点 进行中报间隔 进行中报内容$1$ 进行中报结束时间点 快结束报间隔 快结束报内容$1$ 结束时间点 ruler 活动名称$1$ 失效时间 0 0 1 66 0 808000 0 0 0 0 0 0 4 45 #{QJ_20080317_01} 230 3 #{QJ_20080317_02} 240 10 #{QJ_20080317_03} 320 3 #{QJ_20080317_04} 329 1 #{QJ_20080317_05} 330 0 棋局 -1</pre> 按第 1 列定位 0 号活动(棋局)。它第 14 列的提前广播间隔是 30,这里改成 45,其余 30 列与另 147 行全部保留。 只有 GameServer 的 Activity.cpp 读这一列,改完必须重启 Server 才生效;World 侧完全不看它。换算后的值是 45 × 60000 = 2700000 毫秒。 示例块含类型行、列名行与该行原文,不能覆盖整张表。 == 验证与排查 == World 启动日志出现 “Load ActivityNotice.txt ... OK!”;Activity 侧在自己的构造函数里加载,失败会直接断言。改完重启两个进程,等待对应活动的时间点,确认提前广播按新间隔出现、频道正确、文案没有在 255 字节处被截断。若规则号改过,还要确认 World 侧能取到 Public/ActivityRuler.txt 里对应的行。失败时恢复备份并重启。 === 编号是数组下标 === Activity.cpp 里 <code style="white-space:normal;overflow-wrap:anywhere;">m_aActivity_Notice[uIndex]</code> 直接用第 1 列的值当下标,且断言小于 256。填 300 会让这一行在 GameServer 侧被跳过,World 侧却照常加载,两边数据就不一致了。 === 两个进程的分工 === 第 2 列操作类型、第 7 列持续格数、第 29 列规则号只有 World 读;第 13 到 28 列的广播配置与第 30、31 列只有 GameServer 读;其余列两端都读。改之前先确认改的是哪一侧关心的列。 === 间隔的单位是分钟 === 第 4 列开始时间与第 14、17、20、23、26 列间隔都会被乘 60000。第 16、19、22、25、28 列的「结束时间点」不乘,用的是和第 4 列同一套编码。 === 失效时间怎么判定 === <code style="white-space:normal;overflow-wrap:anywhere;">Activity::CheckActiviyValidity</code> 先取第 31 列:小于等于 0 直接判有效,等于「不设失效时间」。大于 0 时才按第 3 列时间类型算当前时间点 —— 1 用格号,2 用「周 × 100 + 格号」,3 用「日 × 100 + 格号」,其余用「日 × 100 + 格号」去掉千年位;最后只有第 31 列大于这个值才算有效。所以想停用一条活动,把这一列填 1 之类的小正数比填 0 更有效。 == 关联与依据 == [[工程参考/配置文件/Public/ActivityRuler.txt|Public/ActivityRuler.txt]] [[工程参考/配置文件索引|其他配置及整理状态]] · [[工程参考/服务端外网设置|服务端外网设置]] · [[Lua接口/服务端函数索引|Lua 接口索引]] * <code style="white-space:normal;overflow-wrap:anywhere;">Common/DataBase/TLBB_DBC.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/DataBase/TLBB_DBC.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/WorldServer/World/Main/WorldTable.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/WorldServer/World/Main/WorldTable.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Activity/Activity.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Activity/Activity.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/FileDef.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">resources/Public/Config/ActivityNotice.txt</code>:实际加载、解析、字段使用或示例关联依据 本页核对两个加载器的列集与断言(MAX_ACTIVITY_NOTICE=256、MAX_NOTICE_NUM=256)、开始时间的 96 格进位算法、五段广播的 60000 毫秒换算与 255 字节截断、第 30 列「读入但无后续使用」与第 31 列在 CheckActiviyValidity 里的判定;样本 148 行的编号唯一性与列宽经脚本核算。未启动服务端,广播的实际触发时机需要实测。 </div> [[Category:工程参考]]
返回
工程参考/配置文件/Public/ActivityNotice.txt
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
创建账号
登录
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
搜索
工具
链入页面
相关更改
页面信息