Beginning of finite state machine for network manager.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2232 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2008-09-07 13:58:37 +00:00
parent 94a1882435
commit fd93bfef1a
15 changed files with 315 additions and 60 deletions

View File

@ -107,6 +107,9 @@ void GameManager::run()
network_manager->update(dt); network_manager->update(dt);
if (race_manager->raceIsActive()) if (race_manager->raceIsActive())
{ {
// Busy wait if race_manager is active (i.e. creating of world is done)
// till all clients have reached this state.
if(network_manager->getState()==NetworkManager::NS_READY_SET_GO_BARRIER) continue;
music_on = false; music_on = false;
if(user_config->m_profile) dt=1.0f/60.0f; if(user_config->m_profile) dt=1.0f/60.0f;
// In the first call dt might be large (includes loading time), // In the first call dt might be large (includes loading time),

View File

@ -66,10 +66,10 @@ CharSel::CharSel(int whichPlayer)
// the user is moving back through the menus and the last value in the vector // the user is moving back through the menus and the last value in the vector
// needs to be made available again. // needs to be made available again.
if (m_player_index == 0) if (m_player_index == 0)
kart_properties_manager->m_selected_karts.clear(); kart_properties_manager->clearAllSelectedKarts();
if (m_player_index < (int)kart_properties_manager->m_selected_karts.size()) if (m_player_index < (int)kart_properties_manager->getNumSelectedKarts())
kart_properties_manager->m_selected_karts.pop_back(); kart_properties_manager->removeLastSelectedKart();
char heading[MAX_MESSAGE_LENGTH]; char heading[MAX_MESSAGE_LENGTH];
snprintf(heading, sizeof(heading), _("Player %d, choose a driver"), snprintf(heading, sizeof(heading), _("Player %d, choose a driver"),
@ -111,7 +111,7 @@ CharSel::CharSel(int whichPlayer)
m_current_kart = -1; m_current_kart = -1;
const int LAST_KART = user_config->m_player[m_player_index].getLastKartId(); const int LAST_KART = user_config->m_player[m_player_index].getLastKartId();
if( LAST_KART != -1 && kartAvailable(LAST_KART))// is LAST_KART not in vector of selected karts if( LAST_KART != -1 && kart_properties_manager->kartAvailable(LAST_KART))// is LAST_KART not in vector of selected karts
{ {
int local_index = 0; int local_index = 0;
for(unsigned int i=0; i<m_index_avail_karts.size(); i++) for(unsigned int i=0; i<m_index_avail_karts.size(); i++)
@ -214,7 +214,7 @@ void CharSel::switchGroup()
kart_properties_manager->getKartsInGroup(user_config->m_kart_group); kart_properties_manager->getKartsInGroup(user_config->m_kart_group);
for(unsigned int i=0; i<karts.size(); i++) for(unsigned int i=0; i<karts.size(); i++)
{ {
if(kartAvailable(karts[i])) if(kart_properties_manager->kartAvailable(karts[i]))
{ {
m_index_avail_karts.push_back(karts[i]); m_index_avail_karts.push_back(karts[i]);
} }
@ -361,7 +361,7 @@ void CharSel::select()
user_config->m_player[m_player_index].setLastKartId(kart_id); user_config->m_player[m_player_index].setLastKartId(kart_id);
// Add selected kart (token) to selected karts vector so it cannot be // Add selected kart (token) to selected karts vector so it cannot be
// selected again // selected again
kart_properties_manager->m_selected_karts.push_back(kart_id); kart_properties_manager->testAndSetKart(kart_id);
} }
if (race_manager->getNumLocalPlayers() > 1) if (race_manager->getNumLocalPlayers() > 1)
@ -393,6 +393,7 @@ void CharSel::select()
if(network_manager->getMode()==NetworkManager::NW_CLIENT) if(network_manager->getMode()==NetworkManager::NW_CLIENT)
{ {
network_manager->sendKartsInformationToServer();
menu_manager->pushMenu(MENUID_START_RACE_FEEDBACK); menu_manager->pushMenu(MENUID_START_RACE_FEEDBACK);
} }
else else
@ -427,23 +428,3 @@ void CharSel::handle(GameAction action, int value)
} // if cursor down } // if cursor down
BaseGUI::handle(action, value); BaseGUI::handle(action, value);
} // handle } // handle
//----------------------------------------------------------------------------
// Function checks the vector of previously selected karts and returns true if
// kart i is in the vector and false if it is not.
bool CharSel::kartAvailable(int kartid)
{
if (!kart_properties_manager->m_selected_karts.empty())
{
std::vector<int>::iterator it;
for (it = kart_properties_manager->m_selected_karts.begin();
it < kart_properties_manager->m_selected_karts.end(); it++)
{
if ( kartid == *it)
return false;
}
}
const KartProperties *kartprop=kart_properties_manager->getKartById(kartid);
return !unlock_manager->isLocked(kartprop->getIdent());
} // kartAvailable

View File

@ -38,7 +38,6 @@ private:
unsigned int m_num_entries; // number of entries to display unsigned int m_num_entries; // number of entries to display
std::vector<int> m_index_avail_karts; std::vector<int> m_index_avail_karts;
static const unsigned int m_max_entries=7; static const unsigned int m_max_entries=7;
bool kartAvailable(int kart);
void updateScrollPosition(); void updateScrollPosition();
int computeIndent(int n) {return 40+abs((int)(m_max_entries-1)/2 - n)*3;} int computeIndent(int n) {return 40+abs((int)(m_max_entries-1)/2 - n)*3;}
void switchGroup(); void switchGroup();

View File

@ -54,6 +54,7 @@
#include "challenges_menu.hpp" #include "challenges_menu.hpp"
#include "feature_unlocked.hpp" #include "feature_unlocked.hpp"
#include "start_race_feedback.hpp" #include "start_race_feedback.hpp"
#include "network_info.hpp"
using namespace std; using namespace std;
@ -238,6 +239,10 @@ void MenuManager::update()
break; break;
case MENUID_START_RACE_FEEDBACK: case MENUID_START_RACE_FEEDBACK:
m_current_menu = new StartRaceFeedback(); m_current_menu = new StartRaceFeedback();
break;
case MENUID_NETWORK_INFO:
m_current_menu = new NetworkInfo();
break;
default: default:
break; break;
} // switch } // switch

View File

@ -44,7 +44,8 @@ enum MenuManagerIDs
MENUID_EXITGAME, MENUID_EXITGAME,
MENUID_GRANDPRIXSELECT, MENUID_GRANDPRIXSELECT,
MENUID_UNLOCKED_FEATURE, MENUID_UNLOCKED_FEATURE,
MENUID_START_RACE_FEEDBACK, MENUID_START_RACE_FEEDBACK, // 'loading'
MENUID_NETWORK_INFO, // wait for clients to connect
// menu configuration // menu configuration
MENUID_CONFIG_DISPLAY, MENUID_CONFIG_DISPLAY,

88
src/gui/network_info.cpp Normal file
View File

@ -0,0 +1,88 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2006 SuperTuxKart-Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <SDL/SDL.h>
#include "network_info.hpp"
#include "widget_manager.hpp"
#include "translation.hpp"
#include "network/network_manager.hpp"
#include "stk_config.hpp"
#include "gui/menu_manager.hpp"
enum WidgetTokens
{
WTOK_MSG,
WTOK_CLIENT,
WTOK_OK
};
NetworkInfo::NetworkInfo()
{
//Add some feedback so people know they are going to start the race
widget_manager->reset();
Widget *w_prev=widget_manager->addTitleWgt( WTOK_MSG, 60, 7, _("Waiting for clients ...") );
w_prev->setPosition(WGT_DIR_CENTER, 0.0, NULL,
WGT_DIR_FROM_TOP, 0.1f, NULL);
// Display a single space to avoid warnings from the widget_manager
Widget *w=widget_manager->addTextWgt(WTOK_CLIENT, 60, 10, " ");
w->setPosition(WGT_DIR_CENTER, 0.0, NULL,
WGT_DIR_UNDER_WIDGET, 0.0, w_prev);
w_prev = w;
w=widget_manager->addTextButtonWgt(WTOK_OK, 60, 7, _("OK"));
w->setPosition(WGT_DIR_CENTER, 0.0, NULL,
WGT_DIR_UNDER_WIDGET, 0.1f, w_prev);
widget_manager->layout(WGT_AREA_TOP);
m_num_clients = 0;
} // NetworkInfo
//-----------------------------------------------------------------------------
NetworkInfo::~NetworkInfo()
{
widget_manager->reset();
}
//-----------------------------------------------------------------------------
void NetworkInfo::update(float DELTA)
{
widget_manager->update(0.0f);
if(m_num_clients==network_manager->getNumClients()) return;
// At least one new client has connected:
std::string s="";
m_num_clients = network_manager->getNumClients();
for(unsigned int i=1; i<=m_num_clients; i++)
{
s+=network_manager->getClientName(i)+"\n";
}
widget_manager->setWgtText(WTOK_CLIENT, s);
} // update
//-----------------------------------------------------------------------------
void NetworkInfo::select()
{
switch( widget_manager->getSelectedWgt() )
{
case WTOK_OK:
network_manager->switchToCharacterSelection();
menu_manager->popMenu();
break;
}
} // select

34
src/gui/network_info.hpp Normal file
View File

@ -0,0 +1,34 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2008 Joerg Henrichs
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef HEADER_NETWORK_INFO_H
#define HEADER_NETWORK_INFO_H
#include "base_gui.hpp"
class NetworkInfo : public BaseGUI
{
private:
unsigned int m_num_clients;
public:
NetworkInfo();
~NetworkInfo();
void update(float DELTA);
void select();
};
#endif

View File

@ -30,6 +30,8 @@ enum WidgetTokens
StartRaceFeedback::StartRaceFeedback() StartRaceFeedback::StartRaceFeedback()
{ {
network_manager->switchToRaceDataSynchronisation();
m_state = network_manager->getMode()==NetworkManager::NW_NONE ? SRF_LOADING : SRF_NETWORK; m_state = network_manager->getMode()==NetworkManager::NW_NONE ? SRF_LOADING : SRF_NETWORK;
//Add some feedback so people know they are going to start the race //Add some feedback so people know they are going to start the race
@ -65,10 +67,17 @@ void StartRaceFeedback::update(float DELTA)
m_state = SRF_NETWORK; m_state = SRF_NETWORK;
break; break;
case SRF_NETWORK: case SRF_NETWORK:
// The server only waits for one frame:
if(network_manager->getMode()==NetworkManager::NW_SERVER) if(network_manager->getMode()==NetworkManager::NW_SERVER)
{
network_manager->sendRaceInformationToClients(); network_manager->sendRaceInformationToClients();
else m_state = SRF_LOADING_DISPLAY;
network_manager->waitForRaceInformation(); widget_manager->setWgtText(WTOK_MSG, _("Loading race...") );
return;
}
// The client have to be busy waiting till the race data has arrived:
if(network_manager->getState()==NetworkManager::NS_WAITING_FOR_RACE_DATA)
return;
m_state = SRF_LOADING_DISPLAY; m_state = SRF_LOADING_DISPLAY;
widget_manager->setWgtText(WTOK_MSG, _("Loading race...") ); widget_manager->setWgtText(WTOK_MSG, _("Loading race...") );
break; break;

View File

@ -1006,6 +1006,10 @@
RelativePath="../../../src\gui\menu_manager.cpp" RelativePath="../../../src\gui\menu_manager.cpp"
> >
</File> </File>
<File
RelativePath="..\..\gui\network_info.cpp"
>
</File>
<File <File
RelativePath="../../../src\gui\num_players.cpp" RelativePath="../../../src\gui\num_players.cpp"
> >
@ -1480,6 +1484,10 @@
RelativePath="../../../src\gui\menu_manager.hpp" RelativePath="../../../src\gui\menu_manager.hpp"
> >
</File> </File>
<File
RelativePath="..\..\gui\network_info.hpp"
>
</File>
<File <File
RelativePath="../../../src\gui\num_players.hpp" RelativePath="../../../src\gui\num_players.hpp"
> >

View File

@ -26,6 +26,8 @@
#include "kart_properties.hpp" #include "kart_properties.hpp"
#include "translation.hpp" #include "translation.hpp"
#include "user_config.hpp" #include "user_config.hpp"
#include "unlock_manager.hpp"
#if defined(WIN32) && !defined(__CYGWIN__) #if defined(WIN32) && !defined(__CYGWIN__)
# define snprintf _snprintf # define snprintf _snprintf
#endif #endif
@ -159,6 +161,27 @@ int KartPropertiesManager::getKartByGroup(const std::string& group, int n) const
return -1; return -1;
} // getKartByGroup } // getKartByGroup
//-----------------------------------------------------------------------------
bool KartPropertiesManager::testAndSetKart(int kartid)
{
if(!kartAvailable(kartid)) return false;
m_selected_karts.push_back(kartid);
return true;
} // testAndSetKart
//-----------------------------------------------------------------------------
bool KartPropertiesManager::kartAvailable(int kartid)
{
std::vector<int>::iterator it;
for (it = m_selected_karts.begin(); it < m_selected_karts.end(); it++)
{
if ( kartid == *it) return false;
}
const KartProperties *kartprop=getKartById(kartid);
if(unlock_manager->isLocked(kartprop->getIdent())) return false;
return true;
} // testAndSetKart
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void KartPropertiesManager::fillWithRandomKarts(std::vector<RemoteKartInfo>& vec) void KartPropertiesManager::fillWithRandomKarts(std::vector<RemoteKartInfo>& vec)
{ {

View File

@ -31,6 +31,10 @@ class KartPropertiesManager
private: private:
std::vector<std::string> m_all_groups; std::vector<std::string> m_all_groups;
std::map<std::string, std::vector<int> > m_groups; std::map<std::string, std::vector<int> > m_groups;
// vector containing kart numbers that have been selected in multiplayer
// games. This it used to ensure the same kart can not be selected more
// than once.
std::vector<int> m_selected_karts;
protected: protected:
float m_max_steer_angle; float m_max_steer_angle;
@ -42,11 +46,6 @@ public:
KartPropertiesManager(); KartPropertiesManager();
~KartPropertiesManager(); ~KartPropertiesManager();
// vector containing kart numbers that have been selected in multiplayer
// games. This it used to ensure the same kart can not be selected more
// than once.
std::vector<int> m_selected_karts;
const KartProperties* getKartById (int i) const; const KartProperties* getKartById (int i) const;
const KartProperties* getKart (const std::string IDENT) const; const KartProperties* getKart (const std::string IDENT) const;
const int getKartId (const std::string IDENT) const; const int getKartId (const std::string IDENT) const;
@ -58,7 +57,11 @@ public:
getAllGroups () const {return m_all_groups; } getAllGroups () const {return m_all_groups; }
const std::vector<int>& getKartsInGroup (const std::string& g) const std::vector<int>& getKartsInGroup (const std::string& g)
{return m_groups[g]; } {return m_groups[g]; }
void clearAllSelectedKarts() {m_selected_karts.clear();}
void removeLastSelectedKart() {m_selected_karts.pop_back();}
int getNumSelectedKarts() const {return m_selected_karts.size();}
bool kartAvailable(int kartid);
bool testAndSetKart(int kartid);
/** Fill the empty positions in the given vector with random karts */ /** Fill the empty positions in the given vector with random karts */
void fillWithRandomKarts (std::vector<RemoteKartInfo>& vec); void fillWithRandomKarts (std::vector<RemoteKartInfo>& vec);
void removeTextures (); void removeTextures ();

View File

@ -536,7 +536,11 @@ int main(int argc, char *argv[] )
fprintf(stderr, "Problems initialising network connections,\n" fprintf(stderr, "Problems initialising network connections,\n"
"Running in non-network mode.\n"); "Running in non-network mode.\n");
} }
// On the server start with the network information page
if(network_manager->getMode()==NetworkManager::NW_SERVER)
{
menu_manager->pushMenu(MENUID_NETWORK_INFO);
}
// Not replaying // Not replaying
// ============= // =============
if(!user_config->m_profile) if(!user_config->m_profile)

View File

@ -21,13 +21,14 @@
#include "stk_config.hpp" #include "stk_config.hpp"
#include "user_config.hpp" #include "user_config.hpp"
#include "race_manager.hpp" #include "race_manager.hpp"
#include "kart_properties_manager.hpp"
NetworkManager* network_manager = 0; NetworkManager* network_manager = 0;
NetworkManager::NetworkManager() NetworkManager::NetworkManager()
{ {
m_mode = NW_NONE; m_mode = NW_NONE;
m_state = NS_SYNCHRONISING; m_state = NS_ACCEPT_CONNECTIONS;
m_port = 12345; m_port = 12345;
m_server_address = "172.31.41.53"; m_server_address = "172.31.41.53";
m_num_clients = 0; m_num_clients = 0;
@ -86,6 +87,7 @@ bool NetworkManager::initServer()
} }
fprintf(stderr, "Server initialised, waiting for connections ...\n"); fprintf(stderr, "Server initialised, waiting for connections ...\n");
m_client_names.push_back("server");
return true; return true;
#endif #endif
} // initServer } // initServer
@ -145,12 +147,12 @@ bool NetworkManager::initClient()
return true; return true;
#endif #endif
} // initServer } // initClient
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void NetworkManager::handleNewConnection(ENetEvent *event) void NetworkManager::handleNewConnection(ENetEvent *event)
{ {
if(m_state!=NS_SYNCHRONISING) if(m_state!=NS_ACCEPT_CONNECTIONS)
{ {
// We don't accept connections atm // We don't accept connections atm
return; return;
@ -161,13 +163,14 @@ void NetworkManager::handleNewConnection(ENetEvent *event)
event->peer -> address.port, m_num_clients); event->peer -> address.port, m_num_clients);
// FIXME: send m_num_clients as hostid back to new client. // FIXME: send m_num_clients as hostid back to new client.
// FIXME: client should send an id as well to be displayed
m_client_names.push_back("client");
} // handleNewConnection } // handleNewConnection
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void NetworkManager::handleDisconnection(ENetEvent *event) void NetworkManager::handleDisconnection(ENetEvent *event)
{ {
if(m_state!=NS_SYNCHRONISING) if(m_state!=NS_ACCEPT_CONNECTIONS)
{ {
fprintf(stderr, "Disconnect while in race - close your eyes and hope for the best.\n"); fprintf(stderr, "Disconnect while in race - close your eyes and hope for the best.\n");
return; return;
@ -178,14 +181,86 @@ void NetworkManager::handleDisconnection(ENetEvent *event)
} // handleDisconnection } // handleDisconnection
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void NetworkManager::handleNewMessage(ENetEvent *event) void NetworkManager::handleServerMessage(ENetEvent *event)
{ {
if(m_state==NS_SYNCHRONISING) switch(m_state)
{ {
case NS_ACCEPT_CONNECTIONS:
fprintf(stderr, "Received a receive event while waiting for client - ignored.\n"); fprintf(stderr, "Received a receive event while waiting for client - ignored.\n");
return; return;
case NS_CHARACTER_SELECT:
{
// only accept testAndSet and 'character selected' messages here.
// Get character from message, check if it's still available
int kartid=0, playerid=0, hostid=0;
std::string name="tuxkart", user="guest";
if(kart_properties_manager->testAndSetKart(kartid))
{
// send 'ok' message to client and all other clients
m_kart_info.push_back(RemoteKartInfo(playerid, name, user, hostid));
} }
} // handleNewMessage else
{
// send 'not avail' to sender
}
break;
}
case NS_READY_SET_GO_BARRIER:
m_barrier_count++;
if(m_barrier_count==m_num_clients)
{
// broadcast start message
m_state = NS_RACING;
}
break;
case NS_KART_INFO_BARRIER:
m_barrier_count++;
if(m_barrier_count==m_num_clients)
{
// broadcast start message
m_state = NS_RACING;
}
break;
} // switch m_state
} // handleServerMessage
// ----------------------------------------------------------------------------
void NetworkManager::switchToReadySetGoBarrier()
{
assert(m_state == NS_CHARACTER_SELECT);
m_state = NS_READY_SET_GO_BARRIER;
m_barrier_count = 0;
} // switchToReadySetGoBarrier
// ----------------------------------------------------------------------------
void NetworkManager::switchToCharacterSelection()
{
// This must be called from the network info menu,
// so make sure the state is correct
assert(m_state == NS_ACCEPT_CONNECTIONS);
m_state = NS_CHARACTER_SELECT;
} // switchTocharacterSelection
// ----------------------------------------------------------------------------
void NetworkManager::switchToRaceDataSynchronisation()
{
assert(m_state == NS_CHARACTER_SELECT);
m_state = NS_KART_INFO_BARRIER;
m_barrier_count = 0;
} // switchToRaceDataSynchronisation
// ----------------------------------------------------------------------------
void NetworkManager::handleClientMessage(ENetEvent *event)
{
switch(m_state)
{
case NS_ACCEPT_CONNECTIONS:
fprintf(stderr, "Received a receive event while waiting for client - ignored.\n");
return;
} // switch m_state
} // handleClientMessage
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void NetworkManager::update(float dt) void NetworkManager::update(float dt)
@ -202,7 +277,12 @@ void NetworkManager::update(float dt)
switch (event.type) switch (event.type)
{ {
case ENET_EVENT_TYPE_CONNECT: handleNewConnection(&event); break; case ENET_EVENT_TYPE_CONNECT: handleNewConnection(&event); break;
case ENET_EVENT_TYPE_RECEIVE: handleNewMessage(&event); break; case ENET_EVENT_TYPE_RECEIVE:
if(m_mode==NW_SERVER)
handleServerMessage(&event);
else
handleClientMessage(&event);
break;
case ENET_EVENT_TYPE_DISCONNECT: handleDisconnection(&event); break; case ENET_EVENT_TYPE_DISCONNECT: handleDisconnection(&event); break;
case ENET_EVENT_TYPE_NONE: break; case ENET_EVENT_TYPE_NONE: break;
} }

View File

@ -35,8 +35,14 @@ public:
// The mode the network manager is operating in // The mode the network manager is operating in
enum NetworkMode {NW_SERVER, NW_CLIENT, NW_NONE}; enum NetworkMode {NW_SERVER, NW_CLIENT, NW_NONE};
// The current state. // States for the finite state machine. First for server:
enum NetworkState {NS_SYNCHRONISING, NS_RACING}; enum NetworkState {NS_ACCEPT_CONNECTIONS, NS_KART_INFO_BARRIER,
// Then client only states:
NS_CHARACTER_CONFIRMED,
NS_CHARACTER_REJECTED,
NS_WAITING_FOR_RACE_DATA,
// Shared states
NS_CHARACTER_SELECT, NS_READY_SET_GO_BARRIER, NS_RACING};
private: private:
NetworkMode m_mode; NetworkMode m_mode;
@ -46,6 +52,8 @@ private:
int m_num_clients; int m_num_clients;
std::vector<RemoteKartInfo> m_kart_info; std::vector<RemoteKartInfo> m_kart_info;
int m_host_id; int m_host_id;
std::vector<std::string> m_client_names;
int m_barrier_count;
#ifdef HAVE_ENET #ifdef HAVE_ENET
ENetHost *m_host; ENetHost *m_host;
#endif #endif
@ -53,8 +61,10 @@ private:
bool initServer(); bool initServer();
bool initClient(); bool initClient();
void handleNewConnection(ENetEvent *event); void handleNewConnection(ENetEvent *event);
void handleNewMessage (ENetEvent *event); void handleServerMessage(ENetEvent *event);
void handleClientMessage(ENetEvent *event);
void handleDisconnection(ENetEvent *event); void handleDisconnection(ENetEvent *event);
void testSetCharacter (ENetEvent *event);
public: public:
NetworkManager(); NetworkManager();
@ -64,7 +74,9 @@ public:
void setState(NetworkState s) {m_state = s; } void setState(NetworkState s) {m_state = s; }
NetworkState getState() const {return m_state; } NetworkState getState() const {return m_state; }
int getHostId() const {return m_host_id; } int getHostId() const {return m_host_id; }
int getNumClients() const {return m_num_clients; } unsigned int getNumClients() const {return m_num_clients; }
const std::string&
getClientName(int i) const {return m_client_names[i];}
void setPort(int p) {m_port=p; } void setPort(int p) {m_port=p; }
void setServerIP(const std::string &s) {m_server_address=s; } void setServerIP(const std::string &s) {m_server_address=s; }
void setKartInfo(int player_id, const std::string& kart, void setKartInfo(int player_id, const std::string& kart,
@ -75,6 +87,10 @@ public:
void waitForKartsInformation(); void waitForKartsInformation();
void sendRaceInformationToClients(); void sendRaceInformationToClients();
void waitForRaceInformation(); void waitForRaceInformation();
void switchToReadySetGoBarrier();
void switchToCharacterSelection();
void switchToRaceDataSynchronisation();
}; };
extern NetworkManager *network_manager; extern NetworkManager *network_manager;

View File

@ -189,6 +189,7 @@ World::World()
} }
if( m_p_replay_player ) m_p_replay_player->showReplayAt( 0.0 ); if( m_p_replay_player ) m_p_replay_player->showReplayAt( 0.0 );
#endif #endif
network_manager->switchToReadySetGoBarrier();
} // World } // World
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------