rendered paste body//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============////// Purpose: //// $NoKeywords: $//=============================================================================//#include "cbase.h"#include "keydefs.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, int keynum, const char *pszCurrentBinding ) { if ( gHUD.m_iKeyBits & IN_ATTACK ) { switch ( keynum ) { case K_MWHEELUP: gHUD.m_iKeyBits |= IN_WEAPON1; return 0; case K_MWHEELDOWN: 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;}