|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define SF_NAV_START_ON 0x0001
enum navproperties_t { NAV_IGNORE = 1<<0, };
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CLogicNavigation : public CLogicalEntity, public IEntityListener { DECLARE_CLASS( CLogicNavigation, CLogicalEntity );
bool KeyValue( const char *szKeyName, const char *szValue ); void Activate( void );
private: void UpdateOnRemove();
void OnEntitySpawned( CBaseEntity *pEntity );
// Inputs
void InputTurnOn( inputdata_t &inputdata ) { TurnOn(); } void InputTurnOff( inputdata_t &inputdata ) { TurnOff(); } void InputToggle( inputdata_t &inputdata ) { if ( m_isOn ) TurnOff(); else TurnOn(); }
void TurnOn(); void TurnOff(); void UpdateProperty();
DECLARE_DATADESC();
bool m_isOn; navproperties_t m_navProperty; };
LINK_ENTITY_TO_CLASS(logic_navigation, CLogicNavigation);
BEGIN_DATADESC( CLogicNavigation )
DEFINE_FIELD( m_isOn, FIELD_BOOLEAN ), DEFINE_FIELD( m_navProperty, FIELD_INTEGER ),
// Inputs
DEFINE_INPUTFUNC(FIELD_VOID, "TurnOn", InputTurnOn), DEFINE_INPUTFUNC(FIELD_VOID, "TurnOff", InputTurnOff), DEFINE_INPUTFUNC(FIELD_VOID, "Toggle", InputToggle),
END_DATADESC()
//-----------------------------------------------------------------------------
// Purpose:
// Input : *szKeyName -
// *szValue -
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool CLogicNavigation::KeyValue( const char *szKeyName, const char *szValue ) { if ( FStrEq(szKeyName, "navprop") ) { if ( FStrEq( szValue, "Ignore" ) ) { m_navProperty = NAV_IGNORE; } else { DevMsg( 1, "Unknown nav property %s\n", szValue ); } return true; }
return BaseClass::KeyValue( szKeyName, szValue ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLogicNavigation::Activate() { BaseClass::Activate();
if ( HasSpawnFlags( SF_NAV_START_ON ) ) { TurnOn(); RemoveSpawnFlags( SF_NAV_START_ON ); } else if ( m_isOn ) { gEntList.AddListenerEntity( this ); } }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLogicNavigation::UpdateOnRemove() { if ( m_isOn ) { gEntList.RemoveListenerEntity( this ); }
BaseClass::UpdateOnRemove(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLogicNavigation::OnEntitySpawned( CBaseEntity *pEntity ) { if ( m_isOn && ( m_navProperty & NAV_IGNORE ) && pEntity->NameMatches( m_target ) ) { pEntity->SetNavIgnore(); } }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLogicNavigation::TurnOn() { if ( m_isOn ) return; m_isOn = true; gEntList.AddListenerEntity( this ); UpdateProperty(); }
void CLogicNavigation::UpdateProperty() { CBaseEntity *pEntity = NULL; while ( ( pEntity = gEntList.FindEntityByName( pEntity, STRING(m_target) ) ) != NULL ) { if ( m_isOn ) { if ( m_navProperty & NAV_IGNORE ) pEntity->SetNavIgnore(); } else { if ( m_navProperty & NAV_IGNORE ) pEntity->ClearNavIgnore(); } } }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLogicNavigation::TurnOff() { if ( !m_isOn ) return;
m_isOn = false; gEntList.RemoveListenerEntity( this ); UpdateProperty(); }
|