From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/server/env_screenoverlay.cpp | 269 +++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 mp/src/game/server/env_screenoverlay.cpp (limited to 'mp/src/game/server/env_screenoverlay.cpp') diff --git a/mp/src/game/server/env_screenoverlay.cpp b/mp/src/game/server/env_screenoverlay.cpp new file mode 100644 index 00000000..d643c111 --- /dev/null +++ b/mp/src/game/server/env_screenoverlay.cpp @@ -0,0 +1,269 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Entity to control screen overlays on a player +// +//=============================================================================// + +#include "cbase.h" +#include "shareddefs.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CEnvScreenOverlay : public CPointEntity +{ + DECLARE_CLASS( CEnvScreenOverlay, CPointEntity ); +public: + DECLARE_DATADESC(); + DECLARE_SERVERCLASS(); + + CEnvScreenOverlay(); + + // Always transmit to clients + virtual int UpdateTransmitState(); + virtual void Spawn( void ); + virtual void Precache( void ); + + void InputStartOverlay( inputdata_t &inputdata ); + void InputStopOverlay( inputdata_t &inputdata ); + void InputSwitchOverlay( inputdata_t &inputdata ); + + void SetActive( bool bActive ) { m_bIsActive = bActive; } + +protected: + CNetworkArray( string_t, m_iszOverlayNames, MAX_SCREEN_OVERLAYS ); + CNetworkArray( float, m_flOverlayTimes, MAX_SCREEN_OVERLAYS ); + CNetworkVar( float, m_flStartTime ); + CNetworkVar( int, m_iDesiredOverlay ); + CNetworkVar( bool, m_bIsActive ); +}; + +LINK_ENTITY_TO_CLASS( env_screenoverlay, CEnvScreenOverlay ); + +BEGIN_DATADESC( CEnvScreenOverlay ) + +// Silence, Classcheck! +// DEFINE_ARRAY( m_iszOverlayNames, FIELD_STRING, MAX_SCREEN_OVERLAYS ), +// DEFINE_ARRAY( m_flOverlayTimes, FIELD_FLOAT, MAX_SCREEN_OVERLAYS ), + + DEFINE_KEYFIELD( m_iszOverlayNames[0], FIELD_STRING, "OverlayName1" ), + DEFINE_KEYFIELD( m_iszOverlayNames[1], FIELD_STRING, "OverlayName2" ), + DEFINE_KEYFIELD( m_iszOverlayNames[2], FIELD_STRING, "OverlayName3" ), + DEFINE_KEYFIELD( m_iszOverlayNames[3], FIELD_STRING, "OverlayName4" ), + DEFINE_KEYFIELD( m_iszOverlayNames[4], FIELD_STRING, "OverlayName5" ), + DEFINE_KEYFIELD( m_iszOverlayNames[5], FIELD_STRING, "OverlayName6" ), + DEFINE_KEYFIELD( m_iszOverlayNames[6], FIELD_STRING, "OverlayName7" ), + DEFINE_KEYFIELD( m_iszOverlayNames[7], FIELD_STRING, "OverlayName8" ), + DEFINE_KEYFIELD( m_iszOverlayNames[8], FIELD_STRING, "OverlayName9" ), + DEFINE_KEYFIELD( m_iszOverlayNames[9], FIELD_STRING, "OverlayName10" ), + DEFINE_KEYFIELD( m_flOverlayTimes[0], FIELD_FLOAT, "OverlayTime1" ), + DEFINE_KEYFIELD( m_flOverlayTimes[1], FIELD_FLOAT, "OverlayTime2" ), + DEFINE_KEYFIELD( m_flOverlayTimes[2], FIELD_FLOAT, "OverlayTime3" ), + DEFINE_KEYFIELD( m_flOverlayTimes[3], FIELD_FLOAT, "OverlayTime4" ), + DEFINE_KEYFIELD( m_flOverlayTimes[4], FIELD_FLOAT, "OverlayTime5" ), + DEFINE_KEYFIELD( m_flOverlayTimes[5], FIELD_FLOAT, "OverlayTime6" ), + DEFINE_KEYFIELD( m_flOverlayTimes[6], FIELD_FLOAT, "OverlayTime7" ), + DEFINE_KEYFIELD( m_flOverlayTimes[7], FIELD_FLOAT, "OverlayTime8" ), + DEFINE_KEYFIELD( m_flOverlayTimes[8], FIELD_FLOAT, "OverlayTime9" ), + DEFINE_KEYFIELD( m_flOverlayTimes[9], FIELD_FLOAT, "OverlayTime10" ), + + // Class CEnvScreenOverlay: + DEFINE_FIELD( m_iDesiredOverlay, FIELD_INTEGER ), + DEFINE_FIELD( m_flStartTime, FIELD_TIME ), + DEFINE_FIELD( m_bIsActive, FIELD_BOOLEAN ), + + DEFINE_INPUTFUNC( FIELD_VOID, "StartOverlays", InputStartOverlay ), + DEFINE_INPUTFUNC( FIELD_VOID, "StopOverlays", InputStopOverlay ), + DEFINE_INPUTFUNC( FIELD_INTEGER, "SwitchOverlay", InputSwitchOverlay ), + +END_DATADESC() + +void SendProxy_String_tToString( const SendProp *pProp, const void *pStruct, const void *pData, DVariant *pOut, int iElement, int objectID ) +{ + string_t *pString = (string_t*)pData; + pOut->m_pString = (char*)STRING( *pString ); +} + +IMPLEMENT_SERVERCLASS_ST( CEnvScreenOverlay, DT_EnvScreenOverlay ) + SendPropArray( SendPropString( SENDINFO_ARRAY( m_iszOverlayNames ), 0, SendProxy_String_tToString ), m_iszOverlayNames ), + SendPropArray( SendPropFloat( SENDINFO_ARRAY( m_flOverlayTimes ), 11, SPROP_ROUNDDOWN, -1.0f, 63.0f ), m_flOverlayTimes ), + SendPropFloat( SENDINFO( m_flStartTime ), 32, SPROP_NOSCALE ), + SendPropInt( SENDINFO( m_iDesiredOverlay ), 5 ), + SendPropBool( SENDINFO( m_bIsActive ) ), +END_SEND_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CEnvScreenOverlay::CEnvScreenOverlay( void ) +{ + m_flStartTime = 0; + m_iDesiredOverlay = 0; + m_bIsActive = false; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvScreenOverlay::Spawn( void ) +{ + Precache(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvScreenOverlay::Precache( void ) +{ + for ( int i = 0; i < 10; i++ ) + { + if ( m_iszOverlayNames[i] == NULL_STRING ) + continue; + + PrecacheMaterial( STRING( m_iszOverlayNames[i] ) ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : &inputdata - +//----------------------------------------------------------------------------- +void CEnvScreenOverlay::InputStartOverlay( inputdata_t &inputdata ) +{ + if ( m_iszOverlayNames[0] == NULL_STRING ) + { + Warning("env_screenoverlay %s has no overlays to display.\n", STRING(GetEntityName()) ); + return; + } + + m_flStartTime = gpGlobals->curtime; + m_bIsActive = true; + + // Turn off any other screen overlays out there + CBaseEntity *pEnt = NULL; + while ( (pEnt = gEntList.FindEntityByClassname( pEnt, "env_screenoverlay" )) != NULL ) + { + if ( pEnt != this ) + { + CEnvScreenOverlay *pOverlay = assert_cast(pEnt); + pOverlay->SetActive( false ); + } + } +} + +int CEnvScreenOverlay::UpdateTransmitState() +{ + return SetTransmitState( FL_EDICT_ALWAYS ); +} + + +void CEnvScreenOverlay::InputSwitchOverlay( inputdata_t &inputdata ) +{ + int iNewOverlay = inputdata.value.Int() - 1; + iNewOverlay = abs( iNewOverlay ); + + if ( m_iszOverlayNames[iNewOverlay] == NULL_STRING ) + { + Warning("env_screenoverlay %s has no overlays to display.\n", STRING(GetEntityName()) ); + return; + } + + m_iDesiredOverlay = iNewOverlay; + m_flStartTime = gpGlobals->curtime; +} + +void CEnvScreenOverlay::InputStopOverlay( inputdata_t &inputdata ) +{ + if ( m_iszOverlayNames[0] == NULL_STRING ) + { + Warning("env_screenoverlay %s has no overlays to display.\n", STRING(GetEntityName()) ); + return; + } + + m_flStartTime = -1; + m_bIsActive = false; +} + +// ==================================================================================== +// +// Screen-space effects +// +// ==================================================================================== + +class CEnvScreenEffect : public CPointEntity +{ + DECLARE_CLASS( CEnvScreenEffect, CPointEntity ); +public: + DECLARE_DATADESC(); + DECLARE_SERVERCLASS(); + + // We always want to be sent to the client + CEnvScreenEffect( void ) { AddEFlags( EFL_FORCE_CHECK_TRANSMIT ); } + virtual int UpdateTransmitState( void ) { return SetTransmitState( FL_EDICT_ALWAYS ); } + virtual void Spawn( void ); + virtual void Precache( void ); + +private: + + void InputStartEffect( inputdata_t &inputdata ); + void InputStopEffect( inputdata_t &inputdata ); + + CNetworkVar( float, m_flDuration ); + CNetworkVar( int, m_nType ); +}; + +LINK_ENTITY_TO_CLASS( env_screeneffect, CEnvScreenEffect ); + +// CEnvScreenEffect +BEGIN_DATADESC( CEnvScreenEffect ) + DEFINE_FIELD( m_flDuration, FIELD_FLOAT ), + DEFINE_KEYFIELD( m_nType, FIELD_INTEGER, "type" ), + DEFINE_FIELD( m_flDuration, FIELD_FLOAT ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "StartEffect", InputStartEffect ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "StopEffect", InputStopEffect ), +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST( CEnvScreenEffect, DT_EnvScreenEffect ) + SendPropFloat( SENDINFO( m_flDuration ), 0, SPROP_NOSCALE ), + SendPropInt( SENDINFO( m_nType ), 32, SPROP_UNSIGNED ), +END_SEND_TABLE() + +void CEnvScreenEffect::Spawn( void ) +{ + Precache(); +} + +void CEnvScreenEffect::Precache( void ) +{ + PrecacheMaterial( "effects/stun" ); + PrecacheMaterial( "effects/introblur" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvScreenEffect::InputStartEffect( inputdata_t &inputdata ) +{ + // Take the duration as our value + m_flDuration = inputdata.value.Float(); + + EntityMessageBegin( this ); + WRITE_BYTE( 0 ); + MessageEnd(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvScreenEffect::InputStopEffect( inputdata_t &inputdata ) +{ + m_flDuration = inputdata.value.Float(); + + // Send the stop notification + EntityMessageBegin( this ); + WRITE_BYTE( 1 ); + MessageEnd(); +} -- cgit v1.2.3