From 29c4c80ddf6677a3bc653458d66143997f20b792 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Fri, 11 Mar 2011 15:35:31 +0100 Subject: [PATCH] server crash fix --- common/server_game.cpp | 32 +++++++++++++++++-------------- common/server_game.h | 1 + common/server_protocolhandler.cpp | 1 + 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/common/server_game.cpp b/common/server_game.cpp index 5bd071cf..92501dfe 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -210,7 +210,25 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec void Server_Game::removePlayer(Server_Player *player) { players.remove(player->getPlayerId()); + removeArrowsToPlayer(player); + sendGameEvent(new Event_Leave(player->getPlayerId())); + bool playerActive = activePlayer == player->getPlayerId(); + bool spectator = player->getSpectator(); + delete player; + + if (!getPlayerCount()) + deleteLater(); + else if (!spectator) { + stopGameIfFinished(); + if (gameStarted && playerActive) + nextTurn(); + } + qobject_cast(parent())->broadcastGameListUpdate(this); +} + +void Server_Game::removeArrowsToPlayer(Server_Player *player) +{ // Remove all arrows of other players pointing to the player being removed or to one of his cards. QMapIterator playerIterator(players); while (playerIterator.hasNext()) { @@ -231,20 +249,6 @@ void Server_Game::removePlayer(Server_Player *player) p->deleteArrow(toDelete[i]->getId()); } } - - sendGameEvent(new Event_Leave(player->getPlayerId())); - bool playerActive = activePlayer == player->getPlayerId(); - bool spectator = player->getSpectator(); - delete player; - - if (!getPlayerCount()) - deleteLater(); - else if (!spectator) { - stopGameIfFinished(); - if (gameStarted && playerActive) - nextTurn(); - } - qobject_cast(parent())->broadcastGameListUpdate(this); } bool Server_Game::kickPlayer(int playerId) diff --git a/common/server_game.h b/common/server_game.h index 991df2e4..02e8ffdb 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -75,6 +75,7 @@ public: ResponseCode checkJoin(ServerInfo_User *user, const QString &_password, bool spectator); Server_Player *addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate = true); void removePlayer(Server_Player *player); + void removeArrowsToPlayer(Server_Player *player); bool kickPlayer(int playerId); void startGameIfReady(); void stopGameIfFinished(); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 39ce73a8..36cb4831 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -518,6 +518,7 @@ ResponseCode Server_ProtocolHandler::cmdConcede(Command_Concede * /*cmd*/, Comma return RespContextError; player->setConceded(true); + game->removeArrowsToPlayer(player); player->clearZones(); game->sendGameEvent(new Event_PlayerPropertiesChanged(player->getPlayerId(), player->getProperties()), new Context_Concede); game->stopGameIfFinished();