<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.waylee.net/index.php?action=history&amp;feed=atom&amp;title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83%2F%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F</id>
	<title>工程参考/活动系统 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.waylee.net/index.php?action=history&amp;feed=atom&amp;title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83%2F%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F"/>
	<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F&amp;action=history"/>
	<updated>2026-10-26T13:57:43Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F&amp;diff=14621&amp;oldid=prev</id>
		<title>Waylee：​新增活动系统说明：三层结构、ActivityNotice 31 列、ActivityRuler 21 列、时间编码与踩坑</title>
		<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F&amp;diff=14621&amp;oldid=prev"/>
		<updated>2026-10-26T08:32:51Z</updated>

		<summary type="html">&lt;p&gt;新增活动系统说明：三层结构、ActivityNotice 31 列、ActivityRuler 21 列、时间编码与踩坑&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年10月26日 (一) 16:32的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l25&quot;&gt;第25行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第25行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| GameServer，每个场景一份&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| GameServer，每个场景一份&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 维护活动对象、推进五个状态、按阶段播报、响应脚本的启停&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 维护活动对象、推进五个状态、按阶段播报、响应脚本的启停&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| `ActivityNotice.txt` &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;第 13 到 28 &lt;/del&gt;列、第 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;31 列&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| `ActivityNotice.txt` &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;除第 7 &lt;/ins&gt;列、第 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;29 列之外的全部列&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 玩法&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 玩法&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l33&quot;&gt;第33行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第33行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;同一张 `ActivityNotice.txt` &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;被三个进程各读一遍，但&lt;/del&gt;&#039;&#039;&#039;读的列不一样&#039;&#039;&#039;：WorldServer 只读调度所需的列，GameServer &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;只读运行与播报的列，客户端也有一份同名副本但服务端不使用（见「容易踩的坑」）。&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;同一张 `ActivityNotice.txt` &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;被 WorldServer 与 GameServer 各读一遍，但&lt;/ins&gt;&#039;&#039;&#039;读的列不一样&#039;&#039;&#039;：WorldServer 只读调度所需的列，GameServer &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;只读运行与播报的列。`Client/Data/Config/` 下还有一份同名副本，与服务端这份内容不同，是另一个文件。&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 一场活动从配置到结束 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 一场活动从配置到结束 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l279&quot;&gt;第279行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第279行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 容易踩的坑 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 容易踩的坑 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 表里的注释行是旧版布局 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 表里的注释行是旧版布局 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;`ActivityNotice.txt` 第 3 行起有一批以 `#&amp;lt;序号&amp;gt;` 开头的注释行，写着列含义。它们描述的是&#039;&#039;&#039;旧版 14 列布局&#039;&#039;&#039;：注释里 `ruler` &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;在第 &lt;/del&gt;13 项、`time_invalid` &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;在第 &lt;/del&gt;14 项，而现在这两列分别是第 29 列和第 31 列，中间插进了 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;16 &lt;/del&gt;列播报配置。照着注释行配表会全错，以列名行（第 2 行）和本页为准。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;`ActivityNotice.txt` 第 3 行起有一批以 `#&amp;lt;序号&amp;gt;` 开头的注释行，写着列含义。它们描述的是&#039;&#039;&#039;旧版 14 列布局&#039;&#039;&#039;：注释里 `ruler` &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;排在第 &lt;/ins&gt;13 项、`time_invalid` &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;排在第 &lt;/ins&gt;14 项，而现在这两列分别是第 29 列和第 31 列，中间插进了 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;15 &lt;/ins&gt;列播报配置。照着注释行配表会全错，以列名行（第 2 行）和本页为准。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== `time_start` 写成「几点」永远不触发 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== `time_start` 写成「几点」永远不触发 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l293&quot;&gt;第293行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第293行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 客户端那份副本是独立文件 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 客户端那份副本是独立文件 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;`Client/Data/Config/ActivityNotice.txt` 与服务端 `Public/Config/ActivityNotice.txt` &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;同名但内容不同（151 &lt;/del&gt;条对 152 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;条，条目也有差异），服务端不读客户端那份，客户端也不读服务端那份。改服务端配置不会影响客户端那份，反之亦然。&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;`Client/Data/Config/ActivityNotice.txt` 与服务端 `Public/Config/ActivityNotice.txt` &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;同名，但内容不同：151 &lt;/ins&gt;条对 152 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;条，条目本身也有差异。服务端读的是 `Public/Config/` 这份，两份改一边不会同步到另一边。&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 和脚本接口的关系 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 和脚本接口的关系 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Waylee</name></author>
	</entry>
	<entry>
		<id>https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F&amp;diff=14619&amp;oldid=prev</id>
		<title>Waylee：​新增活动系统说明：三层结构、ActivityNotice 31 列、ActivityRuler 21 列、时间编码与踩坑</title>
		<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E6%B4%BB%E5%8A%A8%E7%B3%BB%E7%BB%9F&amp;diff=14619&amp;oldid=prev"/>
		<updated>2026-10-26T08:31:02Z</updated>

		<summary type="html">&lt;p&gt;新增活动系统说明：三层结构、ActivityNotice 31 列、ActivityRuler 21 列、时间编码与踩坑&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-reference&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-lead&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div role=&amp;quot;heading&amp;quot; aria-level=&amp;quot;2&amp;quot; class=&amp;quot;lua-h1&amp;quot;&amp;gt;活动系统&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-sub&amp;quot;&amp;gt;152 条活动 · 30 条场景排期 · 32 个活动脚本&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
