工程参考/配置文件/Server/NotifyDate.txt
NotifyDate.txt 是「日期区间 → 文案」的对照表:第 2、3 列是起止日期(八位 YYYYMMDD),第 4 列是这段时间内登录后要发的文案。样本 40 行,内容是平安夜、圣诞节、元旦、情人节这类固定日期的问候。
和星期表一样,它自己不会生效,需要 NotifyOnline.txt 里 mode = 2 的行把日期转换领进去。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ./Config/NotifyDate.txt,相对 Server 工作目录;路径写死在加载函数里。
|
| 读取程序 | Server 进程:NotifyOnline.cpp 的 LoadNotifyDateTab 加载,NotifyDateProcess 在 NotifyOnline.txt 出现 mode = 2 的行时按当前日期匹配 |
| 生效方法 | 正常保存并停服后重启 Server。仅在 NotifyOnline.txt 有 mode = 2 且 isShow ≠ 0 的行时才会被用到。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
日期由 PlayerLoginProcess 算成 年*10000 + 月*100 + 日,例如 2026 年 9 月 11 日是 20260911。判定式是 datBegin <= iDate && datEnd >= iDate,**两端都包含**。
| 检查项 | 行为 |
|---|---|
| 区间写法 | 同一天写成起止相同即可;跨月、跨年也支持,因为它只是一个整数比较。 |
| 多条命中 | 全部发送,不做去重。 |
| 上限 | 最多 64 行(m_tabDate[64]),超出读不进来。 |
| 过期条目 | 不会报错,只是永远匹配不到;样本里就保留着 2006、2007 年的条目。 |
文件格式
首行是类型行:INT INT INT STRING;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:index |
人工编号,判定不看它。 | 不参与判定,允许重复。 |
第 2 列INT:BeginDate |
区间起始日期,格式 YYYYMMDD(如 20061224)。包含在判定范围内。 | 填 0 会让所有日期都满足“不小于起点”;加载过程不校验是不是合法日期,写 20261332 也不会报错,只是匹配不到。 |
第 3 列INT:EndDate |
区间结束日期,格式同上。包含在判定范围内。 | 小于起始日期时这条永远匹配不到。 |
第 4 列STRING:info$1$ |
命中区间时发送的文案。 | 发送时按单字节长度截断到 255;空串会发出一条空的系统消息。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。
把新年问候的有效期从 1 月 1 日延长到 1 月 3 日
修改前:
INT INT INT STRING index BeginDate EndDate info$1$ 2 20070101 20070101 新年伊始,万象更新,天龙八部祝您在新的一年里,心想事成,万事如意。
修改后:
INT INT INT STRING index BeginDate EndDate info$1$ 2 20070101 20070103 新年伊始,万象更新,天龙八部祝您在新的一年里,心想事成,万事如意。
按第 1 列定位 index 2(新年问候,起止原本都是 20070101)。只改第 3 列:20070101 → 20070103,之后 1 月 1 日到 1 月 3 日每天登录都会收到这条提示(两端都算在内)。
样本里的年份是 2007,实际启用请把日期改成今年的值。八位整数的写法不能有分隔符:2007-01-03 会被解析失败。其余三列保持原样。示例块含类型行、列名行与该行原文,不能覆盖整表。
验证与排查
改动后重启 Server,并确认 NotifyOnline.txt 里存在 mode = 2 且 isShow ≠ 0 的行。把某行的起始日期改成今天、结束日期改成明天,登录角色应当看到这条文案;把同样的起止改成去年,同一年内不会再出现这条提示。
换行、恢复后重启。
八位整数,两端包含
写 20070101 而不是 2007-01-01;datBegin <= iDate && datEnd >= iDate,起止当天都算数。
跨年只是整数比较
没有其他日历逻辑,20261225 到 20270105 这种跨年区间可以直接写。
过期条目不会报错
超过 64 行之外读不进来,读进来的过期条目只是永远命中不了,不会有任何提示——这也是样本里堆着大量 2006/2007 年条目的原因。
入口开关在另一张表
没有 NotifyOnline.txt 的 mode = 2 行,这张表不会被遍历。
关联与依据
Server/NotifyOnline.txt · Server/NotifyWeek.txt
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Server/Server/GameServer/Server/Module/NotifyOnline.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Module/NotifyOnline.h:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据resources/Server/Config/NotifyDate.txt:实际加载、解析、字段使用或示例关联依据
本页核对 LoadNotifyDateTab 的四列读取与 64 行上限、NotifyDateProcess 的闭区间判定式,以及 iDate = 年*10000+月*100+日 的计算方式;未启动服务端与游戏,实际推送需要实测。