use async_trait::async_trait; use pumpkin_data::sound::SoundCategory; use rand::{thread_rng, Rng}; use crate::command::{ args::{arg_sound::SoundArgumentConsumer, ConsumedArgs, FindArg}, tree::CommandTree, tree_builder::argument, CommandError, CommandExecutor, CommandSender, }; const NAMES: [&str; 1] = ["playsound"]; const DESCRIPTION: &str = "Plays a sound at a position."; const ARG_SOUND: &str = "sound"; struct SoundExecutor; #[async_trait] impl CommandExecutor for SoundExecutor { async fn execute<'a>( &self, sender: &mut CommandSender<'a>, _server: &crate::server::Server, args: &ConsumedArgs<'a>, ) -> Result<(), CommandError> { let sound = SoundArgumentConsumer::find_arg(args, ARG_SOUND)?; if let Some(player) = sender.as_player() { let seed = thread_rng().gen::(); player .play_sound( sound as u16, SoundCategory::Master, &player.living_entity.entity.pos.load(), 1.0, 1.0, seed, ) .await; } Ok(()) } } pub fn init_command_tree() -> CommandTree { CommandTree::new(NAMES, DESCRIPTION) .with_child(argument(ARG_SOUND, SoundArgumentConsumer).execute(SoundExecutor)) }