Work on spectator mode - joining as spectator now possible (on server side).

This commit is contained in:
lotodore
2013-06-29 16:23:10 +02:00
parent cbd6b40f85
commit ef489dae8a
12 changed files with 732 additions and 118 deletions
+106 -59
View File
@@ -102,7 +102,7 @@ static void SendPlayerAction(ServerGame &server, boost::shared_ptr<PlayerInterfa
netActionDone->set_playerid(player->getMyUniqueID());
netActionDone->set_playermoney(player->getMyCash());
netActionDone->set_totalplayerbet(player->getMySet());
server.SendToAllPlayers(packet, SessionData::Game);
server.SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
}
static void SendNewRoundCards(ServerGame &server, Game &curGame, int state)
@@ -122,7 +122,7 @@ static void SendNewRoundCards(ServerGame &server, Game &curGame, int state)
netDealFlop->set_flopcard1(cards[0]);
netDealFlop->set_flopcard2(cards[1]);
netDealFlop->set_flopcard3(cards[2]);
server.SendToAllPlayers(packet, SessionData::Game);
server.SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
}
break;
case GAME_STATE_TURN: {
@@ -132,7 +132,7 @@ static void SendNewRoundCards(ServerGame &server, Game &curGame, int state)
DealTurnCardMessage *netDealTurn = packet->GetMsg()->mutable_dealturncardmessage();
netDealTurn->set_gameid(server.GetId());
netDealTurn->set_turncard(cards[3]);
server.SendToAllPlayers(packet, SessionData::Game);
server.SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
}
break;
case GAME_STATE_RIVER: {
@@ -142,7 +142,7 @@ static void SendNewRoundCards(ServerGame &server, Game &curGame, int state)
DealRiverCardMessage *netDealRiver = packet->GetMsg()->mutable_dealrivercardmessage();
netDealRiver->set_gameid(server.GetId());
netDealRiver->set_rivercard(cards[4]);
server.SendToAllPlayers(packet, SessionData::Game);
server.SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
}
break;
default: {
@@ -286,7 +286,7 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> se
netChat->set_playerid(session->GetPlayerData()->GetUniqueId());
netChat->set_chattype(ChatMessage::chatTypeGame);
netChat->set_chattext(netChatRequest.chattext());
server->SendToAllPlayers(packet, SessionData::Game);
server->SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
chatSent = true;
// Send the message to the chat cleaner bot for ranking games.
@@ -410,6 +410,37 @@ AbstractServerGameStateReceiving::CreateNetPacketJoinGameAck(const ServerGame &s
return packet;
}
boost::shared_ptr<NetPacket>
AbstractServerGameStateReceiving::CreateNetPacketHandStart(const ServerGame &server)
{
const Game &curGame = server.GetGame();
boost::shared_ptr<NetPacket> notifyCards(new NetPacket);
notifyCards->GetMsg()->set_messagetype(PokerTHMessage::Type_HandStartMessage);
HandStartMessage *netHandStart = notifyCards->GetMsg()->mutable_handstartmessage();
netHandStart->set_gameid(server.GetId());
PlayerListIterator player_i = curGame.getSeatsList()->begin();
PlayerListIterator player_end = curGame.getSeatsList()->end();
int playerCounter = 0;
while (player_i != player_end && playerCounter < server.GetStartData().numberOfPlayers) {
NetPlayerState seatState;
if (!(*player_i)->getMyActiveStatus()) {
seatState = netPlayerStateNoMoney;
} else if (!(*player_i)->isSessionActive()) {
seatState = netPlayerStateSessionInactive;
} else {
seatState = netPlayerStateNormal;
}
netHandStart->add_seatstates(seatState);
++player_i;
++playerCounter;
}
netHandStart->set_smallblind(curGame.getCurrentHand()->getSmallBlind());
return notifyCards;
}
void
AbstractServerGameStateReceiving::AcceptNewSession(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session, bool spectateOnly)
{
@@ -430,9 +461,9 @@ AbstractServerGameStateReceiving::AcceptNewSession(boost::shared_ptr<ServerGame>
// Send "Player Joined"/"Spectator Joined" to other fully connected clients.
if (spectateOnly) {
server->SendToAllPlayers(CreateNetPacketSpectatorJoined(server->GetId(), *session->GetPlayerData()), SessionData::Game);
server->SendToAllPlayers(CreateNetPacketSpectatorJoined(server->GetId(), *session->GetPlayerData()), SessionData::Game | SessionData::Spectating);
} else {
server->SendToAllPlayers(CreateNetPacketPlayerJoined(server->GetId(), *session->GetPlayerData()), SessionData::Game);
server->SendToAllPlayers(CreateNetPacketPlayerJoined(server->GetId(), *session->GetPlayerData()), SessionData::Game | SessionData::Spectating);
}
// Accept session.
@@ -513,6 +544,9 @@ ServerGameStateInit::HandleNewPlayer(boost::shared_ptr<ServerGame> server, boost
void
ServerGameStateInit::HandleNewSpectator(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session)
{
if (session && session->GetPlayerData()) {
AcceptNewSession(server, session, true);
}
}
void
@@ -613,7 +647,7 @@ ServerGameStateInit::SendStartEvent(ServerGame &server, bool fillWithComputerPla
server.AddComputerPlayer(tmpPlayerData);
// Send "Player Joined" to other fully connected clients.
server.SendToAllPlayers(CreateNetPacketPlayerJoined(server.GetId(), *tmpPlayerData), SessionData::Game);
server.SendToAllPlayers(CreateNetPacketPlayerJoined(server.GetId(), *tmpPlayerData), SessionData::Game | SessionData::Spectating);
// Notify lobby.
server.GetLobbyThread().NotifyPlayerJoinedGame(server.GetId(), tmpPlayerData->GetUniqueId());
@@ -735,6 +769,9 @@ ServerGameStateStartGame::HandleNewPlayer(boost::shared_ptr<ServerGame> server,
void
ServerGameStateStartGame::HandleNewSpectator(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session)
{
if (session && session->GetPlayerData()) {
AcceptNewSession(server, session, false);
}
}
void
@@ -789,7 +826,7 @@ ServerGameStateStartGame::DoStart(boost::shared_ptr<ServerGame> server)
++player_i;
}
server->SendToAllPlayers(packet, SessionData::Game);
server->SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
// Start the first hand.
ServerGameStateHand::StartNewHand(server);
@@ -835,6 +872,10 @@ AbstractServerGameStateRunning::HandleNewPlayer(boost::shared_ptr<ServerGame> se
void
AbstractServerGameStateRunning::HandleNewSpectator(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session)
{
if (session && session->GetPlayerData()) {
AcceptNewSession(server, session, false);
server->AddNewSpectator(session->GetPlayerData()->GetUniqueId());
}
}
void
@@ -941,7 +982,7 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr<ServerGame> server)
playerAllIn->set_allincard2(tmpCards[1]);
++i;
}
server->SendToAllPlayers(allIn, SessionData::Game);
server->SendToAllPlayers(allIn, SessionData::Game | SessionData::Spectating);
curGame.getCurrentHand()->setCardsShown(true);
server->GetStateTimer1().expires_from_now(
@@ -976,7 +1017,7 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr<ServerGame> server)
netPlayersTurn->set_gameid(server->GetId());
netPlayersTurn->set_gamestate(static_cast<NetGameState>(curGame.getCurrentHand()->getCurrentRound()));
netPlayersTurn->set_playerid(curPlayer->getMyUniqueID());
server->SendToAllPlayers(notification, SessionData::Game);
server->SendToAllPlayers(notification, SessionData::Game | SessionData::Spectating);
// If the player is computer controlled, let the engine act.
if (curPlayer->getMyType() == PLAYER_TYPE_COMPUTER) {
@@ -1018,7 +1059,7 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr<ServerGame> server)
netEndHand->set_playerid(player->getMyUniqueID());
netEndHand->set_moneywon(player->getLastMoneyWon());
netEndHand->set_playermoney(player->getMyCash());
server->SendToAllPlayers(endHand, SessionData::Game);
server->SendToAllPlayers(endHand, SessionData::Game | SessionData::Spectating);
} else {
// End of Hand - show cards.
const PlayerIdList showList(curGame.getCurrentHand()->getBoard()->getPlayerNeedToShowCards());
@@ -1038,7 +1079,7 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr<ServerGame> server)
}
++i;
}
server->SendToAllPlayers(endHand, SessionData::Game);
server->SendToAllPlayers(endHand, SessionData::Game | SessionData::Spectating);
}
// Remove disconnected players. This is the one and only place to do this.
@@ -1123,7 +1164,7 @@ ServerGameStateHand::TimerNextGame(const boost::system::error_code &ec, boost::s
EndOfGameMessage *netEndGame = endGame->GetMsg()->mutable_endofgamemessage();
netEndGame->set_gameid(server->GetId());
netEndGame->set_winnerplayerid(winnerPlayerId);
server->SendToAllPlayers(endGame, SessionData::Game);
server->SendToAllPlayers(endGame, SessionData::Game | SessionData::Spectating);
// Wait for the start of a new game.
server->RemoveAutoLeavePlayers();
@@ -1168,6 +1209,9 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr<ServerGame> server)
// This has to be done before initialising the new hand, because there are side effects.
InitRejoiningPlayers(server);
// Initialize new spectators.
InitNewSpectators(server);
// Kick inactive players.
CheckPlayerTimeouts(server);
@@ -1193,10 +1237,8 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr<ServerGame> server)
bool errorFlag = false;
tmpPlayer->getMyCards(cards);
boost::shared_ptr<NetPacket> notifyCards(new NetPacket);
notifyCards->GetMsg()->set_messagetype(PokerTHMessage::Type_HandStartMessage);
boost::shared_ptr<NetPacket> notifyCards = CreateNetPacketHandStart(*server);
HandStartMessage *netHandStart = notifyCards->GetMsg()->mutable_handstartmessage();
netHandStart->set_gameid(server->GetId());
string tmpPassword(tmpSession->AuthGetPassword());
if (tmpPassword.empty()) { // encrypt only if password is present
HandStartMessage::PlainCards *plainCards = netHandStart->mutable_plaincards();
@@ -1222,30 +1264,14 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr<ServerGame> server)
errorFlag = true;
}
}
PlayerListIterator player_i = curGame.getSeatsList()->begin();
PlayerListIterator player_end = curGame.getSeatsList()->end();
int playerCounter = 0;
while (player_i != player_end && playerCounter < server->GetStartData().numberOfPlayers) {
NetPlayerState seatState;
if (!(*player_i)->getMyActiveStatus()) {
seatState = netPlayerStateNoMoney;
} else if (!(*player_i)->isSessionActive()) {
seatState = netPlayerStateSessionInactive;
} else {
seatState = netPlayerStateNormal;
}
netHandStart->add_seatstates(seatState);
++player_i;
++playerCounter;
}
if (!errorFlag) {
netHandStart->set_smallblind(curGame.getCurrentHand()->getSmallBlind());
server->GetLobbyThread().GetSender().Send(tmpSession, notifyCards);
}
}
++i;
}
server->SendToAllPlayers(CreateNetPacketHandStart(*server), SessionData::Spectating);
// Start hand.
curGame.startHand();
@@ -1268,7 +1294,7 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr<ServerGame> server)
netSmallBlind->set_playermoney(tmpPlayer->getMyCash());
netSmallBlind->set_highestset(server->GetGame().getCurrentHand()->getCurrentBeRo()->getHighestSet());
netSmallBlind->set_minimumraise(server->GetGame().getCurrentHand()->getCurrentBeRo()->getMinimumRaise());
server->SendToAllPlayers(notifySmallBlind, SessionData::Game);
server->SendToAllPlayers(notifySmallBlind, SessionData::Game | SessionData::Spectating);
break;
}
++i;
@@ -1290,7 +1316,7 @@ ServerGameStateHand::StartNewHand(boost::shared_ptr<ServerGame> server)
netBigBlind->set_playermoney(tmpPlayer->getMyCash());
netBigBlind->set_highestset(server->GetGame().getCurrentHand()->getCurrentBeRo()->getHighestSet());
netBigBlind->set_minimumraise(server->GetGame().getCurrentHand()->getCurrentBeRo()->getMinimumRaise());
server->SendToAllPlayers(notifyBigBlind, SessionData::Game);
server->SendToAllPlayers(notifyBigBlind, SessionData::Game | SessionData::Spectating);
break;
}
++i;
@@ -1364,6 +1390,21 @@ ServerGameStateHand::InitRejoiningPlayers(boost::shared_ptr<ServerGame> server)
}
}
void
ServerGameStateHand::InitNewSpectators(boost::shared_ptr<ServerGame> server)
{
PlayerIdList spectatorIdList(server->GetAndResetNewSpectators());
PlayerIdList::iterator i = spectatorIdList.begin();
PlayerIdList::iterator end = spectatorIdList.end();
while (i != end) {
boost::shared_ptr<SessionData> session(server->GetSessionManager().GetSessionByUniquePlayerId(*i));
if (session && session->GetPlayerData()) {
SendGameData(server, session);
}
++i;
}
}
void
ServerGameStateHand::PerformRejoin(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session)
{
@@ -1377,7 +1418,7 @@ ServerGameStateHand::PerformRejoin(boost::shared_ptr<ServerGame> server, boost::
PlayerIdChangedMessage *netIdChanged = packet->GetMsg()->mutable_playeridchangedmessage();
netIdChanged->set_oldplayerid(rejoinPlayer->getMyUniqueID());
netIdChanged->set_newplayerid(session->GetPlayerData()->GetUniqueId());
server->SendToAllButOnePlayers(packet, session->GetId(), SessionData::Game);
server->SendToAllButOnePlayers(packet, session->GetId(), SessionData::Game | SessionData::Spectating);
// Update the dealer, if necessary.
curGame.replaceDealer(rejoinPlayer->getMyUniqueID(), session->GetPlayerData()->GetUniqueId());
@@ -1388,32 +1429,38 @@ ServerGameStateHand::PerformRejoin(boost::shared_ptr<ServerGame> server, boost::
rejoinPlayer->setMyGuid(session->GetPlayerData()->GetGuid());
rejoinPlayer->markRemoteAction();
rejoinPlayer->setIsSessionActive(true);
// Send game start notification to rejoining client.
packet.reset(new NetPacket);
packet->GetMsg()->set_messagetype(PokerTHMessage::Type_GameStartRejoinMessage);
GameStartRejoinMessage *netGameStart = packet->GetMsg()->mutable_gamestartrejoinmessage();
netGameStart->set_gameid(server->GetId());
netGameStart->set_startdealerplayerid(curGame.getDealerPosition());
netGameStart->set_handnum(curGame.getCurrentHandID());
PlayerListIterator player_i = curGame.getSeatsList()->begin();
PlayerListIterator player_end = curGame.getSeatsList()->end();
int player_count = 0;
while (player_i != player_end && player_count < server->GetStartData().numberOfPlayers) {
boost::shared_ptr<PlayerInterface> tmpPlayer = *player_i;
GameStartRejoinMessage::RejoinPlayerData *playerSlot = netGameStart->add_rejoinplayerdata();
playerSlot->set_playerid(tmpPlayer->getMyUniqueID());
playerSlot->set_playermoney(tmpPlayer->getMyCash());
++player_i;
++player_count;
}
server->GetLobbyThread().GetSender().Send(session, packet);
SendGameData(server, session);
} else {
server->SessionError(session, ERR_SOCK_INVALID_STATE);
}
}
void
ServerGameStateHand::SendGameData(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session)
{
Game &curGame = server->GetGame();
// Send game start notification to rejoining client.
boost::shared_ptr<NetPacket> packet(new NetPacket);
packet->GetMsg()->set_messagetype(PokerTHMessage::Type_GameStartRejoinMessage);
GameStartRejoinMessage *netGameStart = packet->GetMsg()->mutable_gamestartrejoinmessage();
netGameStart->set_gameid(server->GetId());
netGameStart->set_startdealerplayerid(curGame.getDealerPosition());
netGameStart->set_handnum(curGame.getCurrentHandID());
PlayerListIterator player_i = curGame.getSeatsList()->begin();
PlayerListIterator player_end = curGame.getSeatsList()->end();
int player_count = 0;
while (player_i != player_end && player_count < server->GetStartData().numberOfPlayers) {
boost::shared_ptr<PlayerInterface> tmpPlayer = *player_i;
GameStartRejoinMessage::RejoinPlayerData *playerSlot = netGameStart->add_rejoinplayerdata();
playerSlot->set_playerid(tmpPlayer->getMyUniqueID());
playerSlot->set_playermoney(tmpPlayer->getMyCash());
++player_i;
++player_count;
}
server->GetLobbyThread().GetSender().Send(session, packet);
}
//-----------------------------------------------------------------------------
@@ -1604,7 +1651,7 @@ ServerGameStateWaitNextHand::InternalProcessPacket(boost::shared_ptr<ServerGame>
boost::shared_ptr<PlayerInterface> tmpPlayer(curGame.getPlayerByUniqueId(session->GetPlayerData()->GetUniqueId()));
if (tmpPlayer) {
SetPlayerResult(*netShowCards->mutable_playerresult(), tmpPlayer, curGame.getCurrentHand()->getRoundBeforePostRiver());
server->SendToAllPlayers(show, SessionData::Game);
server->SendToAllPlayers(show, SessionData::Game | SessionData::Spectating);
}
}
}