diff --git a/mk/linux/glest.ini b/mk/linux/glest.ini index 4c62a88fa..ae0b0cb4c 100644 --- a/mk/linux/glest.ini +++ b/mk/linux/glest.ini @@ -8,16 +8,16 @@ AnnouncementURL=http://megaglest.pepper.freeit.org/announcement.txt AutoMaxFullScreen=false AutoTest=false CheckGlCaps=true -ColorBits=32 +ColorBits=32 ConsoleMaxLines=7 ConsoleMaxLinesStored=20 ConsoleTimeout=20 DayTime=1000 DebugLogFile=debug.log -DebugMode=false +DebugMode=false DebugPerformance=false -DebugNetwork=false -DebugWorldSynch=false +DebugNetwork=false +DebugWorldSynch=false DepthBits=16 FactoryGraphics=OpenGL FactorySound=OpenAL @@ -46,16 +46,17 @@ FontSizeAdjustment=0 Lang=english MaxLights=3 ;Masterserver=http://soft-haus.com/glest/cgi-bin/ +Masterserver=http://192.168.0.107/glest/ ;MasterServerExternalPortList=80,143,587,21,110,25,443,993,995 -Masterserver=http://megaglest.pepper.freeit.org/masterserver/ +;Masterserver=http://megaglest.pepper.freeit.org/masterserver/ MasterServerExternalPortList=61357,61358,61359,61360,61000,80,143,587,21,110,25,443,993,995,1080,8080 -NetPlayerName=newbie +NetPlayerName=newbie NetworkConsistencyChecks=true PhotoMode=false RefreshFrequency=75 -ScreenHeight=768 -ScreenWidth=1024 -ServerIp=192.168.0.107 +ScreenHeight=768 +ScreenWidth=1024 +ServerIp=192.168.0.107 ServerPort=61357 ShadowAlpha=0.2 ShadowFrameSkip=2 @@ -67,7 +68,7 @@ SoundVolumeAmbient=80 SoundVolumeFx=80 SoundVolumeMusic=90 StencilBits=0 -Textures3D=true +Textures3D=true UnitParticles=true UserData_Root=mydata/ -Windowed=false +Windowed=false diff --git a/source/glest_game/game/game_constants.h b/source/glest_game/game/game_constants.h index 8dc1080f2..e4afc437e 100644 --- a/source/glest_game/game/game_constants.h +++ b/source/glest_game/game/game_constants.h @@ -3,11 +3,12 @@ #include #include +#include "vec.h" // ============================================================== // This file is part of Glest (www.glest.org) // -// Copyright (C) 2001-2008 Marti�o Figueroa +// Copyright (C) 2001-2008 Martiño Figueroa // // You can redistribute this code and/or modify it under // the terms of the GNU General Public License as published @@ -15,12 +16,24 @@ // License, or (at your option) any later version // ============================================================== +using namespace Shared::Graphics; + namespace Glest{ namespace Game{ // ===================================================== // class GameConstants // ===================================================== +const Vec4f BLACK(0, 0, 0, 1); +const Vec4f RED(1, 0, 0, 1); +const Vec4f GREEN(0, 1, 0, 1); +const Vec4f BLUE(0, 0, 1, 1); +const Vec4f GLASS(1, 1, 1, 0.3); +const Vec4f CYAN(0, 1, 1, 1); +const Vec4f YELLOW(1, 1, 0, 1); +const Vec4f MAGENTA(1, 0, 1, 1); +const Vec4f WHITE(1, 1, 1, 1); + enum PathFinderType { pfBasic, pfRoutePlanner diff --git a/source/glest_game/menu/menu_state_masterserver.cpp b/source/glest_game/menu/menu_state_masterserver.cpp index 87d49d9db..0ee11c274 100644 --- a/source/glest_game/menu/menu_state_masterserver.cpp +++ b/source/glest_game/menu/menu_state_masterserver.cpp @@ -41,8 +41,8 @@ ServerLine::ServerLine( MasterServerInfo *mServerInfo, int lineIndex, const char Lang &lang= Lang::getInstance(); index=lineIndex; - int lineOffset=25*lineIndex; - masterServerInfo=mServerInfo; + int lineOffset = 25 * lineIndex; + masterServerInfo = *mServerInfo; int i=10; int startOffset=600; @@ -51,63 +51,63 @@ ServerLine::ServerLine( MasterServerInfo *mServerInfo, int lineIndex, const char glestVersionLabel.registerGraphicComponent(containerName,"glestVersionLabel" + intToStr(lineIndex)); registeredObjNameList.push_back("glestVersionLabel" + intToStr(lineIndex)); glestVersionLabel.init(i,startOffset-lineOffset); - glestVersionLabel.setText(masterServerInfo->getGlestVersion()); + glestVersionLabel.setText(masterServerInfo.getGlestVersion()); i+=80; registeredObjNameList.push_back("platformLabel" + intToStr(lineIndex)); platformLabel.registerGraphicComponent(containerName,"platformLabel" + intToStr(lineIndex)); platformLabel.init(i,startOffset-lineOffset); - platformLabel.setText(masterServerInfo->getPlatform()); + platformLabel.setText(masterServerInfo.getPlatform()); i+=50; registeredObjNameList.push_back("binaryCompileDateLabel" + intToStr(lineIndex)); binaryCompileDateLabel.registerGraphicComponent(containerName,"binaryCompileDateLabel" + intToStr(lineIndex)); binaryCompileDateLabel.init(i,startOffset-lineOffset); - binaryCompileDateLabel.setText(masterServerInfo->getBinaryCompileDate()); + binaryCompileDateLabel.setText(masterServerInfo.getBinaryCompileDate()); //game info: i+=130; registeredObjNameList.push_back("serverTitleLabel" + intToStr(lineIndex)); serverTitleLabel.registerGraphicComponent(containerName,"serverTitleLabel" + intToStr(lineIndex)); serverTitleLabel.init(i,startOffset-lineOffset); - serverTitleLabel.setText(masterServerInfo->getServerTitle()); + serverTitleLabel.setText(masterServerInfo.getServerTitle()); i+=160; registeredObjNameList.push_back("ipAddressLabel" + intToStr(lineIndex)); ipAddressLabel.registerGraphicComponent(containerName,"ipAddressLabel" + intToStr(lineIndex)); ipAddressLabel.init(i,startOffset-lineOffset); - ipAddressLabel.setText(masterServerInfo->getIpAddress()); + ipAddressLabel.setText(masterServerInfo.getIpAddress()); //game setup info: i+=100; registeredObjNameList.push_back("techLabel" + intToStr(lineIndex)); techLabel.registerGraphicComponent(containerName,"techLabel" + intToStr(lineIndex)); techLabel.init(i,startOffset-lineOffset); - techLabel.setText(masterServerInfo->getTech()); + techLabel.setText(masterServerInfo.getTech()); i+=100; registeredObjNameList.push_back("mapLabel" + intToStr(lineIndex)); mapLabel.registerGraphicComponent(containerName,"mapLabel" + intToStr(lineIndex)); mapLabel.init(i,startOffset-lineOffset); - mapLabel.setText(masterServerInfo->getMap()); + mapLabel.setText(masterServerInfo.getMap()); i+=100; registeredObjNameList.push_back("tilesetLabel" + intToStr(lineIndex)); tilesetLabel.registerGraphicComponent(containerName,"tilesetLabel" + intToStr(lineIndex)); tilesetLabel.init(i,startOffset-lineOffset); - tilesetLabel.setText(masterServerInfo->getTileset()); + tilesetLabel.setText(masterServerInfo.getTileset()); i+=100; registeredObjNameList.push_back("activeSlotsLabel" + intToStr(lineIndex)); activeSlotsLabel.registerGraphicComponent(containerName,"activeSlotsLabel" + intToStr(lineIndex)); activeSlotsLabel.init(i,startOffset-lineOffset); - activeSlotsLabel.setText(intToStr(masterServerInfo->getActiveSlots())+"/"+intToStr(masterServerInfo->getNetworkSlots())+"/"+intToStr(masterServerInfo->getConnectedClients())); + activeSlotsLabel.setText(intToStr(masterServerInfo.getActiveSlots())+"/"+intToStr(masterServerInfo.getNetworkSlots())+"/"+intToStr(masterServerInfo.getConnectedClients())); i+=50; registeredObjNameList.push_back("externalConnectPort" + intToStr(lineIndex)); externalConnectPort.registerGraphicComponent(containerName,"externalConnectPort" + intToStr(lineIndex)); externalConnectPort.init(i,startOffset-lineOffset); - externalConnectPort.setText(intToStr(masterServerInfo->getExternalConnectPort())); + externalConnectPort.setText(intToStr(masterServerInfo.getExternalConnectPort())); i+=50; registeredObjNameList.push_back("selectButton" + intToStr(lineIndex)); @@ -116,16 +116,23 @@ ServerLine::ServerLine( MasterServerInfo *mServerInfo, int lineIndex, const char selectButton.setText(">"); //printf("glestVersionString [%s] masterServerInfo->getGlestVersion() [%s]\n",glestVersionString.c_str(),masterServerInfo->getGlestVersion().c_str()); - bool compatible = checkVersionComptability(glestVersionString, masterServerInfo->getGlestVersion()); + bool compatible = checkVersionComptability(glestVersionString, masterServerInfo.getGlestVersion()); selectButton.setEnabled(compatible); selectButton.setEditable(compatible); + registeredObjNameList.push_back("gameFull" + intToStr(lineIndex)); + gameFull.registerGraphicComponent(containerName,"gameFull" + intToStr(lineIndex)); + gameFull.init(i, startOffset-lineOffset); + gameFull.setText(lang.get("MGGameSlotsFull")); + gameFull.setEnabled(!compatible); + gameFull.setEditable(!compatible); + GraphicComponent::applyAllCustomProperties(containerName); } ServerLine::~ServerLine() { GraphicComponent::clearRegisterGraphicComponent(containerName, registeredObjNameList); - delete masterServerInfo; + //delete masterServerInfo; } bool ServerLine::buttonMouseClick(int x, int y){ @@ -136,10 +143,29 @@ bool ServerLine::buttonMouseMove(int x, int y){ return selectButton.mouseMove(x,y); } -void ServerLine::render(){ +void ServerLine::render() { Renderer &renderer= Renderer::getInstance(); - renderer.renderButton(&selectButton); + bool joinEnabled = (masterServerInfo.getNetworkSlots() > masterServerInfo.getConnectedClients()); + if(joinEnabled == true) { + selectButton.setEnabled(true); + selectButton.setVisible(true); + + gameFull.setEnabled(false); + gameFull.setEditable(false); + + renderer.renderButton(&selectButton); + } + else { + selectButton.setEnabled(false); + selectButton.setVisible(false); + + gameFull.setEnabled(true); + gameFull.setEditable(true); + + renderer.renderLabel(&gameFull); + } + //general info: renderer.renderLabel(&glestVersionLabel); renderer.renderLabel(&platformLabel); @@ -209,6 +235,72 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen labelChatUrl.init(150,buttonPos-50); labelChatUrl.setFont(CoreData::getInstance().getMenuFontBig()); labelChatUrl.setText(lang.get("NoServerVisitChat")+": http://webchat.freenode.net/?channels=glest"); + + // Titles for current games - START + int lineIndex = 0; + int lineOffset=25*lineIndex; + int i=10; + int startOffset=623; + + //general info: + i+=10; + glestVersionLabel.registerGraphicComponent(containerName,"glestVersionLabel"); + glestVersionLabel.init(i,startOffset-lineOffset); + glestVersionLabel.setText(lang.get("MGVersion")); + + i+=80; + platformLabel.registerGraphicComponent(containerName,"platformLabel"); + platformLabel.init(i,startOffset-lineOffset); + platformLabel.setText(lang.get("MGPlatform")); + + i+=50; + binaryCompileDateLabel.registerGraphicComponent(containerName,"binaryCompileDateLabel"); + binaryCompileDateLabel.init(i,startOffset-lineOffset); + binaryCompileDateLabel.setText(lang.get("MGBuildDateTime")); + + //game info: + i+=130; + serverTitleLabel.registerGraphicComponent(containerName,"serverTitleLabel"); + serverTitleLabel.init(i,startOffset-lineOffset); + serverTitleLabel.setText(lang.get("MGGameTitle")); + + i+=160; + ipAddressLabel.registerGraphicComponent(containerName,"ipAddressLabel"); + ipAddressLabel.init(i,startOffset-lineOffset); + ipAddressLabel.setText(lang.get("MGGameIP")); + + //game setup info: + i+=100; + techLabel.registerGraphicComponent(containerName,"techLabel"); + techLabel.init(i,startOffset-lineOffset); + techLabel.setText(lang.get("TechTree")); + + i+=100; + mapLabel.registerGraphicComponent(containerName,"mapLabel"); + mapLabel.init(i,startOffset-lineOffset); + mapLabel.setText(lang.get("Map")); + + i+=100; + tilesetLabel.registerGraphicComponent(containerName,"tilesetLabel"); + tilesetLabel.init(i,startOffset-lineOffset); + tilesetLabel.setText(lang.get("Tileset")); + + i+=100; + activeSlotsLabel.registerGraphicComponent(containerName,"activeSlotsLabel"); + activeSlotsLabel.init(i,startOffset-lineOffset); + activeSlotsLabel.setText(lang.get("MGGameSlots")); + + i+=50; + externalConnectPort.registerGraphicComponent(containerName,"externalConnectPort"); + externalConnectPort.init(i,startOffset-lineOffset); + externalConnectPort.setText(lang.get("Port")); + + i+=50; + selectButton.registerGraphicComponent(containerName,"selectButton"); + selectButton.init(i, startOffset-lineOffset); + selectButton.setText(lang.get("MGJoinGameSlots")); + + // Titles for current games - END buttonReturn.registerGraphicComponent(containerName,"buttonReturn"); buttonReturn.init(50, buttonPos, 150); @@ -399,20 +491,44 @@ void MenuStateMasterserver::render(){ Renderer &renderer= Renderer::getInstance(); MutexSafeWrapper safeMutex(&masterServerThreadAccessor); - if(mainMessageBox.getEnabled()){ + if(mainMessageBox.getEnabled()) { renderer.renderMessageBox(&mainMessageBox); } else { renderer.renderButton(&buttonRefresh); renderer.renderButton(&buttonReturn); - renderer.renderLabel(&labelTitle); - renderer.renderLabel(&announcementLabel); + + renderer.renderLabel(&labelTitle,&GREEN); + renderer.renderLabel(&announcementLabel,&YELLOW); renderer.renderLabel(&versionInfoLabel); + renderer.renderLabel(&labelAutoRefresh); renderer.renderLabel(&labelChatUrl); renderer.renderButton(&buttonCreateGame); renderer.renderListBox(&listBoxAutoRefresh); + + // Render titles for server games listed + const Vec4f titleLabelColor = CYAN; + + //general info: + renderer.renderLabel(&glestVersionLabel,&titleLabelColor); + renderer.renderLabel(&platformLabel,&titleLabelColor); + renderer.renderLabel(&binaryCompileDateLabel,&titleLabelColor); + + //game info: + renderer.renderLabel(&serverTitleLabel,&titleLabelColor); + renderer.renderLabel(&ipAddressLabel,&titleLabelColor); + + //game setup info: + renderer.renderLabel(&techLabel,&titleLabelColor); + renderer.renderLabel(&mapLabel,&titleLabelColor); + renderer.renderLabel(&tilesetLabel,&titleLabelColor); + renderer.renderLabel(&activeSlotsLabel,&titleLabelColor); + renderer.renderLabel(&externalConnectPort,&titleLabelColor); + renderer.renderLabel(&selectButton,&titleLabelColor); + + // render console renderer.renderConsole(&console,false,false); diff --git a/source/glest_game/menu/menu_state_masterserver.h b/source/glest_game/menu/menu_state_masterserver.h index 5a84b9f15..40a032325 100644 --- a/source/glest_game/menu/menu_state_masterserver.h +++ b/source/glest_game/menu/menu_state_masterserver.h @@ -28,9 +28,10 @@ namespace Glest{ namespace Game{ class ServerLine { private: - MasterServerInfo *masterServerInfo; + MasterServerInfo masterServerInfo; int index; GraphicButton selectButton; + GraphicLabel gameFull; //general info: GraphicLabel glestVersionLabel; @@ -55,7 +56,7 @@ private: public: ServerLine( MasterServerInfo *mServerInfo, int lineIndex, const char *containerName); virtual ~ServerLine(); - MasterServerInfo *getMasterServerInfo() const {return masterServerInfo;} + MasterServerInfo *getMasterServerInfo() {return &masterServerInfo;} const int getIndex() const {return index;} bool buttonMouseClick(int x, int y); bool buttonMouseMove(int x, int y); @@ -88,6 +89,27 @@ private: GraphicLabel announcementLabel; GraphicLabel versionInfoLabel; + + + GraphicLabel glestVersionLabel; + GraphicLabel platformLabel; + GraphicLabel binaryCompileDateLabel; + + //game info: + GraphicLabel serverTitleLabel; + GraphicLabel ipAddressLabel; + + //game setup info: + GraphicLabel techLabel; + GraphicLabel mapLabel; + GraphicLabel tilesetLabel; + GraphicLabel activeSlotsLabel; + + GraphicLabel externalConnectPort; + + GraphicLabel selectButton; + + GraphicMessageBox mainMessageBox; int mainMessageBoxState; diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index f9d544edb..6e3ce1ec6 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -21,7 +21,7 @@ #include "logger.h" #include #include "util.h" - +#include "game_util.h" #include "leak_dumper.h" using namespace std; @@ -59,11 +59,13 @@ double LAG_CHECK_GRACE_PERIOD = 15; // badly and we want to give time for them to catch up double MAX_CLIENT_WAIT_SECONDS_FOR_PAUSE = 2; -ServerInterface::ServerInterface(){ +ServerInterface::ServerInterface() { gameHasBeenInitiated = false; gameSettingsUpdateCount = 0; currentFrameCount = 0; gameStartTime = 0; + publishToMasterserverThread = NULL; + lastMasterserverHeartbeatTime = 0; enabledThreadedClientCommandBroadcast = Config::getInstance().getBool("EnableThreadedClientCommandBroadcast","false"); maxFrameCountLagAllowed = Config::getInstance().getInt("MaxFrameCountLagAllowed",intToStr(maxFrameCountLagAllowed).c_str()); @@ -82,7 +84,7 @@ ServerInterface::ServerInterface(){ serverSocket.setBindPort(Config::getInstance().getInt("ServerPort",intToStr(GameConstants::serverPort).c_str())); } -ServerInterface::~ServerInterface(){ +ServerInterface::~ServerInterface() { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); for(int i= 0; igetAllowDownloadDataSynch() == true && - connectionSlot->isConnected()) - { - if(connectionSlot->getNetworkGameDataSynchCheckOk() == false) - { + connectionSlot->isConnected()) { + if(connectionSlot->getNetworkGameDataSynchCheckOk() == false) { bOkToStart = false; break; } } } - if(bOkToStart == true) - { + if(bOkToStart == true) { serverSocket.stopBroadCastThread(); NetworkMessageLaunch networkMessageLaunch(gameSettings,nmtLaunch); broadcastMessage(&networkMessageLaunch); + + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + delete publishToMasterserverThread; + publishToMasterserverThread = NULL; + + publishToMasterserverThread = new SimpleTaskThread(this,0,25); + publishToMasterserverThread->setUniqueID(__FILE__); + publishToMasterserverThread->start(); } SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); @@ -1378,4 +1389,106 @@ int ServerInterface::getHumanPlayerIndex() const { return gameSettings.getStartLocationIndex(gameSettings.getThisFactionIndex()); } +std::map ServerInterface::publishToMasterserver() { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + + // The server player counts as 1 for each of these + int slotCountUsed=1; + int slotCountHumans=1; + int slotCountConnectedPlayers=1; + + Config &config= Config::getInstance(); + //string serverinfo=""; + std::map publishToServerInfo; + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + + for(int i= 0; i < GameConstants::maxPlayers; ++i) { + if(slots[i] != NULL) { + slotCountUsed++; + slotCountHumans++; + ConnectionSlot* connectionSlot= slots[i]; + if((connectionSlot!=NULL) && (connectionSlot->isConnected())) { + slotCountConnectedPlayers++; + } + } + } + + //?status=waiting&system=linux&info=titus + publishToServerInfo["glestVersion"] = glestVersionString; + publishToServerInfo["platform"] = getPlatformNameString(); + publishToServerInfo["binaryCompileDate"] = getCompileDateTime(); + + //game info: + publishToServerInfo["serverTitle"] = getHumanPlayerName() + "'s game *IN PROGRESS*"; + //ip is automatically set + + //game setup info: + publishToServerInfo["tech"] = this->getGameSettings()->getTech(); + publishToServerInfo["map"] = this->getGameSettings()->getMap(); + publishToServerInfo["tileset"] = this->getGameSettings()->getTileset(); + publishToServerInfo["activeSlots"] = intToStr(slotCountUsed); + publishToServerInfo["networkSlots"] = intToStr(slotCountHumans); + publishToServerInfo["connectedClients"] = intToStr(slotCountConnectedPlayers); + //string externalport = intToStr(Config::getInstance().getInt("ExternalServerPort",intToStr(Config::getInstance().getInt("ServerPort")).c_str())); + string externalport = config.getString("MasterServerExternalPort", "61357"); + publishToServerInfo["externalconnectport"] = externalport; + + if(publishToMasterserverThread == NULL) { + publishToServerInfo["serverTitle"] = getHumanPlayerName() + "'s game *FINISHED*"; + publishToServerInfo["gameCmd"]= "gameOver"; + } + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + + return publishToServerInfo; +} + +void ServerInterface::simpleTask() { + //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + + MutexSafeWrapper safeMutex(&masterServerThreadAccessor); + if(difftime(time(NULL),lastMasterserverHeartbeatTime) >= 30) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); + + lastMasterserverHeartbeatTime = time(NULL); + + bool isNetworkGame = (this->getGameSettings() != NULL && this->getGameSettings()->isNetworkGame()); + if(isNetworkGame == true) { + //string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?" + newPublishToServerInfo; + string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?"; + + std::map newPublishToServerInfo = publishToMasterserver(); + + CURL *handle = SystemFlags::initHTTP(); + for(std::map::const_iterator iterMap = newPublishToServerInfo.begin(); + iterMap != newPublishToServerInfo.end(); iterMap++) { + + request += iterMap->first; + request += "="; + request += SystemFlags::escapeURL(iterMap->second,handle); + request += "&"; + } + + //printf("the request is:\n%s\n",request.c_str()); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] the request is:\n%s\n",__FILE__,__FUNCTION__,__LINE__,request.c_str()); + + std::string serverInfo = SystemFlags::getHTTP(request,handle); + SystemFlags::cleanupHTTP(&handle); + + //printf("the result is:\n'%s'\n",serverInfo.c_str()); + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d] the result is:\n'%s'\n",__FILE__,__FUNCTION__,__LINE__,serverInfo.c_str()); + + // uncomment to enable router setup check of this server + if(EndsWith(serverInfo, "OK") == false) { + //showMasterserverError=true; + //masterServererErrorToShow = (serverInfo != "" ? serverInfo : "No Reply"); + } + } + } + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); +} + + }}//end namespace diff --git a/source/glest_game/network/server_interface.h b/source/glest_game/network/server_interface.h index 4e1a1d85d..fb61f6ec7 100644 --- a/source/glest_game/network/server_interface.h +++ b/source/glest_game/network/server_interface.h @@ -29,7 +29,7 @@ namespace Glest{ namespace Game{ // class ServerInterface // ===================================================== -class ServerInterface: public GameNetworkInterface, public ConnectionSlotCallbackInterface { +class ServerInterface: public GameNetworkInterface, public ConnectionSlotCallbackInterface, public SimpleTaskCallbackInterface { private: ConnectionSlot* slots[GameConstants::maxPlayers]; @@ -42,6 +42,10 @@ private: time_t gameStartTime; + SimpleTaskThread *publishToMasterserverThread; + Mutex masterServerThreadAccessor; + time_t lastMasterserverHeartbeatTime; + public: ServerInterface(); virtual ~ServerInterface(); @@ -103,6 +107,8 @@ public: Mutex * getServerSynchAccessor() { return &serverSynchAccessor; } + virtual void simpleTask(); + private: void broadcastMessage(const NetworkMessage* networkMessage, int excludeSlot= -1); @@ -110,6 +116,8 @@ private: bool shouldDiscardNetworkMessage(NetworkMessageType networkMessageType,ConnectionSlot* connectionSlot); void updateSlot(ConnectionSlotEvent *event); void validateConnectedClients(); + + std::map publishToMasterserver(); }; }}//end namespace diff --git a/source/masterserver/addServerInfo.php b/source/masterserver/addServerInfo.php index a815a26e2..ab0120b8a 100644 --- a/source/masterserver/addServerInfo.php +++ b/source/masterserver/addServerInfo.php @@ -44,6 +44,11 @@ $activeSlots = (int) clean_str( $_GET['activeSlots'] ); $networkSlots = (int) clean_str( $_GET['networkSlots'] ); $connectedClients = (int) clean_str( $_GET['connectedClients'] ); + + $gameCmd = ""; + if(isset($_GET["gameCmd"])) { + $gameCmd = (string) clean_str( $_GET['gameCmd'] ); +} define( 'DB_LINK', db_connect() ); @@ -57,12 +62,12 @@ // Representation starts here (but it should really be starting much later, there is way too much logic behind this point) header( 'Content-Type: text/plain; charset=utf-8' ); - if ( $connectedClients == $networkSlots ) // game servers' slots are all full + if ( ($glestVersion <= "3.3.7.2" && $connectedClients == $networkSlots) || $gameCmd == "gameOver") // game servers' slots are all full { // delete server; no checks are performed mysql_db_query( MYSQL_DATABASE, 'DELETE FROM glestserver WHERE ip=\'' . mysql_real_escape_string( $remote_ip ) . '\' && externalServerPort=\'' . mysql_real_escape_string( $service_port ) . '\';' ); echo 'OK' ; } - else if ( $remote_ip == $server[0] && $service_port == $server[1] ) // this server is contained in the database + else if ( $remote_ip == $server[0] && $service_port == $server[1] ) // this server is contained in the database { // update database info on this game server; no checks are performed mysql_db_query( MYSQL_DATABASE, 'UPDATE glestserver SET ' . 'glestVersion=\'' . mysql_real_escape_string( $glestVersion ) . '\', ' .