活动不是独立进程，而是&amp;#039;&amp;#039;&amp;#039;场景里的一个定时实例&amp;#039;&amp;#039;&amp;#039;。WorldServer 按时刻表决定「此刻该在哪个场景开哪场活动」，通知过去之后由场景内的 Lua 脚本建实例；实例自己按五个阶段往前推、按阶段播报，到点销毁。&lt;br /&gt;
&lt;br /&gt;
读法：想知道某场活动几点开、在哪个场景开 → 看 `ActivityNotice.txt` 的 1 到 7 列和 29 列，以及 `ActivityRuler.txt`。想改它的公告话术 → 看 13 到 28 列。想改它干什么 → 看 `Public/Data/Script/event/huodong/` 下对应的脚本。&lt;br /&gt;
&lt;br /&gt;
== 三层结构 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:12%&amp;quot; | 层&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:14%&amp;quot; | 运行在&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 职责&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:30%&amp;quot; | 数据来源&lt;br /&gt;
|-&lt;br /&gt;
| 排期&lt;br /&gt;
| WorldServer&lt;br /&gt;
| 每个心跳算一次「当前时刻是否踩中某场活动的开始格」，踩中就选场景并发 `WGNotifyScene`&lt;br /&gt;
| `ActivityNotice.txt` 第 1 到 12 列、第 29 列，加 `ActivityRuler.txt`&lt;br /&gt;
|-&lt;br /&gt;
| 实例&lt;br /&gt;
| GameServer，每个场景一份&lt;br /&gt;
| 维护活动对象、推进五个状态、按阶段播报、响应脚本的启停&lt;br /&gt;
| `ActivityNotice.txt` 第 13 到 28 列、第 31 列&lt;br /&gt;
|-&lt;br /&gt;
| 玩法&lt;br /&gt;
| 场景内的 Lua&lt;br /&gt;
| `OnDefaultEvent` 收到排期通知、建实例；`OnTimer` 收周期心跳做玩法判定&lt;br /&gt;
| `Public/Data/Script/event/huodong/` 下 77 个脚本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
同一张 `ActivityNotice.txt` 被三个进程各读一遍，但&amp;#039;&amp;#039;&amp;#039;读的列不一样&amp;#039;&amp;#039;&amp;#039;：WorldServer 只读调度所需的列，GameServer 只读运行与播报的列，客户端也有一份同名副本但服务端不使用（见「容易踩的坑」）。&lt;br /&gt;
&lt;br /&gt;
== 一场活动从配置到结束 ==&lt;br /&gt;
# 启动时 WorldServer 读 `ActivityNotice.txt` 与 `ActivityRuler.txt`，GameServer 读同一张 `ActivityNotice.txt`，各自装进自己的结构。&lt;br /&gt;
# WorldServer 每次心跳遍历全部活动，按 `time_type` 算出三个整数 `current`、`start`、`end`。&lt;br /&gt;
# 判断是否到点：服务器刚起或场景刚连上时（计时器为 0），只要 `current` 落在 `[start, end]` 区间内就&amp;#039;&amp;#039;&amp;#039;立刻补触发&amp;#039;&amp;#039;&amp;#039;；此后必须 `current` 正好等于 `start` 那一格才触发，错过就等明天/下周/下月。&lt;br /&gt;
# 按 `ruler` 列（第 29 列）决定这次激活哪些场景，向对应 GameServer 发 `WGNotifyScene`，携带脚本号、活动号、组内序号与 `reserve2` 到 `reserve5`。&lt;br /&gt;
# GameServer 在场景线程里把活动号写进 Scene 的「预激活活动号」，再调 `x&amp;lt;脚本号&amp;gt;_OnDefaultEvent`。脚本里通常第一句就是 `StartOneActivity`。&lt;br /&gt;
# `StartOneActivity` 在场景的活动管理器里建实例并启动计时器，实例进入状态 0。&lt;br /&gt;
# 实例靠累计运行毫秒推进状态，跨过阈值就切下一阶段并开始按间隔播报。&lt;br /&gt;
# 到第 28 列（结束时间点）指定的分钟数，或脚本调 `StopOneActivity`，实例销毁、从管理器里摘掉。&lt;br /&gt;
&lt;br /&gt;
== 活动表：ActivityNotice.txt ==&lt;br /&gt;
31 列、152 条数据、编号 0 到 250 不连续。第 1 列同时是 GameServer 的数组下标（上限 256）和 WorldServer 的活动编号，&amp;#039;&amp;#039;&amp;#039;写重了后面的行覆盖前面的行，写空号不会报错&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
=== 调度段（第 1 到 12 列）===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:16%&amp;quot; | 列名&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 读法&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:12%&amp;quot; | 谁读&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| id&lt;br /&gt;
| 活动编号。同时是 GameServer 数组下标，必须小于 256。&lt;br /&gt;
| 两侧&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| opt_type&lt;br /&gt;
| 0 = 只在到点那一刻开一次；1 = 除到点触发外，GameServer 重连时若仍在时间窗口内还会补开一次。补开由「场景所属服务器连上来时把该活动的计时器清零」实现。&lt;br /&gt;
| 仅 WorldServer&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| time_type&lt;br /&gt;
| 时间粒度：0 单次、1 每天、2 每周、3 每月。它同时决定第 4 列怎么编码，也决定 GameServer 判有效期时用哪个时间口径。&lt;br /&gt;
| 两侧&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| time_start&lt;br /&gt;
| 激活时刻。编码随 `time_type` 变化，见「时间怎么填」。&lt;br /&gt;
| 两侧，但只有 WorldServer 拿它当时刻用&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| sceneid&lt;br /&gt;
| 激活哪个场景。填 -1 表示所有场景。GameServer 也会读进结构，但不参与运行判定。&lt;br /&gt;
| 两侧&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| scriptid&lt;br /&gt;
| 活动脚本编号。WorldServer 用它通知，GameServer 用它每 60 秒回调一次 `OnTimer`。&lt;br /&gt;
| 两侧&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| time_slice&lt;br /&gt;
| 持续多少个 15 分钟格。0 或负数表示&amp;#039;&amp;#039;&amp;#039;只在第 4 列那一刻激活一次&amp;#039;&amp;#039;&amp;#039;（结束时刻 = 开始时刻）；大于 0 时在低两位上加，满 96 格进一位。&lt;br /&gt;
| 仅 WorldServer&lt;br /&gt;
|-&lt;br /&gt;
| 8 到 12&lt;br /&gt;
| reserve1 到 reserve5&lt;br /&gt;
| 五个预留参数。WorldServer 只把 `reserve2` 到 `reserve5` 传给脚本，&amp;#039;&amp;#039;&amp;#039;`reserve1` 不传&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
| 两侧&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 播报段（第 13 到 28 列）===&lt;br /&gt;
只由 GameServer 读。每组三列：间隔、内容、下一个阶段的时间点。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:16%&amp;quot; | 列名&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 读法&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 广播类型&lt;br /&gt;
| 发到哪个频道，默认系统频道。填 -1 或内容填 `-1` 时整场静默。&lt;br /&gt;
|-&lt;br /&gt;
| 14、15、16&lt;br /&gt;
| 慢报间隔 / 慢报内容 / 慢报结束时间点&lt;br /&gt;
| 状态 0（预告开始）阶段：每 14 列分钟播一次 15 列的内容，累计到 16 列分钟切状态 1。&lt;br /&gt;
|-&lt;br /&gt;
| 17、18、19&lt;br /&gt;
| 快报间隔 / 快报内容 / 快报结束时间点&lt;br /&gt;
| 状态 1（即将开始）：到 19 列切状态 2。&lt;br /&gt;
|-&lt;br /&gt;
| 20、21、22&lt;br /&gt;
| 刚开报间隔 / 刚开报内容 / 刚开报结束时间点&lt;br /&gt;
| 状态 2（刚开始）：到 22 列切状态 3。&lt;br /&gt;
|-&lt;br /&gt;
| 23、24、25&lt;br /&gt;
| 进行中报间隔 / 进行中报内容 / 进行中报结束时间点&lt;br /&gt;
| 状态 3（进行中）：到 25 列切状态 4，&amp;#039;&amp;#039;&amp;#039;但只在第 28 列不为 0 时生效&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
|-&lt;br /&gt;
| 26、27、28&lt;br /&gt;
| 快结束报间隔 / 快结束报内容 / 结束时间点&lt;br /&gt;
| 状态 4（预告结束）：到 28 列自动销毁。填 0 表示永不自动结束，只能靠脚本调停。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;这五个「结束时间点」不是时刻，是「活动开始后第几分钟」&amp;#039;&amp;#039;&amp;#039;。读取时统一乘 60000，换成毫秒参与累计。填 30 表示开跑 30 分钟后进入下一阶段，不是 30 点 30 分。&lt;br /&gt;
&lt;br /&gt;
=== 收尾段（第 29 到 31 列）===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:16%&amp;quot; | 列名&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 读法&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:12%&amp;quot; | 谁读&lt;br /&gt;
|-&lt;br /&gt;
| 29&lt;br /&gt;
| ruler&lt;br /&gt;
| 场景选择规则，-2 到 10 有含义，见「场景怎么选」。GameServer 不读这一列。&lt;br /&gt;
| 仅 WorldServer&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 活动名称&lt;br /&gt;
| 只用于人看表。GameServer 读进结构后没有任何消费点，改它不影响行为。&lt;br /&gt;
| GameServer 读了不用&lt;br /&gt;
|-&lt;br /&gt;
| 31&lt;br /&gt;
| 失效时间&lt;br /&gt;
| 活动本身的绝对有效期，口径随第 3 列变化。填 0 或负数表示永不过期。&lt;br /&gt;
| 仅 GameServer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 场景排期表：ActivityRuler.txt ==&lt;br /&gt;
21 列、30 条。一行对应一场活动，列成「活动号 + 10 组（场景号, 权重）」。读取时遇到 -1 就停，有效组数记进结构。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 含义&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 活动号，与 `ActivityNotice.txt` 第 1 列对应&lt;br /&gt;
|-&lt;br /&gt;
| 2、3&lt;br /&gt;
| 第 1 组的场景号与权重&lt;br /&gt;
|-&lt;br /&gt;
| 4、5&lt;br /&gt;
| 第 2 组的场景号与权重&lt;br /&gt;
|-&lt;br /&gt;
| …&lt;br /&gt;
| 依此类推，直到第 20、21 列（第 10 组）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
只有 `ruler` 填 0、1 或大于等于 2 时才会用到这张表；填 -1 或 -2 时这张表里对应的行不起作用。全服实际用到它的活动只有 24 条（`ruler` 为 0 的 17 条、为 1 的 7 条）。&lt;br /&gt;
&lt;br /&gt;
== 场景怎么选 ==&lt;br /&gt;
第 29 列 `ruler` 有六种取值，决定一场活动这次在几个场景里开：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 取值&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 行为&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:12%&amp;quot; | 用到的条数&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
| 从所有主城里随机抽一个城市场景。&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
| 只激活第 5 列写的那个场景；第 5 列是 -1 时所有场景都开。&lt;br /&gt;
| 126&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 激活 `ActivityRuler.txt` 里该活动的&amp;#039;&amp;#039;&amp;#039;全部&amp;#039;&amp;#039;&amp;#039;场景组，组内第一个场景收到序号 0，其余收到 -1。&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 按权重随机&amp;#039;&amp;#039;&amp;#039;一个&amp;#039;&amp;#039;&amp;#039;场景，权重来自排期表。&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| 2 到 10&lt;br /&gt;
| 从场景组里随机挑这么多个场景（洗牌后取前 N 个），上限 10。&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 其他&lt;br /&gt;
| 不激活。排期表里找不到对应行时也不激活。&lt;br /&gt;
| —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;组内序号&amp;#039;&amp;#039;&amp;#039;是 `WGNotifyScene` 第 3 个参数，第一个场景是 0、其余是 -1。脚本收到的第 3 个形参就是它（形参名叫 `iNoticeType`，容易误会，见「容易踩的坑」）。&lt;br /&gt;
&lt;br /&gt;
== 时间怎么填 ==&lt;br /&gt;
这是整张表最容易配错的地方。第 3 列 `time_type` 不同，&amp;#039;&amp;#039;&amp;#039;第 4 列要用完全不同的量纲&amp;#039;&amp;#039;&amp;#039;，第 31 列 `失效时间` 的口径也跟着变。&lt;br /&gt;
&lt;br /&gt;
底层只有一个函数在算「现在是哪一格」：把当前时间压成「年 × 1000 × 100 + 年内日 × 100 + 小时 × 4 + 刻」，其中刻 = 分钟除以 15，取值 0 到 3。所以&amp;#039;&amp;#039;&amp;#039;一天固定 96 格，一格 15 分钟&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:8%&amp;quot; | time_type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 粒度&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 第 4 列 time_start 的编码&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 第 31 列失效时间的编码&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:14%&amp;quot; | 举例&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 每天&lt;br /&gt;
| 0 到 95 的格号，&amp;#039;&amp;#039;&amp;#039;直接把「几点几分」写成 时 × 4 + 分 ÷ 15&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 季度时间取模 100，即格号&lt;br /&gt;
| 16:30 → 66&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 每周&lt;br /&gt;
| 星期 × 100 + 格号。星期用 0 表示周日、1 到 6 表示周一到周六&lt;br /&gt;
| 周序号 × 100 + 格号&lt;br /&gt;
| 周六 14:30 → 658&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 每月&lt;br /&gt;
| 日 × 100 + 格号&lt;br /&gt;
| 日 × 100 + 格号&lt;br /&gt;
| 每月 1 日 20:00 → 180&lt;br /&gt;
|-&lt;br /&gt;
| 0 或其他&lt;br /&gt;
| 单次&lt;br /&gt;
| 年内日 × 100 + 格号&lt;br /&gt;
| 年内日 × 100 + 格号&lt;br /&gt;
| 10 月 1 日 20:00 → 27380&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
样本里 152 条活动的分布是：每天 95 条、每周 25 条、单次 32 条，没有月度活动。可以拿它们验证自己的算法——例如某条每天活动的 `time_start` 写 84，就是 21:00；写 66 就是 16:30。&lt;br /&gt;
&lt;br /&gt;
第 7 列 `time_slice` 也按格算，不是分钟也不是小时：填 4 表示 1 小时，填 96 表示一天。跨天时会进位到高位，例如每天活动 21:00 开、持续 16 格（4 小时），结束时刻算成「次日 01:00」。&lt;br /&gt;
&lt;br /&gt;
== 脚本怎么写 ==&lt;br /&gt;
活动脚本放在 `Public/Data/Script/event/huodong/`，目录下 77 个 lua，73 个含活动入口。脚本编号到文件名的映射不看文件名，而是由 `Public/Data/Script.dat` 这个二进制索引给出，由 `CFileDataMgr` 在启动时读入。&amp;#039;&amp;#039;&amp;#039;函数名必须带 `x&amp;lt;脚本号&amp;gt;_` 前缀&amp;#039;&amp;#039;&amp;#039;，否则按编号回调时找不到函数。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:26%&amp;quot; | 入口&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 什么时候被调&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 参数&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x&amp;amp;lt;脚本号&amp;amp;gt;_OnDefaultEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
| WorldServer 判定到点、按 `ruler` 选中本场景时&lt;br /&gt;
| &amp;lt;code&amp;gt;sceneId, actId, 组内序号, reserve2, reserve3, reserve4, reserve5&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x&amp;amp;lt;脚本号&amp;amp;gt;_OnTimer&amp;lt;/code&amp;gt;&lt;br /&gt;
| 实例启动后按固定间隔回调，间隔由 `StartOneActivity` 第 3 个参数决定，示例脚本传 60000 毫秒&lt;br /&gt;
| &amp;lt;code&amp;gt;sceneId, actId, uTime&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
`OnDefaultEvent` 里最常见的一句就是建实例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
StartOneActivity( sceneId, actId, 60000, 组内序号 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`OnTimer` 里通常做两件事：判活动是否还在有效期内（`CheckActiviyValidity` 返回 0 就 `StopOneActivity`），以及跑玩法判定。脚本侧能调的全部接口列在 [[Lua接口/活动相关|活动相关]]。&lt;br /&gt;
&lt;br /&gt;
== 容易踩的坑 ==&lt;br /&gt;
=== 表里的注释行是旧版布局 ===&lt;br /&gt;
`ActivityNotice.txt` 第 3 行起有一批以 `#&amp;lt;序号&amp;gt;` 开头的注释行，写着列含义。它们描述的是&amp;#039;&amp;#039;&amp;#039;旧版 14 列布局&amp;#039;&amp;#039;&amp;#039;：注释里 `ruler` 在第 13 项、`time_invalid` 在第 14 项，而现在这两列分别是第 29 列和第 31 列，中间插进了 16 列播报配置。照着注释行配表会全错，以列名行（第 2 行）和本页为准。&lt;br /&gt;
&lt;br /&gt;
=== `time_start` 写成「几点」永远不触发 ===&lt;br /&gt;
第 4 列不是「1900 表示 19:00」，而是格号。每天活动的合法范围是 0 到 95，写成 1900 会让 `current` 永远等不到，活动静默不开，日志里也不会有报错。&lt;br /&gt;
&lt;br /&gt;
=== `iNoticeType` 这个名字有两套含义 ===&lt;br /&gt;
脚本 `OnDefaultEvent` 的第 3 个形参叫 `iNoticeType`，实际收到的是「组内序号」：主场景 0、附加场景 -1。示例脚本又把它原样传给了 `StartOneActivity` 的第 4 个参数，而这个参数的含义是&amp;#039;&amp;#039;&amp;#039;播报开关&amp;#039;&amp;#039;&amp;#039;——传 -1 会让整场活动的系统播报全部静默（`BroadCast_Notice` 遇到 -1 直接返回）。&lt;br /&gt;
&lt;br /&gt;
合起来的效果是：多场景活动只有第一个场景会播报。这多半是有意的（避免同一活动在多个场景重复刷屏），但两处同名不同义，改脚本时要留意。&lt;br /&gt;
&lt;br /&gt;
=== `reserve1` 传不到脚本 ===&lt;br /&gt;
第 8 列 `reserve1` 被 WorldServer 读进 `m_Param1` 后&amp;#039;&amp;#039;&amp;#039;没有往下传&amp;#039;&amp;#039;&amp;#039;，`WGNotifyScene` 只带 `reserve2` 到 `reserve5`。要往脚本传参数，从第 9 列开始填。&lt;br /&gt;
&lt;br /&gt;
=== 客户端那份副本是独立文件 ===&lt;br /&gt;
`Client/Data/Config/ActivityNotice.txt` 与服务端 `Public/Config/ActivityNotice.txt` 同名但内容不同（151 条对 152 条，条目也有差异），服务端不读客户端那份，客户端也不读服务端那份。改服务端配置不会影响客户端那份，反之亦然。&lt;br /&gt;
&lt;br /&gt;
== 和脚本接口的关系 ==&lt;br /&gt;
活动系统本身只负责「什么时候开、在哪个场景开、开多久、播什么」，具体玩法全在脚本里。脚本侧可用的接口按用途分四类，逐条列在 [[Lua接口/活动相关|活动相关]]：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:22%&amp;quot; | 用途&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 代表接口&lt;br /&gt;
|-&lt;br /&gt;
| 启停&lt;br /&gt;
| `StartOneActivity`、`StopOneActivity`、`CheckActiviyValidity`、`GetActivityState`&lt;br /&gt;
|-&lt;br /&gt;
| 实例内状态&lt;br /&gt;
| `SetActivityParam`、`GetActivityParam`，共 1024 个参数槽，用于在脚本回调之间传递状态&lt;br /&gt;
|-&lt;br /&gt;
| 排行榜&lt;br /&gt;
| `HitParadeRegisterTab`、`HitParadePlayerJoin`、`HitParadeSort` 等，活动内的名次统计&lt;br /&gt;
|-&lt;br /&gt;
| 预激活活动号&lt;br /&gt;
| `GetScenePreActiveActivityId`，取当前正在被激活的那个活动号&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
一个场景同时最多挂 32 个活动实例，超出后 `AddActivity` 直接失败并写错误日志；重复开同一个活动号也会失败。这两个上限都是硬限制，脚本里做「重复开启保护」比靠引擎报错更稳。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Waylee</name></author>
	</entry>
</feed>