/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo )
{
  clientSession_t  *sess;
  const char      *value;

  sess = &client->sess;

  // initial team determination
  value = Info_ValueForKey( userinfo, "team" );
  if( value[ 0 ] == 's' )
  {
    // a willing spectator, not a waiting-in-line
    sess->sessionTeam = TEAM_SPECTATOR;
  }
  else
  {
    if( g_maxGameClients.integer > 0 &&
      level.numNonSpectatorClients >= g_maxGameClients.integer )
      sess->sessionTeam = TEAM_SPECTATOR;
    else
      sess->sessionTeam = TEAM_FREE;
  }

  sess->restartTeam = PTE_NONE;
  sess->spectatorState = SPECTATOR_FREE;
  sess->spectatorTime = level.time;
  sess->spectatorClient = -1;

  memset( &sess->ignoreList, 0, sizeof( sess->ignoreList ) );

  G_WriteClientSessionData( client );
}
/*
==================
G_WriteSessionData

==================
 */
void G_WriteSessionData(void) {
  char map[ MAX_STRING_CHARS ];
  int i;
  //int record = 0;
  int gameid = 0;
  
  char data[ 255 ];

  trap_Cvar_VariableStringBuffer("mapname", map, sizeof ( map));
  //TA: ?
  trap_Cvar_Set("session", va("%i", 0));
  
  
  if(g_survival.integer && level.survivalRecordsBroke[0] > 0 && level.survivalRecordTime > 0 && !level.mysqlupdated)
  {
    if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO games (map,time) VALUES (\"%s\",\"%d\")",
      map, level.survivalRecordTime)) == qtrue)
      {
        trap_mysql_finishquery();
        if(trap_mysql_runquery("SELECT id FROM games ORDER BY id desc LIMIT 1") == qtrue)
        {
          if(trap_mysql_fetchrow() == qtrue)
          {
            trap_mysql_fetchfieldbyName("id", data, sizeof(data));
            gameid = atoi(data);
          }
        }
      }
      trap_mysql_finishquery();
  }
  
  //trap_SendServerCommand( -1, va("print \"^5Game id: %d\n\"",gameid) );

  for (i = 0; i < level.maxclients; i++) {
    if (level.clients[ i ].pers.connected == CON_CONNECTED)
      G_WriteClientSessionData(&level.clients[ i ]);
      if(!g_survival.integer) continue;
      if(level.clients[i].pers.mysqlid > 0 && gameid > 0 && !level.mysqlupdated)
      {
        if(trap_mysql_runquery(va("UPDATE players set lasttime=NOW() WHERE id = \"%d\" LIMIT 1",
          level.clients[i].pers.mysqlid)) == qtrue)
        {
         // trap_SendServerCommand( -1, va("print \"^5Update player date %d\n\"",gameid) );
          trap_mysql_finishquery();
        }
        if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO players_game (idgame,idplayer,timealive) VALUES (%d,%d,%d)",
        gameid, level.clients[i].pers.mysqlid, level.clients[i].pers.lastdeadtime)) == qtrue)
        {
          //trap_SendServerCommand( -1, va("print \"^5Insert players_game relation %d\n\"",gameid) );
          trap_mysql_finishquery();
        }
      }
  }
  
  if(g_survival.integer && level.survivalRecordTime > 0 && !level.mysqlupdated)
  {
    trap_SendServerCommand( -1, "print \"^5Records stored on the server.\n\"" );
  }
  level.mysqlupdated = 1;
}
示例#3
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData(gclient_t *client) {
	clientSession_t *sess;

	sess = &client->sess;

	// initial team determination
	sess->sessionTeam = TEAM_SPECTATOR;

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime  = level.time;

	// DHM - Nerve
	sess->latchPlayerType    = sess->playerType = 0;
	sess->latchPlayerWeapon  = sess->playerWeapon = 0;
	sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0;

	sess->spawnObjectiveIndex = 0;
	// dhm - end

	memset(sess->ignoreClients, 0, sizeof (sess->ignoreClients));
	sess->muted = qfalse;

	// OSP
	sess->referee   = (client->pers.localClient) ? RL_REFEREE : RL_NONE;
	sess->spec_team = 0;
	// OSP

	// Nico, init GeoIP
	client->sess.countryCode = 0;

	G_WriteClientSessionData(client, qfalse);
}
示例#4
0
/*
==================
G_WriteSessionData
==================
*/
void G_WriteSessionData(qboolean restart)
{
    int  i;
    char strServerInfo[MAX_INFO_STRING];
    int  j;

    trap_GetServerinfo(strServerInfo, sizeof(strServerInfo));
    trap_Cvar_Set("session", va("%i %i %s", g_gametype.integer,
                                (teamInfo[TEAM_AXIS].spec_lock * TEAM_AXIS | teamInfo[TEAM_ALLIES].spec_lock * TEAM_ALLIES),
                                Info_ValueForKey(strServerInfo, "mapname")));

    // Keep stats for all players in sync
    for (i = 0; !level.fResetStats && i < level.numConnectedClients; i++)
    {
        if ((g_gamestate.integer == GS_WARMUP_COUNTDOWN &&
             ((g_gametype.integer == GT_WOLF_STOPWATCH && level.clients[level.sortedClients[i]].sess.rounds >= 2) ||
              (g_gametype.integer != GT_WOLF_STOPWATCH && level.clients[level.sortedClients[i]].sess.rounds >= 1))))
        {
            level.fResetStats = qtrue;
		}
	}

    for (i = 0; i < level.numConnectedClients; i++)
    {
        if (level.clients[level.sortedClients[i]].pers.connected == CON_CONNECTED)
        {
            G_WriteClientSessionData(&level.clients[level.sortedClients[i]], restart);
            // For slow connecters and a short warmup
		}
        else if (level.fResetStats)
        {
            G_deleteStats(level.sortedClients[i]);
		}
	}

    for (i = 0; i < MAX_FIRETEAMS; i++)
    {
        char buffer[MAX_STRING_CHARS];

        if (!level.fireTeams[i].inuse)
        {
            Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\-1");
		}
        else
        {
            char buffer2[MAX_STRING_CHARS];
            char p[8];

            *buffer2 = '\0';
            for (j = 0; j < MAX_CLIENTS; j++)
            {
                Com_sprintf(p, 8, " %i", level.fireTeams[i].joinOrder[j]);
                Q_strcat(buffer2, MAX_STRING_CHARS, p);
			}
            Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\%i\\i\\%s\\p\\%i", level.fireTeams[i].ident - 1, buffer2, level.fireTeams[i].priv ? 1 : 0);
		}

        trap_Cvar_Set(va("fireteam%i", i), buffer);
	}
}
示例#5
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;
//	const char		*value;

	sess = &client->sess;

	// initial team determination
	sess->sessionTeam = TEAM_SPECTATOR;	

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	// DHM - Nerve
	sess->latchPlayerType = sess->playerType = 0;
	sess->latchPlayerWeapon = sess->playerWeapon = 0;
	sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0;

	sess->spawnObjectiveIndex = 0;
	// dhm - end

	memset( sess->ignoreClients, 0, sizeof(sess->ignoreClients) );
