MineCraft插件开发简明教程-开发环境部署

作者:czp 分类: Minecraft 发布于:2016-12-25 0:33 ė1131次浏览 60条评论

环境: Ubuntu 16.04 | IDEA 2016.3.4 | openjdk-8-jdk 1.8.0_111 | spigot 1.11.2-R0.1-SNAPSHOT


其实 MineCraft 插件开发过程在半年前就想把他记录下来,因为我在开发过程中发现国内资料可谓是没有,国外资料也不是非常齐全,既然我找不到文档,那么其他人一定也找不到文档。既然如此就由我来丰富国内的 MineCraft 插件开发文档,这是本系列简明教程的初衷。


本教程以 spigot 为目标服务端,如果没有特殊说明,之后所有的内容均指代 spigot

在开发 MineCraft 插件之前,我们首先了解一些相关信息。

spigot 实现了全部的 bukkit API ,因此 bukkit 插件可以直接在 spigot 上运行, bukkit 开发者也可以按 bukkit 的开发方式进行 spigot 插件的开发。唯一不同的是 spigot 提供了一些额外的 API 来更加方便开发者,并且 spigot 的运行效率更高。一些细节问题在 spigot 可能会和 bukkit 不同,例如不允许异步玩家操作,这些我们暂且忽略,在之后的章节再详细描述它们。

首先,我们访问 spigot 官网 wiki 来获取基础的开发者文档 https://www.spigotmc.org/wiki/spigot-plugin-development/

官网文档包含的内容非常有限,本教程将在官网文档的基础上展开讲述。具体的 API 可以查看 spigot javadoc https://hub.spigotmc.org/javadocs/spigot/


创建工程

首先我们需要正确安装 JDK 和 Intellij IDEA 并且对 java 语言有比较深入的了解。接下去,本文将默认你是一位具有相当 java 编程经验的读者。如果你正在学习 java ,现阶段不推荐你继续阅读本文,这可能会对你的 java 学习造成阻碍。

我们打开 IDEA ,新建一个 maven 工程

2016-12-25 01-13-14屏幕截图.png

点击下一步,设定 GroupId 和 ArtifactId ,我们以 com.hiczp 和 spigot-plugin 作为示例。

完成设定后,我们将获得一个空的 maven 项目。


加入依赖

我们需要开发的是 spigot 插件,也就是被 spigot 加载并运行的程序,这个程序不需要包含 spigot ,只需要按一定格式编写并能被 spigot 识别。我们的开发过程中需要补全 spigot 中的类和方法名,因此我们需要以 provided 形式加入 spigot 相关依赖到 maven

我们打开项目中的 pom.xml 并加入如下语句到 <project> 标签内侧。


<repositories>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
    </repository>
</repositories>
<dependencies>
    <!--Spigot API-->
    <dependency>
        <groupId>org.spigotmc</groupId>
        <artifactId>spigot-api</artifactId>
        <version>1.11.2-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <!--Bukkit API-->
    <dependency>
        <groupId>org.bukkit</groupId>
        <artifactId>bukkit</artifactId>
        <version>1.11.2-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
</dependencies>


其中, <repositories> 标签用于指定仓库为 spigotmc 的 maven 仓库,如需手动访问 spigotmc nexus ,见此链接 https://hub.spigotmc.org/nexus

<version> 标签指定所用的依赖版本,这里以 1.11.2-R0.1-SNAPSHOT 作为演示,如需其他版本请手动访问 spigotmc nexus 查看可用版本并更改标签值。

在 pom.xml 文件上 右键 -> Maven -> Reimport 使其重新加载,此时将开始依赖的下载。

如果你的 maven 设置(settings.xml)指定了镜像仓库(mirrors),可能会导致错误,在下载 spigot 相关依赖时请暂时去除它们。


HelloWorld

首先在 java 目录下创建包,这里以 com.hiczp.spigotplugin 为例。之后创建入口类,实际上入口类可以是任何名称,但是为了阅读和记忆的方便,这里以 Main 为例。创建完毕目录和类后,我们的目录大概是这样的

2016-12-25 14-35-44屏幕截图.png

我们首先让我们的 Main 类继承于 JavaPlugin ,再重写其中的 onEnable 和 onDisable 方法 (Code -> Override Methods)


package com.hiczp.spigotplugin;

import org.bukkit.plugin.java.JavaPlugin;

