七空幻音LOGO

七空幻音

Bukkit插件开发--使用命令映射来添加指令2020-02-20 22:04:18

众所周知,添加自定义指令的方式一共有三种

其一:利用plugin.yml(最常用)

其二:通过事件监听

其三:命令映射

现在许多Bukkit开发教程都只教学了如何利用plugin.yml来添加你自己的指令

而使用事件监听来添加指令在你理解了事件监听器的原理之后也很容易理解

但是命令映射教程比较少


plugin.yml使用起来最方便,但是指令名称不可变化

事件监听可以自由监听任何指令,但是无法以此显示指令的信息

命令映射则没有这些弊端,你甚至可以在游戏内注册指令


下图为图形化Bukkit插件编程网站PVPIN中命令映射的操作

2020022019423789402












需要注意的是,PVPIN使用了大量自己编写的方法

因此这行代码已经没用了


NukkitAPI中,你可以直接这样

getServer().getCommandMap()

但是BukkitAPI并没有直接开放获取服务器CommandMap的方法

因此必须利用反射


那么命令映射就需要一些其他相关操作


首先创建一个指令以及其对应的处理器

Constructorc;
       PluginCommand cmd;
       //声明Constructor和指令cmd
       try {
           c = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
           //强行获取类中的字段,包括非public字段
           Demo plugin = this;
           //主类的实例,Demo是插件的名字,如何获取主类实例不作讲解
           c.setAccessible(true);
           String name = "demo";
           //指令名,这里是/demo
           String description = "这是一个演示命令";
           //指令介绍
           String usageMessage = "输入/demo";
           //指令用法
           Listaliases = new ArrayList();
           aliases.add("demonstration");
           //指令别名(列表)
           cmd = c.newInstance(name, plugin);
           /* 运用集合的构造方法
            * 构造器并没有写明需要多少个Object
            * PluginCommand cmd = c.newInstance(new Object[]{name, plugin});
            * initialize
            */
           cmd.setAliases(aliases);
           //设置别名
           cmd.setDescription(description);
           //设置介绍
           cmd.setUsage(usageMessage);
           //设置用法
           cmd.setPermission(null);
           //设置权限,权限不作讲解
           cmd.setTabCompleter(null);
           //设置tab补全的处理器(这个和使用plugin.yml添加指令一样,不作讲解)
           cmd.setExecutor(null);
           //设置命令的处理类(这个和使用plugin.yml添加指令一样,不作讲解)
       } catch (Exception e) {
           e.printStackTrace();
       }

然后再注册指令

try {
           Field f = SimplePluginManager.class.getDeclaredField("commandMap");
           //强行获取类中的全部字段,包括非public字段
           //org.bukkit.plugin.SimplePluginManager
           f.setAccessible(true);
           CommandMap map = (CommandMap) f.get(this.getServer().getPluginManager());
           //利用映射获取CommandMap
           map.register(name, cmd);
           //注册指令
       } catch (Exception e) {
           e.printStackTrace();
       }


附上相关操作的网址供参考

CommandMap:https://bukkit.windit.net/javadoc/org/bukkit/command/CommandMap.html

获取主类的实例https://www.spigotmc.org/threads/for-the-people-wondering-how-to-access-their-main-class-from-a-different-class.358942/

PluginCommand:https://bukkit.windit.net/javadoc/org/bukkit/command/PluginCommand.html


最后,欢迎来Bukkit插件开发交流群讨论插件开发的相关问题。

QQ群号:942025944




2条评论登录后可见

详细图片
载入中...