最佳實踐

有許多方法可以創建插件,並有許多陷阱等著粗心的開發者。

开发 Sponge 插件需注意

下面的开发指南针对于 Sponge 插件开发者。这并不是一个明确或全面的列表,因此它存在的意义仅仅是试图说明一些在开发过程中可能出现的问题,以及它们的比较好的解决方案。

備註

我们保留使用 Sponge 用于描述官方 SpongePowered 项目的权利。请不要使用 Sponge 作为您的插件名称的一部分,除非:(1)您的插件主要涉及到 Minecraft 方块“海绵(Sponge)”,(2)您的插件也有依赖其他 API 的版本(在这种情况下, 可以在标题中加入诸如“For Sponge”等字样)。

经济 API

經濟API用於連結經濟插件與其他利用經濟的插件(例如商店)。你可以參閱經濟API章節 here,它列出了所有你需要知道的細節。

数据包

任何攔截數據包或加入自定義物品、方塊、實體……的行為*不被計畫*成為SpongeAPI的一部分。須注意攔截數據包可能是用錯解決問題的方法,而現有的SpongeAPI可能已經包含解決方案。在一些狀況中,可以在SpongeAPI加入任何所需要的;或者相反地,使用Forge API並創建一個Mod。

使用 Forge 或者 NMS 的类

我們不建議和Forge或Minecraft元程式一起作業,除非其能提供和SpongeAPI的相容性。大部分NMS(net.minecraft.server)代碼中的插件沒有很好的錯誤處理,造成除錯非常困難。相較於使用SpongeAPI,維護NMS模組也更加困難。加入SpongeAPI程式碼內部的模組必須寫作特定API來使其可被Sponge插件調用,而並不依賴於底層的Minecraft程式碼。但插件可以創建成能在不同相融環境下載入以和底層實作 (SpongeForge or SpongeVanilla)互動。

依赖于特定 Minecraft 实现的插件的代码很容易在版本更新后无法正常工作。插件开发者应该标记清楚任何出现不兼容代码的地方。正因如此,这些插件会看起来更像是 「Mod」 。

Mixins

Mixin 是专门用于在其他 Mod 或插件启动前操纵类字节码的工具。FML 将其称为 Coremod,SpongeForge 本身也是一个 Coremod,并且在 Minecraft 启动时使用 Mixin。插件在使用 Mixin 时,需要额外注意可能带来的更高的维护成本。

与 Mod 的界线

有着一些 Mixin 代码的 Sponge 插件实际上也可以被称为 Coremod。

  • 如果想要在 FML 中使用 Mixin,那么相应的代码必须在一个 Coremod 中。当然相应的 JAR 也可能包含一个 Sponge 插件,所以说实际上插件和 Mod 的界线其实很模糊。

  • 如果想要在 SpongeVanilla 中使用 Mixin,那么相关的声明必须出现在 Manifest 文件中。SpongeVanilla 从而可以执行 Mixin 中的代码。

  • 单个 JAR 完全可以在不同的服务端扮演不同的角色(事实上,一个 JAR 可能会包含一个 Tweaker,一个 FML Mod,一个 Bukkit 插件,一个 Sponge 插件,以及/或者一个 LiteMod)。

这里我们给出一些有助于理解的定义。

Tweak Mod(又名 Tweaker)

一個次系統級的模組透過LaunchWrapper直接繫結遊戲,通常模組系統(如LiteLoader、FML)和獨立模組(如Optifine),可以直接和任何遊戲環境互動。基本上跨越每個版本。

Coremod

Coremod 一般有着和 Tweaker Mod 一样的能力修改游戏代码,不过它的加载过程一般被 Mod 加载器包装起来了。Coremod 在任何情况下都会被直接暴露在游戏环境下。Coremod 一般没有办法保证不同 Minecraft 版本的兼容性。

Mod

一般模组只能通过 Mod 加载器和游戏交互。一般模组通常可以直接操作游戏中的对象,然而大部分情况下它们只能通过 Mod 加载器提供的代码修改游戏内容。一般模组通常没有办法在不同的 Minecraft 版本间保持兼容性(具体和模组的性质有关)。广义的 Mod 通常指所有拥有修改游戏行为的代码,不过这里以防混淆我们暂且使用这样的定义。

插件

插件一般通过 API 和游戏交互,因此并不直接和游戏对象交互,而只是操作 API 提供的对象。因此插件一般只会在 API 发生不向前兼容的变动时不再兼容(一些插件甚至可以在 API 发生变动时仍然保持兼容性)。

区分这些概念也是很重要的。因为一些 JAR 包含有 Mod,所以它们往往会被归入到 Mod 的类别,因而带来术语上的混淆不清。一些并没有完全和 API 解耦的插件也会被归入 Mod 的类别。这种“插件”在相应的插件 API 还没有完全成熟的时候很常见。

优势

如果一个插件不仅仅局限在调用 API,同时担任一个 Mod ,甚至 Coremod 的工作,那么除了显而易见的缺点(难以保证跨版本兼容性)之外,它也可以同时利用 Mod 的优点(可与游戏代码直接交互)以及插件的优势(对游戏机制的高度抽象,及与其他插件的协作)。

一个主要的优势包括在迁移到更高版本的 Minecraft 时需要的维护成本的降低,因为基于相应的 API 的特性往往会更稳定些。

這種模組可以用於實作需要超出API能力的插件

和一些 NMS “插件”不同,这种 Mod 和插件的组合让一切都明朗起来。