您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ BG_EvaluateTrajectoryDelta函数代码示例

51自学网 2021-06-01 19:49:49
  C++
这篇教程C++ BG_EvaluateTrajectoryDelta函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中BG_EvaluateTrajectoryDelta函数的典型用法代码示例。如果您正苦于以下问题:C++ BG_EvaluateTrajectoryDelta函数的具体用法?C++ BG_EvaluateTrajectoryDelta怎么用?C++ BG_EvaluateTrajectoryDelta使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了BG_EvaluateTrajectoryDelta函数的29个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: CG_ReflectVelocity

/*================CG_ReflectVelocity================*/void CG_ReflectVelocity( localEntity_t *le, trace_t *trace ) {	vec3_t	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = cg.time - cg.frametime + cg.frametime * trace->fraction;	BG_EvaluateTrajectoryDelta( &le->pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2*dot, trace->plane.normal, le->pos.trDelta );	VectorScale( le->pos.trDelta, le->bounceFactor, le->pos.trDelta );	VectorCopy( trace->endpos, le->pos.trBase );	le->pos.trTime = cg.time;	// check for stop, making sure that even on low FPS systems it doesn't bobble	if ( trace->allsolid || 		( trace->plane.normal[2] > 0 && 		( le->pos.trDelta[2] < 40 || le->pos.trDelta[2] < -cg.frametime * le->pos.trDelta[2] ) ) ) {		le->pos.trType = TR_STATIONARY;	} else {	}}
开发者ID:CaptainSkyhawk,项目名称:OpenJK-VR,代码行数:30,


示例2: CG_ReflectVelocity

/*================CG_ReflectVelocity================*/void CG_ReflectVelocity( localEntity_t *le, trace_t *trace ) {	bvec3_t	velocity;	bfixed	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = cg.time - cg.frametime + FIXED_TO_INT(MAKE_GFIXED(cg.frametime) * trace->fraction);	BG_EvaluateTrajectoryDelta( &le->pos, hitTime, velocity );	dot = FIXED_VEC3DOT( velocity, trace->plane.normal );	FIXED_VEC3MA_R( velocity, -BFIXED(2,0)*dot, trace->plane.normal, le->pos.trDelta );	FIXED_VEC3SCALE( le->pos.trDelta, le->bounceFactor, le->pos.trDelta );	VectorCopy( trace->endpos, le->pos.trBase );	le->pos.trTime = cg.time;	// check for stop, making sure that even on low FPS systems it doesn't bobble	if ( trace->allsolid || 		( trace->plane.normal[2] > AFIXED_0 && 		( le->pos.trDelta[2] < BFIXED(40,0) || le->pos.trDelta[2] < -MAKE_BFIXED(cg.frametime) * le->pos.trDelta[2] ) ) ) {		le->pos.trType = TR_STATIONARY;	} else {	}}
开发者ID:Jsoucek,项目名称:q3ce,代码行数:31,


示例3: G_PredictBounceMissile

/*================G_PredictBounceMissile================*/void G_PredictBounceMissile( gentity_t *ent, trajectory_t *pos, trace_t *trace, int time ) {	vec3_t velocity, origin;	float dot;	int hitTime;	BG_EvaluateTrajectory( pos, time, origin );	// reflect the velocity on the trace plane	hitTime = time;	BG_EvaluateTrajectoryDelta( pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2 * dot, trace->plane.normal, pos->trDelta );	if ( ent->s.eFlags & EF_BOUNCE_HALF ) {		if ( ent->s.eFlags & EF_BOUNCE ) {     // both flags marked, do a third type of bounce			VectorScale( pos->trDelta, 0.35, pos->trDelta );		} else {			VectorScale( pos->trDelta, 0.65, pos->trDelta );		}		// check for stop		if ( trace->plane.normal[2] > 0.2 && VectorLength( pos->trDelta ) < 40 ) {			VectorCopy( trace->endpos, pos->trBase );			return;		}	}	VectorAdd( origin, trace->plane.normal, pos->trBase );	pos->trTime = time;}
开发者ID:bibendovsky,项目名称:rtcw,代码行数:36,


示例4: G_BounceMissile

/*================G_BounceMissile================*/void G_BounceMissile( gentity_t *ent, trace_t *trace ){  vec3_t  velocity;  float dot;  int   hitTime;  // reflect the velocity on the trace plane  hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;  BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );  dot = DotProduct( velocity, trace->plane.normal );  VectorMA( velocity, -2 * dot, trace->plane.normal, ent->s.pos.trDelta );  if( ent->s.eFlags & EF_BOUNCE_HALF )  {    VectorScale( ent->s.pos.trDelta, 0.65, ent->s.pos.trDelta );    // check for stop    if( trace->plane.normal[ 2 ] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 )    {      G_SetOrigin( ent, trace->endpos );      return;    }  }  VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin );  VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );  ent->s.pos.trTime = level.time;}
开发者ID:aminehaddad,项目名称:tremulous-tremball,代码行数:33,


示例5: G_BounceMissile

/*================G_BounceMissile================*/void G_BounceMissile( gentity_t *ent, trace_t *trace ) {	vec3_t	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2*dot, trace->plane.normal, ent->s.pos.trDelta );	if ( ent->s.eFlags & EF_BOUNCE_HALF ) {#ifndef SMOKINGUNS		VectorScale( ent->s.pos.trDelta, 0.65, ent->s.pos.trDelta );#else		VectorScale( ent->s.pos.trDelta, 0.17, ent->s.pos.trDelta );#endif		// check for stop		if ( trace->plane.normal[2] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 ) {			G_SetOrigin( ent, trace->endpos );#ifdef SMOKINGUNS			if(!Q_stricmp(ent->classname, "grenadeno")){				ent->classname = "grenadeend";				VectorCopy(trace->endpos, ent->s.origin2);			}#endif			return;		}	}	VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin);	VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );	ent->s.pos.trTime = level.time;}
开发者ID:OADoctor,项目名称:SmokinGuns,代码行数:41,


示例6: G_BounceMissile

/*================G_BounceMissile================*/void G_BounceMissile( gentity_t *ent, trace_t *trace ){    vec3_t  velocity;    float dot;    int   hitTime;    float cor = 1.;    if( !strcmp( ent->classname, "bounceball" ) )        cor = .8;    // reflect the velocity on the trace plane    hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;    BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );    dot = DotProduct( velocity, trace->plane.normal );    VectorMA( velocity, -(1+cor) * dot, trace->plane.normal, ent->s.pos.trDelta );    if( ent->s.eFlags & EF_BOUNCE_HALF )    {        if(!strcmp(ent->classname,"grenade") && g_proximityMines.integer) {            VectorScale( ent->s.pos.trDelta, 0.00, ent->s.pos.trDelta );        } else {            VectorScale( ent->s.pos.trDelta, 0.65, ent->s.pos.trDelta );        }        // check for stop        if( trace->plane.normal[ 2 ] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 )        {            G_SetOrigin( ent, trace->endpos );            return;        }    }    VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin );    VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );    ent->s.pos.trTime = level.time;}
开发者ID:redrumrobot,项目名称:ubp-qvm,代码行数:41,


示例7: G_BounceMissile_Q3

void G_BounceMissile_Q3( gentity_t *ent, trace_t *trace ) {	vector3	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = level.previousTime + (int)(( level.time - level.previousTime ) * trace->fraction);	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, &velocity );	dot = DotProduct( &velocity, &trace->plane.normal );	VectorMA( &velocity, -2*dot, &trace->plane.normal, &ent->s.pos.trDelta );	if ( ent->flags & FL_BOUNCE_HALF ) {		VectorScale( &ent->s.pos.trDelta, 0.65f, &ent->s.pos.trDelta );		// check for stop		if ( trace->plane.normal.z > 0.2f && VectorLength( &ent->s.pos.trDelta ) < 40 ) {			G_SetOrigin( ent, &trace->endpos );			ent->s.time = level.time / 4;			return;		}	}	VectorAdd( &ent->r.currentOrigin, &trace->plane.normal, &ent->r.currentOrigin);	VectorCopy( &ent->r.currentOrigin, &ent->s.pos.trBase );	ent->s.pos.trTime = level.time;}
开发者ID:Razish,项目名称:QtZ,代码行数:25,


示例8: G_BounceItem

/*================G_BounceItem================*/void G_BounceItem( gentity_t *ent, trace_t *trace ) {	vec3_t	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2*dot, trace->plane.normal, ent->s.pos.trDelta );	// cut the velocity to keep from bouncing forever	VectorScale( ent->s.pos.trDelta, ent->physicsBounce, ent->s.pos.trDelta );	// check for stop	if ( trace->plane.normal[2] > 0 && ent->s.pos.trDelta[2] < 40 ) {		trace->endpos[2] += 1.0;	// make sure it is off ground		SnapVector( trace->endpos );		G_SetOrigin( ent, trace->endpos );		ent->s.groundEntityNum = trace->entityNum;		return;	}	VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin);	VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );	ent->s.pos.trTime = level.time;}
开发者ID:Garey27,项目名称:quake3-brainworks,代码行数:33,


示例9: G_BounceMissile

/*================G_BounceMissile================*/void G_BounceMissile( gentity_t *ent, trace_t *trace ) {    vec3_t	velocity;    float	dot;    int		hitTime;    // reflect the velocity on the trace plane    hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;    BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );    dot = DotProduct( velocity, trace->plane.normal );    VectorMA( velocity, -2*dot, trace->plane.normal, ent->s.pos.trDelta );    if ( ent->flags & FL_BOUNCE_SHRAPNEL )    {        VectorScale( ent->s.pos.trDelta, 0.25f, ent->s.pos.trDelta );        ent->s.pos.trType = TR_GRAVITY;        // check for stop        if ( trace->plane.normal[2] > 0.7 && ent->s.pos.trDelta[2] < 40 ) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7        {            G_SetOrigin( ent, trace->endpos );            ent->nextthink = level.time + 100;            return;        }    }    else if ( ent->flags & FL_BOUNCE_HALF )    {        VectorScale( ent->s.pos.trDelta, 0.65f, ent->s.pos.trDelta );        // check for stop        if ( trace->plane.normal[2] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 )        {            G_SetOrigin( ent, trace->endpos );            return;        }    }    if (ent->s.weapon == WP_THERMAL)    {   //slight hack for hit sound        G_Sound(ent, CHAN_BODY, G_SoundIndex(va("sound/weapons/thermal/bounce%i.wav", Q_irand(1, 2))));    }    else if (ent->s.weapon == WP_SABER)    {        G_Sound(ent, CHAN_BODY, G_SoundIndex(va("sound/weapons/saber/bounce%i.wav", Q_irand(1, 3))));    }    else if (ent->s.weapon == G2_MODEL_PART)    {        //Limb bounce sound?    }    VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin);    VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );    ent->s.pos.trTime = level.time;    if (ent->bounceCount != -5)    {        ent->bounceCount--;    }}
开发者ID:Mauii,项目名称:Rend2,代码行数:64,


示例10: G_BounceMissile

/*================G_BounceMissile================*/void G_BounceMissile( gentity_t *ent, trace_t *trace ) {	vec3_t velocity;	float dot;	int hitTime;// Arnout: removed this for MP as well (was already gone from SP)/*		// Ridah, if we are a grenade, and we have hit an AI that is waiting to catch us, give them a grenade, and delete ourselves	if ((ent->splashMethodOfDeath == MOD_GRENADE_SPLASH) && (g_entities[trace->entityNum].flags & FL_AI_GRENADE_KICK) &&		(trace->endpos[2] > g_entities[trace->entityNum].r.currentOrigin[2])) {		g_entities[trace->entityNum].grenadeExplodeTime = ent->nextthink;		g_entities[trace->entityNum].flags &= ~FL_AI_GRENADE_KICK;		Add_Ammo( &g_entities[trace->entityNum], WP_GRENADE_LAUNCHER, 1, qfalse );	//----(SA)	modified		G_FreeEntity( ent );		return;	}*/	// reflect the velocity on the trace plane	hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2 * dot, trace->plane.normal, ent->s.pos.trDelta );	// RF, record this for mover pushing	if ( trace->plane.normal[2] > 0.2 /*&& VectorLength( ent->s.pos.trDelta ) < 40*/ ) {		ent->s.groundEntityNum = trace->entityNum;	}	if ( ent->s.eFlags & EF_BOUNCE_HALF ) {		if ( ent->s.eFlags & EF_BOUNCE ) {     // both flags marked, do a third type of bounce			VectorScale( ent->s.pos.trDelta, 0.35, ent->s.pos.trDelta );		} else {			VectorScale( ent->s.pos.trDelta, 0.65, ent->s.pos.trDelta );		}		// check for stop		if ( trace->plane.normal[2] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 ) {//----(SA)	make the world the owner of the dynamite, so the player can shoot it after it stops moving			if ( ent->s.weapon == WP_DYNAMITE || ent->s.weapon == WP_DYNAMITE2 ) {				ent->r.ownerNum = ENTITYNUM_WORLD;			}//----(SA)	end			G_SetOrigin( ent, trace->endpos );			return;		}	}	SnapVector( ent->s.pos.trDelta );	VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin );	VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );	SnapVector( ent->s.pos.trBase );	ent->s.pos.trTime = level.time;}
开发者ID:bibendovsky,项目名称:rtcw,代码行数:61,


示例11: G_Bounce

/*================G_Bounce================*/static void G_Bounce( gentity_t *ent, trace_t *trace ){	vec3_t   velocity;	float    dot;	int      hitTime;	float    minNormal;	qboolean invert = qfalse;	// reflect the velocity on the trace plane	hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2 * dot, trace->plane.normal, ent->s.pos.trDelta );	if ( ent->s.eType == ET_BUILDABLE )	{		minNormal = BG_Buildable( ent->s.modelindex )->minNormal;		invert = BG_Buildable( ent->s.modelindex )->invertNormal;	}	else	{		minNormal = 0.707f;	}	// cut the velocity to keep from bouncing forever	if ( ( trace->plane.normal[ 2 ] >= minNormal ||	       ( invert && trace->plane.normal[ 2 ] <= -minNormal ) ) &&	     trace->entityNum == ENTITYNUM_WORLD )	{		VectorScale( ent->s.pos.trDelta, ent->physicsBounce, ent->s.pos.trDelta );	}	else	{		VectorScale( ent->s.pos.trDelta, 0.3f, ent->s.pos.trDelta );	}	if ( VectorLength( ent->s.pos.trDelta ) < 10 )	{		VectorMA( trace->endpos, 0.5f, trace->plane.normal, trace->endpos );  // make sure it is off ground		G_SetOrigin( ent, trace->endpos );		ent->s.groundEntityNum = trace->entityNum;		VectorCopy( trace->plane.normal, ent->s.origin2 );		VectorSet( ent->s.pos.trDelta, 0.0f, 0.0f, 0.0f );		return;	}	VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );	VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin );	ent->s.pos.trTime = level.time;}
开发者ID:Asvarox,项目名称:Unvanquished,代码行数:56,


示例12: CG_ReflectVelocity

/*================CG_ReflectVelocity================*/void CG_ReflectVelocity( localEntity_t *le, trace_t *trace ) {	vec3_t	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = cg.time - cg.frametime + cg.frametime * trace->fraction;	BG_EvaluateTrajectoryDelta( &le->pos, hitTime, velocity );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2*dot, trace->plane.normal, le->pos.trDelta );	VectorScale( le->pos.trDelta, le->bounceFactor, le->pos.trDelta );	VectorCopy( trace->endpos, le->pos.trBase );	le->pos.trTime = cg.time;	// check for stop, making sure that even on low FPS systems it doesn't bobble	if (le->leMarkType == LEMT_BLOOD && trace->startsolid)		{			//centity_t *cent;			//cent = &cg_entities[trace->entityNum];			//if (cent && cent->currentState.apos.trType != TR_STATIONARY)			//	le->pos.trType = TR_STATIONARY;		}	else if ( trace->allsolid || 		( trace->plane.normal[2] > 0 && 		( le->pos.trDelta[2] < 40 || le->pos.trDelta[2] < -cg.frametime * le->pos.trDelta[2] ) ) ) {//----(SA)	if it's a fragment and it's not resting on the world...//			if(le->leType == LE_DEBRIS && trace->entityNum < (MAX_ENTITIES - 1))			if(le->leType == LE_FRAGMENT && trace->entityNum < (MAX_ENTITIES - 1))			{				le->pos.trType = TR_GRAVITY_PAUSED;			}			else			{				le->pos.trType = TR_STATIONARY;			}	}	else {	}}
开发者ID:natelo,项目名称:rtcwPub,代码行数:50,


示例13: G_BounceMissile_JA

void G_BounceMissile_JA( gentity_t *ent, trace_t *trace ) {	vector3	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = level.previousTime + (int)(( level.time - level.previousTime ) * trace->fraction);	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, &velocity );	dot = DotProduct( &velocity, &trace->plane.normal );	VectorMA( &velocity, -2*dot, &trace->plane.normal, &ent->s.pos.trDelta );	if ( ent->flags & FL_BOUNCE_SHRAPNEL ) 	{		VectorScale( &ent->s.pos.trDelta, 0.25f, &ent->s.pos.trDelta );		ent->s.pos.trType = TR_GRAVITY;		// check for stop		if ( trace->plane.normal.z > 0.7f && ent->s.pos.trDelta.z < 40 ) //this can happen even on very slightly sloped walls, so changed it from > 0 to > 0.7f		{			G_SetOrigin( ent, &trace->endpos );			ent->nextthink = level.time + 100;			return;		}	}	else if ( ent->flags & FL_BOUNCE_HALF ) 	{		VectorScale( &ent->s.pos.trDelta, 0.65f, &ent->s.pos.trDelta );		// check for stop		if ( trace->plane.normal.z > 0.2f && VectorLength( &ent->s.pos.trDelta ) < 40 ) 		{			G_SetOrigin( ent, &trace->endpos );			return;		}	}	VectorAdd( &ent->r.currentOrigin, &trace->plane.normal, &ent->r.currentOrigin);	VectorCopy( &ent->r.currentOrigin, &ent->s.pos.trBase );	ent->s.pos.trTime = level.time;	if (ent->bounceCount != -5)		ent->bounceCount--;}
开发者ID:Razish,项目名称:QtZ,代码行数:43,


示例14: CG_ReflectVelocity

/*================CG_ReflectVelocity================*/void CG_ReflectVelocity(localEntity_t * le, trace_t * trace){	vec3_t          velocity;	float           dot;	int             hitTime;	// reflect the velocity on the trace plane	hitTime = cg.time - cg.frametime + cg.frametime * trace->fraction;	BG_EvaluateTrajectoryDelta(&le->pos, hitTime, velocity);	dot = DotProduct(velocity, trace->plane.normal);	VectorMA(velocity, -2 * dot, trace->plane.normal, le->pos.trDelta);	VectorScale(le->pos.trDelta, le->bounceFactor, le->pos.trDelta);	VectorCopy(trace->endpos, le->pos.trBase);	le->pos.trTime = cg.time;	// check for stop, making sure that even on low FPS systems it doesn't bobble	if(trace->allsolid ||	   (trace->plane.normal[2] > 0 && (le->pos.trDelta[2] < 40 || le->pos.trDelta[2] < -cg.frametime * le->pos.trDelta[2])))	{		le->pos.trType = TR_STATIONARY;	}	else	{		if(le->leFlags & LEF_TUMBLE)		{			// collided with a surface so calculate the new rotation axis			CrossProduct(trace->plane.normal, velocity, le->rotAxis);			le->angVel = VectorNormalize(le->rotAxis) / le->radius;			// save current orientation as a rotation from model's base orientation			QuatMultiply0(le->quatRot, le->quatOrient);			// reset the orientation			QuatClear(le->quatOrient);		}	}}
开发者ID:SinSiXX,项目名称:Rogue-Reborn,代码行数:45,


示例15: G_BounceItem

/*================G_BounceItem================*/void G_BounceItem( gentity_t *ent, trace_t *trace ) {	vec3_t	velocity;	float	dot;	int		hitTime;	// reflect the velocity on the trace plane	hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction;	BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity, qfalse, ent->s.effect2Time );	dot = DotProduct( velocity, trace->plane.normal );	VectorMA( velocity, -2*dot, trace->plane.normal, ent->s.pos.trDelta );	// cut the velocity to keep from bouncing forever	VectorScale( ent->s.pos.trDelta, ent->physicsBounce, ent->s.pos.trDelta );	// check for stop	if ( trace->plane.normal[2] > 0 && ent->s.pos.trDelta[2] < 40 ) {		if (g_flushItems.integer) {			vectoangles( trace->plane.normal, ent->s.angles );			ent->s.angles[0] += 90;			if (ent->s.angles[0] > 0.0 && ent->s.angles[0] < 50.0) {				// avoid freaky medpacks				G_SetAngle( ent, ent->s.angles);				trace->endpos[2] -= (tan(DEG2RAD(ent->s.angles[0])) * ITEM_RADIUS);			} else {				trace->endpos[2] += 1.0;   // make sure it is off ground			}		} else {			trace->endpos[2] += 1.0;   // make sure it is off ground		}		SnapVector( trace->endpos );		G_SetOrigin( ent, trace->endpos );		ent->s.groundEntityNum = trace->entityNum;		return;	}	VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin);	VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase );	ent->s.pos.trTime = level.time;}
开发者ID:thewolfteam,项目名称:Reloaded,代码行数:46,


示例16: CG_AddFragment

/*================CG_AddFragment================*/void CG_AddFragment( localEntity_t *le ) {	vec3_t	newOrigin;	trace_t	trace;	if ( le->pos.trType == TR_STATIONARY ) {		// sink into the ground if near the removal time		int		t;		float	oldZ;				t = le->endTime - cg.time;		if ( t < SINK_TIME ) {			// we must use an explicit lighting origin, otherwise the			// lighting would be lost as soon as the origin went			// into the ground			VectorCopy( le->refEntity.origin, le->refEntity.lightingOrigin );			le->refEntity.renderfx |= RF_LIGHTING_ORIGIN;			oldZ = le->refEntity.origin[2];			le->refEntity.origin[2] -= 16 * ( 1.0 - (float)t / SINK_TIME );			trap_R_AddRefEntityToScene( &le->refEntity );			le->refEntity.origin[2] = oldZ;		} else {			trap_R_AddRefEntityToScene( &le->refEntity );		}		return;	}	// calculate new position	BG_EvaluateTrajectory( &le->pos, cg.time, newOrigin );	// trace a line from previous position to new position	CG_Trace( &trace, le->refEntity.origin, NULL, NULL, newOrigin, -1, CONTENTS_SOLID );	if ( trace.fraction == 1.0 ) {		qboolean	inWater;		vec3_t		newDelta;		// still in free fall		VectorCopy( newOrigin, le->refEntity.origin );		// check for water		inWater = CG_PointContents( newOrigin, -1 ) & CONTENTS_WATER;		if ( inWater && le->pos.trType == TR_GRAVITY ) {			BG_EvaluateTrajectoryDelta( &le->pos, cg.time, newDelta );			le->pos.trType = TR_WATER_GRAVITY;			VectorCopy( newOrigin, le->pos.trBase );			VectorCopy( newDelta, le->pos.trDelta );			le->pos.trTime = cg.time;		}		if ( !inWater && le->pos.trType == TR_WATER_GRAVITY ) {			BG_EvaluateTrajectoryDelta( &le->pos, cg.time, newDelta );			le->pos.trType = TR_GRAVITY;			VectorCopy( newOrigin, le->pos.trBase );			VectorCopy( newDelta, le->pos.trDelta );			le->pos.trTime = cg.time;		}		if ( le->leFlags & LEF_TUMBLE ) {			vec3_t angles;			BG_EvaluateTrajectory( &le->angles, cg.time, angles );			AnglesToAxis( angles, le->refEntity.axis );		}		trap_R_AddRefEntityToScene( &le->refEntity );		// add a fire trail		// CG_FireTrail( le );		return;	}	// if it is in a nodrop zone, remove it	// this keeps gibs from waiting at the bottom of pits of death	// and floating levels	if ( trap_CM_PointContents( trace.endpos, 0 ) & CONTENTS_NODROP ) {		CG_FreeLocalEntity( le );		return;	}	// stop rotation	le->angles.trType = TR_STATIONARY;	// leave a mark	CG_FragmentBounceMark( le, &trace );	// reflect the velocity on the trace plane	CG_ReflectVelocity( le, &trace );	trap_R_AddRefEntityToScene( &le->refEntity );}
开发者ID:ElderPlayerX,项目名称:Afterwards,代码行数:96,


示例17: G_MissileImpact

void G_MissileImpact( gentity_t *ent, trace_t *trace ) {#elsevoid G_MissileImpact( gentity_t *ent, trace_t *trace, int shaderNum ) {#endif	gentity_t		*other;	qboolean		hitClient = qfalse;#ifndef SMOKINGUNS#ifdef MISSIONPACK	vec3_t			forward, impactpoint, bouncedir;	int				eFlags;#endif#else	qboolean		hitKnife  = qfalse;	vec3_t			bottledirs[ALC_COUNT];#endif	other = &g_entities[trace->entityNum];#ifndef SMOKINGUNS	// check for bounce	if ( !other->takedamage &&		( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) {		G_BounceMissile( ent, trace );		G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );		return;	}#ifdef MISSIONPACK	if ( other->takedamage ) {		if ( ent->s.weapon != WP_PROX_LAUNCHER ) {			if ( other->client && other->client->invulnerabilityTime > level.time ) {				//				VectorCopy( ent->s.pos.trDelta, forward );				VectorNormalize( forward );				if (G_InvulnerabilityEffect( other, forward, ent->s.pos.trBase, impactpoint, bouncedir )) {					VectorCopy( bouncedir, trace->plane.normal );					eFlags = ent->s.eFlags & EF_BOUNCE_HALF;					ent->s.eFlags &= ~EF_BOUNCE_HALF;					G_BounceMissile( ent, trace );					ent->s.eFlags |= eFlags;				}				ent->target_ent = other;				return;			}		}	}#endif	// impact damage	if (other->takedamage) {#else	if(other->takedamage)		hitKnife = qtrue;	// check for bounce	if ( ( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) {		G_BounceMissile( ent, trace );		return;	}	if (other->takedamage && ent->s.weapon != WP_DYNAMITE) {#endif		// FIXME: wrong damage direction?		if ( ent->damage ) {			vec3_t	velocity;			if( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) ) {				g_entities[ent->r.ownerNum].client->accuracy_hits++;				hitClient = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );			if ( VectorLength( velocity ) == 0 ) {				velocity[2] = 1;	// stepped on a grenade			}#ifndef SMOKINGUNS			G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,				ent->s.origin, ent->damage,				0, ent->methodOfDeath);#else			// you can't make dynamite exploding by using a knife			if(!(ent->s.weapon == WP_KNIFE && other->s.weapon == WP_DYNAMITE &&				other->s.eType == ET_ITEM)){				// prepare breakable, if not already initialized				if(!(other->flags & FL_BREAKABLE_INIT))					G_BreakablePrepare(other, shaderNum);				G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,					ent->s.origin, ent->damage,					0, ent->methodOfDeath);			}#endif		}	}#ifndef SMOKINGUNS	if( ent->s.weapon == WP_PROX_LAUNCHER ) {		if( ent->s.pos.trType != TR_GRAVITY ) {			return;		}//.........这里部分代码省略.........
开发者ID:OADoctor,项目名称:SmokinGuns,代码行数:101,


示例18: MissileImpact

static void MissileImpact( gentity_t *ent, trace_t *trace ){	int       dirAsByte, impactFlags;	const missileAttributes_t *ma = BG_Missile( ent->s.modelindex );	gentity_t *hitEnt   = &g_entities[ trace->entityNum ];	gentity_t *attacker = &g_entities[ ent->r.ownerNum ];	// Returns whether damage and hit effects should be done and played.	std::function<int(gentity_t*, trace_t*, gentity_t*)> impactFunc;	// Check for bounce.	if ( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) &&	     !HasComponents<HealthComponent>(*hitEnt->entity) )	{		BounceMissile( ent, trace );		if ( !( ent->s.eFlags & EF_NO_BOUNCE_SOUND ) )		{			G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );		}		return;	}	// Call missile specific impact functions.	switch( ent->s.modelindex )	{		case MIS_GRENADE:      impactFunc = ImpactGrenade;     break;		case MIS_FIREBOMB:     impactFunc = ImpactGrenade;     break;		case MIS_FLAMER:       impactFunc = ImpactFlamer;      break;		case MIS_FIREBOMB_SUB: impactFunc = ImpactFirebombSub; break;		case MIS_LOCKBLOB:     impactFunc = ImpactLockblock;   break;		case MIS_SLOWBLOB:     impactFunc = ImpactSlowblob;    break;		case MIS_HIVE:         impactFunc = ImpactHive;        break;		default:               impactFunc = DefaultImpactFunc; break;	}	impactFlags = impactFunc( ent, trace, hitEnt );	// Deal impact damage.	if ( !( impactFlags & MIF_NO_DAMAGE ) )	{		if ( ent->damage && G_Alive( hitEnt ) )		{			vec3_t dir;			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, dir );			if ( VectorNormalize( dir ) == 0 )			{				dir[ 2 ] = 1; // stepped on a grenade			}			int dflags = 0;			if ( !ma->doLocationalDamage ) dflags |= DAMAGE_NO_LOCDAMAGE;			if ( ma->doKnockback )         dflags |= DAMAGE_KNOCKBACK;			hitEnt->entity->Damage(ent->damage * MissileTimeDmgMod(ent), attacker,			                       Vec3::Load(trace->endpos), Vec3::Load(dir), dflags,			                       (meansOfDeath_t)ent->methodOfDeath);		}		// splash damage (doesn't apply to person directly hit)		if ( ent->splashDamage )		{			G_RadiusDamage( trace->endpos, ent->parent,			                ent->splashDamage * MissileTimeSplashDmgMod( ent ),			                ent->splashRadius, hitEnt, ( ma->doKnockback ? DAMAGE_KNOCKBACK : 0 ),			                ent->splashMethodOfDeath );		}	}	// Play hit effects and remove the missile.	if ( !( impactFlags & MIF_NO_EFFECT ) )	{		// Use either the trajectory direction or the surface normal for the hit event.		if ( ma->impactFlightDirection )		{			vec3_t trajDir;			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, trajDir );			VectorNormalize( trajDir );			dirAsByte = DirToByte( trajDir );		}		else		{			dirAsByte = DirToByte( trace->plane.normal );		}		// Add hit event.		if ( HasComponents<HealthComponent>(*hitEnt->entity) )		{			G_AddEvent( ent, EV_MISSILE_HIT_ENTITY, dirAsByte );			ent->s.otherEntityNum = hitEnt->s.number;		}		else if ( trace->surfaceFlags & SURF_METAL )		{			G_AddEvent( ent, EV_MISSILE_HIT_METAL, dirAsByte );		}		else//.........这里部分代码省略.........
开发者ID:BlueMustache,项目名称:Unvanquished,代码行数:101,


示例19: G_MissileImpact

//.........这里部分代码省略.........            //For jedi AI            otherOwner->client->ps.saberEventFlags |= SEF_DEFLECTED;            if (otherDefLevel == FORCE_LEVEL_3)            {                otherOwner->client->ps.saberBlockTime = 0; //^_^            }            if (otherDefLevel == FORCE_LEVEL_1)            {                goto killProj;            }            return;        }    }    // check for sticking    if ( !other->takedamage && ( ent->s.eFlags & EF_MISSILE_STICK ) )    {        laserTrapStick( ent, trace->endpos, trace->plane.normal );        G_AddEvent( ent, EV_MISSILE_STICK, 0 );        return;    }//JAPRO - Serverside - Flag punting - Start    if (g_allowFlagThrow.integer && !other->takedamage && other->s.eType == ET_ITEM)    {        vec3_t velocity;        if (ent->s.weapon == WP_REPEATER && (ent->s.eFlags & EF_ALT_FIRING))        {            other->s.pos.trType = TR_GRAVITY;            other->s.pos.trTime = level.time;            BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );            VectorScale( velocity, 0.7f, other->s.pos.trDelta );            VectorCopy( other->r.currentOrigin, other->s.pos.trBase );        }        else if (ent->s.weapon == WP_ROCKET_LAUNCHER && (ent->s.eFlags & EF_ALT_FIRING))        {            other->s.pos.trType = TR_GRAVITY;            other->s.pos.trTime = level.time;            BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );            VectorScale( velocity, 2.5f, other->s.pos.trDelta );            VectorCopy( other->r.currentOrigin, other->s.pos.trBase );        }        else if (ent->s.weapon == WP_ROCKET_LAUNCHER)        {            other->s.pos.trType = TR_GRAVITY;            other->s.pos.trTime = level.time;            BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );            VectorScale( velocity, 0.9f, other->s.pos.trDelta );            VectorCopy( other->r.currentOrigin, other->s.pos.trBase );        }        else if (ent->s.weapon == WP_THERMAL)        {            other->s.pos.trType = TR_GRAVITY;            other->s.pos.trTime = level.time;            BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );            VectorScale( velocity, 0.9f, other->s.pos.trDelta ); //tweak?            VectorCopy( other->r.currentOrigin, other->s.pos.trBase );        }    }//JAPRO - Serverside - Flag punting - End    // impact damage    if (other->takedamage && !isKnockedSaber) {
开发者ID:videoP,项目名称:jaPRO,代码行数:67,


示例20: G_MissileImpact

/*================G_MissileImpact	impactDamage is how much damage the impact will do to func_explosives================*/void G_MissileImpact( gentity_t *ent, trace_t *trace, int impactDamage ) {	gentity_t       *other;	qboolean hitClient = qfalse;	vec3_t velocity;	int etype;	other = &g_entities[trace->entityNum];	// handle func_explosives	if ( other->classname && Q_stricmp( other->classname, "func_explosive" ) == 0 ) {		// the damage is sufficient to "break" the ent (health == 0 is non-breakable)		if ( other->health && impactDamage >= other->health ) {			// check for other->takedamage needs to be inside the health check since it is			// likely that, if successfully destroyed by the missile, in the next runmissile()			// update takedamage would be set to '0' and the func_explosive would not be			// removed yet, causing a bounce.			if ( other->takedamage ) {				BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );				G_Damage( other, ent, &g_entities[ent->r.ownerNum], velocity, ent->s.origin, impactDamage, 0, ent->methodOfDeath );			}			// its possible of the func_explosive not to die from this and it			// should reflect the missile or explode it not vanish into oblivion			if ( other->health <= 0 ) {				return;			}		}	}	// check for bounce	if ( !other->takedamage &&		 ( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) {		G_BounceMissile( ent, trace );		// JPW NERVE -- spotter White Phosphorous rounds shouldn't bounce noise		if ( !Q_stricmp( ent->classname,"WP" ) ) {			return;		}		// jpw		if ( !Q_stricmp( ent->classname, "flamebarrel" ) ) {			G_AddEvent( ent, EV_FLAMEBARREL_BOUNCE, 0 );		} else {			G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );		}		return;	}	if ( other->takedamage && ent->s.density == 1 ) {		G_ExplodeMissilePoisonGas( ent );		return;	}	// impact damage	if ( other->takedamage ) {		if ( ent->damage ) {			if ( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) ) {				if ( g_entities[ent->r.ownerNum].client ) {					g_entities[ent->r.ownerNum].client->ps.persistant[PERS_ACCURACY_HITS]++;				}				hitClient = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );			if ( VectorLength( velocity ) == 0 ) {				velocity[2] = 1;    // stepped on a grenade			}			G_Damage( other, ent, &g_entities[ent->r.ownerNum], velocity,					  ent->s.origin, ent->damage,					  0, ent->methodOfDeath );		} else    // if no damage value, then this is a splash damage grenade only		{			G_BounceMissile( ent, trace );			return;		}	}	// is it cheaper in bandwidth to just remove this ent and create a new	// one, rather than changing the missile into the explosion?	if ( other->takedamage && other->client ) {		G_AddEvent( ent, EV_MISSILE_HIT, DirToByte( trace->plane.normal ) );		ent->s.otherEntityNum = other->s.number;	} else {		// Ridah, try projecting it in the direction it came from, for better decals		vec3_t dir;		BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, dir );		BG_GetMarkDir( dir, trace->plane.normal, dir );		G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( dir ) );	}	ent->freeAfterEvent = qtrue;	// change over to a normal entity right at the point of impact	etype = ent->s.eType;	ent->s.eType = ET_GENERAL;//.........这里部分代码省略.........
开发者ID:bibendovsky,项目名称:rtcw,代码行数:101,


示例21: G_MissileImpact

//.........这里部分代码省略.........        return;    }    else if( !strcmp( ent->classname, "lockblob" ) )    {        if( other->client && other->client->ps.stats[ STAT_PTEAM ] == PTE_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_PTEAM ] == PTE_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 = AHive_ReturnToHive;            ent->nextthink = level.time + FRAMETIME;            //only damage humans            if( other->client && other->client->ps.stats[ STAT_PTEAM ] == PTE_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,                      0, ent->methodOfDeath );        }    }    if( returnAfterDamage )        return;    // is it cheaper in bandwidth to just remove this ent and create a new    // one, rather than changing the missile into the explosion?    if( other->takedamage && other->client )    {        G_AddEvent( ent, EV_MISSILE_HIT, DirToByte( trace->plane.normal ) );        ent->s.otherEntityNum = other->s.number;    }    else if( trace->surfaceFlags & SURF_METALSTEPS )        G_AddEvent( ent, EV_MISSILE_MISS_METAL, DirToByte( trace->plane.normal ) );    else        G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( trace->plane.normal ) );    ent->freeAfterEvent = qtrue;    // change over to a normal entity right at the point of impact    ent->s.eType = ET_GENERAL;    SnapVectorTowards( trace->endpos, ent->s.pos.trBase );  // save net bandwidth    G_SetOrigin( ent, trace->endpos );    // splash damage (doesn't apply to person directly hit)    if( ent->splashDamage )        G_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius,                        other, ent->splashMethodOfDeath );    trap_LinkEntity( ent );}
开发者ID:redrumrobot,项目名称:ubp-qvm,代码行数:101,


示例22: G_MissileImpact

/*================G_MissileImpact================*/void G_MissileImpact( gentity_t *ent, trace_t *trace ) {	gentity_t		*other;	qboolean		hitClient = qfalse;#ifdef MISSIONPACK	vec3_t			forward, impactpoint, bouncedir;	int				eFlags;#endif	other = &g_entities[trace->entityNum];	// check for bounce	if ( !other->takedamage &&		( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) {		G_BounceMissile( ent, trace );		G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );		return;	}#ifdef MISSIONPACK	if ( other->takedamage ) {		if ( ent->s.weapon != WP_PROX_LAUNCHER ) {			if ( other->client && other->client->invulnerabilityTime > level.time ) {				//				VectorCopy( ent->s.pos.trDelta, forward );				VectorNormalize( forward );				if (G_InvulnerabilityEffect( other, forward, ent->s.pos.trBase, impactpoint, bouncedir )) {					VectorCopy( bouncedir, trace->plane.normal );					eFlags = ent->s.eFlags & EF_BOUNCE_HALF;					ent->s.eFlags &= ~EF_BOUNCE_HALF;					G_BounceMissile( ent, trace );					ent->s.eFlags |= eFlags;				}				ent->target_ent = other;				return;			}		}	}#endif	// impact damage	if (other->takedamage) {		// FIXME: wrong damage direction?		if ( ent->damage ) {			vec3_t	velocity;			if( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) ) {				g_entities[ent->r.ownerNum].client->accuracy_hits++;				hitClient = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );			if ( VectorLength( velocity ) == 0 ) {				velocity[2] = 1;	// stepped on a grenade			}			G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,				ent->s.origin, ent->damage, 				0, ent->methodOfDeath);		}	}#ifdef MISSIONPACK	if( ent->s.weapon == WP_PROX_LAUNCHER ) {		if( ent->s.pos.trType != TR_GRAVITY ) {			return;		}		// if it's a player, stick it on to them (flag them and remove this entity)		if( other->s.eType == ET_PLAYER && other->health > 0 ) {			ProximityMine_Player( ent, other );			return;		}		SnapVectorTowards( trace->endpos, ent->s.pos.trBase );		G_SetOrigin( ent, trace->endpos );		ent->s.pos.trType = TR_STATIONARY;		VectorClear( ent->s.pos.trDelta );		G_AddEvent( ent, EV_PROXIMITY_MINE_STICK, trace->surfaceFlags );		ent->think = ProximityMine_Activate;		ent->nextthink = level.time + 2000;		vectoangles( trace->plane.normal, ent->s.angles );		ent->s.angles[0] += 90;		// link the prox mine to the other entity		ent->enemy = other;		ent->die = ProximityMine_Die;		VectorCopy(trace->plane.normal, ent->movedir);		VectorSet(ent->r.mins, -4, -4, -4);		VectorSet(ent->r.maxs, 4, 4, 4);		trap_LinkEntity(ent);		return;	}#endif	if (!strcmp(ent->classname, "hook")) {//.........这里部分代码省略.........
开发者ID:aSneakyCow,项目名称:WWC,代码行数:101,


示例23: G_MissileImpact

//.........这里部分代码省略.........		if (other->client)		{			AngleVectors(other->client->ps.viewangles, fwd, NULL, NULL);		}		else		{			AngleVectors(other->r.currentAngles, fwd, NULL, NULL);		}		VectorScale(ent->s.pos.trDelta, 0.2, ent->s.pos.trDelta);		G_Damage(other, ent, ent->parent, fwd, ent->s.origin, ent->genericValue9, 0, MOD_THERMAL);		G_DeflectMissile(other, ent, fwd);		//G_MissileBounceEffect(ent, ent->r.currentOrigin, fwd);		return;	}	// check for sticking	if ( !other->takedamage && ( ent->s.eFlags & EF_MISSILE_STICK ) ) 	{		laserTrapStick( ent, trace->endpos, trace->plane.normal );		G_AddEvent( ent, EV_MISSILE_STICK, 0 );		return;	}	// impact damage	if (other->takedamage && !isKnockedSaber) {		// FIXME: wrong damage direction?		weaponData_t *weapon = GetWeaponData (ent->s.weapon, ent->s.weaponVariation);		weaponFireModeStats_t *fireMode = &weapon->firemodes[ent->s.firingMode];				if ( ent->damage || fireMode->damageTypeHandle || fireMode->secondaryDmgHandle ) {			vec3_t	velocity;			hitClient = qtrue;			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );			if ( VectorLength( velocity ) == 0 ) {				velocity[2] = 1;	// stepped on a grenade			}            if ( fireMode->damageTypeHandle )            {                JKG_DoDamage (fireMode->damageTypeHandle, other, ent, &g_entities[ent->r.ownerNum], velocity, ent->r.currentOrigin, 0, ent->methodOfDeath);            }            else if ( ent->damage )            {                G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity, ent->r.currentOrigin, ent->damage, 0, ent->methodOfDeath);            }                        if ( fireMode->secondaryDmgHandle )            {                JKG_DoDamage (fireMode->secondaryDmgHandle, other, ent, &g_entities[ent->r.ownerNum], velocity, ent->r.currentOrigin, 0, ent->methodOfDeath);            }			if (other->client)			{ //What I'm wondering is why this isn't in the NPC pain funcs. But this is what SP does, so whatever.				class_t	npc_class = other->client->NPC_class;				// If we are a robot and we aren't currently doing the full body electricity...				if ( npc_class == CLASS_SEEKER || npc_class == CLASS_PROBE || npc_class == CLASS_MOUSE ||					   npc_class == CLASS_GONK || npc_class == CLASS_R2D2 || npc_class == CLASS_R5D2 || npc_class == CLASS_REMOTE ||					   npc_class == CLASS_MARK1 || npc_class == CLASS_MARK2 || //npc_class == CLASS_PROTOCOL ||//no protocol, looks odd					   npc_class == CLASS_INTERROGATOR || npc_class == CLASS_ATST || npc_class == CLASS_SENTRY )				{					// special droid only behaviors					if ( other->client->ps.electrifyTime < level.time + 100 )					{						// ... do the effect for a split second for some more feedback
开发者ID:lNightCrawlerl,项目名称:JediKnightGalaxies,代码行数:67,


示例24: CG_AddMissile

//.........这里部分代码省略.........	if ( weapon->missileDlight ) {		trap_R_AddLightToScene( re->origin, weapon->missileDlight, 			weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] );	}	// flicker between two skins	re->skinNum = cg.clientFrame & 1;	// convert direction of travel into axis	if ( VectorNormalize2( le->pos.trDelta, re->axis[0] ) == 0 ) {		re->axis[0][2] = 1;	}	// spin as it moves	if ( le->pos.trType != TR_STATIONARY ) {		if ( le->pos.trType == TR_GRAVITY ) {			RotateAroundDirection( re->axis, cg.time / 4 );		} else if ( le->pos.trType == TR_WATER_GRAVITY ) {			RotateAroundDirection( re->axis, cg.time / 8 );		} else {			RotateAroundDirection( re->axis, cg.time );		}	} else {		RotateAroundDirection( re->axis, 0 );	}	// trace a line from previous position to new position	CG_Trace( &trace, re->oldorigin, NULL, NULL, re->origin, le->owner, MASK_SHOT );	VectorCopy( re->origin, re->oldorigin );	// draw BIG grenades	if ( weLi[le->ti.weapon].category == CT_EXPLOSIVE ) {		AxisScale( re->axis, GRENADE_SCALE, re->axis );	}	if ( trace.fraction != 1.0 ) {		// hit the sky or something like that		if ( trace.surfaceFlags & SURF_NOIMPACT ) {			le->leFlags |= LEF_FINISHED;			le->endTime = cg.time + 500;			return;		}		// impact		other = &cg_entities[trace.entityNum];		if ( le->bounceFactor > 0 && ( le->bounceFactor == BOUNCE_FACTOR_HALF || other->currentState.eType != ET_PLAYER ) ) {			// reflect the velocity on the trace plane			CG_ReflectVelocity( le, &trace );			if ( cg.predictedImpacts < MAX_PREDICTED_IMPACTS ) {				cg.predictedImpacts++;				cg.predictedImpactsDecTime = cg.time;			}			// do bounce sound			if ( rand() & 1 ) {				trap_S_StartSound( le->pos.trBase, 0, CHAN_AUTO, cgs.media.hgrenb1aSound );			} else {				trap_S_StartSound( le->pos.trBase, 0, CHAN_AUTO, cgs.media.hgrenb2aSound );			}		} else {			// explode missile			if ( cg.predictedImpacts < MAX_PREDICTED_IMPACTS ) {				cg.predictedImpacts++;				cg.predictedImpactsDecTime = cg.time;			}			if ( other->currentState.eType == ET_PLAYER ) {				CG_MissileHitPlayer( le->ti.weapon, 0, trace.endpos, trace.plane.normal, trace.entityNum );			} else if ( !(trace.surfaceFlags & SURF_NOIMPACT) ) {				CG_MissileHitWall( le->ti.weapon, 0, trace.endpos, trace.plane.normal, 					(trace.surfaceFlags & SURF_METALSTEPS) ? IMPACTSOUND_METAL : IMPACTSOUND_DEFAULT );			}			// store the entity for deleting the server entity			le->leFlags |= LEF_FINISHED;			le->endTime = cg.time + 500;			return;		}	}	// check for medium change	if ( trap_CM_PointContents( re->origin, 0 ) & CONTENTS_WATER ) inWater = qtrue;	else inWater = qfalse;	if (  ( !inWater && le->pos.trType == TR_WATER_GRAVITY )		|| ( inWater && le->pos.trType == TR_GRAVITY ) ) {		// setup new tr		vec3_t	newDelta;		BG_EvaluateTrajectoryDelta( &le->pos, cg.time, newDelta );		VectorCopy( re->origin, le->pos.trBase );		VectorCopy( newDelta, le->pos.trDelta );		le->pos.trTime = cg.time;		if ( inWater ) le->pos.trType = TR_WATER_GRAVITY;		else le->pos.trType = TR_GRAVITY;	}		// add to refresh list	trap_R_AddRefEntityToScene( re );}
开发者ID:ElderPlayerX,项目名称:Afterwards,代码行数:101,


示例25: G_MissileImpact

//.........这里部分代码省略.........			//For jedi AI			otherOwner->client->ps.saberEventFlags |= SEF_DEFLECTED;			if ( otherDefLevel == FORCE_LEVEL_3 ) {				otherOwner->client->ps.saberBlockTime = 0; //^_^			}			if ( otherDefLevel == FORCE_LEVEL_1 ) {				goto killProj;			}			return;		}	}	// check for sticking	if ( !other->takedamage && (ent->s.eFlags & EF_MISSILE_STICK) ) {		laserTrapStick( ent, &trace->endpos, &trace->plane.normal );		G_AddEvent( ent, EV_MISSILE_STICK, 0 );		return;	}	// impact damage	if ( other->takedamage && !isKnockedSaber ) {		// FIXME: wrong damage direction?		if ( ent->damage ) {			vector3	velocity;			qboolean didDmg = qfalse;			if ( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) ) {				g_entities[ent->r.ownerNum].client->accuracy_hits++;				hitClient = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, &velocity );			if ( VectorLength( &velocity ) == 0 ) {				velocity.z = 1;	// stepped on a grenade			}			if ( ent->s.weapon == WP_BOWCASTER || ent->s.weapon == WP_FLECHETTE ||				ent->s.weapon == WP_ROCKET_LAUNCHER ) {				if ( ent->s.weapon == WP_FLECHETTE && (ent->s.eFlags & EF_ALT_FIRING) ) {					ent->think( ent );					JPLua::Entity_CallFunction( ent, JPLua::JPLUA_ENTITY_THINK );				}				else {					G_Damage( other, ent, &g_entities[ent->r.ownerNum], &velocity,						/*ent->s.origin*/&ent->r.currentOrigin, ent->damage,						DAMAGE_HALF_ABSORB, ent->methodOfDeath );					didDmg = qtrue;				}			}			else {				G_Damage( other, ent, &g_entities[ent->r.ownerNum], &velocity,					/*ent->s.origin*/&ent->r.currentOrigin, ent->damage,					0, ent->methodOfDeath );				didDmg = qtrue;			}			//Raz: air shots			if ( (other->client && other->client->ps.groundEntityNum == ENTITYNUM_NONE) &&				(ent->methodOfDeath == MOD_CONC ||				ent->methodOfDeath == MOD_REPEATER_ALT ||				ent->methodOfDeath == MOD_ROCKET ||				ent->methodOfDeath == MOD_ROCKET_HOMING ||				ent->methodOfDeath == MOD_THERMAL) ) {				g_entities[ent->r.ownerNum].client->ps.persistant[PERS_IMPRESSIVE_COUNT]++;
开发者ID:Arcadiaprime,项目名称:japp,代码行数:67,


示例26: G_MissileImpact

/*================G_MissileImpact================*/void G_MissileImpact( gentity_t *ent, trace_t *trace ) {	gentity_t		*other;	qboolean		hitPlayer = qfalse;#if defined MISSIONPACK && !defined TURTLEARENA // POWERS	vec3_t			forward, impactpoint, bouncedir;	int				eFlags;#endif#ifdef TA_WEAPSYS	qboolean damagedOther = qfalse;#endif	other = &g_entities[trace->entityNum];#if defined MISSIONPACK && !defined TURTLEARENA // POWERS	if ( other->takedamage ) {#ifdef TA_WEAPSYS		if ( !bg_projectileinfo[ent->s.weapon].stickOnImpact )#else		if ( ent->s.weapon != WP_PROX_LAUNCHER )#endif		{			if ( other->player && other->player->invulnerabilityTime > level.time ) {				//				VectorCopy( ent->s.pos.trDelta, forward );				VectorNormalize( forward );				if (G_InvulnerabilityEffect( other, forward, ent->s.pos.trBase, impactpoint, bouncedir )) {					VectorCopy( bouncedir, trace->plane.normal );					eFlags = ent->s.eFlags & EF_BOUNCE_HALF;					ent->s.eFlags &= ~EF_BOUNCE_HALF;					G_BounceMissile( ent, trace );					ent->s.eFlags |= eFlags;				}				ent->target_ent = other;				return;			}		}	}#endif	// impact damage	if (other->takedamage#ifdef TA_WEAPSYS // stickOnImpact only damages once		&& !(ent->count & 2)#endif		)	{		// FIXME: wrong damage direction?		if ( ent->damage ) {			vec3_t	velocity;			if( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) ) {				g_entities[ent->r.ownerNum].player->accuracy_hits++;				hitPlayer = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );			if ( VectorLength( velocity ) == 0 ) {#ifdef IOQ3ZTM				VectorCopy(trace->plane.normal, velocity);#else				velocity[2] = 1;	// stepped on a grenade#endif			}#ifdef TA_WEAPSYS			damagedOther = G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,				ent->s.origin, ent->damage,				0, ent->methodOfDeath);#else			G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,				ent->s.origin, ent->damage, 				0, ent->methodOfDeath);#endif		}	}	// check for bounce	if (#ifdef TA_WEAPSYS		!damagedOther &&#else		!other->takedamage &&#endif		( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) {		G_BounceMissile( ent, trace );#ifdef TA_WEAPSYS // Bounce missiles		// Die on Nth bounce		if (ent->s.modelindex2 > 0)		{			ent->s.modelindex2--;			if (ent->s.modelindex2 == 0)			{				// Kill missile				G_ExplodeMissile( ent );				return;			}		}		G_AddEvent( ent, EV_PROJECTILE_BOUNCE, DirToByte( trace->plane.normal ) );		ent->s.time2 = trace->surfaceFlags; // surface//.........这里部分代码省略.........
开发者ID:Extraordinary-Beat-X,项目名称:ebx-code,代码行数:101,


示例27: G_MissileImpact

void G_MissileImpact( gentity_t *ent, trace_t *trace ) {	gentity_t		*other;	qboolean		hitClient = qfalse;	other = &g_entities[trace->entityNum];	// check for bounce	if ( !other->takedamage &&		(ent->bounceCount > 0 || ent->bounceCount == -5) &&		( ent->flags & ( FL_BOUNCE | FL_BOUNCE_HALF ) ) ) {		G_BounceMissile( ent, trace );	//	G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );		return;	}	if ( other->s.eType == ET_MISSILE && ent->s.weapon == WP_QUANTIZER && other->s.weapon == WP_MORTAR )	{//Quantizer can deflect mortar shots :3		G_DeflectMissile( ent, other, &ent->s.pos.trDelta );		other->r.ownerNum = ent->r.ownerNum;		G_FreeEntity( ent );		return;	}	// impact damage	if (other->takedamage) {		// FIXME: wrong damage direction?		if ( ent->damage ) {			vector3	velocity;			if( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) ) {				g_entities[ent->r.ownerNum].client->accuracy_hits++;				hitClient = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, &velocity );			if ( VectorLength( &velocity ) == 0 ) {				velocity.z = 1;	// stepped on a grenade			}			//Raz: The inflictor is the missile, for direct hits from quantizer/RLauncher/etc			G_Damage( other, ent, &g_entities[ent->r.ownerNum], ent, NULL/*velocity*/, &ent->s.origin, ent->damage, 0, ent->methodOfDeath );		}	}	// is it cheaper in bandwidth to just remove this ent and create a new	// one, rather than changing the missile into the explosion?	if ( other->takedamage && other->client ) {		G_AddEvent( ent, EV_MISSILE_HIT, DirToByte( &trace->plane.normal ) );		ent->s.otherEntityNum = other->s.number;	} else if( trace->surfaceFlags & SURF_METALSTEPS ) {		G_AddEvent( ent, EV_MISSILE_MISS_METAL, DirToByte( &trace->plane.normal ) );	} else {		G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( &trace->plane.normal ) );	}	ent->freeAfterEvent = qtrue;	// change over to a normal entity right at the point of impact	ent->s.eType = ET_GENERAL;	VectorSnapTowards( &trace->endpos, &ent->s.pos.trBase );	// save net bandwidth	G_SetOrigin( ent, &trace->endpos );	// splash damage (doesn't apply to person directly hit)#if 0	if ( ent->splashDamage ) {		if( G_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius, 			other, ent->splashMethodOfDeath ) ) {			if( !hitClient ) {				g_entities[ent->r.ownerNum].client->accuracy_hits++;			}		}	}#else	//QtZ	if ( (ent->splashDamage || ent->splashRadius)		&& G_RadiusDamage( &trace->endpos, ent->parent, (float)ent->splashDamage, (float)ent->splashRadius, other, ent, ent->splashMethodOfDeath )		&& !hitClient && g_entities[ent->r.ownerNum].client )		g_entities[ent->r.ownerNum].client->accuracy_hits++;#endif	trap->SV_LinkEntity( (sharedEntity_t *)ent );}
开发者ID:Razish,项目名称:QtZ,代码行数:82,


示例28: G_MissileImpact

//.........这里部分代码省略.........			if (otherDefLevel == FORCE_LEVEL_3)			{				otherOwner->client->ps.saberBlockTime = 0; //^_^			}			if (otherDefLevel == FORCE_LEVEL_1)			{				goto killProj;			}			return;		}	}	// check for sticking	if ( !other->takedamage && ( ent->s.eFlags & EF_MISSILE_STICK ) ) 	{		laserTrapStick( ent, trace->endpos, trace->plane.normal );		G_AddEvent( ent, EV_MISSILE_STICK, 0 );		return;	}	// impact damage	if (other->takedamage && !isKnockedSaber) {		// FIXME: wrong damage direction?		if ( ent->damage ) {			vec3_t	velocity;			qboolean didDmg = qfalse;			if( LogAccuracyHit( other, &g_entities[ent->r.ownerNum] ) &&				!ent->isReflected) {				g_entities[ent->r.ownerNum].client->accuracy_hits++;				hitClient = qtrue;			}			BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity );			if ( VectorLength( velocity ) == 0 ) {				velocity[2] = 1;	// stepped on a grenade			}			if ((ent->s.weapon == WP_BOWCASTER || ent->s.weapon == WP_FLECHETTE ||				ent->s.weapon == WP_ROCKET_LAUNCHER))			{				if (ent->s.weapon == WP_FLECHETTE && (ent->s.eFlags & EF_ALT_FIRING)) 				{					/* fix: there are rare situations where flechette did					explode by timeout AND by impact in the very same frame, then here					ent->think was set to G_FreeEntity, so the folowing think 					did invalidate this entity, BUT it would be reused later in this 					function for explosion event. This, then, would set ent->freeAfterEvent					to qtrue, so event later, when reusing this entity by using G_InitEntity(),					it would have this freeAfterEvent set AND this would in case of dropped					item erase it from game immeadiately. THIS for example caused					very rare flag dissappearing bug.	 */					if (ent->think == WP_flechette_alt_blow)						ent->think(ent);				}				else				{					G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,						/*ent->s.origin*/ent->r.currentOrigin, ent->damage, 						DAMAGE_HALF_ABSORB, ent->methodOfDeath);					didDmg = qtrue;				}			}			else			{				G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity,
开发者ID:dpadgett,项目名称:base_enhanced,代码行数:67,


示例29: CG_AddMoveScale

/*==================CG_AddMoveScale==================*/static void CG_AddMoveScale( localEntity_t *le ) {	refEntity_t	*re;	vec3_t		delta;	float		len;	re = &le->refEntity;	if ( !( le->leFlags & (LEF_DONT_SCALE | LEF_ALT_SCALE) ) ) {		re->radius = le->radius * ( cg.time - le->startTime ) * le->lifeRate + 8;	}	if ( le->leFlags & LEF_ALT_SCALE ) {		if ( re->hModel ) {			if ( (le->leFlags & LEF_AXIS_ALIGNED) && le->radius ) {				// it has a variing scale				AxisClear( re->axis );				AxisScale( re->axis, re->radius + le->radius * (cg.time - le->startTime) / (le->endTime - le->startTime), re->axis );			}			if ( !(le->leFlags & LEF_AXIS_ALIGNED) ) {				// model looks in flight direction				vec3_t	delta, angles;								BG_EvaluateTrajectoryDelta( &le->pos, cg.time, delta );				vectoangles( delta, angles );				AnglesToAxis( angles, re->axis );				if ( re->radius || le->radius ) AxisScale( re->axis, re->radius + le->radius * (cg.time - le->startTime) / (le->endTime - le->startTime), re->axis );			}		} else {			// sprites scale like this			re->radius += le->radius * cg.frametime / (le->endTime - le->startTime);		}	}	BG_EvaluateTrajectory( &le->pos, cg.time, re->origin );	// check for collisions	if ( le->leFlags & LEF_COLLISIONS ) {		// do a trace sometimes		if ( le->ti.trailTime++ > 5 ) {			trace_t		trace;			le->ti.trailTime = 0;			CG_Trace( &trace, re->oldorigin, NULL, NULL, re->origin, le->owner, MASK_SHOT );			VectorCopy( re->origin, re->oldorigin );			// hit something			if ( trace.fraction < 1.0 ) {				entityState_t	*s1;				int		life;				// do impact effect				s1 = &cg_entities[le->owner].currentState;				life = s1->groundEntityNum;				if ( !( trace.surfaceFlags & SURF_NOIMPACT ) ) {					if ( s1->generic1 & PF_IMPACT_MODEL ) {						CG_MakeExplosion( trace.endpos, trace.plane.normal, 								   cgs.gameModels[s1->modelindex2],	cgs.gameShaders[s1->otherEntityNum2],								   life, qfalse, qfalse );					} else if ( s1->modelindex2 ) {						CG_MakeExplosion( trace.endpos, trace.plane.normal, 								   cgs.media.dishFlashModel, cgs.gameShaders[s1->modelindex2],								   life, qtrue, qtrue );					}				}				CG_FreeLocalEntity( le );				return;			}		}	}	// if the view would be "inside" the sprite, kill the sprite	// so it doesn't add too much overdraw	VectorSubtract( re->origin, cg.refdef.vieworg, delta );	len = VectorLength( delta );	if ( len < le->radius ) {		CG_FreeLocalEntity( le );		return;	}	trap_R_AddRefEntityToScene( re );}
开发者ID:ElderPlayerX,项目名称:Afterwards,代码行数:88,



注:本文中的BG_EvaluateTrajectoryDelta函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ BG_FindItem函数代码示例
C++ BG_EvaluateTrajectory函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。