You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
5.1 KiB
203 lines
5.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "baseentity.h" |
|
#include "sendproxy.h" |
|
#include "sun_shared.h" |
|
#include "map_utils.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
class CSun : public CBaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( CSun, CBaseEntity ); |
|
DECLARE_SERVERCLASS(); |
|
DECLARE_DATADESC(); |
|
|
|
CSun(); |
|
|
|
virtual void Activate(); |
|
|
|
// Input handlers |
|
void InputTurnOn( inputdata_t &inputdata ); |
|
void InputTurnOff( inputdata_t &inputdata ); |
|
void InputSetColor( inputdata_t &inputdata ); |
|
|
|
virtual int UpdateTransmitState(); |
|
|
|
public: |
|
CNetworkVector( m_vDirection ); |
|
|
|
string_t m_strMaterial; |
|
string_t m_strOverlayMaterial; |
|
|
|
int m_bUseAngles; |
|
float m_flPitch; |
|
float m_flYaw; |
|
|
|
CNetworkVar( int, m_nSize ); // Size of the main core image |
|
CNetworkVar( int, m_nOverlaySize ); // Size for the glow overlay |
|
CNetworkVar( color32, m_clrOverlay ); |
|
CNetworkVar( bool, m_bOn ); |
|
CNetworkVar( int, m_nMaterial ); |
|
CNetworkVar( int, m_nOverlayMaterial ); |
|
CNetworkVar( float, m_flHDRColorScale ); |
|
}; |
|
|
|
IMPLEMENT_SERVERCLASS_ST_NOBASE( CSun, DT_Sun ) |
|
SendPropInt( SENDINFO(m_clrRender), 32, SPROP_UNSIGNED, SendProxy_Color32ToInt ), |
|
SendPropInt( SENDINFO(m_clrOverlay), 32, SPROP_UNSIGNED, SendProxy_Color32ToInt ), |
|
SendPropVector( SENDINFO(m_vDirection), 0, SPROP_NORMAL ), |
|
SendPropInt( SENDINFO(m_bOn), 1, SPROP_UNSIGNED ), |
|
SendPropInt( SENDINFO(m_nSize), 10, SPROP_UNSIGNED ), |
|
SendPropInt( SENDINFO(m_nOverlaySize), 10, SPROP_UNSIGNED ), |
|
SendPropInt( SENDINFO(m_nMaterial), 32, SPROP_UNSIGNED ), |
|
SendPropInt( SENDINFO(m_nOverlayMaterial), 32, SPROP_UNSIGNED ), |
|
SendPropFloat( SENDINFO_NAME( m_flHDRColorScale, HDRColorScale ), 0, SPROP_NOSCALE, 0.0f, 100.0f ), |
|
END_SEND_TABLE() |
|
|
|
|
|
LINK_ENTITY_TO_CLASS( env_sun, CSun ); |
|
|
|
|
|
BEGIN_DATADESC( CSun ) |
|
|
|
DEFINE_FIELD( m_vDirection, FIELD_VECTOR ), |
|
|
|
DEFINE_KEYFIELD( m_bUseAngles, FIELD_INTEGER, "use_angles" ), |
|
DEFINE_KEYFIELD( m_flPitch, FIELD_FLOAT, "pitch" ), |
|
DEFINE_KEYFIELD( m_flYaw, FIELD_FLOAT, "angle" ), |
|
DEFINE_KEYFIELD( m_nSize, FIELD_INTEGER, "size" ), |
|
DEFINE_KEYFIELD( m_clrOverlay, FIELD_COLOR32, "overlaycolor" ), |
|
DEFINE_KEYFIELD( m_nOverlaySize, FIELD_INTEGER, "overlaysize" ), |
|
DEFINE_KEYFIELD( m_strMaterial, FIELD_STRING, "material" ), |
|
DEFINE_KEYFIELD( m_strOverlayMaterial, FIELD_STRING, "overlaymaterial" ), |
|
|
|
// NOT SAVED |
|
// m_nOverlayMaterial |
|
// m_nMaterial |
|
|
|
DEFINE_FIELD( m_bOn, FIELD_BOOLEAN ), |
|
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "TurnOn", InputTurnOn ), |
|
DEFINE_INPUTFUNC( FIELD_VOID, "TurnOff", InputTurnOff ), |
|
DEFINE_INPUTFUNC( FIELD_COLOR32, "SetColor", InputSetColor ), |
|
|
|
DEFINE_KEYFIELD( m_flHDRColorScale, FIELD_FLOAT, "HDRColorScale" ), |
|
END_DATADESC() |
|
|
|
CSun::CSun() |
|
{ |
|
m_vDirection.Init( 0, 0, 1 ); |
|
|
|
m_bUseAngles = false; |
|
m_flPitch = 0; |
|
m_flYaw = 0; |
|
m_nSize = 16; |
|
|
|
m_bOn = true; |
|
AddEFlags( EFL_FORCE_CHECK_TRANSMIT ); |
|
|
|
m_strMaterial = NULL_STRING; |
|
m_strOverlayMaterial = NULL_STRING; |
|
m_nOverlaySize = -1; |
|
} |
|
|
|
void CSun::Activate() |
|
{ |
|
BaseClass::Activate(); |
|
|
|
// Find our target. |
|
if ( m_bUseAngles ) |
|
{ |
|
SetupLightNormalFromProps( GetAbsAngles(), m_flYaw, m_flPitch, m_vDirection.GetForModify() ); |
|
m_vDirection = -m_vDirection.Get(); |
|
} |
|
else |
|
{ |
|
CBaseEntity *pEnt = gEntList.FindEntityByName( 0, m_target ); |
|
if( pEnt ) |
|
{ |
|
Vector vDirection = GetAbsOrigin() - pEnt->GetAbsOrigin(); |
|
VectorNormalize( vDirection ); |
|
m_vDirection = vDirection; |
|
} |
|
} |
|
|
|
// Default behavior |
|
if ( m_nOverlaySize == -1 ) |
|
{ |
|
m_nOverlaySize = m_nSize; |
|
} |
|
|
|
// Cache off our image indices |
|
if ( m_strMaterial == NULL_STRING ) |
|
{ |
|
m_strMaterial = AllocPooledString( "sprites/light_glow02_add_noz.vmt" ); |
|
} |
|
else |
|
{ |
|
const char *pExtension = V_GetFileExtension( STRING( m_strMaterial ) ); |
|
if ( !pExtension ) |
|
{ |
|
char szFixedString[MAX_PATH]; |
|
V_strncpy( szFixedString, STRING( m_strMaterial ), sizeof( szFixedString ) ); |
|
V_strncat( szFixedString, ".vmt", sizeof( szFixedString ) ); |
|
m_strMaterial = AllocPooledString( szFixedString ); |
|
} |
|
} |
|
|
|
if ( m_strOverlayMaterial == NULL_STRING ) |
|
{ |
|
m_strOverlayMaterial = AllocPooledString( "sprites/light_glow02_add_noz.vmt" ); |
|
} |
|
else |
|
{ |
|
const char *pExtension = V_GetFileExtension( STRING( m_strOverlayMaterial ) ); |
|
if ( !pExtension ) |
|
{ |
|
char szFixedString[MAX_PATH]; |
|
V_strncpy( szFixedString, STRING( m_strOverlayMaterial ), sizeof( szFixedString ) ); |
|
V_strncat( szFixedString, ".vmt", sizeof( szFixedString ) ); |
|
m_strOverlayMaterial = AllocPooledString( szFixedString ); |
|
} |
|
} |
|
|
|
m_nMaterial = PrecacheModel( STRING( m_strMaterial ) ); |
|
m_nOverlayMaterial = PrecacheModel( STRING( m_strOverlayMaterial ) ); |
|
} |
|
|
|
void CSun::InputTurnOn( inputdata_t &inputdata ) |
|
{ |
|
if( !m_bOn ) |
|
{ |
|
m_bOn = true; |
|
} |
|
} |
|
|
|
void CSun::InputTurnOff( inputdata_t &inputdata ) |
|
{ |
|
if ( m_bOn ) |
|
{ |
|
m_bOn = false; |
|
} |
|
} |
|
|
|
void CSun::InputSetColor( inputdata_t &inputdata ) |
|
{ |
|
m_clrRender = inputdata.value.Color32(); |
|
} |
|
|
|
int CSun::UpdateTransmitState() |
|
{ |
|
return SetTransmitState( FL_EDICT_ALWAYS ); |
|
} |
|
|
|
|
|
|