Counter Strike : Global Offensive Source Code
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.
|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: 'Button' which activates after a specified amount of weight is touching it.
//
//=============================================================================//
#include "cbase.h"
// NOTE: This has to be the last file included!
#include "tier0/memdbgon.h"
class CWeightButton : public CBaseEntity { public:
DECLARE_DATADESC(); DECLARE_CLASS( CWeightButton, CBaseEntity );
void Spawn( void ); bool CreateVPhysics( void );
COutputEvent m_OnPressed; // After threshold weight has been reached
COutputEvent m_OnReleased; // After weight has been removed to go below weight threshold
float m_fStressToActivate; // Amount of weight required to activate
bool m_bHasBeenPressed; // Once the button has been pressed, fire one
// output until the weight is reduced below the threshold
void TriggerThink ( void );
};
LINK_ENTITY_TO_CLASS( func_weight_button, CWeightButton );
BEGIN_DATADESC( CWeightButton )
DEFINE_KEYFIELD( m_fStressToActivate, FIELD_FLOAT, "WeightToActivate" ), DEFINE_FIELD( m_bHasBeenPressed, FIELD_BOOLEAN ),
DEFINE_OUTPUT( m_OnPressed, "OnPressed" ), DEFINE_OUTPUT( m_OnReleased, "OnReleased" ), DEFINE_THINKFUNC( TriggerThink ),
END_DATADESC()
void CWeightButton::Spawn() { BaseClass::Spawn();
// Convert movedir from angles to a vector
SetMoveType( MOVETYPE_VPHYSICS ); SetSolid( SOLID_VPHYSICS ); SetModel( STRING( GetModelName() ) ); CreateVPhysics(); SetThink( &CWeightButton::TriggerThink ); SetNextThink( gpGlobals->curtime + TICK_INTERVAL ); m_bHasBeenPressed = false; }
//-----------------------------------------------------------------------------
// Purpose: Create VPhysics collision for this entity
//-----------------------------------------------------------------------------
bool CWeightButton::CreateVPhysics() { VPhysicsInitShadow( false, false ); return true; }
//-----------------------------------------------------------------------------
// Purpose: Every second, check total stress and fire an output if we have reached
// our threshold. If the stress is relieved below our threshold, fire a different output.
//-----------------------------------------------------------------------------
void CWeightButton::TriggerThink( void ) { vphysics_objectstress_t vpobj_StressOut; IPhysicsObject* pMyPhysics = VPhysicsGetObject();
if ( !pMyPhysics ) { SetNextThink( TICK_NEVER_THINK ); return; }
float fStress = CalculateObjectStress( pMyPhysics, this, &vpobj_StressOut );
// fStress = vpobj_StressOut.receivedStress;
if ( fStress > m_fStressToActivate && !m_bHasBeenPressed ) { m_OnPressed.FireOutput( this, this ); m_bHasBeenPressed = true; } else if ( fStress < m_fStressToActivate && m_bHasBeenPressed ) { m_OnReleased.FireOutput( this, this ); m_bHasBeenPressed = false; }
// think every tick
SetNextThink( gpGlobals->curtime + TICK_INTERVAL ); }
|