forked from XutaxKamay/css_enhanced
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnetworkmanager.h
159 lines (122 loc) · 4.81 KB
/
networkmanager.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//========= 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