Pumpkin-Docs/docs/zh_cn/plugin-dev/rust/command/first-command.md
2026-04-14 19:13:36 +02:00

110 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 制作您的第一个命令
在注册您的命令之前,您需要为其选择一个名称。在本示例中,我们将其定义为常量数组。使用数组可以方便地添加别名
```rust
const NAMES: [&str; 1] = ["test"];
// OR with aliases
const NAMES: [&str; 2] = ["test", "testcommand"];
```
您还需要定义命令的描述,当玩家使用 /help 命令时,此描述将会显示出来
```rust
const DESCRIPTION: &str = "我的第一个命令!";
```
Pumpkin 的 Command API 很大程度上受到了 Mojang 的 [Brigadier](https://github.com/Mojang/brigadier) 的启发。这套系统能够让你轻松地管理命令语法,并为玩家提供自动的 Tab 补全功能。
#### 实现命令树
```rust
use pumpkin::command::tree::CommandTree;
pub fn init_command_tree() -> CommandTree {
CommandTree::new(NAMES, DESCRIPTION)
}
```
#### 注册与权限
要让命令可用,您必须在您的插件上下文中同时注册权限和命令本身。
首先,注册权限。在本示例中,我们将 `PermissionDefault::Allow` ,以便默认情况下所有玩家都能使用此命令。
```diff
#[plugin_method]
async fn on_load(&mut self, context: Arc<Context>) -> Result<(), String> {
context.init_log();
log::info!("你好, Pumpkin!");
+ context
+ .register_permission(Permission::new(
+ "plugin_docs_plugin:test",
+ "重要:测试权限",
+ PermissionDefault::Allow,
+ ))
+ .await
+ .unwrap();
Ok(())
}
```
接下来,使用上面创建的权限字符串来注册命令:
```diff
#[plugin_method]
async fn on_load(&mut self, context: Arc<Context>) -> Result<(), String> {
context.init_log();
log::info!("你好, Pumpkin!");
context
.register_permission(Permission::new(
"plugin_docs_plugin:test",
"重要:测试权限",
PermissionDefault::Allow,
))
.await
.unwrap();
+ context
+ .register_command(command::init_command_tree(), "plugin_docs_plugin:test")
+ .await;
Ok(())
}
```
重新构建您的插件,将生成的插件文件移动到服务器的 plugins 文件夹中,然后重启服务器。
**恭喜!** 命令现已注册成功,在游戏中及控制台里都应能正常使用并高亮显示。
<img src="/assets/plugin-dev/first_command_preview.png" alt="drawing" width="1000"/>
目前执行命令很可能会抛出语法错误,因为尚未实现命令执行器(Command Executor),该命令现在没有任何实际功能。
### 添加一个执行器
让我们创建一个超级简单的命令执行器,它不需要任何参数。
```rust
struct MyCommandExecutor;
impl CommandExecutor for MyCommandExecutor {
fn execute<'a>(
&self,
sender: &'a CommandSender,
server: &'a Server,
args: &ConsumedArgs<'a>,
) -> CommandResult<'a> {
Box::pin(async {
Ok((1))
})
}
}
```