温馨提示: 这篇文章于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权限节点同样能够使用,而控制台则无法使用命令

文件下载

【七空幻音】Bukkit命令执行器与权限

请勿直接转载该文章

    阁下需要登录后才可以查看评论哦~

    随便看看

      载入中...

      正在准备穿越次元,阁下请稍等片刻~