/**
 * Created by czp on 16-12-25.
 */
public class Main extends JavaPlugin {
    @Override
    public void onEnable() {
        super.onEnable();
    }

    @Override
    public void onDisable() {
        super.onDisable();
    }
}


JavaPlugin 是 spigot 的插件父类,所有插件的入口类必须继承于它。且入口类将是单例模式,一个插件中不允许有两个类继承于 JavaPlugin ,如果在插件的其他地方需要调用 JavaPlugin 内的非静态方法,请将插件入口类的实例(将在插件启动时被 spigot 实例化,这部分代码请放到 onEnable 方法中)的引用保存到其他类(例如 Config 类)中的静态变量,以供其他类调用。

onEnable 和 onDisable 方法是插件在加载和卸载时被调用的方法,有点类似 Android 开发中的 Application 类中的各种方法。我们先来写一个简单的例子。


package com.hiczp.spigotplugin;

import org.bukkit.plugin.java.JavaPlugin;

/**
 * Created by czp on 16-12-25.
 */
public class Main extends JavaPlugin {
    @Override
    public void onEnable() {
        System.out.println("插件被加载了");
    }

    @Override
    public void onDisable() {
        System.out.println("插件被卸载了");
    }
}


此插件将在被载入和卸载时向标准输出设备输出字符串,现在我们再来编写一个 plugin.yml 文件以使 spigot 可以识别这个插件。

在 resources 文件夹下创建文本文件并命名为 plugin.yml ,一份简单的 plugin.yml 文件可能是这样的


name: HelloWorld
version: 0.1
author: czp
main: com.hiczp.spigotplugin.Main
website: https://www.hiczp.com/


其中,name 是插件名,main 是入口类,这是必须的参数。

现在,我们已经完成了这个插件,设定 artifact 设置后输出即可得到可用的插件 jar 。但是为了方便直接在 IDEA 中调试,我们还需要进行以下步骤。


创建 spigot 环境

首先,我们在项目目录创建一个新目录,叫 spigot ,并在其中放置并运行一次 spigot 服务端。spigot 服务端搭建教程参见 https://www.hiczp.com/post-136.html

现在,我们的项目目录是这样的

2016-12-25 15-49-57屏幕截图.png

现在,我们设定 IDEA 的 Artifact 输出设置

2016-12-25 15-56-27屏幕截图.png

需要注意的是,spigot 插件由 spigot 进行读取,因此不需要 MANIFEST.MF 文件,更加不需要在 MANIFEST 中指定入口类。

2016-12-25 15-57-41屏幕截图.png

点击 OK ,现在我们需要指定 Artifact 输出目录为项目目录下的 spigot/plugins/ ,这样,我们的插件在输出时,就会直接输出到 spigot 的插件目录。

2016-12-25 16-01-34屏幕截图.png

我们进行一次 Artifact 构建,很好,我们的插件被成功输出到了目标路径。

2016-12-25 16-03-16屏幕截图.png


运行 & 调试

在之前的步骤中,我们成功将插件编译输出到了 spigot 的插件目录,接下去,我们要运行 spigot。

新建一个调试设置,类型为 JAR Application ,JAR 路径选择项目目录下的 spigot/ 文件夹下的 spigot 的 jar 文件。工作目录选择项目目录下的 spigot/ 文件夹。同时,添加一个运行前工作,运行前构建插件,这样我们就可以一键构建,输出,部署和运行。

2016-12-25 16-12-34屏幕截图.png

现在,我们点击调试按钮。我们将看到 spigot 在 IDEA 的嵌入式标准输出窗口中被运行,当 spigot 开始加载插件时,我们看到了插件输出的字符串。此时我们关闭服务端,看到了另一条会在插件卸载时输出的字符串。

2016-12-25 16-18-50屏幕截图.png

加入断点后,程序会在断点处暂停。调试过程与普通 java 程序无异。如果你尚未熟悉 IDEA 的操作,请参见 jetbrains 文档 https://www.jetbrains.com/idea/documentation/


至此,我们的插件已经可以被 spigot 正确识别与加载。接下去,我们可以开始进一步的开发来实现我们所需的功能。

本文出自 czp的装逼站,转载时请注明出处及相应链接。

0

发表评论

电子邮件地址不会被公开。必填项已用*标注


Ɣ回顶部