You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.1 KiB
166 lines
4.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
|
|
#include "cbase.h" |
|
#include "hud.h" |
|
#include "in_buttons.h" |
|
#include "beamdraw.h" |
|
#include "c_weapon__stubs.h" |
|
#include "clienteffectprecachesystem.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
CLIENTEFFECT_REGISTER_BEGIN( PrecacheEffectGravityGun ) |
|
CLIENTEFFECT_MATERIAL( "sprites/physbeam" ) |
|
CLIENTEFFECT_REGISTER_END() |
|
|
|
class C_BeamQuadratic : public CDefaultClientRenderable |
|
{ |
|
public: |
|
C_BeamQuadratic(); |
|
void Update( C_BaseEntity *pOwner ); |
|
|
|
// IClientRenderable |
|
virtual const Vector& GetRenderOrigin( void ) { return m_worldPosition; } |
|
virtual const QAngle& GetRenderAngles( void ) { return vec3_angle; } |
|
virtual bool ShouldDraw( void ) { return true; } |
|
virtual bool IsTransparent( void ) { return true; } |
|
virtual bool ShouldReceiveProjectedTextures( int flags ) { return false; } |
|
virtual int DrawModel( int flags ); |
|
|
|
// Returns the bounds relative to the origin (render bounds) |
|
virtual void GetRenderBounds( Vector& mins, Vector& maxs ) |
|
{ |
|
// bogus. But it should draw if you can see the end point |
|
mins.Init(-32,-32,-32); |
|
maxs.Init(32,32,32); |
|
} |
|
|
|
C_BaseEntity *m_pOwner; |
|
Vector m_targetPosition; |
|
Vector m_worldPosition; |
|
int m_active; |
|
int m_glueTouching; |
|
int m_viewModelIndex; |
|
}; |
|
|
|
|
|
class C_WeaponGravityGun : public C_BaseCombatWeapon |
|
{ |
|
DECLARE_CLASS( C_WeaponGravityGun, C_BaseCombatWeapon ); |
|
public: |
|
C_WeaponGravityGun() {} |
|
|
|
DECLARE_CLIENTCLASS(); |
|
DECLARE_PREDICTABLE(); |
|
|
|
int KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding ) |
|
{ |
|
if ( gHUD.m_iKeyBits & IN_ATTACK ) |
|
{ |
|
switch ( keynum ) |
|
{ |
|
case MOUSE_WHEEL_UP: |
|
gHUD.m_iKeyBits |= IN_WEAPON1; |
|
return 0; |
|
|
|
case MOUSE_WHEEL_DOWN: |
|
gHUD.m_iKeyBits |= IN_WEAPON2; |
|
return 0; |
|
} |
|
} |
|
|
|
// Allow engine to process |
|
return BaseClass::KeyInput( down, keynum, pszCurrentBinding ); |
|
} |
|
|
|
void OnDataChanged( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::OnDataChanged( updateType ); |
|
m_beam.Update( this ); |
|
} |
|
|
|
private: |
|
C_WeaponGravityGun( const C_WeaponGravityGun & ); |
|
|
|
C_BeamQuadratic m_beam; |
|
}; |
|
|
|
STUB_WEAPON_CLASS_IMPLEMENT( weapon_physgun, C_WeaponGravityGun ); |
|
|
|
IMPLEMENT_CLIENTCLASS_DT( C_WeaponGravityGun, DT_WeaponGravityGun, CWeaponGravityGun ) |
|
RecvPropVector( RECVINFO_NAME(m_beam.m_targetPosition,m_targetPosition) ), |
|
RecvPropVector( RECVINFO_NAME(m_beam.m_worldPosition, m_worldPosition) ), |
|
RecvPropInt( RECVINFO_NAME(m_beam.m_active, m_active) ), |
|
RecvPropInt( RECVINFO_NAME(m_beam.m_glueTouching, m_glueTouching) ), |
|
RecvPropInt( RECVINFO_NAME(m_beam.m_viewModelIndex, m_viewModelIndex) ), |
|
END_RECV_TABLE() |
|
|
|
|
|
C_BeamQuadratic::C_BeamQuadratic() |
|
{ |
|
m_pOwner = NULL; |
|
} |
|
|
|
void C_BeamQuadratic::Update( C_BaseEntity *pOwner ) |
|
{ |
|
m_pOwner = pOwner; |
|
if ( m_active ) |
|
{ |
|
if ( m_hRenderHandle == INVALID_CLIENT_RENDER_HANDLE ) |
|
{ |
|
ClientLeafSystem()->AddRenderable( this, RENDER_GROUP_TRANSLUCENT_ENTITY ); |
|
} |
|
else |
|
{ |
|
ClientLeafSystem()->RenderableChanged( m_hRenderHandle ); |
|
} |
|
} |
|
else if ( !m_active && m_hRenderHandle != INVALID_CLIENT_RENDER_HANDLE ) |
|
{ |
|
ClientLeafSystem()->RemoveRenderable( m_hRenderHandle ); |
|
} |
|
} |
|
|
|
|
|
int C_BeamQuadratic::DrawModel( int ) |
|
{ |
|
Vector points[3]; |
|
QAngle tmpAngle; |
|
|
|
if ( !m_active ) |
|
return 0; |
|
|
|
C_BaseEntity *pEnt = cl_entitylist->GetEnt( m_viewModelIndex ); |
|
if ( !pEnt ) |
|
return 0; |
|
pEnt->GetAttachment( 1, points[0], tmpAngle ); |
|
|
|
points[1] = 0.5 * (m_targetPosition + points[0]); |
|
|
|
// a little noise 11t & 13t should be somewhat non-periodic looking |
|
//points[1].z += 4*sin( gpGlobals->curtime*11 ) + 5*cos( gpGlobals->curtime*13 ); |
|
points[2] = m_worldPosition; |
|
|
|
IMaterial *pMat = materials->FindMaterial( "sprites/physbeam", TEXTURE_GROUP_CLIENT_EFFECTS ); |
|
Vector color; |
|
if ( m_glueTouching ) |
|
{ |
|
color.Init(1,0,0); |
|
} |
|
else |
|
{ |
|
color.Init(1,1,1); |
|
} |
|
|
|
float scrollOffset = gpGlobals->curtime - (int)gpGlobals->curtime; |
|
materials->Bind( pMat ); |
|
DrawBeamQuadratic( points[0], points[1], points[2], 13, color, scrollOffset ); |
|
return 1; |
|
} |
|
|
|
|