跳到主要内容

paperweight-userdev

paperweight 是 Paper 自定义构建工具的名称。其中的 paperweight-userdev Gradle 插件部分 提供了在开发过程中访问内部代码(也称为 NMS)的功能。

备注

本指南使用 Gradle Kotlin DSL 编写,并假设你对 Gradle 有一些基本了解。 如果你想看一个使用 paperweight-userdev 的完整功能插件, 请查看这个示例插件

为什么这很有用

这是访问服务器内部代码的唯一支持方式,因为重新分发服务器 JAR 违反了 Minecraft EULA 和一般许可假设。即使你手动依赖打过补丁的服务器,你也会 妨碍其他人在你的项目上工作,并且在 IDE 中会缺少已部署的 API javadoc/源代码。

除此之外,Spigot 和 1.20.5 之前的 Paper 版本仍然使用 Spigot 映射,这些映射混合了混淆的字段/方法 以及已映射和自定义命名的类。这在开发环境中可能难以使用。这个插件让你在开发过程中可以使用 完全反混淆的类型、名称和字段,然后重新映射你的插件,使其仍然可以在混淆的服务器上使用。 但是,这不适用于反射。如果你想支持混淆的服务器,可以看看这个库, 它可以让你在反射中使用非混淆的名称。

1.20.5 Mojang 映射运行时

从 Minecraft 1.20.5 版本开始,Paper 使用 Mojang 映射的运行时,而不是将服务器重新混淆为 Spigot 映射。 详见此处

添加插件

将插件添加到你的 build.gradle.kts 文件中。

最新版本的 paperweight-userdev 支持 Minecraft 1.17.1 及更新版本的开发包,所以最好保持更新! 只有最新版本的 paperweight-userdev 得到官方支持,如果你使用旧版本遇到问题,我们会先要求你更新。 此外,如果你遇到 paperweight-userdev 的问题,建议你将 Gradle 版本更新到最新版本。有关升级 Gradle 的更多信息, 请查看 Gradle wrapper 文档。如果你继续遇到问题,应该在我们专门的 Discord 服务器#build-tooling-help 频道中询问!

快照版本

paperweight-userdev SNAPSHOT(预发布)版本仅通过 Paper 的 Maven 仓库提供。

settings.gradle.kts
pluginManagement {
repositories {
gradlePluginPortal()
maven("https://repo.papermc.io/repository/maven-public/")
}
}

添加开发包依赖

如果你现在尝试加载你的 Gradle 项目,你会收到一个错误,说你必须声明 一个开发包依赖。你可以通过在 build.gradle.kts 文件的 dependencies 块中添加来实现。

提示

你应该移除任何对 Paper API 的依赖,因为开发包已经包含了它。

Gradle 任务

reobfJar

这个任务创建一个重新混淆到 Spigot 运行时映射的插件 JAR。 这意味着它可以在标准的 Paper 服务器上工作。

输出将在 build/libs 文件夹中。文件名包含 -dev 的 JAR 是 Mojang 映射的(未重新混淆)并且不会在大多数服务器上工作。

Shadow

如果你在构建脚本中应用了 shadow Gradle 插件,paperweight-userdev 将 检测到并使用 shaded JAR 作为 reobfJar 任务的输入。

build/libs 中的 -dev-all.jar 文件是已经 shaded 但未重新混淆的 JAR。

你可以让 reobfJar 任务在默认的 build 任务上运行:

tasks.assemble {
dependsOn(tasks.reobfJar)
}

1.20.5 及以后

从 1.20.5 开始,Paper 使用 Mojang 映射的运行时,而不是将服务器重新混淆为 Spigot 映射。 此外,CraftBukkit 类将不再被重定位到版本化的包中。 这要求在必要时在加载前对插件进行反混淆。

大部分这个过程由 paperweight 自动完成,但在从现在开始使用服务器内部代码(或"NMS")时有一些重要的事项需要了解。

默认映射假设

  • 默认情况下,如果所有 Spigot/Bukkit 插件在清单中没有指定其映射命名空间,将被假定为 Spigot 映射。 相反,如果所有 Paper 插件在清单中没有指定其映射命名空间,将被假定为 Mojang 映射。
  • Spigot 映射的插件需要在首次加载时进行反混淆,Mojang 映射的插件则不需要。

编译为 Mojang 映射

信息

这是首选选项,因为服务器启动时的一次性插件重映射过程将被跳过, 并且它可能允许你在较小的更新之间保持版本兼容性而无需更改或额外的模块。 但是,这使你的插件与 Spigot 服务器不兼容。

如果你想让你的主要输出使用 Mojang 映射,你需要移除所有 dependsOn(reobfJar) 行并在你的构建脚本中添加以下代码:

build.gradle.kts
paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION

编译为 Spigot 映射

如果你想让你的主要输出使用 Spigot 映射,在你的构建脚本中添加以下代码:

build.gradle.kts
paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.REOBF_PRODUCTION

这对于同时有 Spigot 和 Paper 加载器并想保持与两者兼容的插件很有用。

备注

如果你使用带有 Groovy DSL 的 Gradle,你应该通过静态方法访问字段,如 getMOJANG_PRODUCTION()