diff --git a/engine/client/cl_efx.c b/engine/client/cl_efx.c index 9db01f93..d7ad1196 100644 --- a/engine/client/cl_efx.c +++ b/engine/client/cl_efx.c @@ -46,7 +46,7 @@ short GAME_EXPORT R_LookupColor( byte r, byte g, byte b ) float rf, gf, bf; bestdiff = 999999; - best = 65535; + best = -1; for( i = 0; i < 256; i++ ) { @@ -683,42 +683,46 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType ) switch( beamType ) { case TE_BEAMPOINTS: - start[0] = MSG_ReadCoord( msg ); - start[1] = MSG_ReadCoord( msg ); - start[2] = MSG_ReadCoord( msg ); - end[0] = MSG_ReadCoord( msg ); - end[1] = MSG_ReadCoord( msg ); - end[2] = MSG_ReadCoord( msg ); - modelIndex = MSG_ReadShort( msg ); - startFrame = MSG_ReadByte( msg ); - frameRate = (float)MSG_ReadByte( msg ); - life = (float)(MSG_ReadByte( msg ) * 0.1f); - width = (float)(MSG_ReadByte( msg ) * 0.1f); - noise = (float)(MSG_ReadByte( msg ) * 0.01f); - r = (float)MSG_ReadByte( msg ) / 255.0f; - g = (float)MSG_ReadByte( msg ) / 255.0f; - b = (float)MSG_ReadByte( msg ) / 255.0f; - a = (float)MSG_ReadByte( msg ) / 255.0f; - speed = (float)(MSG_ReadByte( msg ) * 0.1f); - R_BeamPoints( start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); - break; case TE_BEAMENTPOINT: - startEnt = MSG_ReadShort( msg ); - end[0] = MSG_ReadCoord( msg ); - end[1] = MSG_ReadCoord( msg ); - end[2] = MSG_ReadCoord( msg ); + case TE_BEAMENTS: + if( beamType == TE_BEAMENTS ) + { + startEnt = MSG_ReadShort( msg ); + endEnt = MSG_ReadShort( msg ); + } + else + { + if( beamType == TE_BEAMENTPOINT ) + { + startEnt = MSG_ReadShort( msg ); + } + else + { + start[0] = MSG_ReadCoord( msg ); + start[1] = MSG_ReadCoord( msg ); + start[2] = MSG_ReadCoord( msg ); + } + end[0] = MSG_ReadCoord( msg ); + end[1] = MSG_ReadCoord( msg ); + end[2] = MSG_ReadCoord( msg ); + } modelIndex = MSG_ReadShort( msg ); startFrame = MSG_ReadByte( msg ); - frameRate = (float)MSG_ReadByte( msg ); - life = (float)(MSG_ReadByte( msg ) * 0.1f); - width = (float)(MSG_ReadByte( msg ) * 0.1f); - noise = (float)(MSG_ReadByte( msg ) * 0.01f); + frameRate = (float)MSG_ReadByte( msg ) * 0.1f; + life = (float)MSG_ReadByte( msg ) * 0.1f; + width = (float)MSG_ReadByte( msg ) * 0.1f; + noise = (float)MSG_ReadByte( msg ) * 0.01f; r = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f; b = (float)MSG_ReadByte( msg ) / 255.0f; a = (float)MSG_ReadByte( msg ) / 255.0f; - speed = (float)(MSG_ReadByte( msg ) * 0.1f); - R_BeamEntPoint( startEnt, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); + speed = (float)MSG_ReadByte( msg ) * 0.1f; + if( beamType == TE_BEAMENTS ) + R_BeamEnts( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); + else if( beamType == TE_BEAMENTPOINT ) + R_BeamEntPoint( startEnt, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); + else + R_BeamPoints( start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); break; case TE_LIGHTNING: start[0] = MSG_ReadCoord( msg ); @@ -727,27 +731,11 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType ) end[0] = MSG_ReadCoord( msg ); end[1] = MSG_ReadCoord( msg ); end[2] = MSG_ReadCoord( msg ); - life = (float)(MSG_ReadByte( msg ) * 0.1f); - width = (float)(MSG_ReadByte( msg ) * 0.1f); - noise = (float)(MSG_ReadByte( msg ) * 0.01f); - modelIndex = MSG_ReadShort( msg ); - R_BeamLightning( start, end, modelIndex, life, width, noise, 0.6F, 3.5f ); - break; - case TE_BEAMENTS: - startEnt = MSG_ReadShort( msg ); - endEnt = MSG_ReadShort( msg ); + life = (float)MSG_ReadByte( msg ) * 0.1f; + width = (float)MSG_ReadByte( msg ) * 0.1f; + noise = (float)MSG_ReadByte( msg ) * 0.01f; modelIndex = MSG_ReadShort( msg ); - startFrame = MSG_ReadByte( msg ); - frameRate = (float)(MSG_ReadByte( msg ) * 0.1f); - life = (float)(MSG_ReadByte( msg ) * 0.1f); - width = (float)(MSG_ReadByte( msg ) * 0.1f); - noise = (float)(MSG_ReadByte( msg ) * 0.01f); - r = (float)MSG_ReadByte( msg ) / 255.0f; - g = (float)MSG_ReadByte( msg ) / 255.0f; - b = (float)MSG_ReadByte( msg ) / 255.0f; - a = (float)MSG_ReadByte( msg ) / 255.0f; - speed = (float)(MSG_ReadByte( msg ) * 0.1f); - R_BeamEnts( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); + R_BeamLightning( start, end, modelIndex, life, width, noise, 0.6f, 3.5f ); break; case TE_BEAM: break; @@ -773,21 +761,21 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType ) end[2] = MSG_ReadCoord( msg ); modelIndex = MSG_ReadShort( msg ); startFrame = MSG_ReadByte( msg ); - frameRate = (float)(MSG_ReadByte( msg )); - life = (float)(MSG_ReadByte( msg ) * 0.1f); - width = (float)(MSG_ReadByte( msg )); - noise = (float)(MSG_ReadByte( msg ) * 0.1f); + frameRate = (float)MSG_ReadByte( msg ) * 0.1f; + life = (float)MSG_ReadByte( msg ) * 0.1f; + width = (float)MSG_ReadByte( msg ); + noise = (float)MSG_ReadByte( msg ) * 0.01f; r = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f; b = (float)MSG_ReadByte( msg ) / 255.0f; a = (float)MSG_ReadByte( msg ) / 255.0f; - speed = (float)(MSG_ReadByte( msg ) / 0.1f); + speed = (float)MSG_ReadByte( msg ) * 0.1f; R_BeamCirclePoints( beamType, start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); break; case TE_BEAMFOLLOW: startEnt = MSG_ReadShort( msg ); modelIndex = MSG_ReadShort( msg ); - life = (float)(MSG_ReadByte( msg ) * 0.1f); + life = (float)MSG_ReadByte( msg ) * 0.1f; width = (float)MSG_ReadByte( msg ); r = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f; @@ -800,15 +788,15 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType ) endEnt = MSG_ReadShort( msg ); modelIndex = MSG_ReadShort( msg ); startFrame = MSG_ReadByte( msg ); - frameRate = (float)MSG_ReadByte( msg ); - life = (float)(MSG_ReadByte( msg ) * 0.1f); - width = (float)(MSG_ReadByte( msg ) * 0.1f); - noise = (float)(MSG_ReadByte( msg ) * 0.01f); + frameRate = (float)MSG_ReadByte( msg ) * 0.1f; + life = (float)MSG_ReadByte( msg ) * 0.1f; + width = (float)MSG_ReadByte( msg ) * 0.1f; + noise = (float)MSG_ReadByte( msg ) * 0.01f; r = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f; b = (float)MSG_ReadByte( msg ) / 255.0f; a = (float)MSG_ReadByte( msg ) / 255.0f; - speed = (float)(MSG_ReadByte( msg ) * 0.1f); + speed = (float)MSG_ReadByte( msg ) * 0.1f; R_BeamRing( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b ); break; case TE_BEAMHOSE: @@ -1265,7 +1253,7 @@ void GAME_EXPORT R_BloodStream( const vec3_t org, const vec3_t dir, int pcolor, particle_t *p; int i, j; float arc; - float accel = speed; + int accel = speed; // must be integer due to bug in GoldSrc for( arc = 0.05f, i = 0; i < 100; i++ ) { diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index a923f235..2be8132f 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -1515,17 +1515,18 @@ R_RicochetSound Make a random ricochet sound ============== */ -void GAME_EXPORT R_RicochetSound( const vec3_t pos ) +static void R_RicochetSound_( const vec3_t pos, int sound ) { - int iPitch = COM_RandomLong( 90, 105 ); - float fvol = COM_RandomFloat( 0.7f, 0.9f ); - char soundpath[32]; sound_t handle; - Q_strncpy( soundpath, cl_ricochet_sounds[COM_RandomLong( 0, 4 )], sizeof( soundpath ) ); - handle = S_RegisterSound( soundpath ); + handle = S_RegisterSound( cl_ricochet_sounds[sound] ); - S_StartSound( pos, 0, CHAN_AUTO, handle, fvol, ATTN_NORM, iPitch, 0 ); + S_StartSound( pos, 0, CHAN_AUTO, handle, VOL_NORM, 1.0, 100, 0 ); +} + +void GAME_EXPORT R_RicochetSound( const vec3_t pos ) +{ + R_RicochetSound_( pos, COM_RandomLong( 0, 4 )); } /* @@ -1656,7 +1657,7 @@ void GAME_EXPORT R_Explosion( vec3_t pos, int model, float scale, float framerat dl->color.g = 250; dl->color.b = 150; dl->die = cl.time + 0.01f; - dl->decay = 80; + dl->decay = 800; // red glow dl = CL_AllocDlight( 0 ); @@ -1915,6 +1916,7 @@ void CL_ParseTempEntity( sizebuf_t *msg ) TEMPENTITY *pTemp; cl_entity_t *pEnt; dlight_t *dl; + sound_t hSound; if( cls.legacymode ) iSize = MSG_ReadByte( msg ); @@ -2014,15 +2016,46 @@ void CL_ParseTempEntity( sizebuf_t *msg ) color = MSG_ReadByte( &buf ); count = MSG_ReadByte( &buf ); R_ParticleExplosion2( pos, color, count ); + + dl = CL_AllocDlight( 0 ); + VectorCopy( pos, dl->origin ); + dl->radius = 350; + dl->die = cl.time + 0.5; + dl->decay = 300; + + hSound = S_RegisterSound( cl_explode_sounds[0] ); + S_StartSound( pos, 0, CHAN_STATIC, hSound, VOL_NORM, 0.6f, PITCH_NORM, 0 ); break; case TE_BSPDECAL: + case TE_DECAL: + case TE_WORLDDECAL: + case TE_WORLDDECALHIGH: + case TE_DECALHIGH: pos[0] = MSG_ReadCoord( &buf ); pos[1] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf ); - decalIndex = MSG_ReadShort( &buf ); - entityIndex = MSG_ReadShort( &buf ); - if( entityIndex ) modelIndex = MSG_ReadShort( &buf ); - CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, modelIndex, pos, FDECAL_PERMANENT ); + if( type == TE_BSPDECAL ) + { + decalIndex = MSG_ReadShort( &buf ); + entityIndex = MSG_ReadShort( &buf ); + if( entityIndex ) + modelIndex = MSG_ReadShort( &buf ); + else modelIndex = 0; + } + else + { + decalIndex = MSG_ReadByte( &buf ); + if( type == TE_DECALHIGH || type == TE_WORLDDECALHIGH ) + decalIndex += 256; + + if( type == TE_DECALHIGH || type == TE_DECAL ) + entityIndex = MSG_ReadShort( &buf ); + else entityIndex = 0; + + pEnt = CL_GetEntityByIndex( entityIndex ); + modelIndex = pEnt->curstate.modelindex; + } + CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, modelIndex, pos, type == TE_BSPDECAL ? FDECAL_PERMANENT : 0 ); break; case TE_IMPLOSION: pos[0] = MSG_ReadCoord( &buf ); @@ -2042,10 +2075,12 @@ void CL_ParseTempEntity( sizebuf_t *msg ) pos2[2] = MSG_ReadCoord( &buf ); modelIndex = MSG_ReadShort( &buf ); count = MSG_ReadByte( &buf ); - life = (float)(MSG_ReadByte( &buf ) * 0.1f); - scale = (float)(MSG_ReadByte( &buf ) * 0.1f); - vel = (float)MSG_ReadByte( &buf ); - random = (float)MSG_ReadByte( &buf ); + life = (float)MSG_ReadByte( &buf ) * 0.1f; + scale = (float)MSG_ReadByte( &buf ); + if( !scale ) scale = 1.0f; + else scale *= 0.1f; + vel = (float)MSG_ReadByte( &buf ) * 10; + random = (float)MSG_ReadByte( &buf ) * 10; R_Sprite_Trail( type, pos, pos2, modelIndex, count, life, scale, random, 255, vel ); break; case TE_SPRITE: @@ -2053,36 +2088,23 @@ void CL_ParseTempEntity( sizebuf_t *msg ) pos[1] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf ); modelIndex = MSG_ReadShort( &buf ); - scale = (float)(MSG_ReadByte( &buf ) * 0.1f); - brightness = (float)MSG_ReadByte( &buf ); + scale = (float)MSG_ReadByte( &buf ) * 0.1f; + brightness = (float)MSG_ReadByte( &buf ) / 255.0f; - if(( pTemp = R_DefaultSprite( pos, modelIndex, 0 )) != NULL ) - { - pTemp->entity.curstate.scale = scale; - pTemp->entity.baseline.renderamt = brightness; - pTemp->entity.curstate.renderamt = brightness; - pTemp->entity.curstate.rendermode = kRenderTransAdd; - } + R_TempSprite( pos, vec3_origin, scale, modelIndex, + kRenderTransAdd, kRenderFxNone, brightness, 0.0, FTENT_SPRANIMATE ); break; case TE_GLOWSPRITE: pos[0] = MSG_ReadCoord( &buf ); pos[1] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf ); modelIndex = MSG_ReadShort( &buf ); - life = (float)(MSG_ReadByte( &buf ) * 0.1f); - scale = (float)(MSG_ReadByte( &buf ) * 0.1f); - brightness = (float)MSG_ReadByte( &buf ); + life = (float)MSG_ReadByte( &buf ) * 0.1f; + scale = (float)MSG_ReadByte( &buf ) * 0.1f; + brightness = (float)MSG_ReadByte( &buf ) / 255.0f; - if(( pTemp = R_DefaultSprite( pos, modelIndex, 0 )) != NULL ) - { - pTemp->entity.curstate.scale = scale; - pTemp->entity.curstate.rendermode = kRenderGlow; - pTemp->entity.curstate.renderfx = kRenderFxNoDissipation; - pTemp->entity.baseline.renderamt = brightness; - pTemp->entity.curstate.renderamt = brightness; - pTemp->flags = FTENT_FADEOUT; - pTemp->die = cl.time + life; - } + R_TempSprite( pos, vec3_origin, scale, modelIndex, + kRenderGlow, kRenderFxNoDissipation, brightness, life, FTENT_FADEOUT ); break; case TE_STREAK_SPLASH: pos[0] = MSG_ReadCoord( &buf ); @@ -2172,23 +2194,6 @@ void CL_ParseTempEntity( sizebuf_t *msg ) pos2[2] = MSG_ReadCoord( &buf ); R_ShowLine( pos, pos2 ); break; - case TE_DECAL: - case TE_DECALHIGH: - case TE_WORLDDECAL: - case TE_WORLDDECALHIGH: - pos[0] = MSG_ReadCoord( &buf ); - pos[1] = MSG_ReadCoord( &buf ); - pos[2] = MSG_ReadCoord( &buf ); - decalIndex = MSG_ReadByte( &buf ); - if( type == TE_DECAL || type == TE_DECALHIGH ) - entityIndex = MSG_ReadShort( &buf ); - else entityIndex = 0; - if( type == TE_DECALHIGH || type == TE_WORLDDECALHIGH ) - decalIndex += 256; - pEnt = CL_GetEntityByIndex( entityIndex ); - if( pEnt ) modelIndex = pEnt->curstate.modelindex; - CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, modelIndex, pos, 0 ); - break; case TE_FIZZ: entityIndex = MSG_ReadShort( &buf ); modelIndex = MSG_ReadShort( &buf ); @@ -2244,10 +2249,11 @@ void CL_ParseTempEntity( sizebuf_t *msg ) pos[2] = MSG_ReadCoord( &buf ); entityIndex = MSG_ReadShort( &buf ); decalIndex = MSG_ReadByte( &buf ); - pEnt = CL_GetEntityByIndex( entityIndex ); CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, 0, pos, 0 ); R_BulletImpactParticles( pos ); - R_RicochetSound( pos ); + flags = COM_RandomLong( 0, 0x7fff ); + if( flags < 0x3fff ) + R_RicochetSound_( pos, flags % 5 ); break; case TE_SPRAY: case TE_SPRITE_SPRAY: