Index: src/game/g_local.h =================================================================== --- src/game/g_local.h (revision 2065) +++ src/game/g_local.h (working copy) @@ -655,6 +655,8 @@ typedef struct char layout[ MAX_QPATH ]; team_t surrenderTeam; + int lastTeamUnbalancedTime; + int numTeamWarnings; voice_t *voices; @@ -1118,6 +1120,7 @@ extern vmCvar_t g_alienCredits; extern vmCvar_t g_alienMaxStage; extern vmCvar_t g_alienStage2Threshold; extern vmCvar_t g_alienStage3Threshold; +extern vmCvar_t g_teamImbalanceWarnings; extern vmCvar_t g_freeFundPeriod; extern vmCvar_t g_unlagged; Index: src/game/g_main.c =================================================================== --- src/game/g_main.c (revision 2065) +++ src/game/g_main.c (working copy) @@ -91,6 +91,7 @@ vmCvar_t g_alienCredits; vmCvar_t g_alienMaxStage; vmCvar_t g_alienStage2Threshold; vmCvar_t g_alienStage3Threshold; +vmCvar_t g_teamImbalanceWarnings; vmCvar_t g_freeFundPeriod; vmCvar_t g_unlagged; Index: src/game/g_team.c =================================================================== --- src/game/g_team.c (revision 2065) +++ src/game/g_team.c (working copy) @@ -434,4 +434,31 @@ void CheckTeamStatus( void ) TeamplayInfoMessage( ent ); } } + + // Warn on unbalanced teams + if( g_teamImbalanceWarnings.integer && !level.intermissiontime && + ( level.time - level.lastTeamUnbalancedTime > + ( g_teamImbalanceWarnings.integer * 1000 ) ) && + level.numTeamWarnings < 3 ) + { + level.lastTeamUnbalancedTime = level.time; + if( level.numAlienSpawns > 0 && + level.numHumanClients - level.numAlienClients > 2 ) + { + trap_SendServerCommand( -1, "print \"Teams are unbalanced. " + "Humans have more players.\n\""); + level.numTeamWarnings++; + } + else if( level.numHumanSpawns > 0 && + level.numAlienClients - level.numHumanClients > 2 ) + { + trap_SendServerCommand ( -1, "print \"Teams are unbalanced. " + "Aliens have more players.\n\""); + level.numTeamWarnings++; + } + else + { + level.numTeamWarnings = 0; + } + } }