Skip to content
On this page

使用其他模组与插件

脚本包必须声明它使用 API 的每个外部模组或 Paper 插件。清单声明负责运行时校验和类加载;开发项目还需要单独把 API 放进编译类路径。

必需集成

下面的清单在 Fabric/NeoForge 上接受 Create 6.x:

json
{
  "id": "create_integration",
  "name": "Create Integration",
  "version": "1.0.0",
  "dependencies": [
    {
      "id": "create",
      "version": ">=6.0.0 <7.0.0",
      "required": true,
      "platforms": ["fabric", "neoforge"],
      "environment": "both"
    }
  ]
}

Katton 只校验当前平台和运行侧适用的条目。必需依赖缺失、未启用或版本不满足时,脚本包会在编译前被排除。

版本表达式支持精确版本、比较条件、以空格或逗号连接的 AND 条件,以及 || 分支。

可选集成

基础脚本包可以在没有该集成时继续运行,就把 required 设为 false

json
{
  "dependencies": [
    {
      "id": "spark",
      "version": "*",
      "required": false,
      "platforms": ["fabric", "neoforge", "paper"],
      "environment": "server"
    }
  ]
}

调用可选 API 前先判断:

kotlin
import top.katton.api.ServerPhase
import top.katton.api.ServerReadyContext
import top.katton.api.ServerScriptEntrypoint
import top.katton.api.dependencies

@ServerScriptEntrypoint(ServerPhase.READY)
fun optionalIntegration(context: ServerReadyContext) {
    if (!dependencies.isLoaded("spark")) {
        println("Spark integration is unavailable on ${context.platform}")
        return
    }

    println("Spark version: ${dependencies.version("spark")}")
}

在明确检查可用性后,或希望得到更清楚的运行时错误时,可以使用 dependencies.require(id)。它不能替代清单中的必需依赖声明。

调用 Paper 插件类型 API

Paper 依赖的 id 使用 PluginManager 识别的插件名:

json
{
  "dependencies": [
    {
      "id": "PlaceholderAPI",
      "version": "*",
      "required": true,
      "platforms": ["paper"],
      "environment": "server"
    }
  ]
}

声明之后,世界脚本可正常导入并调用插件 API:

kotlin
import me.clip.placeholderapi.PlaceholderAPI
import org.bukkit.event.player.PlayerJoinEvent
import top.katton.api.ServerPhase
import top.katton.api.ServerScriptEntrypoint
import top.katton.api.event.managed.registerEvent

@ServerScriptEntrypoint(ServerPhase.READY)
fun placeholderApiIntegration() {
    registerEvent<PlayerJoinEvent> { event ->
        val message = PlaceholderAPI.setPlaceholders(
            event.player,
            "Welcome %player_name%!"
        )
        event.player.sendMessage(message)
    }
}

Katton 使用插件真实 JAR 或类目录编译,并在运行时委托给其现有 ClassLoader。普通类型调用不会每次经过反射。Paper 依赖只能在 ServerPhase.READY 使用,不要在 BOOTSTRAP 引用插件类。

开发编译类路径

清单不会为 IntelliJ 或 Gradle 下载 API。脚本包项目可使用以下任一种方式:

kotlin
dependencies {
    // API 有 Maven 产物时优先使用:
    compileOnly("group:artifact:version")

    // 或把依赖 JAR 放进 lib/:
    compileOnly(fileTree("lib") { include("*.jar") })
}

模板生成器始终生成 lib/*.jar 的 compile-only 后备配置,并允许在下载项目前添加世界包依赖。空的全局包初始使用 dependencies: [];只有全局脚本确实使用外部 API 时,才应在其清单中补充依赖。

平台行为

平台解析与执行方式
Fabric通过 Fabric Loader 解析模组 ID,并包含必需的传递模组依赖。
NeoForge通过 NeoForge 解析模组 ID,并包含必需的传递模组依赖。
PaperServerPhase.READY 通过 PluginManager 解析已启用插件,并委托给其 ClassLoader。

多人连接的接收客户端会独立校验自己的适用依赖。服务端安装了某依赖,并不代表客户端也安装了对应模组。

完整字段与版本语法见清单、依赖与签名