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

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

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

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

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

示例1: AngleVectors

//-----------------------------------------------------------------------------// Purpose: Deal with input//-----------------------------------------------------------------------------void C_VGuiScreen::ClientThink( void ){	int nButtonsChanged = m_nOldButtonState ^ m_nButtonState;	m_nOldButtonState = m_nButtonState;	// Debounced button codes for pressed/released	// UNDONE: Do we need auto-repeat?	m_nButtonPressed =  nButtonsChanged & m_nButtonState;		// The changed ones still down are "pressed"	m_nButtonReleased = nButtonsChanged & (~m_nButtonState);	// The ones not down are "released"	BaseClass::ClientThink();	// FIXME: We should really be taking bob, shake, and roll into account	// but if we did, then all the inputs would be generated multiple times	// if the world was rendered multiple times (for things like water, etc.)	vgui::Panel *pPanel = m_PanelWrapper.GetPanel();	if (!pPanel)		return;		C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();	if (!pLocalPlayer)		return;	// Generate a ray along the view direction	Vector vecEyePosition = pLocalPlayer->EyePosition();		QAngle viewAngles = pLocalPlayer->EyeAngles( );	// Compute cursor position...	Ray_t lookDir;	Vector endPos;		float u, v;	// Viewmodel attached screens that take input need to have a moving cursor	// Do a pick under the cursor as our selection	Vector viewDir;	AngleVectors( viewAngles, &viewDir );	VectorMA( vecEyePosition, 1000.0f, viewDir, endPos );	lookDir.Init( vecEyePosition, endPos );	if (!IntersectWithRay( lookDir, &u, &v, NULL ))		return;	if ( ((u < 0) || (v < 0) || (u > 1) || (v > 1)) && !m_bLoseThinkNextFrame)		return;	// This will cause our panel to grab all input!	g_pClientMode->ActivateInGameVGuiContext( pPanel );	// Convert (u,v) into (px,py)	int px = (int)(u * m_nPixelWidth + 0.5f);	int py = (int)(v * m_nPixelHeight + 0.5f);	// Generate mouse input commands	if ((px != m_nOldPx) || (py != m_nOldPy))	{		g_InputInternal->InternalCursorMoved( px, py );		m_nOldPx = px;		m_nOldPy = py;	}	if (m_nButtonPressed & IN_ATTACK)	{		g_InputInternal->SetMouseCodeState( MOUSE_LEFT, vgui::BUTTON_PRESSED );		g_InputInternal->InternalMousePressed(MOUSE_LEFT);	}	if (m_nButtonPressed & IN_ATTACK2)	{		g_InputInternal->SetMouseCodeState( MOUSE_RIGHT, vgui::BUTTON_PRESSED );		g_InputInternal->InternalMousePressed( MOUSE_RIGHT );	}	if ( (m_nButtonReleased & IN_ATTACK) || m_bLoseThinkNextFrame) // for a button release on loosing focus	{		g_InputInternal->SetMouseCodeState( MOUSE_LEFT, vgui::BUTTON_RELEASED );		g_InputInternal->InternalMouseReleased( MOUSE_LEFT );	}	if (m_nButtonReleased & IN_ATTACK2)	{		g_InputInternal->SetMouseCodeState( MOUSE_RIGHT, vgui::BUTTON_RELEASED );		g_InputInternal->InternalMouseReleased( MOUSE_RIGHT );	}	if ( m_bLoseThinkNextFrame == true )	{		m_bLoseThinkNextFrame = false;		SetNextClientThink( CLIENT_THINK_NEVER );	}	g_pClientMode->DeactivateInGameVGuiContext( );}
开发者ID:NEITMod,项目名称:HL2BM2,代码行数:96,


示例2: InitFlyby

