CBeam: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (Nescius moved page Beam to CBeam: Moving page history)
No edit summary
 
(5 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{LanguageBar}}
{{ent not in fgd|nolink=1|because=it doesn't provide enough KIO access and [[env_beam]] is available, but it might be of interest for [[vscript]] use}}
[[File:Dog hand beams.png|300px|thumb|right|When Dog holds objects, his hand creates four <code>beam</code>s.]]
{{CD|CBeam|base=CBaseEntity|file1=1}}
{{CD|CBeam|base=CBaseEntity|file1=1}}
{{this is a|point entity|name=beam}}
It is a base entity used by other entities to make beams or other effects, such as bubbles. The entities which use this one offer greater control over the effect.


==Keyvalues==
{{Linked entities|beam}}
{{KV|Damage/second|intn=damage|string|How much damage this beam does per second to things it hits when it is continually on, or instantaneously if it strikes. For continuous damage, the value should be greater than 10 or it may not work.
{{note|Damage is scaled to the difficulty setting:
:{{skill|50%|100%|150%}}}}}}
{{KV|HDR color scale|intn=HDRColorScale|float|Value to multiply sprite color by when running in HDR mode.}}
{{KV|Dissolve Type|intn=dissolvetype|choices|If this beam damages and kills something, effects to show around the object.
:*-1: None
:*0: Energy
:*1: Heavy Electrical
:*2: Light Electrical}}


==Inputs==
==Keyvalues / Inputs==
{{IO|Width|param=float|Set the width of the beam, in pixels.}}
=== KeyFields ===
{{IO|Noise|param=float|nofgd=1|Set how far away from the middle the beam is allowed to deviate.}}
{{DEFINE_KEYFIELD|m_flHDRColorScale|FIELD_FLOAT|HDRColorScale}}
{{IO|Alpha|param=integer|Sets the beam's alpha (0 - 255).}}
{{DEFINE_KEYFIELD|m_flDamage|FIELD_FLOAT|damage}}
{{IO|Color|param=color255|Sets the beam's render color (R G B).}}
{{DEFINE_KEYFIELD|m_nDissolveType|FIELD_INTEGER|dissolvetype}}
{{IO|ColorRedValue|param=float|Sets the red color channel's value (0 - 255).}}
{{IO|ColorGreenValue|param=float|Sets the green color channel's value (0 - 255).}}
{{IO|ColorBlueValue|param=float|Sets the blue color channel's value (0 - 255).}}
{{IO|ScrollSpeed|param=float|Set the scroll speed in units per second (0 - 100).}}


==Flags==
=== Inputs ===
{{Fl Beam}}
{{note|These inputs are usable either as Keyvalue or Input, they are also not autocompleted for [[ent_fire]] ConCommand}}
{{DEFINE_INPUT|[[#Fields|m_fSpeed ↑]]|FIELD_FLOAT|ScrollSpeed}}


== Additional information in [[ent_text]] overlay ==
=== Input Functions ===
{{DEFINE_INPUTFUNC|FIELD_FLOAT|Width|src=sdkmp13|game/shared/beam_shared.cpp#L833 InputWidth|Asserts that specified width is lower than MAX_BEAM_WIDTH and then sets [[#Fields|m_fWidth ↑]] and [[#Fields|m_fEndWidth ↑]]}}
{{DEFINE_INPUTFUNC|FIELD_FLOAT|Noise|src=sdkmp13|game/shared/beam_shared.cpp#L857 InputNoise|Sets [[#Fields|m_fAmplitude ↑]]}}
{{DEFINE_INPUTFUNC|FIELD_FLOAT|ColorRedValue|src=sdkmp13|game/shared/beam_shared.cpp#L839 InputColorRedValue|Sets r portion of m_clrRender to value clamped between 0, 255}}
{{DEFINE_INPUTFUNC|FIELD_FLOAT|ColorGreenValue|src=sdkmp13|game/shared/beam_shared.cpp#L845 InputColorGreenValue|Sets g portion of m_clrRender to value clamped between 0, 255}}
{{DEFINE_INPUTFUNC|FIELD_FLOAT|ColorBlueValue|src=sdkmp13|game/shared/beam_shared.cpp#L851 InputColorBlueValue|Sets b portion of m_clrRender to value clamped between 0, 255}}
 
== Fields <!-- is this correct name ? Would members be better ? --> ==
 
{{DEFINE_FIELD|m_nHaloIndex|FIELD_MODELINDEX}}
{{DEFINE_FIELD|m_nBeamType|FIELD_INTEGER}}
{{DEFINE_FIELD|m_nBeamFlags|FIELD_INTEGER}}
{{DEFINE_FIELD|m_nNumBeamEnts|FIELD_INTEGER}}
{{DEFINE_FIELD|m_nMinDXLevel|FIELD_INTEGER}}
 
{{DEFINE_FIELD|m_fWidth|FIELD_FLOAT|Width of the beam at the start}}
{{DEFINE_FIELD|m_fEndWidth|FIELD_FLOAT|Width of the beam at the end}}
{{DEFINE_FIELD|m_fFadeLength|FIELD_FLOAT}}
{{DEFINE_FIELD|m_fHaloScale|FIELD_FLOAT}}
{{DEFINE_FIELD|m_fAmplitude|FIELD_FLOAT}}
{{DEFINE_FIELD|m_fStartFrame|FIELD_FLOAT}}
{{DEFINE_FIELD|m_fSpeed|FIELD_FLOAT}}
 
{{DEFINE_FIELD|m_flFrameRate|FIELD_FLOAT}}
{{DEFINE_FIELD|m_flFrame|FIELD_FLOAT}}
 
{{DEFINE_FIELD|m_flFireTime|FIELD_TIME}}
 
{{DEFINE_FIELD|m_vecEndPos|FIELD_POSITION_VECTOR}}
{{DEFINE_FIELD|m_hEndEntity|FIELD_EHANDLE}}
 
 
 
=== Array fields ===
{{DEFINE_ARRAY|m_hAttachEntity|FIELD_EHANDLE|10}}
{{DEFINE_ARRAY|m_nAttachIndex|FIELD_INTEGER|10}}
 
=== Only in {{portal|4}} ===
{{DEFINE_FIELD|m_bDrawInMainRender|FIELD_BOOLEAN}}
{{DEFINE_FIELD|m_bDrawInPortalRender|FIELD_BOOLEAN}}
 
== Constants ==
*MAX_BEAM_WIDTH = 102.3f
*MAX_BEAM_SCROLLSPEED = 100.0f
*MAX_BEAM_NOISEAMPLITUDE = 64
 
== Entity debugging ==
{{Seealso|[[CBaseEntity#Entity debugging]]}}
 
=== Additional information in {{cmd|ent_text}} overlay ===
* start: <origin>
* start: <origin>
* end: <m_vecEndPos>
* end: <m_vecEndPos>
Line 39: Line 71:
</pre>
</pre>


{{Class def section}}
== See Also ==
== See Also ==
* {{l4d2}} [https://steamcommunity.com/sharedfiles/filedetails/?id=2433786424&searchtext=borderlands Example vscript addon utilizing this entity]
{{See also netprops}}
* {{l4d2}} [[Left_4_Dead_2/Script_Functions#CNetPropManager]]
* {{tf2}} [[Team_Fortress_2/Scripting/Script_Functions#CNetPropManager]]
* {{ent|env_beam}}
* {{ent|env_quadraticbeam}}

Latest revision as of 02:35, 28 September 2024

C++ Class hierarchy
CBeam
CBaseEntity
C++ beam_shared.cpp

Entities linked to this class

Keyvalues / Inputs

KeyFields

m_flHDRColorScale <FIELD_FLOAT> (HDRColorScale)

m_flDamage <FIELD_FLOAT> (damage)

m_nDissolveType <FIELD_INTEGER> (dissolvetype)


Inputs

Note.pngNote:These inputs are usable either as Keyvalue or Input, they are also not autocompleted for ent_fire ConCommand

m_fSpeed ↑ <FIELD_FLOAT> (ScrollSpeed)


Input Functions

Width <FIELD_FLOAT> linked function: InputWidth

Asserts that specified width is lower than MAX_BEAM_WIDTH and then sets m_fWidth ↑ and m_fEndWidth ↑

Noise <FIELD_FLOAT> linked function: InputNoise

Sets m_fAmplitude ↑

ColorRedValue <FIELD_FLOAT> linked function: InputColorRedValue

Sets r portion of m_clrRender to value clamped between 0, 255

ColorGreenValue <FIELD_FLOAT> linked function: InputColorGreenValue

Sets g portion of m_clrRender to value clamped between 0, 255

ColorBlueValue <FIELD_FLOAT> linked function: InputColorBlueValue

Sets b portion of m_clrRender to value clamped between 0, 255

Fields

m_nHaloIndex <FIELD_MODELINDEX>

m_nBeamType <FIELD_INTEGER>

m_nBeamFlags <FIELD_INTEGER>

m_nNumBeamEnts <FIELD_INTEGER>

m_nMinDXLevel <FIELD_INTEGER>


m_fWidth <FIELD_FLOAT>

Width of the beam at the start

m_fEndWidth <FIELD_FLOAT>

Width of the beam at the end

m_fFadeLength <FIELD_FLOAT>

m_fHaloScale <FIELD_FLOAT>

m_fAmplitude <FIELD_FLOAT>

m_fStartFrame <FIELD_FLOAT>

m_fSpeed <FIELD_FLOAT>


m_flFrameRate <FIELD_FLOAT>

m_flFrame <FIELD_FLOAT>


m_flFireTime <FIELD_TIME>


m_vecEndPos <FIELD_POSITION_VECTOR>

m_hEndEntity <FIELD_EHANDLE>



Array fields

m_hAttachEntity[10] <FIELD_EHANDLE>

m_nAttachIndex[10] <FIELD_INTEGER>


Only in Portal Portal

m_bDrawInMainRender <FIELD_BOOLEAN>

m_bDrawInPortalRender <FIELD_BOOLEAN>


Constants

  • MAX_BEAM_WIDTH = 102.3f
  • MAX_BEAM_SCROLLSPEED = 100.0f
  • MAX_BEAM_NOISEAMPLITUDE = 64

Entity debugging

Additional information in ent_text overlay

  • start: <origin>
  • end: <m_vecEndPos>

exact format:

start: (%.2f,%.2f,%.2f)", GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z
end  : (%.2f,%.2f,%.2f)", m_vecEndPos.GetX(), m_vecEndPos.GetY(), m_vecEndPos.GetZ()

C++ definitions from Source 2013 Multiplayer Source 2013 Multiplayer [edit]

Cpp.pngCode:Serverside/Clientside definition is in a shared file separated by preprocessors. The code shown below is split based on that.
Todo: verify correctness

Serverside

beam_shared.h

class CBeam : public CBaseEntity
{
	DECLARE_CLASS( CBeam, CBaseEntity );
public:
	DECLARE_NETWORKCLASS();
	DECLARE_PREDICTABLE();
	DECLARE_DATADESC();

	CBeam();

	virtual void SetModel( const char *szModelName );

	void	Spawn( void );
	void	Precache( void );

	int		ObjectCaps( void );
	void	SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways );
	int		UpdateTransmitState( void );
	int		ShouldTransmit( const CCheckTransmitInfo *pInfo );

	virtual int DrawDebugTextOverlays(void);

	// These functions are here to show the way beams are encoded as entities.
	// Encoding beams as entities simplifies their management in the client/server architecture
	void SetType( int type );
	void SetBeamFlags( int flags );
	void SetBeamFlag( int flag );
	
	// NOTE: Start + End Pos are specified in *relative* coordinates 
	void SetStartPos( const Vector &pos );
	void SetEndPos( const Vector &pos );

	// This will change things so the abs position matches the requested spot
	void SetAbsStartPos( const Vector &pos );
	void SetAbsEndPos( const Vector &pos );

	const Vector &GetAbsStartPos( void ) const;
	const Vector &GetAbsEndPos( void ) const;

	void SetStartEntity( CBaseEntity *pEntity );
	void SetEndEntity( CBaseEntity *pEntity );

	void SetStartAttachment( int attachment );
	void SetEndAttachment( int attachment );

	void SetTexture( int spriteIndex );
	void SetHaloTexture( int spriteIndex );
	void SetHaloScale( float haloScale );
	void SetWidth( float width );
	void SetEndWidth( float endWidth );
	void SetFadeLength( float fadeLength );
	void SetNoise( float amplitude );
	void SetColor( int r, int g, int b );
	void SetBrightness( int brightness );
	void SetFrame( float frame );
	void SetScrollRate( int speed );
	void SetFireTime( float flFireTime );
	void SetFrameRate( float flFrameRate ) { m_flFrameRate = flFrameRate; }

	void SetMinDXLevel( int nMinDXLevel ) { m_nMinDXLevel = nMinDXLevel; }

	void TurnOn( void );
	void TurnOff( void );

	int	GetType( void ) const;
	int	GetBeamFlags( void ) const;
	CBaseEntity* GetStartEntityPtr( void ) const;
	int	GetStartEntity( void ) const;
	CBaseEntity* GetEndEntityPtr( void ) const;
	int	GetEndEntity( void ) const;
	int GetStartAttachment() const;
	int GetEndAttachment() const;

	virtual const Vector &WorldSpaceCenter( void ) const;

	int GetTexture( void );
	float GetWidth( void ) const;
	float GetEndWidth( void ) const;
	float GetFadeLength( void ) const;
	float GetNoise( void ) const;
	int GetBrightness( void ) const;
	float GetFrame( void ) const;
	float GetScrollRate( void ) const;
	float GetHDRColorScale( void ) const;
	void SetHDRColorScale( float flScale ) { m_flHDRColorScale = flScale; }


	// Call after you change start/end positions
	void		RelinkBeam( void );

	void		DoSparks( const Vector &start, const Vector &end );
	CBaseEntity *RandomTargetname( const char *szName );
	void		BeamDamage( trace_t *ptr );
	// Init after BeamCreate()
	void		BeamInit( const char *pSpriteName, float width );
	void		PointsInit( const Vector &start, const Vector &end );
	void		PointEntInit( const Vector &start, CBaseEntity *pEndEntity );
	void		EntsInit( CBaseEntity *pStartEntity, CBaseEntity *pEndEntity );
	void		LaserInit( CBaseEntity *pStartEntity, CBaseEntity *pEndEntity );
	void		HoseInit( const Vector &start, const Vector &direction );
	void		SplineInit( int nNumEnts, CBaseEntity** pEntList, int *attachment  );

	// Input handlers

	static CBeam *BeamCreate( const char *pSpriteName, float width );
	static CBeam *BeamCreatePredictable( const char *module, int line, bool persist, const char *pSpriteName, float width, CBasePlayer *pOwner );

	void LiveForTime( float time );
	void BeamDamageInstant( trace_t *ptr, float damage );

	virtual const char *GetDecalName( void ) { return "BigShot"; }

protected:
	CNetworkVar( float, m_flFrameRate );
	CNetworkVar( float, m_flHDRColorScale );
	float		m_flFireTime;
	float		m_flDamage;			// Damage per second to touchers.
	CNetworkVar( int, m_nNumBeamEnts );

private:
	void InputNoise( inputdata_t &inputdata );
 	void InputWidth( inputdata_t &inputdata );
	void InputColorRedValue( inputdata_t &inputdata );
	void InputColorBlueValue( inputdata_t &inputdata );
	void InputColorGreenValue( inputdata_t &inputdata );

	// Beam Data Elements
	CNetworkVar( int, m_nHaloIndex );
	CNetworkVar( int, m_nBeamType );
	CNetworkVar( int, m_nBeamFlags );
	CNetworkArray( EHANDLE, m_hAttachEntity, MAX_BEAM_ENTS );
	CNetworkArray( int, m_nAttachIndex, MAX_BEAM_ENTS );
	CNetworkVar( float, m_fWidth );
	CNetworkVar( float, m_fEndWidth );
	CNetworkVar( float, m_fFadeLength );
	CNetworkVar( float, m_fHaloScale );
	CNetworkVar( float, m_fAmplitude );
	CNetworkVar( float, m_fStartFrame );
	CNetworkVar( float, m_fSpeed );
	CNetworkVar( int, m_nMinDXLevel );
	CNetworkVar( float, m_flFrame );

	CNetworkVector( m_vecEndPos );

	EHANDLE		m_hEndEntity;

	int			m_nDissolveType;

public:
#ifdef PORTAL
	CNetworkVar( bool, m_bDrawInMainRender );
	CNetworkVar( bool, m_bDrawInPortalRender );
#endif //#ifdef PORTAL
};

beam_shared.cpp

// This table encodes the CBeam data.
IMPLEMENT_NETWORKCLASS_ALIASED( Beam, DT_Beam )

#if !defined( NO_ENTITY_PREDICTION )
BEGIN_NETWORK_TABLE_NOBASE( CBeam, DT_BeamPredictableId )

	SendPropPredictableId( SENDINFO( m_PredictableID ) ),
	SendPropInt( SENDINFO( m_bIsPlayerSimulated ), 1, SPROP_UNSIGNED ),

END_NETWORK_TABLE()
#endif

BEGIN_NETWORK_TABLE_NOBASE( CBeam, DT_Beam )

	SendPropInt		(SENDINFO(m_nBeamType),		Q_log2(NUM_BEAM_TYPES)+1,	SPROP_UNSIGNED ),
	SendPropInt		(SENDINFO(m_nBeamFlags),	NUM_BEAM_FLAGS,	SPROP_UNSIGNED ),
	SendPropInt		(SENDINFO(m_nNumBeamEnts ),			5,	SPROP_UNSIGNED ),
	SendPropArray3
	(
		SENDINFO_ARRAY3(m_hAttachEntity), 
		SendPropEHandle( SENDINFO_ARRAY(m_hAttachEntity) )
	),
	SendPropArray3
	(
		SENDINFO_ARRAY3(m_nAttachIndex), 
		SendPropInt( SENDINFO_ARRAY(m_nAttachIndex), ATTACHMENT_INDEX_BITS, SPROP_UNSIGNED)
	),
	SendPropInt		(SENDINFO(m_nHaloIndex),	16, SPROP_UNSIGNED ),
	SendPropFloat	(SENDINFO(m_fHaloScale),	0,	SPROP_NOSCALE ),
	SendPropFloat	(SENDINFO(m_fWidth),		10,	SPROP_ROUNDUP,	0.0f, MAX_BEAM_WIDTH ),
	SendPropFloat	(SENDINFO(m_fEndWidth),		10,	SPROP_ROUNDUP,	0.0f, MAX_BEAM_WIDTH ),
	SendPropFloat	(SENDINFO(m_fFadeLength),	0,	SPROP_NOSCALE ),
	SendPropFloat	(SENDINFO(m_fAmplitude),	8,	SPROP_ROUNDDOWN,	0.0f, MAX_BEAM_NOISEAMPLITUDE ),
	SendPropFloat	(SENDINFO(m_fStartFrame),	8,	SPROP_ROUNDDOWN,	0.0f,   256.0f),
	SendPropFloat	(SENDINFO(m_fSpeed),		8,	SPROP_NOSCALE,	0.0f,	MAX_BEAM_SCROLLSPEED),
	SendPropInt		(SENDINFO(m_nRenderFX),		8,	SPROP_UNSIGNED ),
	SendPropInt		(SENDINFO(m_nRenderMode),	8,	SPROP_UNSIGNED ),
	SendPropFloat	(SENDINFO(m_flFrameRate),	10, SPROP_ROUNDUP, -25.0f, 25.0f ),
	SendPropFloat	(SENDINFO(m_flHDRColorScale),	0, SPROP_NOSCALE, 0.0f, 100.0f ),
	SendPropFloat	(SENDINFO(m_flFrame),		20, SPROP_ROUNDDOWN | SPROP_CHANGES_OFTEN,	0.0f,   256.0f),
	SendPropInt		(SENDINFO(m_clrRender),		32,	SPROP_UNSIGNED | SPROP_CHANGES_OFTEN ),
	SendPropVector	(SENDINFO(m_vecEndPos),		-1,	SPROP_COORD ),
#ifdef PORTAL
	SendPropBool	(SENDINFO(m_bDrawInMainRender) ),
	SendPropBool	(SENDINFO(m_bDrawInPortalRender) ),
#endif
	SendPropModelIndex(SENDINFO(m_nModelIndex) ),
	SendPropVector (SENDINFO(m_vecOrigin), 19, SPROP_CHANGES_OFTEN,	MIN_COORD_INTEGER, MAX_COORD_INTEGER),
	SendPropEHandle(SENDINFO_NAME(m_hMoveParent, moveparent) ),
	SendPropInt		(SENDINFO(m_nMinDXLevel),	8,	SPROP_UNSIGNED ),
#if !defined( NO_ENTITY_PREDICTION )
	SendPropDataTable( "beampredictable_id", 0, &REFERENCE_SEND_TABLE( DT_BeamPredictableId ), SendProxy_SendPredictableId ),
#endif

END_NETWORK_TABLE()

BEGIN_DATADESC( CBeam )
	DEFINE_FIELD( m_nHaloIndex, FIELD_MODELINDEX ),
	DEFINE_FIELD( m_nBeamType, FIELD_INTEGER ),
	DEFINE_FIELD( m_nBeamFlags, FIELD_INTEGER ),
	DEFINE_FIELD( m_nNumBeamEnts, FIELD_INTEGER ),
	DEFINE_ARRAY( m_hAttachEntity, FIELD_EHANDLE, MAX_BEAM_ENTS ),
	DEFINE_ARRAY( m_nAttachIndex, FIELD_INTEGER, MAX_BEAM_ENTS ),
	DEFINE_FIELD( m_nMinDXLevel, FIELD_INTEGER ),

	DEFINE_FIELD( m_fWidth, FIELD_FLOAT ),
	DEFINE_FIELD( m_fEndWidth, FIELD_FLOAT ),
	DEFINE_FIELD( m_fFadeLength, FIELD_FLOAT ),
	DEFINE_FIELD( m_fHaloScale, FIELD_FLOAT ),
	DEFINE_FIELD( m_fAmplitude, FIELD_FLOAT ),
	DEFINE_FIELD( m_fStartFrame, FIELD_FLOAT ),
	DEFINE_FIELD( m_fSpeed, FIELD_FLOAT ),

	DEFINE_FIELD( m_flFrameRate, FIELD_FLOAT ),
	DEFINE_FIELD( m_flFrame, FIELD_FLOAT ),

	DEFINE_KEYFIELD( m_flHDRColorScale, FIELD_FLOAT, "HDRColorScale" ),

	DEFINE_KEYFIELD( m_flDamage, FIELD_FLOAT, "damage" ),
	DEFINE_FIELD( m_flFireTime, FIELD_TIME ),

	DEFINE_FIELD( m_vecEndPos, FIELD_POSITION_VECTOR ),
	DEFINE_FIELD( m_hEndEntity, FIELD_EHANDLE ),

	DEFINE_KEYFIELD( m_nDissolveType, FIELD_INTEGER, "dissolvetype" ),

#ifdef PORTAL
	DEFINE_FIELD( m_bDrawInMainRender, FIELD_BOOLEAN ),
	DEFINE_FIELD( m_bDrawInPortalRender, FIELD_BOOLEAN ),
#endif

	// Inputs
	DEFINE_INPUTFUNC( FIELD_FLOAT, "Width", InputWidth ),
	DEFINE_INPUTFUNC( FIELD_FLOAT, "Noise", InputNoise ),
	DEFINE_INPUTFUNC( FIELD_FLOAT, "ColorRedValue", InputColorRedValue ),
	DEFINE_INPUTFUNC( FIELD_FLOAT, "ColorGreenValue", InputColorGreenValue ),
	DEFINE_INPUTFUNC( FIELD_FLOAT, "ColorBlueValue", InputColorBlueValue ),
	DEFINE_INPUT( m_fSpeed, FIELD_FLOAT, "ScrollSpeed" ),

	// don't save this
	//DEFINE_FIELD( m_queryHandleHalo, FIELD_ ),

END_DATADESC()

Clientside

beam_shared.h

class C_Beam : public C_BaseEntity
{
	DECLARE_CLASS( C_Beam, C_BaseEntity );
public:
	DECLARE_NETWORKCLASS();
	DECLARE_PREDICTABLE();

	C_Beam();

	virtual void SetModel( const char *szModelName );

	void	Spawn( void );
	void	Precache( void );
#if !defined( CLIENT_DLL )
	int		ObjectCaps( void );
	void	SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways );
	int		UpdateTransmitState( void );
	int		ShouldTransmit( const CCheckTransmitInfo *pInfo );
#endif

	virtual int DrawDebugTextOverlays(void);

	// These functions are here to show the way beams are encoded as entities.
	// Encoding beams as entities simplifies their management in the client/server architecture
	void SetType( int type );
	void SetBeamFlags( int flags );
	void SetBeamFlag( int flag );
	
	// NOTE: Start + End Pos are specified in *relative* coordinates 
	void SetStartPos( const Vector &pos );
	void SetEndPos( const Vector &pos );

	// This will change things so the abs position matches the requested spot
	void SetAbsStartPos( const Vector &pos );
	void SetAbsEndPos( const Vector &pos );

	const Vector &GetAbsStartPos( void ) const;
	const Vector &GetAbsEndPos( void ) const;

	void SetStartEntity( C_BaseEntity *pEntity );
	void SetEndEntity( C_BaseEntity *pEntity );

	void SetStartAttachment( int attachment );
	void SetEndAttachment( int attachment );

	void SetTexture( int spriteIndex );
	void SetHaloTexture( int spriteIndex );
	void SetHaloScale( float haloScale );
	void SetWidth( float width );
	void SetEndWidth( float endWidth );
	void SetFadeLength( float fadeLength );
	void SetNoise( float amplitude );
	void SetColor( int r, int g, int b );
	void SetBrightness( int brightness );
	void SetFrame( float frame );
	void SetScrollRate( int speed );
	void SetFireTime( float flFireTime );
	void SetFrameRate( float flFrameRate ) { m_flFrameRate = flFrameRate; }

	void SetMinDXLevel( int nMinDXLevel ) { m_nMinDXLevel = nMinDXLevel; }

	void TurnOn( void );
	void TurnOff( void );

	int	GetType( void ) const;
	int	GetBeamFlags( void ) const;
	C_BaseEntity* GetStartEntityPtr( void ) const;
	int	GetStartEntity( void ) const;
	C_BaseEntity* GetEndEntityPtr( void ) const;
	int	GetEndEntity( void ) const;
	int GetStartAttachment() const;
	int GetEndAttachment() const;

	virtual const Vector &WorldSpaceCenter( void ) const;

	int GetTexture( void );
	float GetWidth( void ) const;
	float GetEndWidth( void ) const;
	float GetFadeLength( void ) const;
	float GetNoise( void ) const;
	int GetBrightness( void ) const;
	float GetFrame( void ) const;
	float GetScrollRate( void ) const;
	float GetHDRColorScale( void ) const;
	void SetHDRColorScale( float flScale ) { m_flHDRColorScale = flScale; }


	// Call after you change start/end positions
	void		RelinkBeam( void );

	void		DoSparks( const Vector &start, const Vector &end );
	C_BaseEntity *RandomTargetname( const char *szName );
	void		BeamDamage( trace_t *ptr );
	// Init after BeamCreate()
	void		BeamInit( const char *pSpriteName, float width );
	void		PointsInit( const Vector &start, const Vector &end );
	void		PointEntInit( const Vector &start, C_BaseEntity *pEndEntity );
	void		EntsInit( C_BaseEntity *pStartEntity, C_BaseEntity *pEndEntity );
	void		LaserInit( C_BaseEntity *pStartEntity, C_BaseEntity *pEndEntity );
	void		HoseInit( const Vector &start, const Vector &direction );
	void		SplineInit( int nNumEnts, C_BaseEntity** pEntList, int *attachment  );

	// Input handlers

	static C_Beam *BeamCreate( const char *pSpriteName, float width );
	static C_Beam *BeamCreatePredictable( const char *module, int line, bool persist, const char *pSpriteName, float width, CBasePlayer *pOwner );

	void LiveForTime( float time );
	void BeamDamageInstant( trace_t *ptr, float damage );

// Only supported in TF2 right now
#if defined( INVASION_CLIENT_DLL )
	virtual bool	ShouldPredict( void )
	{
		return true;
	}
#endif

	virtual const char *GetDecalName( void ) { return "BigShot"; }

// IClientEntity overrides.
public:
	virtual int			DrawModel( int flags );
	virtual bool		IsTransparent( void );
	virtual bool		ShouldDraw();
	virtual bool		IgnoresZBuffer( void ) const { return true; }
	virtual void		OnDataChanged( DataUpdateType_t updateType );

	virtual bool		OnPredictedEntityRemove( bool isbeingremoved, C_BaseEntity *predicted );

	// Add beam to visible entities list?
	virtual void		AddEntity( void );
	virtual bool		ShouldReceiveProjectedTextures( int flags )
	{
		return false;
	}

// Beam Data Elements
private:
	// Computes the bounding box of a beam local to the origin of the beam
	void ComputeBounds( Vector& mins, Vector& maxs );

	friend void RecvProxy_Beam_ScrollSpeed( const CRecvProxyData *pData, void *pStruct, void *pOut );
	friend class CViewRenderBeams;

protected:
	CNetworkVar( float, m_flFrameRate );
	CNetworkVar( float, m_flHDRColorScale );
	float		m_flFireTime;
	float		m_flDamage;			// Damage per second to touchers.
	CNetworkVar( int, m_nNumBeamEnts );

	pixelvis_handle_t	m_queryHandleHalo;

private:
	// Beam Data Elements
	CNetworkVar( int, m_nHaloIndex );
	CNetworkVar( int, m_nBeamType );
	CNetworkVar( int, m_nBeamFlags );
	CNetworkArray( EHANDLE, m_hAttachEntity, MAX_BEAM_ENTS );
	CNetworkArray( int, m_nAttachIndex, MAX_BEAM_ENTS );
	CNetworkVar( float, m_fWidth );
	CNetworkVar( float, m_fEndWidth );
	CNetworkVar( float, m_fFadeLength );
	CNetworkVar( float, m_fHaloScale );
	CNetworkVar( float, m_fAmplitude );
	CNetworkVar( float, m_fStartFrame );
	CNetworkVar( float, m_fSpeed );
	CNetworkVar( int, m_nMinDXLevel );
	CNetworkVar( float, m_flFrame );

	CNetworkVector( m_vecEndPos );

	EHANDLE		m_hEndEntity;

public:
#ifdef PORTAL
	CNetworkVar( bool, m_bDrawInMainRender );
	CNetworkVar( bool, m_bDrawInPortalRender );
#endif //#ifdef PORTAL
};

beam_shared.cpp

// This table encodes the CBeam data.
IMPLEMENT_NETWORKCLASS_ALIASED( Beam, DT_Beam )

#if !defined( NO_ENTITY_PREDICTION )
BEGIN_NETWORK_TABLE_NOBASE( C_Beam, DT_BeamPredictableId )

	RecvPropPredictableId( RECVINFO( m_PredictableID ) ),
	RecvPropInt( RECVINFO( m_bIsPlayerSimulated ) ),

END_NETWORK_TABLE()
#endif

BEGIN_NETWORK_TABLE_NOBASE( C_Beam, DT_Beam )
	RecvPropInt		(RECVINFO(m_nBeamType)),
	RecvPropInt		(RECVINFO(m_nBeamFlags)),
	RecvPropInt		(RECVINFO(m_nNumBeamEnts)),
	RecvPropArray3
	(
		RECVINFO_ARRAY( m_hAttachEntity ),
		RecvPropEHandle (RECVINFO(m_hAttachEntity[0]))
	),
	RecvPropArray3	
	(
		RECVINFO_ARRAY( m_nAttachIndex ),
		RecvPropInt (RECVINFO(m_nAttachIndex[0]))
	),
	RecvPropInt		(RECVINFO(m_nHaloIndex)),
	RecvPropFloat	(RECVINFO(m_fHaloScale)),
	RecvPropFloat	(RECVINFO(m_fWidth)),
	RecvPropFloat	(RECVINFO(m_fEndWidth)),
	RecvPropFloat	(RECVINFO(m_fFadeLength)),
	RecvPropFloat	(RECVINFO(m_fAmplitude)),
	RecvPropFloat	(RECVINFO(m_fStartFrame)),
	RecvPropFloat	(RECVINFO(m_fSpeed), 0, RecvProxy_Beam_ScrollSpeed ),
	RecvPropFloat(RECVINFO(m_flFrameRate)),
	RecvPropFloat(RECVINFO(m_flHDRColorScale)),
	RecvPropInt(RECVINFO(m_clrRender)),
	RecvPropInt(RECVINFO(m_nRenderFX)),
	RecvPropInt(RECVINFO(m_nRenderMode)),
	RecvPropFloat(RECVINFO(m_flFrame)),
	RecvPropVector(RECVINFO(m_vecEndPos)),
#ifdef PORTAL
	RecvPropBool(RECVINFO(m_bDrawInMainRender) ),
	RecvPropBool(RECVINFO(m_bDrawInPortalRender) ),
#endif
	RecvPropInt(RECVINFO(m_nModelIndex)),
	RecvPropInt(RECVINFO(m_nMinDXLevel)),

	RecvPropVector(RECVINFO_NAME(m_vecNetworkOrigin, m_vecOrigin)),
	RecvPropInt( RECVINFO_NAME(m_hNetworkMoveParent, moveparent), 0, RecvProxy_IntToMoveParent ),
#if !defined( NO_ENTITY_PREDICTION )
	RecvPropDataTable( "beampredictable_id", 0, 0, &REFERENCE_RECV_TABLE( DT_BeamPredictableId ) ),
#endif

END_NETWORK_TABLE()

BEGIN_PREDICTION_DATA( C_Beam )

	DEFINE_PRED_FIELD( m_nBeamType, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	
	DEFINE_PRED_FIELD( m_nNumBeamEnts, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_ARRAY( m_hAttachEntity, FIELD_EHANDLE, MAX_BEAM_ENTS, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_ARRAY( m_nAttachIndex, FIELD_INTEGER, MAX_BEAM_ENTS, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_nHaloIndex, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fHaloScale, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fWidth, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fEndWidth, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fFadeLength, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fAmplitude, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fStartFrame, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_fSpeed, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_nRenderFX, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_nRenderMode, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_flFrameRate, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_flFrame, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_clrRender, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_nMinDXLevel, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD_TOL( m_vecEndPos, FIELD_VECTOR, FTYPEDESC_INSENDTABLE, 0.125f ),
#ifdef PORTAL
	DEFINE_PRED_FIELD( m_bDrawInMainRender, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
	DEFINE_PRED_FIELD( m_bDrawInPortalRender, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
#endif
	DEFINE_PRED_FIELD( m_nModelIndex, FIELD_INTEGER, FTYPEDESC_INSENDTABLE | FTYPEDESC_MODELINDEX ),
	DEFINE_PRED_FIELD_TOL( m_vecOrigin, FIELD_VECTOR, FTYPEDESC_INSENDTABLE, 0.125f ),
	
	//DEFINE_PRED_FIELD( m_pMoveParent, SendProxy_MoveParent ),
	//DEFINE_PRED_FIELD( m_flHDRColorScale, SendProxy_HDRColorScale ),

END_PREDICTION_DATA()

See Also