• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

Paper/Paper 项目的搭建

来自Minecraft插件百科
跳转到导航 跳转到搜索

本文的图片都是由译者提供的。供新手开发者找到文章提到的选项。

由于Paper团队主要使用 IntelliJ IDEA 进行开发,所以本指南将以该IDE作为重点。
不过,下文应当也适用于其它IDE,仅需针对性的作一些微小的修改即可。

Paper 团队使用 Gradle 作为 Paper 等项目的构建工具,其插件开发工具链使用 Gradle 对项目进行依赖管理。 在经过修改后,下文代码也将适用于其它构建工具,例如Maven。不过本文所提供的代码将只涉及Gradle。 阅读此文档学习如何从 Maven 迁移到Gradle。

使用 Minecraft Development

安装 Minecraft Development插件

打开IntelliJ IDEA,在主界面中选中 Customize(自定义) -> All Settings (全部设置) -> Plugins (插件),在顶部选中Marketplace

搜索Minecraft Development,点击安装,完成后重启IntelliJ IDEA

创建项目

在创建项目对话框中选中 Minecraft,Platform Type(平台类型)为Plugin,Platform(平台)为Bukkit

Bukkit Platform按照情况选择,Spigot兼容大部分Bukkit服务端,Paper则在Spigot的基础上有新增API

Minecraft Version(Minecraft版本)视情况选择,Plugin Name(Plugin名称)为插件名称,主类可以直接使用自动生成的名称

Optional Settings中为可选项,按需填写

构建系统 Gradle/Maven

Paper Manifest -> Use paper-plugin.yml 此项启用后将作为Paper插件,不再支持Spigot和Bukkit服务端

构建系统与创建常规项目同理

JDK按照Minecraft版本选择,1.16以下使用JDK8+,1.17使用JDK16+,1.18开始使用JDK17+

手动创建

创建新项目

打开你的 IDE 然后点击创建新项目的按钮。
在 Intellij 中,你需要选择你想要创建的项目类型 —— 首先选中 New Project,然后选择 Gradle - Kotlin DSL 后单击 Create

接着,IDE 将自动为你打开可用于管理项目依赖的 build.gradle.kts 文件。

将 Paper 作为依赖项添加

要将 Paper 作为插件项目的一个依赖项,你需要将 Paper 仓库 ( repository ) 和 Paper 依赖 ( dependency ) 添加到你的 build.gradle.kts 文件中。

repositories {
    mavenCentral()
    maven("https://repo.papermc.io/repository/maven-public/")
}

dependencies {
    compileOnly("io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT")
}

java {
    toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}

创建 src 目录

跳过

如果 IDE 已经为你的项目自动创建 src 目录,你就可以跳过这一步了。

要创建 src 目录,你需要新建一个名为 src 的文件夹,然后在里面创建子目录,叫做 main
接下来,在main之中创建两个文件夹,分别命名为 javaresources

该文件夹的目录结构形如下:

...
example-plugin
├── build.gradle.kts
├── settings.gradle.kts
└── src
    └── main
        ├── java
        └── resources
...

创建 java 目录

Java 源代码存放在 java 目录中。你必须先创建一些包来管理你的 Java 代码。 拿下面这个结构举例,我们创建了一个三层的包并将其命名为 io.papermc.testplugin。而在包中有一个ExamplePlugin 类 ( class )。

...
example-plugin
├── build.gradle.kts
├── settings.gradle.kts
└── src
    └── main
        ├── java
        │   └── io
        │       └── papermc
        │           └── testplugin
        │               └── ExamplePlugin.java
        └── resources
...

可以看到,ExamplePlugin 类在 io.papermc.testplugin 包中。
包用于管理代码。本质上,包就是个文件夹。在 Java 中,我们用包来管理一组相互间有一定关联的类。
如果你想要了解更多关于包的信息,你可以在 Oracle 的指南中查看

要为你的包命名,你需要将域名颠倒顺序排列。比如有一个叫做 papermc.io的域名,你的包就应该命名为 io.papermc
如果你还没有一个域名,你可以将你的 GitHub 用户名作为包名(格式大概是:io.github.用户名)。
若你的名字叫做 Linus Torvalds,你的包应该是 io.github.torvalds

跟随域名的应该是你的项目名。
比如,你有一个的工程叫做 ExamplePlugin,你的包应该是io.github.torvalds.exampleplugin
你的每个插件都会有一个独一无二的包名。

主类

主类是你的插件中所有代码执行的起点,是唯一一个继承 JavaPlugin 的类。
下面是一个 ExamplePlugin 类的示例:

package io.papermc.testplugin;

import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class ExamplePlugin extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        event.getPlayer().sendMessage(Component.text("Hello, " + event.getPlayer().getName() + "!"));
    }

}

创建 resources 目录

resources 文件夹是在你的插件中存放 plugin.yml 的地方。在这里了解更多关于plugin.yml的信息。

最后

现在,你就有一个将 Paper 作为依赖的插件项目啦!
接下来,编译你的插件,然后在 Paper 服务器上运行插件,就大功告成了。

如果你想要精简测试插件的流程,你可以使用 Run-Paper Gradle task。
它将帮你自动下载一个 Paper 服务端并运行,以便测试你的插件。


提示

如果你正在使用 IntelliJ,你可以使用 Gradle 图形界面中的 Build 菜单来编译你的插件 - 它应该位于你的 IDE 的右上角。
编译成功后输出的 jar 文件应该存放在 build/libs 文件夹中。

使用Paperweight Userdev

此处为插件开发的高阶内容,直接在代码中调用NMS可能会导致插件不再兼容其他版本服务端,如仅需调用Paper API请勿使用Paperweight

官方文档

paperweight是Paper的定制构建工具的名称。Gradle插件部分提供了在开发期间访问内部代码(也称为NMS)的功能。

通过API在下载页面上提供的Paper服务器jar是Paperclip jar。它们使用Spigot的映射,这些映射本质上是一些类型名称,但完全混淆了字段和方法。这使得它很难在开发环境中使用。这个插件允许您在开发期间使用完全去混淆的类型、名称和字段,然后重新映射您的插件,因此它仍然可以与混淆的服务器一起使用。

重新混淆不适用于反射。查看类似于 这个库 的东西,以便能够在反射中使用没有混淆的名称。

添加 Paperweight Userdev 插件

Paperweight仅支持Gradle,暂不支持Maven

具体的添加方法请见 [1]

添加开发包依赖

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

dependencies {
    // 其他依赖
    paperweight.paperDevBundle("1.20.4-R0.1-SNAPSHOT")
}

开发包已含有paper-api,应当从依赖中移除此项

对于Paper 1.20.4,其中的版本为 1.20.4-R0.1-SNAPSHOT

Gradle任务

reobfJar任务创建一个插件jar,它被重新混淆为Spigot的运行时映射。这意味着它可以在标准的Paper服务器上工作。(类似forgegradle reobfJar)

输出将在build/libs文件夹中。文件名包含-dev的jar是mojang映射的(没有重新混淆),在大多数服务器上都不能工作。

提示
如果你在构建脚本中应用了Gradle Shadow插件,paperweight-userdev将检测到这一点,并使用shadowJar作为reobfJar任务的输入。

build/lib中的-dev-all.jar文件是shadowJar的,但没有经过重新混淆处理的jar文件。

可使用此方法将reobfJar与默认build同时运行

tasks.assemble {
    dependsOn(reobfJar)
}