Skip to content

Commit 94bb07c

Browse files
committed
Simplified ownership states and improved API to reflect that
Previously, objects could be owned by noone, the host client, the server or a client. Now it can be owned by the server (host included) or a client
1 parent 6022645 commit 94bb07c

File tree

10 files changed

+80
-125
lines changed

10 files changed

+80
-125
lines changed

MLAPI/Data/Transports/IUDPTransport.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,9 @@ public interface IUDPTransport
1010
/// </summary>
1111
ChannelType InternalChannel { get; }
1212
/// <summary>
13-
/// The clientId to use when you want to send to the server from client
13+
/// The clientId the transport identifies as the server, should be constant
1414
/// </summary>
15-
uint ServerNetId { get; }
16-
/// <summary>
17-
/// A dummy clientId to represent the host client
18-
/// </summary>
19-
uint HostDummyId { get; }
20-
/// <summary>
21-
/// A invalid clientId to represent a clientId of server
22-
/// </summary>
23-
uint InvalidDummyId { get; }
15+
uint ServerClientId { get; }
2416
/// <summary>
2517
/// Queues a message for sending.
2618
/// </summary>

MLAPI/Data/Transports/UNET/NetId.cs

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,22 @@ public struct NetId
2424
/// <summary>
2525
/// Returns wheter or not the clientId represents a -1
2626
/// </summary>
27-
/// <returns><c>true</c>, if host, <c>false</c> otherwise.</returns>
28-
public bool IsHost()
27+
/// <returns><c>true</c>, if server, <c>false</c> otherwise.</returns>
28+
public bool IsServer()
2929
{
3030
return Meta == 1;
3131
}
3232
/// <summary>
33-
/// Returns if this is a invalid clientId, (-2)
34-
/// </summary>
35-
/// <returns><c>true</c>, if invalid, <c>false</c> otherwise.</returns>
36-
public bool IsInvalid()
37-
{
38-
return Meta == 2;
39-
}
40-
/// <summary>
4133
/// Initializes a new instance of the netId struct from transport values
4234
/// </summary>
4335
/// <param name="hostId">Host identifier.</param>
4436
/// <param name="connectionId">Connection identifier.</param>
45-
/// <param name="isHost">If set to <c>true</c> is host.</param>
46-
/// <param name="isInvalid">If set to <c>true</c> is invalid.</param>
47-
public NetId(byte hostId, ushort connectionId, bool isHost, bool isInvalid)
37+
/// <param name="isServer">If set to <c>true</c> is isServer.</param>
38+
public NetId(byte hostId, ushort connectionId, bool isServer)
4839
{
4940
HostId = hostId;
5041
ConnectionId = connectionId;
51-
if (isHost)
52-
Meta = 1;
53-
else if (isInvalid)
54-
Meta = 2;
55-
else
56-
Meta = 0;
42+
Meta = isServer ? (byte)1 : (byte)0;
5743
}
5844
/// <summary>
5945
/// Initializes a new instance of the netId struct from a clientId
@@ -102,7 +88,7 @@ public override int GetHashCode()
10288
/// <returns>Wheter or not the two NetIds are equal</returns>
10389
public static bool operator ==(NetId client1, NetId client2)
10490
{
105-
return (client1.HostId == client2.HostId && client1.ConnectionId == client2.ConnectionId) || (client1.IsHost() == client2.IsHost());
91+
return (client1.HostId == client2.HostId && client1.ConnectionId == client2.ConnectionId) || (client1.IsServer() == client2.IsServer());
10692
}
10793
/// <summary>
10894
/// Checks if two NetId's are not equal

MLAPI/Data/Transports/UNET/RelayedTransport.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ namespace MLAPI.Data.Transports.UNET
77
class RelayedTransport : IUDPTransport
88
{
99
public ChannelType InternalChannel => ChannelType.ReliableFragmentedSequenced;
10-
public uint HostDummyId => new NetId(0, 0, true, false).GetClientId();
11-
public uint InvalidDummyId => new NetId(0, 0, false, true).GetClientId();
12-
public uint ServerNetId => new NetId((byte)serverHostId, (ushort)serverConnectionId, false, false).GetClientId();
10+
public uint ServerClientId => new NetId(0, 0, true).GetClientId();
1311
public int serverConnectionId;
1412
public int serverHostId;
1513

@@ -33,7 +31,7 @@ public int Connect(string address, int port, object settings, bool websocket, ou
3331
public void DisconnectClient(uint clientId)
3432
{
3533
NetId netId = new NetId(clientId);
36-
if (netId.IsHost() || netId.IsInvalid())
34+
if (netId.IsServer())
3735
return;
3836
RelayTransport.Disconnect(netId.HostId, netId.ConnectionId, out byte error);
3937
}
@@ -43,6 +41,11 @@ public void DisconnectClient(uint clientId)
4341
public int GetCurrentRTT(uint clientId, out byte error)
4442
{
4543
NetId netId = new NetId(clientId);
44+
if (netId.IsServer())
45+
{
46+
netId.ConnectionId = (ushort)serverConnectionId;
47+
netId.HostId = (byte)serverHostId;
48+
}
4649
return NetworkTransport.GetCurrentRTT(netId.HostId, netId.ConnectionId, out error);
4750
}
4851

@@ -51,13 +54,18 @@ public int GetCurrentRTT(uint clientId, out byte error)
5154
public int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error)
5255
{
5356
NetId netId = new NetId(clientId);
57+
if (netId.IsServer())
58+
{
59+
netId.ConnectionId = (ushort)serverConnectionId;
60+
netId.HostId = (byte)serverHostId;
61+
}
5462
return NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteTimestamp, out error);
5563
}
5664

