source-engine/game/server/env_screenoverlay.cpp

270 lines
8.7 KiB
C++
Raw Permalink Normal View History

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