插件开发(4)——命令"/>
我的世界Bukkit插件开发(4)——命令
之所以隔了这么长时间才写这篇文章,是因为这几天有事,加上最近有一个编程问题困扰了我好久,我便放弃了开发插件,想着出于责任,还是把文章写完吧。即使自己写教程,也不敢自称老师,我还是学生,在学习java这条路上,我一直都是学生,有问题一起切磋交流。
目录
命令基础
onCommand()方法
一个判断sender的方法:
使用独立的 CommandExecutor class
判断发出命令的是玩家:
判断玩家输入的自变量个数:
在获取玩家之前先检测他们是否在线:
权限:
配置权限:
命令基础
onCommand()方法
现在你已经知道如何注册一个事件并做出响应,但是如果你只是想要在命令输入之后做出响应呢? 你可以使用onCommand()方法 这个代码的作用是当玩家输入“/”时,监听该操作并执行相关语句"/" . 举个例子来说.输入 "/do something" 将会执行onCommand()方法 此种情况下,因为没有特定的行为被编程,所以并不会发生任何事情。请避免使用和bukkit所提供的指令重名的指令 例如.指令"give"已经被好几个插件使用了, 如果你执行了另外一个"give"指令, 你的插件将会和这些插件冲突。 你必须在插件的"plugin.yml"注册你的指令 否则这个方法将不会被触发。 onCommand()方法必须返回一个布尔值(true或false)。 如果返回值是true,你不会看到什么明显的事情发生。 但如果返回值是false,则会返回你的plugin.yml里的'usage:property'然后发送给命令使用者.当使用
onCommand
方法时, 你需要填写4个参数.CommandSender sender
- 发送命令的对象Command cmd
- 被执行的指令
String commandLabel
- 被执行指令的别名
String[] args
- 该指令的自变量数组。例如.指令 /hello abc def 中, abc 会被存放进args[0]中, def 被存放进args[1]中。
代码示例:
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {// 如果这里注册了多条命令则使用if (command.equalsIgnoreCase("basic")) {// 你要写的代码return true;} //如果以上内容成功执行,则返回true // 这里的return false则是返回指令的usage的信息(如果有)// 如果执行失败,则返回false.return false;
}
和之前一样,上面必须加:
import org.bukkit.command.Command; import org.bukkit.command.CommandSender;
其中equalsIgnoreCase是忽略大小写,除了这里要这这个代码,还要在plugin.yml写入你的指令:
commands:basic:aliases: bdescription: This is a demo command.usage: /<command> [player]permission: <plugin name>.basicpermission-message: You don't have <permission>
basic
- 指令名称- aliases - 指令别名
description
- 指令描述,将会在/help中显示
usage
- 在oncommand方法return false后显示的用法提示。尽量简洁, 使别人能够理解指令是什么以及如何使用它。
permission
- 使用该命令所需的权限节点。
permission-message
- 当玩家使用了这个指令而没有权限时输出的信息。
这样写完之后,当返回true时不会执行任何代码,所以你需要加一些东西来实现你要实现的内容,还要判断这个指令是不是从玩家发出的指令,而不是从控制台发出的指令,那该怎么判断呢?
一个判断sender的方法:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {if (cmd.getName().equalsIgnoreCase("basic")) { //如果玩家输入了/basic则执行如下内容...// 所需要执行的事(此处略)return true;} else if (cmd.getName().equalsIgnoreCase("basic2")) {if (!(sender instanceof Player)) { //如果sender与Player类不匹配sender.sendMessage("这个指令只能让玩家使用。");} else {Player player = (Player) sender;// 所需要执行的事(此处略)}return true;}return false;
}
在这个例子里,指令basic能由任何人发出 - 一个在线的玩家, 或者服务器后台的op 但是指令basic2只能由一个在线的玩家发出。
警告: 字符串的比较, 请不要使用==
, 因为其比对的是内存地址, 可能造成一些没有预料到的结果! 建议使用equals
方法, 例如args[0].equals(string)
instanceof就是判断一个类型是不是另一个类型,这样我们就实现了判断sender是不是player这个操作。
使用独立的 CommandExecutor class
以上的方法必须把代码放到主类里,如果命令一多,就需要单独新建一个类,这时候就要使用独立的CommandExecutor类,这个类 必须 实现Bukkit 的CommandExecutor接口,同时主类要在onEnable()里加一串代码:
this.getCommand("basic").setExecutor(new MyPluginCommandExecutor(this));
如果你没有在plugins.yml注册过指令的话,此处会抛出空指针异常!
MyPluginCommandExecutor.java(独立CommandExecutor类):
public class MyPluginCommandExecutor implements CommandExecutor {private final MyPlugin plugin;public MyPluginCommandExecutor(MyPlugin plugin) {this.plugin = plugin; // 在你需要的情况下,存储插件}@Overridepublic boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {// 和以前一样执行就好…}
}
PS:如果你的插件含有多个指令的话, 你需要为每一个指令单独设立一个commandexecutor.
以下用代码给大家做个示例:
判断发出命令的是玩家:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {if (sender instanceof Player) {Player player = (Player) sender;// do something} else {sender.sendMessage("You must be a player!");return false;}// do somethingreturn false;
}
判断玩家输入的自变量个数:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {if (args.length > 4) {sender.sendMessage("Too many arguments!");return false;} if (args.length < 2) {sender.sendMessage("Not enough arguments!");return false;}
}
在获取玩家之前先检测他们是否在线:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {Player target = (Bukkit.getServer().getPlayer(args[0]));if (target == null) {sender.sendMessage(args[0] + " is not online!");return false;}return false;
}
权限:
利用新的Bukkit API来设置权限是再容易不过的事情. 检测玩家是否拥有权限,可以使用以下代码:
if (player.hasPermission("some.pointless.permission")) {//执行此段代码(有权限)
} else {//执行此段代码(无权限)
}
你也可以检测一个权限节点是否被定义过,(等效于 Java 语言中的null),使用下面的方法:
boolean isPermissionSet(String name)
配置权限:
permissions:man.*:description: Gives access to all doorman commands //给予使用man所有命令的权限children: //子权限节点man.kick: trueman.ban: trueman.knock: trueman.denied: falseman.kick:description: Allows you to kick a user //允许你踢出一名用户default: op //OP默认拥有该权限man.ban:description: Allows you to ban a user //允许你封禁一名用户default: op //OP默认拥有该权限man.knock:description: Knocks on the door! //敲门default: true //全员默认拥有该权限man.denied:description: Prevents this user from entering the door //禁止拥有该权限节点的用户进入门内
值得注意的是,你的插件使用的每个权限都被定义为 permissions 这个节点的子权限节点. 每个权限都能够拥有一个描述,默认值以及子权限节点。
默认值:
当一个权限没有明确是否为玩家所拥有 ,hasPermission 将返回false. 在你的plugin.yml 你可以设置default的值来改变默认权限
- true - 全员默认拥有该权限.
- false - 全员默认没有该权限.
- op - 如果玩家是一名OP[3],那么他将拥有该权限.
- not op - 如果玩家不是一名OP,那么他将拥有该权限.
在这之前你可能已经习惯了通过权限节点自动分配所有的子权限。 现在这种方法已经随着bukkit API的更新而改变,现在你可以自己定义子权限了. 这将使得插件具有更多的灵活性. 下面是一个例子:
permissions:test*:description: Gives access to all doorman commands //翻译见上children:test.kick: truetest.ban: truetest.knock: truetest.denied: false
在这里,test.* 权限拥有几个子权限并分配在其下。子权限工作的方式就是当test.* 权限节点被设置为true时,子权限也会随之设置为 plugin.yml中的默认值. 然而当test.* 被设置为false时,所有子权限都会设置为与默认值相反的值(true->false,false->true)
好了,本篇文章就写完了,下一章我们开始研究item,也就是玩家的物品
更多推荐
我的世界Bukkit插件开发(4)——命令
发布评论