Skip to content

Commit

Permalink
separate receivers
Browse files Browse the repository at this point in the history
  • Loading branch information
raffaeleragni committed Jul 6, 2023
1 parent d5747f6 commit 4811c3a
Show file tree
Hide file tree
Showing 5 changed files with 232 additions and 246 deletions.
114 changes: 6 additions & 108 deletions src/client/mod.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
use bevy::{
ecs::schedule::run_enter_schedule,
prelude::{
debug, info, resource_removed, state_exists_and_equals, Added, App, AppTypeRegistry,
BuildWorldChildren, Changed, Children, Commands, CoreSet, Entity, IntoSystemAppConfig,
IntoSystemConfig, IntoSystemConfigs, NextState, OnExit, OnUpdate, Parent, Plugin, Query,
Res, ResMut, With, World,
},
utils::HashSet,
};
use bevy::{ecs::schedule::run_enter_schedule, prelude::*, utils::HashSet};
use bevy_renet::renet::{transport::NetcodeClientTransport, DefaultChannel, RenetClient};

use crate::{
lib_priv::SyncTrackerRes, proto::Message, proto_serde::compo_to_bin, ClientState, SyncMark,
SyncUp,
};

pub(crate) struct ClientSendPlugin;
impl Plugin for ClientSendPlugin {
mod receiver;

pub(crate) struct ClientSyncPlugin;
impl Plugin for ClientSyncPlugin {
fn build(&self, app: &mut App) {
app.init_resource::<SyncTrackerRes>();

Expand All @@ -43,7 +36,7 @@ impl Plugin for ClientSendPlugin {
entity_parented_on_client,
react_on_changed_components,
entity_removed_from_client,
poll_for_messages,
receiver::poll_for_messages,
)
.chain()
.in_set(OnUpdate(ClientState::Connected)),
Expand Down Expand Up @@ -162,98 +155,3 @@ fn react_on_changed_components(
);
}
}

fn poll_for_messages(
mut commands: Commands,
mut track: ResMut<SyncTrackerRes>,
opt_client: Option<ResMut<RenetClient>>,
) {
if let Some(mut client) = opt_client {
receive_as_client(&mut client, &mut track, &mut commands);
}
}

fn receive_as_client(
client: &mut ResMut<RenetClient>,
track: &mut ResMut<SyncTrackerRes>,
commands: &mut Commands,
) {
while let Some(message) = client.receive_message(DefaultChannel::ReliableOrdered) {
let deser_message = bincode::deserialize(&message).unwrap();
client_received_a_message(deser_message, track, commands);
}
}

fn client_received_a_message(msg: Message, track: &mut ResMut<SyncTrackerRes>, cmd: &mut Commands) {
match msg {
Message::EntitySpawn { id } => {
debug!(
"Client received of type EntitySpawn for server entity {}v{}",
id.index(),
id.generation()
);
if let Some(e_id) = track.server_to_client_entities.get(&id) {
if cmd.get_entity(*e_id).is_some() {
return;
}
}
let e_id = cmd
.spawn(SyncUp {
server_entity_id: id,
})
.id();
// Need to update the map right away or else adjacent messages won't see each other entity
track.server_to_client_entities.insert(id, e_id);
}
Message::EntitySpawnBack {
server_entity_id: id,
client_entity_id: back_id,
} => {
debug!(
"Client received of type EntitySpawnBack for server entity {}v{}",
id.index(),
id.generation()
);
if let Some(mut e) = cmd.get_entity(back_id) {
e.remove::<SyncMark>().insert(SyncUp {
server_entity_id: id,
});
}
}
Message::EntityParented {
server_entity_id: e_id,
server_parent_id: p_id,
} => {
let Some(&c_e_id) = track.server_to_client_entities.get(&e_id) else {return};
let Some(&c_p_id) = track.server_to_client_entities.get(&p_id) else {return};
cmd.add(move |world: &mut World| {
let mut entity = world.entity_mut(c_e_id);
let opt_parent = entity.get::<Parent>();
if opt_parent.is_none() || opt_parent.unwrap().get() != c_p_id {
entity.set_parent(p_id);
world.entity_mut(c_p_id).add_child(c_e_id);
}
});
}
Message::EntityDelete { id } => {
debug!(
"Client received of type EntityDelete for server entity {}v{}",
id.index(),
id.generation()
);
let Some(&e_id) = track.server_to_client_entities.get(&id) else {return};
let Some(mut e) = cmd.get_entity(e_id) else {return};
e.despawn();
}
Message::ComponentUpdated { id, name, data } => {
let Some(&e_id) = track.server_to_client_entities.get(&id) else {return};
let mut entity = cmd.entity(e_id);
entity.add(move |_: Entity, world: &mut World| {
SyncTrackerRes::apply_component_change_from_network(e_id, name, data, world);
});
}
Message::StandardMaterialUpdated { id, material } => cmd.add(move |world: &mut World| {
SyncTrackerRes::apply_material_change_from_network(id, &material, world);
}),
}
}
96 changes: 96 additions & 0 deletions src/client/receiver.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
use super::*;

pub(crate) fn poll_for_messages(
mut commands: Commands,
mut track: ResMut<SyncTrackerRes>,
opt_client: Option<ResMut<RenetClient>>,
) {
if let Some(mut client) = opt_client {
receive_as_client(&mut client, &mut track, &mut commands);
}
}

fn receive_as_client(
client: &mut ResMut<RenetClient>,
track: &mut ResMut<SyncTrackerRes>,
commands: &mut Commands,
) {
while let Some(message) = client.receive_message(DefaultChannel::ReliableOrdered) {
let deser_message = bincode::deserialize(&message).unwrap();
client_received_a_message(deser_message, track, commands);
}
}

fn client_received_a_message(msg: Message, track: &mut ResMut<SyncTrackerRes>, cmd: &mut Commands) {
match msg {
Message::EntitySpawn { id } => {
debug!(
"Client received of type EntitySpawn for server entity {}v{}",
id.index(),
id.generation()
);
if let Some(e_id) = track.server_to_client_entities.get(&id) {
if cmd.get_entity(*e_id).is_some() {
return;
}
}
let e_id = cmd
.spawn(SyncUp {
server_entity_id: id,
})
.id();
// Need to update the map right away or else adjacent messages won't see each other entity
track.server_to_client_entities.insert(id, e_id);
}
Message::EntitySpawnBack {
server_entity_id: id,
client_entity_id: back_id,
} => {
debug!(
"Client received of type EntitySpawnBack for server entity {}v{}",
id.index(),
id.generation()
);
if let Some(mut e) = cmd.get_entity(back_id) {
e.remove::<SyncMark>().insert(SyncUp {
server_entity_id: id,
});
}
}
Message::EntityParented {
server_entity_id: e_id,
server_parent_id: p_id,
} => {
let Some(&c_e_id) = track.server_to_client_entities.get(&e_id) else {return};
let Some(&c_p_id) = track.server_to_client_entities.get(&p_id) else {return};
cmd.add(move |world: &mut World| {
let mut entity = world.entity_mut(c_e_id);
let opt_parent = entity.get::<Parent>();
if opt_parent.is_none() || opt_parent.unwrap().get() != c_p_id {
entity.set_parent(p_id);
world.entity_mut(c_p_id).add_child(c_e_id);
}
});
}
Message::EntityDelete { id } => {
debug!(
"Client received of type EntityDelete for server entity {}v{}",
id.index(),
id.generation()
);
let Some(&e_id) = track.server_to_client_entities.get(&id) else {return};
let Some(mut e) = cmd.get_entity(e_id) else {return};
e.despawn();
}
Message::ComponentUpdated { id, name, data } => {
let Some(&e_id) = track.server_to_client_entities.get(&id) else {return};
let mut entity = cmd.entity(e_id);
entity.add(move |_: Entity, world: &mut World| {
SyncTrackerRes::apply_component_change_from_network(e_id, name, data, world);
});
}
Message::StandardMaterialUpdated { id, material } => cmd.add(move |world: &mut World| {
SyncTrackerRes::apply_material_change_from_network(id, &material, world);
}),
}
}
8 changes: 4 additions & 4 deletions src/lib_priv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ use bevy_renet::{
};

use crate::{
client::ClientSendPlugin, proto::PROTOCOL_ID, proto_serde::bin_to_compo,
server::ServerSendPlugin, ClientPlugin, ServerPlugin, SyncComponent, SyncDown, SyncMark,
client::ClientSyncPlugin, proto::PROTOCOL_ID, proto_serde::bin_to_compo,
server::ServerSyncPlugin, ClientPlugin, ServerPlugin, SyncComponent, SyncDown, SyncMark,
SyncPlugin, SyncUp,
};

Expand Down Expand Up @@ -198,7 +198,7 @@ impl Plugin for ServerPlugin {
app.add_plugin(NetcodeServerPlugin);
app.insert_resource(create_server(self.ip, self.port));

app.add_plugin(ServerSendPlugin);
app.add_plugin(ServerSyncPlugin);
}
}

Expand All @@ -209,7 +209,7 @@ impl Plugin for ClientPlugin {
app.add_plugin(NetcodeClientPlugin);
app.insert_resource(create_client(self.ip, self.port));

app.add_plugin(ClientSendPlugin);
app.add_plugin(ClientSyncPlugin);
}
}

Expand Down
Loading

0 comments on commit 4811c3a

Please sign in to comment.