docs: some more commands things

This commit is contained in:
Alexander Medvedev 2026-02-06 20:57:09 +01:00
parent c039271ee7
commit 9e716e9b34
9 changed files with 2704 additions and 5 deletions

View File

@ -71,7 +71,7 @@ export const en = defineConfig({
}, },
{ {
text: "Plugin Template", text: "Plugin Template",
link: "/plugin-dev/plugin-template/introduction", collapsed: false,
items: [ items: [
{ {
text: "Creating Project", text: "Creating Project",
@ -82,12 +82,23 @@ export const en = defineConfig({
link: "/plugin-dev/plugin-template/basic-logic", link: "/plugin-dev/plugin-template/basic-logic",
}, },
{ {
text: "Join Event", text: "Events",
link: "/plugin-dev/plugin-template/join-event", items: [
{ text: "Join Event", link: "/plugin-dev/plugin-template/join-event" },
]
}, },
{ {
text: "Rock-Paper-Scissors Command", text: "Commands",
link: "/plugin-dev/plugin-template/rock-paper-scissors", items: [
{
text: "First Command",
link: "/plugin-dev/plugin-template/command/first-command"
},
{
text: "Rock-Paper-Scissors",
link: "/plugin-dev/plugin-template/command/rock-paper-scissors"
},
]
}, },
{ {
text: "Inventories", text: "Inventories",

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 789 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

View File

@ -0,0 +1,109 @@
# Making your first Command
Before registering your command, you should choose a name. In this example, we define it as a constant array. Using an array allows you to easily add aliases
```rust
const NAMES: [&str; 1] = ["test"];
// OR with aliases
const NAMES: [&str; 2] = ["test", "testcommand"];
```
You should also define a description, which will be displayed when players use the /help command
```rust
const DESCRIPTION: &str = "My first Command!";
```
Pumpkin's Command API is heavily inspired by Mojang's [Brigadier](https://github.com/Mojang/brigadier) This system allows you to easily manage command syntax and provides automatic tab-completion for players
#### Implementing the Command Tree
```rust
use pumpkin::command::tree::CommandTree;
pub fn init_command_tree() -> CommandTree {
CommandTree::new(NAMES, DESCRIPTION)
}
```
#### Registration and Permissions
To make the command usable, you must register both the Permission and the Command itself within your plugin context.
First, register the Permission. In this example, we set `PermissionDefault::Allow` so that everyone can use the command by default
```diff
#[plugin_method]
async fn on_load(&mut self, context: Arc<Context>) -> Result<(), String> {
context.init_log();
log::info!("Hello, Pumpkin!");
+ context
+ .register_permission(Permission::new(
+ "plugin_docs_plugin:test",
+ "Important Test Permission",
+ PermissionDefault::Allow,
+ ))
+ .await
+ .unwrap();
Ok(())
}
```
Next, register the command using the permission string created above:
```diff
#[plugin_method]
async fn on_load(&mut self, context: Arc<Context>) -> Result<(), String> {
context.init_log();
log::info!("Hello, Pumpkin!");
context
.register_permission(Permission::new(
"plugin_docs_plugin:test",
"Important Test Permission",
PermissionDefault::Allow,
))
.await
.unwrap();
+ context
+ .register_command(command::init_command_tree(), "plugin_docs_plugin:test")
+ .await;
Ok(())
}
```
Rebuild your plugin, move the plugins file into the plugins folder, and restart your server
**Congrats!**, The command is now registered and should be highlighted in-game and in console
<img src="/assets/plugin-dev/first_command_preview.png" alt="drawing" width="1000"/>
Executing the command right now likly trown an Syntax error since no Command Executor has been implemented and the Command just does nothing
### Adding an Executor
Lets create a super simple Command Executor without requring and arguments
```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))
})
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

2579
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff