diff options
Diffstat (limited to 'hammer/entityconnection.h')
| -rw-r--r-- | hammer/entityconnection.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/hammer/entityconnection.h b/hammer/entityconnection.h new file mode 100644 index 0000000..5c8849e --- /dev/null +++ b/hammer/entityconnection.h @@ -0,0 +1,137 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Defines a connection (output-to-input) between two entities. +// +// The behavior in-game is as follows: +// +// When the given output in the source entity is triggered, the given +// input in the target entity is called after a specified delay, and +// the parameter override (if any) is passed to the input handler. If +// there is no parameter override, the default parameter is passed. +// +// This behavior will occur a specified number of times before the +// connection between the two entities is removed. +// +//=============================================================================// + +#ifndef ENTITYCONNECTION_H +#define ENTITYCONNECTION_H +#ifdef _WIN32 +#pragma once +#endif + +#include "utlvector.h" +#include "fgdlib/InputOutput.h" + + +#define EVENT_FIRE_ALWAYS -1 + +enum SortDirection_t +{ + Sort_Ascending = 0, + Sort_Descending, +}; + +enum +{ + CONNECTION_NONE, // if entity list has no outputs + CONNECTION_GOOD, // if all entity outpus are good + CONNECTION_BAD, // if any entity output is bad +}; + +class CMapEntity; +typedef CUtlVector<CMapEntity*> CMapEntityList; + +class CEntityConnection +{ +public: + CEntityConnection(void); + CEntityConnection(const CEntityConnection &Other ); + ~CEntityConnection(); + + CEntityConnection &operator =(const CEntityConnection &Other); + + inline bool CompareConnection(CEntityConnection *pConnection); + + inline float GetDelay(void) { return(m_fDelay); } + inline void SetDelay(float fDelay) { m_fDelay = fDelay; } + + inline const char *GetInputName(void) { return(m_szInput); } + inline void SetInputName(const char *pszName) { lstrcpyn(m_szInput, pszName, sizeof(m_szInput)); } + + inline const char *GetOutputName(void) { return(m_szOutput); } + inline void SetOutputName(const char *pszName) { lstrcpyn(m_szOutput, pszName, sizeof(m_szOutput)); } + + inline const char *GetTargetName(void) { return(m_szTargetEntity); } + void SetTargetName(const char *pszName); + + inline const char *GetSourceName(void) { return(m_szSourceEntity); } + void SetSourceName(const char *pszName); + + void LinkSourceEntities(); + void LinkTargetEntities(); + + bool AreAnyTargetEntitiesVisible(); + + inline CMapEntityList *GetSourceEntityList() { return m_pSourceEntityList; } + inline CMapEntityList *GetTargetEntityList() { return m_pTargetEntityList; } + + inline int GetTimesToFire(void) { return(m_nTimesToFire); } + inline void SetTimesToFire(int nTimesToFire) { m_nTimesToFire = nTimesToFire; } + + inline const char *GetParam(void) { return(m_szParam); } + inline void SetParam(const char *pszParam) { lstrcpyn(m_szParam, pszParam, sizeof(m_szParam)); } + + // Sorting functions + static int CALLBACK CompareDelaysSecondary(CEntityConnection *pConn1, CEntityConnection *pConn2, SortDirection_t eDirection); + static int CALLBACK CompareDelays(CEntityConnection *pConn1, CEntityConnection *pConn2, SortDirection_t eDirection); + static int CALLBACK CompareOutputNames(CEntityConnection *pConn1, CEntityConnection *pConn2, SortDirection_t eDirection); + static int CALLBACK CompareInputNames(CEntityConnection *pConn1, CEntityConnection *pConn2, SortDirection_t eDirection); + static int CALLBACK CompareSourceNames(CEntityConnection *pConn1, CEntityConnection *pConn2, SortDirection_t eDirection); + static int CALLBACK CompareTargetNames(CEntityConnection *pConn1, CEntityConnection *pConn2, SortDirection_t eDirection); + + // Validation functions + static bool ValidateOutput(CMapEntity *pEntity, const char* pszOutput); + static bool ValidateOutput(const CMapEntityList *pEntityList, const char* pszOutput); + static bool ValidateTarget(const CMapEntityList *pEntityList, bool bVisibilityCheck, const char* pszTarget); + static bool ValidateInput(const char* pszTarget, const char* pszInput, bool bVisiblesOnly); + + static int ValidateOutputConnections(CMapEntity *pEntity, bool bVisibilityCheck, bool bIgnoreHiddenTargets=false ); + static int ValidateInputConnections(CMapEntity *pEntity, bool bVisibilityCheck); + + static void FindBadConnections(CMapEntity *pEntity, bool bVisibilityCheck, CUtlVector<CEntityConnection *> &BadConnectionList, bool bIgnoreHiddenTargets=false); + static void FixBadConnections(CMapEntity *pEntity, bool bVisibilityCheck); + +protected: + char m_szSourceEntity[MAX_ENTITY_NAME_LEN]; // Targetname of the source entity + CMapEntityList *m_pSourceEntityList; + char m_szOutput[MAX_IO_NAME_LEN]; // Name of the output in the source entity. + char m_szTargetEntity[MAX_ENTITY_NAME_LEN]; // Targetname of the target entity. + CMapEntityList *m_pTargetEntityList; + char m_szInput[MAX_IO_NAME_LEN]; // Name of the input to fire in the target entity. + char m_szParam[MAX_IO_NAME_LEN]; // Parameter override, if any. + + float m_fDelay; // Delay before firing this outout. + int m_nTimesToFire; // Maximum times to fire this output or EVENT_FIRE_ALWAYS. +}; + +typedef CUtlVector<CEntityConnection *> CEntityConnectionList; + +//----------------------------------------------------------------------------- +// Purpose: Returns true if the given connection is identical to this connection. +// Input : pConnection - Connection to compare. +//----------------------------------------------------------------------------- +bool CEntityConnection::CompareConnection(CEntityConnection *pConnection) +{ + // BUGBUG - Why not compare the GetSourceName() values too? Why is this field not relevant? + return((!stricmp(GetOutputName(), pConnection->GetOutputName())) && + (!stricmp(GetTargetName(), pConnection->GetTargetName())) && + (!stricmp(GetInputName(), pConnection->GetInputName())) && + (!stricmp(GetParam(), pConnection->GetParam())) && + (GetDelay() == pConnection->GetDelay()) && + (GetTimesToFire() == pConnection->GetTimesToFire())); +} + + + +#endif // ENTITYCONNECTION_H |