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.
183 lines
4.1 KiB
183 lines
4.1 KiB
//========= 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(); |
|
} |
|
|
|
|