工程参考/配置文件/Server/NotifyDate.txt

来自天龙知识库
雪舞留言 | 贡献2026年9月12日 (六) 00:49的版本 (维护配置文件知识库:完整字段、读取范围、手工修改实例与核对状态)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航跳到搜索


首页 · 配置文件索引 · 修改约定

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-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 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+日 的计算方式;未启动服务端与游戏,实际推送需要实测。