diff --git a/src/gui/qt/mainwindow/mainwindowimpl.cpp b/src/gui/qt/mainwindow/mainwindowimpl.cpp index 0a05b476..525653fc 100755 --- a/src/gui/qt/mainwindow/mainwindowimpl.cpp +++ b/src/gui/qt/mainwindow/mainwindowimpl.cpp @@ -824,6 +824,9 @@ void mainWindowImpl::callGameLobbyDialog() { if (myGameLobbyDialog->result() == QDialog::Accepted) { + myStartNetworkGameDialog->setSession(&getSession()); + myStartNetworkGameDialog->treeWidget->clear(); + showNetworkStartDialog(); } } diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 06d70b6e..26088aac 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -433,7 +433,6 @@ int ClientStateWaitSession::InternalProcess(ClientThread &client, boost::shared_ptr packet) { int retVal = MSG_SOCK_INTERNAL_PENDING; - ClientContext &context = client.GetContext(); if (packet->ToNetPacketInitAck()) { @@ -442,12 +441,6 @@ ClientStateWaitSession::InternalProcess(ClientThread &client, boost::shared_ptr< packet->ToNetPacketInitAck()->GetData(initAckData); client.SetGuiPlayerId(initAckData.playerId); - // Player number is 0 on init. Will be set when the game starts. - boost::shared_ptr playerData( - new PlayerData(initAckData.playerId, 0, PLAYER_TYPE_HUMAN, PLAYER_RIGHTS_NORMAL)); - playerData->SetName(context.GetPlayerName()); - client.AddPlayerData(playerData); - client.SetState(ClientStateWaitJoin::Instance()); retVal = MSG_SOCK_SESSION_DONE; } @@ -476,6 +469,7 @@ int ClientStateWaitJoin::InternalProcess(ClientThread &client, boost::shared_ptr packet) { int retVal = MSG_SOCK_INTERNAL_PENDING; + ClientContext &context = client.GetContext(); if (packet->ToNetPacketGameListNew()) { @@ -490,9 +484,12 @@ ClientStateWaitJoin::InternalProcess(ClientThread &client, boost::shared_ptrToNetPacketJoinGameAck()->GetData(joinGameAckData); client.SetGameData(joinGameAckData.gameData); - boost::shared_ptr tmpPlayer = client.GetPlayerDataByUniqueId(client.GetGuiPlayerId()); - assert(tmpPlayer.get()); - tmpPlayer->SetRights(joinGameAckData.prights); + + // Player number is 0 on init. Will be set when the game starts. + boost::shared_ptr playerData( + new PlayerData(client.GetGuiPlayerId(), 0, PLAYER_TYPE_HUMAN, joinGameAckData.prights)); + playerData->SetName(context.GetPlayerName()); + client.AddPlayerData(playerData); client.SetState(ClientStateWaitGame::Instance()); retVal = MSG_NET_GAME_CLIENT_JOIN; diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 3c033c5c..92616710 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -62,7 +62,7 @@ static void SendPlayerAction(ServerGameThread &server, boost::shared_ptrgetMySet(); actionDoneData.playerMoney = player->getMyCash(); static_cast(notifyActionDone.get())->SetData(actionDoneData); - server.SendToAllPlayers(notifyActionDone); + server.SendToAllPlayers(notifyActionDone, SessionData::Game); } static void SendNewRoundCards(ServerGameThread &server, Game &curGame, int state) @@ -81,7 +81,7 @@ static void SendNewRoundCards(ServerGameThread &server, Game &curGame, int state for (int num = 0; num < 3; num++) notifyCardsData.flopCards[num] = static_cast(cards[num]); static_cast(notifyCards.get())->SetData(notifyCardsData); - server.SendToAllPlayers(notifyCards); + server.SendToAllPlayers(notifyCards, SessionData::Game); } break; case GAME_STATE_TURN: { // deal turn card @@ -91,7 +91,7 @@ static void SendNewRoundCards(ServerGameThread &server, Game &curGame, int state NetPacketDealTurnCard::Data notifyCardsData; notifyCardsData.turnCard = static_cast(cards[3]); static_cast(notifyCards.get())->SetData(notifyCardsData); - server.SendToAllPlayers(notifyCards); + server.SendToAllPlayers(notifyCards, SessionData::Game); } break; case GAME_STATE_RIVER: { // deal river card @@ -101,7 +101,7 @@ static void SendNewRoundCards(ServerGameThread &server, Game &curGame, int state NetPacketDealRiverCard::Data notifyCardsData; notifyCardsData.riverCard = static_cast(cards[4]); static_cast(notifyCards.get())->SetData(notifyCardsData); - server.SendToAllPlayers(notifyCards); + server.SendToAllPlayers(notifyCards, SessionData::Game); } break; default: { // @@ -163,7 +163,7 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server) outChatData.playerId = session.playerData->GetUniqueId(); outChatData.text = inChatData.text; static_cast(outChat.get())->SetData(outChatData); - server.SendToAllPlayers(outChat); + server.SendToAllPlayers(outChat, SessionData::Game); } } else @@ -255,7 +255,7 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s } // Send "Player Joined" to other fully connected clients. - server.SendToAllPlayers(CreateNetPacketPlayerJoined(*session.playerData)); + server.SendToAllPlayers(CreateNetPacketPlayerJoined(*session.playerData), SessionData::Game); // Session is now in game state. session.sessionData->SetState(SessionData::Game); @@ -381,7 +381,7 @@ ServerGameStateStartGame::Process(ServerGameThread &server) static_cast(answer.get())->SetData(gameStartData); - server.SendToAllPlayers(answer); + server.SendToAllPlayers(answer, SessionData::Game); server.SetState(ServerGameStateStartHand::Instance()); return MSG_NET_GAME_SERVER_START; @@ -458,7 +458,7 @@ ServerGameStateStartHand::Process(ServerGameThread &server) actionDoneData.totalPlayerBet = playerArray[i]->getMySet(); actionDoneData.playerMoney = playerArray[i]->getMyCash(); static_cast(notifySmallBlind.get())->SetData(actionDoneData); - server.SendToAllPlayers(notifySmallBlind); + server.SendToAllPlayers(notifySmallBlind, SessionData::Game); break; } } @@ -474,7 +474,7 @@ ServerGameStateStartHand::Process(ServerGameThread &server) actionDoneData.totalPlayerBet = playerArray[i]->getMySet(); actionDoneData.playerMoney = playerArray[i]->getMyCash(); static_cast(notifyBigBlind.get())->SetData(actionDoneData); - server.SendToAllPlayers(notifyBigBlind); + server.SendToAllPlayers(notifyBigBlind, SessionData::Game); break; } } @@ -550,7 +550,7 @@ ServerGameStateStartRound::Process(ServerGameThread &server) ++i; } static_cast(allIn.get())->SetData(allInData); - server.SendToAllPlayers(allIn); + server.SendToAllPlayers(allIn, SessionData::Game); curGame.getCurrentHand()->setCardsShown(true); server.SetState(ServerGameStateShowCardsDelay::Instance()); @@ -581,7 +581,7 @@ ServerGameStateStartRound::Process(ServerGameThread &server) playersTurnData.playerId = curPlayer->getMyUniqueID(); static_cast(notification.get())->SetData(playersTurnData); - server.SendToAllPlayers(notification); + server.SendToAllPlayers(notification, SessionData::Game); server.SetState(ServerGameStateWaitPlayerAction::Instance()); @@ -607,7 +607,7 @@ ServerGameStateStartRound::Process(ServerGameThread &server) endHandData.playerMoney = player->getMyCash(); static_cast(endHand.get())->SetData(endHandData); - server.SendToAllPlayers(endHand); + server.SendToAllPlayers(endHand, SessionData::Game); } else { @@ -642,7 +642,7 @@ ServerGameStateStartRound::Process(ServerGameThread &server) } static_cast(endHand.get())->SetData(endHandData); - server.SendToAllPlayers(endHand); + server.SendToAllPlayers(endHand, SessionData::Game); } // Remove disconnected players. This is the one and only place to do this. @@ -655,6 +655,7 @@ ServerGameStateStartRound::Process(ServerGameThread &server) if (curGame.getCurrentHand()->getPlayerArray()[i]->getMyCash() > 0) playersPositiveCashCounter++; } + // TODO: this is not an assert - terminate game if true. assert(playersPositiveCashCounter); if (playersPositiveCashCounter == 1) { @@ -1019,7 +1020,7 @@ ServerGameStateNextGameDelay::Process(ServerGameThread &server) endGameData.winnerPlayerId = winnerPlayer->getMyUniqueID(); static_cast(endGame.get())->SetData(endGameData); - server.SendToAllPlayers(endGame); + server.SendToAllPlayers(endGame, SessionData::Game); // Wait for the start of a new game. server.SetState(ServerGameStateInit::Instance()); diff --git a/src/net/common/servergamethread.cpp b/src/net/common/servergamethread.cpp index 3dc3c959..92c26e83 100644 --- a/src/net/common/servergamethread.cpp +++ b/src/net/common/servergamethread.cpp @@ -96,9 +96,9 @@ ServerGameThread::GetCurRound() const } void -ServerGameThread::SendToAllPlayers(boost::shared_ptr packet) +ServerGameThread::SendToAllPlayers(boost::shared_ptr packet, SessionData::State state) { - GetSessionManager().SendToAllSessions(GetSender(), packet); + GetSessionManager().SendToAllSessions(GetSender(), packet, state); } void @@ -224,7 +224,7 @@ ServerGameThread::CloseSessionDelayed(SessionWrapper session) NetPacketPlayerLeft::Data thisPlayerLeftData; thisPlayerLeftData.playerId = tmpPlayerData->GetUniqueId(); static_cast(thisPlayerLeft.get())->SetData(thisPlayerLeftData); - GetSessionManager().SendToAllSessions(GetSender(), thisPlayerLeft); + GetSessionManager().SendToAllSessions(GetSender(), thisPlayerLeft, SessionData::Game); GetCallback().SignalNetServerPlayerLeft(tmpPlayerData->GetName()); } diff --git a/src/net/common/sessionmanager.cpp b/src/net/common/sessionmanager.cpp index ca41fb05..3410b48c 100644 --- a/src/net/common/sessionmanager.cpp +++ b/src/net/common/sessionmanager.cpp @@ -144,7 +144,7 @@ SessionManager::GetSessionByPlayerName(const string playerName) const while (session_i != session_end) { // Check all players which are fully connected. - if (session_i->second.sessionData->GetState() == SessionData::Established) + if (session_i->second.sessionData->GetState() != SessionData::Init) { boost::shared_ptr tmpPlayer(session_i->second.playerData); assert(tmpPlayer.get()); @@ -172,7 +172,7 @@ SessionManager::GetSessionByUniquePlayerId(unsigned uniqueId) const while (session_i != session_end) { // Check all players which are fully connected. - if (session_i->second.sessionData->GetState() == SessionData::Established) + if (session_i->second.sessionData->GetState() != SessionData::Init) { boost::shared_ptr tmpPlayer(session_i->second.playerData); assert(tmpPlayer.get()); @@ -199,8 +199,8 @@ SessionManager::GetPlayerDataList() const while (session_i != session_end) { - // Get all players which are fully connected. - if (session_i->second.sessionData->GetState() == SessionData::Established) + // Get all players in the game. + if (session_i->second.sessionData->GetState() == SessionData::Game) { boost::shared_ptr tmpPlayer(session_i->second.playerData); assert(tmpPlayer.get()); @@ -255,7 +255,7 @@ SessionManager::GetRawSessionCount() } void -SessionManager::SendToAllSessions(SenderThread &sender, boost::shared_ptr packet) +SessionManager::SendToAllSessions(SenderThread &sender, boost::shared_ptr packet, SessionData::State state) { boost::mutex::scoped_lock lock(m_sessionMapMutex); @@ -266,15 +266,15 @@ SessionManager::SendToAllSessions(SenderThread &sender, boost::shared_ptrsecond.sessionData.get()); - // Send each fully connected client a copy of the packet. - if (i->second.sessionData->GetState() == SessionData::Established) + // Send each client (with a certain state) a copy of the packet. + if (i->second.sessionData->GetState() == state) sender.Send(i->first, boost::shared_ptr(packet->Clone())); ++i; } } void -SessionManager::SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr packet, SOCKET except) +SessionManager::SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr packet, SOCKET except, SessionData::State state) { boost::mutex::scoped_lock lock(m_sessionMapMutex); @@ -284,7 +284,7 @@ SessionManager::SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr< while (i != end) { // Send each fully connected client but one a copy of the packet. - if (i->second.sessionData->GetState() == SessionData::Established) + if (i->second.sessionData->GetState() == state) if (i->first != except) sender.Send(i->first, boost::shared_ptr(packet->Clone())); ++i; diff --git a/src/net/servergamethread.h b/src/net/servergamethread.h index 6909c9aa..6f1090f6 100644 --- a/src/net/servergamethread.h +++ b/src/net/servergamethread.h @@ -55,7 +55,7 @@ public: ServerCallback &GetCallback(); GameState GetCurRound() const; - void SendToAllPlayers(boost::shared_ptr packet); + void SendToAllPlayers(boost::shared_ptr packet, SessionData::State state); bool CheckPassword(const std::string &password) const; const GameData &GetGameData() const; diff --git a/src/net/sessionmanager.h b/src/net/sessionmanager.h index f6955a9e..7a5c03bb 100644 --- a/src/net/sessionmanager.h +++ b/src/net/sessionmanager.h @@ -62,8 +62,8 @@ public: void Clear(); unsigned GetRawSessionCount(); - void SendToAllSessions(SenderThread &sender, boost::shared_ptr packet); - void SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr packet, SOCKET except); + void SendToAllSessions(SenderThread &sender, boost::shared_ptr packet, SessionData::State state); + void SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr packet, SOCKET except, SessionData::State state); protected: