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.
190 lines
4.6 KiB
190 lines
4.6 KiB
//========= 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 ); |
|
} |
|
|
|
|