狡诈师
本帖最后由 狡诈师 于 2021-2-8 21:46 编辑





                              [ ! ] 阅读本文需要具备
                                         -  Kotlin / Java 编程语言
                                         -  熟悉Bukkit开发
                                         -  搭起TabooLib为基础的项目

                              [ ! ] 相关链接
                                         -  [前置][开源][PCD]TabooLib ——  老坏黑的祖传病毒 [1.8-1.16]
                                         -  从Kotlin到Java,从TabooLib到Bukkit —— ①TabooLib的插件主类代码结构
                                         -  TabooLib Doc

                              [ ! ] 本文采用
                                         -  编程语言:Kotlin
                                         -  内置依赖:TabooLib




基于TabooLib轻松写Minecraft Bukkit命令系统,TabooLib提供的一些命令判断、命令帮助能够减少命令的繁琐开发,节省开发时间,而且支持Tab命令补全更重要的是不需要在 plugin.yml 写什么命令了(想当年老是忘记在这里写,亦或者写错)




创建一个类 Command (命名没有强制规范,其它命名可以,当然要注意编程规范)看一下 TabooLib Doc 的 BaseCommand 类:https://tabooproject.org/doc/io/ ... ackage-summary.html

BaseMainCommand  主命令接口,这是我们需要的,于是implements

这是 Kotlin 写法
  1. class Command : BaseMainCommand() {
  2. }
复制代码




回到 TabooLib DocBaseCommand
在下面于是看到 注释类型 BaseCommand ,点击看看,于是有这些东西


比如这样写
  1. @BaseCommand(name = "iPlugin", permission = "iPlugin.view")
  2. class Command : BaseMainCommand() {
  3. }
复制代码




创建一个类 IntoCommand
TabooLib Doc 有关于子命令接口的类 BaseSubCommand ,要做什么懂了吧

  1. class IntoCommand : BaseSubCommand() {
  2. }
复制代码




TabooLib Doc 中 对子命令注解的类,即 SubCommand
看到可以做到这些命令判断,节省开发时间


回到所写的 Command 类写一个变量
  1. val into : BaseSubCommand = IntoCommand()
复制代码
变量名为 info 的话,命令输入于是这样:/iPlugin info当然忽略大小写的)我们声明这个变量类型为 BaseSubCommand
赋值 IntoCommand() (忘了这是什么来着的请重阅本文)

如果希望权限是 iPlugin.cmd.info
那么可以这样
  1. @SubCommand(permission = "iPlugin.cmd.info")
  2. val into : BaseSubCommand = IntoCommand()
复制代码

如果希望控制命令执行者类型那么我们看一下 TabooLib DocCommandType


所以,别傻傻的在子命令写执行者类型判断 (初碰TabooLib的我曾跳过的坑)
  1. @SubCommand(permission = "iPlugin.cmd.info", type = CommandType.PLAYER)
  2. val into : BaseSubCommand = IntoCommand()
复制代码
于是这个命令要求 执行者类型 为玩家
那么其它我就不一一列出了




提示:这里不需要像Bukkit那样写 return false / return true ,为什么?那请带着疑问继续阅读吧

现在我们为子命令 IntoCommand 覆写 onCommand
  1. override fun onCommand(sender: CommandSender, command: Command, label : String, args: Array<out String>) {
  2.             // 做你想做的
  3.             return
  4. }
复制代码

可能有人问 onCommand 在哪
BaseMainCommand / BaseSubCommand





所以没那么难,甚至轻松多了
我猜有人说:哥们,不是高级应用篇吗?怎么就这么基础东西?



高级应用:命令联动语言文本-命令描述

可能有初学者认为:不就是这样吗:@SubCommand(description = TLocale.asString("COMMAND_DESCRIPTION.INFO"))

那么恭喜你获得报错一枚

那有办法吗?
办法是有的——覆写 description 方法
  1.     override fun getDescription(): String {
  2.         return TLocale.asString("COMMAND_DESCRIPTION.INFO")
  3.     }
复制代码

注释
TLocale.asString("COMMAND_DESCRIPTION.INFO")获取语言文本中
  1. COMMAND_DESCRIPTION
  2.   INFO:
  3.     - "这是第一行"
  4.     - "&f支持颜色的"
复制代码

于是重写了 description 方法,还挺轻松的



高级应用:命令联动语言文本-命令参数

和上面一样,覆写 arguments 方法
  1. override fun getArguments() = arrayOf(
  2.         Argument(TLocale.asString("COMMAND_DESCRIPTION.VAR.INFO"), true)
  3.     )
复制代码
值得一提,类 Argument 参数分别是(参数名,是否必填)


EDIT :) 我好像忘记漏教什么,忘了忘了,就这样吧,本文完





来自群组: Server CT

Glom_
教程不错 加油