diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 83ae9510..cdb31987 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -318,11 +318,9 @@ ServerGameStateInit::HandleNewSession(boost::shared_ptr server, Sess { if (session.sessionData && session.playerData) { - size_t curNumPlayers = server->GetCurNumberOfPlayers(); - const GameData &tmpGameData = server->GetGameData(); // Check the number of players. - if (curNumPlayers >= (size_t)tmpGameData.maxNumberOfPlayers) + if (server->GetCurNumberOfPlayers() >= (size_t)tmpGameData.maxNumberOfPlayers) { server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL); } @@ -364,6 +362,12 @@ ServerGameStateInit::HandleNewSession(boost::shared_ptr server, Sess // Notify lobby. server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), session.playerData->GetUniqueId()); + + if (server->GetCurNumberOfPlayers() == (size_t)tmpGameData.maxNumberOfPlayers) + { + // Automatically start the game if it is full. + SendStartEvent(*server, false); + } } } } @@ -425,6 +429,44 @@ ServerGameStateInit::TimerAdminTimeout(const boost::system::error_code &ec, boos } } +void +ServerGameStateInit::SendStartEvent(ServerGame &server, bool fillWithComputerPlayers) +{ + // Fill up with computer players. + server.ResetComputerPlayerList(); + + if (fillWithComputerPlayers) + { + int remainingSlots = server.GetGameData().maxNumberOfPlayers - server.GetCurNumberOfPlayers(); + for (int i = 1; i <= remainingSlots; i++) + { + boost::shared_ptr tmpPlayerData( + new PlayerData(server.GetLobbyThread().GetNextUniquePlayerId(), 0, PLAYER_TYPE_COMPUTER, PLAYER_RIGHTS_NORMAL, false)); + + ostringstream name; + name << SERVER_COMPUTER_PLAYER_NAME << i; + tmpPlayerData->SetName(name.str()); + server.AddComputerPlayer(tmpPlayerData); + + // Send "Player Joined" to other fully connected clients. + server.SendToAllPlayers(CreateNetPacketPlayerJoined(server.GetId(), *tmpPlayerData), SessionData::Game); + + // Notify lobby. + server.GetLobbyThread().NotifyPlayerJoinedGame(server.GetId(), tmpPlayerData->GetUniqueId()); + } + } + boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); + packet->GetMsg()->present = PokerTHMessage_PR_startEventMessage; + StartEventMessage_t *netStartEvent = &packet->GetMsg()->choice.startEventMessage; + netStartEvent->gameId = server.GetId(); + netStartEvent->fillWithComputerPlayers = fillWithComputerPlayers; + + // Wait for all players to confirm start of game. + server.SendToAllPlayers(packet, SessionData::Game); + + server.SetState(ServerGameStateStartGame::Instance()); +} + void ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) { @@ -434,33 +476,7 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, // Only admins are allowed to start the game. if (session.playerData->IsGameAdmin() && netStartEvent->gameId == server->GetId()) { - // Fill up with computer players. - server->ResetComputerPlayerList(); - - if (netStartEvent->fillWithComputerPlayers) - { - int remainingSlots = server->GetGameData().maxNumberOfPlayers - server->GetCurNumberOfPlayers(); - for (int i = 1; i <= remainingSlots; i++) - { - boost::shared_ptr tmpPlayerData( - new PlayerData(server->GetLobbyThread().GetNextUniquePlayerId(), 0, PLAYER_TYPE_COMPUTER, PLAYER_RIGHTS_NORMAL, false)); - - ostringstream name; - name << SERVER_COMPUTER_PLAYER_NAME << i; - tmpPlayerData->SetName(name.str()); - server->AddComputerPlayer(tmpPlayerData); - - // Send "Player Joined" to other fully connected clients. - server->SendToAllPlayers(CreateNetPacketPlayerJoined(server->GetId(), *tmpPlayerData), SessionData::Game); - - // Notify lobby. - server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), tmpPlayerData->GetUniqueId()); - } - } - // Wait for all players to confirm start of game. - server->SendToAllPlayers(packet, SessionData::Game); - - server->SetState(ServerGameStateStartGame::Instance()); + SendStartEvent(*server, netStartEvent->fillWithComputerPlayers); } } else if (packet->GetMsg()->present == PokerTHMessage_PR_invitePlayerToGameMessage) diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index 4dc57ef0..174bd84c 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -89,6 +89,7 @@ protected: void UnregisterAdminTimer(boost::shared_ptr server); void TimerAdminWarning(const boost::system::error_code &ec, boost::shared_ptr server); void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr server); + void SendStartEvent(ServerGame &server, bool fillWithComputerPlayers); virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet);