pub mod combat; pub mod debug; pub mod movement; use azalea::{ Client, brigadier::prelude::*, client_chat::ChatPacket, entity::metadata::Player, player::GameProfileComponent, }; use bevy_ecs::query::With; use parking_lot::Mutex; use crate::State; pub type Ctx = CommandContext, eyre::Result>; pub type Dispatcher = CommandDispatcher, eyre::Result>; pub struct CommandSource { pub bot: Client, pub state: State, pub chat: ChatPacket, } impl CommandSource { pub fn reply(&self, message: impl Into) { let message = message.into(); if self.chat.is_whisper() { // /msg instead of /w for compat with custom servers self.bot .chat(format!("/msg {} {message}", self.chat.sender().unwrap())); } else { self.bot.chat(message); } } pub fn entity(&self) -> Option { let username = self.chat.sender()?; self.bot .any_entity_by::<&GameProfileComponent, With>( |profile: &GameProfileComponent| profile.name == username, ) .ok() .flatten() } } pub fn register_commands(commands: &mut Dispatcher) { combat::register(commands); debug::register(commands); movement::register(commands); }