Bukkit~插件编写教程[1]:一切的起源helloworld

上回书说道开发环境的搭建,那么我们已经拥有工具啦~
现在要做的就是编写第一个插件,实现最最简单的功能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:


18.png

编写插件呢我们只要创建一个普通的java工程文件就行啦


19.png

20.png

然后next,注意不要直接finish,因为我们写的是bukkit插件,所以要用bukkit的库,即添加依赖
21.png

22.png

然后这里我们选择教材中的api(可能名字不一样不要介意qwq)


23.png
然后再finish
24.png

这样就会发现左侧工程栏内出现了刚刚创建好的工程~
然后呢,咱们先缓一步,说说java
众所周知java是面向对象编程语言,所以其每一个程序,哪怕只有一个main方法,他也必须放在一个类里,所以,创建一个java程序的步骤如下:
新建工程文件->创建一个包->创建一个类->在类中写代码->编译导出
那么我们目前完成了第一项,现在直接跳过第二项!直接创建类。
为什喵,这就是集成开发环境的妙处之一了呀~
25.png

按照箭头走就行qwq~


26.png
org.bukkit.plugin.java.JavaPlugin

这里说一下包名,在java中,包的作用是用来存放类,并且防止冲突的,什喵叫冲突呢,就拿bukkit为例,我编写了一个插件,用我的域名,你编写了一个插件也用我的域名,那么我俩的插件加载到同一个服务端时就(可能)引发冲突,使bukkit
在用到这个插件时无所适从,因为没有指定相关的import代码。
(所以各位行行好不要用我的域名QwQ,万一哪天真碰上了呢qwq)
咱们继续回到包,为了解决这种冲突问题,业内有一条不成文的规矩,在包名前面加上自己的域名反过来,比如我的域名“dayflowers.work”,把他反过来就变成了“work.dayflowers”,就像图片中第一行那样纸。
哎不是说你没有域名就不能写,你可以随便编一个,比如“pig.sheep”,反正编译器不会报错就行~

开始敲代码

好哒在一切都创建好之后,就可以finish啦,会出现如下界面


27.png

可以看见右侧代码框里出现了几行代码,这是IDE(集成开发环境,以下全以此简称)自动为我们添加的,那么就要提到Superclass那行里的东西,学过java都知道有一个父类和子类的概念,子类继承父类的属性。
根据最后一个单词我们可以大体上猜出意思,JavaPlugin,用java写的插件,这是所有bukkit插件的父类,具有访问服务端的权限,并且可以被bukkit加载


28.png

参考dalao的插件(BedWars、ViaVersion):
29.png

30.png

主类均以继承JavaPlugin开始(请不要被代码吓到,人家是大佬qwq)。
因此我们得出结论,bukkit是由继承JavaPlugin的方式来声明一个主类的
既然这样我们效法他们,做出了一个主类

package work.dayflowers;
import org.bukkit.plugin.java.JavaPlugin;
public class main extends JavaPlugin {}

但是这样子的一个插件没有办法被bukkit加载,除了前面所说的plugin.yml这样的信息存储文件,还缺少两个方法用于bukkit初始化和卸载插件,这两个方法是:


31.png

他们的描述是“当这个插件被关闭时调用.”和“启用此插件时调用.”,因此这两个插件被用于加载和卸载,注意这也是唯一两个必不可少的方法,换而言之,一个合格的插件(至少)必须要有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() {}
}
32.png

那么代码部分到这里就暂时告一段落~

插件的身份标识——plugin.yml

那么前面我们说到在Project name一栏里填写的只是工程名字,那么怎样声明插件名称以及其他的一些东西呢。
bukkit为我们提供的一个办法是用yml配置文件,在API帮助文档下有一个这样的表格:


33.png

