查看“︁工程参考/配置文件/Server/NotifyOnline.txt”︁的源代码
来自天龙知识库
←
工程参考/配置文件/Server/NotifyOnline.txt
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{DISPLAYTITLE:<span style="font-size:24px;line-height:1.4;overflow-wrap:anywhere;">工程参考/配置文件/Server/NotifyOnline.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;"> [[首页|首页]] · [[工程参考/配置文件索引|配置文件索引]] · [[工程参考/配置文件修改约定|修改约定]] NotifyOnline.txt 是登录公告的**控制表**:它决定「什么时候用哪张表 / 哪段文本」。真正的文案要么写在本表第 4 列,要么写在 NotifyWeek.txt、NotifyDate.txt 里由本表间接引用。样本 12 行、4 列。 每行都是一个独立开关:可以一直推送(模式 0),也可以把推送权交给星期表(模式 1)或日期区间表(模式 2),还可以只在玩家上次是代理 / 非代理登录时提示(模式 4 / 5)。 [[#文件位置与生效|位置与生效]] · [[#文件格式|文件格式]] · [[#字段详解|字段详解]] · [[#常用修改实例|修改实例]] == 文件位置与生效 == {| 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;">./Config/NotifyOnline.txt</code>,相对 Server 工作目录;路径写死在 <code style="white-space:normal;overflow-wrap:anywhere;">LoadNotifyOnlineTab</code> 里,FileDef.h 没有对应宏。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读取程序 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Server 进程:CNotifyOnlineMng 在 NotifyOnline.cpp 里加载,PlayerLoginProcess 在玩家进入场景时逐行处理 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 生效方法 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 正常保存并停服后重启 Server。<code style="white-space:normal;overflow-wrap:anywhere;">LoadTab</code> 由Startup 调用一次,之后内存中就固定了;当前检索未发现单独重载入口。 |- | 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。 |} 处理顺序在 <code style="white-space:normal;overflow-wrap:anywhere;">PlayerLoginProcess</code> 里:先跳过 isShow = 0 的行,再按 mode 分支。日期取 <code style="white-space:normal;overflow-wrap:anywhere;">年*10000 + 月*100 + 日</code>(八位整数),星期取 <code style="white-space:normal;overflow-wrap:anywhere;">tm_wday</code>(0 = 周日)。 {| 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;" | mode ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 行为 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 0 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 直接把本行第 4 列作为系统聊天消息发给玩家。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 1 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 忽略本行第 4 列,转为按当前星期去 NotifyWeek.txt 匹配。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 2 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 忽略本行第 4 列,转为按当前日期去 NotifyDate.txt 匹配(区间闭合)。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 4 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 仅当上次登录 IP 命中 proxyIP 名单时,把第 4 列按格式串填参后发送。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 5 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 仅当上次登录 IP **没有**命中 proxyIP 名单时,按同样的格式串填参发送。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 其它值 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 没有任何分支,静默忽略(样本没有这类值,3 与 6 以上都一样)。 |} 模式 4 / 5 的第 4 列必须是**格式串**:代码用 <code style="white-space:normal;overflow-wrap:anywhere;">tsnprintf</code> 依次填入 8 个参数——年、月、日、时,以及上次登录 IP 的四个字节(也就是 8 个占位符依次对应 .\d.%d.%d.%d)。少写一个占位符会把后面的实参挤到错误位置;多写会取到垃圾值。 所有这三种文案最终都经 <code style="white-space:normal;overflow-wrap:anywhere;">ChatMsg</code> 发出,系统聊天消息的长度字段只有一个字节,超过 255 的部分会被直接截断。 == 文件格式 == 首行是类型行:<code style="white-space:normal;overflow-wrap:anywhere;">INT INT INT STRING</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:index | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 人工编号,加载时存进 id,但后续逻辑(是否启用、模式、按什么匹配)都不看它,只用行号遍历。 | 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;">第 2 列</code><br>INT:isShow | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否处理这一行。0 直接 continue 跳过整行;非 0 进入模式分支。样本只有前两行是 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;">第 3 列</code><br>INT:mode | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 推送方式:0 立即发文本;1 交给星期表;2 交给日期表;4 仅代理登录提示;5 仅非代理登录提示。 | 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>STRING:info$1$ | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 文案本体(模式 0),或模式 4 / 5 用的格式串。可以直接写颜色控制记号,样本第 1 行就是带 #cff0000 的彩色文本。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 模式 1 / 2 下这一列被忽略,写什么都行。加载时断言长度小于 256;实际发送时按单字节长度截断到 255。 |} == 常用修改实例 == 示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。 === 启用第 2 行那条被关掉的「临时通知」 === 修改前: <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 STRING index isShow mode info$1$ 2 0 0 临时通知。</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 STRING index isShow mode info$1$ 2 1 0 临时通知。</pre> 按第 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,<code style="white-space:normal;overflow-wrap:anywhere;">ChatMsg</code> 里强制转成 BYTE 后截断,没有日志。 === 上行上限 16 行 === <code style="white-space:normal;overflow-wrap:anywhere;">m_tabOnline[16]</code>,超过 16 行的部分读不进来(Assert(nRecords <= 16))。 === proxyIP 名单是另一份文件 === 模式 4 / 5 依赖 proxyIP.txt 判定,本页不涉及那份文件。 == 关联与依据 == [[工程参考/配置文件/Server/NotifyWeek.txt|Server/NotifyWeek.txt]] · [[工程参考/配置文件/Server/NotifyDate.txt|Server/NotifyDate.txt]] [[工程参考/配置文件索引|其他配置及整理状态]] · [[工程参考/服务端外网设置|服务端外网设置]] · [[Lua接口/服务端函数索引|Lua 接口索引]] * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Module/NotifyOnline.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Module/NotifyOnline.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Main/GameTable.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <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;">resources/Server/Config/NotifyOnline.txt</code>:实际加载、解析、字段使用或示例关联依据 本页核对 LoadNotifyOnlineTab 的列读取与 16 行上限、PlayerLoginProcess 里五种 mode 的分支、日期与星期的计算方式,以及模式 4 / 5 的格式串参数顺序;未启动服务端与游戏,公告的实际下发需要实测。 </div> [[Category:工程参考]]
返回
工程参考/配置文件/Server/NotifyOnline.txt
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
创建账号
登录
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
搜索
工具
链入页面
相关更改
页面信息