使用LiteLoaderBDS2.0编写MCBE插件-2

Share

一、指令注册

这是一个几乎每个插件都需要的部分,让我们看看吧~

LiteLoaderBDS2.0的指令系统有特别支持吗?

  1. OOP接口
  2. 也就是圈内所谓的真指令注册
  3. 命令方块可执行
  4. 与BDS原版指令无不同

大概原理:实现一个新命令是继承Command,每次这个命令执行的时候BDS会调用该命令类的execute
在setup中实现命令注册,首先是注册命令说明(就是所谓的假指令)
接下来给这个假指令overload加命令选项枚举之类的东西(变成了所谓的真指令)

1.让我们先从最简单的指令开始吧

首先打开我们的开发模板,如果你不知如何布置开发模板,请看上一篇文章(快捷传送

  • 添加LL封装的指令API
#include <RegCommandAPI.h>
  • 按照下面代码(复制粘贴)写到你的模板中
class HelloWorldCommand : public Command {
public:
    void execute(CommandOrigin const& ori, CommandOutput& output) const override {//执行部分

    }

    static void setup(CommandRegistry* registry) {//注册部分(推荐做法)

    }
};
  • 随后就可以开始注册你的第一个指令了
registry->registerCommand("hellobds","Hello World",CommandPermissionLevel::Any, {(CommandFlagValue)0},{(CommandFlagValue)0x80});

registerCommand参数解析:

  1. 注册的指令
  2. 指令介绍(提示信息)
  3. 使用该指令的权限(ANY为所有玩家,GameMasters为游戏管理员,Console为控制台)
  4. 照填0
  5. 是否作弊启用(0未开启作弊的情况下不可用,0x80为未开启作弊也可用)

  • 接下来为指令添加Overload(指令重载)
registry->registerOverload<HelloWorldCommand>("hellobds");

注意:即使没有参数也需要注册重载!

  • 上半部分完整指令如下
#include "pch.h"
#include <EventAPI.h>//监听API
#include <LoggerAPI.h>//日志API
#include <LLAPI.h>//LLAPI
#include <RegCommandAPI.h>//指令注册API
Logger logger("RegLLComand");//Log名称

class HelloWorldCommand : public Command {
public:
    void execute(CommandOrigin const& ori, CommandOutput& output) const override {//执行部分
        
    }

    static void setup(CommandRegistry* registry) {//注册部分(推荐做法)
        registry->registerCommand("hellobds", "Hello World", CommandPermissionLevel::Any, { (CommandFlagValue)0 }, { (CommandFlagValue)0x80 });
        registry->registerOverload<HelloWorldCommand>("hellobds");
    }
};

void PluginInit()//初始化函数
{
    LL::registerPlugin("PluginName", "Introduction", LL::Version(1, 0, 0));//注册插件
    logger.info("Loaded");
}
  • 然后在execute中添加当执行该指令时,会触发什么。(例如往控制台与游戏内同时输出hello world)详解看下面示例代码注释~
    void execute(CommandOrigin const& ori, CommandOutput& output) const override {//执行部分
        ServerPlayer* player = ori.getPlayer();//通过指令来源,获取玩家指针
        if (player->isPlayer()) {//判断是否是玩家(也可能是控制台,命令方块,NPC执行,因此需要判断)
            player->sendText("Hello World");//向玩家发送一个Text文本在聊天栏
        }
        logger.info("Hello World");//往控制台输出字符串
        return;
    }
  • 这就完了吗?那可大错特错了,你还没真正意义上的注册指令呢
  • 你还需要注册添加一个指令注册的事件,并且执行HelloWorldCommand的setup
void PluginInit()//初始化函数(可自定义函数名)
{
    LL::registerPlugin("PluginName", "Introduction", LL::Version(1, 0, 0));//注册插件
    logger.info("Loaded");
    Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { //注册指令事件
        HelloWorldCommand::setup(ev.mCommandRegistry);
        return true;
        });
}
  • 完整代码如下
#include "pch.h"
#include <EventAPI.h>//监听API
#include <LoggerAPI.h>//日志API
#include <LLAPI.h>//LLAPI
#include <RegCommandAPI.h>
#include <MC/ServerPlayer.hpp>
Logger logger("RegLLComand");//Log名称


class HelloWorldCommand : public Command {
public:
    void execute(CommandOrigin const& ori, CommandOutput& output) const override {//执行部分
        ServerPlayer* player = ori.getPlayer();//通过指令来源,获取玩家指针
        if (player->isPlayer()) {//判断是否是玩家(也可能是控制台,命令方块,NPC执行,因此需要判断)
            player->sendText("Hello World");//向玩家发送一个Text文本在聊天栏
        }
        logger.info("Hello World");//往控制台输出字符串
        return;
    }

    static void setup(CommandRegistry* registry) {//注册部分(推荐做法)
        registry->registerCommand("hellobds", "Hello World", CommandPermissionLevel::Any, { (CommandFlagValue)0 }, { (CommandFlagValue)0x80 });
        registry->registerOverload<HelloWorldCommand>("hellobds");
    }
};

void PluginInit()//初始化函数(可自定义函数名)
{
    LL::registerPlugin("PluginName", "Introduction", LL::Version(1, 0, 0));//注册插件
    logger.info("Loaded");
    Event::RegCmdEvent::subscribe([](Event::RegCmdEvent ev) { //注册指令事件
        HelloWorldCommand::setup(ev.mCommandRegistry);
        return true;
        });
}
  • 现在你可以编译你的插件,进入到游戏实测啦,执行结果如下
游戏内玩家执行/hellobds
控制台

2.注册一个带参数的指令(给自己修改,移除自定义NameTag)

休息ing,明日接着~