@@ -42,10 +42,13 @@ PlayerEntitySync::PlayerEntitySync(ServerEventsManager& server_events_manager, E
4242{
4343 server_events_manager_.on_server_activated ().connect (&PlayerEntitySync::ServerActivatedHandler, this );
4444 server_events_manager_.on_client_connecting ().connect (&PlayerEntitySync::ClientConnectingHandler, this );
45+ server_events_manager_.on_client_disconnected ().connect (&PlayerEntitySync::ClientDisconnectedHandler, this );
4546}
4647
4748void PlayerEntitySync::ServerActivatedHandler (ServerActivatedEvent event)
4849{
50+ player_entities_.clear ();
51+
4952 EntityTypeDescriptor player_type;
5053 player_type.type_id = static_cast <uint8_t >(EntityTypeId::Player);
5154 player_type.fields = {
@@ -64,5 +67,31 @@ void PlayerEntitySync::ClientConnectingHandler(ClientConnectingEvent event)
6467 return ;
6568 }
6669
67- entity_sync_.Create (static_cast <uint8_t >(EntityTypeId::Player), player_edict, {}, VisibilityReference::BindEdictPAS (player_edict));
70+ auto it = player_entities_.find (event.client_id );
71+ if (it != player_entities_.end () && entity_sync_.Exists (it->second ))
72+ {
73+ return ;
74+ }
75+
76+ uint16_t entity_id =
77+ entity_sync_.Create (static_cast <uint8_t >(EntityTypeId::Player), player_edict, {}, VisibilityReference::BindEdictPAS (player_edict));
78+
79+ if (entity_id == 0 )
80+ {
81+ return ;
82+ }
83+
84+ player_entities_[event.client_id ] = entity_id;
85+ }
86+
87+ void PlayerEntitySync::ClientDisconnectedHandler (ClientId client)
88+ {
89+ auto it = player_entities_.find (client);
90+ if (it == player_entities_.end ())
91+ {
92+ return ;
93+ }
94+
95+ entity_sync_.Destroy (it->second );
96+ player_entities_.erase (it);
6897}
0 commit comments