1818namespace tsom
1919{
2020 NetworkedEntitiesSystem::NetworkedEntitiesSystem (entt::registry& registry, ServerEnvironment& environment) :
21- m_networkedConstructObserver (registry, entt::collector.group<Nz::NodeComponent, NetworkedComponent>(entt::exclude<Nz::DisabledComponent>) ),
21+ m_networkedEntities (registry),
2222 m_registry (registry),
2323 m_environment (environment)
2424 {
25- m_disabledConstructConnection = m_registry.on_construct <Nz::DisabledComponent>().connect <&NetworkedEntitiesSystem::OnNetworkedDestroy>(this );
26- m_networkedDestroyConnection = m_registry.on_destroy <NetworkedComponent>().connect <&NetworkedEntitiesSystem::OnNetworkedDestroy>(this );
27- m_nodeDestroyConnection = m_registry.on_destroy <Nz::NodeComponent>().connect <&NetworkedEntitiesSystem::OnNetworkedDestroy>(this );
28- }
25+ m_networkedEntities.OnEntityAdded .Connect ([&](entt::entity entity)
26+ {
27+ // Handle entities in Update to let all components initialize themselves
28+ m_pendingEntities.emplace (entity);
29+ });
2930
30- NetworkedEntitiesSystem::~NetworkedEntitiesSystem ()
31- {
32- m_networkedConstructObserver.disconnect ();
31+ m_networkedEntities.OnEntityRemove .Connect ([&](entt::entity entity)
32+ {
33+ if (!m_pendingEntities.remove (entity))
34+ {
35+ ForEachVisibility ([&](SessionVisibilityHandler& visibility)
36+ {
37+ visibility.DestroyEntity (entt::handle (m_registry, entity));
38+ });
39+ }
40+ });
3341 }
3442
3543 void NetworkedEntitiesSystem::CreateAllEntities (SessionVisibilityHandler& visibility) const
3644 {
37- for (auto it = m_networkedEntities. begin (); it != m_networkedEntities.end (); ++it )
38- CreateEntity (visibility, entt::handle (m_registry, it. key ()) , BuildCreateEntityData (it. key () ));
45+ for (auto && [entity, entityData] : m_networkedEntities.each () )
46+ CreateEntity (visibility, entt::handle (m_registry, entity) , BuildCreateEntityData (entity ));
3947 }
4048
4149 void NetworkedEntitiesSystem::ForEachVisibility (const Nz::FunctionRef<void (SessionVisibilityHandler& visibility)>& functor)
@@ -48,15 +56,14 @@ namespace tsom
4856
4957 void NetworkedEntitiesSystem::ForgetEntity (entt::entity entity)
5058 {
51- m_networkedEntities.erase (entity);
59+ m_networkedEntities.Remove (entity);
5260 }
5361
54- void NetworkedEntitiesSystem::Update (Nz::Time elapsedTime)
62+ void NetworkedEntitiesSystem::Update (Nz::Time /* elapsedTime*/ )
5563 {
56- m_networkedConstructObserver. each ([&]( entt::entity entity)
64+ for ( entt::entity entity : m_pendingEntities )
5765 {
58- assert (!m_networkedEntities.contains (entity));
59- EntityData& entityData = m_networkedEntities[entity];
66+ EntityData& entityData = m_networkedEntities.Get (entity);
6067
6168 if (ClassInstanceComponent* entityInstance = m_registry.try_get <ClassInstanceComponent>(entity))
6269 {
@@ -96,7 +103,8 @@ namespace tsom
96103 {
97104 CreateEntity (visibility, entt::handle (m_registry, entity), createData);
98105 });
99- });
106+ }
107+ m_pendingEntities.clear ();
100108 }
101109
102110 SessionVisibilityHandler::CreateEntityData NetworkedEntitiesSystem::BuildCreateEntityData (entt::entity entity) const
@@ -159,19 +167,4 @@ namespace tsom
159167 });
160168 }
161169 }
162-
163- void NetworkedEntitiesSystem::OnNetworkedDestroy ([[maybe_unused]] entt::registry& registry, entt::entity entity)
164- {
165- assert (&m_registry == ®istry);
166-
167- if (!m_networkedEntities.contains (entity))
168- return ;
169-
170- m_networkedEntities.erase (entity);
171-
172- ForEachVisibility ([&](SessionVisibilityHandler& visibility)
173- {
174- visibility.DestroyEntity (entt::handle (m_registry, entity));
175- });
176- }
177170}
0 commit comments