Pumpkin/pumpkin/src/command/commands/kill.rs
2025-08-21 16:43:13 +02:00

84 lines
2.4 KiB
Rust

use async_trait::async_trait;
use pumpkin_util::text::TextComponent;
use crate::command::args::entities::EntitiesArgumentConsumer;
use crate::command::args::{Arg, ConsumedArgs};
use crate::command::tree::CommandTree;
use crate::command::tree::builder::{argument, require};
use crate::command::{CommandError, CommandExecutor, CommandSender};
use crate::entity::EntityBase;
use CommandError::InvalidConsumption;
const NAMES: [&str; 1] = ["kill"];
const DESCRIPTION: &str = "Kills all target entities.";
const ARG_TARGET: &str = "target";
struct Executor;
#[async_trait]
impl CommandExecutor for Executor {
async fn execute<'a>(
&self,
sender: &mut CommandSender,
_server: &crate::server::Server,
args: &ConsumedArgs<'a>,
) -> Result<(), CommandError> {
let Some(Arg::Entities(targets)) = args.get(&ARG_TARGET) else {
return Err(InvalidConsumption(Some(ARG_TARGET.into())));
};
let target_count = targets.len();
for target in targets {
target.kill(target.clone()).await;
}
let msg = if target_count == 1 {
TextComponent::translate(
"commands.kill.success.single",
[targets[0].get_display_name().await],
)
} else {
TextComponent::translate(
"commands.kill.success.multiple",
[TextComponent::text(target_count.to_string())],
)
};
sender.send_message(msg).await;
Ok(())
}
}
struct SelfExecutor;
#[async_trait]
impl CommandExecutor for SelfExecutor {
async fn execute<'a>(
&self,
sender: &mut CommandSender,
_server: &crate::server::Server,
_args: &ConsumedArgs<'a>,
) -> Result<(), CommandError> {
let target = sender.as_player().ok_or(CommandError::InvalidRequirement)?;
target.kill(target.clone()).await;
sender
.send_message(TextComponent::translate(
"commands.kill.success.single",
[target.get_display_name().await],
))
.await;
Ok(())
}
}
#[allow(clippy::redundant_closure_for_method_calls)] // causes lifetime issues
pub fn init_command_tree() -> CommandTree {
CommandTree::new(NAMES, DESCRIPTION)
.then(argument(ARG_TARGET, EntitiesArgumentConsumer).execute(Executor))
.then(require(|sender| sender.is_player()).execute(SelfExecutor))
}