Bukkit插件教程-第一个插件

开始

由于mcbbs不允许纯粹的Java教程贴,我只能先更新bukkit插件教程部分,更完bukkit插件部分再去写Java教程部分。由于计划突然被打乱,所以我这几章教程可能会写的很仓促,如果有写的不周到的地方,忘请指出,稍后会做二次修改或者重写的。
参考wiki百科
参考帖子

**↑不来一首BGM吗?**

本章要求

  • 学会写一个bukkit插件

第一个bukkit插件

打开Eclipse –> [文件] –> [新建] –> [Java项目]
然后填写项目名,并点击确定

导入API

[右键项目] –> [属性] –> [Java构建路径] –> [库] –> [添加外部jar] –> [选中服务端核心] –> [打开] –> [确定]
然后你就成功导入了bukkitapi,现在你可以使用import关键字导入bukkit中的类并使用它们了。

plugin.yml

plugin.yml文件用于存储插件信息,它最少应该包含插件版本、插件主类所在包、插件主类名字等信息
我们右键项目下面的src(项目根目录) –> [新建] –> [文件](注意不是新建类!也不是新建项目!) –> [文件名填写plugin.yml] –> [确定]
这时候我们可以看到src下面多了一个plugin.yml,双击它开始编辑。这里我推荐使用notepad++编辑yml文件,不知道为什么我的Eclipse新建之后的文件总是默认为ANSI编码,然而bukkit是不认这个编码的,他只能使用UTF-8编码,所以我只能用notepad++转码并编辑这样的文档了。想知道notepad++怎么转码的同学请自己百度。
废话说多了,我们继续。
在plugin.yml下面填写这三行信息

1
2
3
name: (插件名字)
main: (主类所在包名).(主类名)
version: 1.0

name里填写你的插件名字,main填写 主类所在包名.主类名(不需要后面的.java后缀),version填写版本号,我习惯从1.0开始写。注意不要用大写的冒号,否则bukkit会认不出来的。
像我这样:

1
2
3
name: TeachingPlugin
main: cn.viosin.minecraft.main
version: 1.0

服务端加载插件时,会先遍历一遍plugins文件夹,寻找所有.jar后缀的文件,并查看该文件里的plugin.yml,然后根据里面填写的name和main所在行信息创建对应的插件对象,并调用这个类里的onEnable()方法。
其他的可选信息包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#插件作者
authors: [Xephi, sgdc3, DNx5, timvisee, games647, ljacqu, Gnat008]
#插件网站(一般填写开源地址或插件发布页面)
website: http://dev.bukkit.org/bukkit-plugins/authme-reloaded/
#插件描述
description: The first authentication plugin for the Bukkit API!
#插件的软前置(你的插件会在这些插件之后加载)
softdepend:
- EssentialsSpawn
#插件的硬前置(你的插件会在这些插件之后加载,并且没有这些插件的话你的插件就不会被加载)
depend:
- Vault
#你的插件会在这些插件之前加载
loadbefore:
- SkillAPI
- Quests

创建包

右键src –> [新建] –> [包] –> [填写包名] –> [完成]
包名就填写你plugin.yml里填写的包名,但是这个包名也是有要求的:你不能使用下列这几个包名

org.bukkit
net.bukkit
com.bukkit
net.minecraft
(包名一般是使用全小写的
这里我推荐你使用自己的域名的倒置来写,像我的域名是hamster3.cn,于是我把它倒过来再加个插件名,成了cn.hamster3.testplugin。也有人习惯用自己的邮箱倒过来写,com.@qq.372403923。嘛,其实这个对你的插件不会有什么影响,随自己喜欢就好了。

主类

右键你刚刚创建的包 –> [新建] –> [类] –> [填写类名] –> [完成]
这时你会发现Eclipse已经自动给你写好了一些代码

1
2
3
4
5
package cn.viosin.minecraft;

public class main {

}

插件的主类必须是继承了JavaPlugin的类,否则bukkit不会加载(会报错),所以我们让这个类继承JavaPlugin类。我们加上extends JavaPlugin以让他继承JavaPlugin类。现在你的代码看起来应该是这样子的:

1
2
3
4
5
package cn.viosin.minecraft;

public class main extends JavaPlugin{

}

可是这样,Eclipse就会提示错误信息:JavaPlugin无法解析为类型。事实上前面Java基础认真学了的同学应该都知道,我们没有导入这个JavaPlugin类!于是我们点击Eclipse上的小黄灯,并单击导入JavaPlugin。这样,Eclipse就不再报错了,我们的主类也成功继承了JavaPlugin类!他现在能够使用JavaPlugin类里的一些公共方法了!

启动插件

前面说到过,bukkit启动插件时会调用主类里的onEnable()方法,所以我们给主类加一个onEnable()方法好让我们的插件里的代码能够被执行!不过,我得先告诉你,这个方法在JavaPlugin类里已经有了,不过他没有任何作用,我们必须重写这个方法来使用自己自己的插件,让我们的代码生效。所以我们应该写一个公共的且无返回值的方法,而且这个方法头上需要加上一行@Override注解,加上这一行注解后编译器和bukkit都知道了我们是重载了JavaPlugin类里的方法。编译器就会帮我们检测方法是否出错(嗯?喵喵喵?)

输出信息

现在,我们在我们的onEnable里加入一行输出代码,来试试我们的插件是否真的被调用了,我们的代码是否真的被执行了。那么我们在代码里加上getLogger().info("测试信息");,也许你想问,为什么不是System.out.println("测试信息");?解释一下:getLogger获取了插件的记录器,然后info()输出一行信息,其他的方法还有warning()用于输出一行警告(嘛其实和info没什么两样)
你的代码现在看起来应该是在这样子的

1
2
3
4
5
6
7
8
9
10
package cn.viosin.minecraft;

import org.bukkit.plugin.java.JavaPlugin;

public class main extends JavaPlugin{
@Override
public void onEnable() {
getLogger().info("测试信息");
}
}

打包

右键项目 –> [导出] –> [jar文件] –> [下一步] –> [填写jar文件名字] –> [完成]
(也许中间会弹出什么警告,直接点确定就行了)

测试

在本地部署服务端,并把插件加到plugins文件夹里,开启服务端
测试输出信息
可以看到,我们的插件成功启动了,也输出了一行信息,本章任务完成

关闭插件

bukkit想要关闭一个插件时,会调用主类里的onDisable()方法。我们可以仿照onEnable一样写一个公共的无返回值的onDisable方法,并加上一行@Override注解。然后在方法体里写上我们希望这个插件被关闭时调用的代码。

重载插件

bukkit被重载时(使用了reload命令),会先关闭所有插件,然后在调用onEnable()之前先调用onLoad()方法,等服务端plugins里的所有插件的onLoad()都被调用了后,会再一个一个调用插件的onEnable()方法。(请记住这个顺序,他很重要)我们可以仿照onEnable一样写一个公共的无返回值的onLoad方法,并加上一行@Override注解。然后在方法体里写上我们希望这个插件被关闭时调用的代码。

练习

输出信息

写一个插件,让它在被启动时输出一行信息插件被启动了,被关闭时输出一行信息插件被关闭了,服务端重载时输出一行信息插件已重载
练习答案

本章完

点我返回目录

感谢各位的阅读!

人生不易,仓鼠断气