11 Mar 2010

This commit is contained in:
g-cont 2010-03-11 00:00:00 +03:00 committed by Alibek Omarov
parent 62296673e1
commit 2e88e96834
33 changed files with 377 additions and 171 deletions

View File

@ -33,6 +33,7 @@ static HUD_FUNCTIONS gFunctionTable =
HUD_Init,
HUD_Redraw,
HUD_UpdateEntityVars,
HUD_UpdateOnRemove,
HUD_Reset,
HUD_StartFrame,
HUD_Frame,
@ -317,6 +318,12 @@ void HUD_UpdateEntityVars( edict_t *ent, skyportal_t *sky, const entity_state_t
ent->v.pContainingEntity = ent;
}
void HUD_UpdateOnRemove( edict_t *pEdict )
{
// move TE_BEAMTRAIL, kill other beams
g_pViewRenderBeams->KillDeadBeams( pEdict );
}
void HUD_Reset( void )
{
gHUD.VidInit();

View File

@ -26,7 +26,6 @@ extern "C"
void EV_SnarkFire( event_args_t *args );
void EV_TrainPitchAdjust( event_args_t *args );
void EV_Decals( event_args_t *args );
void EV_Explode( event_args_t *args );
}
//======================
@ -42,7 +41,6 @@ void EV_HookEvents( void )
g_engfuncs.pEventAPI->EV_HookEvent( "evShotgun1", EV_FireShotGunSingle );
g_engfuncs.pEventAPI->EV_HookEvent( "evShotgun2", EV_FireShotGunDouble );
g_engfuncs.pEventAPI->EV_HookEvent( "evMP5", EV_FireMP5 );
g_engfuncs.pEventAPI->EV_HookEvent( "evExplode", EV_Explode );
g_engfuncs.pEventAPI->EV_HookEvent( "evPython", EV_FirePython );
g_engfuncs.pEventAPI->EV_HookEvent( "evGauss", EV_FireGauss );
g_engfuncs.pEventAPI->EV_HookEvent( "evGaussSpin", EV_SpinGauss );

View File

@ -37,7 +37,6 @@ extern "C"
void EV_TrainPitchAdjust( event_args_t *args );
void EV_PlayEmptySound( event_args_t *args );
void EV_Decals( event_args_t *args );
void EV_Explode( event_args_t *args );
}
#define VECTOR_CONE_1DEGREES Vector( 0.00873, 0.00873, 0.00873 )
@ -1658,22 +1657,6 @@ void EV_Decals( event_args_t *args )
// DECALS END
//======================
//======================
// EFX START
//======================
void EV_Explode( event_args_t *args )
{
int m_iExplodeSprite;
Vector mirpos = EV_MirrorPos( args->origin );
if( args->bparam1 )//water explosion
m_iExplodeSprite = g_engfuncs.pEventAPI->EV_FindModelIndex( "sprites/WXplo1.spr" );
else m_iExplodeSprite = g_engfuncs.pEventAPI->EV_FindModelIndex( "sprites/zerogxplode.spr" );
// g_engfuncs.pEfxAPI->R_Explosion( args->origin, m_iExplodeSprite, (args->fparam1 - 50) * 0.06, 15, TE_EXPLFLAG_NODLIGHTS | TE_EXPLFLAG_NOPARTICLES );
if(mirpos == g_vecZero ) return;
// g_engfuncs.pEfxAPI->R_Explosion( mirpos, m_iExplodeSprite, (args->fparam1 - 50) * 0.06, 15, TE_EXPLFLAG_NODLIGHTS | TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES );
}
//======================
// EFX END
//======================

View File

