|
|
@ -57,36 +57,6 @@ const char *cl_default_sprites[] = |
|
|
|
"sprites/shellchrome.spr", |
|
|
|
"sprites/shellchrome.spr", |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const char *cl_player_shell_sounds[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
"player/pl_shell1.wav", |
|
|
|
|
|
|
|
"player/pl_shell2.wav", |
|
|
|
|
|
|
|
"player/pl_shell3.wav", |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char *cl_weapon_shell_sounds[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
"weapons/sshell1.wav", |
|
|
|
|
|
|
|
"weapons/sshell2.wav", |
|
|
|
|
|
|
|
"weapons/sshell3.wav", |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char *cl_ricochet_sounds[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
"weapons/ric1.wav", |
|
|
|
|
|
|
|
"weapons/ric2.wav", |
|
|
|
|
|
|
|
"weapons/ric3.wav", |
|
|
|
|
|
|
|
"weapons/ric4.wav", |
|
|
|
|
|
|
|
"weapons/ric5.wav", |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char *cl_explode_sounds[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
"weapons/explode3.wav", |
|
|
|
|
|
|
|
"weapons/explode4.wav", |
|
|
|
|
|
|
|
"weapons/explode5.wav", |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void CL_PlayerDecal( int playerIndex, int textureIndex, int entityIndex, float *pos ); |
|
|
|
static void CL_PlayerDecal( int playerIndex, int textureIndex, int entityIndex, float *pos ); |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -148,6 +118,7 @@ client resources not precached by server |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
void CL_AddClientResources( void ) |
|
|
|
void CL_AddClientResources( void ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
const char *snd; |
|
|
|
char filepath[MAX_QPATH]; |
|
|
|
char filepath[MAX_QPATH]; |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
|
@ -163,37 +134,37 @@ void CL_AddClientResources( void ) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// then check sounds
|
|
|
|
// then check sounds
|
|
|
|
for( i = 0; i < ARRAYSIZE( cl_player_shell_sounds ); i++ ) |
|
|
|
for( i = 0; ( snd = SoundList_Get( BouncePlayerShell, i )); i++ ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_player_shell_sounds[i] ); |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); |
|
|
|
|
|
|
|
|
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
CL_AddClientResource( cl_player_shell_sounds[i], t_sound ); |
|
|
|
CL_AddClientResource( snd, t_sound ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for( i = 0; i < ARRAYSIZE( cl_weapon_shell_sounds ); i++ ) |
|
|
|
for( i = 0; ( snd = SoundList_Get( BounceWeaponShell, i )); i++ ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_weapon_shell_sounds[i] ); |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); |
|
|
|
|
|
|
|
|
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
CL_AddClientResource( cl_weapon_shell_sounds[i], t_sound ); |
|
|
|
CL_AddClientResource( snd, t_sound ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for( i = 0; i < ARRAYSIZE( cl_explode_sounds ); i++ ) |
|
|
|
for( i = 0; ( snd = SoundList_Get( Explode, i )); i++ ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_explode_sounds[i] ); |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); |
|
|
|
|
|
|
|
|
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
CL_AddClientResource( cl_explode_sounds[i], t_sound ); |
|
|
|
CL_AddClientResource( snd, t_sound ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if 0 // ric sounds was precached by server-side
|
|
|
|
#if 0 // ric sounds was precached by server-side
|
|
|
|
for( i = 0; i < ARRAYSIZE( cl_ricochet_sounds ); i++ ) |
|
|
|
for( i = 0; ( snd = SoundList_Get( Ricochet, i )); i++ ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_ricochet_sounds[i] ); |
|
|
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); |
|
|
|
|
|
|
|
|
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
if( !FS_FileExists( filepath, false )) |
|
|
|
CL_AddClientResource( cl_ricochet_sounds[i], t_sound ); |
|
|
|
CL_AddClientResource( snd, t_sound ); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
@ -301,7 +272,7 @@ play collide sound |
|
|
|
static void CL_TempEntPlaySound( TEMPENTITY *pTemp, float damp ) |
|
|
|
static void CL_TempEntPlaySound( TEMPENTITY *pTemp, float damp ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
float fvol; |
|
|
|
float fvol; |
|
|
|
char soundname[32]; |
|
|
|
const char *soundname = NULL; |
|
|
|
qboolean isshellcasing = false; |
|
|
|
qboolean isshellcasing = false; |
|
|
|
int zvel; |
|
|
|
int zvel; |
|
|
|
|
|
|
|
|
|
|
@ -312,36 +283,39 @@ static void CL_TempEntPlaySound( TEMPENTITY *pTemp, float damp ) |
|
|
|
switch( pTemp->hitSound ) |
|
|
|
switch( pTemp->hitSound ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
case BOUNCE_GLASS: |
|
|
|
case BOUNCE_GLASS: |
|
|
|
Q_snprintf( soundname, sizeof( soundname ), "debris/glass%i.wav", COM_RandomLong( 1, 4 )); |
|
|
|
soundname = SoundList_GetRandom( BounceGlass ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_METAL: |
|
|
|
case BOUNCE_METAL: |
|
|
|
Q_snprintf( soundname, sizeof( soundname ), "debris/metal%i.wav", COM_RandomLong( 1, 6 )); |
|
|
|
soundname = SoundList_GetRandom( BounceMetal ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_FLESH: |
|
|
|
case BOUNCE_FLESH: |
|
|
|
Q_snprintf( soundname, sizeof( soundname ), "debris/flesh%i.wav", COM_RandomLong( 1, 7 )); |
|
|
|
soundname = SoundList_GetRandom( BounceFlesh ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_WOOD: |
|
|
|
case BOUNCE_WOOD: |
|
|
|
Q_snprintf( soundname, sizeof( soundname ), "debris/wood%i.wav", COM_RandomLong( 1, 4 )); |
|
|
|
soundname = SoundList_GetRandom( BounceWood ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_SHRAP: |
|
|
|
case BOUNCE_SHRAP: |
|
|
|
Q_strncpy( soundname, cl_ricochet_sounds[COM_RandomLong( 0, 4 )], sizeof( soundname ) ); |
|
|
|
soundname = SoundList_GetRandom( Ricochet ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_SHOTSHELL: |
|
|
|
case BOUNCE_SHOTSHELL: |
|
|
|
Q_strncpy( soundname, cl_weapon_shell_sounds[COM_RandomLong( 0, 2 )], sizeof( soundname ) ); |
|
|
|
soundname = SoundList_GetRandom( BounceWeaponShell ); |
|
|
|
isshellcasing = true; // shell casings have different playback parameters
|
|
|
|
isshellcasing = true; // shell casings have different playback parameters
|
|
|
|
fvol = 0.5f; |
|
|
|
fvol = 0.5f; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_SHELL: |
|
|
|
case BOUNCE_SHELL: |
|
|
|
Q_strncpy( soundname, cl_player_shell_sounds[COM_RandomLong( 0, 2 )], sizeof( soundname ) ); |
|
|
|
soundname = SoundList_GetRandom( BouncePlayerShell ); |
|
|
|
isshellcasing = true; // shell casings have different playback parameters
|
|
|
|
isshellcasing = true; // shell casings have different playback parameters
|
|
|
|
break; |
|
|
|
break; |
|
|
|
case BOUNCE_CONCRETE: |
|
|
|
case BOUNCE_CONCRETE: |
|
|
|
Q_snprintf( soundname, sizeof( soundname ), "debris/concrete%i.wav", COM_RandomLong( 1, 3 )); |
|
|
|
soundname = SoundList_GetRandom( BounceConcrete ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: // null sound
|
|
|
|
default: // null sound
|
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( !soundname ) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
zvel = abs( pTemp->entity.baseline.origin[2] ); |
|
|
|
zvel = abs( pTemp->entity.baseline.origin[2] ); |
|
|
|
|
|
|
|
|
|
|
|
// only play one out of every n
|
|
|
|
// only play one out of every n
|
|
|
@ -1491,7 +1465,7 @@ void GAME_EXPORT R_FunnelSprite( const vec3_t org, int modelIndex, int reverse ) |
|
|
|
=============== |
|
|
|
=============== |
|
|
|
R_SparkEffect |
|
|
|
R_SparkEffect |
|
|
|
|
|
|
|
|
|
|
|
Create a streaks + richochet sprite |
|
|
|
Create a streaks + ricochet sprite |
|
|
|
=============== |
|
|
|
=============== |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
void GAME_EXPORT R_SparkEffect( const vec3_t pos, int count, int velocityMin, int velocityMax ) |
|
|
|
void GAME_EXPORT R_SparkEffect( const vec3_t pos, int count, int velocityMin, int velocityMax ) |
|
|
@ -1507,18 +1481,25 @@ R_RicochetSound |
|
|
|
Make a random ricochet sound |
|
|
|
Make a random ricochet sound |
|
|
|
============== |
|
|
|
============== |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
static void R_RicochetSound_( const vec3_t pos, int sound ) |
|
|
|
static void R_RicochetSoundByName( const vec3_t pos, const char *name ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
sound_t handle; |
|
|
|
sound_t handle; |
|
|
|
|
|
|
|
handle = S_RegisterSound( name ); |
|
|
|
handle = S_RegisterSound( cl_ricochet_sounds[sound] ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S_StartSound( pos, 0, CHAN_AUTO, handle, VOL_NORM, 1.0, 100, 0 ); |
|
|
|
S_StartSound( pos, 0, CHAN_AUTO, handle, VOL_NORM, 1.0, 100, 0 ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void R_RicochetSoundByIndex( const vec3_t pos, int idx ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
const char *name = SoundList_Get( Ricochet, idx ); |
|
|
|
|
|
|
|
if( name ) |
|
|
|
|
|
|
|
R_RicochetSoundByName( pos, name ); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void GAME_EXPORT R_RicochetSound( const vec3_t pos ) |
|
|
|
void GAME_EXPORT R_RicochetSound( const vec3_t pos ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
R_RicochetSound_( pos, COM_RandomLong( 0, 4 )); |
|
|
|
const char *name = SoundList_GetRandom( Ricochet ); |
|
|
|
|
|
|
|
if( name ) |
|
|
|
|
|
|
|
R_RicochetSoundByName( pos, name ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -1665,10 +1646,14 @@ void GAME_EXPORT R_Explosion( vec3_t pos, int model, float scale, float framerat |
|
|
|
|
|
|
|
|
|
|
|
if( !FBitSet( flags, TE_EXPLFLAG_NOSOUND )) |
|
|
|
if( !FBitSet( flags, TE_EXPLFLAG_NOSOUND )) |
|
|
|
{ |
|
|
|
{ |
|
|
|
hSound = S_RegisterSound( cl_explode_sounds[COM_RandomLong( 0, 2 )] ); |
|
|
|
const char *name = SoundList_GetRandom( Explode ); |
|
|
|
|
|
|
|
if( name ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
hSound = S_RegisterSound( name ); |
|
|
|
S_StartSound( pos, 0, CHAN_STATIC, hSound, VOL_NORM, 0.3f, PITCH_NORM, 0 ); |
|
|
|
S_StartSound( pos, 0, CHAN_STATIC, hSound, VOL_NORM, 0.3f, PITCH_NORM, 0 ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
============== |
|
|
|
============== |
|
|
@ -1909,6 +1894,7 @@ void CL_ParseTempEntity( sizebuf_t *msg ) |
|
|
|
cl_entity_t *pEnt; |
|
|
|
cl_entity_t *pEnt; |
|
|
|
dlight_t *dl; |
|
|
|
dlight_t *dl; |
|
|
|
sound_t hSound; |
|
|
|
sound_t hSound; |
|
|
|
|
|
|
|
const char *name; |
|
|
|
|
|
|
|
|
|
|
|
if( cls.legacymode ) |
|
|
|
if( cls.legacymode ) |
|
|
|
iSize = MSG_ReadByte( msg ); |
|
|
|
iSize = MSG_ReadByte( msg ); |
|
|
@ -1968,8 +1954,11 @@ void CL_ParseTempEntity( sizebuf_t *msg ) |
|
|
|
pos[2] = MSG_ReadCoord( &buf ); |
|
|
|
pos[2] = MSG_ReadCoord( &buf ); |
|
|
|
R_BlobExplosion( pos ); |
|
|
|
R_BlobExplosion( pos ); |
|
|
|
|
|
|
|
|
|
|
|
hSound = S_RegisterSound( cl_explode_sounds[0] ); |
|
|
|
if(( name = SoundList_Get( Explode, 0 ))) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
hSound = S_RegisterSound( name ); |
|
|
|
S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 1.0f, PITCH_NORM, 0 ); |
|
|
|
S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 1.0f, PITCH_NORM, 0 ); |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case TE_SMOKE: |
|
|
|
case TE_SMOKE: |
|
|
|
pos[0] = MSG_ReadCoord( &buf ); |
|
|
|
pos[0] = MSG_ReadCoord( &buf ); |
|
|
@ -2022,8 +2011,11 @@ void CL_ParseTempEntity( sizebuf_t *msg ) |
|
|
|
dl->die = cl.time + 0.5; |
|
|
|
dl->die = cl.time + 0.5; |
|
|
|
dl->decay = 300; |
|
|
|
dl->decay = 300; |
|
|
|
|
|
|
|
|
|
|
|
hSound = S_RegisterSound( cl_explode_sounds[0] ); |
|
|
|
if(( name = SoundList_Get( Explode, 0 ))) |
|
|
|
S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 0.6f, PITCH_NORM, 0 ); |
|
|
|
{ |
|
|
|
|
|
|
|
hSound = S_RegisterSound( name ); |
|
|
|
|
|
|
|
S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 1.0f, PITCH_NORM, 0 ); |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case TE_BSPDECAL: |
|
|
|
case TE_BSPDECAL: |
|
|
|
case TE_DECAL: |
|
|
|
case TE_DECAL: |
|
|
@ -2251,8 +2243,8 @@ void CL_ParseTempEntity( sizebuf_t *msg ) |
|
|
|
CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, 0, pos, 0 ); |
|
|
|
CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, 0, pos, 0 ); |
|
|
|
R_BulletImpactParticles( pos ); |
|
|
|
R_BulletImpactParticles( pos ); |
|
|
|
flags = COM_RandomLong( 0, 0x7fff ); |
|
|
|
flags = COM_RandomLong( 0, 0x7fff ); |
|
|
|
if( flags < 0x3fff ) |
|
|
|
if( flags < 0x3fff && ( count = SoundList_Count( Ricochet ))) |
|
|
|
R_RicochetSound_( pos, flags % 5 ); |
|
|
|
R_RicochetSoundByIndex( pos, flags % count ); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case TE_SPRAY: |
|
|
|
case TE_SPRAY: |
|
|
|
case TE_SPRITE_SPRAY: |
|
|
|
case TE_SPRITE_SPRAY: |
|
|
|