我的世界Bukkit插件开发(4)——命令

编程入门 行业动态 更新时间:2024-10-12 05:44:19

我的世界Bukkit<a href=https://www.elefans.com/category/jswz/34/1771202.html style=插件开发(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)——命令

本文发布于:2023-06-22 02:25:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/826375.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:插件   命令   世界   Bukkit

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!