本文整理汇总了C++中AngleVectors函数的典型用法代码示例。如果您正苦于以下问题:C++ AngleVectors函数的具体用法?C++ AngleVectors怎么用?C++ AngleVectors使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了AngleVectors函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的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( );
}
示例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);
//.........这里部分代码省略.........
示例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"));
}
示例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];
//.........这里部分代码省略.........
示例5: CG_AttachmentDir
/*
===============
CG_AttachmentDir
Return 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;
}
示例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);
//.........这里部分代码省略.........
示例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); }
//.........这里部分代码省略.........
示例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;
}
示例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
}
示例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));
//.........这里部分代码省略.........
示例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;
}
示例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 );
//.........这里部分代码省略.........
示例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;
}
示例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);
}
示例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;
}