mirror of https://github.com/DrBeef/ioq3quest.git
Fix netcode inconsistency, thanks to /dev/humancontroller for the patch, see http://bugzilla.icculus.org/show_bug.cgi?id=4060
This commit is contained in:
parent
e48b56559d
commit
186f30a74f
|
@ -863,7 +863,7 @@ void CL_WritePacket( void ) {
|
||||||
// also use the message acknowledge
|
// also use the message acknowledge
|
||||||
key ^= clc.serverMessageSequence;
|
key ^= clc.serverMessageSequence;
|
||||||
// also use the last acknowledged server command in the key
|
// also use the last acknowledged server command in the key
|
||||||
key ^= Com_HashKey(clc.serverCommands[ clc.serverCommandSequence & (MAX_RELIABLE_COMMANDS-1) ], 32);
|
key ^= MSG_HashKey(clc.serverCommands[ clc.serverCommandSequence & (MAX_RELIABLE_COMMANDS-1) ], 32);
|
||||||
|
|
||||||
// write all the commands, including the predicted command
|
// write all the commands, including the predicted command
|
||||||
for ( i = 0 ; i < count ; i++ ) {
|
for ( i = 0 ; i < count ; i++ ) {
|
||||||
|
|
|
@ -672,22 +672,6 @@ int Com_FilterPath(char *filter, char *name, int casesensitive)
|
||||||
return Com_Filter(new_filter, new_name, casesensitive);
|
return Com_Filter(new_filter, new_name, casesensitive);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
============
|
|
||||||
Com_HashKey
|
|
||||||
============
|
|
||||||
*/
|
|
||||||
int Com_HashKey(char *string, int maxlen) {
|
|
||||||
int register hash, i;
|
|
||||||
|
|
||||||
hash = 0;
|
|
||||||
for (i = 0; i < maxlen && string[i] != '\0'; i++) {
|
|
||||||
hash += string[i] * (119 + i);
|
|
||||||
}
|
|
||||||
hash = (hash ^ (hash >> 10) ^ (hash >> 20));
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
Com_RealTime
|
Com_RealTime
|
||||||
|
|
|
@ -311,9 +311,9 @@ void MSG_WriteString( msg_t *sb, const char *s ) {
|
||||||
}
|
}
|
||||||
Q_strncpyz( string, s, sizeof( string ) );
|
Q_strncpyz( string, s, sizeof( string ) );
|
||||||
|
|
||||||
// get rid of 0xff chars, because old clients don't like them
|
// get rid of 0x80+ and '%' chars, because old clients don't like them
|
||||||
for ( i = 0 ; i < l ; i++ ) {
|
for ( i = 0 ; i < l ; i++ ) {
|
||||||
if ( ((byte *)string)[i] > 127 ) {
|
if ( ((byte *)string)[i] > 127 || string[i] == '%' ) {
|
||||||
string[i] = '.';
|
string[i] = '.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -337,9 +337,9 @@ void MSG_WriteBigString( msg_t *sb, const char *s ) {
|
||||||
}
|
}
|
||||||
Q_strncpyz( string, s, sizeof( string ) );
|
Q_strncpyz( string, s, sizeof( string ) );
|
||||||
|
|
||||||
// get rid of 0xff chars, because old clients don't like them
|
// get rid of 0x80+ and '%' chars, because old clients don't like them
|
||||||
for ( i = 0 ; i < l ; i++ ) {
|
for ( i = 0 ; i < l ; i++ ) {
|
||||||
if ( ((byte *)string)[i] > 127 ) {
|
if ( ((byte *)string)[i] > 127 || string[i] == '%' ) {
|
||||||
string[i] = '.';
|
string[i] = '.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -525,6 +525,21 @@ void MSG_ReadData( msg_t *msg, void *data, int len ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// a string hasher which gives the same hash value even if the
|
||||||
|
// string is later modified via the legacy MSG read/write code
|
||||||
|
int MSG_HashKey(const char *string, int maxlen) {
|
||||||
|
int hash, i;
|
||||||
|
|
||||||
|
hash = 0;
|
||||||
|
for (i = 0; i < maxlen && string[i] != '\0'; i++) {
|
||||||
|
if (string[i] & 0x80 || string[i] == '%')
|
||||||
|
hash += '.' * (119 + i);
|
||||||
|
else
|
||||||
|
hash += string[i] * (119 + i);
|
||||||
|
}
|
||||||
|
hash = (hash ^ (hash >> 10) ^ (hash >> 20));
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
|
|
@ -76,6 +76,7 @@ void MSG_WriteFloat (msg_t *sb, float f);
|
||||||
void MSG_WriteString (msg_t *sb, const char *s);
|
void MSG_WriteString (msg_t *sb, const char *s);
|
||||||
void MSG_WriteBigString (msg_t *sb, const char *s);
|
void MSG_WriteBigString (msg_t *sb, const char *s);
|
||||||
void MSG_WriteAngle16 (msg_t *sb, float f);
|
void MSG_WriteAngle16 (msg_t *sb, float f);
|
||||||
|
int MSG_HashKey(const char *string, int maxlen);
|
||||||
|
|
||||||
void MSG_BeginReading (msg_t *sb);
|
void MSG_BeginReading (msg_t *sb);
|
||||||
void MSG_BeginReadingOOB(msg_t *sb);
|
void MSG_BeginReadingOOB(msg_t *sb);
|
||||||
|
@ -799,7 +800,6 @@ void Com_Quit_f( void );
|
||||||
int Com_Milliseconds( void ); // will be journaled properly
|
int Com_Milliseconds( void ); // will be journaled properly
|
||||||
unsigned Com_BlockChecksum( const void *buffer, int length );
|
unsigned Com_BlockChecksum( const void *buffer, int length );
|
||||||
char *Com_MD5File(const char *filename, int length, const char *prefix, int prefix_len);
|
char *Com_MD5File(const char *filename, int length, const char *prefix, int prefix_len);
|
||||||
int Com_HashKey(char *string, int maxlen);
|
|
||||||
int Com_Filter(char *filter, char *name, int casesensitive);
|
int Com_Filter(char *filter, char *name, int casesensitive);
|
||||||
int Com_FilterPath(char *filter, char *name, int casesensitive);
|
int Com_FilterPath(char *filter, char *name, int casesensitive);
|
||||||
int Com_RealTime(qtime_t *qtime);
|
int Com_RealTime(qtime_t *qtime);
|
||||||
|
|
|
@ -1605,7 +1605,7 @@ static void SV_UserMove( client_t *cl, msg_t *msg, qboolean delta ) {
|
||||||
// also use the message acknowledge
|
// also use the message acknowledge
|
||||||
key ^= cl->messageAcknowledge;
|
key ^= cl->messageAcknowledge;
|
||||||
// also use the last acknowledged server command in the key
|
// also use the last acknowledged server command in the key
|
||||||
key ^= Com_HashKey(cl->reliableCommands[ cl->reliableAcknowledge & (MAX_RELIABLE_COMMANDS-1) ], 32);
|
key ^= MSG_HashKey(cl->reliableCommands[ cl->reliableAcknowledge & (MAX_RELIABLE_COMMANDS-1) ], 32);
|
||||||
|
|
||||||
Com_Memset( &nullcmd, 0, sizeof(nullcmd) );
|
Com_Memset( &nullcmd, 0, sizeof(nullcmd) );
|
||||||
oldcmd = &nullcmd;
|
oldcmd = &nullcmd;
|
||||||
|
|
Loading…
Reference in New Issue