@ -52,7 +52,7 @@ static void SineNoise( float *noise, int divs )
static bool ComputeBeamEntPosition( edict_t *pEnt, int nAttachment, Vector& pt )
{
if( !pEnt )
if( !pEnt || pEnt->free )
{
pt = g_vecZero;
return false;
@ -1278,6 +1278,27 @@ void CViewRenderBeams::UpdateBeam( Beam_t *pbeam, float frametime )
}
}
bool CViewRenderBeams::AttemptToDie( Beam_t *pBeam )
{
ASSERT( pBeam != NULL );
// premanent beams never die automatically
if( pBeam->flags & FBEAM_FOREVER )
return false;
if( pBeam->type == TE_BEAMFOLLOW && pBeam->trail )
{
// wait for all trails are dead
return false;
}
// other beams
if( pBeam->die > gpGlobals->time )
return false;
return true;
}
//-----------------------------------------------------------------------------
// Purpose: Update beams created by temp entity system
//-----------------------------------------------------------------------------
@ -1299,7 +1320,7 @@ void CViewRenderBeams::UpdateTempEntBeams( void )
pNext = pBeam->next;
// Retire old beams
if (!( pBeam->flags & FBEAM_FOREVER ) && pBeam->die <= gpGlobals->time )
if ( AttemptToDie( pBeam ) )
{
// Reset links
if ( pPrev )
@ -1714,8 +1735,8 @@ void CViewRenderBeams::DrawBeam( edict_t *pbeam )
beamInfo.m_nModelIndex = pbeam->v.modelindex;
beamInfo.m_flLife = 0;
beamInfo.m_flWidth = pbeam->v.scale * 0.1f;
beamInfo.m_flEndWidth = pbeam->v.scale * 0.1f; // FIXME: make tuneable
beamInfo.m_flFadeLength = 0.0f; // FIXME: make tuneable
beamInfo.m_flEndWidth = beamInfo.m_flWidth;
beamInfo.m_flFadeLength = 0.0f; // will be set on first call UpdateBeam
beamInfo.m_flAmplitude = pbeam->v.body * 0.1f;
beamInfo.m_flBrightness = pbeam->v.renderamt;
beamInfo.m_flSpeed = pbeam->v.animtime * 0.1f;
@ -2335,7 +2356,7 @@ void DrawBeamFollow( int modelIndex, BeamTrail_t* pHead, int frame, int rendermo
tmp.z = 0;
tmp = tmp.Normalize( );
normal = gpViewParams->up * tmp.x; // Build point along noraml line (normal is -y, x)
normal = normal + (gpViewParams->right * -tmp.y );
normal = normal - (gpViewParams->right * -tmp.y );
// Make a wide line
last1 = delta + ( normal * width );
@ -2351,15 +2372,6 @@ void DrawBeamFollow( int modelIndex, BeamTrail_t* pHead, int frame, int rendermo
nColor[0] = (byte)bound( 0, (int)(scaledColor[0] * 255.0f), 255 );
nColor[1] = (byte)bound( 0, (int)(scaledColor[1] * 255.0f), 255 );
nColor[2] = (byte)bound( 0, (int)(scaledColor[2] * 255.0f), 255 );
// need to count the segments
int count = 0;
BeamTrail_t* pTraverse = pHead;
while ( pTraverse )
{
++count;
pTraverse = pTraverse->next;
}
g_engfuncs.pTriAPI->Enable( TRI_SHADER );
g_engfuncs.pTriAPI->RenderMode( (kRenderMode_t)rendermode );
@ -2371,12 +2383,12 @@ void DrawBeamFollow( int modelIndex, BeamTrail_t* pHead, int frame, int rendermo
{
// ALERT( at_console, "%.2f ", fraction );
g_engfuncs.pTriAPI->Color4ub( nColor[0], nColor[1], nColor[2], 255 );
g_engfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
g_engfuncs.pTriAPI->Vertex3fv( last1 );
g_engfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
g_engfuncs.pTriAPI->Vertex3fv( last2 );
g_engfuncs.pTriAPI->Color4ub( nColor[0], nColor[1], nColor[2], 255 );
g_engfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
g_engfuncs.pTriAPI->Vertex3fv( last2 );
g_engfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
g_engfuncs.pTriAPI->Vertex3fv( last1 );
// Transform point into screen space
g_engfuncs.pTriAPI->WorldToScreen( pHead->org, screen );
@ -2387,7 +2399,7 @@ void DrawBeamFollow( int modelIndex, BeamTrail_t* pHead, int frame, int rendermo
tmp.z = 0;
tmp = tmp.Normalize();
normal = gpViewParams->up * tmp.x; // Build point along noraml line (normal is -y, x)
normal = normal + (gpViewParams->right * -tmp.y );
normal = normal - (gpViewParams->right * -tmp.y );
// Make a wide line
last1 = pHead->org + (normal * width );
@ -2410,15 +2422,15 @@ void DrawBeamFollow( int modelIndex, BeamTrail_t* pHead, int frame, int rendermo
fraction = 0.0;
nColor[0] = nColor[1] = nColor[2] = 0;
}
g_engfuncs.pTriAPI->Color4ub( nColor[0], nColor[1], nColor[2], 255 );
g_engfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
g_engfuncs.pTriAPI->Vertex3fv( last2 );
g_engfuncs.pTriAPI->Color4ub( nColor[0], nColor[1], nColor[2], 255 );
g_engfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
g_engfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
g_engfuncs.pTriAPI->Vertex3fv( last1 );
g_engfuncs.pTriAPI->Color4ub( nColor[0], nColor[1], nColor[2], 255 );
g_engfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
g_engfuncs.pTriAPI->Vertex3fv( last2 );
screenLast = screen;
pHead = pHead->next;

View File

@ -257,6 +257,7 @@ public:
void UpdateBeams( int fTrans ); // main drawing func
private:
bool AttemptToDie( Beam_t *pBeam );
void FreeDeadTrails( BeamTrail_t **trail );
void UpdateBeam( Beam_t *pbeam, float frametime );
void DrawBeamFollow( int spriteIndex, Beam_t *pbeam, int frame, int rendermode,

View File

@ -758,14 +758,23 @@ void CL_PlaceDecal( Vector pos, edict_t *pEntity, HSPRITE hDecal )
g_engfuncs.pEfxAPI->R_SetDecal( pos, dir, rgba, RANDOM_LONG( 0, 360 ), scale, hDecal, flags );
}
void CL_AllocDLight( Vector pos, float radius, float time, int flags )
void CL_AllocDLight( Vector pos, float r, float g, float b, float radius, float time, int flags )
{
float rgb[3] = { 1.0f, 1.0f, 1.0f };
float rgb[3];
rgb[0] = r / 255.0f;
rgb[1] = r / 255.0f;
rgb[2] = r / 255.0f;
if( radius <= 0 ) return;
g_engfuncs.pEfxAPI->CL_AllocDLight( pos, rgb, radius, time, flags, 0 );
}
void CL_AllocDLight( Vector pos, float radius, float time, int flags )
{
CL_AllocDLight( pos, 255, 255, 255, radius, time, flags );
}
void HUD_AddClientMessage( void )
{
static client_textmessage_t gTextMsg[MAX_CHANNELS], *msg;
@ -816,7 +825,7 @@ void HUD_AddClientMessage( void )
---------------
TE_ParseBeamFollow
create a line of decaying beam segments until entity stops moving
Create a line of decaying beam segments until entity stops moving
---------------
*/
void TE_ParseBeamFollow( void )
@ -827,7 +836,7 @@ void TE_ParseBeamFollow( void )
entityIndex = READ_SHORT();
modelIndex = READ_SHORT();
life = (float)READ_BYTE();
life = (float)(READ_BYTE() * 0.1f);
width = (float)READ_BYTE();
// parse color
@ -839,6 +848,139 @@ void TE_ParseBeamFollow( void )
g_pViewRenderBeams->CreateBeamFollow( entityIndex, modelIndex, life, width, width, 0.0f, color.x, color.y, color.z, brightness );
}
/*
---------------
TE_ParseBeamPoints
Creates a beam between two points
---------------
*/
void TE_ParseBeamPoints( void )
{
Vector vecStart, vecEnd, vecColor;
int modelIndex, startFrame;
float frameRate, life, width;
float brightness, noise, speed;
// beam position
vecStart.x = READ_COORD();
vecStart.y = READ_COORD();
vecStart.z = READ_COORD();
vecEnd.x = READ_COORD();
vecEnd.y = READ_COORD();
vecEnd.z = READ_COORD();
// beam info
modelIndex = READ_SHORT();
startFrame = READ_BYTE();
frameRate = (float)(READ_BYTE());
life = (float)(READ_BYTE() * 0.1f);
width = (float)(READ_BYTE() * 0.1f);
noise = (float)(READ_BYTE() * 0.1f);
// renderinfo
vecColor.x = (float)READ_BYTE();
vecColor.y = (float)READ_BYTE();
vecColor.z = (float)READ_BYTE();
brightness = (float)READ_BYTE();
speed = (float)(READ_BYTE() * 0.1f);
g_pViewRenderBeams->CreateBeamPoints( vecStart, vecEnd, modelIndex, life, width, noise, brightness, speed,
startFrame, frameRate, vecColor.x, vecColor.y, vecColor.z );
}
/*
---------------
TE_ParseBeamEntPoint
Creates a beam between two points
---------------
*/
void TE_ParseBeamEntPoint( void )
{
Vector vecEnd, vecColor;
int entityIndex, modelIndex, startFrame;
float frameRate, life, width;
float brightness, noise, speed;
// beam position
entityIndex = READ_SHORT();
vecEnd.x = READ_COORD();
vecEnd.y = READ_COORD();
vecEnd.z = READ_COORD();
// beam info
modelIndex = READ_SHORT();
startFrame = READ_BYTE();
frameRate = (float)(READ_BYTE());
life = (float)(READ_BYTE() * 0.1f);
width = (float)(READ_BYTE() * 0.1f);
noise = (float)(READ_BYTE() * 0.1f);
// renderinfo
vecColor.x = (float)READ_BYTE();
vecColor.y = (float)READ_BYTE();
vecColor.z = (float)READ_BYTE();
brightness = (float)READ_BYTE();
speed = (float)(READ_BYTE() * 0.1f);
g_pViewRenderBeams->CreateBeamEntPoint( entityIndex, vecEnd, modelIndex, life, width, noise, brightness,
speed, startFrame, frameRate, vecColor.x, vecColor.y, vecColor.z );
}
/*
---------------
TE_ParseBeamEntPoint
Creates additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps
---------------
*/
void TE_ParseExplosion( void )
{
Vector dir, pos, pos2;
float scale, frameRate;
int flags, spriteIndex;
TEMPENTITY *pTemp;
pos.x = READ_COORD();
pos.y = READ_COORD();
pos.z = READ_COORD();
spriteIndex = READ_SHORT();
scale = (float)(READ_BYTE() * 0.1f);
frameRate = READ_BYTE();
flags = READ_BYTE();
g_engfuncs.pEfxAPI->CL_FindExplosionPlane( pos, scale, dir );
pos2 = pos + (dir * scale);
if( scale != 0.0f )
{
// create explosion sprite
pTemp = g_engfuncs.pEfxAPI->R_DefaultSprite( pos2, spriteIndex, frameRate );
g_engfuncs.pEfxAPI->R_Sprite_Explode( pTemp, scale, flags );
ALERT( at_console, "Explosion scale: %g\n", scale );
if( !( flags & TE_EXPLFLAG_NODLIGHTS ))
{
CL_AllocDLight( pos2, 250, 250, 150, 200, 0.01f, 0 ); // big flash
CL_AllocDLight( pos2, 255, 190, 40, 150, 1.0f, DLIGHT_FADE );// red glow
}
}
if(!( flags & TE_EXPLFLAG_NOPARTICLES ))
CL_ExplosionParticles( pos );
if( RANDOM_LONG( 0, 1 ))
CL_PlaceDecal( pos, dir, scale, g_engfuncs.pEfxAPI->CL_DecalIndexFromName( "{scorch1" ));
else CL_PlaceDecal( pos, dir, scale, g_engfuncs.pEfxAPI->CL_DecalIndexFromName( "{scorch2" ));
if( !( flags & TE_EXPLFLAG_NOSOUND ))
{
CL_PlaySound( "weapons/explode3.wav", 1.0f, pos2 );
}
}
void HUD_ParseTempEntity( void )
{
TEMPENTITY *pTemp;
@ -849,8 +991,11 @@ void HUD_ParseTempEntity( void )
switch( READ_BYTE() )
{
case TE_BEAMFOLLOW:
TE_ParseBeamFollow();
case TE_BEAMPOINTS:
TE_ParseBeamPoints();
break;
case TE_BEAMENTPOINT:
TE_ParseBeamEntPoint();
break;
case TE_GUNSHOT:
pos.x = READ_COORD();
@ -864,6 +1009,12 @@ void HUD_ParseTempEntity( void )
CL_PlaySound( soundpath, RANDOM_FLOAT( 0.7f, 0.9f ), pos, RANDOM_FLOAT( 95.0f, 105.0f ));
}
break;
case TE_EXPLOSION:
break;
case TE_BEAMFOLLOW:
TE_ParseBeamFollow();
break;
case TE_GUNSHOTDECAL:
pos.x = READ_COORD();
pos.y = READ_COORD();
@ -887,35 +1038,6 @@ void HUD_ParseTempEntity( void )
CL_PlaceDecal( pos, dir, 2, g_engfuncs.pEfxAPI->CL_DecalIndex( READ_BYTE() ));
READ_SHORT(); // FIXME: skip entindex
break;
case TE_EXPLOSION:
pos.x = READ_COORD();
pos.y = READ_COORD();
pos.z = READ_COORD();
modelIndex = READ_SHORT();
scale = (float)(READ_BYTE());
framerate = READ_BYTE();
flags = READ_BYTE();
g_engfuncs.pEfxAPI->CL_FindExplosionPlane( pos, scale, dir );
pos2 = pos + (dir * scale);
// create explosion sprite
pTemp = g_engfuncs.pEfxAPI->CL_TempEntAlloc( pos2, modelIndex );
g_engfuncs.pEfxAPI->R_Sprite_Explode( pTemp, (scale / 10.0f), flags );
if( pTemp )
{
pTemp->die = gpGlobals->time + 2.5f; // should be enough for too long sequence
pTemp->m_flFrameRate = framerate;
pTemp->flags |= FTENT_SPRANIMATE;
}
if(!( flags & TE_EXPLFLAG_NOPARTICLES ))
CL_ExplosionParticles( pos );
if( RANDOM_LONG( 0, 1 ))
CL_PlaceDecal( pos, dir, scale, g_engfuncs.pEfxAPI->CL_DecalIndexFromName( "{scorch1" ));
else CL_PlaceDecal( pos, dir, scale, g_engfuncs.pEfxAPI->CL_DecalIndexFromName( "{scorch2" ));
if(!(flags & TE_EXPLFLAG_NODLIGHTS )) CL_AllocDLight( pos2, 250.0f, 0.8f, DLIGHT_FADE );
if(!(flags & TE_EXPLFLAG_NOSOUND )) CL_PlaySound( "weapons/explode3.wav", 1.0f, pos2 );
break;
case TE_SPARKS:
pos.x = READ_COORD();
pos.y = READ_COORD();
@ -1010,7 +1132,7 @@ void HUD_ParseTempEntity( void )
pos.y = READ_COORD();
pos.z = READ_COORD();
modelIndex = READ_SHORT();
READ_SHORT(); // FIXME: skip droplet blood sprite
READ_SHORT(); // FIXME: skup droplet blood sprite
iColor = READ_BYTE();
scale = READ_BYTE(); // scale
g_engfuncs.pEfxAPI->R_BloodSprite( pos, iColor, modelIndex, scale );

View File

@ -582,6 +582,65 @@ void ClearAllFades( void )
memset( gHUD.m_FadeList, 0, sizeof( gHUD.m_FadeList ));
}
/*
====================
UTIL_Probe
client explosion utility
====================
*/
float UTIL_Probe( const Vector &origin, Vector *vecDirection, float strength )
{
// press out
Vector endpos = origin + (( *vecDirection ) * strength );
//Trace into the world
TraceResult tr;
UTIL_TraceLine( origin, endpos, dont_ignore_monsters, NULL, &tr );
// push back a proportional amount to the probe
(*vecDirection) = -(*vecDirection) * (1.0f - tr.flFraction);
ASSERT(( 1.0f - tr.flFraction ) >= 0.0f );
// return the impacted proportion of the probe
return (1.0f - tr.flFraction);
}
void UTIL_GetForceDirection( const Vector &origin, float magnitude, Vector *resultDirection, float *resultForce )
{
Vector d[6];
// all cardinal directions
d[0] = Vector( 1, 0, 0 );
d[1] = Vector( -1, 0, 0 );
d[2] = Vector( 0, 1, 0 );
d[3] = Vector( 0, -1, 0 );
d[4] = Vector( 0, 0, 1 );
d[5] = Vector( 0, 0, -1 );
//Init the results
(*resultDirection).Init();
(*resultForce) = 1.0f;
// Get the aggregate force vector
for ( int i = 0; i < 6; i++ )
{
(*resultForce) += UTIL_Probe( origin, &d[i], magnitude );
(*resultDirection) += d[i];
}
// If we've hit nothing, then point up
if (( *resultDirection ) == g_vecZero )
{
(*resultDirection) = Vector( 0, 0, 1 );
(*resultForce) = 2.0f; // default value
}
// Just return the direction
(*resultDirection) = (*resultDirection).Normalize();
}
/*
====================
Sys LoadGameDLL

View File

@ -34,6 +34,7 @@ extern int HUD_VidInit( void );
extern void HUD_Init( void );
extern int HUD_Redraw( float flTime, int state );
extern void HUD_UpdateEntityVars( edict_t *out, skyportal_t *sky, const entity_state_t *s, const entity_state_t *p );
extern void HUD_UpdateOnRemove( edict_t *pEdict );
extern void HUD_Reset( void );
extern void HUD_StartFrame( void );
extern void HUD_Frame( double time );
@ -180,6 +181,10 @@ extern void UTIL_TraceLine( const Vector &vecStart, const Vector &vecEnd, IGNORE
extern void UTIL_TraceLine( const Vector &vecStart, const Vector &vecEnd, IGNORE_MONSTERS igmon, IGNORE_GLASS ignoreGlass, edict_t *pentIgnore, TraceResult *ptr);
extern void UTIL_TraceHull( const Vector &vecStart, const Vector &vecEnd, IGNORE_MONSTERS igmon, int hullNumber, edict_t *pentIgnore, TraceResult *ptr);
// misc utilities
extern float UTIL_Probe( const Vector &origin, Vector *vecDirection, float strength );
extern void UTIL_GetForceDirection( const Vector &origin, float magnitude, Vector *resultDirection, float *resultForce );
// drawing stuff
extern client_sprite_t *SPR_GetList( const char *name, int *count );
extern void ParseHudSprite( const char **pfile, char *psz, client_sprite_t *result );

View File

@ -186,7 +186,7 @@ typedef struct cl_enginefuncs_s
float (*pfnGetClientTime)( void ); // can use gpGlobals->time instead
int (*pfnIsSpectateOnly)( void ); // was V_CalcShake
void (*pfnGetAttachment)( const edict_t *pEdict, int iAttachment, float *rgflOrg, float *rgflAng ); // was V_ApplyShake
int (*pfnGetAttachment)( const edict_t *pEdict, int iAttachment, float *rgflOrg, float *rgflAng ); // was V_ApplyShake
int (*pfnPointContents)( const float *rgflPos );
edict_t* (*pfnWaterEntity)( const float *rgflPos );
@ -237,6 +237,7 @@ typedef struct
void (*pfnInit)( void );
int (*pfnRedraw)( float flTime, int state );
void (*pfnUpdateEntityVars)( edict_t *out, skyportal_t *sky, const struct entity_state_s *in1, const struct entity_state_s *in2 );
void (*pfnOnFreeEntPrivateData)( edict_t *pEnt ); // this is called on entity removed
void (*pfnReset)( void );
void (*pfnStartFrame)( void );
void (*pfnFrame)( double time );

View File

@ -163,6 +163,15 @@
#define EF_OCCLUSIONTEST (1<<14) // use occlusion test for this entity (e.g. glares)
#define EF_LASERSPOT (1<<15) // tempentity laserspot at attachment #1 from player or npc
// The explosion effect has some flags to control performance/aesthetic features:
#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion
#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite)
#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights
#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound
#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles
#define TE_EXPLFLAG_DRAWALPHA 16 // sprite will be drawn alpha
#define TE_EXPLFLAG_ROTATE 32 // rotate the sprite randomly
// pev->takedamage
#define DAMAGE_NO 0 // can't be damaged
#define DAMAGE_YES 1 // attempt to damage

View File

@ -41,17 +41,6 @@
// byte (framerate)
// byte (flags)
// The Explosion effect has some flags to control performance/aesthetic features:
#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion
#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite)
#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights
#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound
#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles
#define TE_EXPLFLAG_DRAWALPHA 16 // sprite will be drawn alpha
#define TE_EXPLFLAG_ROTATE 32 // rotate the sprite randomly
#define TE_EXPLFLAG_NOFIREBALL 64 // do not draw a fireball
#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound
// coord coord coord (position)

View File

@ -8,6 +8,8 @@
#define SCRSHOT_TYPE "jpg" // fixed type
#define LEVELSHOT_TYPE CL_LevelshotType()
#define SAVESHOT_TYPE CL_LevelshotType()
#define DEMOSHOT_TYPE CL_LevelshotType()
const char *CL_LevelshotType( void )
{
@ -240,8 +242,8 @@ void CL_SaveShot_f( void )
}
// check for exist
com.sprintf( cls.shotname, "save/%s.jpg", Cmd_Argv( 1 ));
cls.scrshot_action = scrshot_savegame; // build new frame for saveshot
com.sprintf( cls.shotname, "save/%s.%s", Cmd_Argv( 1 ), SAVESHOT_TYPE );
cls.scrshot_action = scrshot_savegame; // build new frame for saveshot
}
/*
@ -260,8 +262,8 @@ void CL_DemoShot_f( void )
}
// check for exist
com.sprintf( cls.shotname, "demos/%s.jpg", Cmd_Argv( 1 ));
cls.scrshot_action = scrshot_demoshot; // build new frame for saveshot
com.sprintf( cls.shotname, "demos/%s.%s", Cmd_Argv( 1 ), DEMOSHOT_TYPE );
cls.scrshot_action = scrshot_demoshot; // build new frame for demoshot
}
/*
@ -286,7 +288,7 @@ void CL_DeleteDemo_f( void )
// delete save and saveshot
FS_Delete( va( "%s/demos/%s.dem", GI->gamedir, Cmd_Argv( 1 )));
FS_Delete( va( "%s/demos/%s.jpg", GI->gamedir, Cmd_Argv( 1 )));
FS_Delete( va( "%s/demos/%s.%s", GI->gamedir, Cmd_Argv( 1 ), DEMOSHOT_TYPE ));
}
/*

View File

@ -492,8 +492,8 @@ void CL_Record_f( void )
// make sure what oldsave is removed
if( FS_FileExists( va( "demos/%s.dem", demoname )))
FS_Delete( va( "%s/demos/%s.dem", GI->gamedir, demoname ));
if( FS_FileExists( va( "demos/%s.jpg", name )))
FS_Delete( va( "%s/demos/%s.jpg", GI->gamedir, demoname ));
if( FS_FileExists( va( "demos/%s.%s", name, CL_LevelshotType( ))))
FS_Delete( va( "%s/demos/%s.%s", GI->gamedir, demoname, CL_LevelshotType( )));
// write demoshot for preview
Cbuf_AddText( va( "demoshot \"%s\"\n", demoname ));

View File

@ -816,6 +816,8 @@ void CL_FreeEdict( edict_t *pEdict )
Com_Assert( pEdict == NULL );
Com_Assert( pEdict->free );
clgame.dllFuncs.pfnOnFreeEntPrivateData( pEdict );
// unlink from world
CL_UnlinkEdict( pEdict );
@ -1655,15 +1657,15 @@ pfnGetAttachment
=============
*/
static void pfnGetAttachment( const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles )
static bool pfnGetAttachment( const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles )
{
if( !pEdict )
{
if( rgflOrigin ) VectorClear( rgflOrigin );
if( rgflAngles ) VectorClear( rgflAngles );
return;
return false;
}
CL_GetAttachment( pEdict->serialnumber, iAttachment, rgflOrigin, rgflAngles );
return CL_GetAttachment( pEdict->serialnumber, iAttachment, rgflOrigin, rgflAngles );
}
/*
@ -2368,10 +2370,10 @@ int TriWorldToScreen( float *world, float *screen )
retval = re->WorldToScreen( world, screen );
screen[0] = 0.5f * screen[0] * cl.refdef.viewport[2];
screen[1] = -0.5f * screen[1] * cl.refdef.viewport[3];
screen[0] += 0.5f * cl.refdef.viewport[2];
screen[1] += 0.5f * cl.refdef.viewport[3];
screen[0] = 0.5f * screen[0] * (float)cl.refdef.viewport[2];
screen[1] = -0.5f * screen[1] * (float)cl.refdef.viewport[3];
screen[0] += 0.5f * (float)cl.refdef.viewport[2];
screen[1] += 0.5f * (float)cl.refdef.viewport[3];
return retval;
}

View File

@ -374,14 +374,21 @@ void CL_ParseServerData( sizebuf_t *msg )
Cvar_Set( "cl_levelshot_name", va( "levelshots/%s", str ));
Cvar_SetValue( "scr_loading", 0.0f ); // reset progress bar
// FIXME: use table of allowed extension for each imagelib modes
for( i = 0; i < 4; i++ )
{
// scan for custom user levelshot
if( FS_FileExists( va( "%s.%s", cl_levelshot_name->string, levelshot_ext[i] )))
break;
}
if( i == 4 )
{
Cvar_Set( "cl_levelshot_name", MAP_DEFAULT_SHADER ); // render a black screen
cls.scrshot_request = scrshot_plaque; // make levelshot
}
// seperate the printfs so the server message can have a color
Msg("\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");
Msg( "^2%s\n", clgame.maptitle );

View File

@ -7,7 +7,6 @@
#include "client.h"
#include "effects_api.h"
#include "triangle_api.h"
#include "tempents.h" // grab TE_EXPLFLAGS
#include "beam_def.h"
#include "const.h"

View File

@ -223,6 +223,7 @@ bool CL_GetComment( const char *demoname, char *comment );
studioframe_t *CL_GetStudioFrame( int entityIndex );
edict_t *CL_GetEdictByIndex( int index );
edict_t *CL_GetLocalPlayer( void );
const char *CL_LevelshotType( void );
int CL_GetMaxClients( void );
byte CL_GetMouthOpen( int entityIndex );
bool SV_GetComment( const char *savename, char *comment );

View File

@ -343,7 +343,7 @@ void SV_DeleteSave_f( void )
// delete save and saveshot
FS_Delete( va( "%s/save/%s.sav", GI->gamedir, Cmd_Argv( 1 )));
FS_Delete( va( "%s/save/%s.jpg", GI->gamedir, Cmd_Argv( 1 )));
FS_Delete( va( "%s/save/%s.%s", GI->gamedir, Cmd_Argv( 1 ), CL_LevelshotType( )));
}
/*

View File

@ -387,8 +387,8 @@ void SV_WriteSaveFile( const char *inname, bool autosave, bool bUseLandmark )
// make sure what oldsave is removed
if( FS_FileExists( va( "save/%s.sav", name )))
FS_Delete( va( "%s/save/%s.sav", GI->gamedir, name ));
if( FS_FileExists( va( "save/%s.jpg", name )))
FS_Delete( va( "%s/save/%s.jpg", GI->gamedir, name ));
if( FS_FileExists( va( "save/%s.%s", name, CL_LevelshotType( ))))
FS_Delete( va( "%s/save/%s.%s", GI->gamedir, name, CL_LevelshotType( )));
savfile = WAD_Open( path, "wb" );

View File

@ -192,7 +192,7 @@ UI_LoadGame_Callback
static void UI_LoadGame_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
string pathJPG;
string pathPIC;
if( event == QM_CHANGED )
{
@ -225,9 +225,9 @@ static void UI_LoadGame_Callback( void *self, int event )
case ID_YES:
if( com.strlen( uiLoadGame.delName[uiLoadGame.savesList.curItem] ))
{
com.snprintf( pathJPG, sizeof( pathJPG ), "save/%s.jpg", uiLoadGame.delName[uiLoadGame.savesList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "save/%s.%s", uiLoadGame.delName[uiLoadGame.savesList.curItem], CL_LevelshotType( ));
Cbuf_ExecuteText( EXEC_NOW, va( "delsave \"%s\"\n", uiLoadGame.delName[uiLoadGame.savesList.curItem] ));
if( re ) re->FreeShader( pathJPG ); // unload shader from video-memory
if( re ) re->FreeShader( pathPIC ); // unload shader from video-memory
UI_LoadGame_GetGameList();
}
UI_DeleteDialog();
@ -258,13 +258,13 @@ static void UI_LoadGame_Ownerdraw( void *self )
if( com.strlen( uiLoadGame.saveName[uiLoadGame.savesList.curItem] ))
{
string pathJPG;
string pathPIC;
com.snprintf( pathJPG, sizeof( pathJPG ), "save/%s.jpg", uiLoadGame.saveName[uiLoadGame.savesList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "save/%s.%s", uiLoadGame.saveName[uiLoadGame.savesList.curItem], CL_LevelshotType( ));
if( !FS_FileExists( pathJPG ))
if( !FS_FileExists( pathPIC ))
UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathJPG );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathPIC );
}
else UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );

View File

@ -190,7 +190,7 @@ UI_PlayDemo_Callback
static void UI_PlayDemo_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
string pathJPG;
string pathPIC;
if( event == QM_CHANGED )
{
@ -230,9 +230,9 @@ static void UI_PlayDemo_Callback( void *self, int event )
case ID_YES:
if( com.strlen( uiPlayDemo.delName[uiPlayDemo.demosList.curItem] ))
{
com.snprintf( pathJPG, sizeof( pathJPG ), "demos/%s.jpg", uiPlayDemo.delName[uiPlayDemo.demosList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "demos/%s.%s", uiPlayDemo.delName[uiPlayDemo.demosList.curItem], CL_LevelshotType( ));
Cbuf_ExecuteText( EXEC_NOW, va( "deldemo \"%s\"\n", uiPlayDemo.delName[uiPlayDemo.demosList.curItem] ));
if( re ) re->FreeShader( pathJPG ); // unload shader from video-memory
if( re ) re->FreeShader( pathPIC ); // unload shader from video-memory
UI_PlayDemo_GetDemoList();
}
UI_DeleteDialog();
@ -263,13 +263,13 @@ static void UI_PlayDemo_Ownerdraw( void *self )
if( com.strlen( uiPlayDemo.demoName[uiPlayDemo.demosList.curItem] ))
{
string pathJPG;
string pathPIC;
com.snprintf( pathJPG, sizeof( pathJPG ), "demos/%s.jpg", uiPlayDemo.demoName[uiPlayDemo.demosList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "demos/%s.%s", uiPlayDemo.demoName[uiPlayDemo.demosList.curItem], CL_LevelshotType( ));
if( !FS_FileExists( pathJPG ))
if( !FS_FileExists( pathPIC ))
UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathJPG );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathPIC );
}
else UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );

View File

@ -207,7 +207,7 @@ UI_RecDemo_Callback
static void UI_RecDemo_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
string pathJPG;
string pathPIC;
if( event == QM_CHANGED )
{
@ -240,9 +240,9 @@ static void UI_RecDemo_Callback( void *self, int event )
}
else if( com.strlen( uiRecDemo.demoName[uiRecDemo.demosList.curItem] ))
{
com.snprintf( pathJPG, sizeof( pathJPG ), "demos/%s.jpg", uiRecDemo.demoName[uiRecDemo.demosList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "demos/%s.%s", uiRecDemo.demoName[uiRecDemo.demosList.curItem], CL_LevelshotType( ));
Cbuf_ExecuteText( EXEC_APPEND, va( "record \"%s\"\n", uiRecDemo.demoName[uiRecDemo.demosList.curItem] ));
if( re ) re->FreeShader( pathJPG ); // unload shader from video-memory
if( re ) re->FreeShader( pathPIC ); // unload shader from video-memory
UI_CloseMenu();
}
break;
@ -253,9 +253,9 @@ static void UI_RecDemo_Callback( void *self, int event )
case ID_YES:
if( com.strlen( uiRecDemo.delName[uiRecDemo.demosList.curItem] ))
{
com.snprintf( pathJPG, sizeof( pathJPG ), "demos/%s.jpg", uiRecDemo.delName[uiRecDemo.demosList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "demos/%s.%s", uiRecDemo.delName[uiRecDemo.demosList.curItem], CL_LevelshotType( ));
Cbuf_ExecuteText( EXEC_NOW, va( "deldemo \"%s\"\n", uiRecDemo.delName[uiRecDemo.demosList.curItem] ));
if( re ) re->FreeShader( pathJPG ); // unload shader from video-memory
if( re ) re->FreeShader( pathPIC ); // unload shader from video-memory
UI_RecDemo_GetDemoList();
}
UI_DeleteDialog();
@ -286,13 +286,13 @@ static void UI_RecDemo_Ownerdraw( void *self )
if( com.strlen( uiRecDemo.demoName[uiRecDemo.demosList.curItem] ))
{
string pathJPG;
string pathPIC;
com.snprintf( pathJPG, sizeof( pathJPG ), "demos/%s.jpg", uiRecDemo.demoName[uiRecDemo.demosList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "demos/%s.%s", uiRecDemo.demoName[uiRecDemo.demosList.curItem], CL_LevelshotType( ));
if( !FS_FileExists( pathJPG ))
if( !FS_FileExists( pathPIC ))
UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathJPG );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathPIC );
}
else UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );

View File

@ -207,7 +207,7 @@ UI_SaveGame_Callback
static void UI_SaveGame_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
string pathJPG;
string pathPIC;
if( event == QM_CHANGED )
{
@ -233,9 +233,9 @@ static void UI_SaveGame_Callback( void *self, int event )
case ID_SAVE:
if( com.strlen( uiSaveGame.saveName[uiSaveGame.savesList.curItem] ))
{
com.snprintf( pathJPG, sizeof( pathJPG ), "save/%s.jpg", uiSaveGame.saveName[uiSaveGame.savesList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "save/%s.%s", uiSaveGame.saveName[uiSaveGame.savesList.curItem], CL_LevelshotType( ));
Cbuf_ExecuteText( EXEC_APPEND, va( "save \"%s\"\n", uiSaveGame.saveName[uiSaveGame.savesList.curItem] ));
if( re ) re->FreeShader( pathJPG ); // unload shader from video-memory
if( re ) re->FreeShader( pathPIC ); // unload shader from video-memory
UI_CloseMenu();
}
break;
@ -246,9 +246,9 @@ static void UI_SaveGame_Callback( void *self, int event )
case ID_YES:
if( com.strlen( uiSaveGame.delName[uiSaveGame.savesList.curItem] ))
{
com.snprintf( pathJPG, sizeof( pathJPG ), "save/%s.jpg", uiSaveGame.delName[uiSaveGame.savesList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "save/%s.%s", uiSaveGame.delName[uiSaveGame.savesList.curItem], CL_LevelshotType( ));
Cbuf_ExecuteText( EXEC_NOW, va( "delsave \"%s\"\n", uiSaveGame.delName[uiSaveGame.savesList.curItem] ));
if( re ) re->FreeShader( pathJPG ); // unload shader from video-memory
if( re ) re->FreeShader( pathPIC ); // unload shader from video-memory
UI_SaveGame_GetGameList();
}
UI_DeleteDialog();
@ -279,13 +279,13 @@ static void UI_SaveGame_Ownerdraw( void *self )
if( com.strlen( uiSaveGame.saveName[uiSaveGame.savesList.curItem] ))
{
string pathJPG;
string pathPIC;
com.snprintf( pathJPG, sizeof( pathJPG ), "save/%s.jpg", uiSaveGame.saveName[uiSaveGame.savesList.curItem] );
com.snprintf( pathPIC, sizeof( pathPIC ), "save/%s.%s", uiSaveGame.saveName[uiSaveGame.savesList.curItem], CL_LevelshotType( ));
if( !FS_FileExists( pathJPG ))
if( !FS_FileExists( pathPIC ))
UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathJPG );
else UI_DrawPic( x, y, w, h, uiColorWhite, pathPIC );
}
else UI_DrawPic( x, y, w, h, uiColorWhite, "gfx/hud/static" );

View File

@ -560,20 +560,18 @@ void CEgon::WeaponIdle( void )
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] > 0)
{
int iAnim;
float flRand = RANDOM_FLOAT(0,1);
if ( flRand > 0.8 )
{
iAnim = EGON_IDLE1;
SendWeaponAnim( EGON_IDLE1 );
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10,15);
}
else if ((m_iBody == 0)&&(flRand < 0.2))
{
iAnim = EGON_FIDGET1;
SendWeaponAnim( EGON_FIDGET1 );
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3;
}
SendWeaponAnim( iAnim );
}
}

View File

@ -190,7 +190,16 @@ void CEnvExplosion::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
// draw fireball
if ( !( pev->spawnflags & SF_ENVEXPLOSION_NOFIREBALL ) )
{
PLAYBACK_EVENT_FULL( FEV_RELIABLE|FEV_GLOBAL, edict(), m_usEfx, 0.0, (float *)&pev->origin, (float *)&g_vecZero, pev->dmg, 0.0, 0, 0, 0, 0 );
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION);
WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z );
WRITE_SHORT( g_sModelIndexFireball );
WRITE_BYTE( (BYTE)m_spriteScale ); // scale * 10
WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END();
}
else
{

View File

@ -64,9 +64,8 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
}
int iContents = UTIL_PointContents ( pev->origin );
PLAYBACK_EVENT_FULL( FEV_RELIABLE|FEV_GLOBAL, edict(), m_usEfx, 0.0, (float *)&pev->origin, (float *)&g_vecZero, pev->dmg, 0.0, 0, 0, iContents != CONTENTS_WATER ? 0 : 1, 0 );
/* MESSAGE_BEGIN( MSG_PAS, gmsgTempEntity, pev->origin );
MESSAGE_BEGIN( MSG_PAS, gmsgTempEntity, pev->origin );
WRITE_BYTE( TE_EXPLOSION ); // This makes a dynamic light and the explosion sprites/sound
WRITE_COORD( pev->origin.x ); // Send to PAS because of the sound
WRITE_COORD( pev->origin.y );
@ -83,7 +82,7 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END();
*/
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 );
entvars_t *pevOwner;
if ( pev->owner )
@ -97,8 +96,7 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
CBaseEntity *pHit = CBaseEntity::Instance( pTrace->pHit );
PLAYBACK_EVENT_FULL( FEV_RELIABLE|FEV_GLOBAL, edict(), m_usDecals, 0.0, (float *)&pTrace->vecEndPos, (float *)&g_vecZero, 0.0, 0.0, pHit->entindex(), 0, 0, 0 );
//UTIL_DecalTrace( pTrace, DECAL_SCORCH2 );
UTIL_DecalTrace( pTrace, DECAL_SCORCH2 );
flRndSound = RANDOM_FLOAT( 0 , 1 );
@ -117,14 +115,9 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
if (iContents != CONTENTS_WATER)
{
int sparkCount = RANDOM_LONG(0,3);
Vector mirpos = UTIL_MirrorPos(pev->origin);
for ( int i = 0; i < sparkCount; i++ )
Create( "spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL );
if(mirpos != Vector(0,0,0))
for ( int i = 0; i < sparkCount; i++ )
Create( "spark_shower", mirpos, pTrace->vecPlaneNormal, NULL );
}
}

View File

@ -223,7 +223,11 @@ void CGlock::WeaponIdle( void )
iAnim = GLOCK_IDLE3;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3.7;
}
else m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_LONG(10, 30);
else
{
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_LONG(10, 30);
return;
}
SendWeaponAnim( iAnim );
}
}

View File

@ -262,11 +262,12 @@ void CPython::WeaponIdle( void )
}
else
{
if(!m_fSpotActive)
if( !m_fSpotActive )
{
iAnim = PYTHON_FIDGET;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (170.0/30.0);
}
}
else return;
}
SendWeaponAnim( iAnim );
}

