|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Declares basic entity communications classes, for input/output of data
// between entities
//
// $NoKeywords: $
//=============================================================================//
#ifndef ENTITYOUTPUT_H
#define ENTITYOUTPUT_H
#ifdef _WIN32
#pragma once
#endif
class CBaseEntity;
#define EVENT_FIRE_ALWAYS -1
//-----------------------------------------------------------------------------
// Purpose: A COutputEvent consists of an array of these CEventActions.
// Each CEventAction holds the information to fire a single input in
// a target entity, after a specific delay.
//-----------------------------------------------------------------------------
class CEventAction { public: CEventAction( const char *ActionData = NULL ); CEventAction( const CEventAction &p_EventAction );
string_t m_iTarget; // name of the entity(s) to cause the action in
string_t m_iTargetInput; // the name of the action to fire
string_t m_iParameter; // parameter to send, 0 if none
float m_flDelay; // the number of seconds to wait before firing the action
int m_nTimesToFire; // The number of times to fire this event, or EVENT_FIRE_ALWAYS.
int m_iIDStamp; // unique identifier stamp
static int s_iNextIDStamp;
CEventAction *m_pNext;
// allocates memory from engine.MPool/g_EntityListPool
static void *operator new( size_t stAllocateBlock ); static void *operator new( size_t stAllocateBlock, int nBlockUse, const char *pFileName, int nLine ); static void operator delete( void *pMem ); static void operator delete( void *pMem , int nBlockUse, const char *pFileName, int nLine ) { operator delete(pMem); }
DECLARE_SIMPLE_DATADESC(); };
//-----------------------------------------------------------------------------
// Purpose: Stores a list of connections to other entities, for data/commands to be
// communicated along.
//-----------------------------------------------------------------------------
class CBaseEntityOutput { public: ~CBaseEntityOutput();
void ParseEventAction( const char *EventData ); void AddEventAction( CEventAction *pEventAction ); void RemoveEventAction( CEventAction *pEventAction );
int Save( ISave &save ); int Restore( IRestore &restore, int elementCount );
int NumberOfElements( void );
float GetMaxDelay( void );
fieldtype_t ValueFieldType() { return m_Value.FieldType(); }
void FireOutput( variant_t Value, CBaseEntity *pActivator, CBaseEntity *pCaller, float fDelay = 0 );
/// Delete every single action in the action list.
void DeleteAllElements( void ) ;
CEventAction *GetFirstAction() { return m_ActionList; }
const CEventAction *GetActionForTarget( string_t iSearchTarget ) const; protected: variant_t m_Value; CEventAction *m_ActionList; DECLARE_SIMPLE_DATADESC();
CBaseEntityOutput() {} // this class cannot be created, only it's children
private: CBaseEntityOutput( CBaseEntityOutput& ); // protect from accidental copying
};
//-----------------------------------------------------------------------------
// Purpose: wraps variant_t data handling in convenient, compiler type-checked template
//-----------------------------------------------------------------------------
template< class Type, fieldtype_t fieldType > class CEntityOutputTemplate : public CBaseEntityOutput { public: //
// Sets an initial value without firing the output.
//
void Init( Type value ) { m_Value.Set( fieldType, &value ); }
//
// Sets a value and fires the output.
//
void Set( Type value, CBaseEntity *pActivator, CBaseEntity *pCaller ) { m_Value.Set( fieldType, &value ); FireOutput( m_Value, pActivator, pCaller ); }
//
// Returns the current value.
//
Type Get( void ) { return *((Type*)&m_Value); } };
//
// Template specializations for type Vector, so we can implement Get, Set, and Init differently.
//
template<> class CEntityOutputTemplate< Vector, FIELD_VECTOR> : public CBaseEntityOutput { public: void Init( const Vector &value ) { m_Value.SetVector3D( value ); }
void Set( const Vector &value, CBaseEntity *pActivator, CBaseEntity *pCaller ) { m_Value.SetVector3D( value ); FireOutput( m_Value, pActivator, pCaller ); }
void Get( Vector &vec ) { m_Value.Vector3D(vec); } };
template<> class CEntityOutputTemplate< Vector, FIELD_POSITION_VECTOR> : public CBaseEntityOutput { public: void Init( const Vector &value ) { m_Value.SetPositionVector3D( value ); }
void Set( const Vector &value, CBaseEntity *pActivator, CBaseEntity *pCaller ) { m_Value.SetPositionVector3D( value ); FireOutput( m_Value, pActivator, pCaller ); }
void Get( Vector &vec ) { m_Value.Vector3D(vec); } };
//-----------------------------------------------------------------------------
// Purpose: parameterless entity event
//-----------------------------------------------------------------------------
class COutputEvent : public CBaseEntityOutput { public: // void Firing, no parameter
void FireOutput( CBaseEntity *pActivator, CBaseEntity *pCaller, float fDelay = 0 ); };
// useful typedefs for allowed output data types
typedef CEntityOutputTemplate<variant_t,FIELD_INPUT> COutputVariant; typedef CEntityOutputTemplate<int,FIELD_INTEGER> COutputInt; typedef CEntityOutputTemplate<float,FIELD_FLOAT> COutputFloat; typedef CEntityOutputTemplate<string_t,FIELD_STRING> COutputString; typedef CEntityOutputTemplate<EHANDLE,FIELD_EHANDLE> COutputEHANDLE; typedef CEntityOutputTemplate<Vector,FIELD_VECTOR> COutputVector; typedef CEntityOutputTemplate<Vector,FIELD_POSITION_VECTOR> COutputPositionVector; typedef CEntityOutputTemplate<color32,FIELD_COLOR32> COutputColor32;
#endif // ENTITYOUTPUT_H
|