本文整理汇总了C++中Info_SetValueForKey函数的典型用法代码示例。如果您正苦于以下问题:C++ Info_SetValueForKey函数的具体用法?C++ Info_SetValueForKey怎么用?C++ Info_SetValueForKey使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Info_SetValueForKey函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ClientUserinfoChanged
//.........这里部分代码省略.........
else if( client->pers.nameChangeTime &&
( level.time - client->pers.nameChangeTime )
<= ( g_minNameChangePeriod.value * 1000 ) )
{
trap_SendServerCommand( ent - g_entities, va(
"print \"Name change spam protection (g_minNameChangePeriod = %d)\n\"",
g_minNameChangePeriod.integer ) );
revertName = qtrue;
}
else if( g_maxNameChanges.integer > 0
&& client->pers.nameChanges >= g_maxNameChanges.integer )
{
trap_SendServerCommand( ent - g_entities, va(
"print \"Maximum name changes reached (g_maxNameChanges = %d)\n\"",
g_maxNameChanges.integer ) );
revertName = qtrue;
}
else if( !G_admin_name_check( ent, newname, err, sizeof( err ) ) )
{
trap_SendServerCommand( ent - g_entities, va( "print \"%s\n\"", err ) );
revertName = qtrue;
}
else if( client->pers.nlocked )
{
trap_SendServerCommand( ent - g_entities,
"print \"Your name is locked, you can no longer rename.\n\"" );
revertName = qtrue;
}
if( revertName )
{
Q_strncpyz( client->pers.netname, oldname,
sizeof( client->pers.netname ) );
Info_SetValueForKey( userinfo, "name", oldname );
trap_SetUserinfo( clientNum, userinfo );
}
else
{
Q_strncpyz( client->pers.netname, newname,
sizeof( client->pers.netname ) );
Info_SetValueForKey( userinfo, "name", newname );
trap_SetUserinfo( clientNum, userinfo );
if( client->pers.connected == CON_CONNECTED )
{
client->pers.nameChangeTime = level.time;
client->pers.nameChanges++;
}
}
}
if( client->sess.sessionTeam == TEAM_SPECTATOR )
{
if( client->sess.spectatorState == SPECTATOR_SCOREBOARD )
Q_strncpyz( client->pers.netname, "scoreboard", sizeof( client->pers.netname ) );
}
if( client->pers.connected >= CON_CONNECTING && showRenameMsg )
{
if( strcmp( oldname, client->pers.netname ) )
{
trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE
" renamed to %s^7\n\"", oldname, client->pers.netname ) );
if( g_decolourLogfiles.integer)
{
char decoloured[ MAX_STRING_CHARS ] = "";
if( g_decolourLogfiles.integer == 1 )
示例2: trap_GetUserinfo
/*
===========
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.
============
*/
char *ClientUserinfoChanged( int clientNum )
{
gentity_t *ent;
char *s;
char model[ MAX_QPATH ];
char buffer[ MAX_QPATH ];
char filename[ MAX_QPATH ];
char oldname[ MAX_NAME_LENGTH ];
char newname[ MAX_NAME_LENGTH ];
char err[ MAX_STRING_CHARS ];
qboolean revertName = qfalse;
gclient_t *client;
char userinfo[ MAX_INFO_STRING ];
ent = g_entities + clientNum;
client = ent->client;
trap_GetUserinfo( clientNum, userinfo, sizeof( userinfo ) );
// check for malformed or illegal info strings
if( !Info_Validate(userinfo) )
{
trap_SendServerCommand( ent - g_entities,
"disconnect \"illegal or malformed userinfo\n\"" );
trap_DropClient( ent - g_entities,
"dropped: illegal or malformed userinfo");
return "Illegal or malformed userinfo";
}
// stickyspec toggle
s = Info_ValueForKey( userinfo, "cg_stickySpec" );
client->pers.stickySpec = atoi( s ) != 0;
// set name
Q_strncpyz( oldname, client->pers.netname, sizeof( oldname ) );
s = Info_ValueForKey( userinfo, "name" );
G_ClientCleanName( s, newname, sizeof( newname ) );
if( strcmp( oldname, newname ) )
{
if( client->pers.namelog->nameChangeTime &&
level.time - client->pers.namelog->nameChangeTime <=
g_minNameChangePeriod.value * 1000 )
{
trap_SendServerCommand( ent - g_entities, va(
"print \"Name change spam protection (g_minNameChangePeriod = %d)\n\"",
g_minNameChangePeriod.integer ) );
revertName = qtrue;
}
else if( g_maxNameChanges.integer > 0 &&
client->pers.namelog->nameChanges >= g_maxNameChanges.integer )
{
trap_SendServerCommand( ent - g_entities, va(
"print \"Maximum name changes reached (g_maxNameChanges = %d)\n\"",
g_maxNameChanges.integer ) );
revertName = qtrue;
}
else if( client->pers.namelog->muted )
{
trap_SendServerCommand( ent - g_entities,
"print \"You cannot change your name while you are muted\n\"" );
revertName = qtrue;
}
else if( !G_admin_name_check( ent, newname, err, sizeof( err ) ) )
{
trap_SendServerCommand( ent - g_entities, va( "print \"%s\n\"", err ) );
revertName = qtrue;
}
if( revertName )
{
Q_strncpyz( client->pers.netname, *oldname ? oldname : "UnnamedPlayer",
sizeof( client->pers.netname ) );
Info_SetValueForKey( userinfo, "name", oldname );
trap_SetUserinfo( clientNum, userinfo );
}
else
{
Q_strncpyz( client->pers.netname, newname,
sizeof( client->pers.netname ) );
if( client->pers.connected == CON_CONNECTED )
{
client->pers.namelog->nameChangeTime = level.time;
client->pers.namelog->nameChanges++;
}
if( *oldname )
{
G_LogPrintf( "ClientRename: %i [%s] (%s) \"%s^7\" -> \"%s^7\" \"%c%s%c^7\"\n",
clientNum, client->pers.ip.str, client->pers.guid,
//.........这里部分代码省略.........
示例3: Mod_LoadAliasModel
/*
=================
Mod_LoadAliasModel
=================
*/
void Mod_LoadAliasModel (model_t *mod, void *buffer)
{
int i, j;
mdl_t *pinmodel;
stvert_t *pinstverts;
dtriangle_t *pintriangles;
int version, numframes;
int size;
daliasframetype_t *pframetype;
daliasskintype_t *pskintype;
int start, end, total;
if (!strcmp(loadmodel->name, "progs/player.mdl") ||
!strcmp(loadmodel->name, "progs/eyes.mdl")) {
unsigned short crc;
byte *p;
int len;
char st[40];
CRC_Init(&crc);
for (len = com_filesize, p = buffer; len; len--, p++)
CRC_ProcessByte(&crc, *p);
sprintf(st, "%d", (int) crc);
Info_SetValueForKey (cls.userinfo,
!strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name,
st, MAX_INFO_STRING);
if (cls.state >= ca_connected) {
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
sprintf(st, "setinfo %s %d",
!strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name,
(int)crc);
SZ_Print (&cls.netchan.message, st);
}
}
start = Hunk_LowMark ();
pinmodel = (mdl_t *)buffer;
version = LittleLong (pinmodel->version);
if (version != ALIAS_VERSION)
Sys_Error ("%s has wrong version number (%i should be %i)",
mod->name, version, ALIAS_VERSION);
//
// allocate space for a working header, plus all the data except the frames,
// skin and group info
//
size = sizeof (aliashdr_t)
+ (LittleLong (pinmodel->numframes) - 1) *
sizeof (pheader->frames[0]);
pheader = Hunk_AllocName (size, loadname);
mod->flags = LittleLong (pinmodel->flags);
//
// endian-adjust and copy the data, starting with the alias model header
//
pheader->boundingradius = LittleFloat (pinmodel->boundingradius);
pheader->numskins = LittleLong (pinmodel->numskins);
pheader->skinwidth = LittleLong (pinmodel->skinwidth);
pheader->skinheight = LittleLong (pinmodel->skinheight);
if (pheader->skinheight > MAX_LBM_HEIGHT)
Sys_Error ("model %s has a skin taller than %d", mod->name,
MAX_LBM_HEIGHT);
pheader->numverts = LittleLong (pinmodel->numverts);
if (pheader->numverts <= 0)
Sys_Error ("model %s has no vertices", mod->name);
if (pheader->numverts > MAXALIASVERTS)
Sys_Error ("model %s has too many vertices", mod->name);
pheader->numtris = LittleLong (pinmodel->numtris);
if (pheader->numtris <= 0)
Sys_Error ("model %s has no triangles", mod->name);
pheader->numframes = LittleLong (pinmodel->numframes);
numframes = pheader->numframes;
if (numframes < 1)
Sys_Error ("Mod_LoadAliasModel: Invalid # of frames: %d\n", numframes);
pheader->size = LittleFloat (pinmodel->size) * ALIAS_BASE_SIZE_RATIO;
mod->synctype = LittleLong (pinmodel->synctype);
mod->numframes = pheader->numframes;
for (i=0 ; i<3 ; i++)
{
pheader->scale[i] = LittleFloat (pinmodel->scale[i]);
pheader->scale_origin[i] = LittleFloat (pinmodel->scale_origin[i]);
//.........这里部分代码省略.........
示例4: LAN_GetServerInfo
/*
====================
LAN_GetServerInfo
====================
*/
static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) {
char info[MAX_STRING_CHARS];
serverInfo_t *server = NULL;
info[0] = '\0';
switch (source) {
case AS_LOCAL :
if (n >= 0 && n < MAX_OTHER_SERVERS) {
server = &cls.localServers[n];
}
break;
case AS_MPLAYER:
case AS_GLOBAL :
if (n >= 0 && n < MAX_GLOBAL_SERVERS) {
server = &cls.globalServers[n];
}
break;
case AS_FAVORITES :
if (n >= 0 && n < MAX_OTHER_SERVERS) {
server = &cls.favoriteServers[n];
}
break;
}
if (server && buf) {
buf[0] = '\0';
Info_SetValueForKey( info, "hostname", server->hostName);
Info_SetValueForKey( info, "mapname", server->mapName);
Info_SetValueForKey( info, "clients", va("%i",server->clients));
Info_SetValueForKey( info, "sv_maxclients", va("%i",server->maxClients));
Info_SetValueForKey( info, "ping", va("%i",server->ping));
Info_SetValueForKey( info, "minping", va("%i",server->minPing));
Info_SetValueForKey( info, "maxping", va("%i",server->maxPing));
Info_SetValueForKey( info, "game", server->game);
Info_SetValueForKey( info, "gametype", va("%i",server->gameType));
Info_SetValueForKey( info, "nettype", va("%i",server->netType));
Info_SetValueForKey( info, "addr", NET_AdrToStringwPort(server->adr));
Info_SetValueForKey( info, "punkbuster", va("%i", server->punkbuster));
Info_SetValueForKey( info, "g_needpass", va("%i", server->g_needpass));
Info_SetValueForKey( info, "g_humanplayers", va("%i", server->g_humanplayers));
Q_strncpyz(buf, info, buflen);
} else {
if (buf) {
buf[0] = '\0';
}
}
}
示例5: ClientConnect
/*
* Called when a player begins connecting to the server.
* The game can refuse entrance to a client by returning false.
* If the client is allowed, the connection process will continue
* and eventually get to ClientBegin(). Changing levels will NOT
* cause this to be called again, but loadgames will.
*/
qboolean
ClientConnect(edict_t *ent, char *userinfo)
{
char *value;
if (!ent || !userinfo)
{
return false;
}
/* check to see if they are on the banned IP list */
value = Info_ValueForKey(userinfo, "ip");
if (SV_FilterPacket(value))
{
Info_SetValueForKey(userinfo, "rejmsg", "Banned.");
return false;
}
/* check for a spectator */
value = Info_ValueForKey(userinfo, "spectator");
if (deathmatch->value && *value && strcmp(value, "0"))
{
int i, numspec;
if (*spectator_password->string &&
strcmp(spectator_password->string, "none") &&
strcmp(spectator_password->string, value))
{
Info_SetValueForKey(userinfo, "rejmsg",
"Spectator password required or incorrect.");
return false;
}
/* count spectators */
for (i = numspec = 0; i < maxclients->value; i++)
{
if (g_edicts[i + 1].inuse && g_edicts[i + 1].client->pers.spectator)
{
numspec++;
}
}
if (numspec >= maxspectators->value)
{
Info_SetValueForKey(userinfo, "rejmsg",
"Server spectator limit is full.");
return false;
}
}
else
{
/* check for a password */
value = Info_ValueForKey(userinfo, "password");
if (*password->string && strcmp(password->string, "none") &&
strcmp(password->string, value))
{
Info_SetValueForKey(userinfo, "rejmsg",
"Password required or incorrect.");
return false;
}
}
/* they can connect */
ent->client = game.clients + (ent - g_edicts - 1);
/* if there is already a body waiting for us (a loadgame),
just take it, otherwise spawn one from scratch */
if (ent->inuse == false)
{
/* clear the respawning variables */
InitClientResp(ent->client);
if (!game.autosaved || !ent->client->pers.weapon)
{
InitClientPersistant(ent->client);
}
}
ClientUserinfoChanged(ent, userinfo);
if (game.maxclients > 1)
{
gi.dprintf("%s connected\n", ent->client->pers.netname);
}
ent->svflags = 0; /* make sure we start with known default */
ent->client->pers.connected = true;
return true;
}
示例6: LAN_GetServerInfo
/*
====================
LAN_GetServerInfo
====================
*/
static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) {
char info[MAX_STRING_CHARS];
serverInfo_t *server = NULL;
info[0] = '\0';
switch (source) {
case AS_LOCAL :
if (n >= 0 && n < MAX_OTHER_SERVERS) {
server = &cls.localServers[n];
}
break;
case AS_MPLAYER:
case AS_GLOBAL :
if (n >= 0 && n < MAX_GLOBAL_SERVERS) {
server = &cls.globalServers[n];
}
break;
case AS_FAVORITES :
if (n >= 0 && n < MAX_OTHER_SERVERS) {
server = &cls.favoriteServers[n];
}
break;
}
if (server && buf) {
buf[0] = '\0';
Info_SetValueForKey( info, "hostname", server->hostName);
Info_SetValueForKey( info, "mapname", server->mapName);
Info_SetValueForKey( info, "clients", va("%i",server->clients));
Info_SetValueForKey( info, "sv_maxclients", va("%i",server->maxClients));
Info_SetValueForKey( info, "ping", va("%i",server->ping));
Info_SetValueForKey( info, "minping", va("%i",server->minPing));
Info_SetValueForKey( info, "maxping", va("%i",server->maxPing));
Info_SetValueForKey( info, "nettype", va("%i",server->netType));
Info_SetValueForKey( info, "needpass", va("%i", server->needPassword ) );
Info_SetValueForKey( info, "truejedi", va("%i", server->trueJedi ) );
Info_SetValueForKey( info, "wdisable", va("%i", server->weaponDisable ) );
Info_SetValueForKey( info, "fdisable", va("%i", server->forceDisable ) );
Info_SetValueForKey( info, "game", server->game);
Info_SetValueForKey( info, "gametype", va("%i",server->gameType));
Info_SetValueForKey( info, "addr", NET_AdrToString(server->adr));
// Info_SetValueForKey( info, "sv_allowAnonymous", va("%i", server->allowAnonymous));
// Info_SetValueForKey( info, "pure", va("%i", server->pure ) );
Q_strncpyz(buf, info, buflen);
} else {
if (buf) {
buf[0] = '\0';
}
}
}
示例7: 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))
{
//.........这里部分代码省略.........
示例8: ACESP_SetName
///////////////////////////////////////////////////////////////////////
// Set the name of the bot and update the userinfo
///////////////////////////////////////////////////////////////////////
void ACESP_SetName(edict_t *bot, char *name, char *skin, char *team)
{
float rnd;
char userinfo[MAX_INFO_STRING];
char bot_skin[MAX_INFO_STRING];
char bot_name[MAX_INFO_STRING];
// Set the name for the bot.
// name
if(strlen(name) == 0)
SetBotNames(bot_name);
else
strcpy(bot_name,name);
// skin
if(strlen(skin) == 0)
{
// randomly choose skin
rnd = random();
if(rnd < 0.05)
sprintf(bot_skin,"female/athena");
else if(rnd < 0.1)
sprintf(bot_skin,"female/brianna");
else if(rnd < 0.15)
sprintf(bot_skin,"female/cobalt");
else if(rnd < 0.2)
sprintf(bot_skin,"female/ensign");
else if(rnd < 0.25)
sprintf(bot_skin,"female/jezebel");
else if(rnd < 0.3)
sprintf(bot_skin,"female/jungle");
else if(rnd < 0.35)
sprintf(bot_skin,"female/lotus");
else if(rnd < 0.4)
sprintf(bot_skin,"female/stiletto");
else if(rnd < 0.45)
sprintf(bot_skin,"female/venus");
else if(rnd < 0.5)
sprintf(bot_skin,"female/voodoo");
else if(rnd < 0.55)
sprintf(bot_skin,"male/cipher");
else if(rnd < 0.6)
sprintf(bot_skin,"male/flak");
else if(rnd < 0.65)
sprintf(bot_skin,"male/grunt");
else if(rnd < 0.7)
sprintf(bot_skin,"male/howitzer");
else if(rnd < 0.75)
sprintf(bot_skin,"male/major");
else if(rnd < 0.8)
sprintf(bot_skin,"male/nightops");
else if(rnd < 0.85)
sprintf(bot_skin,"male/pointman");
else if(rnd < 0.9)
sprintf(bot_skin,"male/psycho");
else if(rnd < 0.95)
sprintf(bot_skin,"male/razor");
else
sprintf(bot_skin,"male/sniper");
}
else
strcpy(bot_skin,skin);
// initialise userinfo
memset (userinfo, 0, sizeof(userinfo));
// add bot's name/skin/hand to userinfo
Info_SetValueForKey (userinfo, "name", bot_name);
Info_SetValueForKey (userinfo, "skin", bot_skin);
Info_SetValueForKey (userinfo, "hand", "2"); // bot is center handed for now!
ClientConnect (bot, userinfo);
if (botauto_respawn->value) {
ACESP_SaveBots(); // make sure to save the bots
}
}
示例9: 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++;
//.........这里部分代码省略.........
示例10: SVC_Info
/*
================
SVC_Info
Responds with a short info message that should be enough to determine
if a user is interested in a server to do a full status
================
*/
void SVC_Info( netadr_t from, const Cmd::Args& args )
{
int i, count, botCount;
char infostring[ MAX_INFO_STRING ];
if ( args.Argc() < 2 )
{
return;
}
const char *challenge = args.Argv(1).c_str();
/*
* Check whether Cmd_Argv(1) has a sane length. This was not done in the original Quake3 version which led
* to the Infostring bug discovered by Luigi Auriemma. See http://aluigi.altervista.org/ for the advisory.
*/
// A maximum challenge length of 128 should be more than plenty.
if ( strlen( challenge ) > MAX_CHALLENGE_LEN )
{
return;
}
//bani - bugtraq 12534
if ( !SV_VerifyChallenge( challenge ) )
{
return;
}
SV_ResolveMasterServers();
// don't count privateclients
botCount = count = 0;
for ( i = sv_privateClients->integer; i < sv_maxclients->integer; i++ )
{
if ( svs.clients[ i ].state >= CS_CONNECTED )
{
if ( SV_IsBot(&svs.clients[ i ]) )
{
++botCount;
}
else
{
++count;
}
}
}
infostring[ 0 ] = 0;
// echo back the parameter to status. so servers can use it as a challenge
// to prevent timed spoofed reply packets that add ghost servers
Info_SetValueForKey( infostring, "challenge", challenge, false );
// If the master server listens on IPv4 and IPv6, we want to send the
// most recent challenge received from it over the OTHER protocol
for ( i = 0; i < MAX_MASTER_SERVERS; i++ )
{
// First, see if the challenge was sent by this master server
if ( !NET_CompareBaseAdr( from, masterServerAddr[ i ].ipv4 ) && !NET_CompareBaseAdr( from, masterServerAddr[ i ].ipv6 ) )
{
continue;
}
// It was - if the saved challenge is for the other protocol, send it and record the current one
if ( challenges[ i ].type == NA_IP || challenges[ i ].type == NA_IP6 )
{
if ( challenges[ i ].type != from.type )
{
Info_SetValueForKey( infostring, "challenge2", challenges[ i ].text, false );
challenges[ i ].type = from.type;
strcpy( challenges[ i ].text, challenge );
break;
}
}
// Otherwise record the current one regardless and check the next server
challenges[ i ].type = from.type;
strcpy( challenges[ i ].text, challenge );
}
Info_SetValueForKey( infostring, "protocol", va( "%i", PROTOCOL_VERSION ), false );
Info_SetValueForKey( infostring, "hostname", sv_hostname->string, false );
Info_SetValueForKey( infostring, "serverload", va( "%i", svs.serverLoad ), false );
Info_SetValueForKey( infostring, "mapname", sv_mapname->string, false );
Info_SetValueForKey( infostring, "clients", va( "%i", count ), false );
Info_SetValueForKey( infostring, "bots", va( "%i", botCount ), false );
Info_SetValueForKey( infostring, "sv_maxclients", va( "%i", sv_maxclients->integer - sv_privateClients->integer ), false );
Info_SetValueForKey( infostring, "pure", va( "%i", sv_pure->integer ), false );
if ( sv_statsURL->string[0] )
{
//.........这里部分代码省略.........
示例11: SVC_Info
/*
================
SVC_Info
Responds with a short info message that should be enough to determine
if a user is interested in a server to do a full status
================
*/
void SVC_Info( netadr_t from ) {
int i, count, wDisable;
char *gamedir;
char infostring[MAX_INFO_STRING];
// ignore if we are in single player
/*
if ( Cvar_VariableValue( "g_gametype" ) == GT_SINGLE_PLAYER || Cvar_VariableValue("ui_singlePlayerActive")) {
return;
}
*/
#ifdef _XBOX
// don't send system link info if in Xbox Live
if (logged_on)
return;
#endif
if (Cvar_VariableValue("ui_singlePlayerActive"))
{
return;
}
// don't count privateclients
count = 0;
for ( i = sv_privateClients->integer ; i < sv_maxclients->integer ; i++ ) {
if ( svs.clients[i].state >= CS_CONNECTED ) {
count++;
}
}
infostring[0] = 0;
// echo back the parameter to status. so servers can use it as a challenge
// to prevent timed spoofed reply packets that add ghost servers
Info_SetValueForKey( infostring, "challenge", Cmd_Argv(1) );
Info_SetValueForKey( infostring, "protocol", va("%i", PROTOCOL_VERSION) );
Info_SetValueForKey( infostring, "hostname", sv_hostname->string );
Info_SetValueForKey( infostring, "mapname", sv_mapname->string );
Info_SetValueForKey( infostring, "clients", va("%i", count) );
Info_SetValueForKey( infostring, "sv_maxclients",
va("%i", sv_maxclients->integer - sv_privateClients->integer ) );
Info_SetValueForKey( infostring, "gametype", va("%i", sv_gametype->integer ) );
Info_SetValueForKey( infostring, "needpass", va("%i", sv_needpass->integer ) );
Info_SetValueForKey( infostring, "truejedi", va("%i", Cvar_VariableIntegerValue( "g_jediVmerc" ) ) );
if ( sv_gametype->integer == GT_DUEL || sv_gametype->integer == GT_POWERDUEL )
{
wDisable = Cvar_VariableIntegerValue( "g_duelWeaponDisable" );
}
else
{
wDisable = Cvar_VariableIntegerValue( "g_weaponDisable" );
}
Info_SetValueForKey( infostring, "wdisable", va("%i", wDisable ) );
Info_SetValueForKey( infostring, "fdisable", va("%i", Cvar_VariableIntegerValue( "g_forcePowerDisable" ) ) );
//Info_SetValueForKey( infostring, "pure", va("%i", sv_pure->integer ) );
if( sv_minPing->integer ) {
Info_SetValueForKey( infostring, "minPing", va("%i", sv_minPing->integer) );
}
if( sv_maxPing->integer ) {
Info_SetValueForKey( infostring, "maxPing", va("%i", sv_maxPing->integer) );
}
gamedir = Cvar_VariableString( "fs_game" );
if( *gamedir ) {
Info_SetValueForKey( infostring, "game", gamedir );
}
#ifdef USE_CD_KEY
Info_SetValueForKey( infostring, "sv_allowAnonymous", va("%i", sv_allowAnonymous->integer) );
#endif
#ifdef _XBOX
// Include Xbox specific networking info
char sxnkid[XNKID_STRING_LEN];
XNKIDToString(SysLink_GetXNKID(), sxnkid);
Info_SetValueForKey(infostring, "xnkid", sxnkid);
char sxnkey[XNKEY_STRING_LEN];
XNKEYToString(SysLink_GetXNKEY(), sxnkey);
Info_SetValueForKey(infostring, "xnkey", sxnkey);
char sxnaddr[XNADDR_STRING_LEN];
XnAddrToString(Net_GetXNADDR(), sxnaddr);
Info_SetValueForKey(infostring, "xnaddr", sxnaddr);
#endif
NET_OutOfBandPrint( NS_SERVER, from, "infoResponse\n%s", infostring );
}
示例12: UI_ParseInfos
/*
===============
UI_ParseInfos
===============
*/
int UI_ParseInfos( char *buf, int max, char *infos[] )
{
char *token;
int count;
char key[ MAX_TOKEN_CHARS ];
char info[ MAX_INFO_STRING ];
count = 0;
while ( 1 )
{
token = COM_Parse( &buf );
if ( !token[ 0 ] )
{
break;
}
if ( strcmp( token, "{" ) )
{
Com_Printf( "Missing { in info file\n" );
break;
}
if ( count == max )
{
Com_Printf( "Max infos exceeded\n" );
break;
}
info[ 0 ] = '\0';
while ( 1 )
{
token = COM_ParseExt( &buf, qtrue );
if ( !token[ 0 ] )
{
Com_Printf( "Unexpected end of info file\n" );
break;
}
if ( !strcmp( token, "}" ) )
{
break;
}
Q_strncpyz( key, token, sizeof( key ) );
token = COM_ParseExt( &buf, qfalse );
if ( !token[ 0 ] )
{
strcpy( token, "<NULL>" );
}
Info_SetValueForKey( info, key, token );
}
//NOTE: extra space for arena number
infos[ count ] = UI_Alloc( strlen( info ) + strlen( "\\num\\" ) + strlen( va( "%d", MAX_ARENAS ) ) + 1 );
if ( infos[ count ] )
{
strcpy( infos[ count ], info );
count++;
}
}
return count;
}
示例13: SV_UserinfoChanged
/*
* SV_UserinfoChanged
*
* Pull specific info from a newly changed userinfo string
* into a more C friendly form.
*/
void SV_UserinfoChanged( client_t *client )
{
char *val;
int ival;
assert( client );
assert( Info_Validate( client->userinfo ) );
if( !client->edict || !( client->edict->r.svflags & SVF_FAKECLIENT ) )
{
// force the IP key/value pair so the game can filter based on ip
if( !Info_SetValueForKey( client->userinfo, "socket", NET_SocketTypeToString( client->netchan.socket->type ) ) )
{
SV_DropClient( client, DROP_TYPE_GENERAL, "Error: Couldn't set userinfo (socket)\n" );
return;
}
if( !Info_SetValueForKey( client->userinfo, "ip", NET_AddressToString( &client->netchan.remoteAddress ) ) )
{
SV_DropClient( client, DROP_TYPE_GENERAL, "Error: Couldn't set userinfo (ip)\n" );
return;
}
}
// mm session
ival = 0;
val = Info_ValueForKey( client->userinfo, "cl_mm_session" );
if( val )
ival = atoi( val );
if( !val || ival != client->mm_session )
Info_SetValueForKey( client->userinfo, "cl_mm_session", va("%d", client->mm_session ) );
// mm login
if( client->mm_login[0] != '\0' ) {
Info_SetValueForKey( client->userinfo, "cl_mm_login", client->mm_login );
}
else {
Info_RemoveKey( client->userinfo, "cl_mm_login" );
}
// call prog code to allow overrides
ge->ClientUserinfoChanged( client->edict, client->userinfo );
if( !Info_Validate( client->userinfo ) )
{
SV_DropClient( client, DROP_TYPE_GENERAL, "Error: Invalid userinfo (after game)" );
return;
}
// we assume that game module deals with setting a correct name
val = Info_ValueForKey( client->userinfo, "name" );
if( !val || !val[0] )
{
SV_DropClient( client, DROP_TYPE_GENERAL, "Error: No name set" );
return;
}
Q_strncpyz( client->name, val, sizeof( client->name ) );
#ifndef RATEKILLED
// rate command
if( NET_IsLANAddress( &client->netchan.remoteAddress ) )
{
client->rate = 99999; // lans should not rate limit
}
else
{
val = Info_ValueForKey( client->userinfo, "rate" );
if( val && val[0] )
{
int newrate;
newrate = atoi( val );
if( sv_maxrate->integer && newrate > sv_maxrate->integer )
newrate = sv_maxrate->integer;
else if( newrate > 90000 )
newrate = 90000;
if( newrate < 1000 )
newrate = 1000;
if( client->rate != newrate )
{
client->rate = newrate;
Com_Printf( "%s%s has rate %i\n", client->name, S_COLOR_WHITE, client->rate );
}
}
else
client->rate = 5000;
}
#endif
}
示例14: SV_DirectConnect
/*
==================
SV_DirectConnect
A "connect" OOB command has been received
==================
*/
void SV_DirectConnect( netadr_t from ) {
char userinfo[MAX_INFO_STRING];
int i;
client_t *cl, *newcl;
MAC_STATIC client_t temp;
sharedEntity_t *ent;
int clientNum;
int version;
int qport;
int challenge;
char *password;
int startIndex;
char *denied;
int count;
Com_DPrintf ("SVC_DirectConnect ()\n");
Q_strncpyz( userinfo, Cmd_Argv(1), sizeof(userinfo) );
version = atoi( Info_ValueForKey( userinfo, "protocol" ) );
if ( version != PROTOCOL_VERSION ) {
NET_OutOfBandPrint( NS_SERVER, from, "print\nServer uses protocol version %i.\n", PROTOCOL_VERSION );
Com_DPrintf (" rejected connect from version %i\n", version);
return;
}
challenge = atoi( Info_ValueForKey( userinfo, "challenge" ) );
qport = atoi( Info_ValueForKey( userinfo, "qport" ) );
// quick reject
for (i=0,cl=svs.clients ; i < sv_maxclients->integer ; i++,cl++) {
if ( cl->state == CS_FREE ) {
continue;
}
if ( NET_CompareBaseAdr( from, cl->netchan.remoteAddress )
&& ( cl->netchan.qport == qport
|| from.port == cl->netchan.remoteAddress.port ) ) {
if (( svs.time - cl->lastConnectTime)
< (sv_reconnectlimit->integer * 1000)) {
Com_DPrintf ("%s:reconnect rejected : too soon\n", NET_AdrToString (from));
return;
}
break;
}
}
// see if the challenge is valid (LAN clients don't need to challenge)
if ( !NET_IsLocalAddress (from) ) {
int ping;
for (i=0 ; i<MAX_CHALLENGES ; i++) {
if (NET_CompareAdr(from, svs.challenges[i].adr)) {
if ( challenge == svs.challenges[i].challenge ) {
break; // good
}
}
}
if (i == MAX_CHALLENGES) {
NET_OutOfBandPrint( NS_SERVER, from, "print\nNo or bad challenge for address.\n" );
return;
}
// force the IP key/value pair so the game can filter based on ip
Info_SetValueForKey( userinfo, "ip", NET_AdrToString( from ) );
ping = svs.time - svs.challenges[i].pingTime;
Com_Printf( "Client %i connecting with %i challenge ping\n", i, ping );
svs.challenges[i].connected = qtrue;
// never reject a LAN client based on ping
if ( !Sys_IsLANAddress( from ) ) {
if ( sv_minPing->value && ping < sv_minPing->value ) {
// don't let them keep trying until they get a big delay
NET_OutOfBandPrint( NS_SERVER, from, "print\nServer is for high pings only\n" );
Com_DPrintf ("Client %i rejected on a too low ping\n", i);
// reset the address otherwise their ping will keep increasing
// with each connect message and they'd eventually be able to connect
svs.challenges[i].adr.port = 0;
return;
}
if ( sv_maxPing->value && ping > sv_maxPing->value ) {
NET_OutOfBandPrint( NS_SERVER, from, "print\nServer is for low pings only\n" );
Com_DPrintf ("Client %i rejected on a too high ping\n", i);
return;
}
}
} else {
// force the "ip" info key to "localhost"
Info_SetValueForKey( userinfo, "ip", "localhost" );
}
newcl = &temp;
Com_Memset (newcl, 0, sizeof(client_t));
//.........这里部分代码省略.........
示例15: SV_DirectConnect
/*
==================
SV_DirectConnect
A "connect" OOB command has been received
==================
*/
void SV_DirectConnect( netadr_t from ) {
char userinfo[MAX_INFO_STRING];
int i;
client_t *cl, *newcl;
client_t temp;
gentity_t *ent;
int clientNum;
int version;
int qport;
//int challenge;
char *denied;
Com_DPrintf ("SVC_DirectConnect ()\n");
Q_strncpyz( userinfo, Cmd_Argv(1), sizeof(userinfo) );
version = atoi( Info_ValueForKey( userinfo, "protocol" ) );
if ( version != PROTOCOL_VERSION ) {
NET_OutOfBandPrint( NS_SERVER, from, "print\nServer uses protocol version %i.\n", PROTOCOL_VERSION );
Com_DPrintf (" rejected connect from version %i\n", version);
return;
}
qport = atoi( Info_ValueForKey( userinfo, "qport" ) );
//challenge = atoi( Info_ValueForKey( userinfo, "challenge" ) );
// see if the challenge is valid (local clients don't need to challenge)
if ( !NET_IsLocalAddress (from) ) {
NET_OutOfBandPrint( NS_SERVER, from, "print\nNo challenge for address.\n" );
return;
} else {
// force the "ip" info key to "localhost"
Info_SetValueForKey( userinfo, "ip", "localhost" );
}
newcl = &temp;
memset (newcl, 0, sizeof(client_t));
// if there is already a slot for this ip, reuse it
for (i=0,cl=svs.clients ; i < 1 ; i++,cl++)
{
if ( cl->state == CS_FREE ) {
continue;
}
if ( NET_CompareBaseAdr( from, cl->netchan.remoteAddress )
&& ( cl->netchan.qport == qport
|| from.port == cl->netchan.remoteAddress.port ) )
{
if (( sv.time - cl->lastConnectTime)
< (sv_reconnectlimit->integer * 1000))
{
Com_DPrintf ("%s:reconnect rejected : too soon\n", NET_AdrToString (from));
return;
}
Com_Printf ("%s:reconnect\n", NET_AdrToString (from));
newcl = cl;
goto gotnewcl;
}
}
newcl = NULL;
for ( i = 0; i < 1 ; i++ ) {
cl = &svs.clients[i];
if (cl->state == CS_FREE) {
newcl = cl;
break;
}
}
if ( !newcl ) {
NET_OutOfBandPrint( NS_SERVER, from, "print\nServer is full.\n" );
Com_DPrintf ("Rejected a connection.\n");
return;
}
gotnewcl:
// build a new connection
// accept the new client
// this is the only place a client_t is ever initialized
*newcl = temp;
clientNum = newcl - svs.clients;
ent = SV_GentityNum( clientNum );
newcl->gentity = ent;
// save the address
Netchan_Setup (NS_SERVER, &newcl->netchan , from, qport);
// save the userinfo
Q_strncpyz( newcl->userinfo, userinfo, sizeof(newcl->userinfo) );
// get the game a chance to reject this connection or modify the userinfo
//.........这里部分代码省略.........