Work on spectator mode - joining as spectator now possible (on server side).
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user