上回书说道开发环境的搭建,那么我们已经拥有工具啦~
现在要做的就是编写第一个插件,实现最最简单的功能QvQ。
一个Bukkit插件基本构成
一个完整功能bukkit插件是由三大文件组成的:
1.1、plugin.yml——记录插件以及命令信息;
1.2、config.yml——加载插件配置文件供用户更改;
1.3、class文件——emmm,这个就是用来实现功能的;
其中1.3项又分为:
2.1、主类
2.2、功能类
2.3、命令类
2.4、监听器类
看似很复杂对吧qwq,但注意,要被bukkit所能读取的插件,也就是最简单的插件,只要包含plugin.yml,主类就行,那么我们这节的主题是helloworld,就从最简单的开始叭~
创建Eclispe工程
如图呢是Eclipse去掉welcome页面的样子qwq:
编写插件呢我们只要创建一个普通的java工程文件就行啦
然后next,注意不要直接finish,因为我们写的是bukkit插件,所以要用bukkit的库,即添加依赖
然后这里我们选择教材中的api(可能名字不一样不要介意qwq)
这样就会发现左侧工程栏内出现了刚刚创建好的工程~
然后呢,咱们先缓一步,说说java
众所周知java是面向对象编程语言,所以其每一个程序,哪怕只有一个main方法,他也必须放在一个类里,所以,创建一个java程序的步骤如下:
新建工程文件->创建一个包->创建一个类->在类中写代码->编译导出
那么我们目前完成了第一项,现在直接跳过第二项!直接创建类。
为什喵,这就是集成开发环境的妙处之一了呀~
按照箭头走就行qwq~
org.bukkit.plugin.java.JavaPlugin
这里说一下包名,在java中,包的作用是用来存放类,并且防止冲突的,什喵叫冲突呢,就拿bukkit为例,我编写了一个插件,用我的域名,你编写了一个插件也用我的域名,那么我俩的插件加载到同一个服务端时就(可能)引发冲突,使bukkit
在用到这个插件时无所适从,因为没有指定相关的import代码。
(所以各位行行好不要用我的域名QwQ,万一哪天真碰上了呢qwq)
咱们继续回到包,为了解决这种冲突问题,业内有一条不成文的规矩,在包名前面加上自己的域名反过来,比如我的域名“dayflowers.work”,把他反过来就变成了“work.dayflowers”,就像图片中第一行那样纸。
哎不是说你没有域名就不能写,你可以随便编一个,比如“pig.sheep”,反正编译器不会报错就行~
开始敲代码
好哒在一切都创建好之后,就可以finish啦,会出现如下界面
可以看见右侧代码框里出现了几行代码,这是IDE(集成开发环境,以下全以此简称)自动为我们添加的,那么就要提到Superclass那行里的东西,学过java都知道有一个父类和子类的概念,子类继承父类的属性。
根据最后一个单词我们可以大体上猜出意思,JavaPlugin,用java写的插件,这是所有bukkit插件的父类,具有访问服务端的权限,并且可以被bukkit加载
参考dalao的插件(BedWars、ViaVersion):
主类均以继承JavaPlugin开始(请不要被代码吓到,人家是大佬qwq)。
因此我们得出结论,bukkit是由继承JavaPlugin的方式来声明一个主类的
既然这样我们效法他们,做出了一个主类
package work.dayflowers;
import org.bukkit.plugin.java.JavaPlugin;
public class main extends JavaPlugin {}
但是这样子的一个插件没有办法被bukkit加载,除了前面所说的plugin.yml这样的信息存储文件,还缺少两个方法用于bukkit初始化和卸载插件,这两个方法是:
他们的描述是“当这个插件被关闭时调用.”和“启用此插件时调用.”,因此这两个插件被用于加载和卸载,注意这也是唯一两个必不可少的方法,换而言之,一个合格的插件(至少)必须要有onEnable()和onDisable()方法qwq
但是在我们的父类JavaPlugin里边已经有了这个方法,我们只要重写这俩方法就行,为了IDE能够检查我们的错误,在方法前面加上注解@Override(不知道喵是注解的去看Java的书或者问度娘QwQ)
像酱紫:
@Override
public void onEnable() {}
@Override
public void onDisable() {}
把这四行代码写进类中,最后代码部分成型:
package work.dayflowers;
import org.bukkit.plugin.java.JavaPlugin;
public class main extends JavaPlugin {
@Override
public void onEnable() {}
@Override
public void onDisable() {}
}
那么代码部分到这里就暂时告一段落~
插件的身份标识——plugin.yml
那么前面我们说到在Project name一栏里填写的只是工程名字,那么怎样声明插件名称以及其他的一些东西呢。
bukkit为我们提供的一个办法是用yml配置文件,在API帮助文档下有一个这样的表格:
其中红框内的键为必须(emmm,至于键是什喵玩意儿大家可以去了解一下YAML语法,懒得去了解的小伙伴可以接着往下看,慢慢就能明白qwq),他们是酱紫使用的:
main: work.dayflowers.main
name: Hello
version: 0.1.0
看见了嘛,每一个键对应开头冒号前的字母,右边的内容成为键值,这样的一行语句称为键值对。一个最最基础的配置文件就由三个键值对构成。
奥对了在此要强调一下,YAML语法及其特别以及非常的严格,每一个空格都可能成为报错的理由。YAML的缩进为2个空格,而且键冒号后面必须跟着一个空格,否则就会报错(敲黑板划重点了昂),像酱紫
name:Hello //错误
name: Hello //正确
那么YAML的缩进我们以后讲到config.yml的时候在细说。
还有一点,YAML里不能有中文(非要用中文的方法有,可是我不会qwq)。
现在我们回到上面那三行键值对,一个个讲,第一个main,也是最最重要的,前文我们说过在plugin中不能有main方法,只能有一个主类和两个用于加载和卸载的方法,那么bukkit怎么知道哪一个是他的主类呢qwq?
注意一下,前面说过bukkit的插件是用继承的方式来声明的主类,但这只是一个身份标识,并不能够被bukkit正确的找到,因此需要main这个键来引导。
聪明的童鞋能够发现main的键值是一串包名,和前面我们创建的包一模一样,只是末尾多了个main。
bukkit会根据包名寻找到你的主类(至于他怎么寻找的我也不知道呀qwq),因此最后一个句点后面的内容必须是一个类,换而言之就是你的包名加上你的主类构成这样的一个键值(不要手贱加上分号,不然会报错qwq)
那么name这个键就很好理解啦,除了不能用中文之外都行,代表你的插件名称,会在服务端读取插件相关信息时显示
version,更简单了,随便写,代表版本号。
前面那张表格里还有非常多的键,用作不同的功能用来宣传插件(说白了就是装b)……qwq,我们这里略过不讲,那张表格位于帮助文档的“org.bukkit.plugin.PluginDescriptionFile”包下。
解释完一通,我们可以把他正式添加进刚才的插件中辣(≧▽≦)/
这里按照图片来就行:
然后会出现一个空白页面(如果有一个奇怪的窗口弹出来说一堆奇怪的话,不要管他就行,直接cancel):
吧刚才的东西复制进去,然后需改main的键值,改成“你的包名.你的主类”,然后保存。
那么这个插件已经可以被服务端读取辣~但是说好的helloworld呢!
helloworld
回到主类,在主类的任意一个方法里有很多很多方法可供调用,其中值得一提的是这个:
由于这个方法不在bukkit包中,所以我们只要记住它所附带的一个方法:
getLogger().info("helloworld");
info这个方法的作用是向服务端输出一条信息。
那么把他添加进主类的onEnable方法中,最后成型的插件:
这些统统做完了以后,我们把他编译输出,跟着红框走:
最后可能会有一个窗口弹出来,单击OK就行,finish以后呢会发现输出目录下多了一个jar文件(如果IDE报错的话就看看有没有划红线的语句,跟着上文修改一遍qwq):
测试
然后我们进入教材,有一个Server文件夹,单击进去,先把服务端开起来run一遍,等加载好以后把他关掉,会出现一大堆文件:
我们进入plugins文件夹下,吧刚才的jar文件拖进去,再次开启服务器:
怎么样呐~ 484满满的成就感~
P.S.至于这个服务端在已经包括在教材里了,至于教材在哪儿,我还是再发一遍qwq 链接
学完本节你应该知道
1、最基本的bukkit插件由主类、plugin.yml组成;
2、bukkit插件由继承(extends)的方式声明,并在plugin.yml配置文件的main键里引导;
3、主类必须重写onEnable(),onDisable()方法
4、getLogger().info("");用于向服务端输出一条信息.
练习
再新建一个工程,编写一个可以运行的插件,并在插件被卸载时发送一条信息(P.S. 查看卸载信息可以先把插件在服务端中载入,然后在服务端使用reload命令)
好啦那么本节先到这里
下次我们开始制作有具体功能的插件qwq