static qboolean InitFlyby(player_state_t *self, player_state_t *player, int checkvis){	float	f, maxlen;	vec3_t	vec, vec2;	vec3_t	forward, right, up;	VectorCopy(player->viewangles, vec);	vec[0] = 0;	AngleVectors (vec, forward, right, up);//	for (i = 0; i < 3; i++)//		forward[i] *= 3;	maxlen = 1000;	VectorAdd(forward, up, vec2);	VectorAdd(vec2, right, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorAdd(forward, up, vec2);	VectorSubtract(vec2, right, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorAdd(forward, right, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorSubtract(forward, right, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorAdd(forward, up, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorSubtract(forward, up, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorAdd(up, right, vec2);	VectorSubtract(vec2, forward, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorSubtract(up, right, vec2);	VectorSubtract(vec2, forward, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	// invert	VectorNegate(forward, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	VectorCopy(forward, vec2);	if ((f = Cam_TryFlyby(self, player, vec2, checkvis)) < maxlen)	{		maxlen = f;		VectorCopy(vec2, vec);	}	// invert	VectorNegate(right, vec2);//.........这里部分代码省略.........
开发者ID:svn2github,项目名称:uhexen2,代码行数:101,


示例3: BuildLights

//.........这里部分代码省略.........			l->type = emit_spotlight;			l->stopdot = FloatForKey(e, "_cone");			if (!l->stopdot)				l->stopdot = 10;			l->stopdot = cos(l->stopdot * torad);			if (target[0] != '/0') {	/* point towards target */				entity_t *e2 = FindTargetEntity(target);				if (!e2)					Com_Printf("WARNING: light at (%i %i %i) has missing target '%s' - e.g. create an info_null that has a 'targetname' set to '%s'/n",						(int)l->origin[0], (int)l->origin[1], (int)l->origin[2], target, target);				else {					vec3_t dest;					GetVectorForKey(e2, "origin", dest);					VectorSubtract(dest, l->origin, l->normal);					VectorNormalize(l->normal);				}			} else {	/* point down angle */				const float angle = FloatForKey(e, "angle");				if (angle == ANGLE_UP) {					l->normal[0] = l->normal[1] = 0.0;					l->normal[2] = 1.0;				} else if (angle == ANGLE_DOWN) {					l->normal[0] = l->normal[1] = 0.0;					l->normal[2] = -1.0;				} else {					l->normal[2] = 0;					l->normal[0] = cos(angle * torad);					l->normal[1] = sin(angle * torad);				}			}		}	}	/* handle worldspawn light settings */	{		const entity_t *e = &entities[0];		const char *ambient, *light, *angles, *color;		float f;		int i;		if (config.compile_for_day) {			ambient = ValueForKey(e, "ambient_day");			light = ValueForKey(e, "light_day");			angles = ValueForKey(e, "angles_day");			color = ValueForKey(e, "color_day");		} else {			ambient = ValueForKey(e, "ambient_night");			light = ValueForKey(e, "light_night");			angles = ValueForKey(e, "angles_night");			color = ValueForKey(e, "color_night");		}		if (light[0] != '/0')			sun_intensity = atoi(light);		if (angles[0] != '/0') {			VectorClear(sun_angles);			if (sscanf(angles, "%f %f", &sun_angles[0], &sun_angles[1]) != 2)				Sys_Error("wrong angles values given: '%s'", angles);			AngleVectors(sun_angles, sun_normal, NULL, NULL);		}		if (color[0] != '/0') {			GetVectorFromString(color, sun_color);			ColorNormalize(sun_color, sun_color);		}		if (ambient[0] != '/0')			GetVectorFromString(ambient, sun_ambient_color);		/* optionally pull brightness from worldspawn */		f = FloatForKey(e, "brightness");		if (f > 0.0)			config.brightness = f;		/* saturation as well */		f = FloatForKey(e, "saturation");		if (f > 0.0)			config.saturation = f;		else			Verb_Printf(VERB_EXTRA, "Invalid saturation setting (%f) in worldspawn found/n", f);		f = FloatForKey(e, "contrast");		if (f > 0.0)			config.contrast = f;		else			Verb_Printf(VERB_EXTRA, "Invalid contrast setting (%f) in worldspawn found/n", f);		/* lightmap resolution downscale (e.g. 4 = 1 << 4) */		i = atoi(ValueForKey(e, "quant"));		if (i >= 1 && i <= 6)			config.lightquant = i;		else			Verb_Printf(VERB_EXTRA, "Invalid quant setting (%i) in worldspawn found/n", i);	}	Verb_Printf(VERB_EXTRA, "light settings:/n * intensity: %i/n * sun_angles: pitch %f yaw %f/n * sun_color: %f:%f:%f/n * sun_ambient_color: %f:%f:%f/n",		sun_intensity, sun_angles[0], sun_angles[1], sun_color[0], sun_color[1], sun_color[2], sun_ambient_color[0], sun_ambient_color[1], sun_ambient_color[2]);	Verb_Printf(VERB_NORMAL, "%i direct lights for %s lightmap/n", numlights[config.compile_for_day], (config.compile_for_day ? "day" : "night"));}
开发者ID:kevlund,项目名称:ufoai,代码行数:101,


示例4: GetFollowedEntity

void C_ParticleSmokeGrenade::Update(float fTimeDelta){	m_LifetimeCounter += fTimeDelta;		// Update the smoke trail.	C_BaseEntity *pAimEnt = GetFollowedEntity();	if ( pAimEnt )	{		Vector forward, right, up;		// Update the smoke particle color.		if(m_CurrentStage == 0)		{			m_SmokeTrail.m_StartColor = EngineGetLightForPoint(GetAbsOrigin()) * 0.5f;			m_SmokeTrail.m_EndColor = m_SmokeTrail.m_StartColor;		}		// Spin the smoke trail.		AngleVectors(pAimEnt->GetAbsAngles(), &forward, &right, &up);		m_SmokeTrail.m_VelocityOffset = forward * 30 + GetAbsVelocity();		m_SmokeTrail.SetLocalOrigin( GetAbsOrigin() );		m_SmokeTrail.Update(fTimeDelta);	}				// Update our fade alpha.	if(m_LifetimeCounter < m_FadeStartTime)	{		m_FadeAlpha = 1;	}	else if(m_LifetimeCounter < m_FadeEndTime)	{		float fadePercent = (m_LifetimeCounter - m_FadeStartTime) / (m_FadeEndTime - m_FadeStartTime);		m_FadeAlpha = cos(fadePercent * 3.14159) * 0.5 + 0.5;	}	else	{		m_FadeAlpha = 0;	}	// Scale by the amount the sphere has grown.	m_FadeAlpha *= m_ExpandRadius / SMOKESPHERE_MAX_RADIUS;	if(m_CurrentStage == 1)	{		// Update the expanding sphere.		m_ExpandTimeCounter += fTimeDelta;		if(m_ExpandTimeCounter > SMOKESPHERE_EXPAND_TIME)			m_ExpandTimeCounter = SMOKESPHERE_EXPAND_TIME;		m_ExpandRadius = SMOKESPHERE_MAX_RADIUS * (float)sin(m_ExpandTimeCounter * 3.14159265358 * 0.5 / SMOKESPHERE_EXPAND_TIME);		// Add our influence to the global smoke fog alpha.		float testDist = (EngineGetVecRenderOrigin() - m_SmokeBasePos).Length();		float fadeEnd = m_ExpandRadius * 0.75;		if(testDist < fadeEnd)		{			EngineGetSmokeFogOverlayAlpha() += 1 - testDist / fadeEnd;		}			// This is used to randomize the direction it chooses to move a particle in.		int offsetLookup[3] = {-1,0,1};		// Update all the moving traders and establish new ones.		int nTotal = m_xCount * m_yCount * m_zCount;		for(int i=0; i < nTotal; i++)		{			SmokeParticleInfo *pInfo = &m_SmokeParticleInfos[i];			if(!pInfo->m_pParticle)				continue;					if(pInfo->m_TradeIndex == -1)			{				pInfo->m_pParticle->m_FadeAlpha = pInfo->m_FadeAlpha;				pInfo->m_pParticle->m_Color[0] = pInfo->m_Color[0];				pInfo->m_pParticle->m_Color[1] = pInfo->m_Color[1];				pInfo->m_pParticle->m_Color[2] = pInfo->m_Color[2];				// Is there an adjacent one that's not trading?				int x, y, z;				GetParticleInfoXYZ(i, x, y, z);				int xCountOffset = rand();				int yCountOffset = rand();				int zCountOffset = rand();				bool bFound = false;				for(int xCount=0; xCount < 3 && !bFound; xCount++)				{					for(int yCount=0; yCount < 3 && !bFound; yCount++)					{						for(int zCount=0; zCount < 3; zCount++)						{							int testX = x + offsetLookup[(xCount+xCountOffset) % 3];							int testY = y + offsetLookup[(yCount+yCountOffset) % 3];							int testZ = z + offsetLookup[(zCount+zCountOffset) % 3];//.........这里部分代码省略.........
开发者ID:RaisingTheDerp,项目名称:raisingthebar,代码行数:101,


示例5: CG_AttachmentDir

/*===============CG_AttachmentDirReturn the attachment direction===============*/bool CG_AttachmentDir( attachment_t *a, vec3_t v ){	vec3_t    forward;	centity_t *cent;	if ( !a )	{		return false;	}	switch ( a->type )	{		case AT_STATIC:			return false;		case AT_TAG:			if ( !a->tagValid )			{				return false;			}			VectorCopy( a->re.axis[ 0 ], v );			break;		case AT_CENT:			if ( !a->centValid )			{				return false;			}			cent = &cg_entities[ a->centNum ];			AngleVectors( cent->lerpAngles, forward, nullptr, nullptr );			VectorCopy( forward, v );			break;		case AT_PARTICLE:			if ( !a->particleValid )			{				return false;			}			if ( !a->particle->valid )			{				a->particleValid = false;				return false;			}			else			{				VectorCopy( a->particle->velocity, v );			}			break;		default:			CG_Printf( S_ERROR "Invalid attachmentType_t in attachment/n" );			break;	}	VectorNormalize( v );	return true;}
开发者ID:BlueMustache,项目名称:Unvanquished,代码行数:68,


示例6: p_berserk_attack

void p_berserk_attack (edict_t *ent, int move_state){	int		punch_dmg = BERSERK_PUNCH_INITIAL_DAMAGE + BERSERK_PUNCH_ADDON_DAMAGE * ent->myskills.abilities[BERSERK].current_level;	int		slash_dmg = BERSERK_SLASH_INITIAL_DAMAGE + BERSERK_SLASH_ADDON_DAMAGE * ent->myskills.abilities[BERSERK].current_level;	int		crush_dmg = BERSERK_CRUSH_INITIAL_DAMAGE + BERSERK_CRUSH_ADDON_DAMAGE * ent->myskills.abilities[BERSERK].current_level;	vec3_t	forward, right, up, angles;	ent->client->idle_frames = 0;	AngleVectors(ent->s.angles, NULL, right, up);	AngleVectors(ent->client->v_angle, forward, NULL, NULL);	VectorCopy(ent->client->v_angle, angles);		if (move_state == BERSERK_RUN_FORWARD)	{		G_RunFrames(ent, BERSERK_FRAMES_RUNATTACK1_START, BERSERK_FRAMES_RUNATTACK1_END, false);		// swing left-right		if (ent->s.frame == 124)		{			angles[YAW] += 20;			AngleCheck(&angles[YAW]);			AngleVectors(angles, forward, NULL, NULL);			p_berserk_melee(ent, forward, NULL, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}		else if (ent->s.frame == 125)		{			p_berserk_melee(ent, forward, NULL, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}		else if (ent->s.frame == 126)		{			angles[YAW] -= 20;			AngleCheck(&angles[YAW]);			AngleVectors(angles, forward, NULL, NULL);			p_berserk_melee(ent, forward, NULL, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}	}	else if (move_state == BERSERK_RUN_BACKWARD)	{		G_RunFrames(ent, BERSERK_FRAMES_RUNATTACK1_START, BERSERK_FRAMES_RUNATTACK1_END, true);		// swing left-right		if (ent->s.frame == 124)		{			angles[YAW] += 20;			AngleCheck(&angles[YAW]);			AngleVectors(angles, forward, NULL, NULL);			p_berserk_melee(ent, forward, NULL, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}		else if (ent->s.frame == 125)		{			p_berserk_melee(ent, forward, NULL, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}		else if (ent->s.frame == 126)		{			angles[YAW] -= 20;			AngleCheck(&angles[YAW]);			AngleVectors(angles, forward, NULL, NULL);			p_berserk_melee(ent, forward, NULL, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}	}	else if (ent->client->weapon_mode == 1)	// slash	{		G_RunFrames(ent, BERSERK_FRAMES_SLASH_START, BERSERK_FRAMES_SLASH_END, false);		if ((ent->s.frame == 79) || (ent->s.frame == 80))			p_berserk_melee(ent, forward, up, slash_dmg, BERSERK_SLASH_KNOCKBACK, BERSERK_SLASH_RANGE, MOD_BERSERK_SLASH);	}	else if (ent->client->weapon_mode == 2)	// crush	{		G_RunFrames(ent, BERSERK_FRAMES_SLAM_START, BERSERK_FRAMES_SLAM_END, false);		if (ent->s.frame == 154)			p_berserk_crush(ent, crush_dmg, BERSERK_CRUSH_RANGE, MOD_BERSERK_CRUSH);	}	else // punch	{		G_RunFrames(ent, BERSERK_FRAMES_PUNCH_START, BERSERK_FRAMES_PUNCH_END, false);				// swing left-right		if (ent->s.frame == 66)		{			angles[YAW] += 20;//45;			AngleCheck(&angles[YAW]);			AngleVectors(angles, forward, NULL, NULL);			p_berserk_melee(ent, forward, right, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}		else if (ent->s.frame == 67)		{			p_berserk_melee(ent, forward, right, punch_dmg, BERSERK_PUNCH_KNOCKBACK, BERSERK_PUNCH_RANGE, MOD_BERSERK_PUNCH);		}		else if (ent->s.frame == 68)		{			angles[YAW] -= 20;//45;			AngleCheck(&angles[YAW]);			AngleVectors(angles, forward, NULL, NULL);//.........这里部分代码省略.........
开发者ID:zardoru,项目名称:vrxcl,代码行数:101,


示例7: EjectShell

void EjectShell (edict_t *self, vec3_t start, int toggle ){	edict_t *shell;	vec3_t  forward, right, up;	float           r;	float           fix = 1.0;		int left = 0;	if (sv_shelloff->value)		return;		shell = G_Spawn();	++shells;	AngleVectors (self->client->v_angle, forward, right, up);	if (self->client->pers.hand == LEFT_HANDED)		{			left = 1;			fix = -1.0;		}	else if ( self->client->pers.hand == CENTER_HANDED)		fix = 0;		// zucc spent a fair amount of time hacking these until they look ok,		// several of them could be improved however.	if (self->client->curr_weap == MK23_NUM )	{				VectorMA (start, left?-7:.4, right, start);		VectorMA (start, left?5:2, forward, start);		VectorMA (start, left?-10:-8 , up, start);	}               	else if (self->client->curr_weap == M4_NUM)	{               				VectorMA (start, left?-10:5, right, start);		VectorMA (start, left?6:12, forward, start);		VectorMA (start, left?-9:-11, up, start);	}	else if (self->client->curr_weap == MP5_NUM)	{				VectorMA (start, left?-10:6, right, start);		VectorMA (start, left?6:8, forward, start);		VectorMA (start, left?-9:-10, up, start);	}	else if (self->client->curr_weap == SNIPER_NUM)	{		VectorMA (start, fix*11, right, start);		VectorMA (start, 2, forward, start);		VectorMA (start, -11, up, start);			}		else if (self->client->curr_weap == M3_NUM)		{				VectorMA(start, left?-9:3, right, start);				VectorMA(start, left?4:4, forward, start);				VectorMA(start, left?-1:-1, up, start);		}			else if (self->client->curr_weap == DUAL_NUM)	{			   if (self->client->pers.hand == LEFT_HANDED)					VectorMA (start, ((toggle==1)?8:-8), right, start);	       else					VectorMA (start, ((toggle==1)?-4:4), right, start);			   VectorMA (start, 6, forward, start);	       VectorMA (start, -9, up, start);			}	if ( (forward[2] >= -1) && (forward[2] < -0.99) ) {   		VectorMA (start, 5, forward, start);		VectorMA (start, -0.5, up, start); }	else if ( (forward[2] >= -0.99) && (forward[2] < -0.98) ) {   		VectorMA (start, 5, forward, start);		VectorMA (start, -.1, up, start); }	else if ( (forward[2] >= -0.98) && (forward[2] < -0.97) ) {   		VectorMA (start, 5.1, forward, start);		VectorMA (start, 0.3, up, start); }	else if ( (forward[2] >= -0.97) && (forward[2] < -0.96) ) {   		VectorMA (start, 5.2, forward, start);		VectorMA (start, 0.7, up, start); }	else if ( (forward[2] >= -0.96) && (forward[2] < -0.95) ) {   		VectorMA (start, 5.2, forward, start);		VectorMA (start, 1.1, up, start); }	else if ( (forward[2] >= -0.95) && (forward[2] < -0.94) ) {   		VectorMA (start, 5.3, forward, start);		VectorMA (start, 1.5, up, start); }	else if ( (forward[2] >= -0.94) && (forward[2] < -0.93) ) {   		VectorMA (start, 5.4, forward, start);		VectorMA (start, 1.9, up, start); }	else if ( (forward[2] >= -0.93) && (forward[2] < -0.92) ) {   		VectorMA (start, 5.5, forward, start);		VectorMA (start, 2.3, up, start); }	else if ( (forward[2] >= -0.92) && (forward[2] < -0.91) ) {   		VectorMA (start, 5.6, forward, start);		VectorMA (start, 2.7, up, start); }//.........这里部分代码省略.........
开发者ID:darkshade9,项目名称:aq2-jmod,代码行数:101,


示例8: CG_OffsetThirdPersonView

static void CG_OffsetThirdPersonView(void){	vec3_t		forward, right, up;	vec3_t		view;	vec3_t		focusAngles;	trace_t		trace;	static vec3_t	mins = { -4, -4, -4 };	static vec3_t	maxs = { 4, 4, 4 };	vec3_t		focusPoint;	float		focusDist;	float		forwardScale, sideScale;	cg.refdef.vieworg[2] += cg.predictedPlayerState.viewheight;	VectorCopy(cg.refdefViewAngles, focusAngles);	// if dead, look at killer	if (cg.predictedPlayerState.stats[STAT_HEALTH] <= 0) {		focusAngles[YAW] = cg.predictedPlayerState.stats[STAT_DEAD_YAW];		cg.refdefViewAngles[YAW] = cg.predictedPlayerState.stats[STAT_DEAD_YAW];	}	if (focusAngles[PITCH] > 45) {		focusAngles[PITCH] = 45;		// don't go too far overhead	}	AngleVectors(focusAngles, forward, NULL, NULL);	VectorMA(cg.refdef.vieworg, FOCUS_DISTANCE, forward, focusPoint);	VectorCopy(cg.refdef.vieworg, view);	view[2] += 8;	cg.refdefViewAngles[PITCH] *= 0.5;	AngleVectors(cg.refdefViewAngles, forward, right, up);	forwardScale = cos(cg_thirdPersonAngle.value / 180 * M_PI);	sideScale = sin(cg_thirdPersonAngle.value / 180 * M_PI);	VectorMA(view, -cg_thirdPersonRange.value * forwardScale, forward, view);	VectorMA(view, -cg_thirdPersonRange.value * sideScale, right, view);	// trace a ray from the origin to the viewpoint to make sure the view isn't	// in a solid block.  Use an 8 by 8 block to prevent the view from near clipping anything	if (!cg_cameraMode.integer) {		CG_Trace(&trace, cg.refdef.vieworg, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID);		if (trace.fraction != 1.0) {			VectorCopy(trace.endpos, view);			view[2] += (1.0 - trace.fraction) * 32;			// try another trace to this position, because a tunnel may have the ceiling			// close enough that this is poking out			CG_Trace(&trace, cg.refdef.vieworg, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID);			VectorCopy(trace.endpos, view);		}	}	VectorCopy(view, cg.refdef.vieworg);	// select pitch to look at focus point from vieword	VectorSubtract(focusPoint, cg.refdef.vieworg, focusPoint);	focusDist = sqrt(focusPoint[0] * focusPoint[0] + focusPoint[1] * focusPoint[1]);	if (focusDist < 1) {		focusDist = 1;	// should never happen	}	cg.refdefViewAngles[PITCH] = -180 / M_PI * atan2(focusPoint[2], focusDist);	cg.refdefViewAngles[YAW] -= cg_thirdPersonAngle.value;}
开发者ID:baseas,项目名称:aftershock,代码行数:71,


示例9: CG_OffsetFirstPersonView

static void CG_OffsetFirstPersonView(void){	float			*origin;	float			*angles;	float			delta;	float			f;	int				timeDelta;		if (cg.snap->ps.pm_type == PM_INTERMISSION) {		return;	}	origin = cg.refdef.vieworg;	angles = cg.refdefViewAngles;	// if dead, fix the angle and don't add any kick	if (cg.snap->ps.stats[STAT_HEALTH] <= 0) {		angles[ROLL] = 40;		angles[PITCH] = -15;		angles[YAW] = cg.snap->ps.stats[STAT_DEAD_YAW];		origin[2] += cg.predictedPlayerState.viewheight;		return;	}	// add view height	origin[2] += cg.predictedPlayerState.viewheight;	// smooth out duck height changes	timeDelta = cg.time - cg.duckTime;	if (timeDelta < DUCK_TIME) {		cg.refdef.vieworg[2] -= cg.duckChange 			* (DUCK_TIME - timeDelta) / DUCK_TIME;	}	// add fall height	delta = cg.time - cg.landTime;	if (delta < LAND_DEFLECT_TIME) {		f = delta / LAND_DEFLECT_TIME;		cg.refdef.vieworg[2] += cg.landChange * f;	} else if (delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME) {		delta -= LAND_DEFLECT_TIME;		f = 1.0 - (delta / LAND_RETURN_TIME);		cg.refdef.vieworg[2] += cg.landChange * f;	}	// add step offset	CG_StepOffset();	// pivot the eye based on a neck length#if 0	{#define	NECK_LENGTH		8	vec3_t			forward, up; 	cg.refdef.vieworg[2] -= NECK_LENGTH;	AngleVectors(cg.refdefViewAngles, forward, NULL, up);	VectorMA(cg.refdef.vieworg, 3, forward, cg.refdef.vieworg);	VectorMA(cg.refdef.vieworg, NECK_LENGTH, up, cg.refdef.vieworg);	}#endif}
开发者ID:baseas,项目名称:aftershock,代码行数:61,


示例10: SV_IsPlayerVisibleFromPoint

/* * Tests whether the player entity ent is visible from the point origin. */qboolean SV_IsPlayerVisibleFromPoint( vec3_t origin, clientSnapshot_t *frame, sharedEntity_t *ent, vec3_t diff) {	int      i,contents_mask,goal_ent,viewer_clnum,ent_clnum,tries;	trace_t   tr;	vec3_t   start,end,dir,entangles,angles,temp,forward;	sharedEntity_t *viewer_ent;	client_t *viewer_cl, *ent_cl;	playerState_t *viewer_ps, *ent_ps;	float pitch;	viewer_clnum = frame->ps.clientNum; // get the client number of the viewer	ent_clnum = ent->s.clientNum; // get the client number of the other player	if (viewer_clnum == ent_clnum) { // in case the viewer is the player entity		return qtrue; // we don't need to hide us from ourselves	}	viewer_ps = &frame->ps;	ent_ps = SV_GameClientNum(ent_clnum);	if (viewer_ps->pm_type != PM_NORMAL) { // if the viewer is dead or spectating		return qtrue; // let every entity be visible	}	if (ent_ps->pm_type != PM_NORMAL || (ent->s.weapon == WP_NONE)) { // if the player entity is dead or spectating		return qtrue;	}	viewer_cl = svs.clients+viewer_clnum; // get the client of the viewer	ent_cl = svs.clients+ent_clnum; // get the client of the other player//	if (viewer_clnum > ent_clnum) { // if viewer_clnum > ent_clnum, we have already tested whether ent_clnum is able to see viewer_clnum.//		if (ent_cl->tracetimer[viewer_clnum] > sv.time) return qtrue; // and we could assume symmetry of SV_IsPlayerVisibleFromPoint//	}	if (viewer_cl->tracetimer[ent_clnum] > sv.time+MEMORY+10) { // if the sv.time has been reset		viewer_cl->tracetimer[ent_clnum] = sv.time; // reset the tracetimer	} else if (viewer_cl->tracetimer[ent_clnum] > (sv.time+MEMORY-10)) { // if we have recently seen this entity, we are lazy and assume it is still visible		// Com_Printf(va("client: %i, seen: %i/n", ent_clnum, viewer_cl->tracetimer[ent_clnum]));		return qtrue;	}	goal_ent = SV_NumForGentity(ent); // this might always be the same as ent_clnum	viewer_ent = SV_GentityNum(viewer_clnum);	contents_mask = CONTENTS_SOLID;// |CONTENTS_BODY will work for doors, but also for windows  |CONTENTS_PLAYERCLIP|CONTENTS_SOLID|CONTENTS_MOVER|CONTENTS_PLAYERCLIP//	if (seen->v.movetype == MOVETYPE_PUSH ) { //don't cull doors and plats :(//		return false;//	}//	if (sv_antiwallhack.value == 1)    //1 only check player models, 2 = check all ents//	if (strcmp(pr_strings + seen->v.classname, "player"))//	return qfalse;	// get camera origin (according to /cg_drawdebug 1)	start[0] = origin[0];	start[1] = origin[1];	start[2] = origin[2]+3.0f;	VectorCopy(viewer_ps->viewangles, angles);	AnglesNormalize180(angles);	pitch = angles[PITCH];	angles[PITCH] = 0;	angles[ROLL] = 0;	AngleVectors(angles, forward, NULL, NULL);	VectorScale(forward, (pitch/3.5f), temp);	VectorAdd( start, temp, start);	// if there is sufficient distance between viewer and player entity, check if player entity is within viewer's field of vision	VectorSubtract(ent->r.currentOrigin, start, dir);//	VectorAdd(ent->r.currentOrigin,dir,diff);// fill diff	VectorCopy(viewer_ent->s.pos.trBase,diff);// fill diff	vectoangles(dir, entangles);	dir[2]=0; // pretend, players are on the same level (the height should no be taken into account)	if (VectorLength(dir) > 1024) {// if it is not within close range (x,y-wise, not z-wise)		if (!InFieldOfVision(viewer_ps->viewangles, 60.f, entangles, ent_clnum)) {// If the player entity is not in the field of vision of the viewer//			 Com_Printf( va("behind: %i  vorg: %f,%f,%f  vang: %f,%f,%f  eorg: %f,%f,%f  dir: %f,%f,%f  eang: %f,%f,%f  ent: %i/n", viewer_clnum,origin[0],origin[1],origin[2],viewer_ps->viewangles[0],viewer_ps->viewangles[1],viewer_ps->viewangles[2],ent->r.currentOrigin[0],ent->r.currentOrigin[1],ent->r.currentOrigin[2],dir[0],dir[1],dir[2],entangles[0],entangles[1],entangles[2],ent_clnum));			return qtrue; // if the player entity is behind the viewer, abstain from any computations (and transmit the entity to hear sounds)//		} else {//			 Com_Printf( va("front: %i  vorg: %f,%f,%f  vang: %f,%f,%f  eorg: %f,%f,%f  dir: %f,%f,%f  eang: %f,%f,%f  ent: %i/n", viewer_clnum,origin[0],origin[1],origin[2],viewer_ps->viewangles[0],viewer_ps->viewangles[1],viewer_ps->viewangles[2],ent->r.currentOrigin[0],ent->r.currentOrigin[1],ent->r.currentOrigin[2],dir[0],dir[1],dir[2],entangles[0],entangles[1],entangles[2],ent_clnum));		}	}	// aim straight at the head of the entity from our eyes	end[0] = ent->r.currentOrigin[0];	end[1] = ent->r.currentOrigin[1];	end[2] = ent->r.currentOrigin[2]+ent->r.maxs[2];// "+3.0f" doesn't do it. "+ent->r.maxs[2]" is at the top of the BBox	VectorCopy(ent_ps->viewangles, angles);	AnglesNormalize180(angles);	pitch = angles[PITCH];	angles[PITCH] = 0;	angles[ROLL] = 0;	AngleVectors(angles, forward, NULL, NULL);	VectorScale(forward, (pitch/3.5f), temp);	VectorAdd( end, temp, end);	memset (&tr, 0, sizeof(tr));//.........这里部分代码省略.........
开发者ID:OADoctor,项目名称:SmokinGuns,代码行数:101,


示例11: CM_HintedTransformedBoxTrace

/** * @param[in] tile Tile to check (normally 0 - except in assembled maps) * @param[in] traceLine The start and stop vectors of the trace * @param[in] traceBox The box we shove through the world * @param[in] headnode if < 0 we are in a leaf node * @param[in] contentmask content flags the trace should stop at (see MASK_*) * @param[in] brushrejects brushes the trace should ignore (see MASK_*) * @param[in] origin center for rotating objects * @param[in] angles current rotation status (in degrees) for rotating objects * @param[in] rmaShift how much the object was shifted by the RMA process (needed for doors) * @param[in] fraction The furthest distance needed to trace before we stop. * @brief Handles offseting and rotation of the end points for moving and rotating entities * @sa CM_BoxTrace */trace_t CM_HintedTransformedBoxTrace (MapTile& tile, const Line& traceLine, const AABB& traceBox, const int headnode, const int contentmask, const int brushrejects, const vec3_t origin, const vec3_t angles, const vec3_t rmaShift, const float fraction){	vec3_t start_l, end_l;	vec3_t forward, right, up;	vec3_t temp;	bool rotated;	/* subtract origin offset */	VectorSubtract(traceLine.start, origin, start_l);	VectorSubtract(traceLine.stop, origin, end_l);	/* rotate start and end into the models frame of reference */	if (headnode != tile.box_headnode && VectorNotEmpty(angles)) {		rotated = true;	} else {		rotated = false;	}	if (rotated) {		AngleVectors(angles, forward, right, up);		VectorCopy(start_l, temp);		start_l[0] = DotProduct(temp, forward);		start_l[1] = -DotProduct(temp, right);		start_l[2] = DotProduct(temp, up);		VectorCopy(end_l, temp);		end_l[0] = DotProduct(temp, forward);		end_l[1] = -DotProduct(temp, right);		end_l[2] = DotProduct(temp, up);	}	/* When tracing through a model, we want to use the nodes, planes etc. as calculated by ufo2map.	 * But nodes and planes have been shifted in case of an RMA. At least for doors we need to undo the shift. */	if (VectorNotEmpty(origin)) {					/* only doors seem to have their origin set */		VectorAdd(start_l, rmaShift, start_l);		/* undo the shift */		VectorAdd(end_l, rmaShift, end_l);	}	/* sweep the box through the model */	boxtrace_t traceData;	traceData.init(&tile, contentmask, brushrejects, fraction);	traceData.setLineAndBox(Line(start_l, end_l), traceBox);	trace_t trace = TR_BoxTrace(traceData, Line(start_l, end_l), traceBox, headnode, fraction);	trace.mapTile = tile.idx;	if (rotated && trace.fraction != 1.0) {		vec3_t a;		/** @todo figure out how to do this with existing angles */		VectorNegate(angles, a);		AngleVectors(a, forward, right, up);		VectorCopy(trace.plane.normal, temp);		trace.plane.normal[0] = DotProduct(temp, forward);		trace.plane.normal[1] = -DotProduct(temp, right);		trace.plane.normal[2] = DotProduct(temp, up);	}	VectorInterpolation(traceLine.start, traceLine.stop, trace.fraction, trace.endpos);	return trace;}
开发者ID:nicogiraldi,项目名称:ufoai,代码行数:76,


示例12: ShutDownLightHandle

void C_EnvProjectedTexture::UpdateLight( bool bForceUpdate ){	if ( m_bState == false )	{		if ( m_LightHandle != CLIENTSHADOW_INVALID_HANDLE )		{			ShutDownLightHandle();		}		return;	}	Vector vForward, vRight, vUp, vPos = GetAbsOrigin();	FlashlightState_t state;	if ( m_hTargetEntity != NULL )	{		if ( m_bCameraSpace )		{			const QAngle &angles = GetLocalAngles();			C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();			if( pPlayer )			{				const QAngle playerAngles = pPlayer->GetAbsAngles();								Vector vPlayerForward, vPlayerRight, vPlayerUp;				AngleVectors( playerAngles, &vPlayerForward, &vPlayerRight, &vPlayerUp );            	matrix3x4_t	mRotMatrix;				AngleMatrix( angles, mRotMatrix );				VectorITransform( vPlayerForward, mRotMatrix, vForward );				VectorITransform( vPlayerRight, mRotMatrix, vRight );				VectorITransform( vPlayerUp, mRotMatrix, vUp );				float dist = (m_hTargetEntity->GetAbsOrigin() - GetAbsOrigin()).Length();				vPos = m_hTargetEntity->GetAbsOrigin() - vForward*dist;				VectorNormalize( vForward );				VectorNormalize( vRight );				VectorNormalize( vUp );			}		}		else		{			vForward = m_hTargetEntity->GetAbsOrigin() - GetAbsOrigin();			VectorNormalize( vForward );			// JasonM - unimplemented			Assert (0);			//Quaternion q = DirectionToOrientation( dir );			//			// JasonM - set up vRight, vUp			////			VectorNormalize( vRight );//			VectorNormalize( vUp );		}	}	else	{		AngleVectors( GetAbsAngles(), &vForward, &vRight, &vUp );	}	state.m_fHorizontalFOVDegrees = m_flLightFOV;	state.m_fVerticalFOVDegrees = m_flLightFOV;	state.m_vecLightOrigin = vPos;	BasisToQuaternion( vForward, vRight, vUp, state.m_quatOrientation );	state.m_fQuadraticAtten = 0.0;	state.m_fLinearAtten = 100;	state.m_fConstantAtten = 0.0f;	state.m_Color[0] = m_LinearFloatLightColor.x;	state.m_Color[1] = m_LinearFloatLightColor.y;	state.m_Color[2] = m_LinearFloatLightColor.z;	state.m_Color[3] = 0.0f; // fixme: need to make ambient work m_flAmbient;	state.m_NearZ = m_flNearZ;	state.m_FarZ = m_flFarZ;	state.m_flShadowSlopeScaleDepthBias = mat_slopescaledepthbias_shadowmap.GetFloat();	state.m_flShadowDepthBias = mat_depthbias_shadowmap.GetFloat();	state.m_bEnableShadows = m_bEnableShadows;	state.m_pSpotlightTexture = materials->FindTexture( m_SpotlightTextureName, TEXTURE_GROUP_OTHER, false );	state.m_nSpotlightTextureFrame = m_nSpotlightTextureFrame;	state.m_nShadowQuality = m_nShadowQuality; // Allow entity to affect shadow quality	if( m_LightHandle == CLIENTSHADOW_INVALID_HANDLE )	{		m_LightHandle = g_pClientShadowMgr->CreateFlashlight( state );	}	else	{		if ( m_hTargetEntity != NULL || bForceUpdate == true )		{			g_pClientShadowMgr->UpdateFlashlightState( m_LightHandle, state );//.........这里部分代码省略.........
开发者ID:1n73rf4c3,项目名称:source-sdk-2013,代码行数:101,


示例13: Assert

//-----------------------------------------------------------------------------//// Look for vgui screens, returns true if it found one ...////-----------------------------------------------------------------------------C_BaseEntity *FindNearbyVguiScreen( const Vector &viewPosition, const QAngle &viewAngle, int nTeam ){	if ( IsX360() )	{		// X360TBD: Turn this on if feature actually used		return NULL;	}	C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();	Assert( pLocalPlayer );	if ( !pLocalPlayer )		return NULL;	// Get the view direction...	Vector lookDir;	AngleVectors( viewAngle, &lookDir );	// Create a ray used for raytracing 	Vector lookEnd;	VectorMA( viewPosition, 2.0f * VGUI_SCREEN_MODE_RADIUS, lookDir, lookEnd );	Ray_t lookRay;	lookRay.Init( viewPosition, lookEnd );	// Look for vgui screens that are close to the player	CVGuiScreenEnumerator localScreens;	partition->EnumerateElementsInSphere( PARTITION_CLIENT_NON_STATIC_EDICTS, viewPosition, VGUI_SCREEN_MODE_RADIUS, false, &localScreens );	Vector vecOut, vecViewDelta;	float flBestDist = 2.0f;	C_VGuiScreen *pBestScreen = NULL;	for (int i = localScreens.GetScreenCount(); --i >= 0; )	{		C_VGuiScreen *pScreen = localScreens.GetVGuiScreen(i);		if ( pScreen->IsAttachedToViewModel() )			continue;		// Don't bother with screens I'm behind...		// Hax - don't cancel backfacing with viewmodel attached screens.		// we can get prediction bugs that make us backfacing for one frame and		// it resets the mouse position if we lose focus.		if ( pScreen->IsBackfacing(viewPosition) )			continue;		// Don't bother with screens that are turned off		if (!pScreen->IsActive())			continue;		// FIXME: Should this maybe go into a derived class of some sort?		// Don't bother with screens on the wrong team		if (!pScreen->IsVisibleToTeam(nTeam))			continue;		if ( !pScreen->AcceptsInput() )			continue;		if ( pScreen->IsInputOnlyToOwner() && pScreen->GetPlayerOwner() != pLocalPlayer )			continue;		// Test perpendicular distance from the screen...		pScreen->GetVectors( NULL, NULL, &vecOut );		VectorSubtract( viewPosition, pScreen->GetAbsOrigin(), vecViewDelta );		float flPerpDist = DotProduct(vecViewDelta, vecOut);		if ( (flPerpDist < 0) || (flPerpDist > VGUI_SCREEN_MODE_RADIUS) )			continue;		// Perform a raycast to see where in barycentric coordinates the ray hits		// the viewscreen; if it doesn't hit it, you're not in the mode		float u, v, t;		if (!pScreen->IntersectWithRay( lookRay, &u, &v, &t ))			continue;		// Barycentric test		if ((u < 0) || (v < 0) || (u > 1) || (v > 1))			continue;		if ( t < flBestDist )		{			flBestDist = t;			pBestScreen = pScreen;		}	}		return pBestScreen;}
开发者ID:NEITMod,项目名称:HL2BM2,代码行数:94,


示例14: SP_trigger_fog

void SP_trigger_fog (edict_t *self){	fog_t *fog;	if( !allow_fog->value )	{		G_FreeEdict(self);		return;	}	if(deathmatch->value || coop->value)	{		G_FreeEdict(self);		return;	}	self->class_id = ENTITY_TRIGGER_FOG;	if(!level.fogs) level.fogs = 1;   // 1st fog reserved for console commands	if(level.fogs >= MAX_FOGS)	{		gi.dprintf("Maximum number of fogs exceeded!/n");		G_FreeEdict(self);		return;	}	self->fog_index = level.fogs+1;	fog = &gfogs[level.fogs];	fog->Trigger = true;	fog->Model   = self->fog_model;	if(fog->Model < 0 || fog->Model > 2) fog->Model = 0;	fog->GL_Model = GLModels[fog->Model];	VectorCopy(self->fog_color,fog->Color);	if(self->spawnflags & FOG_TURNOFF)	{		fog->Near    = 4999;		fog->Far     = 5000;		fog->Density = 0;		fog->Density1 = 0;		fog->Density2 = 0;	}	else	{		fog->Near    = self->fog_near;		fog->Far     = self->fog_far;		fog->Density = self->fog_density;		fog->Density1 = self->fog_density;		if(self->density == 0.)			self->density = self->fog_density;		else if(self->density < 0.)			self->density = 0.;		fog->Density2= self->density;	}	if(!(self->spawnflags & FOG_STARTOFF))		self->spawnflags |= FOG_ON;	AngleVectors(self->s.angles,fog->Dir,0,0);	VectorClear(self->s.angles);	fog->ent     = self;	level.fogs++;	level.trigger_fogs++;	self->movetype = MOVETYPE_NONE;	self->svflags |= SVF_NOCLIENT;	self->solid = SOLID_NOT;	gi.setmodel (self, self->model);	gi.linkentity(self);}
开发者ID:AimHere,项目名称:thirty-flights-of-linux,代码行数:67,


示例15: CollisionProp

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CPropAPC::Event_Killed( const CTakeDamageInfo &info ){	m_OnDeath.FireOutput( info.GetAttacker(), this );	Vector vecAbsMins, vecAbsMaxs;	CollisionProp()->WorldSpaceAABB( &vecAbsMins, &vecAbsMaxs );	Vector vecNormalizedMins, vecNormalizedMaxs;	CollisionProp()->WorldToNormalizedSpace( vecAbsMins, &vecNormalizedMins );	CollisionProp()->WorldToNormalizedSpace( vecAbsMaxs, &vecNormalizedMaxs );	Vector vecAbsPoint;	CPASFilter filter( GetAbsOrigin() );	for (int i = 0; i < 5; i++)	{		CollisionProp()->RandomPointInBounds( vecNormalizedMins, vecNormalizedMaxs, &vecAbsPoint );		te->Explosion( filter, random->RandomFloat( 0.0, 1.0 ),	&vecAbsPoint, 			g_sModelIndexFireball, random->RandomInt( 4, 10 ), 			random->RandomInt( 8, 15 ), 			( i < 2 ) ? TE_EXPLFLAG_NODLIGHTS : TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NOFIREBALLSMOKE | TE_EXPLFLAG_NODLIGHTS,			100, 0 );	}	// TODO: make the gibs spawn in sync with the delayed explosions	int nGibs = random->RandomInt( 1, 4 );	for ( int i = 0; i < nGibs; i++)	{		// Throw a flaming, smoking chunk.		CGib *pChunk = CREATE_ENTITY( CGib, "gib" );		pChunk->Spawn( "models/gibs/hgibs.mdl" );		pChunk->SetBloodColor( DONT_BLEED );		QAngle vecSpawnAngles;		vecSpawnAngles.Random( -90, 90 );		pChunk->SetAbsOrigin( vecAbsPoint );		pChunk->SetAbsAngles( vecSpawnAngles );		int nGib = random->RandomInt( 0, APC_MAX_CHUNKS - 1 );		pChunk->Spawn( s_pChunkModelName[nGib] );		pChunk->SetOwnerEntity( this );		pChunk->m_lifeTime = random->RandomFloat( 6.0f, 8.0f );		pChunk->SetCollisionGroup( COLLISION_GROUP_DEBRIS );		IPhysicsObject *pPhysicsObject = pChunk->VPhysicsInitNormal( SOLID_VPHYSICS, pChunk->GetSolidFlags(), false );				// Set the velocity		if ( pPhysicsObject )		{			pPhysicsObject->EnableMotion( true );			Vector vecVelocity;			QAngle angles;			angles.x = random->RandomFloat( -20, 20 );			angles.y = random->RandomFloat( 0, 360 );			angles.z = 0.0f;			AngleVectors( angles, &vecVelocity );						vecVelocity *= random->RandomFloat( 300, 900 );			vecVelocity += GetAbsVelocity();			AngularImpulse angImpulse;			angImpulse = RandomAngularImpulse( -180, 180 );			pChunk->SetAbsVelocity( vecVelocity );			pPhysicsObject->SetVelocity(&vecVelocity, &angImpulse );		}		CEntityFlame *pFlame = CEntityFlame::Create( pChunk, false );		if ( pFlame != NULL )		{			pFlame->SetLifetime( pChunk->m_lifeTime );		}	}	UTIL_ScreenShake( vecAbsPoint, 25.0, 150.0, 1.0, 750.0f, SHAKE_START );	if( hl2_episodic.GetBool() )	{		// EP1 perf hit		Ignite( 6, false );	}	else	{		Ignite( 60, false );	}	m_lifeState = LIFE_DYING;	// Spawn a lesser amount if the player is close	m_iRocketSalvoLeft = DEATH_VOLLEY_ROCKET_COUNT;	m_flRocketTime = gpGlobals->curtime;}
开发者ID:Au-heppa,项目名称:source-sdk-2013,代码行数:94,


示例16: EV_FireSG552

void EV_FireSG552( event_args_t *args ){	int idx;	vec3_t origin;	vec3_t angles;	vec3_t velocity;	vec3_t ShellVelocity;	vec3_t ShellOrigin;	int shell;	vec3_t vecSrc, vecAiming;	vec3_t up, right, forward;	idx = args->entindex;	VectorCopy( args->origin, origin );	angles.x = (long double)args->iparam1 / 100 + args->angles[0];	angles.y = (long double)args->iparam2 / 100 + args->angles[1];	angles.z = args->angles[2];		VectorCopy( args->velocity, velocity );	AngleVectors( angles, forward, right, up );	if ( EV_IsLocal( idx ) )	{		++g_iShotsFired;		EV_MuzzleFlash();		gEngfuncs.pEventAPI->EV_WeaponAnimation(gEngfuncs.pfnRandomLong(SG552_SHOOT1, SG552_SHOOT3), 2);		if( !cl_righthand->value )		{			EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -8.0, -10.0, 0);		}		else		{			EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -8.0, 10.0, 0);		}	}	else	{		EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -12.0, 4.0, 0);	}	shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/rshell.mdl");	EV_EjectBrass(ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL);	gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,		gEngfuncs.pfnRandomLong( 0, 1 ) ? "weapons/sg552-1.wav" : "weapons/sg552-2.wav",		1, ATTN_NORM, 0,		94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );	EV_GetGunPosition( args, vecSrc, origin );	VectorCopy( forward, vecAiming );	Vector vSpread;	int tracerCount;	vSpread.x = args->fparam1;	vSpread.y = args->fparam2;	EV_HLDM_FireBullets( idx,		forward, right,	up,		1, vecSrc, vecAiming,		vSpread, 8192.0, BULLET_PLAYER_556MM, 0, &tracerCount,		2 );}
开发者ID:AlexCSilva,项目名称:cs16-client,代码行数:62,


示例17: R_DrawSprite

/*================R_DrawSprite================*/void R_DrawSprite (void){	int				i;	msprite_t		*psprite;	vec3_t			tvec;	float			dot, angle, sr, cr;	psprite = currententity->model->cache.data;	r_spritedesc.pspriteframe = R_GetSpriteframe (psprite);	sprite_width = r_spritedesc.pspriteframe->width;	sprite_height = r_spritedesc.pspriteframe->height;// TODO: make this caller-selectable	if (psprite->type == SPR_FACING_UPRIGHT)	{	// generate the sprite's axes, with vup straight up in worldspace, and	// r_spritedesc.vright perpendicular to modelorg.	// This will not work if the view direction is very close to straight up or	// down, because the cross product will be between two nearly parallel	// vectors and starts to approach an undefined state, so we don't draw if	// the two vectors are less than 1 degree apart		tvec[0] = -modelorg[0];		tvec[1] = -modelorg[1];		tvec[2] = -modelorg[2];		VectorNormalize (tvec);		dot = tvec[2];	// same as DotProduct (tvec, r_spritedesc.vup) because						//  r_spritedesc.vup is 0, 0, 1		if ((dot > 0.999848) || (dot < -0.999848))	// cos(1 degree) = 0.999848			return;		r_spritedesc.vup[0] = 0;		r_spritedesc.vup[1] = 0;		r_spritedesc.vup[2] = 1;		r_spritedesc.vright[0] = tvec[1];								// CrossProduct(r_spritedesc.vup, -modelorg,		r_spritedesc.vright[1] = -tvec[0];								//              r_spritedesc.vright)		r_spritedesc.vright[2] = 0;		VectorNormalize (r_spritedesc.vright);		r_spritedesc.vpn[0] = -r_spritedesc.vright[1];		r_spritedesc.vpn[1] = r_spritedesc.vright[0];		r_spritedesc.vpn[2] = 0;					// CrossProduct (r_spritedesc.vright, r_spritedesc.vup,					//  r_spritedesc.vpn)	}	else if (psprite->type == SPR_VP_PARALLEL)	{	// generate the sprite's axes, completely parallel to the viewplane. There	// are no problem situations, because the sprite is always in the same	// position relative to the viewer		for (i=0 ; i<3 ; i++)		{			r_spritedesc.vup[i] = vup[i];			r_spritedesc.vright[i] = vright[i];			r_spritedesc.vpn[i] = vpn[i];		}	}	else if (psprite->type == SPR_VP_PARALLEL_UPRIGHT)	{	// generate the sprite's axes, with vup straight up in worldspace, and	// r_spritedesc.vright parallel to the viewplane.	// This will not work if the view direction is very close to straight up or	// down, because the cross product will be between two nearly parallel	// vectors and starts to approach an undefined state, so we don't draw if	// the two vectors are less than 1 degree apart		dot = vpn[2];	// same as DotProduct (vpn, r_spritedesc.vup) because						//  r_spritedesc.vup is 0, 0, 1		if ((dot > 0.999848) || (dot < -0.999848))	// cos(1 degree) = 0.999848			return;		r_spritedesc.vup[0] = 0;		r_spritedesc.vup[1] = 0;		r_spritedesc.vup[2] = 1;		r_spritedesc.vright[0] = vpn[1];										// CrossProduct (r_spritedesc.vup, vpn,		r_spritedesc.vright[1] = -vpn[0];	//  r_spritedesc.vright)		r_spritedesc.vright[2] = 0;		VectorNormalize (r_spritedesc.vright);		r_spritedesc.vpn[0] = -r_spritedesc.vright[1];		r_spritedesc.vpn[1] = r_spritedesc.vright[0];		r_spritedesc.vpn[2] = 0;					// CrossProduct (r_spritedesc.vright, r_spritedesc.vup,					//  r_spritedesc.vpn)	}	else if (psprite->type == SPR_ORIENTED)	{	// generate the sprite's axes, according to the sprite's world orientation		AngleVectors (currententity->angles, r_spritedesc.vpn,					  r_spritedesc.vright, r_spritedesc.vup);	}	else if (psprite->type == SPR_VP_PARALLEL_ORIENTED)	{	// generate the sprite's axes, parallel to the viewplane, but rotated in	// that plane around the center according to the sprite entity's roll	// angle. So vpn stays the same, but vright and vup rotate//.........这里部分代码省略.........
开发者ID:bsmr-games,项目名称:Hexen2,代码行数:101,


示例18: G_MissileImpact

void G_MissileImpact( gentity_t *ent, trace_t *trace ) {	gentity_t		*other;	qboolean		hitClient = qfalse;	qboolean		isKnockedSaber = 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;	}	else if (ent->neverFree && ent->s.weapon == WP_SABER && (ent->flags & FL_BOUNCE_HALF))	{ //this is a knocked-away saber		if (ent->bounceCount > 0 || ent->bounceCount == -5)		{			G_BounceMissile( ent, trace );			G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 );			return;		}		isKnockedSaber = qtrue;	}		// I would glom onto the FL_BOUNCE code section above, but don't feel like risking breaking something else	if ( (!other->takedamage && (ent->bounceCount > 0 || ent->bounceCount == -5) && ( ent->flags&(FL_BOUNCE_SHRAPNEL) ) ) || ((trace->surfaceFlags&SURF_FORCEFIELD)&&!ent->splashDamage&&!ent->splashRadius&&(ent->bounceCount > 0 || ent->bounceCount == -5)) ) 	{		G_BounceMissile( ent, trace );		if ( ent->bounceCount < 1 )		{			ent->flags &= ~FL_BOUNCE_SHRAPNEL;		}		return;	}	/*	if ( !other->takedamage && ent->s.weapon == WP_THERMAL && !ent->alt_fire )	{//rolling thermal det - FIXME: make this an eFlag like bounce & stick!!!		//G_BounceRollMissile( ent, trace );		if ( ent->owner && ent->owner->s.number == 0 ) 		{			G_MissileAddAlerts( ent );		}		//gi.linkentity( ent );		return;	}	*/	if ((other->r.contents & CONTENTS_LIGHTSABER) && !isKnockedSaber)	{ //hit this person's saber, so..		gentity_t *otherOwner = &g_entities[other->r.ownerNum];		if (otherOwner->takedamage && otherOwner->client && otherOwner->client->ps.duelInProgress &&			otherOwner->client->ps.duelIndex != ent->r.ownerNum)		{			goto killProj;		}	}	else if (!isKnockedSaber)	{		if (other->takedamage && other->client && other->client->ps.duelInProgress &&			other->client->ps.duelIndex != ent->r.ownerNum)		{			goto killProj;		}	}	if (other->flags & FL_DMG_BY_HEAVY_WEAP_ONLY)	{		if (ent->methodOfDeath != MOD_REPEATER_ALT &&			ent->methodOfDeath != MOD_ROCKET &&			ent->methodOfDeath != MOD_FLECHETTE_ALT_SPLASH &&			ent->methodOfDeath != MOD_ROCKET_HOMING &&			ent->methodOfDeath != MOD_THERMAL &&			ent->methodOfDeath != MOD_THERMAL_SPLASH &&			ent->methodOfDeath != MOD_TRIP_MINE_SPLASH &&			ent->methodOfDeath != MOD_TIMED_MINE_SPLASH &&			ent->methodOfDeath != MOD_DET_PACK_SPLASH &&			ent->methodOfDeath != MOD_VEHICLE &&			ent->methodOfDeath != MOD_CONC &&			ent->methodOfDeath != MOD_CONC_ALT &&			ent->methodOfDeath != MOD_SABER &&			ent->methodOfDeath != MOD_TURBLAST)		{			vec3_t fwd;			if (trace)			{				VectorCopy(trace->plane.normal, fwd);			}			else			{ //oh well				AngleVectors(other->r.currentAngles, fwd, NULL, NULL);			}			G_DeflectMissile(other, ent, fwd);//.........这里部分代码省略.........
开发者ID:dmead,项目名称:jkaq3,代码行数:101,


示例19: hyperspace_touch

void hyperspace_touch( gentity_t *self, gentity_t *other, trace_t *trace ){	gentity_t *ent;	if (!other || !other->inuse || !other->client ||		other->s.number < MAX_CLIENTS ||		!other->m_pVehicle)	{ //only let vehicles touch		return;	}	if ( other->client->ps.hyperSpaceTime && level.time - other->client->ps.hyperSpaceTime < HYPERSPACE_TIME )	{//already hyperspacing, just keep us moving		if ( (other->client->ps.eFlags2&EF2_HYPERSPACE) )		{//they've started the hyperspace but haven't been teleported yet			float timeFrac = ((float)(level.time-other->client->ps.hyperSpaceTime))/HYPERSPACE_TIME;			if ( timeFrac >= HYPERSPACE_TELEPORT_FRAC )			{//half-way, now teleport them!				vec3_t	diff, fwd, right, up, newOrg;				float	fDiff, rDiff, uDiff;				//take off the flag so we only do this once				other->client->ps.eFlags2 &= ~EF2_HYPERSPACE;				//Get the offset from the local position				ent = G_Find (NULL, FOFS(targetname), self->target);				if (!ent || !ent->inuse)				{ //this is bad					trap->Error(ERR_DROP, "trigger_hyperspace has invalid target '%s'/n", self->target);					return;				}				VectorSubtract( other->client->ps.origin, ent->s.origin, diff );				AngleVectors( ent->s.angles, fwd, right, up );				fDiff = DotProduct( fwd, diff );				rDiff = DotProduct( right, diff );				uDiff = DotProduct( up, diff );				//Now get the base position of the destination				ent = G_Find (NULL, FOFS(targetname), self->target2);				if (!ent || !ent->inuse)				{ //this is bad					trap->Error(ERR_DROP, "trigger_hyperspace has invalid target2 '%s'/n", self->target2);					return;				}				VectorCopy( ent->s.origin, newOrg );				//finally, add the offset into the new origin				AngleVectors( ent->s.angles, fwd, right, up );				VectorMA( newOrg, fDiff, fwd, newOrg );				VectorMA( newOrg, rDiff, right, newOrg );				VectorMA( newOrg, uDiff, up, newOrg );				//trap->Print("hyperspace from %s to %s/n", vtos(other->client->ps.origin), vtos(newOrg) );				//now put them in the offset position, facing the angles that position wants them to be facing				TeleportPlayer( other, newOrg, ent->s.angles );				if ( other->m_pVehicle && other->m_pVehicle->m_pPilot )				{//teleport the pilot, too					TeleportPlayer( (gentity_t*)other->m_pVehicle->m_pPilot, newOrg, ent->s.angles );					//FIXME: and the passengers?				}				//make them face the new angle				//other->client->ps.hyperSpaceIndex = ent->s.number;				VectorCopy( ent->s.angles, other->client->ps.hyperSpaceAngles );				//sound				G_Sound( other, CHAN_LOCAL, G_SoundIndex( "sound/vehicles/common/hyperend.wav" ) );			}		}		return;	}	else	{		ent = G_Find (NULL, FOFS(targetname), self->target);		if (!ent || !ent->inuse)		{ //this is bad			trap->Error(ERR_DROP, "trigger_hyperspace has invalid target '%s'/n", self->target);			return;		}		if (!other->client->ps.m_iVehicleNum || other->m_pVehicle->m_iRemovedSurfaces)		{ //if a vehicle touches a boundary without a pilot in it or with parts missing, just blow the thing up			G_Damage(other, other, other, NULL, other->client->ps.origin, 99999, DAMAGE_NO_PROTECTION, MOD_SUICIDE);			return;		}		//other->client->ps.hyperSpaceIndex = ent->s.number;		VectorCopy( ent->s.angles, other->client->ps.hyperSpaceAngles );		other->client->ps.hyperSpaceTime = level.time;	}}
开发者ID:lNightCrawlerl,项目名称:JediKnightGalaxies,代码行数:83,


示例20: switch

//-----------------------------------------------------------------------------// Purpose: Catches the monster-specific messages that occur when tagged//			animation frames are played.// Input  : *pEvent - //-----------------------------------------------------------------------------void CNPC_Headcrab::HandleAnimEvent( animevent_t *pEvent ){	switch ( pEvent->event )	{		case HC_AE_JUMPATTACK:		{			RemoveFlag( FL_ONGROUND );			//			// Take him off ground so engine doesn't instantly reset FL_ONGROUND.			//			UTIL_SetOrigin( this, GetAbsOrigin() + Vector( 0 , 0 , 1 ));			Vector vecJumpDir;			CBaseEntity *pEnemy = GetEnemy();			if ( pEnemy )			{				Vector vecEnemyEyePos = pEnemy->EyePosition();				float gravity = sv_gravity.GetFloat();				if ( gravity <= 1 )				{					gravity = 1;				}				//				// How fast does the headcrab need to travel to reach my enemy's eyes given gravity?				//				float height = ( vecEnemyEyePos.z - GetAbsOrigin().z );				if ( height < 16 )				{					height = 16;				}				else if ( height > 120 )				{					height = 120;				}				float speed = sqrt( 2 * gravity * height );				float time = speed / gravity;				//				// Scale the sideways velocity to get there at the right time				//				vecJumpDir = vecEnemyEyePos - GetAbsOrigin();				vecJumpDir = vecJumpDir / time;				//				// Speed to offset gravity at the desired height.				//				vecJumpDir.z = speed;				//				// Don't jump too far/fast.				//				float distance = vecJumpDir.Length();				if ( distance > 650 )				{					vecJumpDir = vecJumpDir * ( 650.0 / distance );				}			}			else			{				//				// Jump hop, don't care where.				//				Vector forward, up;				AngleVectors( GetAbsAngles(), &forward, NULL, &up );				vecJumpDir = Vector( forward.x, forward.y, up.z ) * 350;			}			int iSound = random->RandomInt( 0 , 1 );			if ( iSound != 0 )			{				AttackSound();			}			SetAbsVelocity( vecJumpDir );			m_flNextAttack = gpGlobals->curtime + 2;			break;		}		default:		{			CAI_BaseNPC::HandleAnimEvent( pEvent );			break;		}	}}
开发者ID:RaisingTheDerp,项目名称:raisingthebar,代码行数:93,


示例21: Touch_Multi

void Touch_Multi( gentity_t *self, gentity_t *other, trace_t *trace ) {	if( !other->client ) 	{		return;	}	if ( self->flags & FL_INACTIVE )	{//set by target_deactivate		return;	}#ifdef _PHASE1	if (self->spawnflags & 32 && jkg_arearestrictions.integer)	{		return;	// eezstreet: Pande's orders	}#endif	if( self->alliedTeam )	{		if ( other->client->sess.sessionTeam != self->alliedTeam )		{			return;		}	}// moved to just above multi_trigger because up here it just checks if the trigger is not being touched// we want it to check any conditions set on the trigger, if one of those isn't met, the trigger is considered to be "cleared"//	if ( self->e_ThinkFunc == thinkF_trigger_cleared_fire )//	{//We're waiting to fire our target2 first//		self->nextthink = level.time + self->speed;//		return;//	}	if ( self->spawnflags & 1 )	{		if ( other->s.eType == ET_NPC )		{			return;		}	}	else	{		if ( self->spawnflags & 16 )		{//NPCONLY			if ( other->NPC == NULL )			{				return;			}		}		if ( self->NPC_targetname && self->NPC_targetname[0] )		{			if ( other->script_targetname && other->script_targetname[0] )			{				if ( Q_stricmp( self->NPC_targetname, other->script_targetname ) != 0 )				{//not the right guy to fire me off					return;				}			}			else			{				return;			}		}	}	if ( self->spawnflags & 2 )	{//FACING		vec3_t	forward;		AngleVectors( other->client->ps.viewangles, forward, NULL, NULL );		if ( DotProduct( self->movedir, forward ) < 0.5 )		{//Not Within 45 degrees			return;		}	}	if ( self->spawnflags & 4 )	{//USE_BUTTON		if( !( other->client->pers.cmd.buttons & BUTTON_USE ) )		{//not pressing use button			return;		}		if ((other->client->ps.weaponTime > 0 && other->client->ps.torsoAnim != BOTH_BUTTON_HOLD && other->client->ps.torsoAnim != BOTH_CONSOLE1) || other->health < 1 ||			(other->client->ps.pm_flags & PMF_FOLLOW) || other->client->sess.sessionTeam == TEAM_SPECTATOR ||			other->client->ps.forceHandExtend != HANDEXTEND_NONE)		{ //player has to be free of other things to use.			return;		}		if (self->genericValue7)		{ //we have to be holding the use key in this trigger for x milliseconds before firing			if (!G_PointInBounds( other->client->ps.origin, self->r.absmin, self->r.absmax ))			{				return;			}//.........这里部分代码省略.........
开发者ID:lNightCrawlerl,项目名称:JediKnightGalaxies,代码行数:101,


示例22: pitch_roll_for_slope

void pitch_roll_for_slope( gentity_t *forwhom, vec3_t pass_slope ){	vec3_t	slope;	vec3_t	nvf, ovf, ovr, startspot, endspot, new_angles = { 0, 0, 0 };	float	pitch, mod, dot;	float	oldmins2;	//if we don't have a slope, get one	if( !pass_slope || VectorCompare( vec3_origin, pass_slope ) )	{		trace_t trace;		VectorCopy( forwhom->r.currentOrigin, startspot );		startspot[2] += forwhom->r.mins[2] + 4;		VectorCopy( startspot, endspot );		endspot[2] -= 300;		trap_Trace( &trace, forwhom->r.currentOrigin, vec3_origin, vec3_origin, endspot, forwhom->s.number, MASK_SOLID );//		if(trace_fraction>0.05&&forwhom.movetype==MOVETYPE_STEP)//			forwhom.flags(-)FL_ONGROUND;		if ( trace.fraction >= 1.0 )			return;		if( !( &trace.plane ) )			return;		if ( VectorCompare( vec3_origin, trace.plane.normal ) )			return;		VectorCopy( trace.plane.normal, slope );	}	else	{		VectorCopy( pass_slope, slope );	}	AngleVectors( forwhom->r.currentAngles, ovf, ovr, NULL );	vectoangles( slope, new_angles );	pitch = new_angles[PITCH] + 90;	new_angles[ROLL] = new_angles[PITCH] = 0;	AngleVectors( new_angles, nvf, NULL, NULL );	mod = DotProduct( nvf, ovr );	if ( mod<0 )		mod = -1;	else		mod = 1;	dot = DotProduct( nvf, ovf );	if ( forwhom->client )	{		forwhom->client->ps.viewangles[PITCH] = dot * pitch;		forwhom->client->ps.viewangles[ROLL] = ((1-Q_fabs(dot)) * pitch * mod);		oldmins2 = forwhom->r.mins[2];		forwhom->r.mins[2] = -24 + 12 * fabs(forwhom->client->ps.viewangles[PITCH])/180.0f;		//FIXME: if it gets bigger, move up		if ( oldmins2 > forwhom->r.mins[2] )		{//our mins is now lower, need to move up			//FIXME: trace?			forwhom->client->ps.origin[2] += (oldmins2 - forwhom->r.mins[2]);			forwhom->r.currentOrigin[2] = forwhom->client->ps.origin[2];			trap_LinkEntity( forwhom );		}	}	else	{		forwhom->r.currentAngles[PITCH] = dot * pitch;		forwhom->r.currentAngles[ROLL] = ((1-Q_fabs(dot)) * pitch * mod);	}}
开发者ID:Boothand,项目名称:jk2mp,代码行数:75,


示例23: Fog

void Fog (edict_t *ent) //vec3_t viewpoint){	edict_t	*triggerfog;	edict_t	*player = ent; //&g_edicts[1];	vec3_t	viewpoint;	if (!gl_driver || !vid_ref)		return;	if (deathmatch->value || coop->value)		return;	if (!player->client || player->is_bot)		return;	VectorCopy(player->s.origin, viewpoint);	viewpoint[2] += ent->viewheight;	//Knightmare- also ref_kmgl.dll	if(stricmp(vid_ref->string,"gl") && stricmp(vid_ref->string,"kmgl"))	{		last_software_frame = level.framenum;		level.active_fog = 0;		return;	}	InTriggerFog = false;	if(level.trigger_fogs)	{		int i;		int trigger;		trigger=0;		for(i=1; i<level.fogs; i++)		{			if(!gfogs[i].Trigger) continue;			if(!gfogs[i].ent->inuse) continue;			if(!(gfogs[i].ent->spawnflags & FOG_ON)) continue;			if(viewpoint[0] < gfogs[i].ent->absmin[0]) continue;			if(viewpoint[0] > gfogs[i].ent->absmax[0]) continue;			if(viewpoint[1] < gfogs[i].ent->absmin[1]) continue;			if(viewpoint[1] > gfogs[i].ent->absmax[1]) continue;			if(viewpoint[2] < gfogs[i].ent->absmin[2]) continue;			if(viewpoint[2] > gfogs[i].ent->absmax[2]) continue;			trigger = i;			break;		}		if(trigger)		{			InTriggerFog = true;			triggerfog = gfogs[trigger].ent;			if(level.last_active_fog != trigger+1)			{				if(triggerfog->delay)					init_trigger_fog_delay(triggerfog);				else					memcpy(&level.fog,&gfogs[trigger],sizeof(fog_t));				level.active_fog = trigger+1;			}			else if(triggerfog->delay)				memcpy(&level.fog,&trig_fade_fog,sizeof(fog_t));		}		else		{			InTriggerFog = false;			level.active_fog = level.active_target_fog;			// if we are just coming out of a trigger_fog, force			// level.fog to last active target_fog values			if(level.active_fog && level.last_active_fog && gfogs[level.last_active_fog-1].Trigger)			{				edict_t	*ent = gfogs[level.active_fog-1].ent;				if(ent && (ent->think == fog_fade))					ent->think(ent);				else					memcpy(&level.fog,&gfogs[level.active_fog-1],sizeof(fog_t));			}		}	}		if (!level.active_fog)	{		if (level.last_active_fog)			Fog_Off();		level.last_active_fog = 0;		return;	}		pfog = &level.fog;	if((pfog->Density1 != pfog->Density2) && (game.maxclients == 1) && (pfog->Model))	{		float	density;		float	dp;		vec3_t	vp;		AngleVectors(player->client->ps.viewangles,vp,0,0);		dp = DotProduct(pfog->Dir,vp) + 1.0;		density = ((pfog->Density1*dp) + (pfog->Density2*(2.0-dp)))/2.;		if(pfog->Density != density)		{			pfog->Density = density;//.........这里部分代码省略.........
开发者ID:AimHere,项目名称:thirty-flights-of-linux,代码行数:101,


示例24: VectorClear

edict_t	*LookingAt(edict_t *ent, int filter, vec3_t endpos, float *range){    edict_t		*who;    edict_t		*trigger[MAX_EDICTS];    edict_t		*ignore;    trace_t		tr;    vec_t		r;    vec3_t      end, forward, start;    vec3_t		dir, entp, mins, maxs;    int			i, num;    if(!ent->client)    {        if(endpos) VectorClear(endpos);        if(range) *range = 0;        return NULL;    }    VectorClear(end);    if (ent->client->chasetoggle)    {        AngleVectors(ent->client->v_angle, forward, NULL, NULL);        VectorCopy(ent->client->chasecam->s.origin,start);        ignore = ent->client->chasecam;    }    else if(ent->client->spycam)    {        AngleVectors(ent->client->ps.viewangles, forward, NULL, NULL);        VectorCopy(ent->s.origin,start);        ignore = ent->client->spycam;    }    else    {        AngleVectors(ent->client->v_angle, forward, NULL, NULL);        VectorCopy(ent->s.origin, start);        start[2] += ent->viewheight;        ignore = ent;    }    VectorMA(start, 8192, forward, end);    /* First check for looking directly at a pickup item */    VectorSet(mins,-4096,-4096,-4096);    VectorSet(maxs, 4096, 4096, 4096);    num = gi.BoxEdicts (mins, maxs, trigger, MAX_EDICTS, AREA_TRIGGERS);    for (i=0 ; i<num ; i++)    {        who = trigger[i];        if (!who->inuse)            continue;        if (!who->item)            continue;        if (!visible(ent,who))            continue;        if (!infront(ent,who))            continue;        VectorSubtract(who->s.origin,start,dir);        r = VectorLength(dir);        VectorMA(start, r, forward, entp);        if(entp[0] < who->s.origin[0] - 17) continue;        if(entp[1] < who->s.origin[1] - 17) continue;        if(entp[2] < who->s.origin[2] - 17) continue;        if(entp[0] > who->s.origin[0] + 17) continue;        if(entp[1] > who->s.origin[1] + 17) continue;        if(entp[2] > who->s.origin[2] + 17) continue;        if(endpos)            VectorCopy(who->s.origin,endpos);        if (range)            *range = r;        return who;    }    tr = gi.trace (start, NULL, NULL, end, ignore, MASK_SHOT);    if (tr.fraction == 1.0)    {        // too far away        gi.sound (ent, CHAN_AUTO, gi.soundindex ("misc/talk1.wav"), 1, ATTN_NORM, 0);        return NULL;    }    if(!tr.ent)    {        // no hit        gi.sound (ent, CHAN_AUTO, gi.soundindex ("misc/talk1.wav"), 1, ATTN_NORM, 0);        return NULL;    }    if(!tr.ent->classname)    {        // should never happen        gi.sound (ent, CHAN_AUTO, gi.soundindex ("misc/talk1.wav"), 1, ATTN_NORM, 0);        return NULL;    }    if((strstr(tr.ent->classname,"func_") != NULL) && (filter & LOOKAT_NOBRUSHMODELS))    {        // don't hit on brush models        gi.sound (ent, CHAN_AUTO, gi.soundindex ("misc/talk1.wav"), 1, ATTN_NORM, 0);        return NULL;    }    if((Q_stricmp(tr.ent->classname,"worldspawn") == 0) && (filter & LOOKAT_NOWORLD))    {        // world brush//.........这里部分代码省略.........
开发者ID:ptitSeb,项目名称:gravitybone-pandora,代码行数:101,


示例25: SP_target_fog

void SP_target_fog (edict_t *self){	fog_t *fog;	if ( !allow_fog->value )	{		G_FreeEdict(self);		return;	}	if (deathmatch->value || coop->value)	{		G_FreeEdict(self);		return;	}	self->class_id = ENTITY_TARGET_FOG;	if(!level.fogs) level.fogs = 1;   // 1st fog reserved for console commands	if(level.fogs >= MAX_FOGS)	{		gi.dprintf("Maximum number of fogs exceeded!/n");		G_FreeEdict(self);		return;	}	if( self->delay < 0.)		self->delay = 0.;	self->fog_index = level.fogs+1;	fog = &gfogs[level.fogs];	fog->Trigger = false;	fog->Model   = self->fog_model;	if(fog->Model < 0 || fog->Model > 2) fog->Model = 0;	fog->GL_Model = GLModels[fog->Model];	VectorCopy(self->fog_color,fog->Color);	if(self->spawnflags & FOG_TURNOFF)	{		fog->Near     = 4999;		fog->Far      = 5000;		fog->Density  = 0;		fog->Density1 = 0;		fog->Density2 = 0;	}	else	{		fog->Near     = self->fog_near;		fog->Far      = self->fog_far;		fog->Density  = self->fog_density;		fog->Density1 = self->fog_density;		if(self->density == 0.)			self->density = self->fog_density;		else if(self->density < 0.)			self->density = 0.;		fog->Density2= self->density;	}	AngleVectors(self->s.angles,fog->Dir,0,0);	fog->ent = self;	level.fogs++;	self->use = target_fog_use;	gi.linkentity(self);	if(self->spawnflags & FOG_ON)	{		self->spawnflags &= ~FOG_ON;		target_fog_use(self,NULL,NULL);	}}
开发者ID:AimHere,项目名称:thirty-flights-of-linux,代码行数:68,


示例26: TeleportPlayer

void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles, qboolean spit ) {    gentity_t	*tent;    // use temp events at source and destination to prevent the effect    // from getting dropped by a second player event    /*freeze    	if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {    freeze*/    if ( (g_gametype.integer == GT_FREEZE && !is_spectator( player->client )) ||            (g_gametype.integer != GT_FREEZE && player->client->sess.sessionTeam != TEAM_SPECTATOR) ) {//freeze        tent = G_TempEntity( player->client->ps.origin, EV_PLAYER_TELEPORT_OUT );        tent->s.clientNum = player->s.clientNum;        tent = G_TempEntity( origin, EV_PLAYER_TELEPORT_IN );        tent->s.clientNum = player->s.clientNum;    }    // unlink to make sure it can't possibly interfere with G_KillBox    //player->relink = 0;    trap_UnlinkEntity (player);    VectorCopy ( origin, player->client->ps.origin );    player->client->ps.origin[2] += 1;    // spit the player out    if (spit == qtrue) {        AngleVectors( angles, player->client->ps.velocity, NULL, NULL );        VectorScale( player->client->ps.velocity, 400, player->client->ps.velocity );        player->client->ps.pm_time = 160;		// hold time        player->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;    }    // toggle the teleport bit so the client knows to not lerp    player->client->ps.eFlags ^= EF_TELEPORT_BIT;//unlagged - backward reconciliation #3    // we don't want players being backward-reconciled back through teleporters    G_ResetHistory( player );//unlagged - backward reconciliation #3    // set angles    if (player->client->pers.fixedTeleporterAngles == qfalse)        SetClientViewAngle( player, angles );    // kill anything at the destination    /*freeze    	if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {    freeze*/    if ( (g_gametype.integer == GT_FREEZE && !is_spectator( player->client )) ||            (g_gametype.integer != GT_FREEZE && player->client->sess.sessionTeam != TEAM_SPECTATOR) ) {//freeze        G_KillBox (player);    }    // save results of pmove    BG_PlayerStateToEntityState( &player->client->ps, &player->s, qtrue );    // use the precise origin for linking    VectorCopy( player->client->ps.origin, player->r.currentOrigin );    /*freeze    	if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) {    freeze*/    if ( (g_gametype.integer == GT_FREEZE && !is_spectator( player->client )) ||            (g_gametype.integer != GT_FREEZE && player->client->sess.sessionTeam != TEAM_SPECTATOR) ) {//freeze        trap_LinkEntity (player);    }}
开发者ID:xzero450,项目名称:revolution,代码行数:70,


示例27: WP_FireBryarPistol

//---------------------------------------------------------void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire )//---------------------------------------------------------{	vec3_t	start;	int		damage = !alt_fire ? weaponData[WP_BRYAR_PISTOL].damage : weaponData[WP_BRYAR_PISTOL].altDamage;	int		velocity = !alt_fire ? weaponData[WP_BRYAR_PISTOL].velocity : weaponData[WP_BRYAR_PISTOL].altVelocity;	if (ent->s.number != 0 && ent->client->NPC_class != CLASS_BOBAFETT && ent->client->NPC_class != CLASS_MANDA)	{		damage *= weaponData[WP_BRYAR_PISTOL].npcDmgMult;	}	VectorCopy( muzzle, start );	WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall	if ( !(ent->client->ps.forcePowersActive&(1<<FP_SEE))		|| ent->client->ps.forcePowerLevel[FP_SEE] < FORCE_LEVEL_2 )	{//force sight 2+ gives perfect aim		//FIXME: maybe force sight level 3 autoaims some?		if ( ent->NPC && ent->NPC->currentAim < 5 )		{			vec3_t	angs;			vectoangles( forwardVec, angs );			if ( ent->client->NPC_class == CLASS_IMPWORKER )			{//*sigh*, hack to make impworkers less accurate without affecteing imperial officer accuracy				angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f				angs[YAW]	+= ( Q_flrand(-1.0f, 1.0f) * (BLASTER_NPC_SPREAD+(6-ent->NPC->currentAim)*0.25f));//was 0.5f			}			else			{				angs[PITCH] += ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) );				angs[YAW]	+= ( Q_flrand(-1.0f, 1.0f) * ((5-ent->NPC->currentAim)*0.25f) );			}			AngleVectors( angs, forwardVec, NULL, NULL );		}	}	WP_MissileTargetHint(ent, start, forwardVec);	gentity_t	*missile = CreateMissile( start, forwardVec, velocity, 10000, ent, alt_fire );	missile->classname = "bryar_proj";	if ( ent->s.weapon == WP_BLASTER_PISTOL		|| ent->s.weapon == WP_JAWA )	{//*SIGH*... I hate our weapon system...		missile->s.weapon = ent->s.weapon;	}	else	{		missile->s.weapon = WP_BRYAR_PISTOL;	}	if ( alt_fire )	{		int count = ( level.time - ent->client->ps.weaponChargeTime ) / BRYAR_CHARGE_UNIT;		if ( count < 1 )		{			count = 1;		}		else if ( count > 5 )		{			count = 5;		}		damage *= count;		missile->count = count; // this will get used in the projectile rendering code to make a beefier effect	}//	if ( ent->client && ent->client->ps.powerups[PW_WEAPON_OVERCHARGE] > 0 && ent->client->ps.powerups[PW_WEAPON_OVERCHARGE] > cg.time )//	{//		// in overcharge mode, so doing double damage//		missile->flags |= FL_OVERCHARGED;//		damage *= 2;//	}	missile->damage = damage;	missile->dflags = DAMAGE_DEATH_KNOCKBACK;	if ( alt_fire )	{		missile->methodOfDeath = MOD_BRYAR_ALT;	}	else	{		missile->methodOfDeath = MOD_BRYAR;	}	missile->clipmask = MASK_SHOT | CONTENTS_LIGHTSABER;	// we don't want it to bounce forever	missile->bounceCount = 8;	if ( ent->weaponModel[1] > 0 )	{//dual pistols, toggle the muzzle point back and forth between the two pistols each time he fires		ent->count = (ent->count)?0:1;//.........这里部分代码省略.........
开发者ID:DustysPatch,项目名称:OpenJK,代码行数:101,



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


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