5765
public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error)
5866
{
5967
NetworkEventType eventType = RelayTransport.Receive(out int hostId, out int connectionId, out channelId, data, bufferSize, out receivedSize, out byte err);
60-
clientId = new NetId((byte)hostId, (ushort)connectionId, false, false).GetClientId();
68+
clientId = new NetId((byte)hostId, (ushort)connectionId, false).GetClientId();
6169
NetworkError errorType = (NetworkError)err;
6270
if (errorType == NetworkError.Timeout)
6371
eventType = NetworkEventType.DisconnectEvent; //In UNET. Timeouts are not disconnects. We have to translate that here.
@@ -83,10 +91,10 @@ public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[]
8391
public void QueueMessageForSending(uint clientId, byte[] dataBuffer, int dataSize, int channelId, bool skipqueue, out byte error)
8492
{
8593
NetId netId = new NetId(clientId);
86-
if (netId.IsHost() || netId.IsInvalid())
94+
if (netId.IsServer())
8795
{
88-
error = 0;
89-
return;
96+
netId.ConnectionId = (ushort)serverConnectionId;
97+
netId.HostId = (byte)serverHostId;
9098
}
9199
if (skipqueue)
92100
RelayTransport.Send(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
@@ -99,6 +107,11 @@ public void QueueMessageForSending(uint clientId, byte[] dataBuffer, int dataSiz
99107
public void SendQueue(uint clientId, out byte error)
100108
{
101109
NetId netId = new NetId(clientId);
110+
if (netId.IsServer())
111+
{
112+
netId.ConnectionId = (ushort)serverConnectionId;
113+
netId.HostId = (byte)serverHostId;
114+
}
102115
RelayTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
103116
}
104117

MLAPI/Data/Transports/UNET/UnetTransport.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ namespace MLAPI.Data.Transports.UNET
1010
public class UnetTransport : IUDPTransport
1111
{
1212
public ChannelType InternalChannel => ChannelType.ReliableFragmentedSequenced;
13-
public uint HostDummyId => new NetId(0, 0, true, false).GetClientId();
14-
public uint InvalidDummyId => new NetId(0, 0, false, true).GetClientId();
15-
public uint ServerNetId => new NetId((byte)serverHostId, (ushort)serverConnectionId, false, false).GetClientId();
13+
public uint ServerClientId => new NetId(0, 0, true).GetClientId();
1614
public int serverConnectionId;
1715
public int serverHostId;
1816
public static readonly List<TransportHost> ServerTransports = new List<TransportHost>()
@@ -35,7 +33,7 @@ public int Connect(string address, int port, object settings, bool websocket, ou
3533
public void DisconnectClient(uint clientId)
3634
{
3735
NetId netId = new NetId(clientId);
38-
if (netId.IsHost() || netId.IsInvalid())
36+
if (netId.IsServer())
3937
return;
4038
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out byte error);
4139
}
@@ -45,6 +43,11 @@ public void DisconnectClient(uint clientId)
4543
public int GetCurrentRTT(uint clientId, out byte error)
4644
{
4745
NetId netId = new NetId(clientId);
46+
if (netId.IsServer())
47+
{
48+
netId.ConnectionId = (ushort)serverConnectionId;
49+
netId.HostId = (byte)serverHostId;
50+
}
4851
return NetworkTransport.GetCurrentRTT(netId.HostId, netId.ConnectionId, out error);
4952
}
5053

@@ -53,13 +56,18 @@ public int GetCurrentRTT(uint clientId, out byte error)
5356
public int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error)
5457
{
5558
NetId netId = new NetId(clientId);
59+
if (netId.IsServer())
60+
{
61+
netId.ConnectionId = (ushort)serverConnectionId;
62+
netId.HostId = (byte)serverHostId;
63+
}
5664
return NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteTimestamp, out error);
5765
}
5866

5967
public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error)
6068
{
6169
NetworkEventType eventType = NetworkTransport.Receive(out int hostId, out int connectionId, out channelId, data, bufferSize, out receivedSize, out byte err);
62-
clientId = new NetId((byte)hostId, (ushort)connectionId, false, false).GetClientId();
70+
clientId = new NetId((byte)hostId, (ushort)connectionId, false).GetClientId();
6371
NetworkError errorType = (NetworkError)err;
6472
if (errorType == NetworkError.Timeout)
6573
eventType = NetworkEventType.DisconnectEvent; //In UNET. Timeouts are not disconnects. We have to translate that here.
@@ -85,11 +93,12 @@ public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[]
8593
public void QueueMessageForSending(uint clientId, byte[] dataBuffer, int dataSize, int channelId, bool skipqueue, out byte error)
8694
{
8795
NetId netId = new NetId(clientId);
88-
if (netId.IsHost() || netId.IsInvalid())
96+
if (netId.IsServer())
8997
{
90-
error = 0;
91-
return;
98+
netId.ConnectionId = (ushort)serverConnectionId;
99+
netId.HostId = (byte)serverHostId;
92100
}
101+
93102
if (skipqueue)
94103
NetworkTransport.Send(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
95104
else
@@ -101,6 +110,11 @@ public void QueueMessageForSending(uint clientId, byte[] dataBuffer, int dataSiz
101110
public void SendQueue(uint clientId, out byte error)
102111
{
103112
NetId netId = new NetId(clientId);
113+
if (netId.IsServer())
114+
{
115+
netId.ConnectionId = (ushort)serverConnectionId;
116+
netId.HostId = (byte)serverHostId;
117+
}
104118
NetworkTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
105119
}
106120

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ public abstract class NetworkedBehaviour : MonoBehaviour
2525
/// </summary>
2626
public bool isOwner => networkedObject.isOwner;
2727
/// <summary>
28-
/// Gets if the object is owned by the local player and this is not a player object
29-
/// </summary>
30-
public bool isObjectOwner => networkedObject.isObjectOwner;
31-
/// <summary>
3228
/// Gets if we are executing as server
3329
/// </summary>
3430
protected bool isServer => NetworkingManager.singleton.isServer;
@@ -43,7 +39,7 @@ public abstract class NetworkedBehaviour : MonoBehaviour
4339
/// <summary>
4440
/// Gets wheter or not the object has a owner
4541
/// </summary>
46-
public bool hasOwner => networkedObject.hasOwner;
42+
public bool isOwnedByServer => networkedObject.isOwnedByServer;
4743

4844
/// <summary>
4945
/// Gets the NetworkedObject that owns this NetworkedBehaviour instance
@@ -297,7 +293,7 @@ internal void NetworkedVarUpdate()
297293
if (isServer)
298294
InternalMessageHandler.Send(clientId, "MLAPI_NETWORKED_VAR_DELTA", channelsForVarGroups[j], stream);
299295
else
300-
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, "MLAPI_NETWORKED_VAR_DELTA", channelsForVarGroups[j], stream);
296+
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerClientId, "MLAPI_NETWORKED_VAR_DELTA", channelsForVarGroups[j], stream);
301297
}
302298
}
303299
}
@@ -575,7 +571,7 @@ internal void SendServerRPCPerformance(ulong hash, Stream messageStream)
575571
InvokeServerRPCLocal(hash, NetworkingManager.singleton.LocalClientId, messageStream);
576572
}
577573

