工程参考/配置文件/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-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 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 的格式串参数顺序;未启动服务端与游戏,公告的实际下发需要实测。