diff --git a/client/source/network/ClientCommandHandler.cpp b/client/source/network/ClientCommandHandler.cpp index 5c1ec6114..f62cc8e0f 100644 --- a/client/source/network/ClientCommandHandler.cpp +++ b/client/source/network/ClientCommandHandler.cpp @@ -119,6 +119,15 @@ void ClientCommandHandler::sendChatMessage(const std::string &message) { } void ClientCommandHandler::setupCallbacks() { + m_client.setCommandCallback(Network::Command::ClientDisconnect, [this](sf::Packet &packet) { + u16 clientID; + packet >> clientID; + + auto it = m_playerBoxes.find(clientID); + if (it != m_playerBoxes.end()) + m_playerBoxes.erase(it); + }); + m_client.setCommandCallback(Network::Command::RegistryData, [this](sf::Packet &packet) { // FIXME: This is a quick fix for concurrency between client and server in singleplayer if (!m_isSingleplayer) @@ -157,8 +166,11 @@ void ClientCommandHandler::setupCallbacks() { packet >> x >> y >> z; packet >> isTeleportation; - if (clientId != m_client.id()) - m_playerBoxes.at(clientId).setPosition(x, y, z); + if (clientId != m_client.id()) { + auto it = m_playerBoxes.find(clientId); + if (it != m_playerBoxes.end()) + it->second.setPosition(x, y, z); + } else if (isTeleportation) { m_player.setPosition(x, y, z); } diff --git a/server/source/network/Server.cpp b/server/source/network/Server.cpp index 365917348..4021a4050 100644 --- a/server/source/network/Server.cpp +++ b/server/source/network/Server.cpp @@ -156,6 +156,12 @@ void Server::handleClientMessages() { } void Server::disconnectClient(ClientInfo &client) { + sf::Packet packet; + packet << Network::Command::ClientDisconnect << client.id; + sendToAllClients(packet); + + m_commands[Network::Command::ClientDisconnect](client, packet); + m_selector.remove(*client.tcpSocket); m_info.removeClient(client.id); diff --git a/server/source/network/ServerCommandHandler.cpp b/server/source/network/ServerCommandHandler.cpp index bd0ee46fb..dde4daebd 100644 --- a/server/source/network/ServerCommandHandler.cpp +++ b/server/source/network/ServerCommandHandler.cpp @@ -126,7 +126,9 @@ void ServerCommandHandler::setupCallbacks() { }); m_server.setCommandCallback(Network::Command::ClientDisconnect, [this](ClientInfo &client, sf::Packet &) { - m_players.erase(client.id); + auto it = m_players.find(client.id); + if (it != m_players.end()) + m_players.erase(it); }); m_server.setCommandCallback(Network::Command::ChunkRequest, [this](ClientInfo &client, sf::Packet &packet) {