diff --git a/autopackage/default.apspec.in b/autopackage/default.apspec.in index 4fad83659..5f27886c2 100644 --- a/autopackage/default.apspec.in +++ b/autopackage/default.apspec.in @@ -16,13 +16,13 @@ PackageDesktop: share/applications/warzone2100.desktop AutopackageTarget: 1.2 [BuildPrepare] -prepareBuild --enable-data +prepareBuild --enable-data --disable-mp3 [BuildUnprepare] unprepareBuild [Globals] -export APBUILD_STATIC="mad" +export APBUILD_STATIC="physfs=libphysfs.a" [Imports] echo '*' | import @@ -33,7 +33,6 @@ require @libsdl.org/sdl 1.2 require @libsdl.org/sdl_net 1.2 require @opengl.org/opengl 1 require @openal.org/openal 0 -require @icculus.org/physfs 1 require @libpng.org/libpng 3 require @xiph.org/libogg 0 require @xiph.org/libvorbis 0 diff --git a/lib/netplay/netplay.c b/lib/netplay/netplay.c index f1bd03e01..e40144584 100644 --- a/lib/netplay/netplay.c +++ b/lib/netplay/netplay.c @@ -41,10 +41,11 @@ #include "netplay.h" #include "netlog.h" -char* master_server = "warzone2100.kicks-ass.org"; -#define MASTER_SERVER_PORT 9998 -#define WARZONE_NET_PORT 9999 +// WARNING !!! This is initialised via configuration.c !!! +char masterserver_name[255] = {'\0'}; +unsigned int masterserver_port = 0, gameserver_port = 0; + #define MAX_CONNECTED_PLAYERS 8 #define MAX_TMP_SOCKETS 16 @@ -477,7 +478,7 @@ BOOL NETsetGameFlags(UDWORD flag, SDWORD value) // setup stuff BOOL NETinit(BOOL bFirstCall) { - UDWORD i; + UDWORD i; debug( LOG_NET, "NETinit" ); // NEThashFile("warzonedebug.exe"); @@ -980,14 +981,14 @@ BOOL NETsetupTCPIP(void ** addr, char * machine) debug( LOG_NET, "NETsetupTCPIP\n" ); if ( hostname != NULL - && hostname != master_server) { + && hostname != masterserver_name) { free(hostname); } if ( machine != NULL && machine[0] != '\0') { hostname = strdup(machine); } else { - hostname = master_server; + hostname = masterserver_name; } return TRUE; @@ -1126,15 +1127,15 @@ void NETregisterServer(int state) { if (state != registered) { switch(state) { case 1: { - if(SDLNet_ResolveHost(&ip, master_server, MASTER_SERVER_PORT) == -1) { - debug( LOG_ERROR, "NETregisterServer: couldn't resolve master server (%s): %s\n", master_server, SDLNet_GetError() ); + if(SDLNet_ResolveHost(&ip, masterserver_name, masterserver_port) == -1) { + debug( LOG_ERROR, "NETregisterServer: Cannot resolve masterserver \"%s\": %s\n", masterserver_name, SDLNet_GetError() ); server_not_there = 1; return; } if(!rs_socket) rs_socket = SDLNet_TCP_Open(&ip); if(rs_socket == NULL) { - debug( LOG_ERROR, "NETregisterServer: Cannot connect to master server (%s): %s\n", master_server, SDLNet_GetError() ); + debug( LOG_ERROR, "NETregisterServer: Cannot connect to masterserver \"%s:%d\": %s\n", masterserver_name, masterserver_port, SDLNet_GetError() ); server_not_there = 1; return; } @@ -1169,7 +1170,7 @@ static void NETallowJoining(void) { if (tmp_socket_set == NULL) { tmp_socket_set = SDLNet_AllocSocketSet(MAX_TMP_SOCKETS+1); if (tmp_socket_set == NULL) { - debug( LOG_ERROR, "Couldn't create socket set: %s\n", SDLNet_GetError() ); + debug( LOG_ERROR, "NETallowJoining: Cannot create socket set: %s\n", SDLNet_GetError() ); return; } SDLNet_TCP_AddSocket(tmp_socket_set, tcp_socket); @@ -1248,6 +1249,10 @@ static void NETallowJoining(void) { for (j = 0; j < MAX_CONNECTED_PLAYERS; ++j) { NETBroadcastPlayerInfo(j); } + + // Make sure the master server gets updated by disconnecting from it + // NETallowJoining will reconnect + NETregisterServer(0); } } } @@ -1271,20 +1276,20 @@ BOOL NEThostGame(const char* SessionName, const char* PlayerName, return TRUE; } - if(SDLNet_ResolveHost(&ip, NULL, WARZONE_NET_PORT) == -1) { - debug( LOG_ERROR, "NEThostGame: couldn't resolve master self: %s\n", SDLNet_GetError() ); + if(SDLNet_ResolveHost(&ip, NULL, gameserver_port) == -1) { + debug( LOG_ERROR, "NEThostGame: Cannot resolve master self: %s\n", SDLNet_GetError() ); return FALSE; } if(!tcp_socket) tcp_socket = SDLNet_TCP_Open(&ip); if(tcp_socket == NULL) { - printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError()); + printf("NEThostGame: Cannot connect to master self: %s\n", SDLNet_GetError()); return FALSE; } if(!socket_set) socket_set = SDLNet_AllocSocketSet(MAX_CONNECTED_PLAYERS); if (socket_set == NULL) { - debug( LOG_ERROR, "Couldn't create socket set: %s\n", SDLNet_GetError() ); + debug( LOG_ERROR, "NEThostGame: Cannot create socket set: %s\n", SDLNet_GetError() ); return FALSE; } for (i = 0; i < MAX_CONNECTED_PLAYERS; ++i) { @@ -1327,19 +1332,21 @@ BOOL NEThaltJoining(void) debug( LOG_NET, "NEThaltJoining\n" ); allow_joining = FALSE; - + // disconnect from the master server + NETregisterServer(0); return TRUE; } // //////////////////////////////////////////////////////////////////////// // find games on open connection, option to do this asynchronously // since it can sometimes take a while. -BOOL NETfindGame(BOOL async) /// may (not) want to use async here... +BOOL NETfindGame(BOOL async) // may (not) want to use async here... { static UDWORD gamecount = 0, gamesavailable; IPaddress ip; char buffer[sizeof(GAMESTRUCT)*2]; GAMESTRUCT* tmpgame = (GAMESTRUCT*)buffer; + unsigned int port = (hostname == masterserver_name) ? masterserver_port : gameserver_port; debug( LOG_NET, "NETfindGame\n" ); @@ -1355,9 +1362,8 @@ BOOL NETfindGame(BOOL async) /// may (not) want to use async here... return TRUE; } - if (SDLNet_ResolveHost(&ip, hostname, (hostname == master_server) ? MASTER_SERVER_PORT - : WARZONE_NET_PORT) == -1) { - debug( LOG_ERROR, "NETfindGame: couldn't resolve hostname (%s): %s\n", hostname, SDLNet_GetError() ); + if (SDLNet_ResolveHost(&ip, hostname, port) == -1) { + debug( LOG_ERROR, "NETfindGame: Cannot resolve hostname \"%s\": %s\n", hostname, SDLNet_GetError() ); return FALSE; } @@ -1367,13 +1373,13 @@ BOOL NETfindGame(BOOL async) /// may (not) want to use async here... tcp_socket = SDLNet_TCP_Open(&ip); if (tcp_socket == NULL) { - debug( LOG_ERROR, "SDLNet_TCP_Open: %s\n", SDLNet_GetError() ); + debug( LOG_ERROR, "NETfindGame: Cannot connect to \"%s:%d\": %s\n", hostname, port, SDLNet_GetError() ); return FALSE; } socket_set = SDLNet_AllocSocketSet(1); if (socket_set == NULL) { - debug( LOG_ERROR, "Couldn't create socket set: %s\n", SDLNet_GetError() ); + debug( LOG_ERROR, "NETfindGame: Cannot create socket set: %s\n", SDLNet_GetError() ); return FALSE; } SDLNet_TCP_AddSocket(socket_set, tcp_socket); @@ -1431,13 +1437,13 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername) NETclose(); // just to be sure :) - if (hostname != master_server) { + if (hostname != masterserver_name) { free(hostname); } hostname = strdup(NetPlay.games[gameNumber].desc.host); - if(SDLNet_ResolveHost(&ip, hostname, WARZONE_NET_PORT) == -1) { - debug( LOG_ERROR, "NETjoinGame: couldn't resolve hostname (%s): %s\n", hostname, SDLNet_GetError() ); + if(SDLNet_ResolveHost(&ip, hostname, gameserver_port) == -1) { + debug( LOG_ERROR, "NETjoinGame: Cannot resolve hostname \"%s\": %s\n", hostname, SDLNet_GetError() ); return FALSE; } @@ -1447,13 +1453,13 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername) tcp_socket = SDLNet_TCP_Open(&ip); if (tcp_socket == NULL) { - debug( LOG_ERROR, "SDLNet_TCP_Open: %s\n", SDLNet_GetError() ); + debug( LOG_ERROR, "NETjoinGame: Cannot connect to \"%s:%d\": %s\n", hostname, gameserver_port, SDLNet_GetError() ); return FALSE; } socket_set = SDLNet_AllocSocketSet(1); if (socket_set == NULL) { - debug( LOG_ERROR, "Couldn't create socket set: %s\n", SDLNet_GetError() ); + debug( LOG_ERROR, "NETjoinGame: Cannot create socket set: %s\n", SDLNet_GetError() ); return FALSE; } SDLNet_TCP_AddSocket(socket_set, tcp_socket); @@ -1518,3 +1524,34 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername) } +/*! + * Set the masterserver name + * \param hostname The hostname of the masterserver to connect to + */ +void NETsetMasterserverName(const char* hostname) +{ + size_t name_size = strlen(hostname); + if ( name_size > 255 ) + name_size = 255; + strncpy(masterserver_name, hostname, name_size); +} + + +/*! + * Set the masterserver port + * \param port The port of the masterserver to connect to + */ +void NETsetMasterserverPort(unsigned int port) +{ + masterserver_port = port; +} + + +/*! + * Set the port we shall host games on + * \param port The port to listen to + */ +void NETsetGameserverPort(unsigned int port) +{ + gameserver_port = port; +} diff --git a/lib/netplay/netplay.h b/lib/netplay/netplay.h index b45d1cafa..7df7413aa 100644 --- a/lib/netplay/netplay.h +++ b/lib/netplay/netplay.h @@ -177,6 +177,9 @@ extern UDWORD NEThashBuffer(char *pData, UDWORD size); extern WZ_DECL_DEPRECATED BOOL NETcheckRegistryEntries (char *name,char *guid); extern WZ_DECL_DEPRECATED BOOL NETsetRegistryEntries (char *name,char *guid,char *file,char *cline,char *path,char *cdir); extern WZ_DECL_DEPRECATED BOOL NETconnectToLobby (LPNETPLAY lpNetPlay); +extern void NETsetMasterserverName(const char* hostname); +extern void NETsetMasterserverPort(unsigned int port); +extern void NETsetGameserverPort(unsigned int port); // Some shortcuts to help you along! /* FIXME: This is _not_ portable! Bad, Pumpkin, bad! - Per */ diff --git a/src/configuration.c b/src/configuration.c index 84be269e9..9bd7112db 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -192,6 +192,36 @@ BOOL loadConfig(void) setWarzoneKeyNumeric("mouseflip", TRUE); } + if (getWarzoneKeyString("masterserver_name", sBuf)) + { + NETsetMasterserverName(sBuf); + } + else + { + NETsetMasterserverName("lobby.wz2100.net"); + setWarzoneKeyString("masterserver_name", "lobby.wz2100.net"); + } + + if (getWarzoneKeyNumeric("masterserver_port", &val)) + { + NETsetMasterserverPort(val); + } + else + { + NETsetMasterserverPort(9998); + setWarzoneKeyNumeric("masterserver_port", 9998); + } + + if (getWarzoneKeyNumeric("gameserver_port", &val)) + { + NETsetGameserverPort(val); + } + else + { + NETsetGameserverPort(9999); + setWarzoneKeyNumeric("gameserver_port", 9999); + } + // ////////////////////////// // sequences if(getWarzoneKeyNumeric("sequences", &val)) @@ -311,7 +341,7 @@ BOOL loadConfig(void) // ///////////////////////// // game name - if (getWarzoneKeyString("gameName",(char*)&sBuf)) + if (getWarzoneKeyString("gameName", sBuf)) { strcpy(game.name, sBuf); } @@ -321,7 +351,7 @@ BOOL loadConfig(void) } // player name - if (getWarzoneKeyString("playerName",(char*)&sBuf)) + if (getWarzoneKeyString("playerName", sBuf)) { strcpy((char*)sPlayer, sBuf); } @@ -331,7 +361,7 @@ BOOL loadConfig(void) } // map name - if(getWarzoneKeyString("mapName",(char*)&sBuf)) + if(getWarzoneKeyString("mapName", sBuf)) { strcpy(game.map, sBuf); } @@ -430,7 +460,7 @@ BOOL loadConfig(void) } // force name - if(getWarzoneKeyString("forceName",(char*)&sBuf)) + if(getWarzoneKeyString("forceName", sBuf)) { strcpy(sForceName, sBuf); }