1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Game-specific impact effect hooks
//
//=============================================================================
#include "cbase.h"
#include "fx.h"
#include "c_te_effect_dispatch.h"
#include "tier0/vprof.h"
#include "clientsideeffects.h"
#include "clienteffectprecachesystem.h"
#include "view.h"
#include "collisionutils.h"
#include "SoundEmitterSystem/isoundemittersystembase.h"
#include "engine/IEngineSound.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
CLIENTEFFECT_REGISTER_BEGIN( PrecacheDodTracers )
CLIENTEFFECT_MATERIAL( "effects/fainttracer" )
CLIENTEFFECT_MATERIAL( "effects/spark" )
CLIENTEFFECT_REGISTER_END()
#define LISTENER_HEIGHT 24
#define TRACER_TYPE_FAINT 4
void FX_DoDTracerSound( const Vector &start, const Vector &end, int iTracerType )
{
// don't play on very short hits
if ( ( start - end ).Length() < 200 )
return;
const char *pszSoundName = "Bullets.DefaultNearmiss";
float flWhizDist = 64;
Vector vecListenOrigin = MainViewOrigin();
switch( iTracerType )
{
case TRACER_TYPE_DEFAULT:
flWhizDist = 96;
// fall through !
default:
{
Ray_t bullet, listener;
bullet.Init( start, end );
Vector vecLower = vecListenOrigin;
vecLower.z -= LISTENER_HEIGHT;
listener.Init( vecListenOrigin, vecLower );
float s, t;
IntersectRayWithRay( bullet, listener, s, t );
t = clamp( t, 0, 1 );
vecListenOrigin.z -= t * LISTENER_HEIGHT;
}
break;
}
static float flNextWhizTime = 0;
// Is it time yet?
float dt = flNextWhizTime - gpGlobals->curtime;
if ( dt > 0 )
return;
// Did the thing pass close enough to our head?
float vDist = CalcDistanceSqrToLineSegment( vecListenOrigin, start, end );
if ( vDist >= (flWhizDist * flWhizDist) )
return;
CSoundParameters params;
if( C_BaseEntity::GetParametersForSound( pszSoundName, params, NULL ) )
{
// Get shot direction
Vector shotDir;
VectorSubtract( end, start, shotDir );
VectorNormalize( shotDir );
CLocalPlayerFilter filter;
enginesound->EmitSound( filter, SOUND_FROM_WORLD, CHAN_STATIC, params.soundname,
params.volume, SNDLVL_TO_ATTN(params.soundlevel), 0, params.pitch, 0, &start, &shotDir, NULL);
}
// Don't play another bullet whiz for this client until this time has run out
flNextWhizTime = gpGlobals->curtime + 0.1f;
}
void FX_FaintTracer( Vector& start, Vector& end )
{
if ( random->RandomInt( 0, 2 ) == 0 )
{
//Don't make small tracers
float dist;
Vector dir;
int velocity = 5000;
VectorSubtract( end, start, dir );
dist = VectorNormalize( dir );
float length = random->RandomFloat( 32.0f, 64.0f );
float life = ( dist + length ) / velocity; //NOTENOTE: We want the tail to finish its run as well
//Add it
FX_AddDiscreetLine( start, dir, velocity, length, dist, random->RandomFloat( 0.75f, 0.9f ), life, "effects/fainttracer" );
}
FX_DoDTracerSound( start, end, TRACER_TYPE_DEFAULT+1 ); //not default!
}
void FX_BrightTracer( Vector& start, Vector& end )
{
//Don't make small tracers
float dist;
Vector dir;
int velocity = 5000;
VectorSubtract( end, start, dir );
dist = VectorNormalize( dir );
// Don't make short tracers.
float length = random->RandomFloat( 64.0f, 128.0f );
float life = ( dist + length ) / velocity; //NOTENOTE: We want the tail to finish its run as well
//Add it
FX_AddDiscreetLine( start, dir, velocity, length, dist, random->RandomFloat( 0.75f, 0.9f ), life, "effects/spark" );
FX_DoDTracerSound( start, end, TRACER_TYPE_DEFAULT );
}
//-----------------------------------------------------------------------------
// Purpose: Faint Tracer for most dod weapons
//-----------------------------------------------------------------------------
void FaintTracerCallback( const CEffectData &data )
{
FX_FaintTracer( (Vector&)data.m_vStart, (Vector&)data.m_vOrigin );
}
//-----------------------------------------------------------------------------
// Purpose: Bright Tracer for Machine Guns
//-----------------------------------------------------------------------------
void BrightTracerCallback( const CEffectData &data )
{
FX_BrightTracer( (Vector&)data.m_vStart, (Vector&)data.m_vOrigin );
}
DECLARE_CLIENT_EFFECT( "FaintTracer", FaintTracerCallback );
DECLARE_CLIENT_EFFECT( "BrightTracer", BrightTracerCallback );
|