本文整理汇总了C++中G_FreeEntity函数的典型用法代码示例。如果您正苦于以下问题:C++ G_FreeEntity函数的具体用法?C++ G_FreeEntity怎么用?C++ G_FreeEntity使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了G_FreeEntity函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SP_target_autosave
/*QUAKED target_autosave (1 1 0) (-8 -8 -8) (8 8 8)
saves game to 'autosave.sav' when triggered then dies.
*/
void SP_target_autosave(gentity_t *ent)
{
// ent->use = Use_Target_Autosave;
G_FreeEntity(ent);
}
示例2: Cmd_Give_f
/*
==================
Cmd_Give_f
Give items to a client
==================
*/
void Cmd_Give_f (gentity_t *ent)
{
char *name;
gitem_t *it;
int i;
qboolean give_all;
gentity_t *it_ent;
trace_t trace;
if ( !CheatsOk( ent ) ) {
return;
}
name = ConcatArgs( 1 );
if (Q_stricmp(name, "all") == 0)
give_all = qtrue;
else
give_all = qfalse;
if (give_all || Q_stricmp( name, "health") == 0)
{
ent->health = ent->client->ps.stats[STAT_MAX_HEALTH];
if (!give_all)
return;
}
if (give_all || Q_stricmp(name, "weapons") == 0)
{
ent->client->ps.stats[STAT_WEAPONS] = (1 << WP_NUM_WEAPONS) - 1 -
( 1 << WP_GRAPPLING_HOOK ) - ( 1 << WP_NONE );
if (!give_all)
return;
}
if (give_all || Q_stricmp(name, "ammo") == 0)
{
for ( i = 0 ; i < MAX_WEAPONS ; i++ ) {
ent->client->ps.ammo[i] = 999;
}
if (!give_all)
return;
}
if (give_all || Q_stricmp(name, "armor") == 0)
{
ent->client->ps.stats[STAT_ARMOR] = 200;
if (!give_all)
return;
}
if (Q_stricmp(name, "excellent") == 0) {
ent->client->ps.persistant[PERS_EXCELLENT_COUNT]++;
return;
}
if (Q_stricmp(name, "impressive") == 0) {
ent->client->ps.persistant[PERS_IMPRESSIVE_COUNT]++;
return;
}
if (Q_stricmp(name, "gauntletaward") == 0) {
ent->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++;
return;
}
if (Q_stricmp(name, "defend") == 0) {
ent->client->ps.persistant[PERS_DEFEND_COUNT]++;
return;
}
if (Q_stricmp(name, "assist") == 0) {
ent->client->ps.persistant[PERS_ASSIST_COUNT]++;
return;
}
// spawn a specific item right on the player
if ( !give_all ) {
it = BG_FindItem (name);
if (!it) {
return;
}
it_ent = G_Spawn();
VectorCopy( ent->r.currentOrigin, it_ent->s.origin );
it_ent->classname = it->classname;
G_SpawnItem (it_ent, it);
FinishSpawningItem(it_ent );
memset( &trace, 0, sizeof( trace ) );
Touch_Item (it_ent, ent, &trace);
if (it_ent->inuse) {
G_FreeEntity( it_ent );
}
}
}
示例3: G_RunItem
/**
* @brief Run item.
*/
void G_RunItem(gentity_t *ent)
{
vec3_t origin;
trace_t tr;
int contents;
int mask;
// if groundentity has been set to -1, it may have been pushed off an edge
if (ent->s.groundEntityNum == -1)
{
if (ent->s.pos.trType != TR_GRAVITY)
{
ent->s.pos.trType = TR_GRAVITY;
ent->s.pos.trTime = level.time;
}
}
if (ent->s.pos.trType == TR_STATIONARY || ent->s.pos.trType == TR_GRAVITY_PAUSED) // check think function
{
G_RunThink(ent);
return;
}
if (ent->s.pos.trType == TR_LINEAR && (!ent->clipmask && !ent->r.contents))
{
// check think function
G_RunThink(ent);
return;
}
// get current position
BG_EvaluateTrajectory(&ent->s.pos, level.time, origin, qfalse, ent->s.effect2Time);
// trace a line from the previous position to the current position
if (ent->clipmask)
{
mask = ent->clipmask;
}
else
{
mask = MASK_SOLID;
}
trap_Trace(&tr, ent->r.currentOrigin, ent->r.mins, ent->r.maxs, origin,
ent->r.ownerNum, mask);
if (ent->isProp && ent->takedamage)
{
G_RunItemProp(ent, origin);
}
VectorCopy(tr.endpos, ent->r.currentOrigin);
if (tr.startsolid)
{
tr.fraction = 0;
}
trap_LinkEntity(ent); // FIXME: avoid this for stationary?
// check think function
G_RunThink(ent);
if (tr.fraction == 1)
{
return;
}
// if it is in a nodrop volume, remove it
contents = trap_PointContents(ent->r.currentOrigin, -1);
if (contents & CONTENTS_NODROP)
{
if (ent->item && ent->item->giType == IT_TEAM)
{
Team_ReturnFlag(ent);
}
else
{
G_FreeEntity(ent);
}
return;
}
G_BounceItem(ent, &tr);
}
示例4: trigger_always_think
void trigger_always_think(gentity_t *ent)
{
G_UseTargets(ent, ent);
G_FreeEntity(ent);
}
示例5: Cmd_Give_f
//.........这里部分代码省略.........
ent->client->ps.inventory[INV_ELECTROBINOCULARS] = 1;
//ent->client->ps.inventory[INV_BACTA_CANISTER] = 5;
//ent->client->ps.inventory[INV_SEEKER] = 5;
ent->client->ps.inventory[INV_LIGHTAMP_GOGGLES] = 1;
//ent->client->ps.inventory[INV_SENTRY] = 5;
//ent->client->ps.inventory[INV_GOODIE_KEY] = 5;
//ent->client->ps.inventory[INV_SECURITY_KEY] = 5;
if (!give_all)
{
return;
}
}
*/
if (give_all || Q_stricmp(name, "weapons") == 0)
{
ent->client->ps.stats[STAT_WEAPONS] = (1 << (WP_MELEE)) - ( 1 << WP_NONE );
if (!give_all)
return;
}
if ( !give_all && Q_stricmp(gi.argv(1), "weaponnum") == 0 )
{
ent->client->ps.stats[STAT_WEAPONS] |= (1 << atoi(gi.argv(2)));
return;
}
if ( Q_stricmp(name, "eweaps") == 0) //for developing, gives you all the weapons, including enemy
{
ent->client->ps.stats[STAT_WEAPONS] = (unsigned)(1 << WP_NUM_WEAPONS) - ( 1 << WP_NONE ); // NOTE: this wasn't giving the last weapon in the list
if (!give_all)
return;
}
if (give_all || Q_stricmp(name, "ammo") == 0)
{
for ( i = 0 ; i < AMMO_MAX ; i++ ) {
ent->client->ps.ammo[i] = ammoData[i].max;
}
if (!give_all)
return;
}
if (give_all || Q_stricmp(gi.argv(1), "batteries") == 0)
{
if (gi.argc() == 3)
ent->client->ps.batteryCharge = atoi(gi.argv(2));
else
ent->client->ps.batteryCharge = MAX_BATTERIES;
if (!give_all)
return;
}
if (give_all || Q_stricmp(gi.argv(1), "armor") == 0)
{
if (gi.argc() == 3)
ent->client->ps.stats[STAT_ARMOR] = atoi(gi.argv(2));
else
ent->client->ps.stats[STAT_ARMOR] = ent->client->ps.stats[STAT_MAX_HEALTH];
if ( ent->client->ps.stats[STAT_ARMOR] > 0 )
{
ent->client->ps.powerups[PW_BATTLESUIT] = Q3_INFINITE;
}
else
{
ent->client->ps.powerups[PW_BATTLESUIT] = 0;
}
if (!give_all)
return;
}
// spawn a specific item right on the player
if ( !give_all ) {
gentity_t *it_ent;
trace_t trace;
it = FindItem (name);
if (!it) {
name = gi.argv(1);
it = FindItem (name);
if (!it) {
gi.SendServerCommand( ent-g_entities, "print \"unknown item\n\"");
return;
}
}
it_ent = G_Spawn();
VectorCopy( ent->currentOrigin, it_ent->s.origin );
it_ent->classname = G_NewString(it->classname);
G_SpawnItem (it_ent, it);
FinishSpawningItem(it_ent );
memset( &trace, 0, sizeof( trace ) );
Touch_Item (it_ent, ent, &trace);
if (it_ent->inuse) {
G_FreeEntity( it_ent );
}
}
}
示例6: IsLegShot
qboolean IsLegShot( gentity_t *targ, vec3_t dir, vec3_t point, int mod ) {
float height;
float theight;
gentity_t *leg;
if (!(targ->client))
return qfalse;
if (targ->health <= 0)
return qfalse;
if(!point) {
return qfalse;
}
if(!IsHeadShotWeapon(mod)) {
return qfalse;
}
leg = G_BuildLeg( targ );
if( leg ) {
gentity_t *traceEnt;
vec3_t start, end;
trace_t tr;
// trace another shot see if we hit the legs
VectorCopy( point, start );
VectorMA( start, 64, dir, end );
trap_Trace( &tr, start, NULL, NULL, end, targ->s.number, MASK_SHOT );
traceEnt = &g_entities[ tr.entityNum ];
if( g_debugBullets.integer >= 3 ) { // show hit player head bb
gentity_t *tent;
vec3_t b1, b2;
VectorCopy( leg->r.currentOrigin, b1 );
VectorCopy( leg->r.currentOrigin, b2 );
VectorAdd( b1, leg->r.mins, b1 );
VectorAdd( b2, leg->r.maxs, b2 );
tent = G_TempEntity( b1, EV_RAILTRAIL );
VectorCopy( b2, tent->s.origin2 );
tent->s.dmgFlags = 1;
// show headshot trace
// end the headshot trace at the head box if it hits
if( tr.fraction != 1 ) {
VectorMA( start, (tr.fraction * 64), dir, end );
}
tent = G_TempEntity( start, EV_RAILTRAIL );
VectorCopy( end, tent->s.origin2 );
tent->s.dmgFlags = 0;
}
G_FreeEntity( leg );
if( traceEnt == leg ) {
return qtrue;
}
} else {
height = point[2] - targ->r.absmin[2];
theight = targ->r.absmax[2] - targ->r.absmin[2];
if(height < (theight * 0.4f)) {
return qtrue;
}
}
return qfalse;
}
示例7: misc_model_breakable_die
//.........这里部分代码省略.........
scale = scale / numChunks;
if ( self->radius > 0.0f )
{
// designer wants to scale number of chunks, helpful because the above scale code is far from perfect
// I do this after the scale calculation because it seems that the chunk size generally seems to be very close, it's just the number of chunks is a bit weak
numChunks *= self->radius;
}
VectorAdd( self->absmax, self->absmin, dis );
VectorScale( dis, 0.5f, dis );
CG_Chunks( self->s.number, dis, dir, self->absmin, self->absmax, 300, numChunks, self->material, self->s.modelindex3, scale );
self->e_PainFunc = painF_NULL;
self->e_DieFunc = dieF_NULL;
// self->e_UseFunc = useF_NULL;
self->takedamage = qfalse;
if ( !(self->spawnflags & 4) )
{//We don't want to stay solid
self->s.solid = 0;
self->contents = 0;
self->clipmask = 0;
gi.linkentity(self);
}
VectorSet(up, 0, 0, 1);
if(self->target)
{
G_UseTargets(self, attacker);
}
if(inflictor->client)
{
VectorSubtract( self->currentOrigin, inflictor->currentOrigin, dir );
VectorNormalize( dir );
}
else
{
VectorCopy(up, dir);
}
if ( !(self->spawnflags & 2048) ) // NO_EXPLOSION
{
// Ok, we are allowed to explode, so do it now!
if(self->splashDamage > 0 && self->splashRadius > 0)
{//explode
vec3_t org;
AddSightEvent( attacker, self->currentOrigin, 256, AEL_DISCOVERED, 100 );
AddSoundEvent( attacker, self->currentOrigin, 128, AEL_DISCOVERED );
//FIXME: specify type of explosion? (barrel, electrical, etc.) Also, maybe just use the explosion effect below since it's
// a bit better?
// up the origin a little for the damage check, because several models have their origin on the ground, so they don't alwasy do damage, not the optimal solution...
VectorCopy( self->currentOrigin, org );
if ( self->mins[2] > -4 )
{//origin is going to be below it or very very low in the model
//center the origin
org[2] = self->currentOrigin[2] + self->mins[2] + (self->maxs[2] - self->mins[2])/2.0f;
}
G_RadiusDamage( org, self, self->splashDamage, self->splashRadius, self, MOD_UNKNOWN );
if ( self->model && Q_stricmp( "models/map_objects/ships/tie_fighter.md3", self->model ) == 0 )
{//TEMP HACK for Tie Fighters- they're HUGE
G_PlayEffect( "fighter_explosion2", self->currentOrigin );
G_Sound( self, G_SoundIndex( "sound/weapons/tie_fighter/TIEexplode.wav" ) );
}
else
{
CG_MiscModelExplosion( self->absmin, self->absmax, size, self->material );
G_Sound( self, G_SoundIndex("sound/weapons/explosions/cargoexplode.wav") );
}
}
else
{//just break
AddSightEvent( attacker, self->currentOrigin, 128, AEL_DISCOVERED );
AddSoundEvent( attacker, self->currentOrigin, 64, AEL_SUSPICIOUS );
// This is the default explosion
CG_MiscModelExplosion( self->absmin, self->absmax, size, self->material );
G_Sound(self, G_SoundIndex("sound/weapons/explosions/cargoexplode.wav"));
}
}
self->e_ThinkFunc = thinkF_NULL;
self->nextthink = -1;
if(self->s.modelindex2 != -1 && !(self->spawnflags & 8))
{//FIXME: modelindex doesn't get set to -1 if the damage model doesn't exist
self->svFlags |= SVF_BROKEN;
self->s.modelindex = self->s.modelindex2;
G_ActivateBehavior( self, BSET_DEATH );
}
else
{
G_FreeEntity( self );
}
}
示例8: G_MissileImpact
/*
================
G_MissileImpact
================
*/
void G_MissileImpact( gentity_t *ent, trace_t *trace )
{
gentity_t *other, *attacker;
qboolean returnAfterDamage = qfalse;
vec3_t dir;
other = &g_entities[ trace->entityNum ];
attacker = &g_entities[ ent->r.ownerNum ];
// check for bounce
if( !other->takedamage &&
( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) )
{
G_BounceMissile( ent, trace );
//only play a sound if requested
if( !( ent->s.eFlags & EF_NO_BOUNCE_SOUND ) )
G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );
return;
}
if( !strcmp( ent->classname, "grenade" ) )
{
//grenade doesn't explode on impact
G_BounceMissile( ent, trace );
//only play a sound if requested
if( !( ent->s.eFlags & EF_NO_BOUNCE_SOUND ) )
G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );
return;
}
else if( !strcmp( ent->classname, "lockblob" ) )
{
if( other->client && other->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
{
other->client->ps.stats[ STAT_STATE ] |= SS_BLOBLOCKED;
other->client->lastLockTime = level.time;
AngleVectors( other->client->ps.viewangles, dir, NULL, NULL );
other->client->ps.stats[ STAT_VIEWLOCK ] = DirToByte( dir );
}
}
else if( !strcmp( ent->classname, "slowblob" ) )
{
if( other->client && other->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
{
other->client->ps.stats[ STAT_STATE ] |= SS_SLOWLOCKED;
other->client->lastSlowTime = level.time;
AngleVectors( other->client->ps.viewangles, dir, NULL, NULL );
other->client->ps.stats[ STAT_VIEWLOCK ] = DirToByte( dir );
}
}
else if( !strcmp( ent->classname, "hive" ) )
{
if( other->s.eType == ET_BUILDABLE && other->s.modelindex == BA_A_HIVE )
{
if( !ent->parent )
G_Printf( S_COLOR_YELLOW "WARNING: hive entity has no parent in G_MissileImpact\n" );
else
ent->parent->active = qfalse;
G_FreeEntity( ent );
return;
}
else
{
//prevent collision with the client when returning
ent->r.ownerNum = other->s.number;
ent->think = G_ExplodeMissile;
ent->nextthink = level.time + FRAMETIME;
//only damage humans
if( other->client && other->client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
returnAfterDamage = qtrue;
else
return;
}
}
// impact damage
if( other->takedamage )
{
// FIXME: wrong damage direction?
if( ent->damage )
{
vec3_t velocity;
BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );
if( VectorLength( velocity ) == 0 )
velocity[ 2 ] = 1; // stepped on a grenade
G_Damage( other, ent, attacker, velocity, ent->s.origin, ent->damage,
//.........这里部分代码省略.........
示例9: G_RunMissile
/*
================
G_RunMissile
================
*/
void G_RunMissile( gentity_t *ent )
{
vec3_t origin;
trace_t tr;
int passent;
qboolean impact = qfalse;
// get current position
BG_EvaluateTrajectory( &ent->s.pos, level.time, origin );
// ignore interactions with the missile owner
passent = ent->r.ownerNum;
// general trace to see if we hit anything at all
trap_Trace( &tr, ent->r.currentOrigin, ent->r.mins, ent->r.maxs,
origin, passent, ent->clipmask );
if( tr.startsolid || tr.allsolid )
{
tr.fraction = 0.0f;
VectorCopy( ent->r.currentOrigin, tr.endpos );
}
if( tr.fraction < 1.0f )
{
if( !ent->pointAgainstWorld || tr.contents & CONTENTS_BODY )
{
// We hit an entity or we don't care
impact = qtrue;
}
else
{
trap_Trace( &tr, ent->r.currentOrigin, NULL, NULL, origin,
passent, ent->clipmask );
if( tr.fraction < 1.0f )
{
// Hit the world with point trace
impact = qtrue;
}
else
{
if( tr.contents & CONTENTS_BODY )
{
// Hit an entity
impact = qtrue;
}
else
{
trap_Trace( &tr, ent->r.currentOrigin, ent->r.mins, ent->r.maxs,
origin, passent, CONTENTS_BODY );
if( tr.fraction < 1.0f )
impact = qtrue;
}
}
}
}
VectorCopy( tr.endpos, ent->r.currentOrigin );
if( impact )
{
if( tr.surfaceFlags & SURF_NOIMPACT )
{
// Never explode or bounce on sky
G_FreeEntity( ent );
return;
}
G_MissileImpact( ent, &tr );
if( ent->s.eType != ET_MISSILE )
return; // exploded
}
ent->r.contents = CONTENTS_SOLID; //trick trap_LinkEntity into...
trap_LinkEntity( ent );
ent->r.contents = 0; //...encoding bbox information
// check think function after bouncing
G_RunThink( ent );
}
示例10: G_smvRunCamera
// Set up snapshot merge based on this portal
qboolean G_smvRunCamera( gentity_t *ent ) {
int id = ent->TargetFlag;
int chargeTime, sprintTime, hintTime, weapHeat;
playerState_t *tps, *ps;
// Opt out if not a real MV portal
if ( ent->tagParent == NULL || ent->tagParent->client == NULL ) {
return( qfalse );
}
if ( ( ps = &ent->tagParent->client->ps ) == NULL ) {
return( qfalse );
}
// If viewing client is no longer connected, delete this camera
if ( ent->tagParent->client->pers.connected != CON_CONNECTED ) {
G_FreeEntity( ent );
return( qtrue );
}
// Also remove if the target player is no longer in the game playing
if ( ent->target_ent->client->pers.connected != CON_CONNECTED ||
ent->target_ent->client->sess.sessionTeam == TEAM_SPECTATOR ) {
G_smvLocateEntityInMVList( ent->tagParent, ent->target_ent - g_entities, qtrue );
return( qtrue );
}
// Seems that depending on player's state, we pull from either r.currentOrigin, or s.origin
// if(!spec) then use: r.currentOrigin
// if(spec) then use: s.origin
//
// This is true for both the portal origin and its target (origin2)
//
VectorCopy( ent->tagParent->s.origin, ent->s.origin );
G_SetOrigin( ent, ent->s.origin );
VectorCopy( ent->target_ent->r.currentOrigin, ent->s.origin2 );
trap_LinkEntity( ent );
// Only allow client ids 0 to (MAX_MVCLIENTS-1) to be updated with extra info
if ( id >= MAX_MVCLIENTS ) {
return( qtrue );
}
tps = &ent->target_ent->client->ps;
if ( tps->stats[STAT_PLAYER_CLASS] == PC_ENGINEER ) {
chargeTime = g_engineerChargeTime.value;
} else if ( tps->stats[STAT_PLAYER_CLASS] == PC_MEDIC ) {
chargeTime = g_medicChargeTime.value;
} else if ( tps->stats[STAT_PLAYER_CLASS] == PC_FIELDOPS ) {
chargeTime = g_LTChargeTime.value;
} else if ( tps->stats[STAT_PLAYER_CLASS] == PC_COVERTOPS ) {
chargeTime = g_covertopsChargeTime.value;
} else { chargeTime = g_soldierChargeTime.value;}
chargeTime = ( level.time - tps->classWeaponTime >= (int)chargeTime ) ? 0 : ( 1 + floor( 15.0f * (float)( level.time - tps->classWeaponTime ) / chargeTime ) );
sprintTime = ( ent->target_ent->client->pmext.sprintTime >= 20000 ) ? 0.0f : ( 1 + floor( 7.0f * (float)ent->target_ent->client->pmext.sprintTime / 20000.0f ) );
weapHeat = floor( (float)tps->curWeapHeat * 15.0f / 255.0f );
hintTime = ( tps->serverCursorHint != HINT_BUILD && ( tps->serverCursorHintVal >= 255 || tps->serverCursorHintVal == 0 ) ) ?
0 : ( 1 + floor( 15.0f * (float)tps->serverCursorHintVal / 255.0f ) );
// (Remaining bits)
// ammo : 0
// ammo-1 : 0
// ammiclip : 0
// ammoclip-1: 16
id = MAX_WEAPONS - 1 - ( id * 2 );
if ( tps->pm_flags & PMF_LIMBO ) {
ps->ammo[id] = 0;
ps->ammo[id - 1] = 0;
ps->ammoclip[id - 1] = 0;
} else {
ps->ammo[id] = ( ( ( ent->target_ent->health > 0 ) ? ent->target_ent->health : 0 ) & 0xFF ); // Meds up to 140 :(
ps->ammo[id] |= ( hintTime & 0x0F ) << 8; // 4 bits for work on current item (dynamite, weapon repair, etc.)
ps->ammo[id] |= ( weapHeat & 0x0F ) << 12; // 4 bits for weapon heat info
ps->ammo[id - 1] = tps->ammo[BG_FindAmmoForWeapon( tps->weapon )] & 0x3FF; // 11 bits needed to cover 1500 Venom ammo
ps->ammo[id - 1] |= ( BG_simpleWeaponState( tps->weaponstate ) & 0x03 ) << 11; // 2 bits for current weapon state
ps->ammo[id - 1] |= ( ( tps->persistant[PERS_HWEAPON_USE] ) ? 1 : 0 ) << 13; // 1 bit for mg42 use
ps->ammo[id - 1] |= ( BG_simpleHintsCollapse( tps->serverCursorHint, hintTime ) & 0x03 ) << 14; // 2 bits for cursor hints
// G_Printf("tps->hint: %d, dr: %d, collapse: %d\n", tps->serverCursorHint, HINT_DOOR_ROTATING, G_simpleHintsCollapse(tps->serverCursorHint, hintTime));
ps->ammoclip[id - 1] = tps->ammoclip[BG_FindClipForWeapon( tps->weapon )] & 0x1FF; // 9 bits to cover 500 Venom ammo clip
ps->ammoclip[id - 1] |= ( chargeTime & 0x0F ) << 9; // 4 bits for weapon charge time
ps->ammoclip[id - 1] |= ( sprintTime & 0x07 ) << 13; // 3 bits for fatigue
}
return( qtrue );
}
示例11: trigger_concussive_dust
/*
QUAKED trigger_concussive_dust (.5 .5 .5) ?
Allows client side prediction of teleportation events.
Must point at a target_position, which will be the teleport destination.
*/
void SP_trigger_concussive_dust(gentity_t *self)
{
G_Printf("trigger_concussive_dust is obsolete, please delete it.\n");
G_FreeEntity(self);
}
示例12: FinishSpawningItem
void FinishSpawningItem( gentity_t *ent ) {
trace_t tr;
vec3_t dest;
gitem_t *item;
int itemNum;
itemNum=1;
for ( item = bg_itemlist + 1 ; item->classname ; item++,itemNum++)
{
if (!strcmp(item->classname,ent->classname))
{
break;
}
}
// Set bounding box for item
VectorSet( ent->mins, item->mins[0],item->mins[1] ,item->mins[2]);
VectorSet( ent->maxs, item->maxs[0],item->maxs[1] ,item->maxs[2]);
if ((!ent->mins[0] && !ent->mins[1] && !ent->mins[2]) &&
(!ent->maxs[0] && !ent->maxs[1] && !ent->maxs[2]))
{
VectorSet (ent->mins, -ITEM_RADIUS, -ITEM_RADIUS, -2);//to match the comments in the items.dat file!
VectorSet (ent->maxs, ITEM_RADIUS, ITEM_RADIUS, ITEM_RADIUS);
}
if ((item->quantity) && (item->giType == IT_AMMO))
{
ent->count = item->quantity;
}
if ((item->quantity) && (item->giType == IT_BATTERY))
{
ent->count = item->quantity;
}
// if ( item->giType == IT_WEAPON ) // NOTE: james thought it was ok to just always do this?
{
ent->s.radius = 20;
VectorSet( ent->s.modelScale, 1.0f, 1.0f, 1.0f );
gi.G2API_InitGhoul2Model( ent->ghoul2, ent->item->world_model, G_ModelIndex( ent->item->world_model ), NULL, NULL, 0, 0);
}
// Set crystal ammo amount based on skill level
/* if ((itemNum == ITM_AMMO_CRYSTAL_BORG) ||
(itemNum == ITM_AMMO_CRYSTAL_DN) ||
(itemNum == ITM_AMMO_CRYSTAL_FORGE) ||
(itemNum == ITM_AMMO_CRYSTAL_SCAVENGER) ||
(itemNum == ITM_AMMO_CRYSTAL_STASIS))
{
CrystalAmmoSettings(ent);
}
*/
ent->s.eType = ET_ITEM;
ent->s.modelindex = ent->item - bg_itemlist; // store item number in modelindex
ent->s.modelindex2 = 0; // zero indicates this isn't a dropped item
ent->contents = CONTENTS_TRIGGER|CONTENTS_ITEM;//CONTENTS_BODY;//CONTENTS_TRIGGER|
ent->e_TouchFunc = touchF_Touch_Item;
// useing an item causes it to respawn
ent->e_UseFunc = useF_Use_Item;
ent->svFlags |= SVF_PLAYER_USABLE;//so player can pick it up
// Hang in air?
ent->s.origin[2] += 1;//just to get it off the damn ground because coplanar = insolid
if ( ent->spawnflags & ITMSF_SUSPEND)
{
// suspended
G_SetOrigin( ent, ent->s.origin );
}
else
{
// drop to floor
VectorSet( dest, ent->s.origin[0], ent->s.origin[1], MIN_WORLD_COORD );
gi.trace( &tr, ent->s.origin, ent->mins, ent->maxs, dest, ent->s.number, MASK_SOLID|CONTENTS_PLAYERCLIP, G2_NOCOLLIDE, 0 );
if ( tr.startsolid )
{
if ( &g_entities[tr.entityNum] != NULL )
{
gi.Printf (S_COLOR_RED"FinishSpawningItem: removing %s startsolid at %s (in a %s)\n", ent->classname, vtos(ent->s.origin), g_entities[tr.entityNum].classname );
}
else
{
gi.Printf (S_COLOR_RED"FinishSpawningItem: removing %s startsolid at %s (in a %s)\n", ent->classname, vtos(ent->s.origin) );
}
assert( 0 && "item starting in solid");
#ifndef FINAL_BUILD
if (!g_entities[ENTITYNUM_WORLD].s.radius){ //not a region
delayedShutDown = level.time + 100;
}
#endif
G_FreeEntity( ent );
return;
}
// allow to ride movers
ent->s.groundEntityNum = tr.entityNum;
G_SetOrigin( ent, tr.endpos );
//.........这里部分代码省略.........
示例13: Touch_Item
//.........这里部分代码省略.........
if ( other->client->ps.eFlags&EF_FORCE_GRIPPED )
{//can't pick up anything while being gripped
return;
}
if ( PM_InKnockDown( &other->client->ps ) && !PM_InGetUp( &other->client->ps ) )
{//can't pick up while in a knockdown
return;
}
}
if (!ent->item) { //not an item!
gi.Printf( "Touch_Item: %s is not an item!\n", ent->classname);
return;
}
qboolean bHadWeapon = qfalse;
// call the item-specific pickup function
switch( ent->item->giType )
{
case IT_WEAPON:
if ( other->NPC && other->s.weapon == WP_NONE )
{//Make them duck and sit here for a few seconds
int pickUpTime = Q_irand( 1000, 3000 );
TIMER_Set( other, "duck", pickUpTime );
TIMER_Set( other, "roamTime", pickUpTime );
TIMER_Set( other, "stick", pickUpTime );
TIMER_Set( other, "verifyCP", pickUpTime );
TIMER_Set( other, "attackDelay", 600 );
respawn = 0;
}
if ( other->client->ps.stats[STAT_WEAPONS] & ( 1 << ent->item->giTag ) )
{
bHadWeapon = qtrue;
}
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_HOLDABLE:
respawn = Pickup_Holdable(ent, other);
break;
case IT_BATTERY:
respawn = Pickup_Battery( ent, other );
break;
case IT_HOLOCRON:
respawn = Pickup_Holocron( ent, other );
break;
default:
return;
}
if ( !respawn )
{
return;
}
// play the normal pickup sound
if ( !other->s.number && g_timescale->value < 1.0f )
{//SIGH... with timescale on, you lose events left and right
extern void CG_ItemPickup( int itemNum, qboolean bHadItem );
// but we're SP so we'll cheat
cgi_S_StartSound( NULL, other->s.number, CHAN_AUTO, cgi_S_RegisterSound( ent->item->pickup_sound ) );
// show icon and name on status bar
CG_ItemPickup( ent->s.modelindex, bHadWeapon );
}
else
{
if ( bHadWeapon )
{
G_AddEvent( other, EV_ITEM_PICKUP, -ent->s.modelindex );
}
else
{
G_AddEvent( other, EV_ITEM_PICKUP, ent->s.modelindex );
}
}
// fire item targets
G_UseTargets (ent, other);
// wait of -1 will not respawn
// if ( ent->wait == -1 )
{
//why not just remove me?
G_FreeEntity( ent );
/*
//NOTE: used to do this: (for respawning?)
ent->svFlags |= SVF_NOCLIENT;
ent->s.eFlags |= EF_NODRAW;
ent->contents = 0;
ent->unlinkAfterEvent = qtrue;
*/
return;
}
}
示例14: G_RunItem
//.........这里部分代码省略.........
ent->s.pos.trType = TR_GRAVITY;
ent->s.pos.trTime = level.time;
}
}
if ( ent->s.pos.trType == TR_STATIONARY )
{
// check think function
G_RunThink( ent );
if ( !g_gravity->value )
{
ent->s.pos.trType = TR_GRAVITY;
ent->s.pos.trTime = level.time;
ent->s.pos.trDelta[0] += crandom() * 40.0f; // I dunno, just do this??
ent->s.pos.trDelta[1] += crandom() * 40.0f;
ent->s.pos.trDelta[2] += random() * 20.0f;
}
return;
}
// get current position
EvaluateTrajectory( &ent->s.pos, level.time, origin );
// trace a line from the previous position to the current position
if ( ent->clipmask )
{
mask = ent->clipmask;
}
else
{
mask = MASK_SOLID|CONTENTS_PLAYERCLIP;//shouldn't be able to get anywhere player can't
}
int ignore = ENTITYNUM_NONE;
if ( ent->owner )
{
ignore = ent->owner->s.number;
}
else if ( ent->activator )
{
ignore = ent->activator->s.number;
}
gi.trace( &tr, ent->currentOrigin, ent->mins, ent->maxs, origin, ignore, mask, G2_NOCOLLIDE, 0 );
VectorCopy( tr.endpos, ent->currentOrigin );
if ( tr.startsolid )
{
tr.fraction = 0;
}
gi.linkentity( ent ); // FIXME: avoid this for stationary?
// check think function
G_RunThink( ent );
if ( tr.fraction == 1 )
{
if ( g_gravity->value <= 0 )
{
if ( ent->s.apos.trType != TR_LINEAR )
{
VectorCopy( ent->currentAngles, ent->s.apos.trBase );
ent->s.apos.trType = TR_LINEAR;
ent->s.apos.trDelta[1] = Q_flrand( -300, 300 );
ent->s.apos.trDelta[0] = Q_flrand( -10, 10 );
ent->s.apos.trDelta[2] = Q_flrand( -10, 10 );
ent->s.apos.trTime = level.time;
}
}
//friction in zero-G
if ( !g_gravity->value )
{
float friction = 0.975f;
/*friction -= ent->mass/1000.0f;
if ( friction < 0.1 )
{
friction = 0.1f;
}
*/
VectorScale( ent->s.pos.trDelta, friction, ent->s.pos.trDelta );
VectorCopy( ent->currentOrigin, ent->s.pos.trBase );
ent->s.pos.trTime = level.time;
}
return;
}
// if it is in a nodrop volume, remove it
contents = gi.pointcontents( ent->currentOrigin, -1 );
if ( contents & CONTENTS_NODROP )
{
G_FreeEntity( ent );
return;
}
if ( !tr.startsolid )
{
G_BounceItem( ent, &tr );
}
}
示例15: G_SpawnGEntityFromSpawnVars
/*
===================
G_SpawnGEntityFromSpawnVars
Spawn an entity and fill in all of the level fields from
level.spawnVars[], then call the class specfic spawn function
===================
*/
void G_SpawnGEntityFromSpawnVars( void ) {
int i;
gentity_t *ent;
char *s, *value, *gametypeName;
static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester"};
int spawnVarsOffset[MAX_SPAWN_VARS][2]; // key / value pairs offsets
// Convert to offsets.
for (i = 0; i < level.numSpawnVars; ++i) {
spawnVarsOffset[i][0] = level.spawnVars[i][0] - level.spawnVarChars;
spawnVarsOffset[i][1] = level.spawnVars[i][1] - level.spawnVarChars;
}
// Early out if spawn is not required.
if (!dmlab_update_spawn_vars(
level.spawnVarChars,
&level.numSpawnVarChars,
spawnVarsOffset,
&level.numSpawnVars)) {
return;
}
// Convert from offsets.
for (i = 0; i < level.numSpawnVars; ++i) {
level.spawnVars[i][0] = level.spawnVarChars + spawnVarsOffset[i][0];
level.spawnVars[i][1] = level.spawnVarChars + spawnVarsOffset[i][1];
}
// get the next free entity
ent = G_Spawn();
for ( i = 0 ; i < level.numSpawnVars ; i++ ) {
G_ParseField( level.spawnVars[i][0], level.spawnVars[i][1], ent );
}
// check for "notsingle" flag
if ( g_gametype.integer == GT_SINGLE_PLAYER ) {
G_SpawnInt( "notsingle", "0", &i );
if ( i ) {
ADJUST_AREAPORTAL();
G_FreeEntity( ent );
return;
}
}
// check for "notteam" flag (GT_FFA, GT_TOURNAMENT, GT_SINGLE_PLAYER)
if ( g_gametype.integer >= GT_TEAM ) {
G_SpawnInt( "notteam", "0", &i );
if ( i ) {
ADJUST_AREAPORTAL();
G_FreeEntity( ent );
return;
}
} else {
G_SpawnInt( "notfree", "0", &i );
if ( i ) {
ADJUST_AREAPORTAL();
G_FreeEntity( ent );
return;
}
}
#ifdef MISSIONPACK
G_SpawnInt( "notta", "0", &i );
if ( i ) {
ADJUST_AREAPORTAL();
G_FreeEntity( ent );
return;
}
#else
G_SpawnInt( "notq3a", "0", &i );
if ( i ) {
ADJUST_AREAPORTAL();
G_FreeEntity( ent );
return;
}
#endif
if( G_SpawnString( "gametype", NULL, &value ) ) {
if( g_gametype.integer >= GT_FFA && g_gametype.integer < GT_MAX_GAME_TYPE ) {
gametypeName = gametypeNames[g_gametype.integer];
s = strstr( value, gametypeName );
if( !s ) {
ADJUST_AREAPORTAL();
G_FreeEntity( ent );
return;
}
}
}
// move editor origin to pos
VectorCopy( ent->s.origin, ent->s.pos.trBase );
//.........这里部分代码省略.........