Bug #853 Fixes to network game menus.

Still has some bugs, but now allows select of drivers and cars. Track selection is NOT
properly relayed to client, and causes screen to blank as race starts.

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@5746 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: 95ce8ed8fdcf9a831bc500b6571ae807b319dc43
Former-commit-id: d487edb778ea8b62b9e6cc6d2ce8468b8ca4aff2
This commit is contained in:
mungewell 2013-12-05 07:19:29 +00:00
parent 878cacd3ad
commit 8dd34fc80e
5 changed files with 352 additions and 132 deletions

View file

@ -652,7 +652,9 @@ void NetClient::ConnectToDriver(NetDriver driver)
}
else
{
GfLogWarning("Failed to connect to peer!\n");
//char hostName[256];
//enet_address_get_host_ip (&event.peer->address,hostName,256);
GfLogWarning("Failed to connect to peer! (%X)\n", &event.peer->address);
return;
}

View file

@ -165,6 +165,7 @@ public:
char module[64];
char type[64];
bool client;
bool active;
};
//Holds car setup values
@ -422,8 +423,8 @@ public:
NetServerMutexData * LockServerData();
void UnlockServerData();
protected:
void GenerateDriversForXML();
protected:
//Packets
void ReadDriverInfoPacket(ENetPacket *ENetPacket, ENetPeer * pPeer);
void ReadDriverReadyPacket(ENetPacket *pPacket);

View file

@ -112,7 +112,6 @@ bool RobotXml::ReadRobotDrivers(const char*pRobotName,std::vector<NetDriver> &ve
driver.address.port = (enet_uint16)GfParmGetNum(params, path2, "port",NULL,0);
strncpy(driver.module,NETWORKROBOT,64);
vecDrivers.push_back(driver);
printf("Adding driver \n");
}
GfParmReleaseHandle(params);

View file

