Started to introduce concept of 'local player', but commit
'in between' to move a few files. git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2225 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
e438565c62
commit
d3b4fcf8e7
@ -50,7 +50,7 @@ Camera::Camera(int camera_index, const Kart* kart)
|
||||
// ----------------------------------------------------------------------------
|
||||
void Camera::setScreenPosition(int camera_index)
|
||||
{
|
||||
const int num_players = race_manager->getNumPlayers();
|
||||
const int num_players = race_manager->getNumLocalPlayers();
|
||||
assert(camera_index >= 0 && camera_index <= 3);
|
||||
|
||||
if (num_players == 1)
|
||||
|
@ -343,28 +343,28 @@ void CharSel::select()
|
||||
|
||||
token = (token+m_offset) % (int)m_index_avail_karts.size();
|
||||
int kart_id = m_index_avail_karts[token];
|
||||
if(kart_id < 0) // group selected
|
||||
{
|
||||
if(kart_id < 0) // group selected
|
||||
{
|
||||
user_config->m_kart_group = kart_properties_manager->getAllGroups()[-kart_id-1];
|
||||
switchGroup();
|
||||
// forces redraw of the model, otherwise (if m_current_kart=0) the new
|
||||
// model would not be displayed.
|
||||
m_current_kart = -1;
|
||||
switchCharacter(0);
|
||||
updateScrollPosition();
|
||||
return;
|
||||
}
|
||||
switchGroup();
|
||||
// forces redraw of the model, otherwise (if m_current_kart=0) the new
|
||||
// model would not be displayed.
|
||||
m_current_kart = -1;
|
||||
switchCharacter(0);
|
||||
updateScrollPosition();
|
||||
return;
|
||||
}
|
||||
const KartProperties* KP = kart_properties_manager->getKartById(kart_id);
|
||||
if (KP != NULL)
|
||||
{
|
||||
race_manager->setPlayerKart(m_player_index, KP->getIdent());
|
||||
race_manager->setLocalPlayerKart(m_player_index, KP->getIdent());
|
||||
user_config->m_player[m_player_index].setLastKartId(kart_id);
|
||||
// Add selected kart (token) to selected karts vector so it cannot be
|
||||
// selected again
|
||||
kart_properties_manager->m_selected_karts.push_back(kart_id);
|
||||
}
|
||||
|
||||
if (race_manager->getNumPlayers() > 1)
|
||||
if (race_manager->getNumLocalPlayers() > 1)
|
||||
{
|
||||
if (menu_manager->isCurrentMenu(MENUID_CHARSEL_P1))
|
||||
{
|
||||
@ -373,7 +373,7 @@ void CharSel::select()
|
||||
}
|
||||
}
|
||||
|
||||
if (race_manager->getNumPlayers() > 2)
|
||||
if (race_manager->getNumLocalPlayers() > 2)
|
||||
{
|
||||
if (menu_manager->isCurrentMenu(MENUID_CHARSEL_P2))
|
||||
{
|
||||
@ -382,7 +382,7 @@ void CharSel::select()
|
||||
}
|
||||
}
|
||||
|
||||
if (race_manager->getNumPlayers() > 3)
|
||||
if (race_manager->getNumLocalPlayers() > 3)
|
||||
{
|
||||
if (menu_manager->isCurrentMenu(MENUID_CHARSEL_P3))
|
||||
{
|
||||
|
@ -89,7 +89,7 @@ void MainMenu::select()
|
||||
switch ( widget_manager->getSelectedWgt() )
|
||||
{
|
||||
case WTOK_SINGLE:
|
||||
race_manager->setNumPlayers(1);
|
||||
race_manager->setNumLocalPlayers(1);
|
||||
// The clients do not do any mode selection, they go immediately
|
||||
// to the character selection screen.
|
||||
if(network_manager->getMode()==NetworkManager::NW_CLIENT)
|
||||
|
@ -63,7 +63,7 @@ void NumPlayers::select()
|
||||
case WTOK_PLAYER_2:
|
||||
case WTOK_PLAYER_3:
|
||||
case WTOK_PLAYER_4:
|
||||
race_manager->setNumPlayers(widget_manager->getSelectedWgt());
|
||||
race_manager->setNumLocalPlayers(widget_manager->getSelectedWgt());
|
||||
if(network_manager->getMode()==NetworkManager::NW_CLIENT)
|
||||
menu_manager->pushMenu(MENUID_CHARSEL_P1);
|
||||
else
|
||||
|
@ -970,9 +970,9 @@ void RaceGUI::drawStatusText(const float dt)
|
||||
// "Go" is displayed and the race starts
|
||||
if(world->isStartPhase() || world->getTime()<1.0f)
|
||||
{
|
||||
for(unsigned int i=0; i<race_manager->getNumPlayers(); i++)
|
||||
for(unsigned int i=0; i<race_manager->getNumLocalPlayers(); i++)
|
||||
{
|
||||
if(world->getPlayerKart(i)->earlyStartPenalty())
|
||||
if(world->getLocalPlayerKart(i)->earlyStartPenalty())
|
||||
{
|
||||
GLfloat const COLORS[] = { 0.78f, 0.025f, 0.025f, 1.0f };
|
||||
font_race->PrintShadow( _("Penalty time!!"), 80,
|
||||
@ -984,14 +984,14 @@ void RaceGUI::drawStatusText(const float dt)
|
||||
|
||||
float split_screen_ratio_x, split_screen_ratio_y;
|
||||
split_screen_ratio_x = split_screen_ratio_y = 1.0;
|
||||
if(race_manager->getNumPlayers() >= 2)
|
||||
if(race_manager->getNumLocalPlayers() >= 2)
|
||||
split_screen_ratio_y = 0.5;
|
||||
if(race_manager->getNumPlayers() >= 3)
|
||||
if(race_manager->getNumLocalPlayers() >= 3)
|
||||
split_screen_ratio_x = 0.5;
|
||||
|
||||
if ( world->isRacePhase() )
|
||||
{
|
||||
const int numPlayers = race_manager->getNumPlayers();
|
||||
const int numPlayers = race_manager->getNumLocalPlayers();
|
||||
|
||||
for(int pla = 0; pla < numPlayers; pla++)
|
||||
{
|
||||
@ -1025,7 +1025,7 @@ void RaceGUI::drawStatusText(const float dt)
|
||||
offset_x = user_config->m_width/2;
|
||||
}
|
||||
|
||||
Kart* player_kart=world->getPlayerKart(pla);
|
||||
Kart* player_kart=world->getLocalPlayerKart(pla);
|
||||
drawCollectableIcons(player_kart, offset_x, offset_y,
|
||||
split_screen_ratio_x, split_screen_ratio_y );
|
||||
drawEnergyMeter (player_kart, offset_x, offset_y,
|
||||
|
@ -184,7 +184,7 @@ int handleCmdLine(int argc, char **argv)
|
||||
std::string filename=file_manager->getKartFile(std::string(argv[i+1])+".tkkf");
|
||||
if(filename!="")
|
||||
{
|
||||
race_manager->setPlayerKart(0, argv[i+1]);
|
||||
race_manager->setLocalPlayerKart(0, argv[i+1]);
|
||||
fprintf ( stdout, "You choose to use kart '%s'.\n", argv[i+1] ) ;
|
||||
}
|
||||
else
|
||||
@ -555,7 +555,7 @@ int main(int argc, char *argv[] )
|
||||
// Profiling
|
||||
// =========
|
||||
race_manager->setNumPlayers(1);
|
||||
race_manager->setPlayerKart(0, kart_properties_manager->getKart("tuxkart")->getIdent());
|
||||
race_manager->setLocalPlayerKart(0, kart_properties_manager->getKart("tuxkart")->getIdent());
|
||||
race_manager->setMajorMode (RaceManager::RM_SINGLE);
|
||||
race_manager->setMinorMode (RaceManager::RM_QUICK_RACE);
|
||||
race_manager->setDifficulty(RaceManager::RD_HARD);
|
||||
|
@ -19,6 +19,8 @@
|
||||
|
||||
#include "network_manager.hpp"
|
||||
#include "stk_config.hpp"
|
||||
#include "user_config.hpp"
|
||||
#include "race_manager.hpp"
|
||||
|
||||
NetworkManager* network_manager = 0;
|
||||
|
||||
@ -29,12 +31,16 @@ NetworkManager::NetworkManager()
|
||||
m_port = 12345;
|
||||
m_server_address = "172.31.41.53";
|
||||
m_num_clients = 0;
|
||||
m_host_id = 0;
|
||||
#ifdef HAVE_ENET
|
||||
if (enet_initialize () != 0)
|
||||
{
|
||||
fprintf (stderr, "An error occurred while initializing ENet.\n");
|
||||
exit(-1);
|
||||
}
|
||||
// FIXME: debugging
|
||||
m_kart_info.push_back(KartInfo("tuxkart","xx", 1));
|
||||
m_kart_info.push_back(KartInfo("yeti", "yy", 1));
|
||||
#endif
|
||||
} // NetworkManager
|
||||
|
||||
@ -122,14 +128,8 @@ bool NetworkManager::initClient()
|
||||
}
|
||||
|
||||
/* Wait up to 5 seconds for the connection attempt to succeed. */
|
||||
if (enet_host_service (m_host, & event, 5000) > 0 &&
|
||||
event.type == ENET_EVENT_TYPE_CONNECT)
|
||||
{
|
||||
fprintf(stderr, "Connection to %s:%d succeeded.\n",
|
||||
m_server_address.c_str(), m_port);
|
||||
enet_host_service(m_host, &event, 1000);
|
||||
}
|
||||
else
|
||||
if (enet_host_service (m_host, & event, 5000) <= 0 ||
|
||||
event.type != ENET_EVENT_TYPE_CONNECT)
|
||||
{
|
||||
/* Either the 5 seconds are up or a disconnect event was */
|
||||
/* received. Reset the peer in the event the 5 seconds */
|
||||
@ -137,8 +137,14 @@ bool NetworkManager::initClient()
|
||||
enet_peer_reset (peer);
|
||||
|
||||
fprintf(stderr, "Connection to '%s:%d' failed.\n",
|
||||
m_server_address.c_str(), m_port);
|
||||
m_server_address.c_str(), m_port);
|
||||
return false;
|
||||
}
|
||||
fprintf(stderr, "Connection to %s:%d succeeded.\n",
|
||||
m_server_address.c_str(), m_port);
|
||||
enet_host_service(m_host, &event, 1000);
|
||||
// FIXME Receive host id from server here!!
|
||||
m_host_id = 1;
|
||||
|
||||
return true;
|
||||
#endif
|
||||
@ -154,10 +160,13 @@ void NetworkManager::handleNewConnection(ENetEvent *event)
|
||||
}
|
||||
m_num_clients++;
|
||||
fprintf (stderr, "A new client connected from %x:%u. Connected: %d.\n",
|
||||
event->peer -> address.host,
|
||||
event->peer -> address.port, m_num_clients);
|
||||
event->peer -> address.host,
|
||||
event->peer -> address.port, m_num_clients);
|
||||
|
||||
// FIXME: send m_num_clients as hostid back to new client.
|
||||
|
||||
} // handleNewConnection
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void NetworkManager::handleDisconnection(ENetEvent *event)
|
||||
{
|
||||
@ -194,7 +203,7 @@ void NetworkManager::update(float dt)
|
||||
}
|
||||
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_DISCONNECT: handleDisconnection(&event); break;
|
||||
case ENET_EVENT_TYPE_NONE: break;
|
||||
@ -207,14 +216,36 @@ void NetworkManager::update(float dt)
|
||||
*/
|
||||
void NetworkManager::sendKartsInformationToServer()
|
||||
{
|
||||
for(int i=0; i<(int)race_manager->getNumLocalPlayers(); i++)
|
||||
{
|
||||
fprintf(stderr, "Sending name '%s', ",user_config->m_player[i].getName().c_str());
|
||||
fprintf(stderr, "kart name '%s'\n", race_manager->getLocalPlayerKart(i));
|
||||
} // for i<getNumLocalPlayers
|
||||
fprintf(stderr, "Client sending kart information to server\n");
|
||||
} // sendKartsInformationToServer
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Receive and store the information from sendKartsInformation()
|
||||
*/
|
||||
void NetworkManager::waitForKartsInformation()
|
||||
{
|
||||
fprintf(stderr, "Server receiving all kart information\n");
|
||||
|
||||
// First put the local karts into the race_manager:
|
||||
|
||||
for(unsigned int i=0; i<(int)race_manager->getNumLocalPlayers(); i++)
|
||||
{
|
||||
//FIXME race_manager->setPlayerKart(i, race_manager->getLocalPlayerKart(i),
|
||||
// m_host_id);
|
||||
}
|
||||
int offset=race_manager->getNumLocalPlayers();
|
||||
for(unsigned int i=0; i<m_kart_info.size(); i++)
|
||||
{
|
||||
// receive number of karts, kart name, and player name for each hosts,
|
||||
// and put it into the race_manager data structure:
|
||||
//FIXME race_manager->setPlayerKart(offset+i, m_kart_info[i].m_kart_name,
|
||||
// m_kart_info[i].m_client_id);
|
||||
} // for i
|
||||
} // waitForKartsInformation
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -223,6 +254,11 @@ void NetworkManager::waitForKartsInformation()
|
||||
void NetworkManager::sendRaceInformationToClients()
|
||||
{
|
||||
fprintf(stderr, "server sending race_manager information to all clients\n");
|
||||
for(unsigned i=0; i<race_manager->getNumPlayers(); i++)
|
||||
{
|
||||
// fprintf(stderr, "Sending kart '%s' host %d\n",
|
||||
//FIXME race_manager->getKartName(i), race_manager->getHostId(i));
|
||||
} // for i
|
||||
} // sendRaceInformationToClients
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -21,6 +21,7 @@
|
||||
#define HEADER_NETWORK_MANAGER_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#ifdef HAVE_ENET
|
||||
# include "enet/enet.h"
|
||||
@ -35,13 +36,29 @@ public:
|
||||
// The current state.
|
||||
enum NetworkState {NS_SYNCHRONISING, NS_RACING};
|
||||
private:
|
||||
NetworkMode m_mode;
|
||||
NetworkState m_state;
|
||||
int m_port;
|
||||
std::string m_server_address;
|
||||
int m_num_clients;
|
||||
|
||||
// A simple struct to store information
|
||||
class KartInfo
|
||||
{
|
||||
public:
|
||||
std::string m_kart_name;
|
||||
std::string m_user_name;
|
||||
int m_client_id;
|
||||
int m_player_id;
|
||||
KartInfo(std::string kart_name, std::string user_name, int id)
|
||||
: m_kart_name(kart_name), m_user_name(user_name), m_client_id(id)
|
||||
{};
|
||||
}; // KartInfo
|
||||
|
||||
NetworkMode m_mode;
|
||||
NetworkState m_state;
|
||||
int m_port;
|
||||
std::string m_server_address;
|
||||
int m_num_clients;
|
||||
std::vector<KartInfo> m_kart_info;
|
||||
int m_host_id;
|
||||
#ifdef HAVE_ENET
|
||||
ENetHost *m_host;
|
||||
ENetHost *m_host;
|
||||
#endif
|
||||
|
||||
bool initServer();
|
||||
@ -50,7 +67,6 @@ private:
|
||||
void handleNewMessage (ENetEvent *event);
|
||||
void handleDisconnection(ENetEvent *event);
|
||||
|
||||
|
||||
public:
|
||||
NetworkManager();
|
||||
~NetworkManager();
|
||||
@ -58,7 +74,7 @@ public:
|
||||
NetworkMode getMode() const {return m_mode; }
|
||||
void setState(NetworkState s) {m_state = s; }
|
||||
NetworkState getState() const {return m_state; }
|
||||
void setNumClients(int n) {m_num_clients = n; }
|
||||
int getHostId() const {return m_host_id; }
|
||||
int getNumClients() const {return m_num_clients;}
|
||||
void setPort(int p) {m_port=p; }
|
||||
void setServerIP(const std::string &s) {m_server_address=s; }
|
||||
|
@ -44,7 +44,7 @@ RaceManager::RaceManager()
|
||||
m_score_for_position = stk_config->m_scores;
|
||||
m_coin_target = 0;
|
||||
setTrack("race");
|
||||
setPlayerKart(0, "tuxkart");
|
||||
setLocalPlayerKart(0, "tuxkart");
|
||||
} // RaceManager
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -60,31 +60,41 @@ void RaceManager::reset()
|
||||
} // reset
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void RaceManager::setPlayerKart(unsigned int player, const std::string& kart)
|
||||
void RaceManager::setLocalPlayerKart(unsigned int player, const std::string& kart)
|
||||
{
|
||||
|
||||
if (player >= 0 && player < 4)
|
||||
{
|
||||
if (player >= getNumPlayers())
|
||||
setNumPlayers(player+1);
|
||||
m_player_karts[player] = kart;
|
||||
if (player >= getNumLocalPlayers())
|
||||
setNumLocalPlayers(player+1);
|
||||
m_local_player_karts[player] = kart;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Warning: player '%d' does not exists.\n", player);
|
||||
}
|
||||
} // setLocalPlayerKart
|
||||
//-----------------------------------------------------------------------------
|
||||
void RaceManager::setPlayerKart(unsigned int player, const std::string& kart,
|
||||
const std::string& player_name, int host_id)
|
||||
{
|
||||
if (player >= getNumPlayers())
|
||||
setNumPlayers(player+1);
|
||||
m_player_karts[player] = kart;
|
||||
m_player_names[player] = player_name;
|
||||
} // setPlayerKart
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void RaceManager::setNumPlayers(int num)
|
||||
{
|
||||
m_player_karts.resize(num);
|
||||
m_player_names.resize(num);
|
||||
for(PlayerKarts::iterator i = m_player_karts.begin(); i != m_player_karts.end(); ++i)
|
||||
{
|
||||
if (i->empty())
|
||||
{
|
||||
*i = "tuxkart";
|
||||
}
|
||||
}
|
||||
if (i->empty()) *i = "tuxkart";
|
||||
for(PlayerKarts::iterator i = m_player_names.begin(); i != m_player_names.end(); ++i)
|
||||
if (i->empty()) *i = "guest";
|
||||
|
||||
} // setNumPlayers
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -54,6 +54,7 @@ private:
|
||||
struct KartStatus
|
||||
{
|
||||
std::string m_ident; // The .tkkf filename without the .tkkf
|
||||
std::string m_player_name; // for networked karts
|
||||
int m_score; // score for this kart
|
||||
int m_last_score; // needed for restart race
|
||||
double m_overall_time; // sum of times of all races
|
||||
@ -77,7 +78,10 @@ private:
|
||||
RaceModeType m_major_mode, m_minor_mode;
|
||||
typedef std::vector<std::string> PlayerKarts;
|
||||
PlayerKarts m_player_karts;
|
||||
PlayerKarts m_local_player_karts;
|
||||
std::vector<std::string> m_player_names;
|
||||
std::vector<std::string> m_tracks;
|
||||
std::vector<int> m_host_ids;
|
||||
std::vector<int> m_num_laps;
|
||||
std::vector<int> m_score_for_position;
|
||||
int m_track_number;
|
||||
@ -102,11 +106,16 @@ public:
|
||||
RaceManager();
|
||||
~RaceManager();
|
||||
|
||||
void setPlayerKart(unsigned int player, const std::string& kart);
|
||||
void setNumPlayers(int num);
|
||||
void setPlayerKart(unsigned int player, const std::string& kart,
|
||||
const std::string& player_name, int hostid);
|
||||
void setLocalPlayerKart(unsigned int player, const std::string& kart);
|
||||
const std::string&
|
||||
getLocalPlayerKart(unsigned int p) const {return m_local_player_karts[p];}
|
||||
void reset();
|
||||
void RaceFinished(const Kart* kart, float time);
|
||||
void setTrack(const std::string& track);
|
||||
void setNumPlayers(int num);
|
||||
void setNumLocalPlayers(int num) {m_local_player_karts.resize(num); }
|
||||
void setGrandPrix(const GrandPrixData &gp){ m_grand_prix = gp; }
|
||||
void setDifficulty(Difficulty diff);
|
||||
void setNumLaps(int num) { m_num_laps.clear();
|
||||
@ -119,6 +128,7 @@ public:
|
||||
RaceModeType getMinorMode() const { return m_minor_mode; }
|
||||
unsigned int getNumKarts() const { return m_num_karts; }
|
||||
unsigned int getNumPlayers() const { return (int)m_player_karts.size();}
|
||||
unsigned int getNumLocalPlayers() const { return (int)m_local_player_karts.size();}
|
||||
int getNumLaps() const { return m_num_laps[m_track_number];}
|
||||
Difficulty getDifficulty() const { return m_difficulty; }
|
||||
const std::string&
|
||||
@ -133,7 +143,7 @@ public:
|
||||
getHerringStyle() const { return m_grand_prix.getHerringStyle();}
|
||||
int getKartScore(int krt) const { return m_kart_status[krt].m_score;}
|
||||
int getKartPrevScore(int krt)const { return m_kart_status[krt].m_last_score;}
|
||||
int getkartPlayerId(int krt) const { return m_kart_status[krt].m_player_id;}
|
||||
int getKartPlayerId(int krt) const { return m_kart_status[krt].m_player_id;}
|
||||
int getPositionScore(int p) const { return m_score_for_position[p-1]; }
|
||||
double getOverallTime(int kart) const { return m_kart_status[kart].m_overall_time;}
|
||||
int getCoinTarget() const { return m_coin_target; }
|
||||
|
@ -96,6 +96,7 @@ World::World()
|
||||
loadTrack() ;
|
||||
|
||||
m_player_karts.resize(race_manager->getNumPlayers());
|
||||
m_local_player_karts.resize(race_manager->getNumLocalPlayers());
|
||||
|
||||
for(unsigned int i=0; i<race_manager->getNumKarts(); i++)
|
||||
{
|
||||
@ -103,7 +104,7 @@ World::World()
|
||||
btTransform init_pos=m_track->getStartTransform(position);
|
||||
Kart* newkart;
|
||||
const std::string& kart_name=race_manager->getKartName(i);
|
||||
int player_id = race_manager->getkartPlayerId(i);
|
||||
int player_id = race_manager->getKartPlayerId(i);
|
||||
if(user_config->m_profile)
|
||||
{
|
||||
// In profile mode, load only the old kart
|
||||
|
@ -78,18 +78,11 @@ public:
|
||||
void restartRace();
|
||||
void disableRace(); // Put race into limbo phase
|
||||
|
||||
PlayerKart* getPlayerKart(int player) const
|
||||
{
|
||||
return m_player_karts[player];
|
||||
}
|
||||
|
||||
|
||||
Kart* getKart(int kartId) const
|
||||
{
|
||||
assert(kartId >= 0 &&
|
||||
kartId < int(m_kart.size()));
|
||||
return m_kart[kartId];
|
||||
}
|
||||
PlayerKart *getPlayerKart(int player) const { return m_player_karts[player]; }
|
||||
PlayerKart *getLocalPlayerKart(int n) const { return m_local_player_karts[n]; }
|
||||
Kart *getKart(int kartId) const { assert(kartId >= 0 &&
|
||||
kartId < int(m_kart.size()));
|
||||
return m_kart[kartId]; }
|
||||
unsigned int getCurrentNumKarts() const { return (int)m_kart.size()-
|
||||
m_eliminated_karts; }
|
||||
unsigned int getCurrentNumPlayers() const { return (int)m_player_karts.size()-
|
||||
@ -111,6 +104,7 @@ public:
|
||||
private:
|
||||
Karts m_kart;
|
||||
std::vector<PlayerKart*> m_player_karts;
|
||||
std::vector<PlayerKart*> m_local_player_karts;
|
||||
Physics* m_physics;
|
||||
float m_fastest_lap;
|
||||
Kart* m_fastest_kart;
|
||||
|
Loading…
x
Reference in New Issue
Block a user