mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user