本文整理汇总了C++中G_LogPrintf函数的典型用法代码示例。如果您正苦于以下问题:C++ G_LogPrintf函数的具体用法?C++ G_LogPrintf怎么用?C++ G_LogPrintf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了G_LogPrintf函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Touch_Item
/*
===============
Touch_Item
===============
*/
void Touch_Item( gentity_t *ent, gentity_t *other, trace_t *trace ) {
int respawn;
int makenoise = EV_ITEM_PICKUP;
// only activated items can be picked up
if ( !ent->active ) {
return;
} else {
// need to set active to false if player is maxed out
ent->active = qfalse;
}
if ( !other->client ) {
return;
}
if ( other->health < 1 ) {
return; // dead people can't pickup
}
// the same pickup rules are used for client side and server side
if ( !BG_CanItemBeGrabbed( &ent->s, &other->client->ps ) ) {
return;
}
G_LogPrintf( "Item: %i %s\n", other->s.number, ent->item->classname );
// call the item-specific pickup function
switch ( ent->item->giType ) {
case IT_WEAPON:
respawn = Pickup_Weapon( ent, other );
break;
case IT_AMMO:
respawn = Pickup_Ammo( ent, other );
break;
case IT_ARMOR:
respawn = Pickup_Armor( ent, other );
break;
case IT_HEALTH:
respawn = Pickup_Health( ent, other );
break;
case IT_POWERUP:
respawn = Pickup_Powerup( ent, other );
break;
case IT_TEAM:
respawn = Pickup_Team( ent, other );
break;
case IT_HOLDABLE:
respawn = Pickup_Holdable( ent, other );
break;
case IT_KEY:
respawn = Pickup_Key( ent, other );
break;
case IT_TREASURE:
respawn = Pickup_Treasure( ent, other );
break;
case IT_CLIPBOARD:
respawn = Pickup_Clipboard( ent, other );
// send the event to the client to request that the UI draw a popup
// (specified by the configstring in ent->s.density).
//G_AddEvent( other, EV_POPUP, ent->s.density);
//if(ent->key)
//G_AddEvent( other, EV_GIVEPAGE, ent->key );
break;
default:
return;
}
if ( !respawn ) {
return;
}
// play sounds
if ( ent->noise_index ) {
// (SA) a sound was specified in the entity, so play that sound
// (this G_AddEvent) and send the pickup as "EV_ITEM_PICKUP_QUIET"
// so it doesn't make the default pickup sound when the pickup event is recieved
makenoise = EV_ITEM_PICKUP_QUIET;
G_AddEvent( other, EV_GENERAL_SOUND, ent->noise_index );
}
// send the pickup event
if ( other->client->pers.predictItemPickup ) {
G_AddPredictableEvent( other, makenoise, ent->s.modelindex );
} else {
G_AddEvent( other, makenoise, ent->s.modelindex );
}
// powerup pickups are global broadcasts
if ( ent->item->giType == IT_POWERUP || ent->item->giType == IT_TEAM ) {
// (SA) probably need to check for IT_KEY here too... (coop?)
gentity_t *te;
te = G_TempEntity( ent->s.pos.trBase, EV_GLOBAL_ITEM_PICKUP );
te->s.eventParm = ent->s.modelindex;
//.........这里部分代码省略.........
示例2: CheckTournament
/*
=============
CheckTournament
Once a frame, check for changes in tournement player state
=============
*/
void CheckTournament( void ) {
// check because we run 3 game frames before calling Connect and/or ClientBegin
// for clients on a map_restart
if ( level.numPlayingClients == 0 ) {
return;
}
if ( g_gametype.integer == GT_TOURNAMENT ) {
// pull in a spectator if needed
if ( level.numPlayingClients < 2 ) {
AddTournamentPlayer();
}
// if we don't have two players, go back to "waiting for players"
if ( level.numPlayingClients != 2 ) {
if ( level.warmupTime != -1 ) {
level.warmupTime = -1;
trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
G_LogPrintf( "Warmup:\n" );
}
return;
}
if ( level.warmupTime == 0 ) {
return;
}
// if the warmup is changed at the console, restart it
if ( g_warmup.modificationCount != level.warmupModificationCount ) {
level.warmupModificationCount = g_warmup.modificationCount;
level.warmupTime = -1;
}
// if all players have arrived, start the countdown
if ( level.warmupTime < 0 ) {
if ( level.numPlayingClients == 2 ) {
// fudge by -1 to account for extra delays
if ( g_warmup.integer > 1 ) {
level.warmupTime = level.time + ( g_warmup.integer - 1 ) * 1000;
} else {
level.warmupTime = 0;
}
trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
}
return;
}
// if the warmup time has counted down, restart
if ( level.time > level.warmupTime ) {
level.warmupTime += 10000;
trap_Cvar_Set( "g_restarted", "1" );
trap_SendConsoleCommand( EXEC_APPEND, "map_restart 0\n" );
level.restarted = qtrue;
return;
}
} else if ( g_gametype.integer != GT_SINGLE_PLAYER && level.warmupTime != 0 ) {
int counts[TEAM_NUM_TEAMS];
qboolean notEnough = qfalse;
if ( g_gametype.integer > GT_TEAM ) {
counts[TEAM_BLUE] = TeamCount( -1, TEAM_BLUE );
counts[TEAM_RED] = TeamCount( -1, TEAM_RED );
if (counts[TEAM_RED] < 1 || counts[TEAM_BLUE] < 1) {
notEnough = qtrue;
}
} else if ( level.numPlayingClients < 2 ) {
notEnough = qtrue;
}
if ( notEnough ) {
if ( level.warmupTime != -1 ) {
level.warmupTime = -1;
trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
G_LogPrintf( "Warmup:\n" );
}
return; // still waiting for team members
}
if ( level.warmupTime == 0 ) {
return;
}
// if the warmup is changed at the console, restart it
if ( g_warmup.modificationCount != level.warmupModificationCount ) {
level.warmupModificationCount = g_warmup.modificationCount;
level.warmupTime = -1;
}
// if all players have arrived, start the countdown
if ( level.warmupTime < 0 ) {
//.........这里部分代码省略.........
示例3: G_matchInfoDump
// Dumps end-of-match info
void G_matchInfoDump(unsigned int dwDumpType)
{
int i, ref;
gentity_t *ent;
gclient_t *cl;
for(i=0; i<level.numConnectedClients; i++ ) {
ref = level.sortedClients[i];
ent = &g_entities[ref];
cl = ent->client;
if(cl->pers.connected != CON_CONNECTED) continue;
if(dwDumpType == EOM_WEAPONSTATS) {
// forty - #607 - Merge in Density's damage received display code
// If client wants to write stats to a file, don't auto send this stuff
if(!(cl->pers.clientFlags & CGF_STATSDUMP)) {
if((cl->pers.autoaction & AA_STATSALL) || cl->pers.mvCount > 0) {
G_statsall_cmd(ent, 0, qfalse);
} else if(cl->sess.sessionTeam != TEAM_SPECTATOR) {
if(cl->pers.autoaction & AA_STATSTEAM) G_statsall_cmd(ent, cl->sess.sessionTeam, qfalse); // Currently broken.. need to support the overloading of dwCommandID
else CP(va("ws %s\n", G_createStats(ent, ent)));
} else if(cl->sess.spectatorState != SPECTATOR_FREE) {
int pid = cl->sess.spectatorClient;
if((cl->pers.autoaction & AA_STATSTEAM)) G_statsall_cmd(ent, level.clients[pid].sess.sessionTeam, qfalse); // Currently broken.. need to support the overloading of dwCommandID
else CP(va("ws %s\n", G_createStats(g_entities + pid, ent)));
}
}
// Log it
if(cl->sess.sessionTeam != TEAM_SPECTATOR) {
G_LogPrintf("WeaponStats: %s\n", G_createStats(ent, NULL));
}
} else if(dwDumpType == EOM_MATCHINFO) {
if(!(cl->pers.clientFlags & CGF_STATSDUMP)) G_printMatchInfo(ent);
if(g_gametype.integer == GT_WOLF_STOPWATCH) {
if(g_currentRound.integer == 1) { // We've already missed the switch
CP(va("print \">>> ^3Clock set to: %d:%02d\n\n\n\"",
g_nextTimeLimit.integer,
(int)(60.0 * (float)(g_nextTimeLimit.value - g_nextTimeLimit.integer))));
} else {
float val = (float)((level.timeCurrent - (level.startTime + level.time - level.intermissiontime)) / 60000.0);
if(val < g_timelimit.value) {
CP(va("print \">>> ^3Objective reached at %d:%02d (original: %d:%02d)\n\n\n\"",
(int)val,
(int)(60.0 * (val - (int)val)),
g_timelimit.integer,
(int)(60.0 * (float)(g_timelimit.value - g_timelimit.integer))));
} else {
CP(va("print \">>> ^3Objective NOT reached in time (%d:%02d)\n\n\n\"",
g_timelimit.integer,
(int)(60.0 * (float)(g_timelimit.value - g_timelimit.integer))));
}
}
}
}
}
}
示例4: G_Say
void G_Say( gentity_t *ent, gentity_t *target, int mode, const char *chatText ) {
int j;
gentity_t *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 );
// >>> FIX: For Nintendo Wii using devkitPPC / libogc
// Using renamed color constants:
//Com_sprintf (name, sizeof(name), "%s%c%c"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE );
//color = COLOR_GREEN;
Com_sprintf (name, sizeof(name), "%s%c%c"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, Q_COLOR_WHITE );
color = Q_COLOR_GREEN;
// <<< FIX
break;
case SAY_TEAM:
G_LogPrintf( "sayteam: %s: %s\n", ent->client->pers.netname, chatText );
if (Team_GetLocationMsg(ent, location, sizeof(location)))
Com_sprintf (name, sizeof(name), EC"(%s%c%c"EC") (%s)"EC": ",
// >>> FIX: For Nintendo Wii using devkitPPC / libogc
// Using renamed color constants:
//ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE, location);
ent->client->pers.netname, Q_COLOR_ESCAPE, Q_COLOR_WHITE, location);
// <<< FIX
else
Com_sprintf (name, sizeof(name), EC"(%s%c%c"EC")"EC": ",
// >>> FIX: For Nintendo Wii using devkitPPC / libogc
// Using renamed color constants:
// ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE );
//color = COLOR_CYAN;
ent->client->pers.netname, Q_COLOR_ESCAPE, Q_COLOR_WHITE );
color = Q_COLOR_CYAN;
// <<< FIX
break;
case SAY_TELL:
if (target && g_gametype.integer >= GT_TEAM &&
target->client->sess.sessionTeam == ent->client->sess.sessionTeam &&
Team_GetLocationMsg(ent, location, sizeof(location)))
// >>> FIX: For Nintendo Wii using devkitPPC / libogc
// Using renamed color constants:
// Com_sprintf (name, sizeof(name), EC"[%s%c%c"EC"] (%s)"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE, location );
//else
// Com_sprintf (name, sizeof(name), EC"[%s%c%c"EC"]"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE );
//color = COLOR_MAGENTA;
Com_sprintf (name, sizeof(name), EC"[%s%c%c"EC"] (%s)"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, Q_COLOR_WHITE, location );
else
Com_sprintf (name, sizeof(name), EC"[%s%c%c"EC"]"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, Q_COLOR_WHITE );
color = Q_COLOR_MAGENTA;
// <<< FIX
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 );
}
}
示例5: player_die
void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) {
gentity_t *ent;
// TTimo might be used uninitialized
int contents = 0;
int killer;
int i;
char *killerName, *obit;
qboolean nogib = qtrue;
gitem_t *item = NULL; // JPW NERVE for flag drop
vec3_t launchvel,launchspot; // JPW NERVE
gentity_t *flag; // JPW NERVE
if ( self->client->ps.pm_type == PM_DEAD ) {
return;
}
if ( level.intermissiontime ) {
return;
}
self->client->ps.pm_type = PM_DEAD;
G_AddEvent( self, EV_STOPSTREAMINGSOUND, 0 );
if ( attacker ) {
killer = attacker->s.number;
if ( attacker->client ) {
killerName = attacker->client->pers.netname;
} else {
killerName = "<non-client>";
}
} else {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if ( killer < 0 || killer >= MAX_CLIENTS ) {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if ( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) ) {
obit = "<bad obituary>";
} else {
obit = modNames[ meansOfDeath ];
}
G_LogPrintf( "Kill: %i %i %i: %s killed %s by %s\n",
killer, self->s.number, meansOfDeath, killerName,
self->client->pers.netname, obit );
// broadcast the death event to everyone
ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY );
ent->s.eventParm = meansOfDeath;
ent->s.otherEntityNum = self->s.number;
ent->s.otherEntityNum2 = killer;
ent->r.svFlags = SVF_BROADCAST; // send to everyone
self->enemy = attacker;
self->client->ps.persistant[PERS_KILLED]++;
// JPW NERVE -- if player is holding ticking grenade, drop it
if ( g_gametype.integer != GT_SINGLE_PLAYER ) {
if ( ( self->client->ps.grenadeTimeLeft ) && ( self->s.weapon != WP_DYNAMITE ) ) {
launchvel[0] = crandom();
launchvel[1] = crandom();
launchvel[2] = random();
VectorScale( launchvel, 160, launchvel );
VectorCopy( self->r.currentOrigin, launchspot );
launchspot[2] += 40;
fire_grenade( self, launchspot, launchvel, self->s.weapon );
}
}
// jpw
if ( attacker && attacker->client ) {
if ( attacker == self || OnSameTeam( self, attacker ) ) {
// DHM - Nerve :: Complaint lodging
if ( attacker != self && level.warmupTime <= 0 ) {
if ( attacker->client->pers.localClient ) {
trap_SendServerCommand( self - g_entities, "complaint -4" );
} else {
trap_SendServerCommand( self - g_entities, va( "complaint %i", attacker->s.number ) );
self->client->pers.complaintClient = attacker->s.clientNum;
self->client->pers.complaintEndTime = level.time + 20500;
}
}
// dhm
// JPW NERVE
if ( g_gametype.integer >= GT_WOLF ) { // high penalty to offset medic heal
AddScore( attacker, WOLF_FRIENDLY_PENALTY );
} else {
// jpw
AddScore( attacker, -1 );
}
} else {
//.........这里部分代码省略.........
示例6: player_die
/*
==================
player_die
==================
*/
void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) {
gentity_t *ent;
int anim;
int contents;
int killer;
int i;
const char *killerName, *obit;
if ( self->client->ps.pm_type == PM_DEAD ) {
return;
}
if ( level.intermissiontime ) {
return;
}
// check for an almost capture
CheckAlmostCapture( self, attacker );
// check for a player that almost brought in cubes
CheckAlmostScored( self, attacker );
if (self->client && self->client->hook) {
Weapon_HookFree(self->client->hook);
}
#ifdef MISSIONPACK
if ((self->client->ps.eFlags & EF_TICKING) && self->activator) {
self->client->ps.eFlags &= ~EF_TICKING;
self->activator->think = G_FreeEntity;
self->activator->nextthink = level.time;
}
#endif
self->client->ps.pm_type = PM_DEAD;
if ( attacker ) {
killer = attacker->s.number;
if ( attacker->client ) {
killerName = attacker->client->pers.netname;
} else {
killerName = "<non-client>";
}
} else {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if ( killer < 0 || killer >= MAX_CLIENTS ) {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if ( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) ) {
obit = "<bad obituary>";
} else {
obit = modNames[ meansOfDeath ];
}
G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n",
killer, self->s.number, meansOfDeath, killerName,
self->client->pers.netname, obit );
// broadcast the death event to everyone
ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY );
ent->s.eventParm = meansOfDeath;
ent->s.otherEntityNum = self->s.number;
ent->s.otherEntityNum2 = killer;
ent->r.svFlags = SVF_BROADCAST; // send to everyone
self->enemy = attacker;
self->client->ps.persistant[PERS_KILLED]++;
if (attacker && attacker->client) {
attacker->client->lastkilled_client = self->s.number;
if ( attacker == self || OnSameTeam (self, attacker ) ) {
AddScore( attacker, self->r.currentOrigin, -1 );
} else {
AddScore( attacker, self->r.currentOrigin, 1 );
if( meansOfDeath == MOD_GAUNTLET ) {
// play humiliation on player
attacker->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++;
// add the sprite over the player's head
attacker->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP );
attacker->client->ps.eFlags |= EF_AWARD_GAUNTLET;
attacker->client->rewardTime = level.time + REWARD_SPRITE_TIME;
// also play humiliation on target
self->client->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_GAUNTLETREWARD;
}
// check for two kills in a short amount of time
// if this is close enough to the last kill, give a reward sound
//.........这里部分代码省略.........
示例7: player_die
/*
==================
player_die
==================
*/
void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath )
{
gentity_t *ent;
int anim;
int killer;
int i, j;
char *killerName, *obit;
float totalTK = 0;
float totalDamage = 0.0f;
float percentDamage = 0.0f;
gentity_t *player;
qboolean tk = qfalse;
if( self->client->ps.pm_type == PM_DEAD )
return;
if( level.intermissiontime )
return;
self->client->ps.pm_type = PM_DEAD;
self->suicideTime = 0;
if( attacker )
{
killer = attacker->s.number;
if( attacker->client )
{
killerName = attacker->client->pers.netname;
tk = ( attacker != self && attacker->client->ps.stats[ STAT_PTEAM ]
== self->client->ps.stats[ STAT_PTEAM ] );
if( attacker != self && attacker->client->ps.stats[ STAT_PTEAM ] == self->client->ps.stats[ STAT_PTEAM ] )
{
attacker->client->pers.statscounters.teamkills++;
if( attacker->client->pers.teamSelection == PTE_ALIENS )
{
level.alienStatsCounters.teamkills++;
}
else if( attacker->client->pers.teamSelection == PTE_HUMANS )
{
level.humanStatsCounters.teamkills++;
}
}
}
else
killerName = "<non-client>";
}
else
{
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if( killer < 0 || killer >= MAX_CLIENTS )
{
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) )
obit = "<bad obituary>";
else
obit = modNames[ meansOfDeath ];
G_LogPrintf("Kill: %i %i %i: %s^7 killed %s^7 by %s\n",
killer, self->s.number, meansOfDeath, killerName,
self->client->pers.netname, obit );
//TA: close any menus the client has open
G_CloseMenus( self->client->ps.clientNum );
//TA: deactivate all upgrades
for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
BG_DeactivateUpgrade( i, self->client->ps.stats );
if( meansOfDeath == MOD_SLAP )
{
trap_SendServerCommand( -1,
va( "print \"%s^7 felt %s^7's authority\n\"",
self->client->pers.netname, killerName ) );
goto finish_dying;
}
// broadcast the death event to everyone
if( !tk )
{
ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY );
ent->s.eventParm = meansOfDeath;
ent->s.otherEntityNum = self->s.number;
ent->s.otherEntityNum2 = killer;
ent->r.svFlags = SVF_BROADCAST; // send to everyone
//.........这里部分代码省略.........
示例8: G_LogWeaponOutput
void G_LogWeaponOutput(void)
{
#ifdef LOGGING_WEAPONS
int i,j,curwp;
float pershot;
fileHandle_t weaponfile;
char string[1024];
int totalpickups[WP_NUM_WEAPONS];
int totaltime[WP_NUM_WEAPONS];
int totaldeaths[WP_NUM_WEAPONS];
int totaldamageMOD[MOD_MAX];
int totalkillsMOD[MOD_MAX];
int totaldamage[WP_NUM_WEAPONS];
int totalkills[WP_NUM_WEAPONS];
int totalshots[WP_NUM_WEAPONS];
int percharacter[WP_NUM_WEAPONS];
char info[1024];
char mapname[128];
char *nameptr, *unknownname="<Unknown>";
if (!g_statLog.integer)
{
return;
}
G_LogPrintf("*****************************Weapon Log:\n" );
memset(totalpickups, 0, sizeof(totalpickups));
memset(totaltime, 0, sizeof(totaltime));
memset(totaldeaths, 0, sizeof(totaldeaths));
memset(totaldamageMOD, 0, sizeof(totaldamageMOD));
memset(totalkillsMOD, 0, sizeof(totalkillsMOD));
memset(totaldamage, 0, sizeof(totaldamage));
memset(totalkills, 0, sizeof(totalkills));
memset(totalshots, 0, sizeof(totalshots));
for (i=0; i<MAX_CLIENTS; i++)
{
if (G_WeaponLogClientTouch[i])
{ // Ignore any entity/clients we don't care about!
for (j=0;j<WP_NUM_WEAPONS;j++)
{
totalpickups[j] += G_WeaponLogPickups[i][j];
totaltime[j] += G_WeaponLogTime[i][j];
totaldeaths[j] += G_WeaponLogDeaths[i][j];
totalshots[j] += G_WeaponLogFired[i][j];
}
for (j=0;j<MOD_MAX;j++)
{
totaldamageMOD[j] += G_WeaponLogDamage[i][j];
totalkillsMOD[j] += G_WeaponLogKills[i][j];
}
}
}
// Now total the weapon data from the MOD data.
for (j=0; j<MOD_MAX; j++)
{
if (j <= MOD_SENTRY)
{
curwp = weaponFromMOD[j];
totaldamage[curwp] += totaldamageMOD[j];
totalkills[curwp] += totalkillsMOD[j];
}
}
G_LogPrintf( "\n****Data by Weapon:\n" );
for (j=0; j<WP_NUM_WEAPONS; j++)
{
G_LogPrintf("%15s: Pickups: %4d, Time: %5d, Deaths: %5d\n",
weaponNameFromIndex[j], totalpickups[j], (int)(totaltime[j]/1000), totaldeaths[j]);
}
G_LogPrintf( "\n****Combat Data by Weapon:\n" );
for (j=0; j<WP_NUM_WEAPONS; j++)
{
if (totalshots[j] > 0)
{
pershot = (float)(totaldamage[j])/(float)(totalshots[j]);
}
else
{
pershot = 0;
}
G_LogPrintf("%15s: Damage: %6d, Kills: %5d, Dmg per Shot: %f\n",
weaponNameFromIndex[j], totaldamage[j], totalkills[j], pershot);
}
G_LogPrintf( "\n****Combat Data By Damage Type:\n" );
for (j=0; j<MOD_MAX; j++)
{
G_LogPrintf("%25s: Damage: %6d, Kills: %5d\n",
modNames[j], totaldamageMOD[j], totalkillsMOD[j]);
}
G_LogPrintf("\n");
//.........这里部分代码省略.........
示例9: SP_worldspawn
void SP_worldspawn( void )
{
char *text, temp[32];
int i;
int lengthRed, lengthBlue, lengthGreen;
//I want to "cull" entities out of net sends to clients to reduce
//net traffic on our larger open maps -rww
G_SpawnFloat("distanceCull", "6000.0", &g_cullDistance);
trap_SetServerCull(g_cullDistance);
G_SpawnString( "classname", "", &text );
if ( Q_stricmp( text, "worldspawn" ) ) {
G_Error( "SP_worldspawn: The first entity isn't 'worldspawn'" );
}
for ( i = 0 ; i < level.numSpawnVars ; i++ )
{
if ( Q_stricmp( "spawnscript", level.spawnVars[i][0] ) == 0 )
{//ONly let them set spawnscript, we don't want them setting an angle or something on the world.
G_ParseField( level.spawnVars[i][0], level.spawnVars[i][1], &g_entities[ENTITYNUM_WORLD] );
}
}
//The server will precache the standard model and animations, so that there is no hit
//when the first client connnects.
if (!BGPAFtextLoaded)
{
BG_ParseAnimationFile("models/players/_humanoid/animation.cfg", bgHumanoidAnimations, qtrue);
}
if (!precachedKyle)
{
int defSkin;
trap_G2API_InitGhoul2Model(&precachedKyle, "models/players/kyle/model.glm", 0, 0, -20, 0, 0);
if (precachedKyle)
{
defSkin = trap_R_RegisterSkin("models/players/kyle/model_default.skin");
trap_G2API_SetSkin(precachedKyle, 0, defSkin, defSkin);
}
}
if (!g2SaberInstance)
{
trap_G2API_InitGhoul2Model(&g2SaberInstance, "models/weapons2/saber/saber_w.glm", 0, 0, -20, 0, 0);
if (g2SaberInstance)
{
// indicate we will be bolted to model 0 (ie the player) on bolt 0 (always the right hand) when we get copied
trap_G2API_SetBoltInfo(g2SaberInstance, 0, 0);
// now set up the gun bolt on it
trap_G2API_AddBolt(g2SaberInstance, 0, "*blade1");
}
}
if (g_gametype.integer == GT_SIEGE)
{ //a tad bit of a hack, but..
EWebPrecache();
}
// make some data visible to connecting client
trap_SetConfigstring( CS_GAME_VERSION, GAME_VERSION );
trap_SetConfigstring( CS_LEVEL_START_TIME, va("%i", level.startTime ) );
G_SpawnString( "music", "", &text );
trap_SetConfigstring( CS_MUSIC, text );
G_SpawnString( "message", "", &text );
trap_SetConfigstring( CS_MESSAGE, text ); // map specific message
trap_SetConfigstring( CS_MOTD, g_motd.string ); // message of the day
G_SpawnString( "gravity", "800", &text );
trap_Cvar_Set( "g_gravity", text );
G_SpawnString( "enableBreath", "0", &text );
trap_Cvar_Set( "g_enableBreath", text );
G_SpawnString( "soundSet", "default", &text );
trap_SetConfigstring( CS_GLOBAL_AMBIENT_SET, text );
g_entities[ENTITYNUM_WORLD].s.number = ENTITYNUM_WORLD;
g_entities[ENTITYNUM_WORLD].classname = "worldspawn";
// see if we want a warmup time
trap_SetConfigstring( CS_WARMUP, "" );
if ( g_restarted.integer ) {
trap_Cvar_Set( "g_restarted", "0" );
level.warmupTime = 0;
}
//Raz: Fix warmup
#if 0
/*
else if ( g_doWarmup.integer && g_gametype.integer != GT_DUEL && g_gametype.integer != GT_POWERDUEL ) { // Turn it on
else if ( g_doWarmup.integer && level.gametype != GT_DUEL && level.gametype != GT_POWERDUEL ) { // Turn it on
level.warmupTime = -1;
trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) );
G_LogPrintf( "Warmup:\n" );
//.........这里部分代码省略.........
示例10: ClientUserinfoChanged
//.........这里部分代码省略.........
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");
if(!*s || atoi(s) != 0)
{
client->pers.teamInfo = qtrue;
}
else
{
client->pers.teamInfo = qfalse;
}
}
#else
// teamInfo
s = Info_ValueForKey(userinfo, "teamoverlay");
if(!*s || atoi(s) != 0)
{
client->pers.teamInfo = qtrue;
}
else
{
client->pers.teamInfo = qfalse;
}
#endif
/*
s = Info_ValueForKey( userinfo, "cg_pmove_fixed" );
if ( !*s || atoi( s ) == 0 ) {
client->pers.pmoveFixed = qfalse;
}
else {
client->pers.pmoveFixed = qtrue;
}
*/
// 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;
// colors
strcpy(c1, Info_ValueForKey(userinfo, "color1"));
strcpy(c2, Info_ValueForKey(userinfo, "color2"));
strcpy(redTeam, Info_ValueForKey(userinfo, "g_redteam"));
strcpy(blueTeam, Info_ValueForKey(userinfo, "g_blueteam"));
// send over a subset of the userinfo keys so other clients can
// print scoreboards, display models, and play custom sounds
#if 0
if(ent->r.svFlags & SVF_BOT)
{
Com_sprintf(userinfo, sizeof(userinfo),
"n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\g_redteam\\%s\\g_blueteam\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\skill\\%s\\tt\\%d\\tl\\%d",
client->pers.netname, team, model, headModel, redTeam, blueTeam, c1, c2, client->pers.maxHealth,
client->sess.wins, client->sess.losses, Info_ValueForKey(userinfo, "skill"), teamTask, teamLeader);
}
else
#endif
{
Com_sprintf(userinfo, sizeof(userinfo),
"n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\g_redteam\\%s\\g_blueteam\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\tt\\%d\\tl\\%d",
client->pers.netname, team, model, "", redTeam, blueTeam, c1, c2, client->pers.maxHealth,
client->sess.wins, client->sess.losses, teamTask, teamLeader);
}
trap_SetConfigstring(CS_PLAYERS + clientNum, userinfo);
#ifdef G_LUA
// Lua API callbacks
// This only gets called when the ClientUserinfo is changed, replicating
// ETPro's behaviour.
G_LuaHook_ClientUserinfoChanged(clientNum);
#endif
// this is not the userinfo, more like the configstring actually
G_LogPrintf("ClientUserinfoChanged: %i %s\n", clientNum, s);
}
示例11: trap_GetUserinfo
//.........这里部分代码省略.........
// IP filtering
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=500
// recommanding PB based IP / GUID banning, the builtin system is pretty limited
// check to see if they are on the banned IP list
value = Info_ValueForKey(userinfo, "ip");
if(G_FilterPacket(value))
{
return "You are banned from this server.";
}
// we don't check password for bots and local client
// NOTE: local client <-> "ip" "localhost"
// this means this client is not running in our current process
if(!isBot && (strcmp(value, "localhost") != 0))
{
// check for a password
value = Info_ValueForKey(userinfo, "password");
if(g_password.string[0] && Q_stricmp(g_password.string, "none") && strcmp(g_password.string, value) != 0)
{
return "Invalid password";
}
}
#ifdef G_LUA
// Lua API callbacks (check with Lua scripts)
if(G_LuaHook_ClientConnect(clientNum, firstTime, isBot, reason))
{
return "Connection Rejected by lua module.";
}
#endif
// they can connect
ent->client = level.clients + clientNum;
client = ent->client;
// areabits = client->areabits;
memset(client, 0, sizeof(*client));
client->pers.connected = CON_CONNECTING;
// read or initialize the session data
if(firstTime || level.newSession)
{
G_InitSessionData(client, userinfo);
}
G_ReadSessionData(client);
// Tr3B: add SVF_CAPSULE to players so we can trace against the rotated capsules
// in the server entity tracing code SV_ClipToEntity
// FIXME UPDATE: this seems to break the box traces against the player capsules by entities like rockets
// it should be a bug in CM_TraceBoundingBoxThroughCapsule
//ent->r.svFlags |= SVF_CAPSULE;
if(isBot)
{
ent->r.svFlags |= SVF_BOT;
ent->inuse = qtrue;
#if defined(BRAINWORKS)
if(!G_BotConnect(clientNum, !firstTime))
{
return "BotConnectfailed";
}
#elif defined(ACEBOT)
if(!ACESP_BotConnect(clientNum, !firstTime))
{
return "BotConnectfailed";
}
#else
return "BotConnectfailed";
#endif
}
// get and distribute relevent paramters
G_LogPrintf("ClientConnect: %i\n", clientNum);
ClientUserinfoChanged(clientNum);
// don't do the "xxx connected" messages if they were caried over from previous level
if(firstTime)
{
trap_SendServerCommand(-1, va("print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname));
}
if(g_gametype.integer >= GT_TEAM && client->sess.sessionTeam != TEAM_SPECTATOR)
{
BroadcastTeamChange(client, -1);
}
// count current clients and rank for scoreboard
CalculateRanks();
// for statistics
// client->areabits = areabits;
// if ( !client->areabits )
// client->areabits = G_Alloc( (trap_AAS_PointReachabilityAreaIndex( NULL ) + 7) / 8 );
return NULL;
}
示例12: Touch_Item
/*
===============
Touch_Item
===============
*/
void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace)
{
int respawn;
qboolean predict;
if (!other->client)
return;
if (other->health < 1)
return; // dead people can't pickup
// the same pickup rules are used for client side and server side
if (!BG_CanItemBeGrabbed(g_gametype.integer, &ent->s, &other->client->ps, &level.InvasionInfo))
{
return;
}
G_LogPrintf("Item: %i %s\n", other->s.number, ent->item->classname);
predict = other->client->pers.predictItemPickup;
// call the item-specific pickup function
switch (ent->item->giType)
{
case IT_WEAPON:
respawn = Pickup_Weapon(ent, other);
// predict = qfalse;
break;
case IT_AMMO:
respawn = Pickup_Ammo(ent, other);
// predict = qfalse;
break;
case IT_ARMOR:
respawn = Pickup_Armor(ent, other);
break;
case IT_HEALTH:
respawn = Pickup_Health(ent, other);
break;
case IT_POWERUP:
respawn = Pickup_Powerup(ent, other);
predict = qfalse;
break;
#ifdef MISSIONPACK
case IT_PERSISTANT_POWERUP:
respawn = Pickup_PersistantPowerup(ent, other);
break;
#endif
case IT_TEAM:
respawn = Pickup_Team(ent, other);
break;
case IT_HOLDABLE:
respawn = Pickup_Holdable(ent, other);
break;
default:
return;
}
if (!respawn)
{
return;
}
// play the normal pickup sound
if (predict)
{
G_AddPredictableEvent(other, EV_ITEM_PICKUP, ent->s.modelindex);
}
else
{
G_AddEvent(other, EV_ITEM_PICKUP, ent->s.modelindex);
}
// powerup pickups are global broadcasts
if (ent->item->giType == IT_POWERUP || ent->item->giType == IT_TEAM)
{
// if we want the global sound to play
if (!ent->speed)
{
gentity_t *te;
te = G_TempEntity(ent->s.pos.trBase, EV_GLOBAL_ITEM_PICKUP);
te->s.eventParm = ent->s.modelindex;
te->r.svFlags |= SVF_BROADCAST;
}
else
{
gentity_t *te;
te = G_TempEntity(ent->s.pos.trBase, EV_GLOBAL_ITEM_PICKUP);
te->s.eventParm = ent->s.modelindex;
// only send this temp entity to a single client
te->r.svFlags |= SVF_SINGLECLIENT;
te->r.singleClient = other->s.number;
}
}
//.........这里部分代码省略.........
示例13: player_die
/*
==================
player_die
==================
*/
void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) {
static int rndAnim;
gentity_t *ent;
int anim;
int contents;
int killer;
int i;
char *killerName, *obit;
qboolean gibPlayer;
qboolean headshot = qfalse;
if ( self->player->ps.pm_type == PM_DEAD ) {
return;
}
if ( level.intermissiontime ) {
return;
}
// make sure the body shows up in the player's current position
G_UnTimeShiftClient( self );
// check for an almost capture
CheckAlmostCapture( self, attacker );
// check for a player that almost brought in cubes
CheckAlmostScored( self, attacker );
if (self->player && self->player->hook) {
Weapon_HookFree(self->player->hook);
}
#ifdef MISSIONPACK
if ((self->player->ps.eFlags & EF_TICKING) && self->activator) {
self->player->ps.eFlags &= ~EF_TICKING;
self->activator->think = G_FreeEntity;
self->activator->nextthink = level.time;
}
#endif
self->player->ps.pm_type = PM_DEAD;
if ( attacker ) {
killer = attacker->s.number;
if ( attacker->player ) {
killerName = attacker->player->pers.netname;
} else {
killerName = "<non-player>";
}
} else {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if ( killer < 0 || killer >= MAX_CLIENTS ) {
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if ( meansOfDeath < 0 || meansOfDeath >= ARRAY_LEN( modNames ) ) {
obit = "<bad obituary>";
} else {
obit = modNames[meansOfDeath];
}
G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n",
killer, self->s.number, meansOfDeath, killerName,
self->player->pers.netname, obit );
self->enemy = attacker;
self->player->ps.persistant[PERS_KILLED]++;
if (attacker && attacker->player) {
attacker->player->lastkilled_player = self->s.number;
if ( attacker == self || OnSameTeam (self, attacker ) ) {
if ( ((level.time - self->player->lasthurt_time) <= ASSISTED_SUICIDE_TIME) &&
g_entities[self->player->lasthurt_player2].player && (self->player->lasthurt_player2 != self->s.number) )
{
AddScore( &g_entities[self->player->lasthurt_player2], self->r.currentOrigin, 1 );
meansOfDeath = MOD_ASSISTED_SUICIDE;
} else AddScore( attacker, self->r.currentOrigin, -1 );
} else {
AddScore( attacker, self->r.currentOrigin, 1 );
if( meansOfDeath == MOD_GAUNTLET ) {
// play humiliation on player
attacker->player->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++;
// add the sprite over the player's head
attacker->player->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP );
attacker->player->ps.eFlags |= EF_AWARD_GAUNTLET;
attacker->player->rewardTime = level.time + REWARD_SPRITE_TIME;
// also play humiliation on target
self->player->ps.persistant[PERS_PLAYEREVENTS] ^= PLAYEREVENT_GAUNTLETREWARD;
//.........这里部分代码省略.........
示例14: trap_GetUserinfo
/*
===========
ClientConnect
Called when a player begins connecting to the server.
Called again for every map change or tournement restart.
The session information will be valid after exit.
Return NULL if the client should be allowed, otherwise return
a string with the reason for denial.
Otherwise, the client will be sent the current gamestate
and will eventually get to ClientBegin.
firstTime will be qtrue the very first time a client connects
to the server machine, but qfalse on map changes and tournement
restarts.
============
*/
char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) {
char *value;
// char *areabits;
gclient_t *client;
char userinfo[MAX_INFO_STRING];
gentity_t *ent;
ent = &g_entities[ clientNum ];
trap_GetUserinfo( clientNum, userinfo, sizeof( userinfo ) );
// IP filtering
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=500
// recommanding PB based IP / GUID banning, the builtin system is pretty limited
// check to see if they are on the banned IP list
value = Info_ValueForKey (userinfo, "ip");
if ( G_FilterPacket( value ) ) {
return "You are banned from this server.";
}
// we don't check password for bots and local client
// NOTE: local client <-> "ip" "localhost"
// this means this client is not running in our current process
if ( !isBot && (strcmp(value, "localhost") != 0)) {
// check for a password
value = Info_ValueForKey (userinfo, "password");
if ( g_password.string[0] && Q_stricmp( g_password.string, "none" ) &&
strcmp( g_password.string, value) != 0) {
return "Invalid password";
}
}
// they can connect
ent->client = level.clients + clientNum;
client = ent->client;
// areabits = client->areabits;
memset( client, 0, sizeof(*client) );
client->pers.connected = CON_CONNECTING;
// read or initialize the session data
if ( firstTime || level.newSession ) {
G_InitSessionData( client, userinfo );
}
G_ReadSessionData( client );
if( isBot ) {
ent->r.svFlags |= SVF_BOT;
ent->inuse = qtrue;
if( !G_BotConnect( clientNum, !firstTime ) ) {
return "BotConnectfailed";
}
}
// get and distribute relevent paramters
G_LogPrintf( "ClientConnect: %i\n", clientNum );
ClientUserinfoChanged( clientNum );
// don't do the "xxx connected" messages if they were caried over from previous level
if ( firstTime ) {
trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname) );
}
if ( g_gametype.integer >= GT_TEAM &&
client->sess.sessionTeam != TEAM_SPECTATOR ) {
BroadcastTeamChange( client, -1 );
}
// count current clients and rank for scoreboard
CalculateRanks();
// for statistics
// client->areabits = areabits;
// if ( !client->areabits )
// client->areabits = G_Alloc( (trap_AAS_PointReachabilityAreaIndex( NULL ) + 7) / 8 );
return NULL;
}
示例15: player_die
/*
==================
player_die
==================
*/
void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath )
{
gentity_t *ent;
int anim;
int killer;
int i;
char *killerName, *obit;
if( self->client->ps.pm_type == PM_DEAD )
return;
if( level.intermissiontime )
return;
self->client->ps.pm_type = PM_DEAD;
self->suicideTime = 0;
if( attacker )
{
killer = attacker->s.number;
if( attacker->client )
killerName = attacker->client->pers.netname;
else
killerName = "<world>";
}
else
{
killer = ENTITYNUM_WORLD;
killerName = "<world>";
}
if( meansOfDeath < 0 || meansOfDeath >= ARRAY_LEN( modNames ) )
// fall back on the number
obit = va( "%d", meansOfDeath );
else
obit = modNames[ meansOfDeath ];
G_LogPrintf( "Die: %d %d %s: %s" S_COLOR_WHITE " killed %s\n",
killer,
(int)( self - g_entities ),
obit,
killerName,
self->client->pers.netname );
// deactivate all upgrades
for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
BG_DeactivateUpgrade( i, self->client->ps.stats );
// broadcast the death event to everyone
ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY );
ent->s.eventParm = meansOfDeath;
ent->s.otherEntityNum = self->s.number;
ent->s.otherEntityNum2 = killer;
ent->r.svFlags = SVF_BROADCAST; // send to everyone
self->enemy = attacker;
self->client->ps.persistant[ PERS_KILLED ]++;
if( attacker && attacker->client )
{
attacker->client->lastkilled_client = self->s.number;
if( ( attacker == self || OnSameTeam( self, attacker ) ) && meansOfDeath != MOD_HSPAWN )
{
//punish team kills and suicides
if( attacker->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
{
G_AddCreditToClient( attacker->client, -ALIEN_TK_SUICIDE_PENALTY, qtrue );
AddScore( attacker, -ALIEN_TK_SUICIDE_PENALTY );
}
else if( attacker->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
{
G_AddCreditToClient( attacker->client, -HUMAN_TK_SUICIDE_PENALTY, qtrue );
AddScore( attacker, -HUMAN_TK_SUICIDE_PENALTY );
}
}
}
else if( attacker->s.eType != ET_BUILDABLE )
{
if( self->client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
AddScore( self, -ALIEN_TK_SUICIDE_PENALTY );
else if( self->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
AddScore( self, -HUMAN_TK_SUICIDE_PENALTY );
}
// give credits for killing this player
G_RewardAttackers( self );
ScoreboardMessage( self ); // show scores
// send updated scores to any clients that are following this one,
// or they would get stale scoreboards
for( i = 0 ; i < level.maxclients ; i++ )
{
//.........这里部分代码省略.........