维护提醒

BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。

全站通知:

模组:制作指南/APIs/Mod structure

来自星露谷物语维基
跳到导航 跳到搜索

模组:目录

从此章开始,我们将正式开始介绍SMAPI中的接口。我们先来认识一下,一个模组,它需要满足什么条件才能被叫做SMAPI模组,也就是它的结构组成

基本组成

下面是成为SMAPI模组必备的条件:

  1. 一个.dll文件,这是你储存代码的地方。(没错你要会.net下的任何一门语言)
  2. 一个名为[[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 方法会在启动过程的非常早期被调用,因此可能某些东西尚未初始化。您可以使用 GameLaunchedSaveLoadedDayStarted 方法以访问全部功能。如下是在 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。不要以此方式引用模组 - 否则,当其有多个版本时,可能导致令人困惑的错误(另见上文的第一种模式)。