From d70cc18b2779f6323d912c6cf203e304be298cb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=BF=E8=B1=86=E6=B1=A4?= Date: Tue, 15 Sep 2026 22:34:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?docs(missions):=20=E6=9B=B4=E6=AD=A3=20supp?= =?UTF-8?q?ress=20=E8=AF=B4=E6=98=8E=E4=B8=8E=20AddMissionToHubServer=20?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mission.md:suppress 的默认值取决于运行模式(ComputerLoader.readMission 中为 Settings.IsInExtensionMode ? true : false),扩展模式下省略该属性等同于 suppress=true;补全 suppress=true 的全部激活时机(nextMission / 扩展起始任务 / MissionHub·MissionListServer·DLCHub 接取),并注明 LoadMission Action 不在其中。 Mission.md:suppress=false 时任务文件每次被解析都会执行 —— 除存读档外,每次连接 hub/DHS 节点也会执行一次(MissionSerializer.restoreMissionFromFile 内部重新调用 ComputerLoader.readMission)。details 中原「实践证明 false 也没执行」的说法经实测不成立(当时观察到的应是省略属性的情况),改为机理说明并补源码参考链接。 Action.md:AddMissionToHubServer 的属性名 MissionName 更正为 MissionFilepath(源码 SAAddMissionToHubServer.DeserializeFromReader 读取的是 MissionFilepath,写错会抛 FormatException: Invalid MissionFilepath),并补充该方法加载的任务其 missionStart 在接取时才执行的说明。 --- docs/reference/Action.md | 7 +++++-- docs/reference/Mission.md | 13 +++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/reference/Action.md b/docs/reference/Action.md index 76c3ac8..75b6012 100644 --- a/docs/reference/Action.md +++ b/docs/reference/Action.md @@ -81,10 +81,10 @@ Action `AddIRCMessage` 的 Delay 不需要 DelayHost,而是借助它的目标 ### `AddMissionToHubServer` ```xml - + ``` 将一个 Mission 添加到 MissionHub/DHS 的任务列表中。 -- `MissionName`:`string`,Mission 的文件路径。 +- `MissionFilepath`:`string`,Mission 的文件路径。 - `TargetComp`:`string`,HubServer 的 Computer ID。 - *`AssignmentTag`*?:`string`,分配Tag。如果是给 MissionHub 添加任务,用 `"top"` 就会使任务置顶。给 DHS 添加,就会提示分配给了谁。 - *`StartsComplete`*?:`bool`,是否开始完成。默认值为 `false`。 @@ -92,6 +92,9 @@ Action `AddIRCMessage` 的 Delay 不需要 DelayHost,而是借助它的目标 > [!NOTE] > MissionHub 是拥有 `missionListingServer` 或 `missionHubServer` Daemon 的 Node,在游戏中作为“任务中心”。DHS 此处代指有 `DHSDaemon` Daemon 的 Node。 +> [!NOTE] +> 通过此 Action 加入的任务,其 `missionStart` 在**加载时不会执行**(扩展模式下 `suppress` 默认为 `true`),而是在玩家**接取**该任务时执行。详见 [Mission](Mission.md) 的 `missionStart` 一节。 + 参考:[SAAddMissionToHubServer.cs](https://github.com/UnHacknet/OpenHacknet/blob/main/SAAddMissionToHubServer.cs) ### `RemoveMissionFromHubServer` diff --git a/docs/reference/Mission.md b/docs/reference/Mission.md index d66a87f..83159a0 100644 --- a/docs/reference/Mission.md +++ b/docs/reference/Mission.md @@ -49,7 +49,14 @@ Mission 的根元素。 ``` 任务被加载后执行的 Function。不使用可以把 `` 元素删除。 - *`val`*?:`int`,Function 的参数。默认值为 `0`。 -- *`suppress`*?:`bool`,默认值为 `false`。`suppress` 为 `true` 时通过 `LoadMission` Action 加载的 Mission 的 `missionStart` 不会被执行,只有通过 Mission 的 `nextMission` 加载的任务的 missionStart 才会执行。`false` 时可能会多次执行(存读档) +- *`suppress`*?:`bool`,默认值取决于运行模式:**扩展模式下为 `true`,主游戏模式下为 `false`**。 + - ⚠️ 因此在扩展中**不写该属性等同于 `suppress="true"`**。 + - `true`:加载时仅记录、不执行,等到「激活时机」(即任务邮件被发送)才执行,包括: + - 通过 `nextMission` 进入的任务 + - 扩展启动时的起始任务 + - 在 MissionHub / MissionListServer / DLCHub 等节点**接取**任务时 + - ⚠️ 通过 [`LoadMission`](Action.md) Action 加载的任务不在上述路径中,其 `missionStart` **不会执行**;有需要时应显式写 `suppress="false"` + - `false`:任务文件**每次被解析时都会执行**。除了存读档,**每次连接 hub / DHS 节点也会执行一次**(节点每次连接都会重建任务列表并从任务 XML 重新解析,见 `MissionSerializer.restoreMissionFromFile`)。因此 hub / DHS 中的任务应使用 `suppress="true"`(或省略该属性) ::: details (官方介绍) 官方是这么介绍的: @@ -59,7 +66,9 @@ otherwise it will activate when it is loaded. This is very important to remember writing missions designed for use in a hub server - those missions are loaded when the save game is loaded or a new game is started. ``` -但是实践证明,添加到 MissionHub 的 Mission 的 `missionStart` 在 `suppress` 为 `false` 时也没有被执行。 +实测补充:向 MissionHub 添加的 Mission 若**省略 `suppress` 属性**,其 `missionStart` 不会在加载时执行 —— 因为扩展模式下该属性默认为 `true`(任务被抑制,需等玩家接取时才激活)。显式写 `suppress="false"` 时,如上文所述,任务文件每次被解析都会执行。 + +参考:[ComputerLoader.cs](https://github.com/UnHacknet/OpenHacknet/blob/main/ComputerLoader.cs)、[MissionSerializer.cs](https://github.com/UnHacknet/OpenHacknet/blob/main/MissionSerializer.cs)、[ActiveMission.cs](https://github.com/UnHacknet/OpenHacknet/blob/main/ActiveMission.cs)、[MissionHubServer.cs](https://github.com/UnHacknet/OpenHacknet/blob/main/MissionHubServer.cs) ::: From 6899f9d1d2a0a913b69d24de9970957aa0c8ef38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=BF=E8=B1=86=E6=B1=A4?= Date: Tue, 15 Sep 2026 22:48:51 +0800 Subject: [PATCH 2/3] =?UTF-8?q?docs(missions):=20=E6=8C=89=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E5=8A=A0=E8=BD=BD=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20suppress=20=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit review 指出连接时重载任务的说法有误,已核实源码并修正:MissionHubServer.navigatedTo 与 MissionListingServer.navigatedTo 都不重载任务(两者的 restoreMissionFromFile 位于 loadInit,随存档加载进行),只有 DLCHubServer.navigatedTo → ReadActiveMissions → MissionSerializer.restoreMissionFromFile 会在每次连接时重新解析任务 XML。 同时修正三处不精确表述:DHS 接取任务时 PlayerAcceptMission 直接调用 ActivateSuppressedStartFunctionIfPresent,不发送任务邮件;MissionListServer 更正为 MissionListingServer;「省略 suppress 等于 true」限定为扩展模式(主游戏模式下省略等同于 false)。 --- docs/reference/Action.md | 2 +- docs/reference/Mission.md | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/reference/Action.md b/docs/reference/Action.md index 75b6012..cdd90ee 100644 --- a/docs/reference/Action.md +++ b/docs/reference/Action.md @@ -93,7 +93,7 @@ Action `AddIRCMessage` 的 Delay 不需要 DelayHost,而是借助它的目标 > MissionHub 是拥有 `missionListingServer` 或 `missionHubServer` Daemon 的 Node,在游戏中作为“任务中心”。DHS 此处代指有 `DHSDaemon` Daemon 的 Node。 > [!NOTE] -> 通过此 Action 加入的任务,其 `missionStart` 在**加载时不会执行**(扩展模式下 `suppress` 默认为 `true`),而是在玩家**接取**该任务时执行。详见 [Mission](Mission.md) 的 `missionStart` 一节。 +> 通过此 Action 加入的任务,其 `missionStart` 在**加载时不会执行**(扩展模式下未显式设置 `suppress="false"` 时,该属性默认为 `true`),而是在玩家**接取**该任务时执行。详见 [Mission](Mission.md) 的 `missionStart` 一节。 参考:[SAAddMissionToHubServer.cs](https://github.com/UnHacknet/OpenHacknet/blob/main/SAAddMissionToHubServer.cs) diff --git a/docs/reference/Mission.md b/docs/reference/Mission.md index 83159a0..8cd6191 100644 --- a/docs/reference/Mission.md +++ b/docs/reference/Mission.md @@ -51,12 +51,17 @@ Mission 的根元素。 - *`val`*?:`int`,Function 的参数。默认值为 `0`。 - *`suppress`*?:`bool`,默认值取决于运行模式:**扩展模式下为 `true`,主游戏模式下为 `false`**。 - ⚠️ 因此在扩展中**不写该属性等同于 `suppress="true"`**。 - - `true`:加载时仅记录、不执行,等到「激活时机」(即任务邮件被发送)才执行,包括: + - `true`:加载时仅记录、不执行,等到「激活时机」才执行,包括: - 通过 `nextMission` 进入的任务 - 扩展启动时的起始任务 - - 在 MissionHub / MissionListServer / DLCHub 等节点**接取**任务时 + - 在 MissionHubServer / MissionListingServer / DLCHubServer 等节点**接取**任务时(接取动作会直接调用激活,**不发送任务邮件**) - ⚠️ 通过 [`LoadMission`](Action.md) Action 加载的任务不在上述路径中,其 `missionStart` **不会执行**;有需要时应显式写 `suppress="false"` - - `false`:任务文件**每次被解析时都会执行**。除了存读档,**每次连接 hub / DHS 节点也会执行一次**(节点每次连接都会重建任务列表并从任务 XML 重新解析,见 `MissionSerializer.restoreMissionFromFile`)。因此 hub / DHS 中的任务应使用 `suppress="true"`(或省略该属性) + - `false`:任务文件**每次被解析时都会执行**。解析发生在任务的各种加载路径上,例如: + - 存读档 / 新游戏时的任务加载 + - **DHS(`DLCHubServer`)每次连接**:`navigatedTo` → `ReadActiveMissions` → `MissionSerializer.restoreMissionFromFile` → 重新解析任务 XML + - 玩家接取 DHS 任务时(`PlayerAcceptMission` 中会再次解析任务文件) + - 注意 `MissionHubServer` / `MissionListingServer` 的任务恢复发生在 `loadInit`(随存档加载),**不随每次连接重载** + - 因此 hub / DHS 中的任务应使用 `suppress="true"`(**扩展模式下**可省略该属性;主游戏模式下省略等同于 `false`) ::: details (官方介绍) 官方是这么介绍的: From b94f2262340a4ecd27540d069e459d479c506f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=BF=E8=B1=86=E6=B1=A4?= Date: Tue, 15 Sep 2026 22:54:05 +0800 Subject: [PATCH 3/3] =?UTF-8?q?docs(missions):=20=E6=9B=B4=E6=AD=A3?= =?UTF-8?q?=E6=8E=A5=E5=8F=96=E6=BF=80=E6=B4=BB=E4=B8=8E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E7=9A=84=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三个 hub 的接取方法中只有 DLCHubServer.PlayerAcceptMission 不调用 sendEmail;MissionHubServer.acceptMission 与 MissionListingServer 的接取都会调用,但是否真正发出取决于任务的 willSendEmail(由本任务文件的 置为 false;wiki 的 nextMission 一节已正确记录该语义)。 原文把 DHS 的特性写成了三者通用,现改为:激活由接取动作直接触发、不以发送任务邮件为条件,并注明各节点的调用差异。 --- docs/reference/Mission.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/Mission.md b/docs/reference/Mission.md index 8cd6191..c8e3407 100644 --- a/docs/reference/Mission.md +++ b/docs/reference/Mission.md @@ -54,7 +54,7 @@ Mission 的根元素。 - `true`:加载时仅记录、不执行,等到「激活时机」才执行,包括: - 通过 `nextMission` 进入的任务 - 扩展启动时的起始任务 - - 在 MissionHubServer / MissionListingServer / DLCHubServer 等节点**接取**任务时(接取动作会直接调用激活,**不发送任务邮件**) + - 在 MissionHubServer / MissionListingServer / DLCHubServer 等节点**接取**任务时 —— 激活由接取动作直接触发,**不以发送任务邮件为条件**(DHS 的接取不调用 `sendEmail`;另两者会调用,但是否真正发出取决于本任务的 `IsSilent`,见下文 `nextMission` 一节) - ⚠️ 通过 [`LoadMission`](Action.md) Action 加载的任务不在上述路径中,其 `missionStart` **不会执行**;有需要时应显式写 `suppress="false"` - `false`:任务文件**每次被解析时都会执行**。解析发生在任务的各种加载路径上,例如: - 存读档 / 新游戏时的任务加载