From 8dd34fc80e9930f8609aab9a3f68d677c6e4e5fc Mon Sep 17 00:00:00 2001 From: mungewell Date: Thu, 5 Dec 2013 07:19:29 +0000 Subject: [PATCH] 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 --- src/modules/networking/client.cpp | 4 +- src/modules/networking/network.h | 3 +- src/modules/networking/robotxml.cpp | 1 - src/modules/networking/server.cpp | 78 ++-- .../legacymenu/racescreens/networkingmenu.cpp | 398 +++++++++++++----- 5 files changed, 352 insertions(+), 132 deletions(-) diff --git a/src/modules/networking/client.cpp b/src/modules/networking/client.cpp index abadd01dd..08750ea92 100644 --- a/src/modules/networking/client.cpp +++ b/src/modules/networking/client.cpp @@ -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; } diff --git a/src/modules/networking/network.h b/src/modules/networking/network.h index c5c42fa70..01e334afa 100644 --- a/src/modules/networking/network.h +++ b/src/modules/networking/network.h @@ -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); diff --git a/src/modules/networking/robotxml.cpp b/src/modules/networking/robotxml.cpp index e8f1af2c8..b0db8e839 100644 --- a/src/modules/networking/robotxml.cpp +++ b/src/modules/networking/robotxml.cpp @@ -112,7 +112,6 @@ bool RobotXml::ReadRobotDrivers(const char*pRobotName,std::vector &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); diff --git a/src/modules/networking/server.cpp b/src/modules/networking/server.cpp index 0ad055a69..2f1a3da5f 100644 --- a/src/modules/networking/server.cpp +++ b/src/modules/networking/server.cpp @@ -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 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; diff --git a/src/modules/userinterface/legacymenu/racescreens/networkingmenu.cpp b/src/modules/userinterface/legacymenu/racescreens/networkingmenu.cpp index d7d70630e..098cce8e7 100644 --- a/src/modules/userinterface/legacymenu/racescreens/networkingmenu.cpp +++ b/src/modules/userinterface/legacymenu/racescreens/networkingmenu.cpp @@ -33,7 +33,9 @@ #include #include +#include #include +#include #include #include @@ -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;iLockServerData(); count = pSData->m_vecNetworkPlayers.size(); + for (unsigned int i=0;igetCar(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;im_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; }