在上一章的内容中说明了插件的基本编写方法,既然是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权限节点同样能够使用,而控制台则无法使用命令
文件下载
请勿直接转载该文章
1条评论登录后可见