diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /app/legion/networkmanager.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'app/legion/networkmanager.h')
| -rw-r--r-- | app/legion/networkmanager.h | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/app/legion/networkmanager.h b/app/legion/networkmanager.h new file mode 100644 index 0000000..7383587 --- /dev/null +++ b/app/legion/networkmanager.h @@ -0,0 +1,159 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: The main manager of the networking code in the game +// +// $Revision: $ +// $NoKeywords: $ +//===========================================================================// + +#ifndef NETWORKMANAGER_H +#define NETWORKMANAGER_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "gamemanager.h" +#include "networksystem/inetworksystem.h" +#include "inetworkmessagelistener.h" + + +//----------------------------------------------------------------------------- +// Default ports +//----------------------------------------------------------------------------- +enum +{ + LEGION_DEFAULT_SERVER_PORT = 0xFFFF, + LEGION_DEFAULT_CLIENT_PORT = 0xFFFF, +}; + + +//----------------------------------------------------------------------------- +// Interface used to create network messages +//----------------------------------------------------------------------------- +abstract_class INetworkMessageFactory +{ +public: + // Creates the menu + virtual INetworkMessage *CreateNetworkMessage( ) = 0; + + // Used to build a list during construction + virtual INetworkMessageFactory *GetNextFactory( ) = 0; + +protected: + virtual ~INetworkMessageFactory() {} +}; + + +//----------------------------------------------------------------------------- +// Network management system +//----------------------------------------------------------------------------- +class CNetworkManager : public CGameManager<> +{ +public: + // Inherited from IGameManager + virtual bool Init(); + virtual void Update( ); + virtual void Shutdown(); + + // Are we a client?/Are we a server? (we can be both) + bool IsClient(); + bool IsServer(); + + // If we are a client, are we connected to the server? + bool IsClientConnected(); + + // Start a server up + bool StartServer( unsigned short nServerListenPort = LEGION_DEFAULT_SERVER_PORT ); + void ShutdownServer( ); + + // Start a client up + bool StartClient( unsigned short nClientListenPort = LEGION_DEFAULT_CLIENT_PORT ); + void ShutdownClient( ); + + // Connects the client to a server + bool ConnectClientToServer( const char *pServerName, unsigned short nServerListenPort = LEGION_DEFAULT_SERVER_PORT ); + void DisconnectClientFromServer(); + + // Add, remove network message listeners + void AddListener( NetworkMessageRoute_t route, int nGroup, int nType, INetworkMessageListener *pListener ); + void RemoveListener( NetworkMessageRoute_t route, int nGroup, int nType, INetworkMessageListener *hListener ); + + // Post a network message to the server + void PostClientToServerMessage( INetworkMessage *pMessage ); + + // Broadcast a network message to all clients + void BroadcastServerToClientMessage( INetworkMessage *pMessage ); + + // Start up a game where the local player is playing + bool HostGame(); + void StopHostingGame(); + + // Call to register methods which can construct menus w/ particular ids + // NOTE: This method is not expected to be called directly. Use the REGISTER_NETWORK_MESSAGE macro instead + // It returns the previous head of the list of factories + static INetworkMessageFactory* RegisterNetworkMessage( INetworkMessageFactory *pMenuFactory ); + +private: + // Process messages received by the client + void ProcessClientMessages(); + + // Process messages received by the server + void ProcessServerMessages(); + + // Notifies listeners about a network message + void NotifyListeners( NetworkMessageRoute_t route, INetworkMessage *pMessage ); + + bool m_bIsClient; + bool m_bIsServer; + + INetChannel *m_pClientToServerConnection; + CUtlVector< INetChannel* > m_ServerToClientConnection; + CUtlVector< CUtlVector< CUtlVector < INetworkMessageListener* > > > m_Listeners[ NETWORK_MESSAGE_ROUTE_COUNT ]; + static INetworkMessageFactory* m_pFirstFactory; +}; + + +//----------------------------------------------------------------------------- +// Singleton accessor +//----------------------------------------------------------------------------- +extern CNetworkManager *g_pNetworkManager; + + +//----------------------------------------------------------------------------- +// Macro used to register menus with the menu system +// For example, add the line REGISTER_NETWORK_MESSAGE( CNetworkMessageChat ); +// into the file defining the chat message +//----------------------------------------------------------------------------- +template < class T > +class CNetworkMessageFactory : public INetworkMessageFactory +{ +public: + CNetworkMessageFactory( ) + { + m_pNextFactory = CNetworkManager::RegisterNetworkMessage( this ); + } + + // Creates the network message + virtual INetworkMessage *CreateNetworkMessage( ) + { + return new T; + } + + // Used to build a list during construction + virtual INetworkMessageFactory *GetNextFactory( ) + { + return m_pNextFactory; + } + +private: + INetworkMessage *m_pMessage; + INetworkMessageFactory *m_pNextFactory; +}; + +#define REGISTER_NETWORK_MESSAGE( _className ) \ + static CNetworkMessageFactory< _className > __s_Factory ## _className + + +#endif // NETWORKMANAGER_H + |