diff --git a/Source/Engine/Networking/NetworkClient.cs b/Source/Engine/Networking/NetworkClient.cs
index dd995198a..068716265 100644
--- a/Source/Engine/Networking/NetworkClient.cs
+++ b/Source/Engine/Networking/NetworkClient.cs
@@ -7,7 +7,7 @@ namespace FlaxEngine.Networking
///
public override string ToString()
{
- return $"NetworkClient Id={Connection.ConnectionId}";
+ return $"NetworkClient Id={ClientId}, ConnectionId={Connection.ConnectionId}";
}
}
}
diff --git a/Source/Engine/Networking/NetworkClient.h b/Source/Engine/Networking/NetworkClient.h
index 5def89c6f..075bd0533 100644
--- a/Source/Engine/Networking/NetworkClient.h
+++ b/Source/Engine/Networking/NetworkClient.h
@@ -14,11 +14,16 @@ API_CLASS(sealed, NoSpawn, Namespace = "FlaxEngine.Networking") class FLAXENGINE
{
DECLARE_SCRIPTING_TYPE_NO_SPAWN(NetworkClient);
friend class NetworkManager;
- explicit NetworkClient(NetworkConnection connection);
+ explicit NetworkClient(uint32 id, NetworkConnection connection);
public:
///
- /// Identifier of the client (connection id from local peer).
+ /// Unique client identifier.
+ ///
+ API_FIELD(ReadOnly) uint32 ClientId;
+
+ ///
+ /// Local peer connection.
///
API_FIELD(ReadOnly) NetworkConnection Connection;
@@ -30,6 +35,6 @@ public:
public:
String ToString() const override
{
- return String::Format(TEXT("NetworkClient Id={0}"), Connection.ConnectionId);
+ return String::Format(TEXT("NetworkClient Id={0}, ConnectionId={1}"), ClientId, Connection.ConnectionId);
}
};
diff --git a/Source/Engine/Networking/NetworkManager.cpp b/Source/Engine/Networking/NetworkManager.cpp
index 18dbb07e5..be8b37063 100644
--- a/Source/Engine/Networking/NetworkManager.cpp
+++ b/Source/Engine/Networking/NetworkManager.cpp
@@ -32,6 +32,7 @@ Delegate NetworkManager::ClientDisconnected;
namespace
{
uint32 GameProtocolVersion = 0;
+ uint32 NextClientId = 0;
double LastUpdateTime = 0;
}
@@ -49,6 +50,7 @@ PACK_STRUCT(struct NetworkMessageHandshake
PACK_STRUCT(struct NetworkMessageHandshakeReply
{
NetworkMessageIDs ID;
+ uint32 ClientId;
int32 Result;
});
@@ -75,6 +77,7 @@ void OnNetworkMessageHandshake(NetworkEvent& event, NetworkClient* client, Netwo
NetworkMessageHandshakeReply replyData;
replyData.ID = NetworkMessageIDs::HandshakeReply;
replyData.Result = connectionData.Result;
+ replyData.ClientId = client->ClientId;
NetworkMessage msgReply = peer->BeginSendMessage();
msgReply.WriteStructure(replyData);
peer->EndSendMessage(NetworkChannelType::ReliableOrdered, msgReply, event.Sender);
@@ -109,6 +112,7 @@ void OnNetworkMessageHandshakeReply(NetworkEvent& event, NetworkClient* client,
}
// Client got connected with server
+ NetworkManager::LocalClient->ClientId = msgData.ClientId;
NetworkManager::LocalClient->State = NetworkConnectionState::Connected;
NetworkManager::State = NetworkConnectionState::Connected;
NetworkManager::StateChanged();
@@ -204,8 +208,9 @@ void NetworkSettings::Apply()
GameProtocolVersion = ProtocolVersion;
}
-NetworkClient::NetworkClient(NetworkConnection connection)
+NetworkClient::NetworkClient(uint32 id, NetworkConnection connection)
: ScriptingObject(SpawnParams(Guid::New(), TypeInitializer))
+ , ClientId(id)
, Connection(connection)
, State(NetworkConnectionState::Connecting)
{
@@ -233,6 +238,7 @@ bool NetworkManager::StartServer()
return true;
if (!Peer->Listen())
return true;
+ NextClientId++;
State = NetworkConnectionState::Connected;
StateChanged();
@@ -249,7 +255,7 @@ bool NetworkManager::StartClient()
return true;
if (!Peer->Connect())
return true;
- LocalClient = New(NetworkConnection{ 0 });
+ LocalClient = New(0, NetworkConnection{ 0 });
return false;
}
@@ -264,7 +270,7 @@ bool NetworkManager::StartHost()
return true;
if (!Peer->Listen())
return true;
- LocalClient = New(NetworkConnection{ 0 });
+ LocalClient = New(NextClientId++, NetworkConnection{ 0 });
// Auto-connect host
LocalClient->State = NetworkConnectionState::Connected;
@@ -364,7 +370,7 @@ void NetworkManagerService::Update()
else
{
// Create incoming client
- auto client = New(event.Sender);
+ auto client = New(NextClientId++, event.Sender);
NetworkManager::Clients.Add(client);
}
break;