Bukkit插件开发-创建一个命令
上一期我们成功加载了插件,但是我们并没有往插件添加任何功能。所以这期的内容是:
Command (命令)是向聊天栏输出一串特定格式的信息激活Minecraft游戏中的拓展功能,我们常看到一些服务器拥有自己专属的命令,那么我们今天就利用插件实现一个全局喊话的插件,这期教程我们会涉及到 if 判断语句和数组,接口以及方法传参的使用。

我们首先创建一个叫做MessageCommand的类,用作我们喊话指令功能的实现

创建好的类差不多是这样的,那么我们就需要在类中添加代码了。

首先我们实现Bukkit给我们提供的命令模块接口API(Application Program Interface-应用程序编程接口),这个类在org.bukkit.command包下,我们利用IDEA的代码补全提高写代码的效率,首先我们在第3行语句花括号后方输出im两个字符

可以看见下方弹出了一个小窗口并且有一个单词,这个就是我们需要的,然后我们按下键盘上一个叫做Tab的按键(一般在你键盘左上方)可以看到单词被补全到代码中,然后我们接着输出Com3个字母,查看弹出来的窗口

然后看到CommandExecuto单词被蓝色高亮后按下TAB补全代码。
如果你发现这个蓝色的高亮栏不在CommandExecutor单词中,你可以使用鼠标滚轮或者键盘上的↑↓两个按键移动这个高亮框。
然后我们看到CommandExecutor被补全到代码中,且IDEA自动帮我们用import语句把CommandExecutor接口导入进来了

然后我们发现IDEA在代码第5行位置报错了,这个时候我们不着急,继续用IDEA提供给我们的快捷键解决这个麻烦,我们紧接着一起按下键盘上的Alt和回车按键,会发现弹出来一个新的窗口,我们发现蓝色高亮已经在“实现方法”项上了,我们直接按下回车

然后在弹出来的窗口中发现蓝色高亮选中了我们要实现的方法,点击确定

然后我们发现代码就完美的解决了错误

注意,第二期部署项目的开发者纠错后可能发现代码会有一点点不同,在第9行的位置上某些单词不是相同的,这个我们不用担心,将commandSender改成sender,将s改成label,将strings改成args即可

然后我们将光标移动到第9行末尾并按下回车,输入以下代码
这里我们发现需要利用TAB补全很多处代码,但是最为主要的是Player和ChatColor还有Bukkit这三个单词,因为我们需要依靠IDEA的补全在上方自动加入import语句将这3个API导入进来,我们才可以正确使用,以下是写好的代码

然后我们挨个讲解每一行代码都是什么意思以及它们有什么作用,首先我们把目光放在第13行代码处
这段代码利用了if语句做为程序的流程控制,意思是" 如果 sender 实例于 Player " 则执行后方花括号内部的代码(14-17行内的代码) 我们发现18行有个右花括号是13行if语句的花括号收尾括号,但是后面还有个else
这个意思代表 “ 否则 调用一个叫Bukkit类中的getLogger方法,并使用通过这个方法返回的实例对象进一步调用其中的warning方法,向其中传入"你不能在控制台使用这个命令"这个字符串值作为该方法的参数 ” 作用在于,如果我们上方这个if语句条件不成立(则代表使用这条命令的不是玩家),则利用Bukkit类向控制台输出一个级别为警告的日志,日志的内容就是我们传入的参数。
然后我们将目光放到代码第14行
这个是为了方便我们后续写代码用的,是将sender直接类型转换成Player (这样我们利用代码补全就方便的多了),然后我们看第15行-17行代码
这里我们调用了Player中的一个叫做isOp的方法,这个方法我们可以判断这个玩家是否具有服务器管理员权限,如果玩家没有权限则调用Player的sendMessage方法,向玩家聊天栏发送一段信息。这个信息我们利用ChatColor去修饰了一下,这样玩家聊天栏接受到的消息就变成了红色。
最后我们把目光放入之前代码第12行中 “String[] args” 这段代码中,这是一个数组形参,这个形参里存储了玩家输出指令中包含的参数,比如玩家A输入了/time set day这段命令,那么这个数组形参就会存入set和day这两个参数。不过这里我们为了防止玩家输入我们的喊话插件时候没有输入任何参数,我们加一段代码作为判断
以上代码我们对args这个数组的长度作了一个判断,如果数组长度为0代表玩家没有输入任何参数,这时候我们直接给玩家返回一个错误消息即可
然后我们在这条if语句中间添加我们的喊话代码
这里我们运用了一个for循环,来不断从Bukit提供的一个叫getOnlinePlayers的方法返回的Collection实例中抽取服务器所有的玩家,并且将每次抽取出来的玩家赋值到player1这个对象中,循环体内我们又运用了ChatColor修饰我们的信息,那么编写好的代码如下。

这样我们喊话命令的功能就实现了,下一步我们需要将这个命令注册进服务端,注册进服务端需要两个步骤。
第一步:服务端需要知道有你这个命令
我们进入plugin.yml文件中,将以下信息写进去(注意一定不要填错,YAML文件对格式有严格要求,如果填错一个位置整个插件就无法被加载了
写入后的plugin.yml如下:

这样我们就注册了一个叫做allmsg的命令,用法是在聊天栏输出 /allmsg 喊话内容 即可进行喊话
第二步:服务端需要知道你这个命令的功能实现在哪里
我们跳转到插件主类部分将以下代码输入进去
以下是输入后的主类代码

这样我们的插件就写完了,然后我们按照上期的教程编译插件,编译好后第一期的开发者将插件放入服务端再启动服务端,第二期的开发者直接点击IDEA右上角绿色小箭头启动服务端。
然后我们看到插件成功启用

接着打开我们的Minecraft,连接我们的插件测试服务器,IP地址是localhost:25565

然后我们测试插件,首先输入/allmsg 你好

显示我们无权使用,证明插件的第15行代码起作用了,我们进入控制台输入op 你的游戏ID 给予我们自己服务器管理员权限后再次输入

成功!如果叫上你的小伙伴来跟你一起测试的话效果会更加明显(他也会收到 “你好” 这条消息),不过记得一定要用内网映射软件,你的服务器才会被其他人连接

作者的话
那么本期的教程就结束了,你成功的给你的插件添加了一个功能,让它变得看起来有那么一丢丢作用了。这何尝不是一个巨大的进步,如果对代码部分还不太熟悉的小伙伴可以去网上寻找一些JAVA教程,了解一下各种代码语句的作用都是什么。下期我们进入更加深层次的教学:事件监听,利用事件监听,你可以得知玩家的一举一动以及服务器的各种变化。