bevy_sync 0.19.1

Plugin for synchronizing entities and components between server and its clients.
Documentation
use bevy_connect::events::MessageReceivedEvent;
use bevy_ecs::message::{MessageReader, MessageWriter};

use crate::{
    InitialSyncFinished,
    commands::{
        ComponentNameUpdated, ComponentUpdated, CreateEntity, DeleteEntity, ReparentEntity,
        UpdateStandardMaterial,
    },
    logging::{Who, log_message_received},
};

use super::{Commands, Message};

pub(crate) fn process_messages(
    mut commands: Commands,
    mut event_sync_finished: MessageWriter<InitialSyncFinished>,
    mut events: MessageReader<MessageReceivedEvent<Message>>,
) {
    for e in events.read() {
        client_received_a_message(e.message.as_ref(), &mut commands, &mut event_sync_finished);
    }
}

#[allow(clippy::too_many_arguments)]
fn client_received_a_message(
    msg: &Message,
    cmd: &mut Commands,
    event_sync_finished: &mut MessageWriter<InitialSyncFinished>,
) {
    log_message_received(Who::Client, msg);
    match msg {
        Message::EntitySpawn { uuid } => {
            cmd.queue(CreateEntity::from(*uuid));
        }
        Message::EntityParented {
            entity_uuid: entity_id,
            parent_uuid: parent_id,
        } => {
            cmd.queue(ReparentEntity::from((*entity_id, *parent_id)));
        }
        Message::EntityDelete { uuid } => {
            cmd.queue(DeleteEntity::from(*uuid));
        }
        Message::ComponentUpdated { uuid, name, data } => {
            cmd.queue(ComponentUpdated::new(*uuid, name.clone(), data.clone()));
        }
        Message::StandardMaterialUpdated { uuid, material } => {
            cmd.queue(UpdateStandardMaterial::from((*uuid, material.clone())));
        }
        // Nothing to do, only servers send initial sync
        Message::RequestInitialSync { from_uuid: _ } => {}
        Message::FinishedInitialSync => {
            event_sync_finished.write(InitialSyncFinished);
        }
        Message::ComponentNameUpdated { uuid, data } => {
            cmd.queue(ComponentNameUpdated::new(*uuid, data.clone()));
        }
    }
}