on_disconnect

This commit is contained in:
MeexReay 2025-05-07 21:36:47 +03:00
parent 9d6c0cd04d
commit 03a23eb267
5 changed files with 42 additions and 3 deletions

View File

@ -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)); // Добавляем пример пакет хандлера

View File

@ -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.[<on_ $event _priority>]()
).iter() {
let _ = handler.[<on_ $event>](
$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 {

View File

@ -98,6 +98,8 @@ pub fn start_server(server: Arc<ServerContext>) {
}
};
trigger_event_ignore!(client, disconnect);
// Удаляем клиента из списка клиентов
server.clients.remove(&client.addr);

View File

@ -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)); // Добавляем пример пакет хандлера

View File

@ -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<ClientContext>) -> Result<(), ServerError> {
handle_disconnect(client)
}
}
pub fn send_login(client: Arc<ClientContext>) -> 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<ClientContext>, // Контекст клиента
) -> Result<(), ServerError> {
Ok(())
}