//========= Copyright 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 #include "baseentity.h" #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); 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); 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); 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 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 : 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 : 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 COutputVariant; typedef CEntityOutputTemplate COutputInt; typedef CEntityOutputTemplate COutputFloat; typedef CEntityOutputTemplate COutputString; typedef CEntityOutputTemplate COutputEHANDLE; typedef CEntityOutputTemplate COutputVector; typedef CEntityOutputTemplate COutputPositionVector; typedef CEntityOutputTemplate COutputColor32; #endif // ENTITYOUTPUT_H