工程参考/配置文件/Server/NotifyOnline.txt
NotifyOnline.txt 是登录公告的**控制表**:它决定「什么时候用哪张表 / 哪段文本」。真正的文案要么写在本表第 4 列,要么写在 NotifyWeek.txt、NotifyDate.txt 里由本表间接引用。样本 12 行、4 列。
每行都是一个独立开关:可以一直推送(模式 0),也可以把推送权交给星期表(模式 1)或日期区间表(模式 2),还可以只在玩家上次是代理 / 非代理登录时提示(模式 4 / 5)。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ./Config/NotifyOnline.txt,相对 Server 工作目录;路径写死在 LoadNotifyOnlineTab 里,FileDef.h 没有对应宏。
|
| 读取程序 | Server 进程:CNotifyOnlineMng 在 NotifyOnline.cpp 里加载,PlayerLoginProcess 在玩家进入场景时逐行处理 |
| 生效方法 | 正常保存并停服后重启 Server。LoadTab 由Startup 调用一次,之后内存中就固定了;当前检索未发现单独重载入口。
|
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
处理顺序在 PlayerLoginProcess 里:先跳过 isShow = 0 的行,再按 mode 分支。日期取 年*10000 + 月*100 + 日(八位整数),星期取 tm_wday(0 = 周日)。
| mode | 行为 |
|---|---|
| 0 | 直接把本行第 4 列作为系统聊天消息发给玩家。 |
| 1 | 忽略本行第 4 列,转为按当前星期去 NotifyWeek.txt 匹配。 |
| 2 | 忽略本行第 4 列,转为按当前日期去 NotifyDate.txt 匹配(区间闭合)。 |
| 4 | 仅当上次登录 IP 命中 proxyIP 名单时,把第 4 列按格式串填参后发送。 |
| 5 | 仅当上次登录 IP **没有**命中 proxyIP 名单时,按同样的格式串填参发送。 |
| 其它值 | 没有任何分支,静默忽略(样本没有这类值,3 与 6 以上都一样)。 |
模式 4 / 5 的第 4 列必须是**格式串**:代码用 tsnprintf 依次填入 8 个参数——年、月、日、时,以及上次登录 IP 的四个字节(也就是 8 个占位符依次对应 .\d.%d.%d.%d)。少写一个占位符会把后面的实参挤到错误位置;多写会取到垃圾值。
所有这三种文案最终都经 ChatMsg 发出,系统聊天消息的长度字段只有一个字节,超过 255 的部分会被直接截断。
文件格式
首行是类型行:INT INT INT STRING;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:index |
人工编号,加载时存进 id,但后续逻辑(是否启用、模式、按什么匹配)都不看它,只用行号遍历。 | 不参与判定。允许重复,也不要求连续。 |
第 2 列INT:isShow |
是否处理这一行。0 直接 continue 跳过整行;非 0 进入模式分支。样本只有前两行是 1。 | 缺失经解析为 0,等同于「关掉这一行」。 |
第 3 列INT:mode |
推送方式:0 立即发文本;1 交给星期表;2 交给日期表;4 仅代理登录提示;5 仅非代理登录提示。 | 其它值没有任何分支,写了不会报错也不会生效。 |
第 4 列STRING:info$1$ |
文案本体(模式 0),或模式 4 / 5 用的格式串。可以直接写颜色控制记号,样本第 1 行就是带 #cff0000 的彩色文本。 | 模式 1 / 2 下这一列被忽略,写什么都行。加载时断言长度小于 256;实际发送时按单字节长度截断到 255。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。
启用第 2 行那条被关掉的「临时通知」
修改前:
INT INT INT STRING index isShow mode info$1$ 2 0 0 临时通知。
修改后:
INT INT INT STRING index isShow mode info$1$ 2 1 0 临时通知。
按第 1 列定位 index 2(临时通知,mode 0)。原本 isShow 是 0,改成 1 之后每个玩家登录都会收到这一行的文本。
这是本表最安全的改法:只动开关,不动模式与文案。改完重启 Server 并重新登录一个角色确认。示例块含类型行、列名行与该行原文,不能覆盖整表。
反向操作(把某一行改成 0)同样有效,适合在不停服能力强系统的情况下临时停掉一条公告。
验证与排查
改动后重启 Server,用小号重新登录:模式 0 的行应当立刻在聊天框里看到文本;模式 4 / 5 的行需要这个号换过 IP 或换过代理状态才会出现;模式 1 / 2 的行要看 NotifyWeek.txt / NotifyDate.txt 是否命中当前星期与日期(日期必须写成八位整数,例如 20260911)。
模式 1 / 2 会忽略本行的文案
这是最容易误会的地方:既然交给星期表或日期表处理,本行第 4 列写什么都无所谓。想改文案请去对应的那张表。
模式 4 / 5 的第 4 列是格式串不是文本
八个占位符依次是年、月、日、时、IP 四个字节。写错顺序会把 IP 拼进日期的位置。加载时的断言只检查长度小于 256,不检查占位符个数。
文本超过 255 会被静默截断
系统聊天消息长度字段是 BYTE,ChatMsg 里强制转成 BYTE 后截断,没有日志。
上行上限 16 行
m_tabOnline[16],超过 16 行的部分读不进来(Assert(nRecords <= 16))。
proxyIP 名单是另一份文件
模式 4 / 5 依赖 proxyIP.txt 判定,本页不涉及那份文件。
关联与依据
Server/NotifyWeek.txt · Server/NotifyDate.txt
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Server/Server/GameServer/Server/Module/NotifyOnline.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Module/NotifyOnline.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据resources/Server/Config/NotifyOnline.txt:实际加载、解析、字段使用或示例关联依据
本页核对 LoadNotifyOnlineTab 的列读取与 16 行上限、PlayerLoginProcess 里五种 mode 的分支、日期与星期的计算方式,以及模式 4 / 5 的格式串参数顺序;未启动服务端与游戏,公告的实际下发需要实测。