Skip to content

Commit 8580caa

Browse files
committed
destroy player sync entity on disconnect and skip duplicate creation
1 parent d8c1356 commit 8580caa

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

‎src/services/ncl_entities/PlayerEntitySync.cpp‎

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

4748
void 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
}

‎src/services/ncl_entities/PlayerEntitySync.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ class PlayerEntitySync : public sigslot::observer
1010
ServerEventsManager& server_events_manager_;
1111
EntitySync& entity_sync_;
1212

13+
std::unordered_map<ClientId, uint16_t> player_entities_;
14+
1315
public:
1416
explicit PlayerEntitySync(ServerEventsManager& server_events_manager, EntitySync& entity_sync);
1517

1618
private:
1719
void ServerActivatedHandler(ServerActivatedEvent event);
1820
void ClientConnectingHandler(ClientConnectingEvent event);
21+
void ClientDisconnectedHandler(ClientId client);
1922
};
2023

2124
struct PlayerNclEntitySyncService : kgr::single_service<PlayerEntitySync, kgr::dependency<ServerEventsManagerService, EntitySyncService>>

0 commit comments

Comments
 (0)