跳转至

命令指南

LeviLamina提供了一套易用的命令注册系统,分为编译期和运行时,本指南仅介绍编译期命令注册系统。如果你想要实现自己的脚本引擎,运行时命令注册对你可能有用,在本指南加入运行时命令注册的部分之前,你可以参考LegacyScriptEngine的实现 或是LeviLamina中的CommandTest 。此外,LegacyScriptEngine是一个从LiteLoaderBDS v1就存在的脚本引擎,其中的很多做法已经过时。

使用方法

  1. 引用必要的头文件
    C++
    1
    2
    #include "ll/api/command/CommandHandle.h"
    #include "ll/api/command/CommandRegistrar.h"
    
  2. 调用CommandRegistrar::getInstance().getOrCreateCommand方法获取或创建一个命令,并将其赋值为auto& command
  3. 调用command.overload重载命令,如果你不需要一个可以传入参数的命令,可以不传入模板参数,比如: command.overload()
  4. 调用required方法来添加一个必须的参数,该方法和optional方法需要传入对应结构中的变量名称。调用optional 方法来添加一个可选参数,但需要注意判断用户是否传入了参数。调用 text来添加一个子命令。其它方法可以参考ll/api/command/Overload.h和Intellisense。
  5. 调用execute传入命令的回调函数,回调函数的参数可以参考下列示例

示例

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include "ll/api/command/CommandHandle.h"
#include "ll/api/command/CommandRegistrar.h"

struct NewCommand {
    enum class NewEnum { a = 0, b = 1, c = 2 } enum1;
    std::string str;
    int         number = 1;
};

void registerCommand() {
    using namespace ll::command;
    auto& command = CommandRegistrar::getInstance().getOrCreateCommand("new", "A example command");
    command.overload<NewCommand>().text("test").required("enum1").required("str").optional("number").execute(
        [](CommandOrigin const& origin, CommandOutput& output, NewCommand const& param) {
            output.success("test! {} {} {}", param.enum1, param.str, param.number);
        }
    );
}

在此示例中,我们定义了一个名为NewCommand的结构,其中存储了命令的各项参数。通过getOrCreateCommand 方法创建了一个名为new的命令,通过overload方法重载了名为text的子命令、枚举、字符串和整数参数。在游戏中的效果如下:

Text Only
1
/new test <enum1> <str> [number]