本文整理汇总了C++中G_Printf函数的典型用法代码示例。如果您正苦于以下问题:C++ G_Printf函数的具体用法?C++ G_Printf怎么用?C++ G_Printf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了G_Printf函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: G_ParseMapRotationFile
/*
===============
G_ParseMapRotationFile
Load the map rotations from a map rotation file
===============
*/
static bool G_ParseMapRotationFile( const char *fileName )
{
char *text_p;
int i;
int len;
char *token;
char text[ 20000 ];
char mrName[ MAX_QPATH ];
bool mrNameSet = false;
fileHandle_t f;
// load the file
len = trap_FS_FOpenFile( fileName, &f, FS_READ );
if( len <= 0 )
return false;
if( len >= sizeof( text ) - 1 )
{
G_Printf( S_COLOR_RED "ERROR: map rotation file %s too long\n", fileName );
return false;
}
trap_FS_Read( text, len, f );
text[ len ] = 0;
trap_FS_FCloseFile( f );
// parse the text
text_p = text;
// read optional parameters
while( 1 )
{
token = COM_Parse( &text_p );
if( !token )
break;
if( !Q_stricmp( token, "" ) )
break;
if( !Q_stricmp( token, "{" ) )
{
if( mrNameSet )
{
//check for name space clashes
for( i = 0; i < mapRotations.numRotations; i++ )
{
if( !Q_stricmp( mapRotations.rotations[ i ].name, mrName ) )
{
G_Printf( S_COLOR_RED "ERROR: a map rotation is already named %s\n", mrName );
return false;
}
}
Q_strncpyz( mapRotations.rotations[ mapRotations.numRotations ].name, mrName, MAX_QPATH );
if( !G_ParseMapRotation( &mapRotations.rotations[ mapRotations.numRotations ], &text_p ) )
{
G_Printf( S_COLOR_RED "ERROR: %s: failed to parse map rotation %s\n", fileName, mrName );
return false;
}
//start parsing particle systems again
mrNameSet = false;
if( mapRotations.numRotations == MAX_MAP_ROTATIONS )
{
G_Printf( S_COLOR_RED "ERROR: maximum number of map rotations (%d) reached\n",
MAX_MAP_ROTATIONS );
return false;
}
else
mapRotations.numRotations++;
continue;
}
else
{
G_Printf( S_COLOR_RED "ERROR: unamed map rotation\n" );
return false;
}
}
if( !mrNameSet )
{
Q_strncpyz( mrName, token, sizeof( mrName ) );
mrNameSet = true;
}
else
{
G_Printf( S_COLOR_RED "ERROR: map rotation already named\n" );
return false;
}
//.........这里部分代码省略.........
示例2: Svcmd_EntityShow_f
/*
===================
Svcmd_EntityShow_f
===================
*/
void Svcmd_EntityShow_f( void )
{
int entityNum;
int lastTargetIndex, targetIndex;
gentity_t *selection;
gentity_t *possibleTarget = NULL;
char argument[ 6 ];
if (trap_Argc() != 2)
{
G_Printf("usage: entityShow <entityId>\n");
return;
}
trap_Argv( 1, argument, sizeof( argument ) );
entityNum = atoi( argument );
if (entityNum >= level.num_entities || entityNum < MAX_CLIENTS)
{
G_Printf("entityId %d is out of range\n", entityNum);
return;
}
selection = &g_entities[entityNum];
if (!selection->inuse)
{
G_Printf("entity slot %d is unused/free\n", entityNum);
return;
}
G_Printf( "⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼\n" );
G_Printf( S_COLOR_CYAN "#%3i" S_COLOR_WHITE ": %16s", entityNum, Com_EntityTypeName( selection->s.eType ) );
if (IS_NON_NULL_VEC3(selection->s.origin))
{
G_Printf("%26s", vtos( selection->s.origin ) );
}
G_Printf( "\n⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼\n" );
G_Printf( "Classname: " S_COLOR_CYAN "%s" S_COLOR_WHITE "\n", selection->classname );
G_Printf( "Capabilities:%s%s%s%s%s%s%s\n\n",
selection->act ? " acts" : "",
selection->think ? " thinks" : "",
selection->pain ? " pains" : "",
selection->die ? " dies" : "",
selection->reset ? " resets" : "",
selection->touch ? " touchable" : "",
selection->use ? " usable" : "");
if (selection->names[0])
{
G_Printf( "Names: ");
G_PrintEntityNameList( selection );
}
G_Printf("State: %s\n", selection->enabled ? "enabled" : "disabled");
if (selection->groupName)
{
G_Printf("Member of Group: %s%s\n", selection->groupName, !selection->groupMaster ? " [master]" : "");
}
G_Printf( "\n");
if(selection->targetCount)
{
G_Printf( "Aims at\n");
while ((possibleTarget = G_IterateTargets(possibleTarget, &targetIndex, selection)) != NULL )
{
G_Printf(" • %s %s\n", etos( possibleTarget ), vtos( possibleTarget->s.origin));
}
G_Printf( "\n");
}
if(selection->callTargetCount)
{
lastTargetIndex = -1;
while ((possibleTarget = G_IterateCallEndpoints(possibleTarget, &targetIndex, selection)) != NULL )
{
if(lastTargetIndex != targetIndex)
{
G_Printf("Calls %s \"%s:%s\"\n",
selection->calltargets[ targetIndex ].event ? selection->calltargets[ targetIndex ].event : "onUnknown",
selection->calltargets[ targetIndex ].name,
selection->calltargets[ targetIndex ].action ? selection->calltargets[ targetIndex ].action : "default");
lastTargetIndex = targetIndex;
}
G_Printf(" • %s", etos(possibleTarget));
if(possibleTarget->names[1])
{
G_Printf(" using \"%s\" ∈ ", selection->calltargets[ targetIndex ].name);
G_PrintEntityNameList( possibleTarget );
}
//.........这里部分代码省略.........
示例3: G_AddBot
/*
===============
G_AddBot
===============
*/
static void G_AddBot( const char *name, float skill, const char *team, int delay, char *altname) {
int clientNum;
char *botinfo;
char *key;
char *s;
char *botname;
char *model;
char *headmodel;
char userinfo[MAX_INFO_STRING];
// 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;
}
// get the botinfo from bots.txt
botinfo = G_GetBotInfoByName( name );
if ( !botinfo ) {
G_Printf( S_COLOR_RED "Error: Bot '%s' not defined\n", name );
trap->BotFreeClient( clientNum );
return;
}
// create the bot's userinfo
userinfo[0] = '\0';
botname = Info_ValueForKey( botinfo, "funname" );
if( !botname[0] ) {
botname = Info_ValueForKey( botinfo, "name" );
}
// check for an alternative name
if (altname && altname[0]) {
botname = altname;
}
Info_SetValueForKey( userinfo, "name", botname );
Info_SetValueForKey( userinfo, "rate", "25000" );
Info_SetValueForKey( userinfo, "snaps", "20" );
Info_SetValueForKey( userinfo, "skill", va("%.2f", skill) );
if ( skill >= 1 && skill < 2 ) {
Info_SetValueForKey( userinfo, "handicap", "50" );
}
else if ( skill >= 2 && skill < 3 ) {
Info_SetValueForKey( userinfo, "handicap", "70" );
}
else if ( skill >= 3 && skill < 4 ) {
Info_SetValueForKey( userinfo, "handicap", "90" );
}
key = "model";
model = Info_ValueForKey( botinfo, key );
if ( !*model ) {
model = "visor/default";
}
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->Print( S_COLOR_RED "Error: bot has no aifile specified\n" );
trap->BotFreeClient( clientNum );
//.........这里部分代码省略.........
示例4: G_ScriptAction_PlayAnim
/*
=================
G_ScriptAction_PlayAnim
syntax: playanim <startframe> <endframe> [looping <FOREVER/duration>] [rate <FPS>]
NOTE: all source animations must be at 20fps
=================
*/
qboolean G_ScriptAction_PlayAnim( gentity_t *ent, const char* params ) {
const char* pString;
char* token;
char tokens[2][MAX_QPATH];
int i, endtime = 0; // TTimo: init
qboolean looping = qfalse, forever = qfalse;
int startframe, endframe, idealframe;
int rate = 20;
if ( ( ent->scriptStatus.scriptFlags & SCFL_ANIMATING ) && ( ent->scriptStatus.scriptStackChangeTime == level.time ) ) {
// this is a new call, so cancel the previous animation
ent->scriptStatus.scriptFlags &= ~SCFL_ANIMATING;
}
pString = params;
for ( i = 0; i < 2; i++ ) {
token = COM_ParseExt( &pString, qfalse );
if ( !token || !token[0] ) {
G_Printf( "G_Scripting: syntax error\n\nplayanim <startframe> <endframe> [LOOPING <duration>]\n" );
return qtrue;
} else {
Q_strncpyz( tokens[i], token, sizeof( tokens[i] ) );
}
}
startframe = atoi( tokens[0] );
endframe = atoi( tokens[1] );
// check for optional parameters
token = COM_ParseExt( &pString, qfalse );
if ( token[0] ) {
if ( !Q_strcasecmp( token, "looping" ) ) {
looping = qtrue;
token = COM_ParseExt( &pString, qfalse );
if ( !token || !token[0] ) {
G_Printf( "G_Scripting: syntax error\n\nplayanim <startframe> <endframe> [LOOPING <duration>]\n" );
return qtrue;
}
if ( !Q_strcasecmp( token, "untilreachmarker" ) ) {
if ( level.time < ent->s.pos.trTime + ent->s.pos.trDuration ) {
endtime = level.time + 100;
} else {
endtime = 0;
}
} else if ( !Q_strcasecmp( token, "forever" ) ) {
ent->scriptStatus.animatingParams = params;
ent->scriptStatus.scriptFlags |= SCFL_ANIMATING;
endtime = level.time + 100; // we don't care when it ends, since we are going forever!
forever = qtrue;
} else {
endtime = ent->scriptStatus.scriptStackChangeTime + atoi( token );
}
token = COM_ParseExt( &pString, qfalse );
}
if ( token[0] && !Q_strcasecmp( token, "rate" ) ) {
token = COM_ParseExt( &pString, qfalse );
if ( !token[0] ) {
G_Error( "G_Scripting: playanim has RATE parameter without an actual rate specified" );
}
rate = atoi( token );
}
if ( !looping ) {
endtime = ent->scriptStatus.scriptStackChangeTime + ( ( endframe - startframe ) * ( 1000 / 20 ) );
}
}
idealframe = startframe + (int)c::floor( (float)( level.time - ent->scriptStatus.scriptStackChangeTime ) / ( 1000.0 / (float)rate ) );
if ( looping ) {
ent->s.frame = startframe + ( idealframe - startframe ) % ( endframe - startframe );
ent->s.eFlags |= EF_MOVER_ANIMATE;
} else {
if ( idealframe > endframe ) {
ent->s.frame = endframe;
ent->s.eFlags &= ~EF_MOVER_ANIMATE; // stop interpolation, since we have gone passed the endframe
} else {
ent->s.frame = idealframe;
ent->s.eFlags |= EF_MOVER_ANIMATE;
}
}
if ( forever ) {
ent->s.eFlags |= EF_MOVER_ANIMATE;
return qtrue; // continue to the next command
}
if ( endtime <= level.time ) {
//.........这里部分代码省略.........
示例5: G_AddBot
/*
===============
G_AddBot
===============
*/
static void G_AddBot( const char *name, float skill, const char *team, int delay, char *altname) {
int clientNum;
char *botinfo;
gentity_t *bot;
char *key;
char *s;
char *botname;
char *model;
// char *headmodel;
char userinfo[MAX_INFO_STRING];
// get the botinfo from bots.txt
botinfo = G_GetBotInfoByName( name );
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" );
}
// check for an alternative name
if (altname && altname[0]) {
botname = altname;
}
Info_SetValueForKey( userinfo, "name", botname );
Info_SetValueForKey( userinfo, "rate", "25000" );
Info_SetValueForKey( userinfo, "snaps", "20" );
Info_SetValueForKey( userinfo, "skill", va("%1.2f", skill) );
/*
if ( skill >= 1 && skill < 2 ) {
Info_SetValueForKey( userinfo, "handicap", "50" );
}
else if ( skill >= 2 && skill < 3 ) {
Info_SetValueForKey( userinfo, "handicap", "70" );
}
else if ( skill >= 3 && skill < 4 ) {
Info_SetValueForKey( userinfo, "handicap", "90" );
}
*/
key = "model";
model = Info_ValueForKey( botinfo, key );
if ( !*model ) {
model = "visor/default";
}
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, "personality");
if (!*s )
{
Info_SetValueForKey( userinfo, "personality", "botfiles/default.jkb" );
}
else
{
Info_SetValueForKey( userinfo, "personality", s );
}
//.........这里部分代码省略.........
示例6: ClientUserinfoChanged
/*
===========
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;
char *s;
char oldname[MAX_STRING_CHARS];
char userinfo[MAX_INFO_STRING];
gclient_t *client;
char *ip = NULL; // Nico, used to store client ip
char *rate = NULL; // Nico, used to store client rate
char *snaps = NULL; // Nico, used to store client snaps
char *name = NULL; // Nico, used to store client name
char oldAuthToken[MAX_QPATH]; // Nico, used to see if auth token was changed
ent = g_entities + clientNum;
client = ent->client;
client->ps.clientNum = clientNum;
// Nico, flood protection
if (ClientIsFlooding(ent)) {
G_LogPrintf("Dropping client %d: flooded userinfo\n", clientNum);
trap_DropClient(clientNum, "^1You were kicked because of flooded userinfo", 0);
return;
}
trap_GetUserinfo(clientNum, userinfo, sizeof (userinfo));
// Nico, perform security checks on userinfo string
if (!checkUserinfoString(clientNum, userinfo)) {
return;
}
if (g_developer.integer || *g_log.string || g_dedicated.integer) {
G_Printf("Userinfo: %s\n", userinfo);
}
// check for local client
ip = Info_ValueForKey(userinfo, "ip");
Q_strncpyz(client->pers.ip, ip, IP_MAX_LENGTH);
if (ip && !strcmp(ip, "localhost")) {
client->pers.localClient = qtrue;
level.fLocalHost = qtrue;
client->sess.referee = RL_REFEREE;
}
// Nico, store rate and snaps
rate = Info_ValueForKey(userinfo, "rate");
client->pers.rate = atoi(rate);
snaps = Info_ValueForKey(userinfo, "snaps");
client->pers.snaps = atoi(snaps);
// Nico, backup old auth token
Q_strncpyz(oldAuthToken, client->pers.authToken, sizeof (oldAuthToken));
s = Info_ValueForKey(userinfo, "cg_uinfo");
sscanf(s, "%i %i %i %i %s %i %i %i %i %i %i %i %i %i",
&client->pers.clientFlags,
&client->pers.clientTimeNudge,
&client->pers.clientMaxPackets,
// Nico, max FPS
&client->pers.maxFPS,
// Nico, auth Token
(char *)&client->pers.authToken,
// Nico, load view angles on load
&client->pers.loadViewAngles,
// Nico, load weapon on load
&client->pers.loadWeapon,
// Nico, load position when player dies
&client->pers.autoLoad,
// Nico, cgaz
&client->pers.cgaz,
// Nico, hideme
&client->pers.hideme,
// Nico, client auto demo record setting
&client->pers.autoDemo,
// Nico, automatically load checkpoints
&client->pers.autoLoadCheckpoints,
// Nico, persistant specLock
(int *)&client->sess.specLocked,
//.........这里部分代码省略.........
示例7: G_Spawn
static gentity_t *SpawnModelOnVictoryPad( gentity_t *pad, vec3_t offset, gentity_t *ent, int place ) {
gentity_t *body;
vec3_t vec;
vec3_t f, r, u;
body = G_Spawn();
if ( !body ) {
G_Printf( S_COLOR_RED "ERROR: out of gentities\n" );
return NULL;
}
body->classname = ent->client->pers.netname;
body->client = ent->client;
body->s = ent->s;
body->s.eType = ET_PLAYER; // could be ET_INVISIBLE
body->s.eFlags = 0; // clear EF_TALK, etc
body->s.powerups = 0; // clear powerups
body->s.loopSound = 0; // clear lava burning
body->s.number = body - g_entities;
body->timestamp = level.time;
body->physicsObject = qtrue;
body->physicsBounce = 0; // don't bounce
body->s.event = 0;
body->s.pos.trType = TR_STATIONARY;
body->s.groundEntityNum = ENTITYNUM_WORLD;
body->s.legsAnim = LEGS_IDLE;
body->s.torsoAnim = TORSO_STAND;
if( body->s.weapon == WP_NONE ) {
body->s.weapon = WP_MACHINEGUN;
}
if( body->s.weapon == WP_GAUNTLET) {
body->s.torsoAnim = TORSO_STAND2;
}
body->s.event = 0;
body->r.svFlags = ent->r.svFlags;
VectorCopy (ent->s.mins, body->s.mins);
VectorCopy (ent->s.maxs, body->s.maxs);
VectorCopy (ent->r.absmin, body->r.absmin);
VectorCopy (ent->r.absmax, body->r.absmax);
body->clipmask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP;
body->s.contents = CONTENTS_BODY;
body->r.ownerNum = ent->r.ownerNum;
body->takedamage = qfalse;
VectorSubtract( level.intermission_origin, pad->r.currentOrigin, vec );
vectoangles( vec, body->s.apos.trBase );
body->s.apos.trBase[PITCH] = 0;
body->s.apos.trBase[ROLL] = 0;
AngleVectors( body->s.apos.trBase, f, r, u );
VectorMA( pad->r.currentOrigin, offset[0], f, vec );
VectorMA( vec, offset[1], r, vec );
VectorMA( vec, offset[2], u, vec );
G_SetOrigin( body, vec );
trap_LinkEntity (body);
body->count = place;
return body;
}
示例8: 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)
{
//.........这里部分代码省略.........
示例9: indirect
//.........这里部分代码省略.........
G_AddEvent(targ, EV_POWERUP_BATTLESUIT, 0);
if ((dflags & DAMAGE_RADIUS) || (mod == MOD_FALLING)) {
return;
}
damage *= 0.5;
}
// add to the attacker's hit counter (if the target isn't a general entity like a prox mine)
if (attacker->client && client && targ != attacker && targ->health > 0 && targ->s.eType != ET_MISSILE && targ->s.eType != ET_GENERAL) {
if (OnSameTeam(targ, attacker)) {
attacker->client->ps.persistant[PERS_HITS]--;
} else {
attacker->client->ps.persistant[PERS_HITS]++;
}
attacker->client->ps.persistant[PERS_ATTACKEE_ARMOR] = (targ->health << 8)|(client->ps.stats[STAT_ARMOR]);
}
// always give half damage if hurting self, calculated after knockback, so rocket jumping works
if (targ == attacker) {
damage *= 0.5;
}
if (damage < 1) {
damage = 1;
}
take = damage;
// save some from armor
asave = CheckArmor(targ, take, dflags);
take -= asave;
if (g_debugDamage.integer) {
G_Printf("%i: client:%i health:%i damage:%i armor:%i\n", level.time, targ->s.number, targ->health, take, asave);
}
// add to the damage inflicted on a player this frame
// the total will be turned into screen blends and view angle kicks at the end of the frame
if (client) {
if (attacker) {
client->ps.persistant[PERS_ATTACKER] = attacker->s.number;
} else {
client->ps.persistant[PERS_ATTACKER] = ENTITYNUM_WORLD;
}
client->damage_armor += asave;
client->damage_blood += take;
client->damage_knockback += knockback;
if (dir) {
VectorCopy(dir, client->damage_from);
client->damage_fromWorld = qfalse;
} else {
VectorCopy(targ->r.currentOrigin, client->damage_from);
client->damage_fromWorld = qtrue;
}
}
// see if it's the player hurting the emeny flag carrier
#ifdef MISSIONPACK
if (g_gametype.integer == GT_CTF || g_gametype.integer == GT_1FCTF) {
#else
if (g_gametype.integer == GT_CTF) {
#endif
Team_CheckHurtCarrier(targ, attacker);
}
if (targ->client) {
示例10: Svcmd_GameMem_f
//KK-OAX This was moved from g_mem.c to keep functionality from being broken.
void Svcmd_GameMem_f( void ) {
int usedMem;
usedMem = POOLSIZE - freeMem;
G_Printf( "Game memory status: %i out of %i bytes allocated\n", usedMem, POOLSIZE );
}
示例11: G_SpawnBot
/*
==================
G_SpawnBot
==================
*/
void G_SpawnBot(const char *text)
{
// bot parameters
char name[MAX_TOKEN_CHARS] = "wolfBot";
//GS prevent bot health from counting down to 70 (i.e. don't set STAT_MAX_HEALTH = 70)
char skill[MAX_TOKEN_CHARS] = "4";
char team[MAX_TOKEN_CHARS] = "";
char pClass[MAX_TOKEN_CHARS] = "";
char pWeapon[MAX_TOKEN_CHARS] = "0";
char spawnPoint[MAX_TOKEN_CHARS] = "";
char respawn[MAX_TOKEN_CHARS] = "";
char scriptName[MAX_TOKEN_CHARS] = "wolfBot";
char characterFile[MAX_TOKEN_CHARS] = "";
// START - Mad Doc - TDF
char rank[MAX_TOKEN_CHARS] = "";
char botSkills[MAX_TOKEN_CHARS] = "";
// END Mad Doc - TDF
char pow[MAX_TOKEN_CHARS] = "no";
// This is the selection meny index used in SetWolfSpawnWeapons
int weaponSpawnNumber = -1;
// parsing vars
char *token, *pStr, *old_pStr;
char cmd[MAX_TOKEN_CHARS], last_cmd[MAX_TOKEN_CHARS];
char cmd_var[MAX_TOKEN_CHARS];
char string[MAX_TOKEN_CHARS];
int j, pClassInt;
int characterInt, rankNum;
int skills[SK_NUM_SKILLS];
qboolean prisonerOfWar;
int teamNum;
// parameters
spawnBotCommand_t params[] = {
{"/name", name, qfalse, "[name]"},
{"/skill", skill, qfalse, "[0-4]"},
{"/team", team, qfalse, "[AXIS/ALLIES]"},
{"/class", pClass, qfalse, "[SOLDIER/MEDIC/LIEUTENANT/ENGINEER/COVERTOPS/FIELDOPS]"}, // FIXME: remove LIEUTENANT from missionpack
{"/weapon", pWeapon, qfalse, "[weaponValue]"},
{"/spawnpoint", spawnPoint, qtrue, "[targetname]"},
{"/respawn", respawn, qfalse, "[ON/OFF]"},
{"/scriptName", scriptName, qfalse, "[scriptName]"},
{"/character", characterFile, qfalse, "[character]"},
// START Mad Doc - TDF
{"/rank", rank, qfalse, "[rank]"},
{"/skills", botSkills, qfalse, "[botskills]"}, // not really to be exposed to script
// END Mad Doc - TDF
{"/pow", pow, qfalse, "[yes/no]"},
{NULL}
};
// special tables
typedef struct
{
char *weapon;
int index;
} spawnBotWeapons_t;
// TAT 1/16/2003 - uninit'ed data here - getting crazy data for the skills
memset(&skills, 0, sizeof(skills));
//
// parse the vars
pStr = (char *)text;
token = COM_Parse(&pStr);
Q_strncpyz(cmd, token, sizeof(cmd));
// if this is a question mark, show help info
if(!Q_stricmp(cmd, "?") || !Q_stricmp(cmd, "/?"))
{
G_Printf
("Spawns a bot into the game, with the given parameters.\n\nSPAWNBOT [/param [value]] [/param [value]] ...\n\n where [/param [value]] may consist of:\n\n");
for(j = 0; params[j].cmd; j++)
{
G_Printf(" %s %s\n", params[j].cmd, params[j].help);
}
return;
}
//
// intitializations
for(j = 0; params[j].cmd; j++)
{
params[j].count = 0;
}
memset(last_cmd, 0, sizeof(last_cmd));
pStr = (char *)text;
//
// parse each command
while(cmd[0])
{
//.........这里部分代码省略.........
示例12: G_Say
void
G_Say(Gentity *ent, Gentity *target, int mode, const char *chatText)
{
int j;
Gentity *other;
int color;
char name[64];
/* don't let text be too long for malicious reasons */
char text[MAX_SAY_TEXT];
char location[64];
if(g_gametype.integer < GT_TEAM && mode == SAY_TEAM)
mode = SAY_ALL;
switch(mode){
default:
case SAY_ALL:
G_LogPrintf("say: %s: %s\n", ent->client->pers.netname, chatText);
Q_sprintf (name, sizeof(name), "%s%c%c"EC ": ",
ent->client->pers.netname, Q_COLOR_ESCAPE,
COLOR_WHITE);
color = COLOR_GREEN;
break;
case SAY_TEAM:
G_LogPrintf("sayteam: %s: %s\n", ent->client->pers.netname,
chatText);
if(Team_GetLocationMsg(ent, location, sizeof(location)))
Q_sprintf (name, sizeof(name),
EC "(%s%c%c"EC ") (%s)"EC ": ",
ent->client->pers.netname, Q_COLOR_ESCAPE,
COLOR_WHITE,
location);
else
Q_sprintf (name, sizeof(name),
EC "(%s%c%c"EC ")"EC ": ",
ent->client->pers.netname, Q_COLOR_ESCAPE,
COLOR_WHITE);
color = COLOR_CYAN;
break;
case SAY_TELL:
if(target && g_gametype.integer >= GT_TEAM &&
target->client->sess.team ==
ent->client->sess.team &&
Team_GetLocationMsg(ent, location, sizeof(location)))
Q_sprintf (name, sizeof(name),
EC "[%s%c%c"EC "] (%s)"EC ": ",
ent->client->pers.netname,
Q_COLOR_ESCAPE, COLOR_WHITE,
location);
else
Q_sprintf (name, sizeof(name),
EC "[%s%c%c"EC "]"EC ": ",
ent->client->pers.netname,
Q_COLOR_ESCAPE,
COLOR_WHITE);
color = COLOR_MAGENTA;
break;
}
Q_strncpyz(text, chatText, sizeof(text));
if(target){
G_SayTo(ent, target, mode, color, name, text);
return;
}
/* echo the text to the console */
if(g_dedicated.integer)
G_Printf("%s%s\n", name, text);
/* send it to all the apropriate clients */
for(j = 0; j < level.maxclients; j++){
other = &g_entities[j];
G_SayTo(ent, other, mode, color, name, text);
}
}
示例13: FinishSpawningItem
/*
================
FinishSpawningItem
Traces down to find where an item should rest, instead of letting them
free fall from their spawn points
================
*/
void FinishSpawningItem(gentity_t *ent)
{
trace_t tr;
vec3_t dest;
vec3_t maxs;
if (ent->spawnflags & 1) // suspended
{
VectorSet(ent->r.mins, -ITEM_RADIUS, -ITEM_RADIUS, -ITEM_RADIUS);
VectorSet(ent->r.maxs, ITEM_RADIUS, ITEM_RADIUS, ITEM_RADIUS);
VectorCopy(ent->r.maxs, maxs);
}
else
{
// had to modify this so that items would spawn in shelves
VectorSet(ent->r.mins, -ITEM_RADIUS, -ITEM_RADIUS, 0);
VectorSet(ent->r.maxs, ITEM_RADIUS, ITEM_RADIUS, ITEM_RADIUS);
VectorCopy(ent->r.maxs, maxs);
maxs[2] /= 2;
}
ent->r.contents = CONTENTS_TRIGGER | CONTENTS_ITEM;
ent->touch = Touch_Item_Auto;
ent->s.eType = ET_ITEM;
ent->s.modelindex = ent->item - bg_itemlist; // store item number in modelindex
ent->s.otherEntityNum2 = 0; // takes modelindex2's place in signaling a dropped item
// we don't use this (yet, anyway) so I'm taking it so you can specify a model for treasure items and clipboards
//ent->s.modelindex2 = 0; // zero indicates this isn't a dropped item
if (ent->model)
{
ent->s.modelindex2 = G_ModelIndex(ent->model);
}
// using an item causes it to respawn
ent->use = Use_Item;
// moved this up so it happens for suspended items too (and made it a function)
G_SetAngle(ent, ent->s.angles);
if (ent->spawnflags & 1) // suspended
{
G_SetOrigin(ent, ent->s.origin);
}
else
{
VectorSet(dest, ent->s.origin[0], ent->s.origin[1], ent->s.origin[2] - 4096);
trap_Trace(&tr, ent->s.origin, ent->r.mins, maxs, dest, ent->s.number, MASK_SOLID);
if (tr.startsolid)
{
vec3_t temp;
VectorCopy(ent->s.origin, temp);
temp[2] -= ITEM_RADIUS;
VectorSet(dest, ent->s.origin[0], ent->s.origin[1], ent->s.origin[2] - 4096);
trap_Trace(&tr, temp, ent->r.mins, maxs, dest, ent->s.number, MASK_SOLID);
}
if (tr.startsolid)
{
G_Printf("FinishSpawningItem: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin));
G_FreeEntity(ent);
return;
}
// allow to ride movers
ent->s.groundEntityNum = tr.entityNum;
G_SetOrigin(ent, tr.endpos);
}
if (ent->spawnflags & 2) // spin
{
ent->s.eFlags |= EF_SPINNING;
}
// team slaves and targeted items aren't present at start
if ((ent->flags & FL_TEAMSLAVE) || ent->targetname)
{
ent->flags |= FL_NODRAW;
//ent->s.eFlags |= EF_NODRAW;
ent->r.contents = 0;
return;
}
// health/ammo can potentially be multi-stage (multiple use)
if (ent->item->giType == IT_HEALTH || ent->item->giType == IT_AMMO)
{
int i;
//.........这里部分代码省略.........
示例14: G_ParseMapRotation
/*
===============
G_ParseMapRotation
Parse a map rotation section
===============
*/
static bool G_ParseMapRotation( mapRotation_t *mr, char **text_p )
{
char *token;
bool mnSet = false;
mapRotationEntry_t *mre = NULL;
mapRotationCondition_t *mrc;
// read optional parameters
while( 1 )
{
token = COM_Parse( text_p );
if( !token )
break;
if( !Q_stricmp( token, "" ) )
return false;
if( !Q_stricmp( token, "{" ) )
{
if( !mnSet )
{
G_Printf( S_COLOR_RED "ERROR: map settings section with no name\n" );
return false;
}
if( !G_ParseMapCommandSection( mre, text_p ) )
{
G_Printf( S_COLOR_RED "ERROR: failed to parse map command section\n" );
return false;
}
mnSet = false;
continue;
}
else if( !Q_stricmp( token, "goto" ) )
{
token = COM_Parse( text_p );
if( !token )
break;
mrc = &mre->conditions[ mre->numConditions ];
mrc->unconditional = true;
Q_strncpyz( mrc->dest, token, sizeof( mrc->dest ) );
if( mre->numConditions == MAX_MAP_ROTATION_CONDS )
{
G_Printf( S_COLOR_RED "ERROR: maximum number of conditions for one map (%d) reached\n",
MAX_MAP_ROTATION_CONDS );
return false;
}
else
mre->numConditions++;
continue;
}
else if( !Q_stricmp( token, "if" ) )
{
token = COM_Parse( text_p );
if( !token )
break;
mrc = &mre->conditions[ mre->numConditions ];
if( !Q_stricmp( token, "numClients" ) )
{
mrc->lhs = MCV_NUMCLIENTS;
token = COM_Parse( text_p );
if( !token )
break;
if( !Q_stricmp( token, "<" ) )
mrc->op = MCO_LT;
else if( !Q_stricmp( token, ">" ) )
mrc->op = MCO_GT;
else if( !Q_stricmp( token, "=" ) )
mrc->op = MCO_EQ;
else
{
G_Printf( S_COLOR_RED "ERROR: invalid operator in expression: %s\n", token );
return false;
}
token = COM_Parse( text_p );
if( !token )
break;
mrc->numClients = atoi( token );
//.........这里部分代码省略.........
示例15: Svcmd_EntityList_f
/*
===================
Svcmd_EntityList_f
===================
*/
void Svcmd_EntityList_f( void ) {
int e;
gentity_t *check;
check = g_entities + 1;
for ( e = 1; e < level.num_entities ; e++, check++ ) {
if ( !check->inuse ) {
continue;
}
G_Printf( "%3i:", e );
switch ( check->s.eType ) {
case ET_GENERAL:
G_Printf( "ET_GENERAL " );
break;
case ET_PLAYER:
G_Printf( "ET_PLAYER " );
break;
case ET_ITEM:
G_Printf( "ET_ITEM " );
break;
case ET_MISSILE:
G_Printf( "ET_MISSILE " );
break;
case ET_MOVER:
G_Printf( "ET_MOVER " );
break;
case ET_BEAM:
G_Printf( "ET_BEAM " );
break;
case ET_PORTAL:
G_Printf( "ET_PORTAL " );
break;
case ET_SPEAKER:
G_Printf( "ET_SPEAKER " );
break;
case ET_PUSH_TRIGGER:
G_Printf( "ET_PUSH_TRIGGER " );
break;
case ET_CONCUSSIVE_TRIGGER:
G_Printf( "ET_CONCUSSIVE_TRIGGR" );
break;
case ET_TELEPORT_TRIGGER:
G_Printf( "ET_TELEPORT_TRIGGER " );
break;
case ET_INVISIBLE:
G_Printf( "ET_INVISIBLE " );
break;
case ET_EXPLOSIVE:
G_Printf( "ET_EXPLOSIVE " );
break;
case ET_EF_SPOTLIGHT:
G_Printf( "ET_EF_SPOTLIGHT " );
break;
case ET_ALARMBOX:
G_Printf( "ET_ALARMBOX " );
break;
default:
G_Printf( "%3i ", check->s.eType );
break;
}
if ( check->classname ) {
G_Printf( "%s", check->classname );
}
G_Printf( "\n" );
}
}