bevy_sync 0.19.0

Plugin for synchronizing entities and components between server and its clients.
Documentation
pub mod assets;

use bevy_connect::prelude::{Channel, SessionConfig, SessionConnectCommand, SessionOptions};
use bevy_ecs::{system::Commands, world::World};
use tracing::debug;

use crate::{SyncConnectionParameters, networking::assets::AssetMessage, proto::Message};

pub(crate) fn setup_server(cmd: &mut Commands, params: &SyncConnectionParameters) {
    match params {
        SyncConnectionParameters::Direct {
            ip,
            port,
            asset_port,
        } => {
            let connect = SessionConnectCommand::<Message>::from_config(SessionConfig::Direct {
                addr: Some(*ip),
                port: *port,
                host: true,
                compress: false,
                key: None,
                options: SessionOptions::default(),
            });
            let connect_assets =
                SessionConnectCommand::<AssetMessage>::from_config(SessionConfig::Direct {
                    addr: Some(*ip),
                    port: *asset_port,
                    host: true,
                    compress: false,
                    key: None,
                    options: SessionOptions::default(),
                });
            cmd.queue(connect);
            cmd.queue(connect_assets);
        }
    }
}

pub(crate) fn setup_client(cmd: &mut Commands, params: &SyncConnectionParameters) {
    match params {
        SyncConnectionParameters::Direct {
            ip,
            port,
            asset_port,
        } => {
            let connect = SessionConnectCommand::<Message>::from_config(SessionConfig::Direct {
                addr: Some(*ip),
                port: *port,
                host: false,
                compress: false,
                key: None,
                options: SessionOptions::default(),
            });
            let connect_assets =
                SessionConnectCommand::<AssetMessage>::from_config(SessionConfig::Direct {
                    addr: Some(*ip),
                    port: *asset_port,
                    host: false,
                    compress: false,
                    key: None,
                    options: SessionOptions::default(),
                });
            cmd.queue(connect);
            cmd.queue(connect_assets);
        }
    }
}

/// Sends a message whether the current sender is client or server, it will
/// send it for the relevant case.
/// If no server or client is setup then this is a no-op.
pub(crate) fn send_message_world(world: &mut World, message: Message) {
    let Some(mut channel) = world.get_resource_mut::<Channel<Message>>() else {
        debug!("No server or client was available to send a message");
        return;
    };
    channel.broadcast(message);
}