diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index db0fb245..e1d6a4d0 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -921,12 +921,21 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr server) } else if (playersWithCash.size() == 1) { + // Store winner in database. + boost::shared_ptr winnerPlayer = *(playersWithCash.begin()); + boost::shared_ptr tmpPlayer = server->GetPlayerDataByUniqueId(winnerPlayer->getMyUniqueID()); + if (tmpPlayer) + { + cerr << "Setting winner for game " << server->GetDBId() << " player id " << tmpPlayer->GetDBId() << endl; + server->GetLobbyThread().GetDatabase().SetGamePlayerPlace(server->GetDBId(), tmpPlayer->GetDBId(), 1); + } + // View a dialog for a new game - delayed. server->GetStateTimer().expires_from_now( boost::posix_time::seconds(SERVER_DELAY_NEXT_GAME_SEC)); server->GetStateTimer().async_wait( boost::bind( - &ServerGameStateHand::TimerNextGame, this, boost::asio::placeholders::error, server)); + &ServerGameStateHand::TimerNextGame, this, boost::asio::placeholders::error, server, winnerPlayer->getMyUniqueID())); } else { @@ -986,48 +995,22 @@ ServerGameStateHand::TimerNextHand(const boost::system::error_code &ec, boost::s } void -ServerGameStateHand::TimerNextGame(const boost::system::error_code &ec, boost::shared_ptr server) +ServerGameStateHand::TimerNextGame(const boost::system::error_code &ec, boost::shared_ptr server, unsigned winnerPlayerId) { if (!ec && &server->GetState() == this) { - // The game has ended. Notify all clients. - boost::shared_ptr winnerPlayer; - PlayerListIterator i = server->GetGame().getActivePlayerList()->begin(); - PlayerListIterator end = server->GetGame().getActivePlayerList()->end(); - while (i != end) - { - winnerPlayer = *i; - if (winnerPlayer->getMyCash() > 0) - break; - ++i; - } + boost::shared_ptr endGame(new NetPacket(NetPacket::Alloc)); + endGame->GetMsg()->present = PokerTHMessage_PR_endOfGameMessage; + EndOfGameMessage_t *netEndGame = &endGame->GetMsg()->choice.endOfGameMessage; + netEndGame->gameId = server->GetId(); + netEndGame->winnerPlayerId = winnerPlayerId; + server->SendToAllPlayers(endGame, SessionData::Game); - if (winnerPlayer) - { - boost::shared_ptr endGame(new NetPacket(NetPacket::Alloc)); - endGame->GetMsg()->present = PokerTHMessage_PR_endOfGameMessage; - EndOfGameMessage_t *netEndGame = &endGame->GetMsg()->choice.endOfGameMessage; - netEndGame->gameId = server->GetId(); - netEndGame->winnerPlayerId = winnerPlayer->getMyUniqueID(); - server->SendToAllPlayers(endGame, SessionData::Game); - - // Set winner in database. - boost::shared_ptr tmpPlayer = server->GetPlayerDataByUniqueId(winnerPlayer->getMyUniqueID()); - cerr << "Setting winner for game " << server->GetDBId() << " player id " << tmpPlayer->GetDBId() << endl; - if (tmpPlayer) - server->GetLobbyThread().GetDatabase().SetGamePlayerPlace(server->GetDBId(), tmpPlayer->GetDBId(), 1); - - // Wait for the start of a new game. - server->ResetComputerPlayerList(); - server->ResetGame(); - server->GetLobbyThread().NotifyReopeningGame(server->GetId()); - server->SetState(ServerGameStateInit::Instance()); - } - else - { - LOG_ERROR("Game " << server->GetId() << " - Has no winner!"); - server->RemoveAllSessions(); // This is fatal, close this game. - } + // Wait for the start of a new game. + server->ResetComputerPlayerList(); + server->ResetGame(); + server->GetLobbyThread().NotifyReopeningGame(server->GetId()); + server->SetState(ServerGameStateInit::Instance()); } } diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index 931fa914..35d8e4d1 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -145,7 +145,7 @@ protected: void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr server); void TimerComputerAction(const boost::system::error_code &ec, boost::shared_ptr server); void TimerNextHand(const boost::system::error_code &ec, boost::shared_ptr server); - void TimerNextGame(const boost::system::error_code &ec, boost::shared_ptr server); + void TimerNextGame(const boost::system::error_code &ec, boost::shared_ptr server, unsigned winnerPlayerId); int GetDealCardsDelaySec(ServerGame &server); static void StartNewHand(boost::shared_ptr server);