//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: area portal entity: toggles visibility areas on/off // // NOTE: These are not really brush entities. They are brush entities from a // designer/worldcraft perspective, but by the time they reach the game, the // brush model is gone and this is, in effect, a point entity. // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "func_areaportalbase.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" enum areaportal_state { AREAPORTAL_CLOSED = 0, AREAPORTAL_OPEN = 1, }; class CAreaPortal : public CFuncAreaPortalBase { public: DECLARE_CLASS( CAreaPortal, CFuncAreaPortalBase ); CAreaPortal(); virtual void Spawn( void ); virtual void Precache( void ); virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); virtual bool KeyValue( const char *szKeyName, const char *szValue ); virtual int UpdateTransmitState(); // Input handlers void InputOpen( inputdata_t &inputdata ); void InputClose( inputdata_t &inputdata ); void InputToggle( inputdata_t &inputdata ); virtual bool UpdateVisibility( const Vector &vOrigin, float fovDistanceAdjustFactor, bool &bIsOpenOnClient ); DECLARE_DATADESC(); private: bool UpdateState( void ); int m_state; }; LINK_ENTITY_TO_CLASS( func_areaportal, CAreaPortal ); BEGIN_DATADESC( CAreaPortal ) DEFINE_KEYFIELD( m_portalNumber, FIELD_INTEGER, "portalnumber" ), DEFINE_FIELD( m_state, FIELD_INTEGER ), // Inputs DEFINE_INPUTFUNC( FIELD_VOID, "Open", InputOpen ), DEFINE_INPUTFUNC( FIELD_VOID, "Close", InputClose ), DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ), // TODO: obsolete! remove DEFINE_INPUTFUNC( FIELD_VOID, "TurnOn", InputClose ), DEFINE_INPUTFUNC( FIELD_VOID, "TurnOff", InputOpen ), END_DATADESC() CAreaPortal::CAreaPortal() { m_state = AREAPORTAL_OPEN; } void CAreaPortal::Spawn( void ) { AddEffects( EF_NORECEIVESHADOW | EF_NOSHADOW ); Precache(); } //----------------------------------------------------------------------------- // Purpose: notify the engine of the state at startup/restore //----------------------------------------------------------------------------- void CAreaPortal::Precache( void ) { UpdateState(); } //------------------------------------------------------------------------------ // Purpose : //------------------------------------------------------------------------------ void CAreaPortal::InputClose( inputdata_t &inputdata ) { m_state = AREAPORTAL_CLOSED; UpdateState(); } //------------------------------------------------------------------------------ // Purpose : //------------------------------------------------------------------------------ void CAreaPortal::InputOpen( inputdata_t &inputdata ) { m_state = AREAPORTAL_OPEN; UpdateState(); } //------------------------------------------------------------------------------ // Purpose : //------------------------------------------------------------------------------ void CAreaPortal::InputToggle( inputdata_t &inputdata ) { m_state = ((m_state == AREAPORTAL_OPEN) ? AREAPORTAL_CLOSED : AREAPORTAL_OPEN); UpdateState(); } bool CAreaPortal::UpdateVisibility( const Vector &vOrigin, float fovDistanceAdjustFactor, bool &bIsOpenOnClient ) { if ( m_state ) { // We're not closed, so give the base class a chance to close it. return BaseClass::UpdateVisibility( vOrigin, fovDistanceAdjustFactor, bIsOpenOnClient ); } else { bIsOpenOnClient = false; return false; } } //------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ void CAreaPortal::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if ( useType == USE_ON ) { m_state = AREAPORTAL_OPEN; } else if ( useType == USE_OFF ) { m_state = AREAPORTAL_CLOSED; } else { return; } UpdateState(); } bool CAreaPortal::KeyValue( const char *szKeyName, const char *szValue ) { if( FStrEq( szKeyName, "StartOpen" ) ) { m_state = (atoi(szValue) != 0) ? AREAPORTAL_OPEN : AREAPORTAL_CLOSED; return true; } else { return BaseClass::KeyValue( szKeyName, szValue ); } } bool CAreaPortal::UpdateState() { engine->SetAreaPortalState( m_portalNumber, m_state ); return !!m_state; } int CAreaPortal::UpdateTransmitState() { // Our brushes are kept around so don't transmit anything since we don't want to draw them. return SetTransmitState( FL_EDICT_DONTSEND ); }