valiant-bedrock/libcommand

用于注册具有适当重载的命令的PocketMine-MP库

0.6.0 2022-07-22 06:44 UTC

This package is auto-updated.

Last update: 2024-09-16 06:13:20 UTC


README

这是一个小型PocketMine-MP命令库,旨在简化命令创建过程,同时增强用户体验。

注意:此库仍在开发中,因此API可能有所更改。

安装

Composer

以下命令可用于使用Composer安装库:

composer require valiant-bedrock/libcommand

Virion (Poggit)

可以通过Poggit使用此链接访问Virion支持。

用法

参数

库的基础是参数。在大多数情况下,参数类接受两个属性

  • name - 参数的名称。这在命令的onExecute()方法中以及发送到客户端时使用。
  • optional - 参数是否可选。如果参数是可选的,则它将不会在重载中要求。在发送到客户端时,如果非可选,将显示为<name>,否则将显示为[name]

一个简单的纯文本参数看起来是这样的

$parameter = new \libcommand\parameter\types\RawTextParameter(name: "text", optional: true);

参数类型

这是一个所有当前参数类型的列表

标准

自定义

重载

在命令的术语中,重载是命令可以接受的参数集。重载由Parameter对象的数组定义。下面是一个简单的重载类的示例

$overload = new libcommand\Overload(
    // An internal name used to track the overload
    name: "test",
    // A list of parameters
    parameters: []
);

命令

最后,为了将这些特性结合起来,它使用Command类。此类旨在扩展以创建新命令。该类扩展了\pocketmine\command\Command并接受一个额外的参数$overloads,它是一个Overload对象的数组,尽管您可以使用addOverload(Overload $overload): voidaddOverloads(Overload ...$overloads)方法分别从构造函数中添加它们。

onExecute(CommandSender $sender, string $overload, array $arguments): bool|string

此方法是命令的核心,运行命令的实际逻辑。命令将查找兼容的重载,然后将其传递给$arguments。通过$arguments,您可以通过其名称访问参数值(例如,new StringParameter("name")将通过$arguments["name"]访问)。如果此方法的返回类型为string,则返回值将发送给命令发送者。

命令发送者访问

为了限制对命令的访问,您可以使用ConsoleCommand类或PlayerCommand类。这将验证命令发送者然后执行命令。这些类各自都有其特殊方法,在发送者验证后调用

  • PlayerCommand: onPlayerExecute(Player $player, string $overload, array $arguments): bool|string
  • ConsoleCommand: onConsoleExecute(ConsoleCommandSender $sender, string $overload, array $arguments): bool|string

注意:这些方法将替换onExecute()方法。

简单示例

以下是如何创建和注册命令的简单示例。

命令类

class SimpleCommand extends libcommand\Command {
    public function __construct() {
        parent::__construct(
            name: "simple",
            description: "Simple command description",
            usageMessage: "Usage: /simple <test_int> <test_raw>",
            aliases: ["s"],
            overloads: [
                new libcommand\Overload(name: "default", parameters: [
                    new \libcommand\IntParameter(name: "test_int", description: "Test integer parameter", optional: false),
                    new \libcommand\RawTextParameter(name: "test_raw", description: "Test raw text parameter", optional: true)
                ])
            ],
            // Permissions and their messages can also be specified using the `permission` and `permissionMessage` properties.
            // permission: "simple.command",
            // permissionMessage: "Ouch! You don't have permission to use SimpleCommand!"
        );
    }
    public function onExecute(\pocketmine\command\CommandSender $sender, string $overload, array $arguments) : bool|string {
        $int = $arguments["test_int"];
        $raw = $arguments["test_raw"] ?? "fallback raw text";
        // Returning a string will send the sender the returned message
        return "Simple command executed with $int and $raw";
    }

}

注册

class SimplePlugin extends \pocketmine\plugin\PluginBase {

    protected function onEnable(): void {
        // Registering `LibCommandBase` allows for client-sided rendering to be done
        libcommand\LibCommandBase::register(plugin: $this);
        $this->getServer()->getCommandMap()->register(
            fallbackPrefix: $this->getName(),
            command: new SimpleCommand()
        );
    }

}

ClosureCommand

如果您想创建一个不需要单独类的命令,可以使用ClosureCommand类。

这避免了使用单独类的需要,并允许您使用闭包来定义命令逻辑。

一个闭包命令的简单例子可能看起来像这样

\pocketmine\Server::getInstance()->getCommandMap()->register(
    fallbackPrefix: "examples",
    command: new \libcommand\ClosureCommand(
        name: "add",
        onExecute: function (\pocketmine\command\CommandSender $sender, string $overload, array $arguments) : bool|string {
            // Null-coalescing operator is used to keep PHPStan happy, but won't actually occur
            $first = $arguments["first"] ?? throw new AssumptionFailedError("First argument is required");
            $second = $arguments["second"] ?? throw new AssumptionFailedError("Second argument is required");
            return "Result of $first + $second: " . ($first + $second);
        },
        description: "Add two numbers together",
        usageMessage: "/add <first> <second>",
        overloads: [
            new \libcommand\Overload(
                name: "default",
                parameters: [
                    new \libcommand\parameter\types\IntParameter(name: "first"),
                    new \libcommand\parameter\types\IntParameter(name: "second")
                ]
            )
        ]
    )
);
// `/add 1 2` will send a message with the following message: "Result of 1 + 2: 3"

原味命令渲染

虽然默认不支持,但可以使用 libcommand\VanillaCommandPatcher::register(PluginBase $plugin) 来修补默认的原味命令并在客户端渲染。

注意:这可能在将来被分成一个单独的插件,但到目前为止,它包含在库中。

类型

这些类型与各种参数相关联。

装备槽

  • slot.armor
  • slot.armor.head
  • slot.armor.chest
  • slot.armor.legs
  • slot.armor.feet
  • slot.chest
  • slot.enderchest
  • slot.equippable
  • slot.hotbar
  • slot.inventory
  • slot.saddle
  • slot.weapon.mainhand
  • slot.weapon.offhand

路线图

  • 根据重载生成使用信息
  • 引入子命令系统