Skip to content

Commit 9e00b08

Browse files
committed
Use built-in ReflectMapEntities
`ReflectMapEntities::map_specific_entity` was added in 0.10.1, so our custom `ReflectMapEntity` is no longer needed.
1 parent 77e2e3c commit 9e00b08

8 files changed

Lines changed: 93 additions & 109 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- Use `#[reflect(MapEntities)]` from Bevy 0.10.1 instead of custom `#[reflect(MapEntity)]`.
13+
1014
### Fixed
1115

1216
- Fix tick checks after overflow.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ include = ["/src", "/LICENSE*"]
2020

2121
[dependencies]
2222
bevy_renet = "0.0.7"
23-
bevy = { version = "0.10", default-features = false, features = ["bevy_scene"] }
23+
bevy = { version = "0.10.1", default-features = false, features = [
24+
"bevy_scene",
25+
] }
2426
bincode = "1.3"
2527
serde = "1.0"
2628
tap = "1.0"

src/client.rs

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
pub mod map_entity;
2-
31
use bevy::{
4-
ecs::system::{Command, SystemChangeTick},
2+
ecs::{
3+
entity::{EntityMap, MapEntitiesError},
4+
reflect::ReflectMapEntities,
5+
system::{Command, SystemChangeTick},
6+
},
57
prelude::*,
68
reflect::TypeRegistryInternal,
79
utils::HashMap,
@@ -13,9 +15,8 @@ use serde::{de::DeserializeSeed, Deserialize, Serialize};
1315
use crate::{
1416
tick::Tick,
1517
world_diff::{ComponentDiff, WorldDiff, WorldDiffDeserializer},
16-
REPLICATION_CHANNEL_ID,
18+
Replication, REPLICATION_CHANNEL_ID,
1719
};
18-
use map_entity::{NetworkEntityMap, ReflectMapEntity};
1920

2021
pub struct ClientPlugin;
2122

@@ -193,12 +194,63 @@ fn apply_component_diff(
193194
match component_diff {
194195
ComponentDiff::Changed(component) => {
195196
reflect_component.apply_or_insert(&mut world.entity_mut(client_entity), &**component);
196-
if let Some(reflect_map_entities) = registration.data::<ReflectMapEntity>() {
197+
if let Some(reflect_map_entities) = registration.data::<ReflectMapEntities>() {
197198
reflect_map_entities
198-
.map_entities(world, entity_map.to_client(), client_entity)
199+
.map_specific_entities(world, entity_map.to_client(), &[client_entity])
199200
.unwrap_or_else(|e| panic!("entities in {type_name} should be mappable: {e}"));
200201
}
201202
}
202203
ComponentDiff::Removed(_) => reflect_component.remove(&mut world.entity_mut(client_entity)),
203204
}
204205
}
206+
207+
/// Maps server entities to client entities and vice versa.
208+
///
209+
/// Used only on client.
210+
#[derive(Default, Resource)]
211+
pub(crate) struct NetworkEntityMap {
212+
server_to_client: EntityMap,
213+
client_to_server: EntityMap,
214+
}
215+
216+
impl NetworkEntityMap {
217+
#[cfg(test)]
218+
pub(crate) fn insert(&mut self, server_entity: Entity, client_entity: Entity) {
219+
self.server_to_client.insert(server_entity, client_entity);
220+
self.client_to_server.insert(client_entity, server_entity);
221+
}
222+
223+
pub(crate) fn get_by_server_or_spawn(
224+
&mut self,
225+
world: &mut World,
226+
server_entity: Entity,
227+
) -> Entity {
228+
*self
229+
.server_to_client
230+
.entry(server_entity)
231+
.or_insert_with(|| {
232+
let client_entity = world.spawn(Replication).id();
233+
self.client_to_server.insert(client_entity, server_entity);
234+
client_entity
235+
})
236+
}
237+
238+
pub(crate) fn remove_by_server(
239+
&mut self,
240+
server_entity: Entity,
241+
) -> Result<Entity, MapEntitiesError> {
242+
let client_entity = self.server_to_client.remove(server_entity);
243+
if let Some(client_entity) = client_entity {
244+
self.client_to_server.remove(client_entity);
245+
}
246+
client_entity.ok_or(MapEntitiesError::EntityNotFound(server_entity))
247+
}
248+
249+
pub(crate) fn to_client(&self) -> &EntityMap {
250+
&self.server_to_client
251+
}
252+
253+
pub(crate) fn to_server(&self) -> &EntityMap {
254+
&self.client_to_server
255+
}
256+
}

src/client/map_entity.rs

Lines changed: 0 additions & 89 deletions
This file was deleted.

src/lib.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,19 @@ This also automatically registers the specified type, so you don't need to call
7272
If your component contains [`Entity`] then it cannot be deserialized as is
7373
because entity IDs are different on server and client. The client should do the
7474
mapping. Therefore, to replicate such components properly, they need implement
75-
[`bevy::ecs::entity::MapEntities`] and have `#[reflect(MapEntity)]`:
75+
[`bevy::ecs::entity::MapEntities`] and have `#[reflect(MapEntities)]`:
7676
7777
```rust
78-
# use bevy::{prelude::*, ecs::entity::{EntityMap, MapEntities, MapEntitiesError}};
78+
# use bevy::{
79+
# ecs::{
80+
# entity::{EntityMap, MapEntities, MapEntitiesError},
81+
# reflect::ReflectMapEntities,
82+
# },
83+
# prelude::*,
84+
# };
7985
# use bevy_replicon::prelude::*;
8086
#[derive(Component, Reflect)]
81-
#[reflect(Component, MapEntity)]
87+
#[reflect(Component, MapEntities)]
8288
struct MappedComponent(Entity);
8389
8490
impl MapEntities for MappedComponent {
@@ -229,8 +235,14 @@ map it before sending it to the server.
229235
To do this, use [`ClientEventAppExt::add_mapped_client_event()`]:
230236
231237
```rust
238+
# use bevy::{
239+
# ecs::{
240+
# entity::{EntityMap, MapEntities, MapEntitiesError},
241+
# reflect::ReflectMapEntities,
242+
# },
243+
# prelude::*,
244+
# };
232245
# use bevy_replicon::prelude::*;
233-
# use bevy::{prelude::*, ecs::entity::{EntityMap, MapEntities, MapEntitiesError}};
234246
# use serde::{Deserialize, Serialize};
235247
# let mut app = App::new();
236248
# app.add_plugins(ReplicationPlugins);
@@ -343,7 +355,7 @@ mod world_diff;
343355

344356
pub mod prelude {
345357
pub use super::{
346-
client::{map_entity::ReflectMapEntity, ClientPlugin, ClientState},
358+
client::{ClientPlugin, ClientState},
347359
network_event::{
348360
client_event::{ClientEventAppExt, FromClient},
349361
server_event::{SendMode, ServerEventAppExt, ToClients},
@@ -378,14 +390,17 @@ impl PluginGroup for ReplicationPlugins {
378390
#[cfg(test)]
379391
mod tests {
380392
use bevy::{
381-
ecs::entity::{EntityMap, MapEntities, MapEntitiesError},
393+
ecs::{
394+
entity::{EntityMap, MapEntities, MapEntitiesError},
395+
reflect::ReflectMapEntities,
396+
},
382397
utils::HashMap,
383398
};
384399
use bevy_renet::renet::RenetClient;
385400

386401
use super::*;
387402
use crate::{
388-
client::map_entity::{NetworkEntityMap, ReflectMapEntity},
403+
client::NetworkEntityMap,
389404
replication_core::{AppReplicationExt, Replication},
390405
server::{despawn_tracker::DespawnTracker, removal_tracker::RemovalTracker, AckedTicks},
391406
test_network::TestNetworkPlugin,
@@ -608,7 +623,7 @@ mod tests {
608623
}
609624

610625
#[derive(Component, Reflect)]
611-
#[reflect(Component, MapEntity)]
626+
#[reflect(Component, MapEntities)]
612627
struct MappedComponent(Entity);
613628

614629
impl MapEntities for MappedComponent {

src/network_event/client_event.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use tap::TapFallible;
1010

1111
use super::EventChannel;
1212
use crate::{
13-
client::{map_entity::NetworkEntityMap, ClientState},
13+
client::{ClientState, NetworkEntityMap},
1414
prelude::NetworkChannels,
1515
server::{ServerSet, ServerState, SERVER_ID},
1616
REPLICATION_CHANNEL_ID,

src/network_event/server_event.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use serde::{de::DeserializeOwned, Serialize};
99

1010
use super::EventChannel;
1111
use crate::{
12-
client::{map_entity::NetworkEntityMap, ClientState},
12+
client::{ClientState, NetworkEntityMap},
1313
prelude::NetworkChannels,
1414
server::{ServerSet, ServerState, SERVER_ID},
1515
REPLICATION_CHANNEL_ID,

src/parent_sync.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use bevy::{
77
scene,
88
};
99

10-
use crate::prelude::{AppReplicationExt, ReflectMapEntity};
10+
use crate::AppReplicationExt;
1111

1212
pub struct ParentSyncPlugin;
1313

@@ -33,7 +33,7 @@ impl ParentSyncPlugin {
3333
}
3434

3535
#[derive(Component, Reflect, Clone, Copy)]
36-
#[reflect(Component, MapEntities, MapEntity)]
36+
#[reflect(Component, MapEntities)]
3737
pub struct ParentSync(pub Entity);
3838

3939
// We need to impl either [`FromWorld`] or [`Default`] so [`SyncParent`] can be registered as [`Reflect`].

0 commit comments

Comments
 (0)