From c26ff332d87553211f3113a60c9e1ddc025fb026 Mon Sep 17 00:00:00 2001 From: Tipragot Date: Sun, 30 Apr 2023 02:14:18 +0200 Subject: [PATCH] Add resource syncronisation --- src/client.rs | 18 ++++++++++++++++-- src/server.rs | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index cbec75f..295eeda 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,3 +1,4 @@ +use crate::{tcp, Packet}; use bevy::prelude::*; use std::{collections::HashMap, io, net::ToSocketAddrs, sync::Arc}; @@ -7,8 +8,6 @@ use ::{ std::{any::type_name, marker::PhantomData}, }; -use crate::{tcp, Packet}; - /// A trait for a handler function. pub trait PacketHandlerFn: Fn(Vec, &mut World) + Send + Sync + 'static {} @@ -150,6 +149,10 @@ pub trait NetworkExt { #[cfg(all(feature = "sync"))] /// Register a [Component] to be synced. fn sync_component(&mut self) -> &mut Self; + + #[cfg(all(feature = "sync"))] + /// Register a [Resource] to be synced. + fn sync_resource(&mut self) -> &mut Self; } impl NetworkExt for App { @@ -224,4 +227,15 @@ impl NetworkExt for App { }, ) } + + #[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::(); + }) + } } diff --git a/src/server.rs b/src/server.rs index 381227a..4484fe9 100644 --- a/src/server.rs +++ b/src/server.rs @@ -206,6 +206,10 @@ pub trait NetworkExt { #[cfg(all(feature = "sync"))] /// Register a [Component] to be synced. fn sync_component(&mut self) -> &mut Self; + + #[cfg(all(feature = "sync"))] + /// Register a [Resource] to be synced. + fn sync_resource(&mut self) -> &mut Self; } impl NetworkExt for App { @@ -280,4 +284,20 @@ impl NetworkExt for App { .add_system(send_components.after(ServerPlugin::send_synced)) .add_system(remove_components.after(update_components)) } + + #[cfg(feature = "sync")] + fn sync_resource(&mut self) -> &mut Self { + let update = |resource: Res, connections: Query<&ClientConnection>| { + for connection in connections.iter() { + connection.send(&*resource); + } + }; + let remove = |connections: Query<&ClientConnection>| { + for connection in connections.iter() { + connection.send(&PhantomData::); + } + }; + self.add_system(update.run_if(resource_changed::())) + .add_system(remove.after(update).run_if(resource_removed::())) + } }