diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/client/hl2/c_weapon_gravitygun.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/client/hl2/c_weapon_gravitygun.cpp')
| -rw-r--r-- | sp/src/game/client/hl2/c_weapon_gravitygun.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/sp/src/game/client/hl2/c_weapon_gravitygun.cpp b/sp/src/game/client/hl2/c_weapon_gravitygun.cpp new file mode 100644 index 00000000..fbfab05a --- /dev/null +++ b/sp/src/game/client/hl2/c_weapon_gravitygun.cpp @@ -0,0 +1,166 @@ +//========= 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;
+}
+
|