命令与权限 - Nukkit插件从0开始

请认准本教程目录篇永久链接:http://www.cnblogs.com/xtypr/p/nukkit_plugin_start_from_0.html ,未经作者许可转载本系列文章任何内容的,视为已向作者支付50元人民币稿酬。作者支付宝账号:237356812@qq.com。

系列作者:粉鞋大妈 文章出处:http://www.cnblogs.com/xtypr 欢迎转载、翻译、收录,也请保留这段声明,不胜感激。

Nukkit插件从0开始:命令与权限

上一篇:Hello World! 目录:Nukkit插件从0开始 下一篇:事件与监听器

 

我们已经能够制作第一个插件了,然而要给插件添加功能,我们需要了解和使用命令。我们从这里开始:

 

初识用户组与权限组


用户组与权限

在Nukkit中,每个命令都需要有相应权限的人员使用;另外,有一些动作我们需要对相应的用户做出反应,比如接收广播消息需要不是op。要创建一个新命令,必须规定属于哪个权限组的用户可以使用。我们在cn.nukkit.permission.Permission中发现了这样的代码:

package cn.nukkit.permission;

/* 此处省略若干行 */

/**
 * author: MagicDroidX
 * Nukkit Project
 */
public class Permission {

    public final static String DEFAULT_OP = "op";
    public final static String DEFAULT_NOT_OP = "notop";
    public final static String DEFAULT_TRUE = "true";
    public final static String DEFAULT_FALSE = "false";

    public static String DEFAULT_PERMISSION = DEFAULT_OP;

    public static String getByName(String value) {
        switch (value.toLowerCase()) {
            case "op":
            case "isop":
            case "operator":
            case "isoperator":
            case "admin":
            case "isadmin":
                return DEFAULT_OP;

            case "!op":
            case "notop":
            case "!operator":
            case "notoperator":
            case "!admin":
            case "notadmin":
                return DEFAULT_NOT_OP;

            case "true":
                return DEFAULT_TRUE;

            default:
                return DEFAULT_FALSE;
        }
    }

/* 此处省略若干行 */

}
View Code

分析以上代码我们发现,Nukkit默认的用户组有几种:

  • op,代表服务器管理员,在ops.txt中规定。
  • notop,代表除服务器管理员外的所有玩家。
  • true,代表所有玩家。
  • false,代表空集。如果某个命令对应这个权限,那就没有人能够使用这个命令(控制台除外)。

知道了用户组之后,就可以在规定权限组时设置它对应的权限组。Nukkit的权限组一般满足这样的格式:

插件/模块名.动作名.动作分类名

所以以下的权限组都是满足这个格式的:

  • nukkit.command.stop
  • nukkit.command.ban.player
  • nukkit.broadcast.user
  • helloworldplugin.command.helloworld

Nukkit建议使用以上的格式来规定权限组的名字,这能方便区分不同插件的权限和不同功能的权限。

关于Permission类和权限系统的详细讲解,可以参考本插件教程的番外篇。

添加权限组到插件

打开plugin.yml,找到yaml文档中permissions字段(如果没有,添加之),在下面添加权限组。添加权限组的方法是在permissions对应的散列下添加一个和权限组名字同名的键,在这个键对应的散列下添加default字段和description字段,在default后面添加权限组包含的用户组,description后面填对这个权限组的一些描述。

permissions:
  bgmcraft.play:
    description: 能在地图内播放bgm的权限
    default: op
bgmcraft.hear:
description: 能听到bgm的权限
default: true

我们来添加一个helloworldplugin.command.helloworld权限组,并设置它包含的用户组为true(所有玩家)。修改好后我们的yaml文档应该类似于这样:

name: HelloWorldPlugin
main: com.cnblogs.xtypr.helloworldplugin.HelloWorldPlugin
version: "1.0.0"
api: ["1.0.0"]

#此处省略若干行

permissions:
  helloworldplugin.command.helloworld:
    description: 允许用户使用helloworld指令
    default: true

添加了权限组后,我们可以在插件中添加命令了。

 版,权,声,明,,本文,章欢迎转,载 收,录 翻,译 请认,准本教,程目,录,篇永,久,链,接 http://www.cnblogs.com/xtypr/p/nukkit_plugin_start_from_0.html 除该链,接以外刊,登此文,章的链,接均不,是作,者所撰,写 不,能保,证内,容的最,新性和可,靠性 特,此,声,明 本,段是为,防恶,意网,站爬,虫的抄,袭或复,制粘,贴式抄,袭而特,意撰,写 搬,运者和翻,译者可,以不把这,段搬,运或翻,译 

初识命令系统


Nukkit命令系统是以发送一行命令来运行规定好的代码段的系统。一般情况下Nukkit命令直接由命令的名字组成,比如stop;如果有参数,需要再加上空格再加上以空格分割的参数,比如time set sunrise。Nukkit命令可以在控制台直接输入然后回车来运行;在Minecraft PE中运行的时候需要在聊天框输入斜杠加命令,比如/gamemode c

了解基本的内容后,你可以尝试制作第一个命令了。我们从这里开始:

通过重写方法来添加命令

在Nukkit插件中添加命令,我们需要重写替换的方法来实现命令系统。我们在PluginBase类中发现了这些代码:

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        return false;
    }

然后在PluginCommand类发现了下面的代码:

package cn.nukkit.command;
/* 此处省略若干行 */

/**
 * author: MagicDroidX
 * Nukkit Project
 */
