use bevy::prelude::*; use super::{ packet::{InboundPacket, OutboundPacket, Packet}, peer::Peer, state::NetworkState, }; fn spawner> + Component>( mut inbound: EventReader, mut commands: Commands, ) { for packet in inbound.read() { if let Ok(entity) = T::try_from(packet.0.message.clone()) { commands.spawn(entity); } } } fn sender> + Component + Clone>( peers: Query<&Peer, Added>, entities: Query<&T>, mut outbound: EventWriter, ) { for peer in peers { for entity in entities { outbound.write(OutboundPacket(Packet::new( (*entity).clone().into(), peer.id, ))); } } } pub trait Networked: Into> + TryFrom> + Component + Clone { fn register(app: &mut App); } impl Networked for T where T: Into> + TryFrom> + Component + Clone, { fn register(app: &mut App) { app.add_systems( FixedUpdate, (sender::, spawner::).run_if(in_state(NetworkState::MultiPlayer)), ); } }