From 455876a3c0116e4bc8c52317fcd7b99f82c901e0 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sat, 21 Aug 2010 13:04:52 +0000 Subject: [PATCH] - added the ability to change your playername from the game lobbies inline --- source/glest_game/game/chat_manager.cpp | 10 +- source/glest_game/game/game_settings.h | 5 +- .../menu/menu_state_connected_game.cpp | 204 +++++++++++++++--- .../menu/menu_state_connected_game.h | 6 + .../menu/menu_state_custom_game.cpp | 93 +++++--- .../glest_game/menu/menu_state_custom_game.h | 2 +- .../glest_game/network/client_interface.cpp | 50 +++-- source/glest_game/network/client_interface.h | 3 +- source/glest_game/network/connection_slot.cpp | 10 +- source/glest_game/network/connection_slot.h | 2 + source/glest_game/network/network_interface.h | 2 +- source/glest_game/network/network_message.cpp | 5 +- source/glest_game/network/network_message.h | 8 +- .../glest_game/network/server_interface.cpp | 29 ++- source/glest_game/network/server_interface.h | 2 + 15 files changed, 323 insertions(+), 108 deletions(-) diff --git a/source/glest_game/game/chat_manager.cpp b/source/glest_game/game/chat_manager.cpp index 356728df..d66f09df 100644 --- a/source/glest_game/game/chat_manager.cpp +++ b/source/glest_game/game/chat_manager.cpp @@ -114,9 +114,10 @@ void ChatManager::keyDown(char key){ GameNetworkInterface *gameNetworkInterface= NetworkManager::getInstance().getGameNetworkInterface(); if(!text.empty()) { - console->addLine(Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + ": " + text); - gameNetworkInterface->sendTextMessage(Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + ": "+ - text, teamMode? thisTeamIndex: -1); + string playerName = gameNetworkInterface->getHumanPlayerName(); + + console->addLine(playerName + ": " + text); + gameNetworkInterface->sendTextMessage(text, teamMode? thisTeamIndex: -1); if(!inMenu) editEnabled= false; } else @@ -180,7 +181,8 @@ void ChatManager::updateNetwork() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] got nmtText [%s] for team = %d\n",__FILE__,__FUNCTION__,msg.chatText.c_str(),teamIndex); if(teamIndex==-1 || teamIndex==thisTeamIndex){ - console->addLine(msg.chatText, true); + //console->addLine(msg.chatText, true); + console->addLine(msg.chatSender + ": " + msg.chatText, true); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Added text to console\n",__FILE__,__FUNCTION__); } diff --git a/source/glest_game/game/game_settings.h b/source/glest_game/game/game_settings.h index 0e4e8874..ecff993e 100644 --- a/source/glest_game/game/game_settings.h +++ b/source/glest_game/game/game_settings.h @@ -56,8 +56,9 @@ private: public: - GameSettings() { - fogOfWar = true; + GameSettings() { + thisFactionIndex = 0; + fogOfWar = true; enableObserverModeAtEndGame = false; enableServerControlledAI = false; networkFramePeriod = GameConstants::networkFramePeriod; diff --git a/source/glest_game/menu/menu_state_connected_game.cpp b/source/glest_game/menu/menu_state_connected_game.cpp index 68b24f66..773b4f9a 100644 --- a/source/glest_game/menu/menu_state_connected_game.cpp +++ b/source/glest_game/menu/menu_state_connected_game.cpp @@ -48,6 +48,7 @@ struct FormatString { MenuStateConnectedGame::MenuStateConnectedGame(Program *program, MainMenu *mainMenu,JoinMenu joinMenuInfo, bool openNetworkSlots): MenuState(program, mainMenu, "connected-game") //← set on connected-game { + activeInputLabel = NULL; lastNetworkSendPing = 0; pingCount = 0; needToSetChangedGameSettings = false; @@ -175,8 +176,10 @@ MenuStateConnectedGame::MenuStateConnectedGame(Program *program, MainMenu *mainM SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); //list boxes for(int i=0; iisConnected() == true) { - string sQuitText = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + " has chosen to leave the game!"; + string sQuitText = "has chosen to leave the game!"; clientInterface->sendTextMessage(sQuitText,-1); sleep(1); } @@ -297,7 +303,7 @@ void MenuStateConnectedGame::mouseClick(int x, int y, MouseButton mouseButton){ ClientInterface* clientInterface= NetworkManager::getInstance().getClientInterface(); if(clientInterface->isConnected()){ clientInterface->setGameSettingsReceived(false); - clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),i,-1,listBoxTeams[i].getSelectedItemIndex()); + clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),i,-1,listBoxTeams[i].getSelectedItemIndex(),getHumanPlayerName()); } break; } @@ -307,7 +313,7 @@ void MenuStateConnectedGame::mouseClick(int x, int y, MouseButton mouseButton){ soundRenderer.playFx(coreData.getClickSoundA()); if(clientInterface->isConnected()){ clientInterface->setGameSettingsReceived(false); - clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),i,-1,listBoxTeams[i].getSelectedItemIndex()); + clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),i,-1,listBoxTeams[i].getSelectedItemIndex(),getHumanPlayerName()); } break; } @@ -320,10 +326,17 @@ void MenuStateConnectedGame::mouseClick(int x, int y, MouseButton mouseButton){ clientInterface->setGameSettingsReceived(false); settingsReceivedFromServer=false; SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] sending a switchSlot request from %d to %d\n",__FILE__,__FUNCTION__,__LINE__,clientInterface->getGameSettings()->getThisFactionIndex(),i); - clientInterface->sendSwitchSetupRequest(listBoxFactions[myCurrentIndex].getSelectedItem(),myCurrentIndex,i,listBoxTeams[myCurrentIndex].getSelectedItemIndex()); + clientInterface->sendSwitchSetupRequest(listBoxFactions[myCurrentIndex].getSelectedItem(),myCurrentIndex,i,listBoxTeams[myCurrentIndex].getSelectedItemIndex(),getHumanPlayerName()); break; } } + + if(labelPlayerNames[i].mouseClick(x, y) && ( activeInputLabel != &labelPlayerNames[i] )){ + if(clientInterface->getGameSettings() != NULL && + i == clientInterface->getGameSettings()->getThisFactionIndex()) { + setActiveInputLabel(&labelPlayerNames[i]); + } + } } } } @@ -348,12 +361,22 @@ void MenuStateConnectedGame::mouseMove(int x, int y, const MouseState *ms){ buttonDisconnect.mouseMove(x, y); buttonPlayNow.mouseMove(x, y); + bool editingPlayerName = false; for(int i=0; i= 3 && clientInterface->getLastPingLag() >= (GameConstants::networkPingInterval * 3)) { - string playerNameStr = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); - clientInterface->sendTextMessage(playerNameStr + "'s connection timed out communicating with server.",-1); + string playerNameStr = getHumanPlayerName(); + clientInterface->sendTextMessage("connection timed out communicating with server.",-1); clientInterface->close(); } @@ -577,8 +607,8 @@ void MenuStateConnectedGame::update() } //process network messages - if(clientInterface->isConnected()) - { + if(clientInterface->isConnected()) { + bool mustSwitchPlayerName = false; if(clientInterface->getGameSettingsReceived()){ bool errorOnMissingData = (clientInterface->getAllowGameDataSynchCheck() == false); //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -673,20 +703,54 @@ void MenuStateConnectedGame::update() if(gameSettings->getFactionControl(i) == ctNetwork ){ labelNetStatus[slot].setText(gameSettings->getNetworkPlayerName(i)); + if(gameSettings->getThisFactionIndex() != i && + gameSettings->getNetworkPlayerName(i) != "") { + labelPlayerNames[slot].setText(gameSettings->getNetworkPlayerName(i)); + } } - if(gameSettings->getFactionControl(i) == ctNetwork && gameSettings->getThisFactionIndex() == i){ + if(gameSettings->getFactionControl(i) == ctNetwork && + gameSettings->getThisFactionIndex() == i){ // set my current slot to ctHuman listBoxControls[slot].setSelectedItemIndex(ctHuman); listBoxFactions[slot].setEditable(true); listBoxTeams[slot].setEditable(true); + + if(labelPlayerNames[slot].getText() == "" && + gameSettings->getNetworkPlayerName(i) != "") { + labelPlayerNames[slot].setText(gameSettings->getNetworkPlayerName(i)); + } } settingsReceivedFromServer=true; initialSettingsReceivedFromServer=true; + + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + + mustSwitchPlayerName = true; } } } + + if(mustSwitchPlayerName == true || + (needToSetChangedGameSettings == true && + difftime(time(NULL),lastSetChangedGameSettings) >= 2)) { + needToSetChangedGameSettings = false; + lastSetChangedGameSettings = time(NULL); + + ClientInterface* clientInterface= NetworkManager::getInstance().getClientInterface(); + if(clientInterface->isConnected()){ + for(int i=0; igetGameSettings() != NULL && + i == clientInterface->getGameSettings()->getThisFactionIndex()) { + clientInterface->setGameSettingsReceived(false); + clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),i,-1,listBoxTeams[i].getSelectedItemIndex(),getHumanPlayerName()); + } + } + } + } + //update lobby clientInterface->updateLobby(); @@ -695,7 +759,8 @@ void MenuStateConnectedGame::update() //call the chat manager chatManager.updateNetwork(); - //console + //console732 + console.update(); //intro @@ -765,7 +830,7 @@ bool MenuStateConnectedGame::loadFactions(const GameSettings *gameSettings, bool } char szMsg[1024]=""; - sprintf(szMsg,"Player: %s is missing the techtree: %s",Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()).c_str(),gameSettings->getTech().c_str()); + sprintf(szMsg,"Player: %s is missing the techtree: %s",getHumanPlayerName().c_str(),gameSettings->getTech().c_str()); clientInterface->sendTextMessage(szMsg,-1, true); foundFactions = false; @@ -863,32 +928,107 @@ void MenuStateConnectedGame::reloadFactions(){ -void MenuStateConnectedGame::keyDown(char key) -{ - //send key to the chat manager - chatManager.keyDown(key); - if(!chatManager.getEditEnabled()){ - if(key=='M'){ - showFullConsole= true; +void MenuStateConnectedGame::keyDown(char key) { + if(activeInputLabel!=NULL) { + if(key==vkBack){ + string text= activeInputLabel->getText(); + if(text.size()>1){ + text.erase(text.end()-2); } + activeInputLabel->setText(text); + + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } } -} - -void MenuStateConnectedGame::keyPress(char c) -{ - chatManager.keyPress(c); -} - -void MenuStateConnectedGame::keyUp(char key) -{ - chatManager.keyUp(key); - if(chatManager.getEditEnabled()){ + else { //send key to the chat manager + chatManager.keyDown(key); + if(!chatManager.getEditEnabled()){ + if(key=='M'){ + showFullConsole= true; + } + } + } +} + +void MenuStateConnectedGame::keyPress(char c) { + if(activeInputLabel!=NULL) { + int maxTextSize= 16; + for(int i=0; i='0' && c<='9')||(c>='a' && c<='z')||(c>='A' && c<='Z')|| + (c=='-')||(c=='(')||(c==')')){ + if(activeInputLabel->getText().size()getText(); + text.insert(text.end()-1, c); + activeInputLabel->setText(text); + + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); + } + } + } + } + } + else { + chatManager.keyPress(c); + } +} + +void MenuStateConnectedGame::keyUp(char key) { + if(activeInputLabel==NULL) { chatManager.keyUp(key); + if(chatManager.getEditEnabled()){ + //send key to the chat manager + chatManager.keyUp(key); + } + else if(key== 'M'){ + showFullConsole= false; + } } - else if(key== 'M'){ - showFullConsole= false; +} + +void MenuStateConnectedGame::setActiveInputLabel(GraphicLabel *newLable) +{ + if(newLable!=NULL){ + string text= newLable->getText(); + size_t found; + found=text.find_last_of("_"); + if (found==string::npos) + { + text=text+"_"; + } + newLable->setText(text); } + if(activeInputLabel!=NULL && !activeInputLabel->getText().empty()){ + string text= activeInputLabel->getText(); + size_t found; + found=text.find_last_of("_"); + if (found!=string::npos) + { + text=text.substr(0,found); + } + activeInputLabel->setText(text); + } + activeInputLabel=newLable; +} + +string MenuStateConnectedGame::getHumanPlayerName() { + string result = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + + NetworkManager &networkManager= NetworkManager::getInstance(); + ClientInterface* clientInterface= networkManager.getClientInterface(); + for(int j=0; jgetGameSettings()->getThisFactionIndex() && + labelPlayerNames[j].getText() != "") { + result = labelPlayerNames[j].getText(); + break; + } + } + + return result; } }}//end namespace diff --git a/source/glest_game/menu/menu_state_connected_game.h b/source/glest_game/menu/menu_state_connected_game.h index 4aeaa79d..55206f70 100644 --- a/source/glest_game/menu/menu_state_connected_game.h +++ b/source/glest_game/menu/menu_state_connected_game.h @@ -66,11 +66,15 @@ private: vector tilesetFiles; vector factionFiles; GraphicLabel labelPlayers[GameConstants::maxPlayers]; + GraphicLabel labelPlayerNames[GameConstants::maxPlayers]; GraphicListBox listBoxControls[GameConstants::maxPlayers]; GraphicListBox listBoxFactions[GameConstants::maxPlayers]; GraphicListBox listBoxTeams[GameConstants::maxPlayers]; GraphicLabel labelNetStatus[GameConstants::maxPlayers]; GraphicButton grabSlotButton[GameConstants::maxPlayers]; + + GraphicLabel *activeInputLabel; + MapInfo mapInfo; bool needToSetChangedGameSettings; @@ -109,6 +113,8 @@ private: void reloadFactions(); bool loadFactions(const GameSettings *gameSettings,bool errorOnNoFactions); void returnToJoinMenu(); + string getHumanPlayerName(); + void setActiveInputLabel(GraphicLabel *newLable); }; }}//end namespace diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index 1ce7cf58..6d9f1e1e 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -882,44 +882,48 @@ void MenuStateCustomGame::update() { // handle setting changes from clients SwitchSetupRequest** switchSetupRequests=serverInterface->getSwitchSetupRequests(); - for(int i= 0; igetSelectedFactionName()=%s\n",switchSetupRequests[i]->getSelectedFactionName().c_str()); //printf("switchSetupRequests[i]->getToTeam()=%d\n",switchSetupRequests[i]->getToTeam()); - if(switchSetupRequests[i]->getToFactionIndex()!=-1) - { + if(switchSetupRequests[i]->getToFactionIndex()!=-1) { + int k=switchSetupRequests[i]->getToFactionIndex(); + labelPlayerNames[k].setText(switchSetupRequests[i]->getNetworkPlayerName()); + //printf("switchSlot request from %d to %d\n",switchSetupRequests[i]->getCurrentFactionIndex(),switchSetupRequests[i]->getToFactionIndex()); if(serverInterface->switchSlot(switchSetupRequests[i]->getCurrentFactionIndex(),switchSetupRequests[i]->getToFactionIndex())){ - int k=switchSetupRequests[i]->getToFactionIndex(); try { if(switchSetupRequests[i]->getSelectedFactionName()!=""){ listBoxFactions[k].setSelectedItem(switchSetupRequests[i]->getSelectedFactionName()); } - if(switchSetupRequests[i]->getToTeam()!=-1) - listBoxTeams[k].setSelectedItemIndex(switchSetupRequests[i]->getToTeam()); + if(switchSetupRequests[i]->getToTeam()!=-1) { + listBoxTeams[k].setSelectedItemIndex(switchSetupRequests[i]->getToTeam()); + } + + labelPlayerNames[k].setText(switchSetupRequests[i]->getNetworkPlayerName()); } catch(const runtime_error &e) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] caught exception error = [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); } - } } else { try { + + labelPlayerNames[i].setText(switchSetupRequests[i]->getNetworkPlayerName()); + if(switchSetupRequests[i]->getSelectedFactionName()!=""){ listBoxFactions[i].setSelectedItem(switchSetupRequests[i]->getSelectedFactionName()); } - if(switchSetupRequests[i]->getToTeam()!=-1) - listBoxTeams[i].setSelectedItemIndex(switchSetupRequests[i]->getToTeam()); + if(switchSetupRequests[i]->getToTeam()!=-1) { + listBoxTeams[i].setSelectedItemIndex(switchSetupRequests[i]->getToTeam()); + } } catch(const runtime_error &e) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] caught exception error = [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what()); @@ -951,8 +955,9 @@ void MenuStateCustomGame::update() { //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] A - ctNetwork\n",__FILE__,__FUNCTION__); - if(connectionSlot->isConnected()) - { + if(connectionSlot->isConnected()) { + connectionSlot->setName(labelPlayerNames[i].getText()); + //printf("FYI we have at least 1 client connected, slot = %d'\n",i); haveAtLeastOneNetworkClientConnected = true; @@ -1166,7 +1171,7 @@ void MenuStateCustomGame::publishToMasterserver() publishToServerInfo["binaryCompileDate"] = getCompileDateTime(); //game info: - publishToServerInfo["serverTitle"] = Config::getInstance().getString("NetPlayerName") + "'s game"; + publishToServerInfo["serverTitle"] = getHumanPlayerName() + "'s game"; //ip is automatically set //game setup info: @@ -1246,19 +1251,23 @@ void MenuStateCustomGame::simpleTask() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + MutexSafeWrapper safeMutex2(&masterServerThreadAccessor); + GameSettings gameSettings; + loadGameSettings(&gameSettings); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + serverInterface->setGameSettings(&gameSettings); + safeMutex2.ReleaseLock(); + if(hasClientConnection == true) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - GameSettings gameSettings; - - MutexSafeWrapper safeMutex2(&masterServerThreadAccessor); - loadGameSettings(&gameSettings); + MutexSafeWrapper safeMutex3(&masterServerThreadAccessor); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - serverInterface->setGameSettings(&gameSettings); serverInterface->broadcastGameSetup(&gameSettings); - safeMutex2.ReleaseLock(); + safeMutex3.ReleaseLock(); } } @@ -1304,10 +1313,11 @@ void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings) { if(ct != ctClosed) { int slotIndex = factionCount; + gameSettings->setFactionControl(slotIndex, ct); if(ct == ctHuman) { gameSettings->setThisFactionIndex(slotIndex); + gameSettings->setNetworkPlayerName(slotIndex, getHumanPlayerName(slotIndex)); } - gameSettings->setFactionControl(slotIndex, ct); gameSettings->setTeam(slotIndex, listBoxTeams[i].getSelectedItemIndex()); gameSettings->setStartLocationIndex(slotIndex, i); gameSettings->setFactionTypeName(slotIndex, factionFiles[listBoxFactions[i].getSelectedItemIndex()]); @@ -1316,17 +1326,17 @@ void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings) { ConnectionSlot* connectionSlot= serverInterface->getSlot(i); if(connectionSlot != NULL && connectionSlot->isConnected()) { gameSettings->setNetworkPlayerName(slotIndex, connectionSlot->getName()); + labelPlayerNames[slotIndex].setText(connectionSlot->getName()); } else { gameSettings->setNetworkPlayerName(slotIndex, GameConstants::NETWORK_SLOT_UNCONNECTED_SLOTNAME); + labelPlayerNames[slotIndex].setText(""); } } - else if (listBoxControls[i].getSelectedItemIndex() == ctHuman) { - gameSettings->setNetworkPlayerName(slotIndex, getHumanPlayerName()); - } - else { + else if (listBoxControls[i].getSelectedItemIndex() != ctHuman) { AIPlayerCount++; gameSettings->setNetworkPlayerName(slotIndex, string("AI") + intToStr(AIPlayerCount)); + labelPlayerNames[slotIndex].setText(string("AI") + intToStr(AIPlayerCount)); } factionCount++; @@ -1788,7 +1798,7 @@ void MenuStateCustomGame::keyPress(char c) { } void MenuStateCustomGame::keyUp(char key) { - if(activeInputLabel!=NULL) { + if(activeInputLabel==NULL) { chatManager.keyUp(key); if(chatManager.getEditEnabled()){ //send key to the chat manager @@ -1840,16 +1850,29 @@ void MenuStateCustomGame::setActiveInputLabel(GraphicLabel *newLable) activeInputLabel=newLable; } -string MenuStateCustomGame::getHumanPlayerName() { +string MenuStateCustomGame::getHumanPlayerName(int index) { string result = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); - for(int j=0; j(listBoxControls[j].getSelectedItemIndex()); - if(ct == ctHuman && labelPlayerNames[j].getText() != "") { - result = labelPlayerNames[j].getText(); - break; + + //printf("\nIn [%s::%s Line: %d] index = %d\n",__FILE__,__FUNCTION__,__LINE__,index); + //fflush(stdout); + + if(index < 0) { + for(int j=0; j(listBoxControls[j].getSelectedItemIndex()); + if(ct == ctHuman) { + index = j; + break; + } } } + //printf("\nIn [%s::%s Line: %d] index = %d, labelPlayerNames[index].getText() = [%s]\n",__FILE__,__FUNCTION__,__LINE__,index,(index >= 0 ? labelPlayerNames[index].getText().c_str() : "?")); + //fflush(stdout); + + if(index >= 0 && labelPlayerNames[index].getText() != "") { + result = labelPlayerNames[index].getText(); + } + return result; } diff --git a/source/glest_game/menu/menu_state_custom_game.h b/source/glest_game/menu/menu_state_custom_game.h index b82e5d94..c1aa11b1 100644 --- a/source/glest_game/menu/menu_state_custom_game.h +++ b/source/glest_game/menu/menu_state_custom_game.h @@ -136,7 +136,7 @@ private: void saveGameSettingsToFile(std::string fileName); GameSettings loadGameSettingsFromFile(std::string fileName); void setActiveInputLabel(GraphicLabel *newLable); - string getHumanPlayerName(); + string getHumanPlayerName(int index=-1); }; }}//end namespace diff --git a/source/glest_game/network/client_interface.cpp b/source/glest_game/network/client_interface.cpp index ac702cad..96c912ca 100755 --- a/source/glest_game/network/client_interface.cpp +++ b/source/glest_game/network/client_interface.cpp @@ -63,7 +63,7 @@ ClientInterface::~ClientInterface() { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - string sQuitText = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + " has chosen to leave the game!"; + string sQuitText = "has chosen to leave the game!"; sendTextMessage(sQuitText,-1); } @@ -100,7 +100,7 @@ void ClientInterface::reset() { if(getSocket() != NULL) { - string sQuitText = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + " has chosen to leave the game!"; + string sQuitText = "has chosen to leave the game!"; sendTextMessage(sQuitText,-1); close(); } @@ -135,14 +135,11 @@ void ClientInterface::update() char szBuf[1024]=""; SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] WARNING / ERROR, requestedCommands.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,requestedCommands.size()); - string sMsg = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + " may go out of synch: client requestedCommands.size() = " + intToStr(requestedCommands.size()); + string sMsg = "may go out of synch: client requestedCommands.size() = " + intToStr(requestedCommands.size()); sendTextMessage(sMsg,-1, true); } //clear chat variables - //chatText.clear(); - //chatSender.clear(); - //chatTeamIndex= -1; clearChatInfo(); } @@ -153,9 +150,6 @@ std::string ClientInterface::getServerIpAddress() { void ClientInterface::updateLobby() { //clear chat variables - //chatText.clear(); - //chatSender.clear(); - //chatTeamIndex= -1; clearChatInfo(); NetworkMessageType networkMessageType = getNextMessageType(true); @@ -171,6 +165,8 @@ void ClientInterface::updateLobby() if(receiveMessage(&networkMessageIntro)) { gotIntro = true; versionString = networkMessageIntro.getVersionString(); + playerIndex= networkMessageIntro.getPlayerIndex(); + serverName= networkMessageIntro.getName(); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] got NetworkMessageIntro, networkMessageIntro.getGameState() = %d, versionString [%s]\n",__FILE__,__FUNCTION__,__LINE__,networkMessageIntro.getGameState(),versionString.c_str()); @@ -183,7 +179,7 @@ void ClientInterface::updateLobby() string sErr = ""; if(strncmp(platformFreeVersion.c_str(),networkMessageIntro.getVersionString().c_str(),strlen(platformFreeVersion.c_str())) != 0) { - string playerNameStr = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + string playerNameStr = getHumanPlayerName(); sErr = "Server and client binary mismatch!\nYou have to use the exactly same binaries!\n\nServer: " + networkMessageIntro.getVersionString() + "\nClient: " + getNetworkVersionString() + " player [" + playerNameStr + "]"; printf("%s\n",sErr.c_str()); @@ -196,7 +192,7 @@ void ClientInterface::updateLobby() else { versionMatched = true; - string playerNameStr = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + string playerNameStr = getHumanPlayerName(); sErr = "Warning, Server and client are using the same version but different platforms.\n\nServer: " + networkMessageIntro.getVersionString() + "\nClient: " + getNetworkVersionString() + " player [" + playerNameStr + "]"; printf("%s\n",sErr.c_str()); @@ -222,10 +218,7 @@ void ClientInterface::updateLobby() SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); //send intro message - NetworkMessageIntro sendNetworkMessageIntro(getNetworkVersionString(), Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()), -1, nmgstOk); - - playerIndex= networkMessageIntro.getPlayerIndex(); - serverName= networkMessageIntro.getName(); + NetworkMessageIntro sendNetworkMessageIntro(getNetworkVersionString(), getHumanPlayerName(), -1, nmgstOk); sendMessage(&sendNetworkMessageIntro); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -547,7 +540,7 @@ void ClientInterface::updateKeyframe(int frameCount) chrono.start(); //check that we are in the right frame if(networkMessageCommandList.getFrameCount() != frameCount) { - string sErr = "Player: " + Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + + string sErr = "Player: " + getHumanPlayerName() + " got a Network synchronization error, frame counts do not match, server frameCount = " + intToStr(networkMessageCommandList.getFrameCount()) + ", local frameCount = " + intToStr(frameCount); @@ -742,7 +735,7 @@ void ClientInterface::waitUntilReady(Checksum* checksum) { string sErr = "Checksum error, you don't have the same data as the server"; sendTextMessage(sErr,-1, true); - string playerNameStr = "Player with error is [" + Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + "]"; + string playerNameStr = "Player with error is [" + getHumanPlayerName() + "]"; sendTextMessage(playerNameStr,-1, true); string sErr1 = "Client Checksum: " + intToStr(checksum->getSum()); @@ -779,7 +772,7 @@ void ClientInterface::waitUntilReady(Checksum* checksum) { } void ClientInterface::sendTextMessage(const string &text, int teamIndex, bool echoLocal){ - NetworkMessageText networkMessageText(text, getHostName(), teamIndex); + NetworkMessageText networkMessageText(text, getHumanPlayerName(), teamIndex); sendMessage(&networkMessageText); if(echoLocal == true) { @@ -862,7 +855,7 @@ void ClientInterface::quitGame(bool userManuallyQuit) if(clientSocket != NULL && userManuallyQuit == true) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - string sQuitText = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + " has chosen to leave the game!"; + string sQuitText = "has chosen to leave the game!"; sendTextMessage(sQuitText,-1); close(); } @@ -898,11 +891,11 @@ void ClientInterface::stopServerDiscovery() { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } -void ClientInterface::sendSwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam) +void ClientInterface::sendSwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam, string networkPlayerName) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); //printf("string-cuf-tof-team= %s-%d-%d-%d\n",selectedFactionName.c_str(),currentFactionIndex,toFactionIndex,toTeam); - SwitchSetupRequest message=SwitchSetupRequest(selectedFactionName, currentFactionIndex, toFactionIndex,toTeam); + SwitchSetupRequest message=SwitchSetupRequest(selectedFactionName, currentFactionIndex, toFactionIndex,toTeam,networkPlayerName); sendMessage(&message); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } @@ -999,4 +992,19 @@ bool ClientInterface::shouldDiscardNetworkMessage(NetworkMessageType networkMess return discard; } +string ClientInterface::getHumanPlayerName(int index) { + string result = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + + if(index >= 0 || playerIndex >= 0) { + if(index < 0) { + index = playerIndex; + } + if(gameSettings.getNetworkPlayerName(index) != "") { + result = gameSettings.getNetworkPlayerName(index); + } + } + + return result; +} + }}//end namespace diff --git a/source/glest_game/network/client_interface.h b/source/glest_game/network/client_interface.h index 9a8ecd72..50bc1533 100644 --- a/source/glest_game/network/client_interface.h +++ b/source/glest_game/network/client_interface.h @@ -91,7 +91,7 @@ public: void discoverServers(DiscoveredServersInterface *cb); void stopServerDiscovery(); - void sendSwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex, int8 toTeam); + void sendSwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex, int8 toTeam,string networkPlayerName); virtual bool getConnectHasHandshaked() const { return gotIntro; } std::string getServerIpAddress(); @@ -100,6 +100,7 @@ public: virtual void sendPingMessage(int32 pingFrequency, int64 pingTime); const string &getVersionString() const {return versionString;} + virtual string getHumanPlayerName(int index=-1); protected: diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index 79310cfe..e7c56138 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -241,7 +241,7 @@ void ConnectionSlot::update(bool checkForNewClients) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] no open slots, disconnecting client\n",__FILE__,__FUNCTION__); if(socket != NULL) { - NetworkMessageIntro networkMessageIntro(getNetworkVersionString(), socket->getHostName(), playerIndex, nmgstNoSlots); + NetworkMessageIntro networkMessageIntro(getNetworkVersionString(), getHostName(), playerIndex, nmgstNoSlots); sendMessage(&networkMessageIntro); } @@ -357,7 +357,7 @@ void ConnectionSlot::update(bool checkForNewClients) { string sErr = ""; if(strncmp(platformFreeVersion.c_str(),networkMessageIntro.getVersionString().c_str(),strlen(platformFreeVersion.c_str())) != 0) { - string playerNameStr = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + string playerNameStr = name; sErr = "Server and client binary mismatch!\nYou have to use the exactly same binaries!\n\nServer: " + getNetworkVersionString() + "\nClient: " + networkMessageIntro.getVersionString() + " player [" + playerNameStr + "]"; printf("%s\n",sErr.c_str()); @@ -370,7 +370,7 @@ void ConnectionSlot::update(bool checkForNewClients) { else { versionMatched = true; - string playerNameStr = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + string playerNameStr = name; sErr = "Warning, Server and client are using the same version but different platforms.\n\nServer: " + getNetworkVersionString() + "\nClient: " + networkMessageIntro.getVersionString() + " player [" + playerNameStr + "]"; printf("%s\n",sErr.c_str()); @@ -667,4 +667,8 @@ void ConnectionSlot::sendMessage(const NetworkMessage* networkMessage) { safeMutex.ReleaseLock(); } +string ConnectionSlot::getHumanPlayerName(int index) { + return serverInterface->getHumanPlayerName(index); +} + }}//end namespace diff --git a/source/glest_game/network/connection_slot.h b/source/glest_game/network/connection_slot.h index 451e1553..a9093e80 100644 --- a/source/glest_game/network/connection_slot.h +++ b/source/glest_game/network/connection_slot.h @@ -122,6 +122,7 @@ public: void setReady() {ready= true;} const string &getName() const {return name;} + void setName(string value) {name = value;} bool isReady() const {return ready;} virtual Socket* getSocket() {return socket;} @@ -158,6 +159,7 @@ public: const string &getVersionString() const {return versionString;} void validateConnection(); + virtual string getHumanPlayerName(int index=-1); protected: diff --git a/source/glest_game/network/network_interface.h b/source/glest_game/network/network_interface.h index abef0edb..d900a534 100644 --- a/source/glest_game/network/network_interface.h +++ b/source/glest_game/network/network_interface.h @@ -103,6 +103,7 @@ public: virtual Socket* getSocket()= 0; virtual const Socket* getSocket() const= 0; virtual void close()= 0; + virtual string getHumanPlayerName(int index=-1) = 0; static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; } static DisplayMessageFunction getDisplayMessageFunction() { return pCB_DisplayMessage; } @@ -145,7 +146,6 @@ public: std::string getIpAddress(); float getThreadedPingMS(std::string host); - }; // ===================================================== diff --git a/source/glest_game/network/network_message.cpp b/source/glest_game/network/network_message.cpp index 169a924c..b16e128c 100644 --- a/source/glest_game/network/network_message.cpp +++ b/source/glest_game/network/network_message.cpp @@ -589,22 +589,25 @@ SwitchSetupRequest::SwitchSetupRequest() data.currentFactionIndex=-1; data.toFactionIndex=-1; data.toTeam = -1; + data.networkPlayerName=""; } -SwitchSetupRequest::SwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam) +SwitchSetupRequest::SwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam,string networkPlayerName) { data.messageType= nmtSwitchSetupRequest; data.selectedFactionName=selectedFactionName; data.currentFactionIndex=currentFactionIndex; data.toFactionIndex=toFactionIndex; data.toTeam = toTeam; + data.networkPlayerName=networkPlayerName; } bool SwitchSetupRequest::receive(Socket* socket) { bool result = NetworkMessage::receive(socket, &data, sizeof(data)); data.selectedFactionName.nullTerminate(); + data.networkPlayerName.nullTerminate(); return result; } diff --git a/source/glest_game/network/network_message.h b/source/glest_game/network/network_message.h index 25b2f410..d698f15c 100644 --- a/source/glest_game/network/network_message.h +++ b/source/glest_game/network/network_message.h @@ -508,6 +508,7 @@ private: int8 currentFactionIndex; int8 toFactionIndex; int8 toTeam; + NetworkString networkPlayerName; }; private: @@ -515,12 +516,13 @@ private: public: SwitchSetupRequest(); - SwitchSetupRequest( string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam); + SwitchSetupRequest( string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam,string networkPlayerName); string getSelectedFactionName() const {return data.selectedFactionName.getString();} - int getCurrentFactionIndex() const {return data.currentFactionIndex;} - int getToFactionIndex() const {return data.toFactionIndex;} + int getCurrentFactionIndex() const {return data.currentFactionIndex;} + int getToFactionIndex() const {return data.toFactionIndex;} int getToTeam() const {return data.toTeam;} + string getNetworkPlayerName() const {return data.networkPlayerName.getString(); } virtual bool receive(Socket* socket); virtual void send(Socket* socket) const; diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index 992e1fdd..2b9b69c4 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -723,7 +723,7 @@ void ServerInterface::updateKeyframe(int frameCount){ char szBuf[1024]=""; SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] WARNING / ERROR, requestedCommands.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,requestedCommands.size()); - string sMsg = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()) + " may go out of synch: server requestedCommands.size() = " + intToStr(requestedCommands.size()); + string sMsg = "may go out of synch: server requestedCommands.size() = " + intToStr(requestedCommands.size()); sendTextMessage(sMsg,-1, true); } @@ -928,7 +928,7 @@ void ServerInterface::waitUntilReady(Checksum* checksum){ void ServerInterface::sendTextMessage(const string &text, int teamIndex, bool echoLocal) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] text [%s] teamIndex = %d, echoLocal = %d\n",__FILE__,__FUNCTION__,__LINE__,text.c_str(),teamIndex,echoLocal); - NetworkMessageText networkMessageText(text, Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()), teamIndex); + NetworkMessageText networkMessageText(text, getHumanPlayerName().c_str(), teamIndex); broadcastMessage(&networkMessageText); if(echoLocal == true) { @@ -1225,6 +1225,8 @@ void ServerInterface::setGameSettings(GameSettings *serverGameSettings, bool wai MutexSafeWrapper safeMutex(&serverSynchAccessor); + gameSettings = *serverGameSettings; + if(getAllowGameDataSynchCheck() == true) { if(waitForClientAck == true && gameSettingsUpdateCount > 0) @@ -1261,8 +1263,6 @@ void ServerInterface::setGameSettings(GameSettings *serverGameSettings, bool wai } } - gameSettings = *serverGameSettings; - NetworkMessageSynchNetworkGameData networkMessageSynchNetworkGameData(getGameSettings()); broadcastMessageToConnectedClients(&networkMessageSynchNetworkGameData); @@ -1304,4 +1304,25 @@ void ServerInterface::close() //serverSocket = ServerSocket(); } +string ServerInterface::getHumanPlayerName(int index) { + string result = Config::getInstance().getString("NetPlayerName",Socket::getHostName().c_str()); + + //printf("\nIn [%s::%s Line: %d] index = %d, gameSettings.getThisFactionIndex() = %d\n",__FILE__,__FUNCTION__,__LINE__,index,gameSettings.getThisFactionIndex()); + //fflush(stdout); + + if(index >= 0 || gameSettings.getThisFactionIndex() >= 0) { + if(index < 0) { + index = gameSettings.getThisFactionIndex(); + } + + //printf("\nIn [%s::%s Line: %d] gameSettings.getNetworkPlayerName(index) = %s\n",__FILE__,__FUNCTION__,__LINE__,gameSettings.getNetworkPlayerName(index).c_str()); + //fflush(stdout); + + if(gameSettings.getNetworkPlayerName(index) != "") { + result = gameSettings.getNetworkPlayerName(index); + } + } + return result; +} + }}//end namespace diff --git a/source/glest_game/network/server_interface.h b/source/glest_game/network/server_interface.h index 1fdf797e..b865809f 100644 --- a/source/glest_game/network/server_interface.h +++ b/source/glest_game/network/server_interface.h @@ -95,6 +95,8 @@ public: this->broadcastMessage(networkMessage,excludeSlot); } + virtual string getHumanPlayerName(int index=-1); + public: Mutex * getServerSynchAccessor() { return &serverSynchAccessor; }