160 lines
4.8 KiB
C
160 lines
4.8 KiB
C
|
//========= 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
|
||
|
|