@ -250,37 +250,35 @@ void NetServer::GenerateDriversForXML()
const char *pName =GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_NAME, "");
int nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
//Gather vector of all non human drivers
std::vector<NetDriver> vecRDrivers;
for (int i=1;i<=nCars;i++)
{
NetDriver driver;
ReadDriverData(driver,i,params);
if (strcmp(driver.module,NETWORKROBOT) && strcmp(driver.module,HUMANROBOT))
vecRDrivers.push_back(driver);
}
//Recreate drivers section robots first
char drvSec[256];
GfParmListClean(params, RM_SECT_DRIVERS);
for (int i=0;i<(int)vecRDrivers.size();i++)
{
int index = i+1;
sprintf(drvSec, "%s/%d", RM_SECT_DRIVERS, index);
GfParmSetNum(params, drvSec, RM_ATTR_IDX, (char*)NULL, (tdble)vecRDrivers[i].idx);
GfParmSetStr(params, drvSec, RM_ATTR_MODULE, vecRDrivers[i].module);
}
//And then add the networkhuman drivers
// We only want to add human drivers which don't already exist
NetServerMutexData *pSData = LockServerData();
for (int i=0;i<(int)pSData->m_vecNetworkPlayers.size();i++)
{
int index = i+1+vecRDrivers.size();
sprintf(drvSec, "%s/%d", RM_SECT_DRIVERS, index);
GfParmSetNum(params, drvSec, RM_ATTR_IDX, (char*)NULL,(tdble) pSData->m_vecNetworkPlayers[i].idx);
GfParmSetStr(params, drvSec, RM_ATTR_MODULE, pSData->m_vecNetworkPlayers[i].module);
char path2[256];
int index = 1;
bool found = false;
// Skip the ones which aren't active
if (pSData->m_vecNetworkPlayers[i].active == false) continue;
while (!found) {
sprintf(path2, "%s/%d", RM_SECT_DRIVERS, index++);
if (GfParmExistsSection(params, path2) == 0) {
// driver not found, so add them at the end
GfLogInfo("Adding driver %s to XML\n", pSData->m_vecNetworkPlayers[i].name);
GfParmSetNum(params, path2, RM_ATTR_IDX, (char*)NULL,(tdble) pSData->m_vecNetworkPlayers[i].idx);
GfParmSetStr(params, path2, RM_ATTR_MODULE, pSData->m_vecNetworkPlayers[i].module);
// should also write skin information
break;
}
if ((tdble)pSData->m_vecNetworkPlayers[i].idx == GfParmGetNum(params, path2, RM_ATTR_IDX, NULL,1.0) &&
strcmp(pSData->m_vecNetworkPlayers[i].module, GfParmGetStr(params, path2, RM_ATTR_MODULE,NULL)) == 0) {
GfLogInfo("Found driver %s in XML\n", pSData->m_vecNetworkPlayers[i].name);
found = true;
}
}
}
UnlockServerData();
@ -293,9 +291,16 @@ void NetServer::SetLocalDrivers()
{
m_setLocalDrivers.clear();
m_driverIdx = GetDriverIdx();
GfLogTrace("Adding Human start rank: %i\n",m_driverIdx);
m_setLocalDrivers.insert(m_driverIdx-1);
// add all local drivers
NetServerMutexData *pSData = LockServerData();
for (int i=0;i<(int)pSData->m_vecNetworkPlayers.size();i++)
{
if(pSData->m_vecNetworkPlayers[i].client == false) {
m_setLocalDrivers.insert(i);
GfLogTrace("Adding Human start rank: %i\n",i);
}
}
UnlockServerData();
assert(m_strRaceXMLFile!="");
@ -662,6 +667,7 @@ void NetServer::ReadDriverInfoPacket(ENetPacket *pPacket, ENetPeer * pPeer)
msg.unpack_string(driver.module, sizeof driver.module);
msg.unpack_string(driver.type, sizeof driver.type);
driver.client = msg.unpack_int() ? true : false;
driver.active = true;
}
catch (PackedBufferException &e)
{
@ -669,8 +675,8 @@ void NetServer::ReadDriverInfoPacket(ENetPacket *pPacket, ENetPeer * pPeer)
}
GfLogTrace("ReadDriverInfoPacket: driver\n");
GfLogTrace(".host=%d\n", driver.address.host);
GfLogTrace(".port=%d\n", driver.address.port);
GfLogTrace(".host=%X\n", pPeer->address.host);
GfLogTrace(".port=%d\n", pPeer->address.port);
GfLogTrace(".idx=%d\n", driver.idx);
GfLogTrace(".name=%s\n", driver.name);
GfLogTrace(".car=%s\n", driver.car);
@ -691,6 +697,12 @@ void NetServer::ReadDriverInfoPacket(ENetPacket *pPacket, ENetPeer * pPeer)
{
if (strcmp(driver.name,pSData->m_vecNetworkPlayers[i].name)==0)
{
// check to see if existing client is just updating details
if (pPeer->address.host == pSData->m_vecNetworkPlayers[i].address.host) {
GfLogInfo("Client driver updated details\n");
break;
}
SendPlayerRejectedPacket(pPeer,"Player name already used. Please choose a different name.");
UnlockServerData();
return;

View file

@ -33,7 +33,9 @@
#include <raceman.h>
#include <robot.h>
#include <race.h>
#include <cars.h>
#include <drivers.h>
#include <network.h>
#include <playerconfig.h>
@ -43,6 +45,7 @@
#include "legacymenu.h"
#include "racescreens.h"
#include "garagemenu.h"
int g_readystatus[MAXNETWORKPLAYERS];
@ -64,9 +67,10 @@ int g_RaceSetupId;
static int g_IPEditId;
static int g_NameId;
static char buf[1024];
static void *racemanMenuHdle = NULL;
static bool bRobotsReady = false;
static bool bGarage = false;
//static char *g_pDriver = NULL;
//static char *g_pCar = NULL;
@ -83,7 +87,10 @@ static std::string g_strHostIP = "127.0.0.1";
HostSettingsMenu g_HostMenu;
CarSettingsMenu g_CarMenu;
static void GetHumanDriver(NetDriver &driver,int index);
// The car selection menu.
static RmGarageMenu GarageMenu;
static int GetHumanDriver(NetDriver &driver,int index);
static void ServerPrepareStartNetworkRace(void *pVoid);
static void NetworkClientConnectMenu(void * /* dummy */);
@ -98,16 +105,41 @@ static void EnableMenuHostButtons(bool bChecked)
// Disable/enable menu selections
const int isEnabled = bChecked ? GFUI_DISABLE : GFUI_ENABLE;
GfuiEnable(racemanMenuHdle, g_CarSetupButtonId, isEnabled);
GfuiEnable(racemanMenuHdle, g_HostSettingsButtonId, isEnabled);
//GfuiEnable(racemanMenuHdle, g_HostSettingsButtonId, isEnabled);
GfuiEnable(racemanMenuHdle, g_CancelButtonId, isEnabled);
GfuiEnable(racemanMenuHdle, g_RaceSetupId, isEnabled);
}
static void onHostPlayerReady(tCheckBoxInfo* pInfo)
{
SetReadyStatus(NetGetNetwork()->GetDriverIdx()-1, pInfo->bChecked);
NetGetNetwork()->SetDriverReady(pInfo->bChecked);
tRmInfo* reInfo = LmRaceEngine().inData();
char dname[256];
int nCars = GfParmGetEltNb(reInfo->params, RM_SECT_DRIVERS);
NetServerMutexData *pSData = NetGetServer()->LockServerData();
for (int i=1; i <= nCars; i++) {
sprintf(dname, "%s/%d", RM_SECT_DRIVERS, i);
GfLogInfo("Setting driver %d to %d\n", i, pInfo->bChecked);
if(strcmp(NETWORKROBOT, GfParmGetStr(reInfo->params, dname, RM_ATTR_MODULE, "")) == 0) {
// Human drive, check if local
int index = GfParmGetNum(reInfo->params, dname, RM_ATTR_IDX, NULL, 1.0) - 1;
GfLogInfo("Index %d\n", index);
if (pSData->m_vecNetworkPlayers[index].client == false)
NetGetServer()->OverrideDriverReady(i, pInfo->bChecked);
} else {
// Robot driver, all are local
NetGetServer()->OverrideDriverReady(i, pInfo->bChecked);
}
bRobotsReady = pInfo->bChecked;
}
NetGetServer()->UnlockServerData();
EnableMenuHostButtons(pInfo->bChecked);
GfLogInfo("menu ready\n");
}
static void EnableMenuClientButtons(bool bChecked)
@ -120,8 +152,14 @@ static void EnableMenuClientButtons(bool bChecked)
static void onClientPlayerReady(tCheckBoxInfo* pInfo)
{
SetReadyStatus(NetGetNetwork()->GetDriverIdx()-1,pInfo->bChecked);
NetGetNetwork()->SetDriverReady(pInfo->bChecked);
int nDriverIdx = NetGetNetwork()->GetDriverIdx();
// Local Human Driver
if (nDriverIdx > -1) {
SetReadyStatus(nDriverIdx-1, pInfo->bChecked);
NetGetNetwork()->SetDriverReady(pInfo->bChecked);
}
EnableMenuClientButtons(pInfo->bChecked);
}
@ -191,6 +229,7 @@ GetTrackOutlineFileName(const char *pszCategory,const char *pszTrack)
static void
UpdateNetworkPlayers()
{
GfDriver* newDriver;
NetNetwork *pNetwork = NetGetNetwork();
if (pNetwork->GetRefreshDisplay() == false)
@ -209,6 +248,64 @@ UpdateNetworkPlayers()
reInfo->_reName = GfParmGetStr(reInfo->params, RM_SECT_HEADER, RM_ATTR_NAME, "");
assert(reInfo->_reName);
// Scan each of the human drivers to see if they're active in this race
if (NetIsServer()) {
NetServerMutexData *pSData = NetGetServer()->LockServerData();
assert(pSData);
// Ensure that garage menu knows about driver
for (unsigned int i=0; i < pSData->m_vecNetworkPlayers.size(); i++) {
newDriver = GfDrivers::self()->getDriver(NETWORKROBOT, pSData->m_vecNetworkPlayers[i].idx);
if (!newDriver) {
GfLogInfo("Driver %s not found, reloading drivers\n", pSData->m_vecNetworkPlayers[i].name);
GfDrivers::self()->reload();
LmRaceEngine().race()->load(LmRaceEngine().race()->getManager(), true);
break;
}
}
for (unsigned int i=0; i < pSData->m_vecNetworkPlayers.size(); i++) {
int k = 1;
char path2[256];
pSData->m_vecNetworkPlayers[i].active = false;
newDriver = GfDrivers::self()->getDriver(NETWORKROBOT, pSData->m_vecNetworkPlayers[i].idx);
// Scan through drivers listed in 'networkrace.xml'
while (pSData->m_vecNetworkPlayers[i].active == false) {
sprintf(path2, "%s/%d", RM_SECT_DRIVERS, k++);
if (GfParmExistsSection(reInfo->params, path2) == 0) {
GfLogInfo("UpdateNetworkPlayers: Removing driver %s\n", pSData->m_vecNetworkPlayers[i].name);
if (pSData->m_vecNetworkPlayers[i].client) {
//need to tell/force client to disconnect
}
break;
}
if ((tdble)pSData->m_vecNetworkPlayers[i].idx == GfParmGetNum(reInfo->params, path2, RM_ATTR_IDX, NULL, 1.0) &&
strcmp(NETWORKROBOT, GfParmGetStr(reInfo->params, path2, RM_ATTR_MODULE, "")) == 0) {
pSData->m_vecNetworkPlayers[i].active = true;
}
}
// add or remove from competitor list (for garage menu)
GfDriver* activeDriver = LmRaceEngine().race()->getCompetitor(NETWORKROBOT, pSData->m_vecNetworkPlayers[i].idx);
if (pSData->m_vecNetworkPlayers[i].active) {
if (!activeDriver) LmRaceEngine().race()->appendCompetitor(newDriver);
} else {
if (activeDriver) LmRaceEngine().race()->removeCompetitor(newDriver);
}
}
NetGetServer()->UnlockServerData();
} else {
// Client XML files already written to disk - this works but is not the best solution....
GfDrivers::self()->reload();
tRmInfo* reInfo = LmRaceEngine().inData();
LmRaceEngine().race()->load(LmRaceEngine().race()->getManager(), true);
}
//Update track info
std::string strTrackPath = GfParmGetStr(reInfo->params, "Tracks/1", RM_ATTR_NAME, "");
std::string strCategory = GfParmGetStr(reInfo->params, "Tracks/1", RM_ATTR_CATEGORY, "");
@ -280,9 +377,26 @@ UpdateNetworkPlayers()
// 1) make the networking module take care of the robot drivers too
// (in m_vecReadyStatus, m_vecNetworkPlayers, ...)
// 2) make the networking _menu_ only take care of the networkhuman drivers.
NetMutexData *pNData = NetGetNetwork()->LockNetworkData();
bool bReady = pNData->m_vecReadyStatus[i-1];
NetGetNetwork()->UnlockNetworkData();
bool bReady = bRobotsReady;
if(strcmp(NETWORKROBOT, GfParmGetStr(reInfo->params, dname, RM_ATTR_MODULE, "")) == 0) {
// Write car model, as it may have changed via garage menu
if (NetIsServer()) {
NetServerMutexData *pSData = NetGetServer()->LockServerData();
strncpy(pSData->m_vecNetworkPlayers[idx-1].car, car, 64);
GfLogInfo("idx %d car set to %s\n", idx, car);
// also need to write back for garage menu
const GfCar* newCar = GfCars::self()->getCar(car);
newDriver = GfDrivers::self()->getDriver(NETWORKROBOT, pSData->m_vecNetworkPlayers[idx-1].idx);
newDriver->setCar(newCar);
NetGetServer()->UnlockServerData();
}
//GfLogInfo("idx %d, m_vecReadyStatus.size() %d\n", idx, pNData->m_vecReadyStatus.size());
NetMutexData *pNData = NetGetNetwork()->LockNetworkData();
bReady = pNData->m_vecReadyStatus[idx-1];
NetGetNetwork()->UnlockNetworkData();
}
int readyindex = 0;
if (bReady)
@ -314,7 +428,7 @@ UpdateNetworkPlayers()
GfParmReleaseHandle(pMod);
}
//Clear out
//Clear out rest of table
for (int i=nCars;i<MAXNETWORKPLAYERS;i++)
{
GfuiVisibilitySet(racemanMenuHdle,g_readystatus[i],false);
@ -372,13 +486,14 @@ CheckDriversCategory()
NetServerMutexData *pSData = NetGetServer()->LockServerData();
count = pSData->m_vecNetworkPlayers.size();
for (unsigned int i=0;i<count;i++)
{
const GfCar* pCar = GfCars::self()->getCar(pSData->m_vecNetworkPlayers[i].car);
if (pCar->getCategoryId() != strCarCat)
{
//Pick first car in categroy
strncpy(pSData->m_vecNetworkPlayers[i].car,vecCars[0].c_str(),64);
//strncpy(pSData->m_vecNetworkPlayers[i].car,vecCars[0].c_str(),64);
bDriversChange = true;
NetGetServer()->OverrideDriverReady(pSData->m_vecNetworkPlayers[i].idx,false);
}
@ -465,23 +580,63 @@ ClientIdle(void)
static void
NetworkRaceInfo()
{
NetGetServer()->SetRaceXMLFile("config/raceman/networkrace.xml");
NetDriver driver;
std::string strName = NetGetServer()->GetDriverName();
if (strName =="")
{
GetHumanDriver(driver,1);
driver.client = false;
NetGetServer()->UpdateDriver(driver);
NetGetServer()->SetDriverName(driver.name);
}
int i = 1;
NetGetServer()->SetRaceXMLFile("config/raceman/networkrace.xml");
//Look up race info
tRmInfo* reInfo = LmRaceEngine().inData();
reInfo->params =
GfParmReadFileLocal("config/raceman/networkrace.xml",GFPARM_RMODE_REREAD);
assert(reInfo->params);
reInfo->params = GfParmReadFileLocal("config/raceman/networkrace.xml",GFPARM_RMODE_STD);
int nCars = GfParmGetEltNb(reInfo->params, RM_SECT_DRIVERS);
if (nCars == 0)
{
// Add all local humans if there are no drivers already specified
while (GetHumanDriver(driver,i++)) {
driver.client = false;
driver.active = true;
NetGetServer()->UpdateDriver(driver);
NetGetServer()->SetDriverName(driver.name);
GfLogInfo("NetworkRaceInfo: Adding default driver %s\n",driver.name);
}
// ensure changes writen to 'networkrace.xml'
NetGetServer()->GenerateDriversForXML();
// add drivers so they show up in race config dialogue
GfDrivers::self()->reload();
LmRaceEngine().race()->load(LmRaceEngine().race()->getManager(), true);
} else {
// Add the humans which are already in the race
char dname[256];
for (i = 1; i < nCars+1; i++) {
sprintf(dname, "%s/%d", RM_SECT_DRIVERS, i);
if(strcmp(NETWORKROBOT, GfParmGetStr(reInfo->params, dname, RM_ATTR_MODULE, "")) == 0) {
if (GetHumanDriver(driver,i) > -1) {
driver.client = false;
driver.active = true;
NetGetServer()->UpdateDriver(driver);
NetGetServer()->SetDriverName(driver.name);
GfLogInfo("NetworkRaceInfo: Adding default driver %s\n",driver.name);
}
}
}
}
// make sure nobody is 'ready to race'
NetMutexData *pNData = NetGetNetwork()->LockNetworkData();
for (unsigned int i=0; i < pNData->m_vecReadyStatus.size(); i++)
pNData->m_vecReadyStatus[i] = false;
NetGetNetwork()->UnlockNetworkData();
bRobotsReady = false;
// ensure the system knows about 'new' network drivers
reInfo->params = GfParmReadFileLocal("config/raceman/networkrace.xml",GFPARM_RMODE_REREAD);
reInfo->_reName = GfParmGetStr(reInfo->params, RM_SECT_HEADER, RM_ATTR_NAME, "");
}
@ -493,7 +648,40 @@ NetworkRaceInfo()
static void OnActivateNetworkClient(void *)
{
int nDriverIdx = NetGetNetwork()->GetDriverIdx();
if(NetGetNetwork()->IsConnected() && nDriverIdx > -1) {
// Menu reactivated after garage menu is done
NetDriver driver;
char newName[64];
char dname[256];
// check for car change
if (bGarage == true ) {
bGarage = false;
tRmInfo* reInfo = LmRaceEngine().inData();
reInfo->params = GfParmReadFileLocal("config/raceman/networkrace.xml",GFPARM_RMODE_REREAD);
reInfo->_reName = GfParmGetStr(reInfo->params, RM_SECT_HEADER, RM_ATTR_NAME, "");
sprintf(dname, "%s/%d", RM_SECT_DRIVERS, nDriverIdx);
int idx = GfParmGetNum(reInfo->params, dname, RM_ATTR_IDX, "",0);
GfDriver* PCurrentDriver = GfDrivers::self()->getDriver(NETWORKROBOT, idx);
strncpy(newName, PCurrentDriver->getCar()->getId().c_str(), sizeof(newName));
GfLogInfo("Client: Index %d changed to %s\n", idx, newName);
NetGetNetwork()->SetCarInfo(newName);
} else {
// Ensure menu system knows about all cars
GfDrivers::self()->reload();
tRmInfo* reInfo = LmRaceEngine().inData();
LmRaceEngine().race()->load(LmRaceEngine().race()->getManager(), true);
}
}
GfuiApp().eventLoop().setRecomputeCB(ClientIdle);
bGarage = false;
}
@ -502,17 +690,20 @@ OnActivateNetworkHost(void *)
{
tRmInfo* reInfo = LmRaceEngine().inData();
// Set everyone to the 'not-ready' state
bRobotsReady = 0;
NetMutexData *pNData = NetGetNetwork()->LockNetworkData();
for (unsigned int i=0;i<pNData->m_vecReadyStatus.size();i++)
pNData->m_vecReadyStatus[i] = false;
NetGetNetwork()->UnlockNetworkData();
NetGetServer()->SetRaceInfoChanged(true);
reInfo->params = GfParmReadFileLocal("config/raceman/networkrace.xml",GFPARM_RMODE_REREAD);
assert(reInfo->params);
reInfo->_reName = GfParmGetStr(reInfo->params, RM_SECT_HEADER, RM_ATTR_NAME, "");
GfuiApp().eventLoop().setRecomputeCB(HostServerIdle);
NetGetServer()->SetRefreshDisplay(true);
}
@ -529,9 +720,30 @@ rmNetworkServerDisconnect(void * /* dummy */)
static void
rmCarSettingsMenu(void *pMenu)
{
g_CarMenu.initialize(pMenu,g_strCar.c_str());
RmSetRacemanMenuHandle(g_CarMenu.getMenuHandle());
g_CarMenu.runMenu();
int nDriverIdx = NetGetNetwork()->GetDriverIdx();
if (nDriverIdx > -1) {
NetDriver driver;
char newName[64];
char dname[256];
// check for car change
GfLogInfo("Car %d changed \n", nDriverIdx);
tRmInfo* reInfo = LmRaceEngine().inData();
reInfo->params = GfParmReadFileLocal("config/raceman/networkrace.xml",GFPARM_RMODE_REREAD);
reInfo->_reName = GfParmGetStr(reInfo->params, RM_SECT_HEADER, RM_ATTR_NAME, "");
sprintf(dname, "%s/%d", RM_SECT_DRIVERS, nDriverIdx);
int idx = GfParmGetNum(reInfo->params, dname, RM_ATTR_IDX, "",0);
// Garage menu to change clients car
GfDriver* PCurrentDriver = GfDrivers::self()->getDriver(NETWORKROBOT, idx);
GarageMenu.setPreviousMenuHandle(racemanMenuHdle);
GarageMenu.runMenu(LmRaceEngine().race(), PCurrentDriver);
bGarage = true;
}
}
static void
@ -562,21 +774,21 @@ RmNetworkHostMenu(void * /* dummy */)
}
}
if (racemanMenuHdle)
if (racemanMenuHdle)
GfuiScreenRelease(racemanMenuHdle);
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)OnActivateNetworkHost,
NULL, (tfuiCallback)NULL, 1);
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)OnActivateNetworkHost,
NULL, (tfuiCallback)NULL, 1);
void *mparam = GfuiMenuLoad("networkhostmenu.xml");
void *mparam = GfuiMenuLoad("networkhostmenu.xml");
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
RmSetRacemanMenuHandle(racemanMenuHdle);
NetworkRaceInfo();
g_trackHd = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,"trackname");
g_trackHd = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,"trackname");
g_lapsHd = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,"lapcountname");
g_catHd = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,"carcatname");
@ -584,50 +796,48 @@ RmNetworkHostMenu(void * /* dummy */)
g_OutlineId = GfuiMenuCreateStaticImageControl(racemanMenuHdle,mparam,"outlineimage");
//Show players
for (int i = 0; i < MAXNETWORKPLAYERS; i++)
{
char buf[1024];
sprintf(buf,"ready%i",i);
g_readystatus[i] = GfuiMenuCreateStaticImageControl(racemanMenuHdle,mparam,buf);
for (int i = 0; i < MAXNETWORKPLAYERS; i++) {
char buf[1024];
sprintf(buf,"ready%i",i);
g_readystatus[i] = GfuiMenuCreateStaticImageControl(racemanMenuHdle,mparam,buf);
GfuiVisibilitySet(racemanMenuHdle,g_readystatus[i],false);
sprintf(buf,"driver%i",i);
g_playerNames[i] = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,buf);
sprintf(buf,"driver%i",i);
g_playerNames[i] = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,buf);
GfuiLabelSetText(racemanMenuHdle,g_playerNames[i],"");
sprintf(buf,"car%i",i);
g_carNames[i] = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,buf);
sprintf(buf,"car%i",i);
g_carNames[i] = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,buf);
GfuiLabelSetText(racemanMenuHdle,g_carNames[i],"");
}
}
g_ReadyCheckboxId =
GfuiMenuCreateCheckboxControl(racemanMenuHdle, mparam, "playerreadycheckbox",
NULL, onHostPlayerReady);
NULL, onHostPlayerReady);
g_HostSettingsButtonId =
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "networkhostsettings",
racemanMenuHdle, rmNetworkHostSettingsMenu);
racemanMenuHdle, rmNetworkHostSettingsMenu);
GfuiEnable(racemanMenuHdle, g_HostSettingsButtonId, GFUI_DISABLE);
g_RaceSetupId =
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "racesetup",
racemanMenuHdle, RmConfigureRace);
// Garage button disabled as long as the "car settings menu"
// is not finished / merged with the "car select" one.
g_CarSetupButtonId =
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "garage",
racemanMenuHdle, rmCarSettingsMenu);
//GfuiEnable(racemanMenuHdle, g_CarSetupButtonId, GFUI_DISABLE);
racemanMenuHdle, RmConfigureRace);
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "start race",
NULL, ServerPrepareStartNetworkRace);
g_CancelButtonId = GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "cancel",
NULL, rmNetworkServerDisconnect);
NULL, rmNetworkServerDisconnect);
GfParmReleaseHandle(mparam);
GfParmReleaseHandle(mparam);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
GfuiAddKey(racemanMenuHdle, GFUIK_ESCAPE, "Back to previous menu",
0, 0, rmNetworkServerDisconnect);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
GfuiAddKey(racemanMenuHdle, GFUIK_ESCAPE, "Back to previous menu",
0, 0, rmNetworkServerDisconnect);
UpdateNetworkPlayers();
GfuiScreenActivate(racemanMenuHdle);
GfuiScreenActivate(racemanMenuHdle);
}
static void
@ -641,7 +851,7 @@ ShowWaitingToConnectScreen()
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback) NULL,
NULL, (tfuiCallback)NULL, 1);
void *mparam = GfuiMenuLoad("networkwaitconnectmenu.xml");
void *mparam = GfuiMenuLoad("networkwaitconnectmenu.xml");
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
@ -666,6 +876,7 @@ RmNetworkClientMenu(void * /* dummy */)
NetDriver driver;
GetHumanDriver(driver,1);
driver.client = true;
driver.active = true;
strcpy(driver.name,g_strDriver.c_str());
if (!NetGetClient()->ConnectToServer((char*)g_strHostIP.c_str(),SPEEDDREAMSPORT,&driver))
{
@ -683,7 +894,7 @@ RmNetworkClientMenu(void * /* dummy */)
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)OnActivateNetworkClient,
NULL, (tfuiCallback)NULL, 1);
void *mparam = GfuiMenuLoad("networkclientmenu.xml");
void *mparam = GfuiMenuLoad("networkclientmenu.xml");
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
@ -708,6 +919,7 @@ RmNetworkClientMenu(void * /* dummy */)
sprintf(buf,"driver%i",i);
g_playerNames[i] = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,buf);
GfuiLabelSetText(racemanMenuHdle,g_playerNames[i],"");
sprintf(buf,"car%i",i);
g_carNames[i] = GfuiMenuCreateLabelControl(racemanMenuHdle,mparam,buf);
GfuiLabelSetText(racemanMenuHdle,g_carNames[i],"");
@ -716,12 +928,9 @@ RmNetworkClientMenu(void * /* dummy */)
g_ReadyCheckboxId =
GfuiMenuCreateCheckboxControl(racemanMenuHdle, mparam, "playerreadycheckbox",
NULL, onClientPlayerReady);
// Garage button disabled as long as the "car settings menu"
// is not finished / merged with the "car select" one.
g_CarSetupButtonId =
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "garage",
racemanMenuHdle, rmCarSettingsMenu);
//GfuiEnable(racemanMenuHdle, g_CarSetupButtonId, GFUI_DISABLE);
g_DisconnectButtonId =
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "disconnect",
@ -789,20 +998,17 @@ NetworkClientConnectMenu(void * /* dummy */)
if (racemanMenuHdle)
GfuiScreenRelease(racemanMenuHdle);
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)NULL,
NULL, (tfuiCallback)NULL, 1);
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)NULL, NULL, (tfuiCallback)NULL, 1);
void *mparam = GfuiMenuLoad("networkclientconnectmenu.xml");
void *mparam = GfuiMenuLoad("networkclientconnectmenu.xml");
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
g_IPEditId = GfuiMenuCreateEditControl(racemanMenuHdle, mparam, "IPAddrEdit",
0, 0, ChangeIP);
g_IPEditId = GfuiMenuCreateEditControl(racemanMenuHdle, mparam, "IPAddrEdit", 0, 0, ChangeIP);
char namebuf[255];
snprintf(namebuf, sizeof(namebuf), "%s", g_strDriver.c_str());
g_NameId = GfuiMenuCreateEditControl(racemanMenuHdle, mparam, "PlayerNameEdit",
0, 0, ChangeName);
g_NameId = GfuiMenuCreateEditControl(racemanMenuHdle, mparam, "PlayerNameEdit", 0, 0, ChangeName);
GfuiEditboxSetString(racemanMenuHdle, g_NameId, namebuf);
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "ConnectButton",
@ -811,10 +1017,10 @@ NetworkClientConnectMenu(void * /* dummy */)
RmRaceSelectMenuHandle, GfuiScreenActivate);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
GfuiAddKey(racemanMenuHdle, GFUIK_ESCAPE, "Back to previous menu",
RmRaceSelectMenuHandle, 0, GfuiScreenActivate);
GfuiAddKey(racemanMenuHdle, GFUIK_ESCAPE, "Back to previous menu",
RmRaceSelectMenuHandle, 0, GfuiScreenActivate);
GfParmReleaseHandle(mparam);
GfParmReleaseHandle(mparam);
GfuiScreenActivate(racemanMenuHdle);
}
@ -832,17 +1038,16 @@ RmNetworkMenu(void *)
NetGetNetwork()->ResetNetwork();
}
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)NULL,
NULL, (tfuiCallback)NULL, 1);
racemanMenuHdle = GfuiScreenCreate(NULL, NULL, (tfuiCallback)NULL,
NULL, (tfuiCallback)NULL, 1);
void *mparam = GfuiMenuLoad("networkmenu.xml");
void *mparam = GfuiMenuLoad("networkmenu.xml");
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
GfuiMenuCreateStaticControls(racemanMenuHdle, mparam);
const int nTitleLabelId =
GfuiMenuCreateLabelControl(racemanMenuHdle, mparam, "TitleLabel");
const char* pszTitle = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_NAME, 0);
if (pszTitle)
const int nTitleLabelId = GfuiMenuCreateLabelControl(racemanMenuHdle, mparam, "TitleLabel");
const char* pszTitle = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_NAME, 0);
if (pszTitle)
GfuiLabelSetText(racemanMenuHdle, nTitleLabelId, pszTitle);
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "HostButton",
@ -854,13 +1059,13 @@ RmNetworkMenu(void *)
GfuiMenuCreateButtonControl(racemanMenuHdle, mparam, "BackButton",
RmRaceSelectMenuHandle, GfuiScreenActivate);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
GfuiAddKey(racemanMenuHdle, GFUIK_ESCAPE, "Back to previous menu",
RmRaceSelectMenuHandle, 0, GfuiScreenActivate);
GfuiMenuDefaultKeysAdd(racemanMenuHdle);
GfuiAddKey(racemanMenuHdle, GFUIK_ESCAPE, "Back to previous menu",
RmRaceSelectMenuHandle, 0, GfuiScreenActivate);
GfParmReleaseHandle(mparam);
GfParmReleaseHandle(mparam);
GfuiScreenActivate(racemanMenuHdle);
GfuiScreenActivate(racemanMenuHdle);
}
static void
@ -877,20 +1082,19 @@ ServerPrepareStartNetworkRace(void * /* dummy */)
}
// Retrieve the NetDriver instance with given index in the human module interface list
static void
static int
GetHumanDriver(NetDriver &driver,int index)
{
char buf[255];
sprintf(buf,"drivers/human/human.xml");
void *params = GfParmReadFileLocal(buf,GFPARM_RMODE_REREAD);
void *params = GfParmReadFileLocal("drivers/human/human.xml", GFPARM_RMODE_STD);
assert(params);
char path2[256];
sprintf(path2, "Robots/index/%d",index);
if (GfParmExistsSection(params, path2) == 0) return 0;
strncpy(driver.name,GfParmGetStr(params, path2, "name",NULL),64);
strncpy(driver.sname, GfParmGetStr(params, path2,
ROB_ATTR_SNAME, NULL), 64);
strncpy(driver.cname, GfParmGetStr(params, path2,
ROB_ATTR_CODE, NULL), 4);
strncpy(driver.sname,GfParmGetStr(params, path2, ROB_ATTR_SNAME, NULL), 64);
strncpy(driver.cname,GfParmGetStr(params, path2, ROB_ATTR_CODE, NULL), 4);
strncpy(driver.car,GfParmGetStr(params, path2, "car name",NULL),64);
strncpy(driver.type,GfParmGetStr(params, path2, "type",NULL),64);
strncpy(driver.skilllevel,GfParmGetStr(params, path2, "skill level",NULL),64);
@ -902,4 +1106,6 @@ GetHumanDriver(NetDriver &driver,int index)
strncpy(driver.module,NETWORKROBOT,64);
GfParmReleaseHandle(params);
return 1;
}