From 277afd16da709002874d4e0fdbb07acfeeffc231 Mon Sep 17 00:00:00 2001 From: Tipragot Date: Sun, 30 Apr 2023 16:36:14 +0200 Subject: [PATCH] Better packet handlers --- src/client.rs | 119 ++++++++++++++++++++++++-------------------------- src/server.rs | 48 ++++++++++++++------ 2 files changed, 91 insertions(+), 76 deletions(-) diff --git a/src/client.rs b/src/client.rs index dfa80d5..64ccbeb 100644 --- a/src/client.rs +++ b/src/client.rs @@ -112,20 +112,15 @@ impl Plugin for ClientPlugin { #[cfg(feature = "sync")] { - app.add_packet_handler::(|data, world| { - match bincode::deserialize::(&data) { - Ok(entity) => { - if let Some((local_entity, _)) = world - .query::<(Entity, &ServerEntity)>() - .iter(world) - .find(|(_, server_entity)| server_entity.0 == entity) - { - world.despawn(local_entity); - } else { - world.spawn(ServerEntity(entity)); - } - } - Err(_) => println!("Failed to deserialize packet: {}", type_name::()), + app.add_packet_handler(|entity: Entity, world| { + if let Some((local_entity, _)) = world + .query::<(Entity, &ServerEntity)>() + .iter(world) + .find(|(_, server_entity)| server_entity.0 == entity) + { + world.despawn(local_entity); + } else { + world.spawn(ServerEntity(entity)); } }); app.add_system(Self::remove_synced.run_if(resource_removed::())); @@ -136,7 +131,10 @@ impl Plugin for ClientPlugin { /// An extension to add packet handlers. pub trait NetworkExt { /// Add a new packet handler. - fn add_packet_handler(&mut self, handler: H) -> &mut Self; + fn add_packet_handler( + &mut self, + handler: H, + ) -> &mut Self; #[cfg(all(feature = "sync"))] /// Register syncronization for an [Event] that can be sent by the server. @@ -156,20 +154,28 @@ pub trait NetworkExt { } impl NetworkExt for App { - fn add_packet_handler(&mut self, handler: H) -> &mut Self { + fn add_packet_handler( + &mut self, + handler: H, + ) -> &mut Self { Arc::get_mut(&mut self.world.resource_mut::().0) .unwrap() - .insert(P::packet_id(), Box::new(handler)); + .insert( + P::packet_id(), + Box::new( + move |data: Vec, world| match bincode::deserialize::

(&data) { + Ok(packet) => handler(packet, world), + Err(_) => println!("Failed to deserialize packet: {}", type_name::

()), + }, + ), + ); self } #[cfg(feature = "sync")] fn sync_server_event(&mut self) -> &mut Self { self.add_event::>() - .add_packet_handler::(|data, world| match bincode::deserialize::(&data) { - Ok(event) => world.send_event(FromServer { event }), - Err(_) => println!("Failed to deserialize packet: {}", type_name::()), - }) + .add_packet_handler(|event: E, world| world.send_event(FromServer { event })) } #[cfg(feature = "sync")] @@ -187,54 +193,43 @@ impl NetworkExt for App { #[cfg(feature = "sync")] fn sync_component(&mut self) -> &mut Self { - self.add_packet_handler::<(Entity, C), _>(|data, world| { - match bincode::deserialize::<(Entity, C)>(&data) { - Ok((entity, component)) => { - if let Some((local_entity, _)) = world - .query::<(Entity, &ServerEntity)>() - .iter(world) - .find(|(_, server_entity)| server_entity.0 == entity) - { - let mut local_entity = world.entity_mut(local_entity); - match local_entity.get_mut::() { - Some(mut local_component) => { - *local_component = component; - } - None => { - local_entity.insert(component); - } - } - } else { - println!("Received component for unknown entity: {:?}", entity); + self.add_packet_handler(|data: (Entity, C), world| { + let (entity, component) = data; + if let Some((local_entity, _)) = world + .query::<(Entity, &ServerEntity)>() + .iter(world) + .find(|(_, server_entity)| server_entity.0 == entity) + { + let mut local_entity = world.entity_mut(local_entity); + match local_entity.get_mut::() { + Some(mut local_component) => { + *local_component = component; + } + None => { + local_entity.insert(component); } } - Err(_) => println!("Failed to deserialize packet: {}", type_name::()), + } else { + println!("Received component for unknown entity: {:?}", entity); + } + }) + .add_packet_handler(|data: (Entity, PhantomData), world| { + let (entity, _) = data; + if let Some((local_entity, _)) = world + .query::<(Entity, &ServerEntity)>() + .iter(world) + .find(|(_, server_entity)| server_entity.0 == entity) + { + world.entity_mut(local_entity).remove::(); } }) - .add_packet_handler::<(Entity, PhantomData), _>( - |data, world| match bincode::deserialize::<(Entity, PhantomData)>(&data) { - Ok((entity, _)) => { - if let Some((local_entity, _)) = world - .query::<(Entity, &ServerEntity)>() - .iter(world) - .find(|(_, server_entity)| server_entity.0 == entity) - { - world.entity_mut(local_entity).remove::(); - } - } - Err(_) => println!("Failed to deserialize packet: {}", type_name::()), - }, - ) } #[cfg(feature = "sync")] fn sync_resource(&mut self) -> &mut Self { - self.add_packet_handler::(|data, world| match bincode::deserialize::(&data) { - Ok(resource) => world.insert_resource(resource), - Err(_) => println!("Failed to deserialize packet: {}", type_name::()), - }) - .add_packet_handler::, _>(|_, world| { - world.remove_resource::(); - }) + self.add_packet_handler(|resource: R, world| world.insert_resource(resource)) + .add_packet_handler(|_: PhantomData, world| { + world.remove_resource::(); + }) } } diff --git a/src/server.rs b/src/server.rs index 4484fe9..912d6fd 100644 --- a/src/server.rs +++ b/src/server.rs @@ -193,7 +193,13 @@ impl Plugin for ServerPlugin { /// An extension to add packet handlers. pub trait NetworkExt { /// Add a new packet handler. - fn add_packet_handler(&mut self, handler: H) -> &mut Self; + fn add_packet_handler< + P: Packet, + H: Fn(Entity, ClientConnection, P, &mut World) + Send + Sync + 'static, + >( + &mut self, + handler: H, + ) -> &mut Self; #[cfg(all(feature = "sync"))] /// Register syncronization for an [Event] that can be sent by the server. @@ -213,10 +219,26 @@ pub trait NetworkExt { } impl NetworkExt for App { - fn add_packet_handler(&mut self, handler: H) -> &mut Self { + fn add_packet_handler< + P: Packet, + H: Fn(Entity, ClientConnection, P, &mut World) + Send + Sync + 'static, + >( + &mut self, + handler: H, + ) -> &mut Self { Arc::get_mut(&mut self.world.resource_mut::().0) .unwrap() - .insert(P::packet_id(), Box::new(handler)); + .insert( + P::packet_id(), + Box::new( + move |entity, connection, data: Vec, world| match bincode::deserialize::

( + &data, + ) { + Ok(packet) => handler(entity, connection, packet, world), + Err(_) => println!("Failed to deserialize packet: {}", type_name::

()), + }, + ), + ); self } @@ -235,17 +257,15 @@ impl NetworkExt for App { #[cfg(feature = "sync")] fn sync_client_event(&mut self) -> &mut Self { - self.add_event::>() - .add_packet_handler::( - |entity, connection, data, world| match bincode::deserialize::(&data) { - Ok(event) => world.send_event(FromClient { - entity, - connection, - event, - }), - Err(_) => println!("Failed to deserialize packet: {}", type_name::()), - }, - ) + self.add_event::>().add_packet_handler( + |entity, connection, event: E, world| { + world.send_event(FromClient { + entity, + connection, + event, + }) + }, + ) } #[cfg(feature = "sync")]