From 490ba7e82479ee3acfae944e494c008133c90bf8 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sat, 7 Jul 2012 05:35:25 +0000 Subject: [PATCH] - headless admin cannot launch a game unless there are at least two players connected --- source/glest_game/network/connection_slot.cpp | 42 +++++++++++++++---- source/glest_game/network/network_manager.cpp | 2 +- .../glest_game/network/server_interface.cpp | 13 +++++- source/glest_game/network/server_interface.h | 2 + 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index 6e4a519b..93265935 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -781,17 +781,43 @@ void ConnectionSlot::update(bool checkForNewClients,int lockedSlotIndex) { throw megaglest_runtime_error(szBuf); } - GameSettings gameSettingsBuffer; - networkMessageLaunch.buildGameSettings(&gameSettingsBuffer); + int minHeadLessPlayersRequired = Config::getInstance().getInt("MinHeadlessPlayersRequired","2"); + if(networkMessageLaunch.getMessageType() == nmtLaunch && + this->serverInterface->getConnectedSlotCount() < minHeadLessPlayersRequired) { + Lang &lang= Lang::getInstance(); + const vector languageList = this->gameSettings.getUniqueNetworkPlayerLanguages(); + for(unsigned int i = 0; i < languageList.size(); ++i) { + char szBuf[4096]=""; - //printf("Connection slot got networkMessageLaunch.getMessageType() = %d, got map [%s]\n",networkMessageLaunch.getMessageType(),gameSettings.getMap().c_str()); - //printf("\n\n\n\n=====Connection slot got settings:\n%s\n",gameSettings.toString().c_str()); + string msgTemplate = "You must have have at least %d player(s) connected to start this game!"; + if(lang.hasString("HeadlessAdminRequiresMorePlayers") == true) { + msgTemplate = lang.get("HeadlessAdminRequiresMorePlayers",languageList[i]); + } + #ifdef WIN32 + _snprintf(szBuf,4095,msgTemplate.c_str(),minHeadLessPlayersRequired); + #else + snprintf(szBuf,4095,msgTemplate.c_str(),minHeadLessPlayersRequired); + #endif + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] %s\n",__FILE__,__FUNCTION__,__LINE__,szBuf); - //this->serverInterface->setGameSettings(&gameSettingsBuffer,false); - this->serverInterface->broadcastGameSetup(&gameSettingsBuffer, true); + string sMsg = szBuf; + bool echoLocal = lang.isLanguageLocal(languageList[i]); + this->serverInterface->sendTextMessage(sMsg,-1, echoLocal, languageList[i], this->getPlayerIndex()); + } + } + else { + GameSettings gameSettingsBuffer; + networkMessageLaunch.buildGameSettings(&gameSettingsBuffer); - if(networkMessageLaunch.getMessageType() == nmtLaunch) { - this->serverInterface->setMasterserverAdminRequestLaunch(true); + //printf("Connection slot got networkMessageLaunch.getMessageType() = %d, got map [%s]\n",networkMessageLaunch.getMessageType(),gameSettings.getMap().c_str()); + //printf("\n\n\n\n=====Connection slot got settings:\n%s\n",gameSettings.toString().c_str()); + + //this->serverInterface->setGameSettings(&gameSettingsBuffer,false); + this->serverInterface->broadcastGameSetup(&gameSettingsBuffer, true); + + if(networkMessageLaunch.getMessageType() == nmtLaunch) { + this->serverInterface->setMasterserverAdminRequestLaunch(true); + } } } else { diff --git a/source/glest_game/network/network_manager.cpp b/source/glest_game/network/network_manager.cpp index 58f98b31..fde83653 100644 --- a/source/glest_game/network/network_manager.cpp +++ b/source/glest_game/network/network_manager.cpp @@ -79,7 +79,7 @@ void NetworkManager::update() { } bool NetworkManager::isNetworkGame() { - return networkRole==nrClient || (networkRole==nrServer && getServerInterface()->getConnectedSlotCount()>0); + return networkRole==nrClient || (networkRole==nrServer && getServerInterface()->getSlotCount() > 0); } GameNetworkInterface* NetworkManager::getGameNetworkInterface(bool throwErrorOnNull) { diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index 85013cea..a4aaa6ad 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -523,11 +523,22 @@ bool ServerInterface::hasClientConnection() { return result; } +int ServerInterface::getSlotCount() { + int slotCount = 0; + for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) { + MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i)); + if(slots[i] != NULL) { + ++slotCount; + } + } + return slotCount; +} + int ServerInterface::getConnectedSlotCount() { int connectedSlotCount = 0; for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) { MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i)); - if(slots[i] != NULL) { + if(slots[i] != NULL && slots[i]->isConnected() == true) { ++connectedSlotCount; } } diff --git a/source/glest_game/network/server_interface.h b/source/glest_game/network/server_interface.h index dcd6d154..eaabc7dd 100644 --- a/source/glest_game/network/server_interface.h +++ b/source/glest_game/network/server_interface.h @@ -138,7 +138,9 @@ public: bool switchSlot(int fromPlayerIndex, int toPlayerIndex); void removeSlot(int playerIndex, int lockedSlotIndex = -1); ConnectionSlot *getSlot(int playerIndex); + int getSlotCount(); int getConnectedSlotCount(); + int getOpenSlotCount(); bool launchGame(const GameSettings *gameSettings); void validateGameSettings(GameSettings *serverGameSettings);