aboutsummaryrefslogtreecommitdiffstats
path: root/code/qcommon/msg.c
diff options
context:
space:
mode:
authorthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2009-10-12 17:17:15 +0000
committerthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2009-10-12 17:17:15 +0000
commitbcb1609aa7ad9f6b19df8b512ddd2c74e294d020 (patch)
tree13f0b273c0aad4401cd802d2dd2e7f2381d23a8d /code/qcommon/msg.c
parent209b588ef5ae91b35ddd8a2b792b2b4abe97669c (diff)
downloadioquake3-aero-bcb1609aa7ad9f6b19df8b512ddd2c74e294d020.tar.gz
ioquake3-aero-bcb1609aa7ad9f6b19df8b512ddd2c74e294d020.zip
Fix netcode inconsistency, thanks to /dev/humancontroller for the patch, see http://bugzilla.icculus.org/show_bug.cgi?id=4060
git-svn-id: svn://svn.icculus.org/quake3/trunk@1661 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/qcommon/msg.c')
-rw-r--r--code/qcommon/msg.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/code/qcommon/msg.c b/code/qcommon/msg.c
index b883c83..04fb424 100644
--- a/code/qcommon/msg.c
+++ b/code/qcommon/msg.c
@@ -311,9 +311,9 @@ void MSG_WriteString( msg_t *sb, const char *s ) {
}
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++ ) {
- if ( ((byte *)string)[i] > 127 ) {
+ if ( ((byte *)string)[i] > 127 || string[i] == '%' ) {
string[i] = '.';
}
}
@@ -337,9 +337,9 @@ void MSG_WriteBigString( msg_t *sb, const char *s ) {
}
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++ ) {
- if ( ((byte *)string)[i] > 127 ) {
+ if ( ((byte *)string)[i] > 127 || 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;
+}
/*
=============================================================================