aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--code/game/g_client.c112
-rw-r--r--code/qcommon/q_shared.h18
2 files changed, 52 insertions, 78 deletions
diff --git a/code/game/g_client.c b/code/game/g_client.c
index 575d2e0..0d812ed 100644
--- a/code/game/g_client.c
+++ b/code/game/g_client.c
@@ -607,85 +607,59 @@ static void ForceClientSkin( gclient_t *client, char *model, const char *skin )
ClientCheckName
============
*/
-static void ClientCleanName( const char *in, char *out, int outSize ) {
- int len, colorlessLen;
- char ch;
- char *p;
- int spaces;
-
- //save room for trailing null byte
- outSize--;
-
- len = 0;
- colorlessLen = 0;
- p = out;
- *p = 0;
- spaces = 0;
-
- while( 1 ) {
- ch = *in++;
- if( !ch ) {
- break;
- }
-
- // don't allow leading spaces
- if( colorlessLen == 0 && ch == ' ' ) {
- continue;
- }
-
- // check colors
- if( ch == Q_COLOR_ESCAPE ) {
- // solo trailing carat is not a color prefix
- if( !*in ) {
- break;
- }
+static void ClientCleanName(const char *in, char *out, int outSize)
+{
+ int outpos = 0, colorlessLen = 0, spaces = 0;
- // don't allow black in a name, period
- if( ColorIndex(*in) == 0 ) {
- in++;
+ // discard leading spaces
+ for(; *in == ' '; in++);
+
+ for(; *in && outpos < outSize - 1; in++)
+ {
+ out[outpos] = *in;
+
+ if(*in == ' ')
+ {
+ // don't allow too many consecutive spaces
+ if(spaces > 2)
continue;
- }
-
- // make sure room in dest for both chars
- if( len > outSize - 2 ) {
- break;
- }
-
- *out++ = ch;
- *out++ = *in++;
- len += 2;
- continue;
- }
-
- // don't allow too many consecutive spaces
- // don't count spaces in colorlessLen
- if( ch == ' ' ) {
+
spaces++;
- if( spaces > 3 ) {
- continue;
+ }
+ if(outpos > 0 && out[outpos - 1] == Q_COLOR_ESCAPE)
+ {
+ if(Q_IsColorString(&out[outpos - 1]))
+ {
+ colorlessLen--;
+
+ if(*in == COLOR_BLACK)
+ {
+ // Disallow color black in names to prevent players
+ // from getting advantage playing in front of black backgrounds
+ outpos--;
+ continue;
+ }
+ }
+ else
+ {
+ spaces = 0;
+ colorlessLen++;
}
- *out++ = ch;
- len++;
- continue;
}
- else {
+ else
+ {
spaces = 0;
+ colorlessLen++;
}
-
- if( len > outSize - 1 ) {
- break;
- }
-
- *out++ = ch;
- colorlessLen++;
- len++;
+
+ outpos++;
}
- *out = 0;
+
+ out[outpos] = '\0';
// don't allow empty names
- if( *p == 0 || colorlessLen == 0 ) {
- Q_strncpyz( p, "UnnamedPlayer", outSize );
- }
+ if( *out == '\0' || colorlessLen == 0)
+ Q_strncpyz(out, "UnnamedPlayer", outSize );
}
diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h
index 19db09c..736d9e9 100644
--- a/code/qcommon/q_shared.h
+++ b/code/qcommon/q_shared.h
@@ -365,20 +365,20 @@ extern vec4_t colorMdGrey;
extern vec4_t colorDkGrey;
#define Q_COLOR_ESCAPE '^'
-#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && isalnum(*((p)+1)) ) // ^[0-9a-zA-Z]
+#define Q_IsColorString(p) ((p) && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) >= '0' && *((p)+1) <= '7') // ^[0-9a-zA-Z]
-#define COLOR_BLACK '0'
-#define COLOR_RED '1'
-#define COLOR_GREEN '2'
+#define COLOR_BLACK '0'
+#define COLOR_RED '1'
+#define COLOR_GREEN '2'
#define COLOR_YELLOW '3'
-#define COLOR_BLUE '4'
-#define COLOR_CYAN '5'
+#define COLOR_BLUE '4'
+#define COLOR_CYAN '5'
#define COLOR_MAGENTA '6'
-#define COLOR_WHITE '7'
-#define ColorIndex(c) ( ( (c) - '0' ) & 7 )
+#define COLOR_WHITE '7'
+#define ColorIndex(c) ((c) - '0')
#define S_COLOR_BLACK "^0"
-#define S_COLOR_RED "^1"
+#define S_COLOR_RED "^1"
#define S_COLOR_GREEN "^2"
#define S_COLOR_YELLOW "^3"
#define S_COLOR_BLUE "^4"