本文整理汇总了C++中PickTeam函数的典型用法代码示例。如果您正苦于以下问题:C++ PickTeam函数的具体用法?C++ PickTeam怎么用?C++ PickTeam使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PickTeam函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: G_InitSessionData
/*
================
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 );
}
示例2: G_InitSessionData
/*
================
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 );
}
示例3: G_InitSessionData
/*
================
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 );
}
示例4: ClientConnect
/** 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;
}
示例5: ClientUserinfoChanged
//.........这里部分代码省略.........
health = atoi( Info_ValueForKey( userinfo, "handicap" ) );
client->pers.maxHealth = health;
if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) {
client->pers.maxHealth = 100;
}
}
#else
health = atoi( Info_ValueForKey( userinfo, "handicap" ) );
client->pers.maxHealth = health;
if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) {
client->pers.maxHealth = 100;
}
#endif
client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth;
// set model
if( g_gametype.integer >= GT_TEAM ) {
Q_strncpyz( model, Info_ValueForKey (userinfo, "team_model"), sizeof( model ) );
Q_strncpyz( headModel, Info_ValueForKey (userinfo, "team_headmodel"), sizeof( headModel ) );
} else {
Q_strncpyz( model, Info_ValueForKey (userinfo, "model"), sizeof( model ) );
Q_strncpyz( headModel, Info_ValueForKey (userinfo, "headmodel"), sizeof( headModel ) );
}
// bots set their team a few frames later
if (g_gametype.integer >= GT_TEAM && g_entities[clientNum].r.svFlags & SVF_BOT) {
s = Info_ValueForKey( userinfo, "team" );
if ( !Q_stricmp( s, "red" ) || !Q_stricmp( s, "r" ) ) {
team = TEAM_RED;
} else if ( !Q_stricmp( s, "blue" ) || !Q_stricmp( s, "b" ) ) {
team = TEAM_BLUE;
} else {
// pick the team with the least number of players
team = PickTeam( clientNum );
}
}
else {
team = client->sess.sessionTeam;
}
/* NOTE: all client side now
// team
switch( team ) {
case TEAM_RED:
ForceClientSkin(client, model, "red");
// ForceClientSkin(client, headModel, "red");
break;
case TEAM_BLUE:
ForceClientSkin(client, model, "blue");
// ForceClientSkin(client, headModel, "blue");
break;
}
// don't ever use a default skin in teamplay, it would just waste memory
// however bots will always join a team but they spawn in as spectator
if ( g_gametype.integer >= GT_TEAM && team == TEAM_SPECTATOR) {
ForceClientSkin(client, model, "red");
// ForceClientSkin(client, headModel, "red");
}
*/
#ifdef MISSIONPACK
if (g_gametype.integer >= GT_TEAM) {
client->pers.teamInfo = qtrue;
} else {
s = Info_ValueForKey( userinfo, "teamoverlay" );
示例6: SetTeam
/* LQ3A: Added bBroadcast parameter to allow the calling function to suppress the change. */
void SetTeam( gentity_t *ent, char *s, qboolean bBroadcast) {
/* LQ3A */
team_t team, oldTeam;
gclient_t *client;
int clientNum;
spectatorState_t specState;
int specClient;
int teamLeader;
//
// see what change is requested
//
client = ent->client;
clientNum = client - level.clients;
specClient = 0;
specState = SPECTATOR_NOT;
if ( !Q_stricmp( s, "scoreboard" ) || !Q_stricmp( s, "score" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_SCOREBOARD;
} else if ( !Q_stricmp( s, "follow1" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_FOLLOW;
specClient = -1;
} else if ( !Q_stricmp( s, "follow2" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_FOLLOW;
specClient = -2;
} else if ( !Q_stricmp( s, "spectator" ) || !Q_stricmp( s, "s" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_FREE;
} else if ( g_gametype.integer >= GT_TEAM ) {
// if running a team game, assign player to one of the teams
specState = SPECTATOR_NOT;
if ( !Q_stricmp( s, "red" ) || !Q_stricmp( s, "r" ) ) {
team = TEAM_RED;
} else if ( !Q_stricmp( s, "blue" ) || !Q_stricmp( s, "b" ) ) {
team = TEAM_BLUE;
} else {
// pick the team with the least number of players
team = PickTeam( clientNum );
}
if ( g_teamForceBalance.integer ) {
int counts[TEAM_NUM_TEAMS];
counts[TEAM_BLUE] = TeamCount( ent->client->ps.clientNum, TEAM_BLUE );
counts[TEAM_RED] = TeamCount( ent->client->ps.clientNum, TEAM_RED );
// We allow a spread of two
if ( team == TEAM_RED && counts[TEAM_RED] - counts[TEAM_BLUE] > 1 ) {
trap_SendServerCommand( ent->client->ps.clientNum,
"cp \"Red team has too many players.\n\"" );
return; // ignore the request
}
if ( team == TEAM_BLUE && counts[TEAM_BLUE] - counts[TEAM_RED] > 1 ) {
trap_SendServerCommand( ent->client->ps.clientNum,
"cp \"Blue team has too many players.\n\"" );
return; // ignore the request
}
// It's ok, the team we are switching to has less or same number of players
}
} else {
// force them to spectators if there aren't any spots free
/* LQ3A */
team = ((client->sess.sessionTeam == TEAM_FREE) ||
((client->sess.sessionTeam != TEAM_FREE) && LQ3A_GetVacantPlayerSlots())) ? TEAM_FREE : TEAM_SPECTATOR;
}
// override decision if limiting the players
if ( (g_gametype.integer == GT_TOURNAMENT)
&& level.numNonSpectatorClients >= 2 ) {
team = TEAM_SPECTATOR;
} else if ( g_maxGameClients.integer > 0 &&
level.numNonSpectatorClients > g_maxGameClients.integer ) {
team = TEAM_SPECTATOR;
}
//
// decide if we will allow the change
//
oldTeam = client->sess.sessionTeam;
/* LQ3A */
if ( team == oldTeam /*&& team != TEAM_SPECTATOR*/ ) {
return;
}
/* LQ3A: Ensure we're allowed to spectate. */
if ((team == TEAM_SPECTATOR) && !LQ3A_CanClientSpectate(ent))
{
return;
}
//
// execute the team change
//
//.........这里部分代码省略.........
示例7: G_AddBot
//.........这里部分代码省略.........
s = "none";
}
Info_SetValueForKey( userinfo, key, s );
//[/RGBSabers]
//[ClientPlugInDetect]
//set it so that the bots are assumed to have the OJP client plugin
//this should be CURRENT_OJPENHANCED_CLIENTVERSION
Info_SetValueForKey( userinfo, "ojp_clientplugin", CURRENT_OJPENHANCED_CLIENTVERSION );
//[/ClientPlugInDetect]
// have the server allocate a client slot
clientNum = trap_BotAllocateClient();
if ( clientNum == -1 ) {
// G_Printf( S_COLOR_RED "Unable to add bot. All player slots are in use.\n" );
// G_Printf( S_COLOR_RED "Start server with more 'open' slots.\n" );
trap_SendServerCommand( -1, va("print \"%s\n\"", G_GetStringEdString("MP_SVGAME", "UNABLE_TO_ADD_BOT")));
return;
}
//[DuelGuns][EnhancedImpliment]
/*
if(bot_dualguns)
{
g_entities[clientNum].client->ps.dualguns = 1;
}
*/
//[/DuelGuns][EnhancedImpliment]
// initialize the bot settings
if( !team || !*team ) {
if( g_gametype.integer >= GT_TEAM ) {
//[AdminSys]
if( PickTeam(clientNum, qtrue) == TEAM_RED) {
//if( PickTeam(clientNum) == TEAM_RED) {
//[/AdminSys]
team = "red";
}
else {
team = "blue";
}
}
else {
team = "red";
}
}
// Info_SetValueForKey( userinfo, "characterfile", Info_ValueForKey( botinfo, "aifile" ) );
Info_SetValueForKey( userinfo, "skill", va( "%5.2f", skill ) );
Info_SetValueForKey( userinfo, "team", team );
//[TABBot]
Info_SetValueForKey( userinfo, "bottype", va( "%i", bottype) );
//[/TABBot]
bot = &g_entities[ clientNum ];
bot->r.svFlags |= SVF_BOT;
bot->inuse = qtrue;
// register the userinfo
trap_SetUserinfo( clientNum, userinfo );
//[NewGameTypes][EnhancedImpliment]
//if (g_gametype.integer >= GT_TEAM && g_gametype.integer != GT_RPG)
if (g_gametype.integer >= GT_TEAM)
//[/NewGameTypes][EnhancedImpliment]
{
if (team && Q_stricmp(team, "red") == 0)
示例8: ClientUserinfoChanged
/**
Called from ClientConnect when the player first connects and
directly by the server system when the player updates a userinfo variable.
The game can override any of the settings and call trap_SetUserinfo
if desired.
*/
void ClientUserinfoChanged(int clientNum)
{
gentity_t *ent;
int teamTask, teamLeader, team, health;
char *s;
char oldname[MAX_STRING_CHARS];
gclient_t *client;
char userinfo[MAX_INFO_STRING];
char *nameError;
ent = g_entities + clientNum;
client = ent->client;
trap_GetUserinfo(clientNum, userinfo, sizeof(userinfo));
// check for malformed or illegal info strings
if (!Info_Validate(userinfo)) {
strcpy (userinfo, "\\name\\badinfo");
// don't keep those clients and userinfo
trap_DropClient(clientNum, "Invalid userinfo");
}
// check for local client
s = Info_ValueForKey(userinfo, "ip");
if (!strcmp(s, "localhost")) {
client->pers.localClient = qtrue;
}
// check the item prediction
s = Info_ValueForKey(userinfo, "cg_predictItems");
if (!atoi(s)) {
client->pers.predictItemPickup = qfalse;
} else {
client->pers.predictItemPickup = qtrue;
}
// set name
Q_strncpyz(oldname, client->pers.netname, sizeof(oldname));
s = Info_ValueForKey(userinfo, "name");
nameError = ClientCleanName(s, client->pers.netname, sizeof client->pers.netname);
if (client->pers.connected == CON_CONNECTED && strcmp(oldname, s)) {
if (client->pers.muted) {
ClientPrint(ent, "You cannot change your name while you are muted.");
} else if (nameError) {
ClientPrint(ent, "%s", nameError);
} else {
G_LogPrintf("%s ^7renamed to %s\n", oldname, client->pers.netname);
}
if (nameError || client->pers.muted) {
Q_strncpyz(client->pers.netname, oldname, sizeof client->pers.netname);
}
}
if (client->sess.sessionTeam == TEAM_SPECTATOR) {
if (client->sess.spectatorState == SPECTATOR_SCOREBOARD) {
Q_strncpyz(client->pers.netname, "scoreboard", sizeof(client->pers.netname));
}
}
// set max health
health = atoi(Info_ValueForKey(userinfo, "handicap"));
client->pers.maxHealth = health;
if (client->pers.maxHealth < 1 || client->pers.maxHealth > 100) {
client->pers.maxHealth = 100;
}
client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth;
// bots set their team a few frames later
if (g_gametype.integer >= GT_TEAM && g_entities[clientNum].r.svFlags & SVF_BOT) {
s = Info_ValueForKey(userinfo, "team");
if (!Q_stricmp(s, "red") || !Q_stricmp(s, "r")) {
team = TEAM_RED;
} else if (!Q_stricmp(s, "blue") || !Q_stricmp(s, "b")) {
team = TEAM_BLUE;
} else {
// pick the team with the least number of players
team = PickTeam(clientNum);
}
}
else {
team = client->sess.sessionTeam;
}
// team task (0 = none, 1 = offence, 2 = defence)
teamTask = atoi(Info_ValueForKey(userinfo, "teamtask"));
// team Leader (1 = leader, 0 is normal player)
teamLeader = client->sess.teamLeader;
// send over a subset of the userinfo keys so other clients can
// print scoreboards, display models, and play custom sounds
if (ent->r.svFlags & SVF_BOT) {
//.........这里部分代码省略.........
示例9: G_AddBot
//.........这里部分代码省略.........
if ( color ) {
if ( strrchr( model, '/' ) ) {
// model is a skin already, append colorname to skin
// fatpad/fatty _red
model = va( "%s_%s", model, color );
}
else {
// model is a "basemodel", append skin
// fatpad /red
model = va( "%s/%s", model, color );
}
}
}
}
Info_SetValueForKey( userinfo, key, model );
key = "team_model";
Info_SetValueForKey( userinfo, key, model );
key = "headmodel";
headmodel = Info_ValueForKey( botinfo, key );
if ( !*headmodel ) {
headmodel = model;
}
Info_SetValueForKey( userinfo, key, headmodel );
key = "team_headmodel";
Info_SetValueForKey( userinfo, key, headmodel );
key = "gender";
s = Info_ValueForKey( botinfo, key );
if ( !*s ) {
s = "male";
}
Info_SetValueForKey( userinfo, "sex", s );
key = "color1";
s = Info_ValueForKey( botinfo, key );
if ( !*s ) {
s = "4";
}
Info_SetValueForKey( userinfo, key, s );
key = "color2";
s = Info_ValueForKey( botinfo, key );
if ( !*s ) {
s = "5";
}
Info_SetValueForKey( userinfo, key, s );
s = Info_ValueForKey(botinfo, "aifile");
if (!*s ) {
trap_Printf( S_COLOR_RED "Error: bot has no aifile specified\n" );
return;
}
// have the server allocate a client slot
clientNum = trap_BotAllocateClient();
if ( clientNum == -1 ) {
G_Printf( S_COLOR_RED "Unable to add bot. All player slots are in use.\n" );
G_Printf( S_COLOR_RED "Start server with more 'open' slots (or check setting of sv_maxclients cvar).\n" );
return;
}
// initialize the bot settings
if( !team || !*team ) {
if( g_gametype.integer >= GT_TEAM ) {
if( PickTeam(clientNum) == TEAM_RED) {
team = "red";
}
else {
team = "blue";
}
}
else {
team = "red";
}
}
Info_SetValueForKey( userinfo, "characterfile", Info_ValueForKey( botinfo, "aifile" ) );
Info_SetValueForKey( userinfo, "skill", va( "%5.2f", skill ) );
Info_SetValueForKey( userinfo, "team", team );
bot = &g_entities[ clientNum ];
bot->r.svFlags |= SVF_BOT;
bot->inuse = qtrue;
// register the userinfo
trap_SetUserinfo( clientNum, userinfo );
// have it connect to the game as a normal client
if ( ClientConnect( clientNum, qtrue, qtrue ) ) {
return;
}
if( delay == 0 ) {
ClientBegin( clientNum );
return;
}
AddBotToSpawnQueue( clientNum, delay );
}
示例10: G_SpawnBot
//.........这里部分代码省略.........
if (!Q_stricmp( params[j].cmd, cmd )) {
// found a match, if this field already has an entry, then randomly override it
if (!params[j].count || (!params[j].appendParams && ((rand()%(++params[j].count)) == 0))) {
Q_strncpyz( params[j].string, string, sizeof(string) );
} else if (params[j].appendParams) {
// append this token
Q_strcat( params[j].string, sizeof(string), va(" %s", string) );
}
params[j].count++;
break;
}
}
if (!params[j].cmd) {
G_Printf( "G_SpawnBot: unknown parameter: %s\nFor usage info, use \"spawnbot /?\"\n", cmd );
return;
}
//
Q_strncpyz( last_cmd, cmd, sizeof(last_cmd) );
Q_strncpyz( cmd, cmd_var, sizeof(cmd) );
}
//
if (strlen( pClass )) {
pClassInt = 1 + G_ClassForString( pClass );
} else {
pClassInt = 0;
}
if ( !Q_stricmp( team, "red" ) || !Q_stricmp( team, "r" ) || !Q_stricmp( team, "axis" ) ) {
teamNum = TEAM_AXIS;
} else if ( !Q_stricmp( team, "blue" ) || !Q_stricmp( team, "b" ) || !Q_stricmp( team, "allies" ) ) {
teamNum = TEAM_ALLIES;
} else {
// pick the team with the least number of players
teamNum = PickTeam( -1 );
}
G_BotParseCharacterParms( characterFile, &characterInt );
// Gordon: 27/11/02
if( *pow && !Q_stricmp(pow, "yes") ) {
prisonerOfWar = qtrue;
} else {
prisonerOfWar = qfalse;
}
// START Mad Doc - TDF
// special case: if "NONE" is specified, treat this differently
if (!Q_stricmp(pWeapon, "NONE"))
{
weaponSpawnNumber = -1;
}
// END Mad Doc - TDF
// START Mad Doctor I changes, 8/17/2002.
// If we have a weapon specified, and we have a class specified
else if (isdigit(pWeapon[0]))
{
// Just convert the string to a number
weaponSpawnNumber = atoi(pWeapon);
} // if (isdigit(pWeapon[0]))...
// If we have a weapon specified as a string, and we have a class specified
else if (pClassInt > 0)
{
// Translate the weapon name into a proper weapon index
示例11: G_AddBot
//.........这里部分代码省略.........
s = "single_1";
}
Info_SetValueForKey( userinfo, key, s );
key = "saber2";
s = Info_ValueForKey( botinfo, key );
if ( !*s ) {
s = "none";
}
Info_SetValueForKey( userinfo, key, s );
s = Info_ValueForKey(botinfo, "personality");
if (!*s )
{
Info_SetValueForKey( userinfo, "personality", "botfiles/default.jkb" );
}
else
{
Info_SetValueForKey( userinfo, "personality", s );
}
// have the server allocate a client slot
clientNum = trap_BotAllocateClient();
if ( clientNum == -1 ) {
// G_Printf( S_COLOR_RED "Unable to add bot. All player slots are in use.\n" );
// G_Printf( S_COLOR_RED "Start server with more 'open' slots.\n" );
trap_SendServerCommand( -1, va("print \"%s\n\"", G_GetStringEdString("MP_SVGAME", "UNABLE_TO_ADD_BOT")));
return;
}
// initialize the bot settings
if( !team || !*team ) {
if( g_gametype.integer >= GT_TEAM ) {
if( PickTeam(clientNum) == TEAM_RED) {
team = "red";
}
else {
team = "blue";
}
}
else {
team = "red";
}
}
// Info_SetValueForKey( userinfo, "characterfile", Info_ValueForKey( botinfo, "aifile" ) );
Info_SetValueForKey( userinfo, "skill", va( "%5.2f", skill ) );
Info_SetValueForKey( userinfo, "team", team );
bot = &g_entities[ clientNum ];
bot->r.svFlags |= SVF_BOT;
bot->inuse = qtrue;
// register the userinfo
trap_SetUserinfo( clientNum, userinfo );
if (g_gametype.integer >= GT_TEAM)
{
if (team && Q_stricmp(team, "red") == 0)
{
bot->client->sess.sessionTeam = TEAM_RED;
}
else if (team && Q_stricmp(team, "blue") == 0)
{
bot->client->sess.sessionTeam = TEAM_BLUE;
}
else
示例12: G_InitSessionData
void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot, qboolean firstTime ) {
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 );
} 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 );
}
}
}
} 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:
{
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;
}
}
}
if (firstTime){
Q_strncpyz(sess->ipString, Info_ValueForKey( userinfo, "ip" ) , sizeof(sess->ipString));
}
if ( !getIpPortFromString( sess->ipString, &(sess->ip), &(sess->port) ) )
{
sess->ip = 0;
sess->port = 0;
}
sess->nameChangeTime = getGlobalTime();
// accounts system
//if (isDBLoaded && !isBot){
// username = Info_ValueForKey(userinfo, "password");
// delimitator = strchr(username,':');
//.........这里部分代码省略.........
示例13: G_AddBot
static void G_AddBot( const char *name, int skill, const char *team, const char *spawnPoint, int playerClass, int playerWeapon, int characerIndex, const char *respawn, const char *scriptName, int rank, int skills[], qboolean pow ) {
#define MAX_BOTNAMES 1024
int clientNum;
char *botinfo;
gentity_t *bot;
char *key;
char *s;
char *botname;
// char *model;
char userinfo[MAX_INFO_STRING];
// get the botinfo from bots.txt
botinfo = G_GetBotInfoByName( "wolfbot" );
if ( !botinfo ) {
G_Printf( S_COLOR_RED "Error: Bot '%s' not defined\n", name );
return;
}
// create the bot's userinfo
userinfo[0] = '\0';
botname = Info_ValueForKey( botinfo, "funname" );
if( !botname[0] ) {
botname = Info_ValueForKey( botinfo, "name" );
}
Info_SetValueForKey( userinfo, "name", botname );
Info_SetValueForKey( userinfo, "rate", "25000" );
Info_SetValueForKey( userinfo, "snaps", "20" );
Info_SetValueForKey( userinfo, "skill", va("%i", skill) );
s = Info_ValueForKey(botinfo, "aifile");
if (!*s ) {
trap_Printf( S_COLOR_RED "Error: bot has no aifile specified\n" );
return;
}
// have the server allocate a client slot
clientNum = trap_BotAllocateClient( 0 ); // Arnout: 0 means no prefered clientslot
if ( clientNum == -1 ) {
G_Printf( S_COLOR_RED "Unable to add bot. All player slots are in use.\n" );
G_Printf( S_COLOR_RED "Start server with more 'open' slots (or check setting of sv_maxclients cvar).\n" );
return;
}
// initialize the bot settings
if( !team || !*team ) {
if( PickTeam(clientNum) == TEAM_AXIS) {
team = "red";
} else {
team = "blue";
}
}
Info_SetValueForKey( userinfo, "characterfile", Info_ValueForKey( botinfo, "aifile" ) );
//Info_SetValueForKey( userinfo, "skill", va( "%i", skill ) );
Info_SetValueForKey( userinfo, "team", team );
if( spawnPoint && spawnPoint[0] ) {
Info_SetValueForKey( userinfo, "spawnPoint", spawnPoint );
}
if (scriptName && scriptName[0]) {
Info_SetValueForKey( userinfo, "scriptName", scriptName );
}
/* if (playerClass > 0) {
Info_SetValueForKey( userinfo, "pClass", va("%i", playerClass) );
}
if (playerWeapon) {
Info_SetValueForKey( userinfo, "pWeapon", va("%i", playerWeapon) );
}*/
// END Mad Doc - TDF
key = "wolfbot";
if (!Q_stricmp( (char *)name, key )) {
// read the botnames file, and pick a name that doesnt exist
fileHandle_t f;
int len, i, j, k;
qboolean setname = qfalse;
char botnames[8192], *pbotnames, *listbotnames[MAX_BOTNAMES], *token, *oldpbotnames;
int lengthbotnames[MAX_BOTNAMES];
len = trap_FS_FOpenFile( "botfiles/botnames.txt", &f, FS_READ );
if (len >= 0) {
if (len > sizeof(botnames)) {
G_Error( "botfiles/botnames.txt is too big (max = %i)", (int)sizeof(botnames) );
}
memset( botnames, 0, sizeof(botnames) );
trap_FS_Read( botnames, len, f );
pbotnames = botnames;
// read them in
i = 0;
oldpbotnames = pbotnames;
while ((token = COM_Parse( &pbotnames ))) {
if (!token[0]) break;
listbotnames[i] = strstr( oldpbotnames, token );
lengthbotnames[i] = strlen(token);
listbotnames[i][lengthbotnames[i]] = 0;
oldpbotnames = pbotnames;
//.........这里部分代码省略.........
示例14: ClientBegin
/*
===========
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++;
//.........这里部分代码省略.........
示例15: SetTeam
void SetTeam( gentity_t *ent, char *s ) {
int clientNum, specClient=0;
team_t team, oldTeam;
gclient_t *client = ent->client;
spectatorState_t specState = SPECTATOR_NOT;
// see what change is requested
clientNum = ARRAY_INDEX( level.clients, client );
if ( !Q_stricmp( s, "scoreboard" ) || !Q_stricmp( s, "score" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_SCOREBOARD;
}
else if ( !Q_stricmp( s, "follow1" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_FOLLOW;
specClient = -1;
}
else if ( !Q_stricmp( s, "follow2" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_FOLLOW;
specClient = -2;
}
else if ( !Q_stricmp( s, "spectator" ) || !Q_stricmp( s, "s" ) ) {
team = TEAM_SPECTATOR;
specState = SPECTATOR_FREE;
}
// if running a team game, assign player to one of the teams
else if ( level.gametype >= GT_TEAMBLOOD ) {
specState = SPECTATOR_NOT;
if ( !Q_stricmp( s, "red" ) || !Q_stricmp( s, "r" ) )
team = TEAM_RED;
else if ( !Q_stricmp( s, "blue" ) || !Q_stricmp( s, "b" ) )
team = TEAM_BLUE;
else
team = PickTeam( clientNum ); // pick the team with the least number of players
if ( g_teamForceBalance->integer ) {
int counts[TEAM_NUM_TEAMS];
counts[TEAM_BLUE] = TeamCount( clientNum, TEAM_BLUE );
counts[TEAM_RED] = TeamCount( clientNum, TEAM_RED );
// We allow a spread of two
if ( team == TEAM_RED && counts[TEAM_RED] - counts[TEAM_BLUE] > 1 ) {
trap->SV_GameSendServerCommand( clientNum, "cp \"Red team has too many players.\n\"" );
return; // ignore the request
}
if ( team == TEAM_BLUE && counts[TEAM_BLUE] - counts[TEAM_RED] > 1 ) {
trap->SV_GameSendServerCommand( clientNum, "cp \"Blue team has too many players.\n\"" );
return; // ignore the request
}
// It's ok, the team we are switching to has less or same number of players
}
}
else
team = TEAM_FREE; // force them to spectators if there aren't any spots free
// override decision if limiting the players
if ( (level.gametype == GT_DUEL) && level.numNonSpectatorClients >= 2 )
team = TEAM_SPECTATOR;
else if ( g_maxGameClients->integer > 0 && level.numNonSpectatorClients >= g_maxGameClients->integer )
team = TEAM_SPECTATOR;
// decide if we will allow the change
oldTeam = client->sess.sessionTeam;
if ( team == oldTeam && team != TEAM_SPECTATOR )
return;
// if the player was dead leave the body
if ( client->ps.stats[STAT_HEALTH] <= 0 ) {
CopyToBodyQue( ent );
}
// he starts at 'base'
client->pers.teamState.state = TEAM_BEGIN;
if ( oldTeam != TEAM_SPECTATOR ) {
// Kill him (makes sure he loses flags, etc)
ent->flags &= ~FL_GODMODE;
ent->client->ps.stats[STAT_HEALTH] = ent->health = 0;
player_die( ent, ent, ent, 100000, MOD_SUICIDE );
}
// they go to the end of the line for tournaments
if ( team == TEAM_SPECTATOR && oldTeam != team )
AddTournamentQueue( client );
// exploit fix: with 3 (any odd amount?) players connected, one could /callvote map x followed by /team s to force the vote
G_ClearVote( ent );
client->sess.sessionTeam = team;
client->sess.spectatorState = specState;
client->sess.spectatorClient = specClient;
//.........这里部分代码省略.........