Fixing delayed sending of create/join game for network games.

This commit is contained in:
lotodore
2009-06-20 18:41:03 +00:00
parent b868990462
commit a2e692d844
4 changed files with 38 additions and 49 deletions
+1
View File
@@ -108,6 +108,7 @@ protected:
void InitGame(); void InitGame();
void SendSessionPacket(boost::shared_ptr<NetPacket> packet); void SendSessionPacket(boost::shared_ptr<NetPacket> packet);
void SendQueuedPackets();
bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const; bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const;
void RequestPlayerInfo(unsigned id, bool requestAvatar = false); void RequestPlayerInfo(unsigned id, bool requestAvatar = false);
+13 -5
View File
@@ -481,7 +481,14 @@ ClientThread::SendSessionPacket(boost::shared_ptr<NetPacket> packet)
{ {
// Put packets in a buffer until the session is established. // Put packets in a buffer until the session is established.
if (IsSessionEstablished()) if (IsSessionEstablished())
{ GetSender().Send(GetContext().GetSessionData(), packet);
else
m_outPacketList.push_back(packet);
}
void
ClientThread::SendQueuedPackets()
{
if (!m_outPacketList.empty()) if (!m_outPacketList.empty())
{ {
NetPacketList::iterator i = m_outPacketList.begin(); NetPacketList::iterator i = m_outPacketList.begin();
@@ -494,10 +501,6 @@ ClientThread::SendSessionPacket(boost::shared_ptr<NetPacket> packet)
} }
m_outPacketList.clear(); m_outPacketList.clear();
} }
GetSender().Send(GetContext().GetSessionData(), packet);
}
else
m_outPacketList.push_back(packet);
} }
bool bool
@@ -1297,7 +1300,12 @@ ClientThread::IsSessionEstablished() const
void void
ClientThread::SetSessionEstablished(bool flag) ClientThread::SetSessionEstablished(bool flag)
{ {
if (m_sessionEstablished != flag)
{
m_sessionEstablished = flag; m_sessionEstablished = flag;
if (flag)
SendQueuedPackets();
}
} }
bool bool
+6 -26
View File
@@ -180,12 +180,9 @@ AbstractServerGameStateReceiving::~AbstractServerGameStateReceiving()
{ {
} }
int void
AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
{ {
// This is the receive loop for the server.
int retVal = MSG_SOCK_INTERNAL_PENDING;
if (packet->IsClientActivity()) if (packet->IsClientActivity())
session.sessionData->ResetActivityTimer(); session.sessionData->ResetActivityTimer();
if (packet->ToNetPacketRetrievePlayerInfo()) if (packet->ToNetPacketRetrievePlayerInfo())
@@ -267,10 +264,8 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> se
else else
{ {
// Packet processing in subclass. // Packet processing in subclass.
retVal = InternalProcessPacket(server, session, packet); InternalProcessPacket(server, session, packet);
} }
return retVal;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -423,11 +418,9 @@ ServerGameStateInit::TimerAdminTimeout(const boost::system::error_code &ec, boos
} }
} }
int 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)
{ {
int retVal = MSG_SOCK_INTERNAL_PENDING;
if (packet->ToNetPacketStartEvent()) if (packet->ToNetPacketStartEvent())
{ {
// Only admins are allowed to start the game. // Only admins are allowed to start the game.
@@ -476,8 +469,6 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server,
{ {
server->SessionError(session, ERR_SOCK_INVALID_PACKET); server->SessionError(session, ERR_SOCK_INVALID_PACKET);
} }
return retVal;
} }
boost::shared_ptr<NetPacket> boost::shared_ptr<NetPacket>
@@ -532,11 +523,9 @@ ServerGameStateStartGame::HandleNewSession(boost::shared_ptr<ServerGame> server,
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
} }
int void
ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
{ {
int retVal = MSG_SOCK_INTERNAL_PENDING;
if (packet->ToNetPacketStartEventAck()) if (packet->ToNetPacketStartEventAck())
{ {
session.sessionData->SetReadyFlag(); session.sessionData->SetReadyFlag();
@@ -545,11 +534,8 @@ ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr<ServerGame> se
// Everyone is ready. // Everyone is ready.
server->GetSessionManager().ResetAllReadyFlags(); server->GetSessionManager().ResetAllReadyFlags();
DoStart(server); DoStart(server);
retVal = MSG_SOCK_INIT_DONE;
} }
} }
return retVal;
} }
void void
@@ -651,11 +637,10 @@ ServerGameStateHand::HandleNewSession(boost::shared_ptr<ServerGame> server, Sess
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
} }
int void
ServerGameStateHand::InternalProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/) ServerGameStateHand::InternalProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/)
{ {
// TODO: maybe reject packet. // TODO: maybe reject packet.
return MSG_SOCK_INTERNAL_PENDING;
} }
void void
@@ -1116,11 +1101,9 @@ ServerGameStateWaitPlayerAction::HandleNewSession(boost::shared_ptr<ServerGame>
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
} }
int void
ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
{ {
int retVal = MSG_SOCK_INTERNAL_PENDING;
if (packet->ToNetPacketPlayersAction()) if (packet->ToNetPacketPlayersAction())
{ {
NetPacketPlayersAction::Data actionData; NetPacketPlayersAction::Data actionData;
@@ -1171,7 +1154,6 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerG
{ {
PerformPlayerAction(*server, tmpPlayer, actionData.playerAction, actionData.playerBet); PerformPlayerAction(*server, tmpPlayer, actionData.playerAction, actionData.playerBet);
server->SetState(ServerGameStateHand::Instance()); server->SetState(ServerGameStateHand::Instance());
retVal = MSG_NET_GAME_SERVER_ACTION;
} }
else else
{ {
@@ -1186,8 +1168,6 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerG
server->GetLobbyThread().GetSender().Send(session.sessionData, reject); server->GetLobbyThread().GetSender().Send(session.sessionData, reject);
} }
} }
return retVal;
} }
void void
+8 -8
View File
@@ -50,7 +50,7 @@ public:
virtual void HandleNewSession(boost::shared_ptr<ServerGame> server, SessionWrapper session) = 0; virtual void HandleNewSession(boost::shared_ptr<ServerGame> server, SessionWrapper session) = 0;
// Main processing function of the current state. // Main processing function of the current state.
virtual int ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0; virtual void ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
}; };
// Abstract State: Receiving. // Abstract State: Receiving.
@@ -61,11 +61,11 @@ public:
// Globally handle packets which are allowed in all running states. // Globally handle packets which are allowed in all running states.
// Calls InternalProcess if packet has not been processed. // Calls InternalProcess if packet has not been processed.
virtual int ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet); virtual void ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
protected: protected:
virtual int InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0; virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
}; };
// State: Initialization. // State: Initialization.
@@ -90,7 +90,7 @@ protected:
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);
virtual int 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);
static boost::shared_ptr<NetPacket> CreateNetPacketPlayerJoined(const PlayerData &playerData); static boost::shared_ptr<NetPacket> CreateNetPacketPlayerJoined(const PlayerData &playerData);
@@ -114,7 +114,7 @@ public:
protected: protected:
ServerGameStateStartGame(); ServerGameStateStartGame();
virtual int 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);
void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
void DoStart(boost::shared_ptr<ServerGame> server); void DoStart(boost::shared_ptr<ServerGame> server);
@@ -138,7 +138,7 @@ public:
protected: protected:
ServerGameStateHand(); ServerGameStateHand();
virtual int 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);
void TimerLoop(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server); void TimerLoop(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
void EngineLoop(boost::shared_ptr<ServerGame> server); void EngineLoop(boost::shared_ptr<ServerGame> server);
void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server); void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
@@ -170,7 +170,7 @@ public:
protected: protected:
ServerGameStateWaitPlayerAction(); ServerGameStateWaitPlayerAction();
virtual int 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);
void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
private: private:
@@ -192,7 +192,7 @@ public:
virtual void HandleNewSession(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/) {} virtual void HandleNewSession(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/) {}
// Main processing function of the current state. // Main processing function of the current state.
virtual int ProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/) {return 0;} virtual void ProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/) {}
protected: protected:
ServerGameStateFinal() {} ServerGameStateFinal() {}