View File

@ -89,6 +89,7 @@ CRpgRocket *CRpgRocket::Create ( Vector vecOrigin, Vector vecAngles, CBaseEntity
{
CRpgRocket *pRocket = GetClassPtr( (CRpgRocket *)NULL );
pRocket->SetObjectClass( ED_NORMAL );
UTIL_SetOrigin( pRocket, vecOrigin );
pRocket->pev->angles = vecAngles;
pRocket->Spawn();
@ -220,8 +221,6 @@ void CRpgRocket :: FollowThink( void )
TraceResult tr;
UTIL_MakeAimVectors( pev->angles );
CreateTrail();
vecTarget = gpGlobals->v_forward;
flMax = 4096;
// Examine all entities within a reasonable radius

View File

@ -53,7 +53,6 @@ DLL_GLOBAL short g_sModelIndexErrorSprite;//error sprite index
DLL_GLOBAL short g_sSoundIndexNullSound;//null sound index
DLL_GLOBAL unsigned short g_usEventIndexNullEvent;//null event index
DLL_GLOBAL unsigned short m_usDecals; //Decal event
DLL_GLOBAL unsigned short m_usEfx; //special effects event (rocket trail, explosion e.t.c.)
DLL_GLOBAL unsigned short m_usPlayEmptySound; //play empty sound on client side
ItemInfo CBasePlayerItem::ItemInfoArray[MAX_WEAPONS];
@ -117,6 +116,7 @@ void CLaserSpot::Spawn( void )
pev->solid = SOLID_NOT;
pev->rendermode = kRenderGlow;
pev->rendercolor = Vector( 200, 12, 12 );
pev->renderfx = kRenderFxNoDissipation;
pev->renderamt = 255;
@ -477,7 +477,6 @@ void W_Precache(void)
g_sModelIndexLaserDot = PRECACHE_MODEL("sprites/laserdot.spr");
m_usPlayEmptySound = PRECACHE_EVENT( 1, "evEmptySound" );
m_usDecals = PRECACHE_EVENT(1, "evDecals");
m_usEfx = PRECACHE_EVENT(1, "evExplode");
// custom muzzleflashes
PRECACHE_MODEL ("sprites/muzzleflash1.spr");
@ -1012,8 +1011,8 @@ void CBasePlayerWeapon::SendWeaponAnim( int iAnim, float fps )
pev->body = (pev->body % NUM_HANDS) + NUM_HANDS * m_iBody;
MESSAGE_BEGIN( MSG_ONE, gmsgWeaponAnim, NULL, m_pPlayer->pev );
WRITE_BYTE( iAnim ); // sequence number
WRITE_BYTE( pev->body ); // weaponmodel bodygroup.
WRITE_BYTE( iAnim ); // sequence number
WRITE_BYTE( pev->body ); // weaponmodel bodygroup.
WRITE_BYTE( framerate * 16 );
MESSAGE_END();
}

View File

@ -424,7 +424,6 @@ extern DLL_GLOBAL short g_sModelIndexErrorSprite;//error sprite index
extern DLL_GLOBAL short g_sSoundIndexNullSound;//null sound index
extern DLL_GLOBAL unsigned short g_usEventIndexNullEvent;//null event index
extern DLL_GLOBAL unsigned short m_usDecals; //Decal event
extern DLL_GLOBAL unsigned short m_usEfx; //special effects event (rocket trail, explosion e.t.c.)
extern void ClearMultiDamage(void);
extern void ApplyMultiDamage(entvars_t* pevInflictor, entvars_t* pevAttacker );

View File

@ -39,10 +39,17 @@ Beta 13.02.10
14.implement realtime wind
15. fixup muzzleflashes OK
16. fix CL_GetEntityByIndex: invalid entindex OK
17. implement beams
17. implement beams OK
18. implement filetime in file_t
19. complete lights.shader, rails2d.shader
19. complete lights.shader
20. rails2d.shader OK
20. merge abaddon.shader
21. implement all TE_* messages
22. final revision of ClientAPI
23. fix Egon and Gauss firing
24. revision server physic
25. revision monster moving
26. get rid of fakemirror stuff in spirit

View File

@ -497,7 +497,7 @@ void GL_InitCommands( void )
r_nocull = Cvar_Get( "r_nocull", "0", 0, "ignore frustrum culling (perfomance test)" );
r_speeds = Cvar_Get( "r_speeds", "0", CVAR_ARCHIVE, "shows r_speeds" );
r_drawelements = Cvar_Get( "r_drawelements", "1", 0, "use gldrawElements or glDrawRangeElements" );
gl_wireframe = Cvar_Get( "gl_wireframe", "0", CVAR_CHEAT, "show mesh triangles" );
gl_wireframe = Cvar_Get( "gl_wireframe", "0", CVAR_CHEAT|CVAR_ARCHIVE, "show mesh triangles" );
r_lockpvs = Cvar_Get( "r_lockpvs", "0", CVAR_CHEAT, "lockpvs area at current point (pvs test)" );
gl_clear = Cvar_Get( "gl_clear", "0", CVAR_ARCHIVE, "clearing screen after each frame" );
r_mode = Cvar_Get( "r_mode", VID_DEFAULTMODE, CVAR_ARCHIVE|CVAR_LATCH_VIDEO, "display resolution mode" );