Adding feature to leave a game as spectator.

This commit is contained in:
lotodore
2013-08-11 13:25:26 +02:00
parent be0f363af4
commit 7b305b36e2
4 changed files with 28 additions and 16 deletions
+25 -13
View File
@@ -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<SessionData> session, int reason)
if (GetSessionManager().RemoveSession(session->GetId())) {
boost::shared_ptr<PlayerData> 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<PlayerData> player, int reason)
ServerGame::RemovePlayerData(boost::shared_ptr<PlayerData> player, int reason, bool spectateOnly)
{
if (player->IsGameAdmin()) {
// Find new admin for the game
@@ -886,25 +886,37 @@ ServerGame::RemovePlayerData(boost::shared_ptr<PlayerData> player, int reason)
// Send "Player Left" to clients.
boost::shared_ptr<NetPacket> 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