diff --git a/README.md b/README.md index 9f6ee5c..cf84e8c 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,9 @@ rust_mc_serv = { git = "https://github.com/GIKExe/rust_mc_serv.git" } let config = Arc::new(Config::default()); let mut server = ServerContext::new(config); -server.add_packet_handler(Box::new(PlayHandler)); // Добавляем дефолтную обработку режима Play +// Добавляем дефолтную обработку режима Play +server.add_packet_handler(Box::new(PlayHandler)); +server.add_packet_handler(Box::new(PlayListener)); server.add_listener(Box::new(ExampleListener)); // Добавляем пример листенера server.add_packet_handler(Box::new(ExamplePacketHandler)); // Добавляем пример пакет хандлера diff --git a/src/event/mod.rs b/src/event/mod.rs index 785aa70..6b9f802 100644 --- a/src/event/mod.rs +++ b/src/event/mod.rs @@ -37,9 +37,27 @@ macro_rules! trigger_event { }}; } +/// Игнорирует результат листенеров +#[macro_export] +macro_rules! trigger_event_ignore { + ($client:ident, $event:ident $(, $arg_ty:expr)* $(,)?) => {{ + paste::paste! { + for handler in $client.server.listeners( + |o| o.[]() + ).iter() { + let _ = handler.[]( + $client.clone() + $(, $arg_ty)* + ); + } + } + }}; +} + pub trait Listener: Sync + Send { generate_handlers!(status, &mut String); generate_handlers!(plugin_message, &str, &[u8]); + generate_handlers!(disconnect); } pub trait PacketHandler: Sync + Send { diff --git a/src/lib.rs b/src/lib.rs index 7bfbcb4..21289ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -98,6 +98,8 @@ pub fn start_server(server: Arc) { } }; + trigger_event_ignore!(client, disconnect); + // Удаляем клиента из списка клиентов server.clients.remove(&client.addr); diff --git a/src/main.rs b/src/main.rs index 0d1cb59..efd7c21 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use rust_mc_serv::{ context::ServerContext, data::text_component::TextComponent, event::{Listener, PacketHandler}, - play::PlayHandler, + play::{PlayHandler, PlayListener}, player::context::ClientContext, protocol::ConnectionState, start_server, @@ -154,7 +154,9 @@ fn main() { // Передается во все подключения let mut server = ServerContext::new(config); - server.add_packet_handler(Box::new(PlayHandler)); // Добавляем дефолтную обработку режима Play + // Добавляем дефолтную обработку режима Play + server.add_packet_handler(Box::new(PlayHandler)); + server.add_packet_handler(Box::new(PlayListener)); server.add_listener(Box::new(ExampleListener)); // Добавляем пример листенера server.add_packet_handler(Box::new(ExamplePacketHandler)); // Добавляем пример пакет хандлера diff --git a/src/play/mod.rs b/src/play/mod.rs index 477dc33..465cbed 100644 --- a/src/play/mod.rs +++ b/src/play/mod.rs @@ -9,6 +9,7 @@ use helper::{ use rust_mc_proto::{DataReader, DataWriter, Packet}; use uuid::Uuid; +use crate::event::Listener; use crate::player::context::EntityInfo; use crate::{ ServerError, data::text_component::TextComponent, event::PacketHandler, @@ -56,6 +57,14 @@ impl PacketHandler for PlayHandler { } } +pub struct PlayListener; + +impl Listener for PlayListener { + fn on_disconnect(&self, client: Arc) -> Result<(), ServerError> { + handle_disconnect(client) + } +} + pub fn send_login(client: Arc) -> Result<(), ServerError> { // Отправка пакета Login let mut packet = Packet::empty(clientbound::play::LOGIN); @@ -478,3 +487,9 @@ pub fn handle_play_state( Ok(()) } + +pub fn handle_disconnect( + client: Arc, // Контекст клиента +) -> Result<(), ServerError> { + Ok(()) +}