Index: code/qcommon/md5.c =================================================================== --- code/qcommon/md5.c (revision 1038) +++ code/qcommon/md5.c (working copy) @@ -257,7 +257,7 @@ } -char *Com_MD5File(const char *fn, int length) +char *Com_MD5File(const char *fn, int length, char *prefix, int prefix_len) { static char final[33] = {"unknown"}; unsigned char digest[16] = {""}; @@ -278,6 +278,10 @@ } MD5Init(&md5); + if( prefix_len && *prefix ) { + MD5Update(&md5 , (unsigned char *)prefix, prefix_len); + length += prefix_len; + } for(;;) { r = FS_Read2(buffer, sizeof(buffer), f); if(r < 1) Index: code/qcommon/qcommon.h =================================================================== --- code/qcommon/qcommon.h (revision 1038) +++ code/qcommon/qcommon.h (working copy) @@ -732,7 +732,7 @@ int Com_EventLoop( void ); int Com_Milliseconds( void ); // will be journaled properly unsigned Com_BlockChecksum( const void *buffer, int length ); -char *Com_MD5File(const char *filename, int length); +char *Com_MD5File(const char *filename, int length, char *prefix, int prefix_len); int Com_HashKey(char *string, int maxlen); int Com_Filter(char *filter, char *name, int casesensitive); int Com_FilterPath(char *filter, char *name, int casesensitive); Index: code/client/cl_main.c =================================================================== --- code/client/cl_main.c (revision 1038) +++ code/client/cl_main.c (working copy) @@ -74,6 +74,8 @@ cvar_t *cl_lanForcePackets; +cvar_t *cl_guidServerUniq; + clientActive_t cl; clientConnection_t clc; clientStatic_t cls; @@ -1036,6 +1038,7 @@ */ void CL_Connect_f( void ) { char *server; + char serverString[ 22 ]; if ( Cmd_Argc() != 2 ) { Com_Printf( "usage: connect [server]\n"); @@ -1078,11 +1081,18 @@ if (clc.serverAddress.port == 0) { clc.serverAddress.port = BigShort( PORT_SERVER ); } - Com_Printf( "%s resolved to %i.%i.%i.%i:%i\n", cls.servername, - clc.serverAddress.ip[0], clc.serverAddress.ip[1], - clc.serverAddress.ip[2], clc.serverAddress.ip[3], - BigShort( clc.serverAddress.port ) ); + Com_sprintf( serverString, sizeof( serverString ), "%i.%i.%i.%i:%i", + clc.serverAddress.ip[0], clc.serverAddress.ip[1], + clc.serverAddress.ip[2], clc.serverAddress.ip[3], + BigShort( clc.serverAddress.port ) ); + + Com_Printf( "%s resolved to %s\n", cls.servername, serverString ); + if( cl_guidServerUniq->integer ) { + Cvar_Set( "cl_guid", Com_MD5File(QKEY_FILE, 0, + serverString, strlen( serverString ) ) ); + } + // if we aren't playing on a lan, we need to authenticate // with the cd key if ( NET_IsLocalAddress( clc.serverAddress ) ) { @@ -2595,6 +2605,8 @@ cl_lanForcePackets = Cvar_Get ("cl_lanForcePackets", "1", CVAR_ARCHIVE); + cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE); + // userinfo Cvar_Get ("name", "UnnamedPlayer", CVAR_USERINFO | CVAR_ARCHIVE ); Cvar_Get ("rate", "3000", CVAR_USERINFO | CVAR_ARCHIVE ); @@ -2655,7 +2667,8 @@ Cvar_Set( "cl_running", "1" ); CL_GenerateQKey(); - Cvar_Get("cl_guid", Com_MD5File(QKEY_FILE, 0), CVAR_USERINFO | CVAR_ROM); + Cvar_Get("cl_guid", Com_MD5File(QKEY_FILE, 0, NULL, 0), + CVAR_USERINFO | CVAR_ROM); Com_Printf( "----- Client Initialization Complete -----\n" ); }