/*
=============
CheckTournament

Once a frame, check for changes in tournement player state
=============
*/
void CheckTournament( void ) {
	// check because we run 3 game frames before calling Connect and/or ClientBegin
	// for clients on a map_restart
	if ( level.numPlayingClients == 0 ) {
		return;
	}

	if ( g_gametype.integer == GT_TOURNAMENT ) {

		// pull in a spectator if needed
		if ( level.numPlayingClients < 2 ) {
			AddTournamentPlayer();
		}

		// if we don't have two players, go back to "waiting for players"
		if ( level.numPlayingClients != 2 ) {
			if ( level.warmupTime != -1 ) {
				level.warmupTime = -1;
				trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
				G_LogPrintf( "Warmup:\n" );
			}
			return;
		}

		if ( level.warmupTime == 0 ) {
			return;
		}

		// if the warmup is changed at the console, restart it
		if ( g_warmup.modificationCount != level.warmupModificationCount ) {
			level.warmupModificationCount = g_warmup.modificationCount;
			level.warmupTime = -1;
		}

		// if all players have arrived, start the countdown
		if ( level.warmupTime < 0 ) {
			if ( level.numPlayingClients == 2 ) {
				// fudge by -1 to account for extra delays
				if ( g_warmup.integer > 1 ) {
					level.warmupTime = level.time + ( g_warmup.integer - 1 ) * 1000;
				} else {
					level.warmupTime = 0;
				}

				trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
			}
			return;
		}

		// if the warmup time has counted down, restart
		if ( level.time > level.warmupTime ) {
			level.warmupTime += 10000;
			trap_Cvar_Set( "g_restarted", "1" );
			trap_SendConsoleCommand( EXEC_APPEND, "map_restart 0\n" );
			level.restarted = qtrue;
			return;
		}
	} else if ( g_gametype.integer != GT_SINGLE_PLAYER && level.warmupTime != 0 ) {
		int		counts[TEAM_NUM_TEAMS];
		qboolean	notEnough = qfalse;

		if ( g_gametype.integer > GT_TEAM ) {
			counts[TEAM_BLUE] = TeamCount( -1, TEAM_BLUE );
			counts[TEAM_RED] = TeamCount( -1, TEAM_RED );

			if (counts[TEAM_RED] < 1 || counts[TEAM_BLUE] < 1) {
				notEnough = qtrue;
			}
		} else if ( level.numPlayingClients < 2 ) {
			notEnough = qtrue;
		}

		if ( notEnough ) {
			if ( level.warmupTime != -1 ) {
				level.warmupTime = -1;
				trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
				G_LogPrintf( "Warmup:\n" );
			}
			return; // still waiting for team members
		}

		if ( level.warmupTime == 0 ) {
			return;
		}

		// if the warmup is changed at the console, restart it
		if ( g_warmup.modificationCount != level.warmupModificationCount ) {
			level.warmupModificationCount = g_warmup.modificationCount;
			level.warmupTime = -1;
		}

		// if all players have arrived, start the countdown
		if ( level.warmupTime < 0 ) {
			// fudge by -1 to account for extra delays
			if ( g_warmup.integer > 1 ) {
				level.warmupTime = level.time + ( g_warmup.integer - 1 ) * 1000;
			} else {
				level.warmupTime = 0;
			}

			trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
			return;
		}

		// if the warmup time has counted down, restart
		if ( level.time > level.warmupTime ) {
			level.warmupTime += 10000;
			trap_Cvar_Set( "g_restarted", "1" );
			trap_SendConsoleCommand( EXEC_APPEND, "map_restart 0\n" );
			level.restarted = qtrue;
			return;
		}
	}
}
예제 #2
0
파일: g_main.c 프로젝트: osfpsproject/MF2
/*
=============
CheckTournament

Once a frame, check for changes in tournement player state
=============
*/
void CheckTournament() 
{
	// check because we run 3 game frames before calling Connect and/or ClientBegin
	// for clients on a map_restart
	if( theLevel.numPlayingClients_ == 0 ) 
		return;

	if( g_gametype.integer == GT_TOURNAMENT ) 
	{
		// pull in a spectator if needed
		if( theLevel.numPlayingClients_ < 2 ) 
			AddTournamentPlayer();

		// if we don't have two players, go back to "waiting for players"
		if( theLevel.numPlayingClients_ != 2 )
		{
			if( theLevel.warmupTime_ != -1 ) 
			{
				theLevel.warmupTime_ = -1;
				SV_SetConfigstring( CS_WARMUP, va("%i", theLevel.warmupTime_) );
				G_LogPrintf( "Warmup:\n" );
			}
			return;
		}

		if( theLevel.warmupTime_ == 0 ) 
			return;

		// if the warmup is changed at the console, restart it
		if( g_warmup.modificationCount != theLevel.warmupModificationCount_ ) 
		{
			theLevel.warmupModificationCount_ = g_warmup.modificationCount;
			theLevel.warmupTime_ = -1;
		}

		// if all players have arrived, start the countdown
		if( theLevel.warmupTime_ < 0 ) 
		{
			if( theLevel.numPlayingClients_ == 2 ) 
			{
				// fudge by -1 to account for extra delays
				theLevel.warmupTime_ = theLevel.time_ + ( g_warmup.integer - 1 ) * 1000;
				SV_SetConfigstring( CS_WARMUP, va("%i", theLevel.warmupTime_) );
			}
			return;
		}

		// if the warmup time has counted down, restart
		if( theLevel.time_ > theLevel.warmupTime_ ) 
		{
			theLevel.warmupTime_ += 10000;
			Cvar_Set( "g_restarted", "1" );
			Cbuf_ExecuteText( EXEC_APPEND, "map_restart 0\n" );
			theLevel.restarted_ = true;
			return;
		}
	} 
	else if( g_gametype.integer != GT_SINGLE_PLAYER && g_gametype.integer != GT_MISSION_EDITOR &&
			 theLevel.warmupTime_ != 0 ) 
	{
		int	 counts[ClientBase::TEAM_NUM_TEAMS];
		bool notEnough = false;

		if( g_gametype.integer > GT_TEAM ) 
		{
			counts[ClientBase::TEAM_BLUE] = TeamCount( -1, ClientBase::TEAM_BLUE );
			counts[ClientBase::TEAM_RED] = TeamCount( -1, ClientBase::TEAM_RED );

			if (counts[ClientBase::TEAM_RED] < 1 || counts[ClientBase::TEAM_BLUE] < 1) 
				notEnough = true;
		}
		else if( theLevel.numPlayingClients_ < 2 ) 
			notEnough = true;

		if( notEnough ) 
		{
			if( theLevel.warmupTime_ != -1 ) 
			{
				theLevel.warmupTime_ = -1;
				SV_SetConfigstring( CS_WARMUP, va("%i", theLevel.warmupTime_) );
				G_LogPrintf( "Warmup:\n" );
			}
			return; // still waiting for team members
		}

		if( theLevel.warmupTime_ == 0 ) 
			return;

		// if the warmup is changed at the console, restart it
		if( g_warmup.modificationCount != theLevel.warmupModificationCount_ ) 
		{
			theLevel.warmupModificationCount_ = g_warmup.modificationCount;
			theLevel.warmupTime_ = -1;
		}

		// if all players have arrived, start the countdown
		if( theLevel.warmupTime_ < 0 ) 
		{
			// fudge by -1 to account for extra delays
			theLevel.warmupTime_ = theLevel.time_ + ( g_warmup.integer - 1 ) * 1000;
			SV_SetConfigstring( CS_WARMUP, va("%i", theLevel.warmupTime_) );
			return;
		}

		// if the warmup time has counted down, restart
		if( theLevel.time_ > theLevel.warmupTime_ ) 
		{
			theLevel.warmupTime_ += 10000;
			Cvar_Set( "g_restarted", "1" );
			Cbuf_ExecuteText( EXEC_APPEND, "map_restart 0\n" );
			theLevel.restarted_ = true;
			return;
		}
	}
}