More work on the server code. Still broken.

This commit is contained in:
lotodore
2007-08-20 20:37:54 +00:00
parent 9d63df9218
commit 67e81d1631
7 changed files with 128 additions and 33 deletions
+62 -1
View File
@@ -18,6 +18,7 @@
***************************************************************************/
#include <net/serverlobbythread.h>
#include <net/servergamethread.h>
#include <net/serverexception.h>
#include <net/senderthread.h>
#include <net/sendercallback.h>
@@ -54,7 +55,7 @@ private:
ServerLobbyThread::ServerLobbyThread(GuiInterface &gui, ConfigFile *playerConfig)
: m_gui(gui), m_playerConfig(playerConfig)
: m_gui(gui), m_playerConfig(playerConfig), m_curUniquePlayerId(0), m_curGameId(0)
{
m_senderCallback.reset(new ServerSenderCallback(*this));
m_sender.reset(new SenderThread(GetSenderCallback()));
@@ -98,6 +99,12 @@ ServerLobbyThread::GetNextUniquePlayerId()
return m_curUniquePlayerId++;
}
u_int32_t
ServerLobbyThread::GetNextGameId()
{
return m_curGameId++;
}
void
ServerLobbyThread::Main()
{
@@ -250,11 +257,65 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn
void
ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const NetPacketCreateGame &tmpPacket)
{
// Create a new game.
NetPacketCreateGame::Data createGameData;
tmpPacket.GetData(createGameData);
boost::shared_ptr<ServerGameThread> game(
new ServerGameThread(*this, GetNextGameId(), createGameData.gameName, GetGui(), m_playerConfig));
game->Init(createGameData.password, createGameData.gameData);
// Add session to the game.
if (game->AddSession(session))
{
// Remove session from the lobby.
m_sessionManager.RemoveSession(session.sessionData->GetSocket());
// Add game to list.
m_gameMap.insert(GameMap::value_type(game->GetId(), game));
// Start the game.
game->Run();
// Send ack to client.
boost::shared_ptr<NetPacket> createGameAck(new NetPacketCreateGameAck);
NetPacketCreateGameAck::Data createGameAckData;
createGameAckData.gameId = game->GetId();
static_cast<NetPacketCreateGameAck *>(createGameAck.get())->SetData(createGameAckData);
GetSender().Send(session.sessionData->GetSocket(), createGameAck);
}
}
void
ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const NetPacketJoinGame &tmpPacket)
{
// Join an existing game.
NetPacketJoinGame::Data joinGameData;
tmpPacket.GetData(joinGameData);
GameMap::iterator pos = m_gameMap.find(joinGameData.gameId);
// TODO: handle errors
if (pos != m_gameMap.end())
{
ServerGameThread &game = *pos->second;
if (game.CheckPassword(joinGameData.password))
{
// Add session to the game.
if (game.AddSession(session))
{
// Remove session from the lobby.
m_sessionManager.RemoveSession(session.sessionData->GetSocket());
// Send ack to client.
boost::shared_ptr<NetPacket> joinGameAck(new NetPacketJoinGameAck);
NetPacketJoinGameAck::Data joinGameAckData;
joinGameAckData.gameData = game.GetGameData();
static_cast<NetPacketJoinGameAck *>(joinGameAck.get())->SetData(joinGameAckData);
GetSender().Send(session.sessionData->GetSocket(), joinGameAck);
}
}
}
}
void