命令与权限 - 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; } } /* 此处省略若干行 */ }
分析以上代码我们发现,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; } /* 此处省略若干行 */ }
我们发现,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; } }
我们发现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开始 | 下一篇:事件与监听器 |