BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。
模组:制作指南/APIs/Mod structure
← 模组:目录
从此章开始,我们将正式开始介绍SMAPI中的接口。我们先来认识一下,一个模组,它需要满足什么条件才能被叫做SMAPI模组,也就是它的结构组成。
基本组成
下面是成为SMAPI模组必备的条件:
- 一个.dll文件,这是你储存代码的地方。(没错你要会.net下的任何一门语言)
- 一个名为[[manifest.json|模组:制作指南/APIs/Manifest]]的文件,这是储存模组基本信息的地方。别小瞧,它很重要!
程序入口点
将你的类派生自StardewModdingAPI.Mod,你会需要实现一个叫做Entry的抽象方法,这个方法便是你模组的入口点。它包含一个参数IModHelper,这个参数提供了近乎所有SMAPI中的接口,来帮助你更高效地写代码。
using StardewModdingAPI;
/// <summary>你的类。</summary>
public class ModEntry : Mod
{
/// <summary>The mod entry point, called after the mod is first loaded.</summary>
/// <param name="helper">Provides simplified APIs for writing mods.</param>
public override void Entry(IModHelper helper)
{
// ...
}
}
Entry 方法会在启动过程的非常早期被调用,因此可能某些东西尚未初始化。您可以使用 GameLaunched、SaveLoaded 或 DayStarted 方法以访问全部功能。如下是在 Entry 中使用 API 的简要总结:
功能 | 状态 |
---|---|
大多数 SMAPI API | ✓ 可用。包括注册事件处理器、读取配置、加载素材以及获取模组信息。 |
helper.ModRegistry.GetApi | ✖ 不可用,因为某些模组尚未加载。 |
游戏字段 | ✖ 不可靠,因为模组会在很早被加载。这包括 Game1.objectInformation 等核心字段。 |
依赖问题
大多数模组是自洽的,且仅有一个DLL文件。但这并非强制。如下是一些常见的模式:
- 要求前置另一个模组,此时SMAPI会先加载另一个模组。若前置模组未安装,则返回一个友好的错误。您可以使用模组提供的API(若前置模组有),也可以直接引用前置模组的DDLL。(若您引用了模组DLL,请确保其未被标记为 'copy local'以避免问题;SMAPI会转而加载已安装的版本。)
- 创建一个shared project并在您的模组中引用它。Shared project的代码会被编译为您模组的一部分(因此会在模组文件夹中产生一个同时包含两个项目的DLL)。
- 引用项目/DLL并将其DLL拷贝到您的模组文件夹。SMAPI会检测引用,并自动从您的模组文件夹加载DLL。不要以此方式引用模组 - 否则,当其有多个版本时,可能导致令人困惑的错误(另见上文的第一种模式)。