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/lights.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/lights.cpp')
| -rw-r--r-- | mp/src/game/server/lights.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/mp/src/game/server/lights.cpp b/mp/src/game/server/lights.cpp new file mode 100644 index 00000000..c0fa87de --- /dev/null +++ b/mp/src/game/server/lights.cpp @@ -0,0 +1,265 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: spawn and think functions for editor-placed lights
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "lights.h"
+#include "world.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+LINK_ENTITY_TO_CLASS( light, CLight );
+
+BEGIN_DATADESC( CLight )
+
+ DEFINE_FIELD( m_iCurrentFade, FIELD_CHARACTER),
+ DEFINE_FIELD( m_iTargetFade, FIELD_CHARACTER),
+
+ DEFINE_KEYFIELD( m_iStyle, FIELD_INTEGER, "style" ),
+ DEFINE_KEYFIELD( m_iDefaultStyle, FIELD_INTEGER, "defaultstyle" ),
+ DEFINE_KEYFIELD( m_iszPattern, FIELD_STRING, "pattern" ),
+
+ // Fuctions
+ DEFINE_FUNCTION( FadeThink ),
+
+ // Inputs
+ DEFINE_INPUTFUNC( FIELD_STRING, "SetPattern", InputSetPattern ),
+ DEFINE_INPUTFUNC( FIELD_STRING, "FadeToPattern", InputFadeToPattern ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "TurnOn", InputTurnOn ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "TurnOff", InputTurnOff ),
+
+END_DATADESC()
+
+
+
+//
+// Cache user-entity-field values until spawn is called.
+//
+bool CLight::KeyValue( const char *szKeyName, const char *szValue )
+{
+ if (FStrEq(szKeyName, "pitch"))
+ {
+ QAngle angles = GetAbsAngles();
+ angles.x = atof(szValue);
+ SetAbsAngles( angles );
+ }
+ else
+ {
+ return BaseClass::KeyValue( szKeyName, szValue );
+ }
+
+ return true;
+}
+
+// Light entity
+// If targeted, it will toggle between on or off.
+void CLight::Spawn( void )
+{
+ if (!GetEntityName())
+ { // inert light
+ UTIL_Remove( this );
+ return;
+ }
+
+ if (m_iStyle >= 32)
+ {
+ if ( m_iszPattern == NULL_STRING && m_iDefaultStyle > 0 )
+ {
+ m_iszPattern = MAKE_STRING(GetDefaultLightstyleString(m_iDefaultStyle));
+ }
+
+ if (FBitSet(m_spawnflags, SF_LIGHT_START_OFF))
+ engine->LightStyle(m_iStyle, "a");
+ else if (m_iszPattern != NULL_STRING)
+ engine->LightStyle(m_iStyle, (char *)STRING( m_iszPattern ));
+ else
+ engine->LightStyle(m_iStyle, "m");
+ }
+}
+
+
+void CLight::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
+{
+ if (m_iStyle >= 32)
+ {
+ if ( !ShouldToggle( useType, !FBitSet(m_spawnflags, SF_LIGHT_START_OFF) ) )
+ return;
+
+ Toggle();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Turn the light on
+//-----------------------------------------------------------------------------
+void CLight::TurnOn( void )
+{
+ if ( m_iszPattern != NULL_STRING )
+ {
+ engine->LightStyle( m_iStyle, (char *) STRING( m_iszPattern ) );
+ }
+ else
+ {
+ engine->LightStyle( m_iStyle, "m" );
+ }
+
+ CLEARBITS( m_spawnflags, SF_LIGHT_START_OFF );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Turn the light off
+//-----------------------------------------------------------------------------
+void CLight::TurnOff( void )
+{
+ engine->LightStyle( m_iStyle, "a" );
+ SETBITS( m_spawnflags, SF_LIGHT_START_OFF );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Toggle the light on/off
+//-----------------------------------------------------------------------------
+void CLight::Toggle( void )
+{
+ //Toggle it
+ if ( FBitSet( m_spawnflags, SF_LIGHT_START_OFF ) )
+ {
+ TurnOn();
+ }
+ else
+ {
+ TurnOff();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handle the "turnon" input handler
+// Input : &inputdata -
+//-----------------------------------------------------------------------------
+void CLight::InputTurnOn( inputdata_t &inputdata )
+{
+ TurnOn();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handle the "turnoff" input handler
+// Input : &inputdata -
+//-----------------------------------------------------------------------------
+void CLight::InputTurnOff( inputdata_t &inputdata )
+{
+ TurnOff();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handle the "toggle" input handler
+// Input : &inputdata -
+//-----------------------------------------------------------------------------
+void CLight::InputToggle( inputdata_t &inputdata )
+{
+ Toggle();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Input handler for setting a light pattern
+//-----------------------------------------------------------------------------
+void CLight::InputSetPattern( inputdata_t &inputdata )
+{
+ m_iszPattern = inputdata.value.StringID();
+ engine->LightStyle(m_iStyle, (char *)STRING( m_iszPattern ));
+
+ // Light is on if pattern is set
+ CLEARBITS(m_spawnflags, SF_LIGHT_START_OFF);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Input handler for fading from first value in old pattern to
+// first value in new pattern
+//-----------------------------------------------------------------------------
+void CLight::InputFadeToPattern( inputdata_t &inputdata )
+{
+ m_iCurrentFade = (STRING(m_iszPattern))[0];
+ m_iTargetFade = inputdata.value.String()[0];
+ m_iszPattern = inputdata.value.StringID();
+ SetThink(&CLight::FadeThink);
+ SetNextThink( gpGlobals->curtime );
+
+ // Light is on if pattern is set
+ CLEARBITS(m_spawnflags, SF_LIGHT_START_OFF);
+}
+
+
+//------------------------------------------------------------------------------
+// Purpose : Fade light to new starting pattern value then stop thinking
+//------------------------------------------------------------------------------
+void CLight::FadeThink(void)
+{
+ if (m_iCurrentFade < m_iTargetFade)
+ {
+ m_iCurrentFade++;
+ }
+ else if (m_iCurrentFade > m_iTargetFade)
+ {
+ m_iCurrentFade--;
+ }
+
+ // If we're done fading instantiate our light pattern and stop thinking
+ if (m_iCurrentFade == m_iTargetFade)
+ {
+ engine->LightStyle(m_iStyle, (char *)STRING( m_iszPattern ));
+ SetNextThink( TICK_NEVER_THINK );
+ }
+ // Otherwise instantiate our current fade value and keep thinking
+ else
+ {
+ char sCurString[2];
+ sCurString[0] = m_iCurrentFade;
+ sCurString[1] = 0;
+ engine->LightStyle(m_iStyle, sCurString);
+
+ // UNDONE: Consider making this settable war to control fade speed
+ SetNextThink( gpGlobals->curtime + 0.1f );
+ }
+}
+
+//
+// shut up spawn functions for new spotlights
+//
+LINK_ENTITY_TO_CLASS( light_spot, CLight );
+LINK_ENTITY_TO_CLASS( light_glspot, CLight );
+
+
+class CEnvLight : public CLight
+{
+public:
+ DECLARE_CLASS( CEnvLight, CLight );
+
+ bool KeyValue( const char *szKeyName, const char *szValue );
+ void Spawn( void );
+};
+
+LINK_ENTITY_TO_CLASS( light_environment, CEnvLight );
+
+bool CEnvLight::KeyValue( const char *szKeyName, const char *szValue )
+{
+ if (FStrEq(szKeyName, "_light"))
+ {
+ // nothing
+ }
+ else
+ {
+ return BaseClass::KeyValue( szKeyName, szValue );
+ }
+
+ return true;
+}
+
+
+void CEnvLight::Spawn( void )
+{
+ BaseClass::Spawn( );
+}
|