Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
4.9 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: gameeventmanager.h: interface for the CGameEventManager class.
  4. //
  5. // $Workfile: $
  6. // $NoKeywords: $
  7. //=============================================================================//
  8. #if !defined ( GAMEEVENTMANAGER_H )
  9. #define GAMEEVENTMANAGER_H
  10. #ifdef _WIN32
  11. #pragma once
  12. #endif
  13. #include <igameevents.h>
  14. #include <utlvector.h>
  15. #include <KeyValues.h>
  16. #include <networkstringtabledefs.h>
  17. #include <utlsymbol.h>
  18. class SVC_GameEventList;
  19. class CLC_ListenEvents;
  20. class CGameEventCallback
  21. {
  22. public:
  23. void *m_pCallback; // callback pointer
  24. int m_nListenerType; // client or server side ?
  25. };
  26. class CGameEventDescriptor
  27. {
  28. public:
  29. CGameEventDescriptor()
  30. {
  31. name[0] = 0;
  32. eventid = -1;
  33. keys = NULL;
  34. local = false;
  35. reliable = true;
  36. }
  37. public:
  38. char name[MAX_EVENT_NAME_LENGTH]; // name of this event
  39. int eventid; // network index number, -1 = not networked
  40. KeyValues *keys; // KeyValue describing data types, if NULL only name
  41. bool local; // local event, never tell clients about that
  42. bool reliable; // send this event as reliable message
  43. CUtlVector<CGameEventCallback*> listeners; // registered listeners
  44. };
  45. class CGameEvent : public IGameEvent
  46. {
  47. public:
  48. CGameEvent( CGameEventDescriptor *descriptor );
  49. virtual ~CGameEvent();
  50. const char *GetName() const;
  51. bool IsEmpty(const char *keyName = NULL);
  52. bool IsLocal() const;
  53. bool IsReliable() const;
  54. bool GetBool( const char *keyName = NULL, bool defaultValue = false );
  55. int GetInt( const char *keyName = NULL, int defaultValue = 0 );
  56. float GetFloat( const char *keyName = NULL, float defaultValue = 0.0f );
  57. const char *GetString( const char *keyName = NULL, const char *defaultValue = "" );
  58. void SetBool( const char *keyName, bool value );
  59. void SetInt( const char *keyName, int value );
  60. void SetFloat( const char *keyName, float value );
  61. void SetString( const char *keyName, const char *value );
  62. CGameEventDescriptor *m_pDescriptor;
  63. KeyValues *m_pDataKeys;
  64. };
  65. class CGameEventManager : public IGameEventManager2
  66. {
  67. friend class CGameEventManagerOld;
  68. public: // IGameEventManager functions
  69. enum
  70. {
  71. SERVERSIDE = 0, // this is a server side listener, event logger etc
  72. CLIENTSIDE, // this is a client side listenet, HUD element etc
  73. CLIENTSTUB, // this is a serverside stub for a remote client listener (used by engine only)
  74. SERVERSIDE_OLD, // legacy support for old server event listeners
  75. CLIENTSIDE_OLD, // legecy support for old client event listeners
  76. };
  77. enum
  78. {
  79. TYPE_LOCAL = 0, // not networked
  80. TYPE_STRING, // zero terminated ASCII string
  81. TYPE_FLOAT, // float 32 bit
  82. TYPE_LONG, // signed int 32 bit
  83. TYPE_SHORT, // signed int 16 bit
  84. TYPE_BYTE, // unsigned int 8 bit
  85. TYPE_BOOL // unsigned int 1 bit
  86. };
  87. CGameEventManager();
  88. virtual ~CGameEventManager();
  89. int LoadEventsFromFile( const char * filename );
  90. void Reset();
  91. bool AddListener( IGameEventListener2 *listener, const char *name, bool bServerSide );
  92. bool FindListener( IGameEventListener2 *listener, const char *name );
  93. void RemoveListener( IGameEventListener2 *listener);
  94. IGameEvent *CreateEvent( const char *name, bool bForce = false );
  95. IGameEvent *DuplicateEvent( IGameEvent *event);
  96. bool FireEvent( IGameEvent *event, bool bDontBroadcast = false );
  97. bool FireEventClientSide( IGameEvent *event );
  98. void FreeEvent( IGameEvent *event );
  99. bool SerializeEvent( IGameEvent *event, bf_write *buf );
  100. IGameEvent *UnserializeEvent( bf_read *buf );
  101. public:
  102. bool Init();
  103. void Shutdown();
  104. void ReloadEventDefinitions(); // called by server on new map
  105. bool AddListener( void *listener, CGameEventDescriptor *descriptor, int nListenerType );
  106. CGameEventDescriptor *GetEventDescriptor( const char *name );
  107. CGameEventDescriptor *GetEventDescriptor( IGameEvent *event );
  108. CGameEventDescriptor *GetEventDescriptor( int eventid );
  109. void WriteEventList(SVC_GameEventList *msg);
  110. bool ParseEventList(SVC_GameEventList *msg);
  111. void WriteListenEventList(CLC_ListenEvents *msg);
  112. bool HasClientListenersChanged( bool bReset = true );
  113. void ConPrintEvent( IGameEvent *event);
  114. // legacy support
  115. bool AddListenerAll( void *listener, int nListenerType );
  116. void RemoveListenerOld( void *listener);
  117. protected:
  118. IGameEvent *CreateEvent( CGameEventDescriptor *descriptor );
  119. bool RegisterEvent( KeyValues * keys );
  120. void UnregisterEvent(int index);
  121. bool FireEventIntern( IGameEvent *event, bool bServerSide, bool bClientOnly );
  122. CGameEventCallback* FindEventListener( void* listener );
  123. CUtlVector<CGameEventDescriptor> m_GameEvents; // list of all known events
  124. CUtlVector<CGameEventCallback*> m_Listeners; // list of all registered listeners
  125. CUtlSymbolTable m_EventFiles; // list of all loaded event files
  126. CUtlVector<CUtlSymbol> m_EventFileNames;
  127. bool m_bClientListenersChanged; // true every time client changed listeners
  128. };
  129. extern CGameEventManager &g_GameEventManager;
  130. #endif