source-engine/game/server/logic_navigation.cpp

184 lines
4.1 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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();
}