mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-29 21:49:20 +00:00
upload "kind" alien swarm
This commit is contained in:
@@ -0,0 +1,260 @@
|
||||
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose: A special kind of beam effect that traces from its start position to
|
||||
// its end position and stops if it hits anything.
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================//
|
||||
|
||||
#include "cbase.h"
|
||||
#include "EnvLaser.h"
|
||||
#include "Sprite.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
// Spawnflags
|
||||
enum BeamSpotlightSpawnFlags_t
|
||||
{
|
||||
SF_BEAM_SPOTLIGHT_START_LIGHT_ON = 1,
|
||||
SF_BEAM_SPOTLIGHT_NO_DYNAMIC_LIGHT = 2,
|
||||
SF_BEAM_SPOTLIGHT_START_ROTATE_ON = 4,
|
||||
SF_BEAM_SPOTLIGHT_REVERSE_DIRECTION = 8,
|
||||
SF_BEAM_SPOTLIGHT_X_AXIS = 16,
|
||||
SF_BEAM_SPOTLIGHT_Y_AXIS = 32,
|
||||
};
|
||||
|
||||
|
||||
class CBeamSpotlight : public CBaseEntity
|
||||
{
|
||||
DECLARE_CLASS( CBeamSpotlight, CBaseEntity );
|
||||
public:
|
||||
DECLARE_DATADESC();
|
||||
DECLARE_SERVERCLASS();
|
||||
|
||||
CBeamSpotlight();
|
||||
|
||||
void Spawn( void );
|
||||
void Precache( void );
|
||||
|
||||
void InputTurnOn( inputdata_t &inputdata );
|
||||
void InputTurnOff( inputdata_t &inputdata );
|
||||
void InputStart( inputdata_t &inputdata );
|
||||
void InputStop( inputdata_t &inputdata );
|
||||
void InputReverse( inputdata_t &inputdata );
|
||||
|
||||
protected:
|
||||
bool KeyValue( const char *szKeyName, const char *szValue );
|
||||
|
||||
private:
|
||||
int UpdateTransmitState();
|
||||
void RecalcRotation( void );
|
||||
|
||||
CNetworkVar( int, m_nHaloIndex );
|
||||
|
||||
CNetworkVar( bool, m_bSpotlightOn );
|
||||
CNetworkVar( bool, m_bHasDynamicLight );
|
||||
|
||||
CNetworkVar( float, m_flSpotlightMaxLength );
|
||||
CNetworkVar( float, m_flSpotlightGoalWidth );
|
||||
CNetworkVar( float, m_flHDRColorScale );
|
||||
CNetworkVar( int, m_nMinDXLevel );
|
||||
CNetworkVar( int, m_nRotationAxis );
|
||||
CNetworkVar( float, m_flRotationSpeed );
|
||||
|
||||
float m_flmaxSpeed;
|
||||
bool m_isRotating;
|
||||
bool m_isReversed;
|
||||
|
||||
public:
|
||||
COutputEvent m_OnOn, m_OnOff; ///< output fires when turned on, off
|
||||
};
|
||||
|
||||
|
||||
LINK_ENTITY_TO_CLASS( beam_spotlight, CBeamSpotlight );
|
||||
|
||||
BEGIN_DATADESC( CBeamSpotlight )
|
||||
DEFINE_FIELD( m_nHaloIndex, FIELD_MODELINDEX ),
|
||||
DEFINE_FIELD( m_bSpotlightOn, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( m_bHasDynamicLight, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( m_flRotationSpeed, FIELD_FLOAT ),
|
||||
DEFINE_FIELD( m_isRotating, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( m_isReversed, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( m_nRotationAxis, FIELD_INTEGER ),
|
||||
|
||||
DEFINE_KEYFIELD( m_flmaxSpeed, FIELD_FLOAT, "maxspeed" ),
|
||||
DEFINE_KEYFIELD( m_flSpotlightMaxLength,FIELD_FLOAT, "SpotlightLength"),
|
||||
DEFINE_KEYFIELD( m_flSpotlightGoalWidth,FIELD_FLOAT, "SpotlightWidth"),
|
||||
DEFINE_KEYFIELD( m_flHDRColorScale, FIELD_FLOAT, "HDRColorScale" ),
|
||||
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "LightOn", InputTurnOn ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "LightOff", InputTurnOff ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "Start", InputStart ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "Stop", InputStop ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "Reverse", InputReverse ),
|
||||
DEFINE_OUTPUT( m_OnOn, "OnLightOn" ),
|
||||
DEFINE_OUTPUT( m_OnOff, "OnLightOff" ),
|
||||
END_DATADESC()
|
||||
|
||||
IMPLEMENT_SERVERCLASS_ST(CBeamSpotlight, DT_BeamSpotlight)
|
||||
SendPropInt( SENDINFO(m_nHaloIndex), 16, SPROP_UNSIGNED ),
|
||||
SendPropBool( SENDINFO(m_bSpotlightOn) ),
|
||||
SendPropBool( SENDINFO(m_bHasDynamicLight) ),
|
||||
SendPropFloat( SENDINFO(m_flSpotlightMaxLength), 0, SPROP_NOSCALE ),
|
||||
SendPropFloat( SENDINFO(m_flSpotlightGoalWidth), 0, SPROP_NOSCALE ),
|
||||
SendPropFloat( SENDINFO(m_flHDRColorScale), 0, SPROP_NOSCALE ),
|
||||
SendPropFloat( SENDINFO(m_flRotationSpeed), 0, SPROP_NOSCALE ),
|
||||
SendPropInt( SENDINFO(m_nRotationAxis), 2, SPROP_UNSIGNED ),
|
||||
END_SEND_TABLE()
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
CBeamSpotlight::CBeamSpotlight()
|
||||
: m_bSpotlightOn( false )
|
||||
, m_bHasDynamicLight( true )
|
||||
, m_flSpotlightMaxLength( 500.0f )
|
||||
, m_flSpotlightGoalWidth( 50.0f )
|
||||
, m_flHDRColorScale( 0.7f )
|
||||
, m_isRotating( false )
|
||||
, m_isReversed( false )
|
||||
, m_flmaxSpeed( 100.0f )
|
||||
, m_flRotationSpeed(0.0f)
|
||||
, m_nRotationAxis(0)
|
||||
{
|
||||
}
|
||||
|
||||
bool CBeamSpotlight::KeyValue( const char *szKeyName, const char *szValue )
|
||||
{
|
||||
if ( !Q_stricmp( szKeyName, "SpotlightWidth" ) )
|
||||
{
|
||||
m_flSpotlightGoalWidth = Q_atof(szValue);
|
||||
if ( m_flSpotlightGoalWidth > MAX_BEAM_WIDTH )
|
||||
{
|
||||
Warning( "Map Bug: %s has SpotLightWidth %f > %f, clamping value\n",
|
||||
STRING( GetEntityName()), m_flSpotlightGoalWidth.m_Value, (float)MAX_BEAM_WIDTH );
|
||||
m_flSpotlightGoalWidth = MIN( MAX_BEAM_WIDTH, m_flSpotlightGoalWidth );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return BaseClass::KeyValue( szKeyName, szValue );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::Precache( void )
|
||||
{
|
||||
BaseClass::Precache();
|
||||
|
||||
// Sprites.
|
||||
m_nHaloIndex = PrecacheModel("sprites/light_glow03.vmt");
|
||||
PrecacheModel( "sprites/glow_test02.vmt" );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::RecalcRotation( void )
|
||||
{
|
||||
if ( !m_isRotating || m_flmaxSpeed == 0.0f )
|
||||
{
|
||||
m_flRotationSpeed = 0.0f;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Build the axis of rotation based on spawnflags.
|
||||
//
|
||||
// Pitch Yaw Roll -> Y Z X
|
||||
m_nRotationAxis = 1;
|
||||
if ( HasSpawnFlags(SF_BEAM_SPOTLIGHT_Y_AXIS) )
|
||||
{
|
||||
m_nRotationAxis = 0;
|
||||
}
|
||||
else if ( HasSpawnFlags(SF_BEAM_SPOTLIGHT_X_AXIS) )
|
||||
{
|
||||
m_nRotationAxis = 2;
|
||||
}
|
||||
|
||||
m_flRotationSpeed = m_flmaxSpeed;
|
||||
if ( m_isReversed )
|
||||
{
|
||||
m_flRotationSpeed *= -1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
|
||||
UTIL_SetSize( this,vec3_origin,vec3_origin );
|
||||
AddSolidFlags( FSOLID_NOT_SOLID );
|
||||
SetMoveType( MOVETYPE_NONE );
|
||||
AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
|
||||
|
||||
m_bHasDynamicLight = !HasSpawnFlags( SF_BEAM_SPOTLIGHT_NO_DYNAMIC_LIGHT);
|
||||
m_bSpotlightOn = HasSpawnFlags( SF_BEAM_SPOTLIGHT_START_LIGHT_ON );
|
||||
m_isRotating = HasSpawnFlags( SF_BEAM_SPOTLIGHT_START_ROTATE_ON );
|
||||
m_isReversed = HasSpawnFlags( SF_BEAM_SPOTLIGHT_REVERSE_DIRECTION );
|
||||
|
||||
RecalcRotation();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::InputTurnOn( inputdata_t &inputdata )
|
||||
{
|
||||
if ( !m_bSpotlightOn )
|
||||
{
|
||||
m_bSpotlightOn = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::InputTurnOff( inputdata_t &inputdata )
|
||||
{
|
||||
if ( m_bSpotlightOn )
|
||||
{
|
||||
m_bSpotlightOn = false;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::InputStart( inputdata_t &inputdata )
|
||||
{
|
||||
if ( !m_isRotating )
|
||||
{
|
||||
m_isRotating = true;
|
||||
RecalcRotation();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::InputStop( inputdata_t &inputdata )
|
||||
{
|
||||
if ( m_isRotating )
|
||||
{
|
||||
m_isRotating = false;
|
||||
RecalcRotation();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CBeamSpotlight::InputReverse( inputdata_t &inputdata )
|
||||
{
|
||||
m_isReversed = !m_isReversed;
|
||||
RecalcRotation();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// Purpose : Send even though we don't have a model so spotlight gets proper position
|
||||
//-------------------------------------------------------------------------------------
|
||||
int CBeamSpotlight::UpdateTransmitState()
|
||||
{
|
||||
return SetTransmitState( FL_EDICT_PVSCHECK );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user