More work on the server code. Still broken.
This commit is contained in:
@@ -215,9 +215,10 @@ ServerGameStateInit::~ServerGameStateInit()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper session)
|
||||
{
|
||||
bool retVal = false;
|
||||
if (session.sessionData.get() && session.playerData.get())
|
||||
{
|
||||
size_t curNumPlayers = server.GetCurNumberOfPlayers();
|
||||
@@ -253,8 +254,10 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s
|
||||
session.sessionData->SetState(SessionData::Game);
|
||||
// Accept session.
|
||||
server.GetSessionManager().AddSession(session);
|
||||
retVal = true;
|
||||
}
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -321,11 +324,11 @@ AbstractServerGameStateRunning::~AbstractServerGameStateRunning()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
AbstractServerGameStateRunning::HandleNewSession(ServerGameThread &server, SessionWrapper session)
|
||||
{
|
||||
// Do not accept new sessions in this state.
|
||||
server.RejectSession(session);
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -50,12 +50,13 @@ private:
|
||||
};
|
||||
|
||||
|
||||
ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, GuiInterface &gui, ConfigFile *playerConfig)
|
||||
: m_lobbyThread(lobbyThread), m_gui(gui), m_gameId(0), m_playerConfig(playerConfig), m_curState(NULL)
|
||||
ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const string &name, GuiInterface &gui, ConfigFile *playerConfig)
|
||||
: m_lobbyThread(lobbyThread), m_gui(gui), m_id(id), m_name(name), m_playerConfig(playerConfig), m_curState(NULL), m_gameNum(1)
|
||||
{
|
||||
m_senderCallback.reset(new ServerSenderCallback(*this));
|
||||
m_sender.reset(new SenderThread(GetSenderCallback()));
|
||||
m_receiver.reset(new ReceiverHelper);
|
||||
SetState(SERVER_INITIAL_STATE::Instance());
|
||||
}
|
||||
|
||||
ServerGameThread::~ServerGameThread()
|
||||
@@ -69,10 +70,22 @@ ServerGameThread::Init(const string &pwd, const GameData &gameData)
|
||||
m_gameData = gameData;
|
||||
}
|
||||
|
||||
void
|
||||
u_int32_t
|
||||
ServerGameThread::GetId() const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
const std::string &
|
||||
ServerGameThread::GetName() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
bool
|
||||
ServerGameThread::AddSession(SessionWrapper session)
|
||||
{
|
||||
GetState().HandleNewSession(*this, session);
|
||||
return GetState().HandleNewSession(*this, session);
|
||||
}
|
||||
|
||||
GameState
|
||||
@@ -90,7 +103,6 @@ ServerGameThread::SendToAllPlayers(boost::shared_ptr<NetPacket> packet)
|
||||
void
|
||||
ServerGameThread::Main()
|
||||
{
|
||||
SetState(SERVER_INITIAL_STATE::Instance());
|
||||
GetSender().Run();
|
||||
|
||||
try
|
||||
@@ -149,7 +161,7 @@ ServerGameThread::InternalStartGame()
|
||||
|
||||
SetStartData(startData);
|
||||
|
||||
m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), GetNextGameId()));
|
||||
m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), GetNextGameNum()));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -260,12 +272,6 @@ ServerGameThread::AssignPlayerNumbers()
|
||||
}
|
||||
}
|
||||
|
||||
unsigned
|
||||
ServerGameThread::GetNextGameId()
|
||||
{
|
||||
return m_gameId++;
|
||||
}
|
||||
|
||||
SessionManager &
|
||||
ServerGameThread::GetSessionManager()
|
||||
{
|
||||
@@ -369,3 +375,9 @@ ServerGameThread::GetGui()
|
||||
return m_gui;
|
||||
}
|
||||
|
||||
unsigned
|
||||
ServerGameThread::GetNextGameNum()
|
||||
{
|
||||
return m_gameNum++;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user