fix not removing client when disconnecting them

This commit is contained in:
Lion Kortlepel
2022-11-25 14:40:21 +01:00
parent b1a89125fe
commit 7316dff519
3 changed files with 11 additions and 0 deletions

View File

@@ -40,6 +40,7 @@ public:
void InsertClient(const std::shared_ptr<TClient>& Ptr);
void RemoveClient(const std::weak_ptr<TClient>&);
void RemoveClientById(int Id);
// in Fn, return true to continue, return false to break
[[deprecated("use ForEachClient instead")]] void ForEachClientWeak(const std::function<bool(std::weak_ptr<TClient>)>& Fn);
// in Fn, return Break or Continue

View File

@@ -74,6 +74,7 @@ void TClient::Disconnect(std::string_view Reason) {
if (ec) {
beammp_debugf("Failed to close client socket: {}", ec.message());
}
mServer.RemoveClientById(GetID());
}
void TClient::SetCarPosition(int Ident, const std::string& Data) {

View File

@@ -190,6 +190,15 @@ void TServer::RemoveClient(const std::weak_ptr<TClient>& WeakClientPtr) {
mClients.erase(WeakClientPtr.lock());
}
void TServer::RemoveClientById(int Id) {
auto Client = GetClient(*this, Id);
WriteLock Lock(mClientsMutex);
if (Client) {
Client->ClearCars();
mClients.erase(Client);
}
}
void TServer::ForEachClientWeak(const std::function<bool(std::weak_ptr<TClient>)>& Fn) {
decltype(mClients) Clients;
{