X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=netconn.c;h=b079a370d3fb2a941b0b717459cd0ac0ab5022fd;hb=417727143082992c3b4c9469f0c5683005c949fd;hp=fc2b34c320f6b368047fe5f4fb584bc312cdd69b;hpb=4b2de85026cee42d3c3c2e2c786077ba36ec876a;p=xonotic%2Fdarkplaces.git diff --git a/netconn.c b/netconn.c index fc2b34c3..b079a370 100755 --- a/netconn.c +++ b/netconn.c @@ -81,7 +81,9 @@ static cvar_t net_slist_timeout = {0, "net_slist_timeout", "4", "how long to lis static cvar_t net_slist_pause = {0, "net_slist_pause", "0", "when set to 1, the server list won't update until it is set back to 0"}; static cvar_t net_slist_maxtries = {0, "net_slist_maxtries", "3", "how many times to ask the same server for information (more times gives better ping reports but takes longer)"}; static cvar_t net_slist_favorites = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "net_slist_favorites", "", "contains a list of IP addresses and ports to always query explicitly"}; -static cvar_t gameversion = {0, "gameversion", "0", "version of game data (mod-specific), when client and server gameversion mismatch in the server browser the server is shown as incompatible"}; +static cvar_t gameversion = {0, "gameversion", "0", "version of game data (mod-specific) to be sent to querying clients"}; +static cvar_t gameversion_min = {0, "gameversion_min", "-1", "minimum version of game data (mod-specific), when client and server gameversion mismatch in the server browser the server is shown as incompatible; if -1, gameversion is used alone"}; +static cvar_t gameversion_max = {0, "gameversion_max", "-1", "maximum version of game data (mod-specific), when client and server gameversion mismatch in the server browser the server is shown as incompatible; if -1, gameversion is used alone"}; static cvar_t rcon_restricted_password = {CVAR_PRIVATE, "rcon_restricted_password", "", "password to authenticate rcon commands in restricted mode"}; static cvar_t rcon_restricted_commands = {0, "rcon_restricted_commands", "", "allowed commands for rcon when the restricted mode password was used"}; static cvar_t rcon_secure_maxdiff = {0, "rcon_secure_maxdiff", "5", "maximum time difference between rcon request and server system clock (to protect against replay attack)"}; @@ -105,12 +107,12 @@ int masterreplycount = 0; int serverquerycount = 0; int serverreplycount = 0; -// this is only false if there are still servers left to query +/// this is only false if there are still servers left to query static qboolean serverlist_querysleep = true; static qboolean serverlist_paused = false; -// this is pushed a second or two ahead of realtime whenever a master server -// reply is received, to avoid issuing queries while master replies are still -// flooding in (which would make a mess of the ping times) +/// this is pushed a second or two ahead of realtime whenever a master server +/// reply is received, to avoid issuing queries while master replies are still +/// flooding in (which would make a mess of the ping times) static double serverlist_querywaittime = 0; static unsigned char sendbuffer[NET_HEADERSIZE+NET_MAXMESSAGE]; @@ -151,7 +153,7 @@ qboolean serverlist_consoleoutput; static int nFavorites = 0; static lhnetaddress_t favorites[256]; -void NetConn_UpdateFavorites() +void NetConn_UpdateFavorites(void) { const char *p; nFavorites = 0; @@ -163,8 +165,8 @@ void NetConn_UpdateFavorites() } } -// helper function to insert a value into the viewset -// spare entries will be removed +/// helper function to insert a value into the viewset +/// spare entries will be removed static void _ServerList_ViewList_Helper_InsertBefore( int index, serverlist_entry_t *entry ) { int i; @@ -180,7 +182,7 @@ static void _ServerList_ViewList_Helper_InsertBefore( int index, serverlist_entr serverlist_viewlist[index] = entry; } -// we suppose serverlist_viewcount to be valid, ie > 0 +/// we suppose serverlist_viewcount to be valid, ie > 0 static void _ServerList_ViewList_Helper_Remove( int index ) { serverlist_viewcount--; @@ -188,7 +190,7 @@ static void _ServerList_ViewList_Helper_Remove( int index ) serverlist_viewlist[index] = serverlist_viewlist[index + 1]; } -// returns true if A should be inserted before B +/// \returns true if A should be inserted before B static qboolean _ServerList_Entry_Compare( serverlist_entry_t *A, serverlist_entry_t *B ) { int result = 0; // > 0 if for numbers A > B and for text if A < B @@ -377,7 +379,16 @@ static void ServerList_ViewList_Insert( serverlist_entry_t *entry ) lhnetaddress_t addr; // reject incompatible servers - if (entry->info.gameversion != gameversion.integer) + if( + entry->info.gameversion != gameversion.integer + && + !( + gameversion_min.integer >= 0 // min/max range set by user/mod? + && gameversion_max.integer >= 0 + && gameversion_min.integer >= entry->info.gameversion // version of server in min/max range? + && gameversion_max.integer <= entry->info.gameversion + ) + ) return; // refresh the "favorite" status @@ -554,11 +565,11 @@ int NetConn_Read(lhnetsocket_t *mysocket, void *data, int maxlength, lhnetaddres if (length > 0) { LHNETADDRESS_ToString(peeraddress, addressstring2, sizeof(addressstring2), true); - Con_Printf("LHNET_Read(%p (%s), %p, %i, %p) = %i from %s:\n", mysocket, addressstring, data, maxlength, peeraddress, length, addressstring2); + Con_Printf("LHNET_Read(%p (%s), %p, %i, %p) = %i from %s:\n", (void *)mysocket, addressstring, (void *)data, maxlength, (void *)peeraddress, length, addressstring2); Com_HexDumpToConsole((unsigned char *)data, length); } else - Con_Printf("LHNET_Read(%p (%s), %p, %i, %p) = %i\n", mysocket, addressstring, data, maxlength, peeraddress, length); + Con_Printf("LHNET_Read(%p (%s), %p, %i, %p) = %i\n", (void *)mysocket, addressstring, (void *)data, maxlength, (void *)peeraddress, length); } return length; } @@ -577,7 +588,7 @@ int NetConn_Write(lhnetsocket_t *mysocket, const void *data, int length, const l char addressstring[128], addressstring2[128]; LHNETADDRESS_ToString(LHNET_AddressFromSocket(mysocket), addressstring, sizeof(addressstring), true); LHNETADDRESS_ToString(peeraddress, addressstring2, sizeof(addressstring2), true); - Con_Printf("LHNET_Write(%p (%s), %p, %i, %p (%s)) = %i%s\n", mysocket, addressstring, data, length, peeraddress, addressstring2, length, ret == length ? "" : " (ERROR)"); + Con_Printf("LHNET_Write(%p (%s), %p, %i, %p (%s)) = %i%s\n", (void *)mysocket, addressstring, (void *)data, length, (void *)peeraddress, addressstring2, length, ret == length ? "" : " (ERROR)"); Com_HexDumpToConsole((unsigned char *)data, length); } return ret; @@ -1369,7 +1380,18 @@ static void NetConn_ClientParsePacket_ServerList_UpdateCache(int n) serverlist_info_t *info = &entry->info; // update description strings for engine menu and console output dpsnprintf(entry->line1, sizeof(serverlist_cache[n].line1), "^%c%5d^7 ^%c%3u^7/%3u %-65.65s", info->ping >= 300 ? '1' : (info->ping >= 200 ? '3' : '7'), (int)info->ping, ((info->numhumans > 0 && info->numhumans < info->maxplayers) ? (info->numhumans >= 4 ? '7' : '3') : '1'), info->numplayers, info->maxplayers, info->name); - dpsnprintf(entry->line2, sizeof(serverlist_cache[n].line2), "^4%-21.21s %-19.19s ^%c%-17.17s^4 %-20.20s", info->cname, info->game, (info->gameversion != gameversion.integer) ? '1' : '4', info->mod, info->map); + dpsnprintf(entry->line2, sizeof(serverlist_cache[n].line2), "^4%-21.21s %-19.19s ^%c%-17.17s^4 %-20.20s", info->cname, info->game, + ( + info->gameversion != gameversion.integer + && + !( + gameversion_min.integer >= 0 // min/max range set by user/mod? + && gameversion_max.integer >= 0 + && gameversion_min.integer >= info->gameversion // version of server in min/max range? + && gameversion_max.integer <= info->gameversion + ) + ) ? '1' : '4', + info->mod, info->map); if (entry->query == SQS_QUERIED) { if(!serverlist_paused) @@ -1453,7 +1475,7 @@ static void NetConn_ClientParsePacket_ServerList_ParseDPList(lhnetaddress_t *sen { const char *ifname; - // TODO: make some basic checks of the IP address (broadcast, ...) + /// \TODO: make some basic checks of the IP address (broadcast, ...) ifname = LHNETADDRESS_GetInterfaceName(senderaddress); if (ifname != NULL) @@ -1892,7 +1914,7 @@ void NetConn_QueryQueueFrame(void) if(!net_slist_pause.integer && serverlist_paused) ServerList_RebuildViewList(); - serverlist_paused = net_slist_pause.integer; + serverlist_paused = net_slist_pause.integer != 0; if (serverlist_querysleep) return; @@ -2037,7 +2059,7 @@ static void NetConn_BuildChallengeString(char *buffer, int bufferlength) buffer[i] = 0; } -// (div0) build the full response only if possible; better a getinfo response than no response at all if getstatus won't fit +/// (div0) build the full response only if possible; better a getinfo response than no response at all if getstatus won't fit static qboolean NetConn_BuildStatusResponse(const char* challenge, char* out_msg, size_t out_size, qboolean fullstatus) { char qcstatus[256]; @@ -2074,7 +2096,7 @@ static qboolean NetConn_BuildStatusResponse(const char* challenge, char* out_msg } } - // TODO: we should add more information for the full status string + /// \TODO: we should add more information for the full status string length = dpsnprintf(out_msg, out_size, "\377\377\377\377%s\x0A" "\\gamename\\%s\\modname\\%s\\gameversion\\%d\\sv_maxclients\\%d" @@ -2288,7 +2310,7 @@ qboolean plaintext_matching(const char *password, const char *hash, const char * return !strcmp(password, hash); } -// returns a string describing the user level, or NULL for auth failure +/// returns a string describing the user level, or NULL for auth failure const char *RCon_Authenticate(const char *password, const char *s, const char *endpos, rcon_matchfunc_t comparator, const char *cs, int cslen) { const char *text; @@ -3142,6 +3164,8 @@ void NetConn_Init(void) for (i = 0;sv_masters[i].name;i++) Cvar_RegisterVariable(&sv_masters[i]); Cvar_RegisterVariable(&gameversion); + Cvar_RegisterVariable(&gameversion_min); + Cvar_RegisterVariable(&gameversion_max); // COMMANDLINEOPTION: Server: -ip sets the ip address of this machine for purposes of networking (default 0.0.0.0 also known as INADDR_ANY), use only if you have multiple network adapters and need to choose one specifically. if ((i = COM_CheckParm("-ip")) && i + 1 < com_argc) {