其中红框内的键为必须(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。


34.png

bukkit会根据包名寻找到你的主类(至于他怎么寻找的我也不知道呀qwq),因此最后一个句点后面的内容必须是一个类,换而言之就是你的包名加上你的主类构成这样的一个键值(不要手贱加上分号,不然会报错qwq)

那么name这个键就很好理解啦,除了不能用中文之外都行,代表你的插件名称,会在服务端读取插件相关信息时显示

version,更简单了,随便写,代表版本号。

前面那张表格里还有非常多的键,用作不同的功能用来宣传插件(说白了就是装b)……qwq,我们这里略过不讲,那张表格位于帮助文档的“org.bukkit.plugin.PluginDescriptionFile”包下。

解释完一通,我们可以把他正式添加进刚才的插件中辣(≧▽≦)/
这里按照图片来就行:

35.png

36.png

然后会出现一个空白页面(如果有一个奇怪的窗口弹出来说一堆奇怪的话,不要管他就行,直接cancel):


37.png

吧刚才的东西复制进去,然后需改main的键值,改成“你的包名.你的主类”,然后保存。
那么这个插件已经可以被服务端读取辣~但是说好的helloworld呢!

helloworld

回到主类,在主类的任意一个方法里有很多很多方法可供调用,其中值得一提的是这个:


38.png

由于这个方法不在bukkit包中,所以我们只要记住它所附带的一个方法:

getLogger().info("helloworld");

info这个方法的作用是向服务端输出一条信息。
那么把他添加进主类的onEnable方法中,最后成型的插件:


39.png

40.png

这些统统做完了以后,我们把他编译输出,跟着红框走:


41.png
42.png
43.png
44.png
45.png

最后可能会有一个窗口弹出来,单击OK就行,finish以后呢会发现输出目录下多了一个jar文件(如果IDE报错的话就看看有没有划红线的语句,跟着上文修改一遍qwq):


46.png

测试

然后我们进入教材,有一个Server文件夹,单击进去,先把服务端开起来run一遍,等加载好以后把他关掉,会出现一大堆文件:


47.png

我们进入plugins文件夹下,吧刚才的jar文件拖进去,再次开启服务器:


48.png

怎么样呐~ 484满满的成就感~

P.S.至于这个服务端在已经包括在教材里了,至于教材在哪儿,我还是再发一遍qwq 链接

学完本节你应该知道

1、最基本的bukkit插件由主类、plugin.yml组成;
2、bukkit插件由继承(extends)的方式声明,并在plugin.yml配置文件的main键里引导;
3、主类必须重写onEnable(),onDisable()方法
4、getLogger().info("");用于向服务端输出一条信息.

练习

再新建一个工程,编写一个可以运行的插件,并在插件被卸载时发送一条信息(P.S. 查看卸载信息可以先把插件在服务端中载入,然后在服务端使用reload命令)

好啦那么本节先到这里
下次我们开始制作有具体功能的插件qwq

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 印象·城市·成都第04期 文/声行漫步 文末有福利、免费听本篇文章音频的方法。 树正沟的栈道修得深幽而隐蔽,倚托山...
    蜜蜂读书阅读 343评论 0 0
  • 想写书评很久了,一直苦于不会,今儿搜罗了网上的方法进行学习整理,准备牛刀小试,希望整理的内容对各位也有帮助。 ...
    金沙阅读 6,269评论 2 34
  • 关于年龄,关于奋斗,在外漂白了多年,经历了婚姻的失败,回到了小县城,想重新开始。 会去看一些书,也会去想着努力工作...
    阅览星辰阅读 219评论 0 0
  • 大学自己一个人吃饭上课去图书馆,真的蛮孤单的,突然想找个人分担孤单的心情,周围人都成群结伴的时候真的就觉得自己很凄...
    婧萱只水眠阅读 167评论 0 1
  • 12月14日下午2点30分,在四川师范大学音乐学院101音乐厅,举行了2018级硕士键盘乐发展史课程考核音...
    绘舞凝岚阅读 240评论 0 1