diff --git a/src/network/NetworkUser.cpp b/src/network/NetworkUser.cpp index 2966fe0a8d..b9fe9e7d74 100644 --- a/src/network/NetworkUser.cpp +++ b/src/network/NetworkUser.cpp @@ -42,6 +42,7 @@ NetworkUser * NetworkUser::FromJson(json_t * json) if (!json_is_null(jsonGroupId)) { user->GroupId = (uint8)json_integer_value(jsonGroupId); } + user->Remove = false; return user; } return user; @@ -137,8 +138,19 @@ void NetworkUserManager::Save() { auto hashString = std::string(hash); const NetworkUser * networkUser = GetUserByHash(hashString); - networkUser->ToJson(jsonUser); - savedHashes.insert(hashString); + if (networkUser != nullptr) + { + if (networkUser->Remove) + { + json_array_remove(jsonUsers, i); + i--; + } + else + { + networkUser->ToJson(jsonUser); + savedHashes.insert(hashString); + } + } } } @@ -146,7 +158,7 @@ void NetworkUserManager::Save() for (const auto &kvp : _usersByHash) { const NetworkUser * networkUser = kvp.second; - if (savedHashes.find(networkUser->Hash) == savedHashes.end()) + if (!networkUser->Remove && savedHashes.find(networkUser->Hash) == savedHashes.end()) { json_t * jsonUser = networkUser->ToJson(); json_array_append_new(jsonUsers, jsonUser); @@ -170,6 +182,11 @@ void NetworkUserManager::UnsetUsersOfGroup(uint8 groupId) } } +void NetworkUserManager::RemoveUser(const std::string &hash) +{ + _usersByHash[hash]->Remove = true; +} + NetworkUser * NetworkUserManager::GetUserByHash(const std::string &hash) { auto it = _usersByHash.find(hash); diff --git a/src/network/NetworkUser.h b/src/network/NetworkUser.h index f0983cceda..6dcbe33ed4 100644 --- a/src/network/NetworkUser.h +++ b/src/network/NetworkUser.h @@ -29,6 +29,7 @@ public: std::string Hash; std::string Name; Nullable GroupId; + bool Remove; static NetworkUser * FromJson(json_t * json); @@ -52,6 +53,8 @@ public: void Save(); void UnsetUsersOfGroup(uint8 groupId); + void RemoveUser(const std::string &hash); + NetworkUser * GetUserByHash(const std::string &hash); const NetworkUser * GetUserByHash(const std::string &hash) const; const NetworkUser * GetUserByName(const std::string &name) const; diff --git a/src/network/network.cpp b/src/network/network.cpp index 375cc29b71..929b270ac9 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -2704,6 +2704,11 @@ void game_command_kick_player(int *eax, int *ebx, int *ecx, int *edx, int *esi, if (*ebx & GAME_COMMAND_FLAG_APPLY) { if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { gNetwork.KickPlayer(playerid); + + NetworkUserManager * networkUserManager = &gNetwork._userManager; + networkUserManager->Load(); + networkUserManager->RemoveUser(player->keyhash); + networkUserManager->Save(); } } *ebx = 0;