578-
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, "MLAPI_SERVER_RPC", "MLAPI_DEFAULT_MESSAGE", stream);
574+
InternalMessageHandler.Send(NetworkingManager.singleton.ServerClientId, "MLAPI_SERVER_RPC", "MLAPI_DEFAULT_MESSAGE", stream);
579575
}
580576
}
581577

MLAPI/MonoBehaviours/Core/NetworkedObject.cs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ public uint OwnerClientId
3636
get
3737
{
3838
if (_ownerClientId == null)
39-
return NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId;
39+
return NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerClientId;
4040
else
4141
return _ownerClientId.Value;
4242
}
4343
internal set
4444
{
45-
if (value == NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId)
45+
if (value == NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerClientId)
4646
_ownerClientId = null;
4747
else
4848
_ownerClientId = value;
@@ -68,19 +68,15 @@ internal set
6868
/// <summary>
6969
/// Gets if the object is the the personal clients player object
7070
/// </summary>
71-
public bool isLocalPlayer => isPlayerObject && (OwnerClientId == NetworkingManager.singleton.LocalClientId || (OwnerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId && NetworkingManager.singleton.isHost));
72-
/// <summary>
73-
/// Gets if the object is owned by the local player or if the object is the local player object
74-
/// </summary>
75-
public bool isOwner => isLocalPlayer || isObjectOwner;
76-
/// <summary>
77-
/// Gets if the object is owned by the local player and this is not a player object
78-
/// </summary>
79-
public bool isObjectOwner => !isPlayerObject && (OwnerClientId == NetworkingManager.singleton.LocalClientId || (OwnerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId && NetworkingManager.singleton.isHost));
71+
public bool isLocalPlayer => isPlayerObject && OwnerClientId == NetworkingManager.singleton.LocalClientId;
72+
/// <summary>
73+
/// Gets if the object is owned by the local player or if the object is the local player object
74+
/// </summary>
75+
public bool isOwner => OwnerClientId == NetworkingManager.singleton.LocalClientId;
8076
/// <summary>
8177
/// Gets wheter or not the object is owned by anyone
8278
/// </summary>
83-
public bool hasOwner => OwnerClientId != NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId;
79+
public bool isOwnedByServer => OwnerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerClientId;
8480
/// <summary>
8581
/// Gets if the object has yet been spawned across the network
8682
/// </summary>

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,16 @@ public class NetworkingManager : MonoBehaviour
4848
/// <summary>
4949
/// Gets the networkId of the server
5050
/// </summary>
51-
public uint ServerNetId => NetworkConfig.NetworkTransport.ServerNetId;
51+
public uint ServerClientId => NetworkConfig.NetworkTransport.ServerClientId;
5252
/// <summary>
5353
/// The clientId the server calls the local client by, only valid for clients
5454
/// </summary>
5555
public uint LocalClientId
5656
{
5757
get
5858
{
59-
if (isHost)
60-
return NetworkConfig.NetworkTransport.HostDummyId;
61-
if (isServer)
62-
return NetworkConfig.NetworkTransport.InvalidDummyId;
63-
64-
return localClientId;
59+
if (isServer) return NetworkConfig.NetworkTransport.ServerClientId;
60+
else return localClientId;
6561
}
6662
internal set
6763
{
@@ -508,8 +504,7 @@ public void StopServer()
508504
if(!disconnectedIds.Contains(pair.Key))
509505
{
510506
disconnectedIds.Add(pair.Key);
511-
if (pair.Key == NetworkConfig.NetworkTransport.HostDummyId ||
512-
pair.Key == NetworkConfig.NetworkTransport.InvalidDummyId)
507+
if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId)
513508
continue;
514509

515510
NetworkConfig.NetworkTransport.DisconnectClient(pair.Key);
@@ -520,9 +515,9 @@ public void StopServer()
520515
if (!disconnectedIds.Contains(clientId))
521516
{
522517
disconnectedIds.Add(clientId);
523-
if (clientId == NetworkConfig.NetworkTransport.HostDummyId ||
524-
clientId == NetworkConfig.NetworkTransport.InvalidDummyId)
518+
if (clientId == NetworkConfig.NetworkTransport.ServerClientId)
525519
continue;
520+
526521
NetworkConfig.NetworkTransport.DisconnectClient(clientId);
527522
}
528523
}
@@ -580,7 +575,7 @@ public void StartHost(Vector3? pos = null, Quaternion? rot = null, int prefabId
580575
isClient = true;
581576
isListening = true;
582577

583-
uint hostClientId = NetworkConfig.NetworkTransport.HostDummyId;
578+
uint hostClientId = NetworkConfig.NetworkTransport.ServerClientId;
584579
ConnectedClients.Add(hostClientId, new NetworkedClient()
585580
{
586581
ClientId = hostClientId

MLAPI/MonoBehaviours/Prototyping/NetworkedTransform.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,9 @@ public override void NetworkStart()
107107

108108
private void Update()
109109
{
110-
if(isOwner || isLocalPlayer || (OwnerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId && isServer))
110+
if (isOwner)
111111
{
112-
//We own the object OR we are server and the object is not owned by anyone OR we are the object.
113-
if(NetworkingManager.singleton.NetworkTime - lastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
112+
if (NetworkingManager.singleton.NetworkTime - lastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
114113
{
115114
lastSendTime = NetworkingManager.singleton.NetworkTime;
116115
lastSentPos = transform.position;
@@ -137,7 +136,7 @@ private void Update()
137136
else
138137
{
139138
//If we are server and interpolation is turned on for server OR we are not server and interpolation is turned on
140-
if((isServer && InterpolateServer && InterpolatePosition) || (!isServer && InterpolatePosition))
139+
if ((isServer && InterpolateServer && InterpolatePosition) || (!isServer && InterpolatePosition))
141140
{
142141
if(Vector3.Distance(transform.position, lerpEndPos) > SnapDistance)
143142
{

0 commit comments

Comments
 (0)