From 23d60561d515769296808cb60df1f681e901a9cb Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Tue, 12 Mar 2013 18:02:22 +0000 Subject: Drop team info if it's for the wrong team's players. This avoids apparently spurious 'bad client number' messages, caused by the difference in item counts between humans and aliens. Suspected cause is a race between client and server; the effect can (at least in Unvanquished) be observed as spectator when switching between players on opposing teams. --- src/cgame/cg_servercmds.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c index 035b8c56..e955e8ab 100644 --- a/src/cgame/cg_servercmds.c +++ b/src/cgame/cg_servercmds.c @@ -81,32 +81,31 @@ static void CG_ParseTeamInfo( void ) int i; int count; int client; - int fields; - if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) - fields = 4; // aliens don't have upgrades - else - fields = 5; + count = trap_Argc( ); - count = ( trap_Argc( ) - 1 ) / fields; + for( i = 1; i < count; i++ ) // i is also incremented when writing into cgs.clientinfo + { + client = atoi( CG_Argv( i ) ); - cgs.teaminfoReceievedTime = cg.time; + // wrong team? drop the remaining info + if( cgs.clientinfo[ client ].team != cg.snap->ps.stats[ STAT_TEAM ] ) + return; - for( i = 0; i < count; i++ ) - { - client = atoi( CG_Argv( i * fields + 1 ) ); if( client < 0 || client >= MAX_CLIENTS ) { CG_Printf( "[skipnotify]CG_ParseTeamInfo: bad client number: %d\n", client ); return; } - cgs.clientinfo[ client ].location = atoi( CG_Argv( i * fields + 2 ) ); - cgs.clientinfo[ client ].health = atoi( CG_Argv( i * fields + 3 ) ); - cgs.clientinfo[ client ].curWeaponClass = atoi( CG_Argv( i * fields + 4 ) ); + cgs.clientinfo[ client ].location = atoi( CG_Argv( ++i ) ); + cgs.clientinfo[ client ].health = atoi( CG_Argv( ++i ) ); + cgs.clientinfo[ client ].curWeaponClass = atoi( CG_Argv( ++i ) ); if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) - cgs.clientinfo[ client ].upgrade = atoi( CG_Argv( i * fields + 5 ) ); + cgs.clientinfo[ client ].upgrade = atoi( CG_Argv( ++i ) ); } + + cgs.teaminfoReceievedTime = cg.time; } -- cgit