public class PluginCommand<T extends Plugin> extends Command implements PluginIdentifiableCommand {
/* 此处省略若干行 */
    @Override
    public boolean execute(CommandSender sender, String commandLabel, String[] args) {
        if (!this.owningPlugin.isEnabled()) {
            return false;
        }

        if (!this.testPermission(sender)) {
            return false;
        }

        boolean success = this.executor.onCommand(sender, this, commandLabel, args);

        if (!success && !this.usageMessage.equals("")) {
            sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
        }

        return success;
    }
/* 此处省略若干行 */
}
View Code

我们发现,Nukkit在读取插件的时候,会加载所有插件的命令为一系列PluginCommand类;在控制台或者玩家聊天栏输入命令的时候,会调用相应插件的onCommand方法,并判断返回值:如果是true说明命令使用成功,false说明使用失败。所以我们编写命令的时候,应该重写onCommand方法。所以主类的代码应该会变成这样子:

package com.cnblogs.xtypr.helloworldplugin;

import cn.nukkit.command.Command;
import cn.nukkit.command.CommandSender;
import cn.nukkit.plugin.PluginBase;

public class HelloWorldPlugin extends PluginBase{
    @Override
    public void onLoad() {
        getLogger().info("Hello Nukkit,I've loaded!");
    }

    @Override
    public void onEnable() {
        getLogger().info("Hello Nukkit,I've enabled!");
    }

    @Override
    public void onDisable() {
        getLogger().info("Hello Nukkit,I've disabled!");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        return false;
    }
}
View Code

我们发现onCommand函数有一些参数。

  • sender,CommandSender类。通过这个类,可以获得命令使用者的相关信息,包括获取使用者有无相应权限(使用Permissible接口的方法)。
  • command,Command类。通过这个类可以关于命令的一些信息。
  • label,String类,表示这个命令的名字。
  • args,String[],表示这个命令的参数列表。

在这里,我们可以检测相应的命令名字和参数列表,来实现相应的操作。

我们需要先给自己的命令取一个名字。命令的名字应该简短容易记,让使用者更方便的操作命令。除非是有意的重写nukkit自带的命令,不要使用nukkit已经保留的命令;同理,不要使用别的插件已经使用的命令。不要占用过多的命令,最好是一个插件占用一个有插件名字特点的命令,然后通过后面的参数来实现对应的操作。

我们取好了命令名字,现在我们需要在插件中重写这个方法,来实现这个命令。如果我们要实现在使用helloworld命令时,给命令使用者发送“Hello World!”信息,代码的onCommand部分会变成这样:

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        switch(command.getName()){
            case "helloworld":
                sender.sendMessage("Hello World!");
                return true;
            default:
                return false;
        }
    }

这里我们使用了switch来判断命令是否是“helloworld”,如果是,那就给使用者发送相应的信息。

我们在插件中实现了这个命令,但是我们还需要在plugin.yml添加命令来保证Nukkit能正常识别。

在plugin.yml中添加命令

打开plugin.yml,在commands字段添加一个字段,字段名是刚才添加的命令名字。在这个添加的字段对应的散列中添加description,usage,permission三个字段。

  • description,字符串,表示这个命令的一些说明。在 help 和 help 命令名字 指令中,description会作为指令的说明来显示。
  • usage,字符串,表示这个命令的使用方法。在 help 命令名字 指令中,会作为使用方法来显示。在使用指令调用onCommand返回false时,Nukkit会给命令使用者显示这个命令的usage。

    > help    
    14:16:24 [INFO] --- 显示帮助手册总 * 页中的第 * 页 (/help <页码>) ---  
    14:16:24 [INFO] /helloworld: helloworld指令  

    > help helloworld    
    14:16:29 [INFO] --------- Help: /helloworld ---------  
    14:16:29 [INFO] Description: helloworld指令  
    14:16:29 [INFO] Usage: /helloworld  

  • permission,字符串,表示能使用这个指令的权限组。这里可以填之前设定好的权限组,来表示这个指令只有这个权限组可以使用。

关于此处plugin.yml的设置的一些好玩的东西,可以参阅教程番外篇的plugin.yml部分。

使用ctrl+s保存。设置了字段之后,我们的plugin.yml类似于这样:

name: HelloWorldPlugin
main: com.cnblogs.xtypr.helloworldplugin.HelloWorldPlugin
version: "1.0.0"
api: ["1.0.0"]

#此处省略若干行
permissions: helloworldplugin.command.helloworld: description: 允许用户使用helloworld指令 default: true commands: helloworld: description: helloworld指令 usage: "/helloworld" permission: helloworldplugin.command.helloworld

点击“Build”->“Make Project”来编译。编译后运行Nukkit来调试,在控制台输入helloworld,我们可以看到控制台输出了结果:

> helloworld  
14:24:06 [INFO] Hello World!  

这说明我们已经成功的给插件添加了命令。我们现在可以使用命令来完成一些操作了。

 

这个例子中我们只添加了一个功能简单的命令,你可以发挥你的想象力玩出更多的功能。如果想知道如何玩出聊天框输入@#¥%&等开头字符时完成一些操作的“命令”,可以参阅下一章教程的聊天监听器部分。

有些情况下,我们还需要在点击方块或者其它事情发生的时候完成一些操作,这时候你需要事件与监听器。

上一篇:Hello World! 目录:Nukkit插件从0开始 下一篇:事件与监听器
posted @ 2015-10-03 11:56  粉鞋大妈  阅读(4918)  评论(0编辑  收藏  举报