命令指南
LeviLamina提供了一套易用的命令註冊系統,分為編譯期和運行時,本指南僅介紹編譯期命令註冊系統。如果你想要實現自己的腳本引擎,運行時命令註冊對你可能有用,在本指南加入運行時命令註冊的部分之前,你可以參考LegacyScriptEngine的實現 或是LeviLamina中的CommandTest 。此外,LegacyScriptEngine是一個從LiteLoaderBDS v1就存在的腳本引擎,其中的很多做法已經過時。
使用方法
- 引用必要的頭文件
C++
#include "ll/api/command/CommandHandle.h" #include "ll/api/command/CommandRegistrar.h" - 調用
CommandRegistrar::getInstance(false).getOrCreateCommand方法獲取或創建一個命令,並將其賦值為auto& command。getInstance的參數表示是否為客戶端命令(傳入false註冊服務端命令);也可以使用簡寫getServerInstance()和getClientInstance() - 調用
command.overload重載命令,如果你不需要一個可以傳入參數的命令,可以不傳入模板參數,比如:command.overload() - 調用
required方法來添加一個必須的參數,該方法和optional方法需要傳入對應結構中的變量名稱。調用optional方法來添加一個可選參數,但需要注意判斷用戶是否傳入了參數。調用text來添加一個子命令。其它方法可以參考ll/api/command/Overload.h和Intellisense。 - 調用
execute傳入命令的回調函數,回調函數的參數可以參考下列示例
示例
C++
#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(false).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方法重載了名為test的子命令(通過text("test")添加)、枚舉、字符串和整數參數。在遊戲中的效果如下:
Text Only
/new test <enum1> <str> [number]