Implementing auto-start of games when they are full.
This commit is contained in:
@@ -318,11 +318,9 @@ ServerGameStateInit::HandleNewSession(boost::shared_ptr<ServerGame> server, Sess
|
|||||||
{
|
{
|
||||||
if (session.sessionData && session.playerData)
|
if (session.sessionData && session.playerData)
|
||||||
{
|
{
|
||||||
size_t curNumPlayers = server->GetCurNumberOfPlayers();
|
|
||||||
|
|
||||||
const GameData &tmpGameData = server->GetGameData();
|
const GameData &tmpGameData = server->GetGameData();
|
||||||
// Check the number of players.
|
// Check the number of players.
|
||||||
if (curNumPlayers >= (size_t)tmpGameData.maxNumberOfPlayers)
|
if (server->GetCurNumberOfPlayers() >= (size_t)tmpGameData.maxNumberOfPlayers)
|
||||||
{
|
{
|
||||||
server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL);
|
server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL);
|
||||||
}
|
}
|
||||||
@@ -364,6 +362,12 @@ ServerGameStateInit::HandleNewSession(boost::shared_ptr<ServerGame> server, Sess
|
|||||||
|
|
||||||
// Notify lobby.
|
// Notify lobby.
|
||||||
server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), session.playerData->GetUniqueId());
|
server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), session.playerData->GetUniqueId());
|
||||||
|
|
||||||
|
if (server->GetCurNumberOfPlayers() == (size_t)tmpGameData.maxNumberOfPlayers)
|
||||||
|
{
|
||||||
|
// Automatically start the game if it is full.
|
||||||
|
SendStartEvent(*server, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,6 +429,44 @@ ServerGameStateInit::TimerAdminTimeout(const boost::system::error_code &ec, boos
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServerGameStateInit::SendStartEvent(ServerGame &server, bool fillWithComputerPlayers)
|
||||||
|
{
|
||||||
|
// Fill up with computer players.
|
||||||
|
server.ResetComputerPlayerList();
|
||||||
|
|
||||||
|
if (fillWithComputerPlayers)
|
||||||
|
{
|
||||||
|
int remainingSlots = server.GetGameData().maxNumberOfPlayers - server.GetCurNumberOfPlayers();
|
||||||
|
for (int i = 1; i <= remainingSlots; i++)
|
||||||
|
{
|
||||||
|
boost::shared_ptr<PlayerData> tmpPlayerData(
|
||||||
|
new PlayerData(server.GetLobbyThread().GetNextUniquePlayerId(), 0, PLAYER_TYPE_COMPUTER, PLAYER_RIGHTS_NORMAL, false));
|
||||||
|
|
||||||
|
ostringstream name;
|
||||||
|
name << SERVER_COMPUTER_PLAYER_NAME << i;
|
||||||
|
tmpPlayerData->SetName(name.str());
|
||||||
|
server.AddComputerPlayer(tmpPlayerData);
|
||||||
|
|
||||||
|
// Send "Player Joined" to other fully connected clients.
|
||||||
|
server.SendToAllPlayers(CreateNetPacketPlayerJoined(server.GetId(), *tmpPlayerData), SessionData::Game);
|
||||||
|
|
||||||
|
// Notify lobby.
|
||||||
|
server.GetLobbyThread().NotifyPlayerJoinedGame(server.GetId(), tmpPlayerData->GetUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boost::shared_ptr<NetPacket> packet(new NetPacket(NetPacket::Alloc));
|
||||||
|
packet->GetMsg()->present = PokerTHMessage_PR_startEventMessage;
|
||||||
|
StartEventMessage_t *netStartEvent = &packet->GetMsg()->choice.startEventMessage;
|
||||||
|
netStartEvent->gameId = server.GetId();
|
||||||
|
netStartEvent->fillWithComputerPlayers = fillWithComputerPlayers;
|
||||||
|
|
||||||
|
// Wait for all players to confirm start of game.
|
||||||
|
server.SendToAllPlayers(packet, SessionData::Game);
|
||||||
|
|
||||||
|
server.SetState(ServerGameStateStartGame::Instance());
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
||||||
{
|
{
|
||||||
@@ -434,33 +476,7 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server,
|
|||||||
// Only admins are allowed to start the game.
|
// Only admins are allowed to start the game.
|
||||||
if (session.playerData->IsGameAdmin() && netStartEvent->gameId == server->GetId())
|
if (session.playerData->IsGameAdmin() && netStartEvent->gameId == server->GetId())
|
||||||
{
|
{
|
||||||
// Fill up with computer players.
|
SendStartEvent(*server, netStartEvent->fillWithComputerPlayers);
|
||||||
server->ResetComputerPlayerList();
|
|
||||||
|
|
||||||
if (netStartEvent->fillWithComputerPlayers)
|
|
||||||
{
|
|
||||||
int remainingSlots = server->GetGameData().maxNumberOfPlayers - server->GetCurNumberOfPlayers();
|
|
||||||
for (int i = 1; i <= remainingSlots; i++)
|
|
||||||
{
|
|
||||||
boost::shared_ptr<PlayerData> tmpPlayerData(
|
|
||||||
new PlayerData(server->GetLobbyThread().GetNextUniquePlayerId(), 0, PLAYER_TYPE_COMPUTER, PLAYER_RIGHTS_NORMAL, false));
|
|
||||||
|
|
||||||
ostringstream name;
|
|
||||||
name << SERVER_COMPUTER_PLAYER_NAME << i;
|
|
||||||
tmpPlayerData->SetName(name.str());
|
|
||||||
server->AddComputerPlayer(tmpPlayerData);
|
|
||||||
|
|
||||||
// Send "Player Joined" to other fully connected clients.
|
|
||||||
server->SendToAllPlayers(CreateNetPacketPlayerJoined(server->GetId(), *tmpPlayerData), SessionData::Game);
|
|
||||||
|
|
||||||
// Notify lobby.
|
|
||||||
server->GetLobbyThread().NotifyPlayerJoinedGame(server->GetId(), tmpPlayerData->GetUniqueId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Wait for all players to confirm start of game.
|
|
||||||
server->SendToAllPlayers(packet, SessionData::Game);
|
|
||||||
|
|
||||||
server->SetState(ServerGameStateStartGame::Instance());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (packet->GetMsg()->present == PokerTHMessage_PR_invitePlayerToGameMessage)
|
else if (packet->GetMsg()->present == PokerTHMessage_PR_invitePlayerToGameMessage)
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ protected:
|
|||||||
void UnregisterAdminTimer(boost::shared_ptr<ServerGame> server);
|
void UnregisterAdminTimer(boost::shared_ptr<ServerGame> server);
|
||||||
void TimerAdminWarning(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
void TimerAdminWarning(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||||
void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||||
|
void SendStartEvent(ServerGame &server, bool fillWithComputerPlayers);
|
||||||
|
|
||||||
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user