diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/logic_navigation.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/logic_navigation.cpp')
| -rw-r--r-- | mp/src/game/server/logic_navigation.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/mp/src/game/server/logic_navigation.cpp b/mp/src/game/server/logic_navigation.cpp new file mode 100644 index 00000000..1431ad40 --- /dev/null +++ b/mp/src/game/server/logic_navigation.cpp @@ -0,0 +1,183 @@ +//========= 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();
+}
+
|