From 3e4b134faa86dcb7f445fb91557b374e6a331019 Mon Sep 17 00:00:00 2001 From: lotodore Date: Tue, 21 Aug 2007 13:18:18 +0000 Subject: [PATCH] Yessss. Dedicated server is working, with some effort you can now create and join a game (start console server on local pc, start clients and use menu item "internet game"). Make sure to use different player names, there are no error messages yet. More than one game cannot be created yet, but this is only due to no name input. Lots of issues still, don't expect this to be stable. --- src/gui/qt/mainwindow/mainwindowimpl.cpp | 3 +++ src/net/common/clientstate.cpp | 17 ++++++-------- src/net/common/servergamestate.cpp | 29 ++++++++++++------------ src/net/common/servergamethread.cpp | 6 ++--- src/net/common/sessionmanager.cpp | 18 +++++++-------- src/net/servergamethread.h | 2 +- src/net/sessionmanager.h | 4 ++-- 7 files changed, 40 insertions(+), 39 deletions(-) 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: