diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index d09aa757..38e531e5 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -837,7 +837,7 @@ ServerGame::ResetComputerPlayerList() while (i != end) { GetLobbyThread().RemoveComputerPlayer(*i); - RemovePlayerData(*i, NTF_NET_REMOVED_ON_REQUEST); + RemovePlayerData(*i, NTF_NET_REMOVED_ON_REQUEST, false); ++i; } @@ -853,13 +853,13 @@ ServerGame::RemoveSession(boost::shared_ptr session, int reason) if (GetSessionManager().RemoveSession(session->GetId())) { boost::shared_ptr tmpPlayerData = session->GetPlayerData(); if (tmpPlayerData && !tmpPlayerData->GetName().empty()) { - RemovePlayerData(tmpPlayerData, reason); + RemovePlayerData(tmpPlayerData, reason, session->GetState() == SessionData::Spectating || session->GetState() == SessionData::SpectatorWaiting); } } } void -ServerGame::RemovePlayerData(boost::shared_ptr player, int reason) +ServerGame::RemovePlayerData(boost::shared_ptr player, int reason, bool spectateOnly) { if (player->IsGameAdmin()) { // Find new admin for the game @@ -886,25 +886,37 @@ ServerGame::RemovePlayerData(boost::shared_ptr player, int reason) // Send "Player Left" to clients. boost::shared_ptr thisPlayerLeft(new NetPacket); - thisPlayerLeft->GetMsg()->set_messagetype(PokerTHMessage::Type_GamePlayerLeftMessage); - GamePlayerLeftMessage *netPlayerLeft = thisPlayerLeft->GetMsg()->mutable_gameplayerleftmessage(); - netPlayerLeft->set_gameid(GetId()); - netPlayerLeft->set_playerid(player->GetUniqueId()); + GamePlayerLeftMessage::GamePlayerLeftReason netReason = GamePlayerLeftMessage::leftError; switch (reason) { case NTF_NET_REMOVED_ON_REQUEST : - netPlayerLeft->set_gameplayerleftreason(GamePlayerLeftMessage::leftOnRequest); + netReason = GamePlayerLeftMessage::leftOnRequest; break; case NTF_NET_REMOVED_KICKED : - netPlayerLeft->set_gameplayerleftreason(GamePlayerLeftMessage::leftKicked); - break; - default : - netPlayerLeft->set_gameplayerleftreason(GamePlayerLeftMessage::leftError); + netReason = GamePlayerLeftMessage::leftKicked; break; } + + if (spectateOnly) { + thisPlayerLeft->GetMsg()->set_messagetype(PokerTHMessage::Type_GameSpectatorLeftMessage); + GameSpectatorLeftMessage *netPlayerLeft = thisPlayerLeft->GetMsg()->mutable_gamespectatorleftmessage(); + netPlayerLeft->set_gameid(GetId()); + netPlayerLeft->set_playerid(player->GetUniqueId()); + netPlayerLeft->set_gamespectatorleftreason(netReason); + } else { + thisPlayerLeft->GetMsg()->set_messagetype(PokerTHMessage::Type_GamePlayerLeftMessage); + GamePlayerLeftMessage *netPlayerLeft = thisPlayerLeft->GetMsg()->mutable_gameplayerleftmessage(); + netPlayerLeft->set_gameid(GetId()); + netPlayerLeft->set_playerid(player->GetUniqueId()); + netPlayerLeft->set_gameplayerleftreason(netReason); + } GetSessionManager().SendToAllSessions(GetLobbyThread().GetSender(), thisPlayerLeft, SessionData::Game); GetState().NotifySessionRemoved(shared_from_this()); - GetLobbyThread().NotifyPlayerLeftGame(GetId(), player->GetUniqueId()); + if (spectateOnly) { + GetLobbyThread().NotifySpectatorLeftGame(GetId(), player->GetUniqueId()); + } else { + GetLobbyThread().NotifyPlayerLeftGame(GetId(), player->GetUniqueId()); + } } void diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 8bcb8af7..491937c4 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -874,7 +874,7 @@ AbstractServerGameStateRunning::HandleNewSpectator(boost::shared_ptr { if (session && session->GetPlayerData()) { AcceptNewSession(server, session, true); - session->SetState(SessionData::Waiting); + session->SetState(SessionData::SpectatorWaiting); server->AddNewSpectator(session->GetPlayerData()->GetUniqueId()); } } diff --git a/src/net/servergame.h b/src/net/servergame.h index 16a8b694..43dfab0b 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -159,7 +159,7 @@ protected: void ResetComputerPlayerList(); void RemoveSession(boost::shared_ptr session, int reason); - void RemovePlayerData(boost::shared_ptr player, int reason); + void RemovePlayerData(boost::shared_ptr player, int reason, bool spectateOnly); void SessionError(boost::shared_ptr session, int errorCode); void MoveSessionToLobby(boost::shared_ptr session, int reason); diff --git a/src/net/sessiondata.h b/src/net/sessiondata.h index 1b3edba3..17cd25c5 100644 --- a/src/net/sessiondata.h +++ b/src/net/sessiondata.h @@ -58,7 +58,7 @@ class ServerGame; class SessionData : public boost::enable_shared_from_this { public: - enum State { Init = 1, ReceivingAvatar = 2, Established = 4, Game = 8, Spectating = 16, Waiting = 32, Closed = 64 }; + enum State { Init = 1, ReceivingAvatar = 2, Established = 4, Game = 8, Spectating = 16, GameWaiting = 32, SpectatorWaiting = 64, Closed = 128 }; SessionData(boost::shared_ptr sock, SessionId id, SessionDataCallback &cb, boost::asio::io_service &ioService); ~SessionData();