Polyphase Game Engine
Loading...
Searching...
No Matches
NetworkManager.h
Go to the documentation of this file.
1#pragma once
2
3#include "EngineTypes.h"
4#include "NetMsg.h"
5#include "NetFunc.h"
6#include "ScriptFunc.h"
7#include "Nodes/Node.h"
8
9#include "Network/Network.h"
11#include "Network/NetPlatform.h"
12#include "Network/NetSession.h"
13
14#include <unordered_map>
15
16// Conflict in WinUser.h
17#ifdef SendMessage
18#undef SendMessage
19#endif
20
21class Node;
22class Script;
23
24bool NetIsClient();
25bool NetIsServer();
26bool NetIsLocal();
27bool NetIsAuthority();
29
30// Network even callbacks
32typedef void(*NetCallbackAcceptFP)();
36
38{
39public:
40
41 static void Create();
42 static void Destroy();
43 static NetworkManager* Get();
44
45 void Initialize();
46 void Shutdown();
47 void PreTickUpdate(float deltaTime);
48 void PostTickUpdate(float deltaTime);
49
50 void Login();
51 void Logout();
52 bool IsLoggedIn() const;
53
54 void OpenSession(const NetSessionOpenOptions& options);
55 void CloseSession();
56 void JoinSession(const NetSession& session);
57 const std::string& GetSessionName() const;
58 void EnableSessionBroadcast(bool enable);
59 bool IsSessionBroadcastEnabled() const;
60
61 void BeginSessionSearch();
62 void EndSessionSearch();
63 void UpdateSearch();
64 bool IsSearching() const;
65 const std::vector<NetSession>& GetSessions() const;
66
67 void SetReplicationInterval(float interval);
68 float GetReplicationInterval() const;
69 void EnableReliableReplication(bool reliable);
71
72 void Connect(const char* ipAddress, uint16_t port = OCT_DEFAULT_PORT);
73 void Connect(uint32_t ipAddress, uint16_t port = OCT_DEFAULT_PORT);
74 void Connect(const NetHost& host);
75 void Disconnect();
76 void Kick(NetHostId hostId, NetMsgKick::Reason reason);
77
78 uint32_t GetMaxClients();
79 const std::vector<NetClient>& GetClients() const;
80
81 void SendMessage(const NetMsg* netMsg, NetHostId receiverId);
82 void SendMessage(const NetMsg* netMsg, NetHostProfile* hostProfile);
83 void SendMessageToAllClients(const NetMsg* netMsg);
84 void SendMessageToAllRelevantClients(const NetMsg* netMsg, NetId nodeNetId);
85 void SendMessageImmediate(const NetHost& host, const NetMsg* netMsg);
86
87 int32_t RecvFrom(char* buffer, uint32_t size, NetHost& outHost);
88 void SendTo(const NetHost& host, const char* buffer, uint32_t size);
89
90 void SendReplicateMsg(NetMsgReplicate& repMsg, uint32_t& numVars, NetHostId hostId);
91 void SendInvokeMsg(NetMsgInvoke& msg, Node* node, NetFunc* func, uint32_t numParams, const Datum** params);
92 void SendInvokeMsg(Node* node, NetFunc* func, uint32_t numParams, const Datum** params);
93 void SendInvokeScriptMsg(Script* script, ScriptNetFunc* func, uint32_t numParams, const Datum** params);
94 void SendSpawnMessage(Node* node, NetClient* client);
95 void SendDestroyMessage(Node* node, NetClient* client);
96
97 void ResendPacket(NetHostProfile* hostProfile, ReliablePacket& packet);
99
100 void FlushSendBuffers();
101
103
104 NetStatus GetNetStatus() const;
105
106 void EnableIncrementalReplication(bool enable);
108
109 void EnableNetRelevancy(bool enable);
110 void SetRelevancyDistance(float dist);
111 float GetRelevancyDistanceSquared() const;
112 void SetPawn(NetHostId id, Node* pawn);
114
115 int32_t GetBytesSent() const;
116 int32_t GetBytesReceived() const;
117 float GetUploadRate() const;
118 float GetDownloadRate() const;
119
120 bool IsServer() const;
121 bool IsClient() const;
122 bool IsLocal() const;
123 bool IsAuthority() const;
124 NetHostId GetHostId() const;
125
126 void AddNetNode(Node* node, NetId netId);
127 void RemoveNetNode(Node* node);
128 const std::unordered_map<NetId, Node*>& GetNetNodeMap() const;
129 Node* GetNetNode(NetId netId);
130
131 // Message Handling
132 void HandleConnect(NetHost host, uint32_t gameCode, uint32_t version);
133 void HandleAccept(NetHostId assignedId);
135 void HandleDisconnect(NetHost host);
136 void HandleKick(NetMsgKick::Reason reason);
137 void HandleAck(NetHost host, uint16_t sequenceNumber);
138 void HandleReady(NetHost host);
139 void HandleBroadcast(
140 NetHost host,
141 uint32_t gameCode,
142 uint32_t version,
143 const char* name,
144 uint8_t maxPlayers,
145 uint8_t numPlayers);
146
147 // Callback Setters
148 void SetConnectCallback(NetCallbackConnectFP cb) { mConnectCallback.mFuncPointer = cb; }
149 void SetAcceptCallback(NetCallbackAcceptFP cb) { mAcceptCallback.mFuncPointer = cb; }
150 void SetRejectCallback(NetCallbackRejectFP cb) { mRejectCallback.mFuncPointer = cb; }
151 void SetDisconnectCallback(NetCallbackDisconnectFP cb) { mDisconnectCallback.mFuncPointer = cb; }
152 void SetKickCallback(NetCallbackKickFP cb) { mKickCallback.mFuncPointer = cb; }
153
154 void SetScriptConnectCallback(const ScriptFunc& func) { mConnectCallback.mScriptFunc = func; }
155 void SetScriptAcceptCallback(const ScriptFunc& func) { mAcceptCallback.mScriptFunc = func; }
156 void SetScriptRejectCallback(const ScriptFunc& func) { mRejectCallback.mScriptFunc = func; }
157 void SetScriptDisconnectCallback(const ScriptFunc& func) { mDisconnectCallback.mScriptFunc = func; }
158 void SetScriptKickCallback(const ScriptFunc& func) { mKickCallback.mScriptFunc = func; }
159
160private:
161
162 static NetworkManager* sInstance;
164
165 void UpdateReplication(float deltaTime);
166 bool ReplicateNode(Node* node, NetId hostId, bool force, bool reliable);
167 void UpdateHostConnections(float deltaTime);
168 void ProcessIncomingPackets(float deltaTime);
169 void ProcessMessages(NetHost sender, Stream& stream);
170 void ProcessPendingReliablePackets(NetHostProfile* profile);
171 NetHostId FindAvailableNetHostId();
172 void ResetToLocalStatus();
173 void BroadcastSession();
174 void FlushSendBuffers(NetHostProfile* hostProfile);
175 void FlushSendBuffer(NetHostProfile* hostProfile, bool reliable);
176 void UpdateReliablePackets(float deltaTime);
177 bool UpdateReliablePackets(NetHostProfile* profile, float deltaTime);
178 void ResetHostProfile(NetHostProfile* profile);
179 bool HostProfileHasIncomingPacket(NetHostProfile* profile, uint16_t seq);
180 bool SeqNumLess(uint16_t s1, uint16_t s2);
181 bool IsNetIdRelevantToHost(NetId netId, NetHostId host);
182 void SetIdRelevantToClient(NetId netId, bool relevant, NetHostId hostId);
183 void UpdateNodeRelevancy(Node* testNode);
184
185 NetStatus mNetStatus = NetStatus::Local;
186 std::vector<NetClient> mClients;
187 std::vector<NetSession> mSessions;
188 std::unordered_map<NetId, Node*> mNetNodeMap;
189 std::vector<Node*> mNetNodes;
190 NetServer mServer;
191 uint32_t mBroadcastIp = 0;
192 uint32_t mMaxClients = 15;
193 uint32_t mReplicationIndex = 0;
194 uint32_t mIncrementalRepIndex = 0;
195 uint32_t mRelevancyUpdateIndex = 0;
196 NetId mNextNetId = 1;
197 float mConnectTimer = 0.0f;
198 float mBroadcastTimer = 0.0f;
199 float mPingTimer = 0.0f;
200 float mConnectTimeout = 5.0f;
201 float mInactiveTimeout = 15.0f;
202 float mUploadRate = 0;
203 float mDownloadRate = 0;
204 float mRelevancyDistanceSquared = (200.0f * 200.0f);
205 float mReplicationInterval = 0.0f;
206 float mReplicationTimer = 0.0f;
207 int32_t mBytesSent = 0;
208 int32_t mBytesReceived = 0;
210 SocketHandle mSocket = NET_INVALID_SOCKET;
211 SocketHandle mSearchSocket = NET_INVALID_SOCKET;
212 NetPlatform* mOnlinePlatform = nullptr;
213 std::string mSessionName;
214 bool mSearching = false;
215 bool mEnableSessionBroadcast = true;
216 bool mInOnlineSession = false;
217 bool mEnableNetRelevancy = false;
218 bool mEnableReliableReplication = false;
219 bool mEnableIncrementalReplication = true;
220
221 ScriptableFP<NetCallbackConnectFP> mConnectCallback;
222 ScriptableFP<NetCallbackAcceptFP> mAcceptCallback;
223 ScriptableFP<NetCallbackRejectFP> mRejectCallback;
224 ScriptableFP<NetCallbackDisconnectFP> mDisconnectCallback;
226};
#define AUTHORITY_HOST_ID
Definition Constants.h:46
uint32_t NetId
Definition EngineTypes.h:65
uint8_t NetHostId
Definition EngineTypes.h:486
NetStatus
Definition EngineTypes.h:477
#define NET_INVALID_SOCKET
Definition NetworkConstants.h:6
#define OCT_DEFAULT_PORT
Definition NetworkConstants.h:8
bool NetIsLocal()
Definition NetworkManager.cpp:132
void(* NetCallbackConnectFP)(NetClient *)
Definition NetworkManager.h:31
bool NetIsAuthority()
Definition NetworkManager.cpp:137
bool NetIsServer()
Definition NetworkManager.cpp:127
bool NetIsClient()
Definition NetworkManager.cpp:122
void(* NetCallbackAcceptFP)()
Definition NetworkManager.h:32
NetHostId NetGetHostId()
Definition NetworkManager.cpp:142
void(* NetCallbackRejectFP)(NetMsgReject::Reason)
Definition NetworkManager.h:33
void(* NetCallbackDisconnectFP)(NetClient *)
Definition NetworkManager.h:34
void(* NetCallbackKickFP)(NetMsgKick::Reason)
Definition NetworkManager.h:35
Definition Datum.h:164
Definition NetPlatform.h:24
Definition NetworkManager.h:38
bool IsReliableReplicationEnabled() const
Definition NetworkManager.cpp:601
void SetConnectCallback(NetCallbackConnectFP cb)
Definition NetworkManager.h:148
NetStatus GetNetStatus() const
Definition NetworkManager.cpp:861
void ResendPacket(NetHostProfile *hostProfile, ReliablePacket &packet)
Definition NetworkManager.cpp:1571
int32_t RecvFrom(char *buffer, uint32_t size, NetHost &outHost)
Definition NetworkManager.cpp:1819
void Login()
Definition NetworkManager.cpp:311
bool IsSessionBroadcastEnabled() const
Definition NetworkManager.cpp:463
Node * GetPawn(NetHostId id)
Definition NetworkManager.cpp:929
bool IsSearching() const
Definition NetworkManager.cpp:560
static void Destroy()
Definition NetworkManager.cpp:153
void RemoveNetNode(Node *node)
Definition NetworkManager.cpp:1052
const std::vector< NetClient > & GetClients() const
Definition NetworkManager.cpp:727
void EnableNetRelevancy(bool enable)
Definition NetworkManager.cpp:881
float GetUploadRate() const
Definition NetworkManager.cpp:962
void SendMessageToAllClients(const NetMsg *netMsg)
Definition NetworkManager.cpp:782
const std::unordered_map< NetId, Node * > & GetNetNodeMap() const
Definition NetworkManager.cpp:1098
void CloseSession()
Definition NetworkManager.cpp:409
static NetworkManager * Get()
Definition NetworkManager.cpp:162
void SendSpawnMessage(Node *node, NetClient *client)
Definition NetworkManager.cpp:1519
const std::string & GetSessionName() const
Definition NetworkManager.cpp:453
void PostTickUpdate(float deltaTime)
Definition NetworkManager.cpp:276
int32_t GetBytesReceived() const
Definition NetworkManager.cpp:957
void HandleReject(NetMsgReject::Reason reason)
Definition NetworkManager.cpp:1231
void SetScriptDisconnectCallback(const ScriptFunc &func)
Definition NetworkManager.h:157
void SetScriptAcceptCallback(const ScriptFunc &func)
Definition NetworkManager.h:155
void SendMessageToAllRelevantClients(const NetMsg *netMsg, NetId nodeNetId)
Definition NetworkManager.cpp:791
const std::vector< NetSession > & GetSessions() const
Definition NetworkManager.cpp:565
void HandleConnect(NetHost host, uint32_t gameCode, uint32_t version)
Definition NetworkManager.cpp:1114
void SendMessageImmediate(const NetHost &host, const NetMsg *netMsg)
Definition NetworkManager.cpp:811
void AddNetNode(Node *node, NetId netId)
Definition NetworkManager.cpp:1000
void SetDisconnectCallback(NetCallbackDisconnectFP cb)
Definition NetworkManager.h:151
void HandleAck(NetHost host, uint16_t sequenceNumber)
Definition NetworkManager.cpp:1307
void SendInvokeMsg(NetMsgInvoke &msg, Node *node, NetFunc *func, uint32_t numParams, const Datum **params)
Definition NetworkManager.cpp:1457
uint32_t GetMaxClients()
Definition NetworkManager.cpp:722
static void Create()
Definition NetworkManager.cpp:147
void JoinSession(const NetSession &session)
Definition NetworkManager.cpp:436
bool IsIncrementalReplicationEnabled() const
Definition NetworkManager.cpp:871
void OpenSession(const NetSessionOpenOptions &options)
Definition NetworkManager.cpp:333
void HandleDisconnect(NetHost host)
Definition NetworkManager.cpp:1250
float GetDownloadRate() const
Definition NetworkManager.cpp:968
void SetScriptKickCallback(const ScriptFunc &func)
Definition NetworkManager.h:158
void SendDestroyMessage(Node *node, NetClient *client)
Definition NetworkManager.cpp:1553
void SetKickCallback(NetCallbackKickFP cb)
Definition NetworkManager.h:152
void SetRelevancyDistance(float dist)
Definition NetworkManager.cpp:876
void SendReplicateMsg(NetMsgReplicate &repMsg, uint32_t &numVars, NetHostId hostId)
Definition NetworkManager.cpp:1431
NetHostId GetHostId() const
Definition NetworkManager.cpp:995
bool IsClient() const
Definition NetworkManager.cpp:979
void HandleKick(NetMsgKick::Reason reason)
Definition NetworkManager.cpp:1288
void ResendOutgoingReliablePackets(NetHostProfile *hostProfile)
Definition NetworkManager.cpp:1582
bool IsAuthority() const
Definition NetworkManager.cpp:989
bool IsLoggedIn() const
Definition NetworkManager.cpp:327
void SetReplicationInterval(float interval)
Definition NetworkManager.cpp:586
void EndSessionSearch()
Definition NetworkManager.cpp:496
float GetRelevancyDistanceSquared() const
Definition NetworkManager.cpp:886
void Disconnect()
Definition NetworkManager.cpp:668
void BeginSessionSearch()
Definition NetworkManager.cpp:468
bool IsServer() const
Definition NetworkManager.cpp:974
void SendInvokeScriptMsg(Script *script, ScriptNetFunc *func, uint32_t numParams, const Datum **params)
Definition NetworkManager.cpp:1512
void SetAcceptCallback(NetCallbackAcceptFP cb)
Definition NetworkManager.h:149
void HandleBroadcast(NetHost host, uint32_t gameCode, uint32_t version, const char *name, uint8_t maxPlayers, uint8_t numPlayers)
Definition NetworkManager.cpp:1376
void FlushSendBuffers()
Definition NetworkManager.cpp:1598
void HandleAccept(NetHostId assignedId)
Definition NetworkManager.cpp:1212
Node * GetNetNode(NetId netId)
Definition NetworkManager.cpp:1103
float GetReplicationInterval() const
Definition NetworkManager.cpp:591
void Initialize()
Definition NetworkManager.cpp:172
void SetRejectCallback(NetCallbackRejectFP cb)
Definition NetworkManager.h:150
void UpdateSearch()
Definition NetworkManager.cpp:512
void EnableSessionBroadcast(bool enable)
Definition NetworkManager.cpp:458
void SetScriptRejectCallback(const ScriptFunc &func)
Definition NetworkManager.h:156
void SetScriptConnectCallback(const ScriptFunc &func)
Definition NetworkManager.h:154
void SendTo(const NetHost &host, const char *buffer, uint32_t size)
Definition NetworkManager.cpp:1835
bool IsLocal() const
Definition NetworkManager.cpp:984
void EnableReliableReplication(bool reliable)
Definition NetworkManager.cpp:596
void SetPawn(NetHostId id, Node *pawn)
Definition NetworkManager.cpp:891
void EnableIncrementalReplication(bool enable)
Definition NetworkManager.cpp:866
void Shutdown()
Definition NetworkManager.cpp:193
int32_t GetBytesSent() const
Definition NetworkManager.cpp:952
void SendMessage(const NetMsg *netMsg, NetHostId receiverId)
Definition NetworkManager.cpp:732
void PreTickUpdate(float deltaTime)
Definition NetworkManager.cpp:213
void Logout()
Definition NetworkManager.cpp:319
void HandleReady(NetHost host)
Definition NetworkManager.cpp:1328
NetClient * FindNetClient(NetHostId id)
Definition NetworkManager.cpp:845
Definition Node.h:67
Definition ScriptFunc.h:10
Definition Script.h:29
Definition Stream.h:21
Definition NetFunc.h:33
Definition EngineTypes.h:508
Definition EngineTypes.h:489
Definition NetMsg.h:149
Reason
Definition NetMsg.h:91
Reason
Definition NetMsg.h:70
Definition NetMsg.h:131
Definition NetMsg.h:42
Definition NetSession.h:18
Definition NetSession.h:7
Definition EngineTypes.h:497
Definition ScriptFunc.h:43
ScriptFunc mScriptFunc
Definition ScriptFunc.h:45
T mFuncPointer
Definition ScriptFunc.h:44