diff --git a/code/game/g_client.c b/code/game/g_client.c index 575d2e04..0d812ed4 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; +static void ClientCleanName(const char *in, char *out, int outSize) +{ + int outpos = 0, colorlessLen = 0, spaces = 0; - //save room for trailing null byte - outSize--; + // discard leading spaces + for(; *in == ' '; in++); + + for(; *in && outpos < outSize - 1; in++) + { + out[outpos] = *in; - 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; - } - - // don't allow black in a name, period - if( ColorIndex(*in) == 0 ) { - 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 19db09ce..736d9e96 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"