//	sess->experience = 0;
	sess->auto_unmute_time = 0;
	memset( sess->skill, 0, sizeof(sess->skill) );
	memset( sess->skillpoints, 0, sizeof(sess->skillpoints) );
	// CHRUKER: b017 - startskillpoints didn't get reset
	memset( sess->startskillpoints, 0, sizeof(sess->startskillpoints) );
	memset( sess->medals, 0, sizeof(sess->medals) );
	sess->rank = 0;
	// CHRUKER: b017 - startxptotal didn't get reset
	sess->startxptotal = 0;


	// OSP
	sess->coach_team = 0;
	sess->referee = (client->pers.localClient) ? RL_REFEREE : RL_NONE;
	sess->spec_invite = 0;
	sess->spec_team = 0;
	G_deleteStats(client - level.clients);
	// OSP
	
	// josh:
	sess->overall_killrating = 0.0f;
	sess->overall_killvariance = SIGMA2_DELTA;
	//  rating = player rating now
	sess->rating = 0.0;
	sess->rating_variance = SIGMA2_THETA;

	sess->uci = 0;//mcwf GeoIP
	sess->need_greeting = qtrue; // redeye - moved greeting message to ClientBegin
	
	// quad - shoutcaster & ettv
	sess->ettv = ( atoi( Info_ValueForKey( userinfo, "protocol" ) ) == 284 );
	// pheno: grant shoutcaster status to ettv slave
	sess->shoutcaster = ( sess->ettv &&
		( g_ettvFlags.integer & ETTV_SHOUTCASTER ) );

	G_WriteClientSessionData( client, qfalse );
}
示例#6
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;

	sess = &client->sess;

	sess->sessionTeam = TEAM_FREE;

	G_WriteClientSessionData( client );
}
示例#7
0
/*
==================
G_WriteSessionData
 
==================
*/
void G_WriteSessionData( void )
{
    unsigned int i;

    Cvar_Set( "session", va("%i", g_gametype->integer) );

    for ( i = 0 ; i < level.maxclients ; i++ )
        if ( level.clients[i].pers.connected == CON_CONNECTED )
            G_WriteClientSessionData( &level.clients[i] );
}
示例#8
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;
	const char		*value;

	sess = &client->sess;

	// initial team determination
	if ( g_gametype.integer >= GT_TEAM ) {
		if ( g_teamAutoJoin.integer && !(g_entities[ client - level.clients ].r.svFlags & SVF_BOT) ) {
			sess->sessionTeam = PickTeam( -1 );
			BroadcastTeamChange( client, -1 );
		} else {
			// always spawn as spectator in team games
			sess->sessionTeam = TEAM_SPECTATOR;	
		}
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( g_gametype.integer ) {
			default:
			case GT_FFA:
			case GT_SINGLE_PLAYER:
				if ( g_maxGameClients.integer > 0 && 
					level.numNonSpectatorClients >= g_maxGameClients.integer ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_TOURNAMENT:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	AddTournamentQueue(client);

	if (crandom() > 0)
		client->sess.weapon = WP_RAILGUN;
	else
		client->sess.weapon = WP_ROCKET_LAUNCHER;

	G_WriteClientSessionData( client );
}
示例#9
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData( void ) {
	int		i;

	trap_Cvar_Set( "session", va("%i", g_gametype.integer) );

	for ( i = 0 ; i < level.maxclients ; i++ ) {
		if ( level.clients[i].pers.connected == CON_CONNECTED ) {
			G_WriteClientSessionData( &level.clients[i] );
		}
	}
}
示例#10
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData( void ) {
	int		i;

	gi.cvar_set( "session", 0) ;

	for ( i = 0 ; i < level.maxclients ; i++ ) {
		if ( level.clients[i].pers.connected == CON_CONNECTED ) {
			G_WriteClientSessionData( &level.clients[i] );
		}
	}
}
示例#11
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t *sess;
	const char      *value;

	sess = &client->sess;

	// initial team determination
	if ( g_gametype.integer >= GT_TEAM ) {
		// always spawn as spectator in team games
		sess->sessionTeam = TEAM_SPECTATOR;
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( g_gametype.integer ) {
			default:
			case GT_FFA:
			case GT_SINGLE_PLAYER:
				if ( g_maxGameClients.integer > 0 &&
					 level.numNonSpectatorClients >= g_maxGameClients.integer ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_TOURNAMENT:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	// DHM - Nerve
	sess->latchPlayerType = sess->playerType = 0;
	sess->latchPlayerWeapon = sess->playerWeapon = 0;
	sess->latchPlayerItem = sess->playerItem = 0;
	sess->latchPlayerSkin = sess->playerSkin = 0;

	sess->spawnObjectiveIndex = 0;
	// dhm - end

	G_WriteClientSessionData( client );
}
示例#12
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData() 
{
	Cvar_Set( "session", va("%i", g_gametype.integer) );

	for( int i = 1 ; i <= theLevel.maxclients_ ; i++ )
	{
		GameClient* cl = theLevel.getClient(i);
		if( cl && cl->pers_.connected_ == GameClient::ClientPersistant::CON_CONNECTED ) 
		{
			G_WriteClientSessionData( cl );
		}
	}
}
示例#13
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData( void )
{
  int    i;

  //TA: ?
  trap_Cvar_Set( "session", va( "%i", 0 ) );

  for( i = 0 ; i < level.maxclients ; i++ )
  {
    if( level.clients[ i ].pers.connected == CON_CONNECTED )
      G_WriteClientSessionData( &level.clients[ i ] );
  }
}
示例#14
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;
	const char		*value;

	sess = &client->sess;

	// initial team determination
	if ( g_gametype.integer >= GT_TEAM ) {
		if ( g_teamAutoJoin.integer ) {
			sess->sessionTeam = PickTeam( -1 );
			BroadcastTeamChange( client, -1 );
		} else {
			// always spawn as spectator in team games
			sess->sessionTeam = TEAM_SPECTATOR;	
		}
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( g_gametype.integer ) {
			default:
			case GT_FFA:
			case GT_SINGLE_PLAYER:
				if ( g_maxGameClients.integer > 0 && 
					level.numNonSpectatorClients >= g_maxGameClients.integer ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_TOURNAMENT:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	G_WriteClientSessionData( client );
}
示例#15
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData( void ) {
	int		i;

	trap_Cvar_Set( "session", va("%i", g_gametype.integer) );

	for ( i = 0 ; i < level.maxclients ; i++ ) {
		if ( level.clients[i].pers.connected == CON_CONNECTED ) {
			G_WriteClientSessionData( &level.clients[i] );
		}
	}
	//trap_Cvar_Set( "sessionNPC", va("%i", g_gametype.integer) );
//	for ( i = 0 ; i < 15; i++ ) {
//		if ( npcTypesArray[i].NPCTypes[0] )
	//		G_WriteNPCSessionData();
//	}
}
示例#16
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;
//	const char		*value;

	sess = &client->sess;

	// initial team determination
	sess->sessionTeam = TEAM_SPECTATOR;	

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	// DHM - Nerve
	sess->latchPlayerType = sess->playerType = 0;
	sess->latchPlayerWeapon = sess->playerWeapon = 0;
	sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0;

	sess->spawnObjectiveIndex = 0;
	// dhm - end

	memset( sess->ignoreClients, 0, sizeof(sess->ignoreClients) );
//	sess->experience = 0;
	sess->muted = qfalse;
	memset( sess->skill, 0, sizeof(sess->skill) );
	memset( sess->skillpoints, 0, sizeof(sess->skillpoints) );

	// sta acqu-sdk (issue 2): CHRUKER: b017 - startskillpoints didn't get reset
	memset( sess->startskillpoints, 0, sizeof(sess->startskillpoints) );
	// end acqu-sdk (issue 2): CHRUKER: b017

	memset( sess->medals, 0, sizeof(sess->medals) );
	sess->rank = 0;

	// sta acqu-sdk (issue 2): CHRUKER: b017 - startxptotal didn't get reset
	sess->startxptotal = 0;
	// end acqu-sdk (issue 2): CHRUKER: b017

	// OSP
	sess->coach_team = 0;
	sess->referee = (client->pers.localClient) ? RL_REFEREE : RL_NONE;
	sess->spec_invite = 0;
	sess->spec_team = 0;
	G_deleteStats(client - level.clients);
	// OSP

	G_WriteClientSessionData( client, qfalse );
}
示例#17
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo ) 
{
	clientSession_t	*sess;
	const char		*value;

	sess = &client->sess;

	// initial team determination
	if ( level.gametypeData->teams ) 
	{
		if ( g_teamAutoJoin.integer ) 
		{
			sess->team = PickTeam( -1 );
			BroadcastTeamChange( client, -1 );
		} 
		else 
		{
			// always spawn as spectator in team games
			sess->team = TEAM_SPECTATOR;	
		}
	} 
	else 
	{
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) 
		{
			// a willing spectator, not a waiting-in-line
			sess->team = TEAM_SPECTATOR;
		} 
		else 
		{
			if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) 
			{
				sess->team = TEAM_SPECTATOR;
			} 
			else 
			{
				sess->team = TEAM_FREE;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	G_WriteClientSessionData( client );
}
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData( void )
{
  int    i;

  //TA: ?
  trap_Cvar_Set( "session", va( "%i", 0 ) );

  for( i = 0 ; i < level.maxclients ; i++ )
  {
    if( level.clients[ i ].pers.connected == CON_CONNECTED )
      G_WriteClientSessionData( &level.clients[ i ] );
  }

  // write values for sv_maxclients and sv_democlients because they invalidate session data
  trap_Cvar_Set( "session", va( "%i %i",
                 trap_Cvar_VariableIntegerValue( "sv_maxclients" ),
                 trap_Cvar_VariableIntegerValue( "sv_democlients" ) ) );
}
示例#19
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData( void ) {
	int		i;
	fileHandle_t tmpfile;

	trap_Cvar_Set( "session", va("%i", g_gametype.integer) );

	for ( i = 0 ; i < level.maxclients ; i++ ) {
		if ( level.clients[i].pers.connected == CON_CONNECTED ) {
			G_WriteClientSessionData( &level.clients[i] );
		}
	}
	//save2file
	//PLS2DO!!!!
	trap_FS_FOpenFile( "sess.dat", &tmpfile, FS_WRITE );
	trap_FS_Write( g_sess, g_maxclients.integer * sizeof( clientSession_t ), tmpfile );
	trap_FS_FCloseFile( tmpfile );
	//plskthx
	//free( g_sess );
}
示例#20
0
void G_WriteSessionData( void ) {
	int i;
	fileHandle_t f;
	const gclient_t *client = NULL;
	cJSON *root = cJSON_CreateObject();

	cJSON_AddIntegerToObject( root, "gametype", level.gametype );

	trap->Print( "G_WriteSessionData: writing %s...", metaFileName );
	trap->FS_Open( metaFileName, &f, FS_WRITE );

	Q_FSWriteJSON( root, f );

	for ( i = 0, client = level.clients; i < level.maxclients; i++, client++ ) {
		if ( client->pers.connected == CON_CONNECTED ) {
			G_WriteClientSessionData( client );
		}
	}

	trap->Print( "done\n" );
}
示例#21
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData(gclient_t *client, char *userinfo)
{
    clientSession_t *sess = &client->sess;

    // initial team determination
    sess->sessionTeam = TEAM_SPECTATOR;

    sess->spectatorState = SPECTATOR_FREE;
    sess->spectatorTime = level.time;

    sess->latchPlayerType = sess->playerType = 0;
    sess->latchPlayerWeapon = sess->playerWeapon = 0;
    sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0;

    sess->spawnObjectiveIndex = 0;

    memset(sess->ignoreClients, 0, sizeof(sess->ignoreClients));

    sess->muted = qfalse;
    memset(sess->skill, 0, sizeof(sess->skill));
    memset(sess->skillpoints, 0, sizeof(sess->skillpoints));
    memset(sess->startskillpoints, 0, sizeof(sess->startskillpoints));
    memset(sess->medals, 0, sizeof(sess->medals));
    sess->rank = 0;
    sess->startxptotal = 0;

    sess->coach_team = 0;
    // we set ref in ClientUserinfoChanged
    sess->referee = RL_NONE; // (client->pers.localClient) ? RL_REFEREE : RL_NONE;
    sess->spec_invite = 0;
    sess->spec_team = 0;
    // G_WriteClientSessionData calls this
    //G_deleteStats(client - level.clients);

    sess->uci = 0; // GeoIP

    G_WriteClientSessionData(client, qfalse);
}
示例#22
0
/*
==================
G_WriteSessionData

==================
*/
void G_WriteSessionData(qboolean restart) {
	int  i;
	char strServerInfo[MAX_INFO_STRING];
	int  j;

	trap_GetServerinfo(strServerInfo, sizeof (strServerInfo));

	trap_Cvar_Set("session", va("%s",
	                            Info_ValueForKey(strServerInfo, "mapname")));

	for (i = 0; i < level.numConnectedClients; ++i) {
		if (level.clients[level.sortedClients[i]].pers.connected == CON_CONNECTED) {
			G_WriteClientSessionData(&level.clients[level.sortedClients[i]], restart);
			// For slow connecters and a short warmup
		}
	}

	for (i = 0; i < MAX_FIRETEAMS; ++i) {
		char buffer[MAX_STRING_CHARS];
		if (!level.fireTeams[i].inuse) {
			Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\-1");
		} else {
			char buffer2[MAX_STRING_CHARS];

			*buffer2 = '\0';
			for (j = 0; j < MAX_CLIENTS; ++j) {
				char p[8];
				Com_sprintf(p, 8, " %i", level.fireTeams[i].joinOrder[j]);
				Q_strcat(buffer2, MAX_STRING_CHARS, p);
			}
			Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\%i\\i\\%s\\p\\%i", level.fireTeams[i].ident - 1, buffer2, level.fireTeams[i].priv ? 1 : 0);
		}

		trap_Cvar_Set(va("fireteam%i", i), buffer);
	}
}
示例#23
0
void G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;
	const char		*value;

	sess = &client->sess;

	value = Info_ValueForKey( userinfo, "team" );
	if ( value[0] == 's' ) {
		// a willing spectator, not a waiting-in-line
		sess->sessionTeam = TEAM_SPECTATOR;
	} else {
		switch ( g_gametype.integer ) {
		default:
		case GT_FFA:
			sess->sessionTeam = TEAM_FREE;
			break;
		case GT_SINGLE_PLAYER:
			sess->sessionTeam = TEAM_FREE;
			break;
		case GT_TOURNAMENT:
			// if the game is full, go into a waiting mode
			if ( level.numNonSpectatorClients >= 2 ) {
				sess->sessionTeam = TEAM_SPECTATOR;
			} else {
				sess->sessionTeam = TEAM_FREE;
			}
			break;
		}
	}

	sess->sessionClass = 0; //PC_NOCLASS; //TiM: Default Class
	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	G_WriteClientSessionData( client );
}
示例#24
0
// Called on a first-time connect
void G_InitClientSessionData( gclient_t *client, char *userinfo, qboolean isBot ) {
	clientSession_t	*sess = &client->sess;
	const char		*value;

	client->sess.siegeDesiredTeam = TEAM_FREE;

	// initial team determination
	if ( level.gametype >= GT_TEAM ) {
		if ( g_teamAutoJoin.integer && !(g_entities[client-level.clients].r.svFlags & SVF_BOT) ) {
			sess->sessionTeam = PickTeam( -1 );
			client->ps.fd.forceDoInit = 1; //every time we change teams make sure our force powers are set right
		} else {
			// always spawn as spectator in team games
			if (!isBot)
			{
				sess->sessionTeam = TEAM_SPECTATOR;	
			}
			else
			{ //Bots choose their team on creation
				value = Info_ValueForKey( userinfo, "team" );
				if (value[0] == 'r' || value[0] == 'R')
				{
					sess->sessionTeam = TEAM_RED;
				}
				else if (value[0] == 'b' || value[0] == 'B')
				{
					sess->sessionTeam = TEAM_BLUE;
				}
				else
				{
					sess->sessionTeam = PickTeam( -1 );
				}
				client->ps.fd.forceDoInit = 1; //every time we change teams make sure our force powers are set right
			}
		}
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( level.gametype ) {
			default:
			case GT_FFA:
			case GT_SINGLE_PLAYER:
				if ( g_maxGameClients.integer > 0 && 
					level.numNonSpectatorClients >= g_maxGameClients.integer ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_DUEL:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_POWERDUEL:
				//sess->duelTeam = DUELTEAM_LONE; //default
				{
					int loners = 0;
					int doubles = 0;

					G_PowerDuelCount(&loners, &doubles, qtrue);

					if (!doubles || loners > (doubles/2))
					{
						sess->duelTeam = DUELTEAM_DOUBLE;
					}
					else
					{
						sess->duelTeam = DUELTEAM_LONE;
					}
				}
				sess->sessionTeam = TEAM_SPECTATOR;
				break;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	AddTournamentQueue(client);

	G_WriteClientSessionData( client );
}
示例#25
0
/*
==================
G_WriteSessionData

==================
 */
void G_WriteSessionData(void) {
  char map[ MAX_STRING_CHARS ];
  int i;
  //int record = 0;
  int gameid = 0;
	int j;
	
  char data[ 255 ];

  trap_Cvar_VariableStringBuffer("mapname", map, sizeof ( map));
  //TA: ?
  trap_Cvar_Set("session", va("%i", 0));
  
	trap_SendServerCommand( -1, "print \"^2Syncing with database\n\"" );
	for( i = 0 ; i < level.maxclients ; i++ )
	{
		if( level.clients[ i ].pers.connected == CON_CONNECTED )
		{
			G_WriteClientSessionData( &level.clients[ i ] );
			//Update mysql stuff here to.
			if(level.clients[ i ].pers.mysqlid > 1)
			{
				//level.clients[ i ].pers.playerlevel = G_EvalPlayerLevel( (level.clients[ i ].pers.statscounters.kills + level.clients[ i ].pers.totalkills), (level.clients[ i ].pers.statscounters.deaths + level.clients[ i ].pers.totaldeaths));
				if (!level.clients[ i ].pers.playerlevel)
					level.clients[ i ].pers.playerlevel= 0;
				level.clients[ i ].pers.timeplayed += (level.time - level.clients[ i ].pers.enterTime) / 60000; //Minutes played
				level.clients[ i ].pers.structsbuilt += level.clients[ i ].pers.statscounters.structsbuilt;
				//level.clients[ i ].pers.structskilled += level.clients[ i ].pers.statscounters.structskilled; don't count anything but nodes
				if(level.clients[ i ].pers.teamSelection == PTE_HUMANS)
				{
					level.clients[ i ].pers.credits+=level.clients[ i ].ps.persistant[ PERS_CREDIT ];
				}
				if(level.clients[ i ].pers.teamSelection == PTE_ALIENS)
				{
					level.clients[ i ].pers.evos = 0;
				}
				
				/* Badge related stuff */
				if(level.clients[ i ].pers.teamSelection == level.lastWin)
				{
					level.clients[ i ].pers.gameswin += 1;
				}
				/************************IF MAZE for BADGES************************************/
				//16 Zombie Bait		Die 200 times
				if ( (level.clients[ i ].pers.badges[ 16 ] != 1) && ((level.clients[ i ].pers.totaldeaths + level.clients[ i ].pers.statscounters.deaths) >= 200) )
				{
					level.clients[ i ].pers.badgeupdate[16] = 1;
					level.clients[ i ].pers.badges[16] = 1;
				}
				//17 Champion			Win 500 games	
				if ( (level.clients[ i ].pers.badges[ 17 ] != 1) && (level.clients[ i ].pers.gameswin >= 500) )
				{
					level.clients[ i ].pers.badgeupdate[17] = 1;
					level.clients[ i ].pers.badges[17] = 1;
				}
				//19 Axe Me a Question			Only get axe kills for an entire round	
				if ( (level.clients[ i ].pers.badges[ 19 ] != 1) && (level.clients[ i ].pers.statscounters.kills > 0) && (level.clients[ i ].pers.statscounters.kills == level.clients[ i ].pers.axekills) )
				{
					level.clients[ i ].pers.badgeupdate[19] = 1;
					level.clients[ i ].pers.badges[19] = 1;
				}
				//26 Eradication			Kill 200 zombie nodes	
				if ( (level.clients[ i ].pers.badges[ 26 ] != 1) && (level.clients[ i ].pers.structskilled >= 200) )
				{
					level.clients[ i ].pers.badgeupdate[26] = 1;
					level.clients[ i ].pers.badges[26] = 1;
				}
				//30 Wingman			Get 200 assists in one round	
				if ( (level.clients[ i ].pers.badges[ 30 ] != 1) && (level.clients[ i ].pers.statscounters.assists >= 200) )
				{
					level.clients[ i ].pers.badgeupdate[30] = 1;
					level.clients[ i ].pers.badges[30] = 1;
				}
				//31 Humanitarian		Make it the first 10 minutes in a survival round without killing a single zombie	
				if ( (level.clients[ i ].pers.badges[ 31 ] != 1) && (level.time >= 600000) && (level.clients[ i ].pers.statscounters.kills = 0))
				{
					level.clients[ i ].pers.badgeupdate[31] = 1;
					level.clients[ i ].pers.badges[31] = 1;
				}
				//38 Flawless			Make it an entire round without being hurt, and get at least 20 kills (so we know you aren't just hanging around base. =])
				if ((level.clients[ i ].pers.badges[ 38 ] != 1) && (level.clients[ i ].pers.statscounters.kills >= 20) && !level.clients[ i ].pers.lastDamaged) {
					level.clients[ i ].pers.badgeupdate[38] = 1;
					level.clients[ i ].pers.badges[38] = 1;
				}
				/*************************************************************/
				//Would be better if i runquery just one time instead of one per client.
				if( trap_mysql_runquery( va("UPDATE zplayers SET kills=\"%d\",deaths=\"%d\",pistolkills=\"%d\",timeplayed=\"%d\",adminlevel=\"%d\",playerlevel=\"%d\",lasttime=NOW(),gameswin=\"%d\",structsbuilt=\"%d\",structskilled=\"%d\" WHERE id=\"%d\" LIMIT 1",(level.clients[ i ].pers.statscounters.kills + level.clients[ i ].pers.totalkills), (level.clients[ i ].pers.statscounters.deaths + level.clients[ i ].pers.totaldeaths), level.clients[ i ].pers.pistolkills, level.clients[ i ].pers.timeplayed, level.clients[ i ].pers.adminlevel, level.clients[ i ].pers.playerlevel, level.clients[ i ].pers.gameswin, level.clients[ i ].pers.structsbuilt, level.clients[ i ].pers.structskilled, level.clients[ i ].pers.mysqlid ) ) == qtrue )
				{
					trap_mysql_finishquery();
					//Lets update the badges. //FIX ME: WTF LOL DOUBLE LOOPED UNECESARY
					for(j=1;j<49;j++)
					{
						if(level.clients[ i ].pers.badgeupdate[j] == 1)
						{
							if(trap_mysql_runquery( va("INSERT HIGH_PRIORITY INTO zbadges_player (idplayer,idbadge) VALUES (\"%d\",\"%d\")", level.clients[ i ].pers.mysqlid, j ) ) == qtrue)
							{
								trap_mysql_finishquery();
							}
							else
							{
								trap_mysql_finishquery();
							}
						}
					}
				}
				else
				{
					trap_mysql_finishquery();
				}
			}
		}
	}
	trap_SendServerCommand( -1, "print \"^5Data updated\n\"" );
	
  
  if(g_survival.integer && level.survivalRecordsBroke[0] > 0 && level.survivalRecordTime > 0 && !level.mysqlupdated)
  {
    if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO zgames (map,time) VALUES (\"%s\",\"%d\")",
      map, level.survivalRecordTime)) == qtrue)
      {
        trap_mysql_finishquery();
        if(trap_mysql_runquery("SELECT id FROM zgames ORDER BY id desc LIMIT 1") == qtrue)
        {
          if(trap_mysql_fetchrow() == qtrue)
          {
            trap_mysql_fetchfieldbyName("id", data, sizeof(data));
            gameid = atoi(data);
          }
        }
      }
      trap_mysql_finishquery();
  }
  
  //trap_SendServerCommand( -1, va("print \"^5Game id: %d\n\"",gameid) );

  for (i = 0; i < level.maxclients; i++) {
    if (level.clients[ i ].pers.connected == CON_CONNECTED)
      G_WriteClientSessionData(&level.clients[ i ]);
      if(!g_survival.integer) continue;
      if(level.clients[i].pers.mysqlid > 0 && gameid > 0 && !level.mysqlupdated)
      {
        if(trap_mysql_runquery(va("UPDATE zplayers set lasttime=NOW() WHERE id = \"%d\" LIMIT 1",
          level.clients[i].pers.mysqlid)) == qtrue)
        {
         // trap_SendServerCommand( -1, va("print \"^5Update player date %d\n\"",gameid) );
          trap_mysql_finishquery();
        }
        if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO zplayers_game (idgame,idplayer,timealive) VALUES (%d,%d,%d)",
        gameid, level.clients[i].pers.mysqlid, level.clients[i].pers.lastdeadtime)) == qtrue)
        {
          //trap_SendServerCommand( -1, va("print \"^5Insert players_game relation %d\n\"",gameid) );
          trap_mysql_finishquery();
        }
      }
  }
  
  if(g_survival.integer && level.survivalRecordTime > 0 && !level.mysqlupdated)
  {
    trap_SendServerCommand( -1, "print \"^5Records stored on the server.\n\"" );
  }
  level.mysqlupdated = 1;
}
示例#26
0
文件: g_session.c 项目: videoP/jaPRO
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) {
	clientSession_t	*sess;
	const char		*value;

	sess = &client->sess;

	client->sess.siegeDesiredTeam = TEAM_FREE;

	// initial team determination
	if ( level.gametype >= GT_TEAM ) {
		if ( g_teamAutoJoin.integer && !(g_entities[client-level.clients].r.svFlags & SVF_BOT) ) {
			sess->sessionTeam = PickTeam( -1 );
			BroadcastTeamChange( client, -1 );
		} else {
			// always spawn as spectator in team games
			if (!isBot)
			{
				sess->sessionTeam = TEAM_SPECTATOR;	
			}
			else
			{ //Bots choose their team on creation
				value = Info_ValueForKey( userinfo, "team" );
				if (value[0] == 'r' || value[0] == 'R')
				{
					sess->sessionTeam = TEAM_RED;
				}
				else if (value[0] == 'b' || value[0] == 'B')
				{
					sess->sessionTeam = TEAM_BLUE;
				}
				else
				{
					sess->sessionTeam = PickTeam( -1 );
				}
				BroadcastTeamChange( client, -1 );
			}
		}
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( level.gametype ) {
			default:
			case GT_FFA:
			case GT_HOLOCRON:
			case GT_JEDIMASTER:
			case GT_SINGLE_PLAYER:
				if (!isBot && (!g_maxGameClients.integer || (g_maxGameClients.integer > 0 && //loda fixme - this should fix clients showing ingame when they really arnt , when first connect?
					level.numNonSpectatorClients >= g_maxGameClients.integer))) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_DUEL:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_POWERDUEL:
				//sess->duelTeam = DUELTEAM_LONE; //default
				{
					int loners = 0;
					int doubles = 0;

					G_PowerDuelCount(&loners, &doubles, qtrue);

					if (!doubles || loners > (doubles/2))
					{
						sess->duelTeam = DUELTEAM_DOUBLE;
					}
					else
					{
						sess->duelTeam = DUELTEAM_LONE;
					}
				}
				sess->sessionTeam = TEAM_SPECTATOR;
				break;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	AddTournamentQueue(client);

	sess->siegeClass[0] = 0;

	sess->ignore = 0;//[JAPRO - Serverside - All - Ignore]

	G_WriteClientSessionData( client );
}
示例#27
0
/** LQ3A: Changed return from void to qboolean.
	This function initilises the session data and assigns a team to the client,
	if we cannot assign a team it returns qfalse and the client should be dropped from the server.
	@see ClientConnect(). */
qboolean G_InitSessionData( gclient_t *client, char *userinfo ) {
	clientSession_t	*sess;
	/* LQ3A */
//	const char	*value;
	qboolean	bCanClientSpectate;
	int			iVacantPlayerSlots;

	/* LQ3A */
	UNREFERENCED_PARAMETER(userinfo);

	sess = &client->sess;

	/* LQ3A */
	bCanClientSpectate	= LQ3A_CanClientSpectate(LQ3A_ClientToEntity(client));
	iVacantPlayerSlots	= LQ3A_GetVacantPlayerSlots();

	// initial team determination
	if (g_gametype.integer >= GT_TEAM)
	{
		/* LQ3A: Added support for g_maxGameClients in team games.
			Force auto join when the client cannot spectate. */
		if (iVacantPlayerSlots && (g_teamAutoJoin.integer || !bCanClientSpectate))
		{
			sess->sessionTeam = PickTeam( -1 );
			BroadcastTeamChange( client, -1 );
		}
		else if (bCanClientSpectate)
		{
			sess->sessionTeam = TEAM_SPECTATOR;	
		}
		else
		{
			/* No vacant player slots and we cannot spectate. */
			return qfalse;
		}

	} else {

		/* LQ3A: Place clients into spectator mode by default where possible. */
		if (bCanClientSpectate)
		{
			sess->sessionTeam = TEAM_SPECTATOR;
		}
		/* If we cannot spectate, place the client in the game when there are vacant slots. */
		else if (iVacantPlayerSlots)
		{
			sess->sessionTeam = TEAM_FREE;
		}
		else
		{
			/* No vacant player slots and we cannot spectate. */
			return qfalse;
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	/* LQ3A */
	if (sess->sessionTeam == TEAM_SPECTATOR)
	{
		LQ3A_CompleteClientMoveToSpectatorTeam(LQ3A_ClientToEntity(client));
	}

	G_WriteClientSessionData( client );

	/* LQ3A */
	return qtrue;
}
示例#28
0
/*
===========
ClientBegin

called when a client has finished connecting, and is ready
to be placed into the level.  This will happen every level load,
and on transition between teams, but doesn't happen on respawns
============
*/
void ClientBegin( int clientNum, qboolean allowTeamReset ) {
	gentity_t	*ent;
	gclient_t	*client;
	gentity_t	*tent;
	int			flags, i;
	char		userinfo[MAX_INFO_VALUE], *modelname;

	ent = g_entities + clientNum;

	if ((ent->r.svFlags & SVF_BOT) && g_gametype.integer >= GT_TEAM)
	{
		if (allowTeamReset)
		{
			const char *team = "Red";
			int preSess;

			//SetTeam(ent, "");
			ent->client->sess.sessionTeam = PickTeam(-1);
			trap_GetUserinfo(clientNum, userinfo, MAX_INFO_STRING);

			if (ent->client->sess.sessionTeam == TEAM_SPECTATOR)
			{
				ent->client->sess.sessionTeam = TEAM_RED;
			}

			if (ent->client->sess.sessionTeam == TEAM_RED)
			{
				team = "Red";
			}
			else
			{
				team = "Blue";
			}

			Info_SetValueForKey( userinfo, "team", team );

			trap_SetUserinfo( clientNum, userinfo );

			ent->client->ps.persistant[ PERS_TEAM ] = ent->client->sess.sessionTeam;

			preSess = ent->client->sess.sessionTeam;
			G_ReadSessionData( ent->client );
			ent->client->sess.sessionTeam = preSess;
			G_WriteClientSessionData(ent->client);
			ClientUserinfoChanged( clientNum );
			ClientBegin(clientNum, qfalse);
			return;
		}
	}

	client = level.clients + clientNum;

	if ( ent->r.linked ) {
		trap_UnlinkEntity( ent );
	}
	G_InitGentity( ent );
	ent->touch = 0;
	ent->pain = 0;
	ent->client = client;

	client->pers.connected = CON_CONNECTED;
	client->pers.enterTime = level.time;
	client->pers.teamState.state = TEAM_BEGIN;

	// save eflags around this, because changing teams will
	// cause this to happen with a valid entity, and we
	// want to make sure the teleport bit is set right
	// so the viewpoint doesn't interpolate through the
	// world to the new position
	flags = client->ps.eFlags;

	i = 0;

	while (i < NUM_FORCE_POWERS)
	{
		if (ent->client->ps.fd.forcePowersActive & (1 << i))
		{
			WP_ForcePowerStop(ent, i);
		}
		i++;
	}

	i = TRACK_CHANNEL_1;

	while (i < NUM_TRACK_CHANNELS)
	{
		if (ent->client->ps.fd.killSoundEntIndex[i-50] && ent->client->ps.fd.killSoundEntIndex[i-50] < MAX_GENTITIES && ent->client->ps.fd.killSoundEntIndex[i-50] > 0)
		{
			G_MuteSound(ent->client->ps.fd.killSoundEntIndex[i-50], CHAN_VOICE);
		}
		i++;
	}
	i = 0;

	memset( &client->ps, 0, sizeof( client->ps ) );
	client->ps.eFlags = flags;

	client->ps.hasDetPackPlanted = qfalse;

	//first-time force power initialization
	WP_InitForcePowers( ent );

	//init saber ent
	WP_SaberInitBladeData( ent );

	// First time model setup for that player.
	trap_GetUserinfo( clientNum, userinfo, sizeof(userinfo) );
	modelname = Info_ValueForKey (userinfo, "model");
	SetupGameGhoul2Model(client, modelname);

	if (ent->client->ghoul2)
	{
		ent->bolt_Head = trap_G2API_AddBolt(ent->client->ghoul2, 0, "cranium");
		ent->bolt_Waist = trap_G2API_AddBolt(ent->client->ghoul2, 0, "thoracic");
		ent->bolt_LArm = trap_G2API_AddBolt(ent->client->ghoul2, 0, "lradius");
		ent->bolt_RArm = trap_G2API_AddBolt(ent->client->ghoul2, 0, "rradius");
		ent->bolt_LLeg = trap_G2API_AddBolt(ent->client->ghoul2, 0, "ltibia");
		ent->bolt_RLeg = trap_G2API_AddBolt(ent->client->ghoul2, 0, "rtibia");
		ent->bolt_Motion = trap_G2API_AddBolt(ent->client->ghoul2, 0, "Motion");
	}

	// locate ent at a spawn point
	ClientSpawn( ent );

	if ( client->sess.sessionTeam != TEAM_SPECTATOR ) {
		// send event
		tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_IN );
		tent->s.clientNum = ent->s.clientNum;

		if ( g_gametype.integer != GT_TOURNAMENT  ) {
			trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " %s\n\"", client->pers.netname, G_GetStripEdString("SVINGAME", "PLENTER")) );
		}
	}
	G_LogPrintf( "ClientBegin: %i\n", clientNum );

	// count current clients and rank for scoreboard
	CalculateRanks();

	G_ClearClientLog(clientNum);
}
示例#29
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) {
	clientSession_t	*sess;
	const char		*value;
	int				clientNum;

	sess = &client->sess;
	clientNum = client - level.clients;

	// initial team determination
	if ( GT_Team(g_gametype.integer) ) {
		if ( g_teamAutoJoin.integer ) {
			sess->sessionTeam = PickTeam( -1 );
		} else {
			// always spawn as spectator in team games
			if (!isBot)
			{
				sess->sessionTeam = TEAM_SPECTATOR;
			}
			else
			{ //Bots choose their team on creation
				value = Info_ValueForKey( userinfo, "team" );
				if (value[0] == 'r' || value[0] == 'R')
				{
					sess->sessionTeam = ValidateTeam( -1, TEAM_RED ) ?
						TEAM_RED : TEAM_SPECTATOR;
				}
				else if (value[0] == 'b' || value[0] == 'B')
				{
					sess->sessionTeam = ValidateTeam( -1, TEAM_BLUE ) ?
						TEAM_BLUE : TEAM_SPECTATOR;
				}
				else
				{
					sess->sessionTeam = PickTeam( -1 );
				}
			}
		}
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( g_gametype.integer ) {
			default:
			case GT_FFA:
			case GT_HOLOCRON:
			case GT_JEDIMASTER:
			case GT_SINGLE_PLAYER:
				sess->sessionTeam = ValidateTeam( clientNum, TEAM_FREE ) ?
					TEAM_FREE : TEAM_SPECTATOR;
				break;
			case GT_TOURNAMENT:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			}
		}
	}

	if ( sess->sessionTeam == TEAM_SPECTATOR )
		sess->spectatorState = SPECTATOR_FREE;
	else if ( level.round > 0 && g_gametype.integer != GT_REDROVER )
		sess->spectatorState = SPECTATOR_FREE;
	else
		sess->spectatorState = SPECTATOR_NOT;

	sess->spectatorTime = level.time;

	G_WriteClientSessionData( client );
}
示例#30
0
/*
================
G_InitSessionData

Called on a first-time connect
================
*/
void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) {
	clientSession_t	*sess;
	const char		*value;

	sess = &client->sess;

	client->sess.siegeDesiredTeam = TEAM_FREE;

	// initial team determination
	if ( g_gametype.integer >= GT_TEAM ) {
		if ( g_teamAutoJoin.integer ) {
			sess->sessionTeam = PickTeam( -1 );
			BroadcastTeamChange( client, -1 );
		} else {
			// always spawn as spectator in team games
			if (!isBot)
			{
				sess->sessionTeam = TEAM_SPECTATOR;	
			}
			else
			{ //Bots choose their team on creation
				value = Info_ValueForKey( userinfo, "team" );
				if (value[0] == 'r' || value[0] == 'R')
				{
					sess->sessionTeam = TEAM_RED;
				}
				else if (value[0] == 'b' || value[0] == 'B')
				{
					sess->sessionTeam = TEAM_BLUE;
				}
				else
				{
					sess->sessionTeam = PickTeam( -1 );
				}
				BroadcastTeamChange( client, -1 );
			}
		}
	} else {
		value = Info_ValueForKey( userinfo, "team" );
		if ( value[0] == 's' ) {
			// a willing spectator, not a waiting-in-line
			sess->sessionTeam = TEAM_SPECTATOR;
		} else {
			switch ( g_gametype.integer ) {
			default:
			case GT_FFA:
			case GT_HOLOCRON:
			case GT_JEDIMASTER:
			case GT_SINGLE_PLAYER:
				if ( g_maxGameClients.integer > 0 && 
					level.numNonSpectatorClients >= g_maxGameClients.integer ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_DUEL:
				// if the game is full, go into a waiting mode
				if ( level.numNonSpectatorClients >= 2 ) {
					sess->sessionTeam = TEAM_SPECTATOR;
				} else {
					sess->sessionTeam = TEAM_FREE;
				}
				break;
			case GT_POWERDUEL:
				//sess->duelTeam = DUELTEAM_LONE; //default
				{
					int loners = 0;
					int doubles = 0;

					G_PowerDuelCount(&loners, &doubles, qtrue);

					if (!doubles || loners > (doubles/2))
					{
						sess->duelTeam = DUELTEAM_DOUBLE;
					}
					else
					{
						sess->duelTeam = DUELTEAM_LONE;
					}
				}
				sess->sessionTeam = TEAM_SPECTATOR;
				break;
			}
		}
	}

	sess->spectatorState = SPECTATOR_FREE;
	sess->spectatorTime = level.time;

	sess->siegeClass[0] = 0;
	sess->saberType[0] = 0;
	sess->saber2Type[0] = 0;

	G_WriteClientSessionData( client );
}