Browse Source

engine: client: refactor tempentity parsing, make multipliers close to GoldSrc

pull/2/head
Alibek Omarov 3 years ago
parent
commit
0fa1b4f944
  1. 100
      engine/client/cl_efx.c
  2. 116
      engine/client/cl_tent.c

100
engine/client/cl_efx.c

@ -46,7 +46,7 @@ short GAME_EXPORT R_LookupColor( byte r, byte g, byte b )
float rf, gf, bf; float rf, gf, bf;
bestdiff = 999999; bestdiff = 999999;
best = 65535; best = -1;
for( i = 0; i < 256; i++ ) for( i = 0; i < 256; i++ )
{ {
@ -683,42 +683,46 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
switch( beamType ) switch( beamType )
{ {
case TE_BEAMPOINTS: case TE_BEAMPOINTS:
case TE_BEAMENTPOINT:
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[0] = MSG_ReadCoord( msg );
start[1] = MSG_ReadCoord( msg ); start[1] = MSG_ReadCoord( msg );
start[2] = MSG_ReadCoord( msg ); start[2] = MSG_ReadCoord( msg );
}
end[0] = MSG_ReadCoord( msg ); end[0] = MSG_ReadCoord( msg );
end[1] = MSG_ReadCoord( msg ); end[1] = MSG_ReadCoord( msg );
end[2] = MSG_ReadCoord( msg ); end[2] = MSG_ReadCoord( msg );
}
modelIndex = MSG_ReadShort( msg ); modelIndex = MSG_ReadShort( msg );
startFrame = MSG_ReadByte( msg ); startFrame = MSG_ReadByte( msg );
frameRate = (float)MSG_ReadByte( msg ); frameRate = (float)MSG_ReadByte( msg ) * 0.1f;
life = (float)(MSG_ReadByte( msg ) * 0.1f); life = (float)MSG_ReadByte( msg ) * 0.1f;
width = (float)(MSG_ReadByte( msg ) * 0.1f); width = (float)MSG_ReadByte( msg ) * 0.1f;
noise = (float)(MSG_ReadByte( msg ) * 0.01f); 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 );
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; r = (float)MSG_ReadByte( msg ) / 255.0f;
g = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f;
b = (float)MSG_ReadByte( msg ) / 255.0f; b = (float)MSG_ReadByte( msg ) / 255.0f;
a = (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;
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 ); 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; break;
case TE_LIGHTNING: case TE_LIGHTNING:
start[0] = MSG_ReadCoord( msg ); start[0] = MSG_ReadCoord( msg );
@ -727,27 +731,11 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
end[0] = MSG_ReadCoord( msg ); end[0] = MSG_ReadCoord( msg );
end[1] = MSG_ReadCoord( msg ); end[1] = MSG_ReadCoord( msg );
end[2] = MSG_ReadCoord( msg ); end[2] = MSG_ReadCoord( msg );
life = (float)(MSG_ReadByte( msg ) * 0.1f); life = (float)MSG_ReadByte( msg ) * 0.1f;
width = (float)(MSG_ReadByte( msg ) * 0.1f); width = (float)MSG_ReadByte( msg ) * 0.1f;
noise = (float)(MSG_ReadByte( msg ) * 0.01f); noise = (float)MSG_ReadByte( msg ) * 0.01f;
modelIndex = MSG_ReadShort( msg ); modelIndex = MSG_ReadShort( msg );
R_BeamLightning( start, end, modelIndex, life, width, noise, 0.6F, 3.5f ); R_BeamLightning( start, end, modelIndex, life, width, noise, 0.6f, 3.5f );
break;
case TE_BEAMENTS:
startEnt = MSG_ReadShort( msg );
endEnt = MSG_ReadShort( msg );
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 );
break; break;
case TE_BEAM: case TE_BEAM:
break; break;
@ -773,21 +761,21 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
end[2] = MSG_ReadCoord( msg ); end[2] = MSG_ReadCoord( msg );
modelIndex = MSG_ReadShort( msg ); modelIndex = MSG_ReadShort( msg );
startFrame = MSG_ReadByte( msg ); startFrame = MSG_ReadByte( msg );
frameRate = (float)(MSG_ReadByte( msg )); frameRate = (float)MSG_ReadByte( msg ) * 0.1f;
life = (float)(MSG_ReadByte( msg ) * 0.1f); life = (float)MSG_ReadByte( msg ) * 0.1f;
width = (float)(MSG_ReadByte( msg )); width = (float)MSG_ReadByte( msg );
noise = (float)(MSG_ReadByte( msg ) * 0.1f); noise = (float)MSG_ReadByte( msg ) * 0.01f;
r = (float)MSG_ReadByte( msg ) / 255.0f; r = (float)MSG_ReadByte( msg ) / 255.0f;
g = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f;
b = (float)MSG_ReadByte( msg ) / 255.0f; b = (float)MSG_ReadByte( msg ) / 255.0f;
a = (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 ); R_BeamCirclePoints( beamType, start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
break; break;
case TE_BEAMFOLLOW: case TE_BEAMFOLLOW:
startEnt = MSG_ReadShort( msg ); startEnt = MSG_ReadShort( msg );
modelIndex = 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 ); width = (float)MSG_ReadByte( msg );
r = (float)MSG_ReadByte( msg ) / 255.0f; r = (float)MSG_ReadByte( msg ) / 255.0f;
g = (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 ); endEnt = MSG_ReadShort( msg );
modelIndex = MSG_ReadShort( msg ); modelIndex = MSG_ReadShort( msg );
startFrame = MSG_ReadByte( msg ); startFrame = MSG_ReadByte( msg );
frameRate = (float)MSG_ReadByte( msg ); frameRate = (float)MSG_ReadByte( msg ) * 0.1f;
life = (float)(MSG_ReadByte( msg ) * 0.1f); life = (float)MSG_ReadByte( msg ) * 0.1f;
width = (float)(MSG_ReadByte( msg ) * 0.1f); width = (float)MSG_ReadByte( msg ) * 0.1f;
noise = (float)(MSG_ReadByte( msg ) * 0.01f); noise = (float)MSG_ReadByte( msg ) * 0.01f;
r = (float)MSG_ReadByte( msg ) / 255.0f; r = (float)MSG_ReadByte( msg ) / 255.0f;
g = (float)MSG_ReadByte( msg ) / 255.0f; g = (float)MSG_ReadByte( msg ) / 255.0f;
b = (float)MSG_ReadByte( msg ) / 255.0f; b = (float)MSG_ReadByte( msg ) / 255.0f;
a = (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 ); R_BeamRing( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
break; break;
case TE_BEAMHOSE: 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; particle_t *p;
int i, j; int i, j;
float arc; 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++ ) for( arc = 0.05f, i = 0; i < 100; i++ )
{ {

116
engine/client/cl_tent.c

@ -1515,17 +1515,18 @@ R_RicochetSound
Make a random ricochet sound 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; sound_t handle;
Q_strncpy( soundpath, cl_ricochet_sounds[COM_RandomLong( 0, 4 )], sizeof( soundpath ) ); handle = S_RegisterSound( cl_ricochet_sounds[sound] );
handle = S_RegisterSound( soundpath );
S_StartSound( pos, 0, CHAN_AUTO, handle, VOL_NORM, 1.0, 100, 0 );
}
S_StartSound( pos, 0, CHAN_AUTO, handle, fvol, ATTN_NORM, iPitch, 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.g = 250;
dl->color.b = 150; dl->color.b = 150;
dl->die = cl.time + 0.01f; dl->die = cl.time + 0.01f;
dl->decay = 80; dl->decay = 800;
// red glow // red glow
dl = CL_AllocDlight( 0 ); dl = CL_AllocDlight( 0 );
@ -1915,6 +1916,7 @@ void CL_ParseTempEntity( sizebuf_t *msg )
TEMPENTITY *pTemp; TEMPENTITY *pTemp;
cl_entity_t *pEnt; cl_entity_t *pEnt;
dlight_t *dl; dlight_t *dl;
sound_t hSound;
if( cls.legacymode ) if( cls.legacymode )
iSize = MSG_ReadByte( msg ); iSize = MSG_ReadByte( msg );
@ -2014,15 +2016,46 @@ void CL_ParseTempEntity( sizebuf_t *msg )
color = MSG_ReadByte( &buf ); color = MSG_ReadByte( &buf );
count = MSG_ReadByte( &buf ); count = MSG_ReadByte( &buf );
R_ParticleExplosion2( pos, color, count ); 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; break;
case TE_BSPDECAL: case TE_BSPDECAL:
case TE_DECAL:
case TE_WORLDDECAL:
case TE_WORLDDECALHIGH:
case TE_DECALHIGH:
pos[0] = MSG_ReadCoord( &buf ); pos[0] = MSG_ReadCoord( &buf );
pos[1] = MSG_ReadCoord( &buf ); pos[1] = MSG_ReadCoord( &buf );
pos[2] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf );
if( type == TE_BSPDECAL )
{
decalIndex = MSG_ReadShort( &buf ); decalIndex = MSG_ReadShort( &buf );
entityIndex = MSG_ReadShort( &buf ); entityIndex = MSG_ReadShort( &buf );
if( entityIndex ) modelIndex = MSG_ReadShort( &buf ); if( entityIndex )
CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, modelIndex, pos, FDECAL_PERMANENT ); 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; break;
case TE_IMPLOSION: case TE_IMPLOSION:
pos[0] = MSG_ReadCoord( &buf ); pos[0] = MSG_ReadCoord( &buf );
@ -2042,10 +2075,12 @@ void CL_ParseTempEntity( sizebuf_t *msg )
pos2[2] = MSG_ReadCoord( &buf ); pos2[2] = MSG_ReadCoord( &buf );
modelIndex = MSG_ReadShort( &buf ); modelIndex = MSG_ReadShort( &buf );
count = MSG_ReadByte( &buf ); count = MSG_ReadByte( &buf );
life = (float)(MSG_ReadByte( &buf ) * 0.1f); life = (float)MSG_ReadByte( &buf ) * 0.1f;
scale = (float)(MSG_ReadByte( &buf ) * 0.1f); scale = (float)MSG_ReadByte( &buf );
vel = (float)MSG_ReadByte( &buf ); if( !scale ) scale = 1.0f;
random = (float)MSG_ReadByte( &buf ); 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 ); R_Sprite_Trail( type, pos, pos2, modelIndex, count, life, scale, random, 255, vel );
break; break;
case TE_SPRITE: case TE_SPRITE:
@ -2053,36 +2088,23 @@ void CL_ParseTempEntity( sizebuf_t *msg )
pos[1] = MSG_ReadCoord( &buf ); pos[1] = MSG_ReadCoord( &buf );
pos[2] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf );
modelIndex = MSG_ReadShort( &buf ); modelIndex = MSG_ReadShort( &buf );
scale = (float)(MSG_ReadByte( &buf ) * 0.1f); scale = (float)MSG_ReadByte( &buf ) * 0.1f;
brightness = (float)MSG_ReadByte( &buf ); brightness = (float)MSG_ReadByte( &buf ) / 255.0f;
if(( pTemp = R_DefaultSprite( pos, modelIndex, 0 )) != NULL ) R_TempSprite( pos, vec3_origin, scale, modelIndex,
{ kRenderTransAdd, kRenderFxNone, brightness, 0.0, FTENT_SPRANIMATE );
pTemp->entity.curstate.scale = scale;
pTemp->entity.baseline.renderamt = brightness;
pTemp->entity.curstate.renderamt = brightness;
pTemp->entity.curstate.rendermode = kRenderTransAdd;
}
break; break;
case TE_GLOWSPRITE: case TE_GLOWSPRITE:
pos[0] = MSG_ReadCoord( &buf ); pos[0] = MSG_ReadCoord( &buf );
pos[1] = MSG_ReadCoord( &buf ); pos[1] = MSG_ReadCoord( &buf );
pos[2] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf );
modelIndex = MSG_ReadShort( &buf ); modelIndex = MSG_ReadShort( &buf );
life = (float)(MSG_ReadByte( &buf ) * 0.1f); life = (float)MSG_ReadByte( &buf ) * 0.1f;
scale = (float)(MSG_ReadByte( &buf ) * 0.1f); scale = (float)MSG_ReadByte( &buf ) * 0.1f;
brightness = (float)MSG_ReadByte( &buf ); brightness = (float)MSG_ReadByte( &buf ) / 255.0f;
if(( pTemp = R_DefaultSprite( pos, modelIndex, 0 )) != NULL ) R_TempSprite( pos, vec3_origin, scale, modelIndex,
{ kRenderGlow, kRenderFxNoDissipation, brightness, life, FTENT_FADEOUT );
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;
}
break; break;
case TE_STREAK_SPLASH: case TE_STREAK_SPLASH:
pos[0] = MSG_ReadCoord( &buf ); pos[0] = MSG_ReadCoord( &buf );
@ -2172,23 +2194,6 @@ void CL_ParseTempEntity( sizebuf_t *msg )
pos2[2] = MSG_ReadCoord( &buf ); pos2[2] = MSG_ReadCoord( &buf );
R_ShowLine( pos, pos2 ); R_ShowLine( pos, pos2 );
break; 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: case TE_FIZZ:
entityIndex = MSG_ReadShort( &buf ); entityIndex = MSG_ReadShort( &buf );
modelIndex = MSG_ReadShort( &buf ); modelIndex = MSG_ReadShort( &buf );
@ -2244,10 +2249,11 @@ void CL_ParseTempEntity( sizebuf_t *msg )
pos[2] = MSG_ReadCoord( &buf ); pos[2] = MSG_ReadCoord( &buf );
entityIndex = MSG_ReadShort( &buf ); entityIndex = MSG_ReadShort( &buf );
decalIndex = MSG_ReadByte( &buf ); decalIndex = MSG_ReadByte( &buf );
pEnt = CL_GetEntityByIndex( entityIndex );
CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, 0, pos, 0 ); CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, 0, pos, 0 );
R_BulletImpactParticles( pos ); R_BulletImpactParticles( pos );
R_RicochetSound( pos ); flags = COM_RandomLong( 0, 0x7fff );
if( flags < 0x3fff )
R_RicochetSound_( pos, flags % 5 );
break; break;
case TE_SPRAY: case TE_SPRAY:
case TE_SPRITE_SPRAY: case TE_SPRITE_SPRAY:

Loading…
Cancel
Save