Bukkit插件制作02-命令执行器与权限
- 2016-04-11 11:52:14
- 幻音い
- 7722
温馨提示: 这篇文章于3147天前编写,现在可能不再适用或落后.
在上一章的内容中说明了插件的基本编写方法,既然是Minecraft插件那么基本都会用到命令。
比如 /op balrogs_xt /ban balrogs_xt 等等。
Bukkit提供了一个特定的方法用于命令,就是onCommand()方法,返回值为布尔值(boolean)。
在上一张的Test.java类中添加onCommand方法并添加@Override复写
命令执行器
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
//你的代码
return false;//return false将会把plugin.yml里面提示玩家的信息输出来发送给玩家
}
onCommand有4个参数。
sender是发送者,也就是谁发送的这条命令,一般有两人,1是控制台,2是玩家。
cmd是执行的命令
label是被执行命令的别名
args是命令参数,这里的参数指的是 /op balrogs_xt 这句命令op是命令 balrogs_xt就是参数,参数从0开始的,获取这个balrogs_xt的话就是 args[0]。
然后设置默认返回false
比如说玩家执行了 /op barogs_xt 这个命令,并且该命令存在,那么就返回true,如果不写return true; 该命令除了执行命令后还会输出一个默认的命令使用方法,这个默认命令使用方法是在plugin.yml里面设置的。
执行命令
执行命令的话,一般在游戏中都不区分大小写的,所以可以使用equalsIgnoreCase进行判断,忽略大小写。
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(label.equalsIgnoreCase("test")){
//你的代码
}
return false;
}
判断是谁执行的
执行刚才说了一般分为两人,控制台与玩家。
控制台和玩家的类不是同一个,所以如果不去判断,是会导致异常的。所以你必须确保这个命令是否对玩家进行了操作。可以使用instanceof进行判断,如果是玩家的话,然后在安全的强制转换为玩家类(Player)
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(label.equalsIgnoreCase("test")){
if(sender instanceof Player){
Player player = (Player)sender;
//玩家执行的命令
}else{
//控制台执行的命令
}
}
return false;
}
参数过多
以上代码执行完毕后,就可以正常的触发命令了,但是如果你大意的写了更多的参数,但是并不存在怎么办?我们也可以判断参数的数量来阻止代码的执行。
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(label.equalsIgnoreCase("test")){
if(sender instanceof Player){
Player player = (Player)sender;
//玩家执行的命令
if(args.length==0){//用.length获取参数大小来判断参数数量
//没有任何参数的时候执行 例如 /op
}else if(args.length==1){
//当存在一个参数的时候执行 例如 /op balrogs_xt
}
}else{
//控制台执行的命令
}
}
return false;
}
执行各种命令
这里我们判断玩家输入/test 与 /test helloworld 输出各自的信息。
可以使用 player.sendMessage("信息");来输出,该命令只有玩家自己能够看到。player是刚才从执行者强制转换的对象。
如果需要颜色代码的话可以使用ChatColor.GREEN来实现或者使用§a 来实现§ = 按下alt+0167
player.sendMessage(ChatColor.GREEN+"信息");
player.sendMessage("§a信息");
同样使用判断第一个参数与命令相同,使用args[0]来获取第一个参数。
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(label.equalsIgnoreCase("test")){
if(sender instanceof Player){
Player player = (Player)sender;
//玩家执行的命令
if(args.length==0){
//没有任何参数的时候执行 例如 /op
player.sendMessage("你执行了Test命令");
}else if(args.length==1){
if(args[0].equalsIgnoreCase("HelloWorld")){//不区分大小写
player.sendMessage("你执行了HelloWorld命令");
}
//当存在一个参数的时候执行 例如 /op balrogs_xt
}
}else{
//控制台执行的命令
}
}
return false;
}
注册命令
代码写完还不行,必须到plugin.yml文件中去注册这个命令
打开plugin.yml
name: Test
main: com.acgxt.test.Test
version: 1.0
commands:
test:
description: Test命令
usage: /test 输出
permission: test.test
permission-message: 您的权限不足无法使用
commands下的test为注册的命令
description为命令描述
usage为命令输入错误后会提示用户这条信息
permission为权限节点
permission-message为玩家没有权限的时候提示用户的信息
这样一个test命令就注册完毕了。
权限
权限一般用于区分普通玩家与管理员这种。比如管理员可以飞行,玩家不可以飞行就必须用到权限。
权限同样在plugin.yml文件中进行注册.
name: Test
main: com.acgxt.test.Test
version: 1.0
commands:
test:
description: Test命令
usage: /test 输出
permission: test.test
permission-message: 您的权限不足无法使用
permissions:
test.test:
description: 一个默认的权限
default: true
test.helloworld:
description: 输出HelloWorld
default: op
permissions为权限配置,注意这里最后后面是有一个s,别忘了,不然权限无效
test.test为一个权限。description描述,default是默认权限,一般分为
true 所有玩家都可以使用
false 所有玩家都不可以使用
op 只有op才能使用
not op 除了op都可以使用
有了权限还必须判断玩家是否有这个权限,因为这个是自己设置的。
if(player.hasPermission("test.helloworld")){
//玩家有权限
}else{
//玩家没有权限
}
最后的代码:
package com.acgxt.test;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public class Test extends JavaPlugin{
@Override
public void onEnable(){
getLogger().info("插件已加载完毕");
}
@Override
public void onDisable(){
getLogger().info("插件已卸载");
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(label.equalsIgnoreCase("test")){
if(sender instanceof Player){
Player player = (Player)sender;
//玩家执行的命令
if(args.length==0){
//没有任何参数的时候执行 例如 /op
player.sendMessage("§a你执行了Test命令");
return true;
}else if(args.length==1){
if(player.hasPermission("test.hellworld")){
if(args[0].equalsIgnoreCase("HelloWorld")){
player.sendMessage("§a你执行了HelloWorld命令");
}
}else{
player.sendMessage("§e你没有权限执行这个命令");
}
return true;
//当存在一个参数的时候执行 例如 /op balrogs_xt
}
}else{
//控制台执行的命令
sender.sendMessage("§c控制台不允许执行该命令");
return true;
}
}
return false;
}
}
执行/test 普通玩家就是有权限的 而执行/test helloworld 是没权限的,设置为op 后就有权限了,或者给玩家添加test.helloworld权限节点同样能够使用,而控制台则无法使用命令
文件下载
请勿直接转载该文章
阁下需要登录后才可以查看评论哦~