Skip to content

Commit c037fe9

Browse files
committed
Merge branch 'master' into prototype-components
2 parents 0fbd9f9 + b22642f commit c037fe9

File tree

3 files changed

+164
-31
lines changed

3 files changed

+164
-31
lines changed

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ public int ownerClientId
6868

6969
protected int RegisterMessageHandler(string name, Action<int, byte[]> action)
7070
{
71-
int counter = MessageManager.AddIncomingMessageHandler(name, action);
71+
int counter = MessageManager.AddIncomingMessageHandler(name, action, networkId);
7272
registeredMessageHandlers.Add(name, counter);
7373
return counter;
7474
}
7575

7676
protected void DeregisterMessageHandler(string name, int counter)
7777
{
78-
MessageManager.RemoveIncomingMessageHandler(name, counter);
78+
MessageManager.RemoveIncomingMessageHandler(name, counter, networkId);
7979
}
8080

8181
private void OnDestroy()
@@ -98,6 +98,18 @@ protected void SendToServer(string messageType, string channelName, byte[] data)
9898
}
9999
}
100100

101+
protected void SendToServerTarget(string messageType, string channelName, byte[] data)
102+
{
103+
if (isServer)
104+
{
105+
MessageManager.InvokeTargetedMessageHandler(messageType, data, -1, networkId);
106+
}
107+
else
108+
{
109+
NetworkingManager.singleton.Send(NetworkingManager.singleton.serverClientId, messageType, channelName, data, networkId);
110+
}
111+
}
112+
101113
protected void SendToLocalClient(string messageType, string channelName, byte[] data)
102114
{
103115
if (!isServer)
@@ -108,6 +120,16 @@ protected void SendToLocalClient(string messageType, string channelName, byte[]
108120
NetworkingManager.singleton.Send(ownerClientId, messageType, channelName, data);
109121
}
110122

123+
protected void SendToLocalClientTarget(string messageType, string channelName, byte[] data)
124+
{
125+
if (!isServer)
126+
{
127+
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
128+
return;
129+
}
130+
NetworkingManager.singleton.Send(ownerClientId, messageType, channelName, data, networkId);
131+
}
132+
111133
protected void SendToNonLocalClients(string messageType, string channelName, byte[] data)
112134
{
113135
if (!isServer)
@@ -118,6 +140,16 @@ protected void SendToNonLocalClients(string messageType, string channelName, byt
118140
NetworkingManager.singleton.Send(messageType, channelName, data, ownerClientId);
119141
}
120142

143+
protected void SendToNonLocalClientsTarget(string messageType, string channelName, byte[] data)
144+
{
145+
if (!isServer)
146+
{
147+
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
148+
return;
149+
}
150+
NetworkingManager.singleton.Send(messageType, channelName, data, ownerClientId, networkId);
151+
}
152+
121153
protected void SendToClient(int clientId, string messageType, string channelName, byte[] data)
122154
{
123155
if (!isServer)
@@ -128,6 +160,16 @@ protected void SendToClient(int clientId, string messageType, string channelName
128160
NetworkingManager.singleton.Send(clientId, messageType, channelName, data);
129161
}
130162

163+
protected void SendToClientTarget(int clientId, string messageType, string channelName, byte[] data)
164+
{
165+
if (!isServer)
166+
{
167+
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
168+
return;
169+
}
170+
NetworkingManager.singleton.Send(clientId, messageType, channelName, data, networkId);
171+
}
172+
131173
protected void SendToClients(int[] clientIds, string messageType, string channelName, byte[] data)
132174
{
133175
if (!isServer)
@@ -138,6 +180,16 @@ protected void SendToClients(int[] clientIds, string messageType, string channel
138180
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data);
139181
}
140182

183+
protected void SendToClientsTarget(int[] clientIds, string messageType, string channelName, byte[] data)
184+
{
185+
if (!isServer)
186+
{
187+
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
188+
return;
189+
}
190+
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data, networkId);
191+
}
192+
141193
protected void SendToClients(List<int> clientIds, string messageType, string channelName, byte[] data)
142194
{
143195
if (!isServer)
@@ -148,6 +200,16 @@ protected void SendToClients(List<int> clientIds, string messageType, string cha
148200
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data);
149201
}
150202

203+
protected void SendToClientsTarget(List<int> clientIds, string messageType, string channelName, byte[] data)
204+
{
205+
if (!isServer)
206+
{
207+
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
208+
return;
209+
}
210+
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data, networkId);
211+
}
212+
151213
protected void SendToClients(string messageType, string channelName, byte[] data)
152214
{
153215
if (!isServer)
@@ -158,6 +220,16 @@ protected void SendToClients(string messageType, string channelName, byte[] data
158220
NetworkingManager.singleton.Send(messageType, channelName, data);
159221
}
160222

223+
protected void SendToClientsTarget(string messageType, string channelName, byte[] data)
224+
{
225+
if (!isServer)
226+
{
227+
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
228+
return;
229+
}
230+
NetworkingManager.singleton.Send(messageType, channelName, data, networkId);
231+
}
232+
161233
protected NetworkedObject GetNetworkedObject(uint networkId)
162234
{
163235
return SpawnManager.spawnedObjects[networkId];

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
6666
MessageManager.messageCallbacks = new Dictionary<ushort, Dictionary<int, Action<int, byte[]>>>();
6767
MessageManager.messageHandlerCounter = new Dictionary<ushort, int>();
6868
MessageManager.releasedMessageHandlerCounters = new Dictionary<ushort, Stack<int>>();
69+
MessageManager.targetedMessages = new Dictionary<ushort, Dictionary<uint, List<int>>>();
6970
SpawnManager.spawnedObjects = new Dictionary<uint, NetworkedObject>();
7071
SpawnManager.releasedNetworkObjectIds = new Stack<uint>();
7172
if (NetworkConfig.HandleObjectSpawning)
@@ -321,6 +322,10 @@ private void HandleIncomingData(int connectonId, byte[] data)
321322
using (BinaryReader reader = new BinaryReader(readStream))
322323
{
323324
ushort messageType = reader.ReadUInt16();
325+
bool targeted = reader.ReadBoolean();
326+
uint targetNetworkId = 0;
327+
if(targeted)
328+
targetNetworkId = reader.ReadUInt32();
324329

325330
//Client tried to send a network message that was not the connection request before he was accepted.
326331
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
@@ -334,10 +339,22 @@ private void HandleIncomingData(int connectonId, byte[] data)
334339
if (messageType >= 32)
335340
{
336341
//Custom message, invoke all message handlers
337-
foreach (KeyValuePair<int, Action<int, byte[]>> pair in MessageManager.messageCallbacks[messageType])
342+
if(targeted)
338343
{
339-
pair.Value(clientId, incommingData);
340-
}
344+
List<int> handlerIds = MessageManager.targetedMessages[messageType][targetNetworkId];
345+
Debug.Log(handlerIds.Count);
346+
for (int i = 0; i < handlerIds.Count; i++)
347+
{
348+
MessageManager.messageCallbacks[messageType][handlerIds[i]](clientId, incommingData);
349+
}
350+
}
351+
else
352+
{
353+
foreach (KeyValuePair<int, Action<int, byte[]>> pair in MessageManager.messageCallbacks[messageType])
354+
{
355+
pair.Value(clientId, incommingData);
356+
}
357+
}
341358
}
342359
else
343360
{
@@ -480,12 +497,15 @@ private void HandleIncomingData(int connectonId, byte[] data)
480497
}
481498
}
482499

483-
internal void Send(int clientId, string messageType, string channelName, byte[] data)
500+
internal void Send(int clientId, string messageType, string channelName, byte[] data, uint? networkId = null)
484501
{
485502
if(isHost && clientId == -1)
486503
{
487504
//Host trying to send data to it's own client
488-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
505+
if (networkId == null)
506+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
507+
else
508+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
489509
return;
490510
}
491511
else if(clientId == -1)
@@ -498,125 +518,139 @@ internal void Send(int clientId, string messageType, string channelName, byte[]
498518
using (BinaryWriter writer = new BinaryWriter(stream))
499519
{
500520
writer.Write(MessageManager.messageTypes[messageType]);
521+
writer.Write(networkId != null);
522+
if (networkId != null)
523+
writer.Write(networkId.Value);
501524
writer.Write((ushort)data.Length);
502525
writer.Write(data);
503526
}
504-
//2 bytes for message type and 2 bytes for byte length
505-
int size = data.Length + 4;
506527
byte[] dataToSend = stream.ToArray();
507528
NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], dataToSend, dataToSend.Length, out error);
508529
}
509530
}
510531

511-
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data)
532+
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
512533
{
513534
using (MemoryStream stream = new MemoryStream())
514535
{
515536
using (BinaryWriter writer = new BinaryWriter(stream))
516537
{
517538
writer.Write(MessageManager.messageTypes[messageType]);
539+
writer.Write(networkId != null);
540+
if (networkId != null)
541+
writer.Write(networkId.Value);
518542
writer.Write((ushort)data.Length);
519543
writer.Write(data);
520544
}
521-
//2 bytes for message type and 2 bytes for byte length
522-
int size = data.Length + 4;
523545
byte[] dataToSend = stream.ToArray();
524546
int channel = MessageManager.channels[channelName];
525547
for (int i = 0; i < clientIds.Length; i++)
526548
{
527549
int clientId = clientIds[i];
528550
if (isHost && clientId == -1)
529551
{
530-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
552+
if (networkId == null)
553+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
554+
else
555+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
531556
continue;
532557
}
533558
else if (clientId == -1)
534559
{
535560
//Client trying to send data to host
536561
clientId = serverClientId;
537562
}
538-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
563+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
539564
}
540565
}
541566
}
542567

543-
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data)
568+
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
544569
{
545570
using (MemoryStream stream = new MemoryStream())
546571
{
547572
using (BinaryWriter writer = new BinaryWriter(stream))
548573
{
549574
writer.Write(MessageManager.messageTypes[messageType]);
575+
writer.Write(networkId != null);
576+
if (networkId != null)
577+
writer.Write(networkId.Value);
550578
writer.Write((ushort)data.Length);
551579
writer.Write(data);
552580
}
553-
//2 bytes for message type and 2 bytes for byte length
554-
int size = data.Length + 4;
555581
byte[] dataToSend = stream.ToArray();
556582
int channel = MessageManager.channels[channelName];
557583
for (int i = 0; i < clientIds.Count; i++)
558584
{
559585
int clientId = clientIds[i];
560586
if (isHost && clientId == -1)
561587
{
562-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
588+
if (networkId == null)
589+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
590+
else
591+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
563592
continue;
564593
}
565594
else if (clientId == -1)
566595
{
567596
//Client trying to send data to host
568597
clientId = serverClientId;
569598
}
570-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
599+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
571600
}
572601
}
573602
}
574603

575-
internal void Send(string messageType, string channelName, byte[] data)
604+
internal void Send(string messageType, string channelName, byte[] data, uint? networkId = null)
576605
{
577606
using (MemoryStream stream = new MemoryStream())
578607
{
579608
using (BinaryWriter writer = new BinaryWriter(stream))
580609
{
581610
writer.Write(MessageManager.messageTypes[messageType]);
611+
writer.Write(networkId != null);
612+
if (networkId != null)
613+
writer.Write(networkId.Value);
582614
writer.Write((ushort)data.Length);
583615
writer.Write(data);
584616
}
585-
//2 bytes for message type and 2 bytes for byte length
586-
int size = data.Length + 4;
587617
byte[] dataToSend = stream.ToArray();
588618
int channel = MessageManager.channels[channelName];
589619
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
590620
{
591621
int clientId = pair.Key;
592622
if(isHost && pair.Key == -1)
593623
{
594-
MessageManager.InvokeMessageHandlers(messageType, data, pair.Key);
624+
if (networkId == null)
625+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
626+
else
627+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
595628
continue;
596629
}
597630
else if (clientId == -1)
598631
{
599632
//Client trying to send data to host
600633
clientId = serverClientId;
601634
}
602-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
635+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
603636

604637
}
605638
}
606639
}
607640

608-
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore)
641+
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore, uint? networkId = null)
609642
{
610643
using (MemoryStream stream = new MemoryStream())
611644
{
612645
using (BinaryWriter writer = new BinaryWriter(stream))
613646
{
614647
writer.Write(MessageManager.messageTypes[messageType]);
648+
writer.Write(networkId != null);
649+
if (networkId != null)
650+
writer.Write(networkId.Value);
615651
writer.Write((ushort)data.Length);
616652
writer.Write(data);
617653
}
618-
//2 bytes for message type and 2 bytes for byte length
619-
int size = data.Length + 4;
620654
byte[] dataToSend = stream.ToArray();
621655
int channel = MessageManager.channels[channelName];
622656
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
@@ -626,15 +660,18 @@ internal void Send(string messageType, string channelName, byte[] data, int clie
626660
int clientId = pair.Key;
627661
if (isHost && pair.Key == -1)
628662
{
629-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
663+
if (networkId == null)
664+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
665+
else
666+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
630667
continue;
631668
}
632669
else if (clientId == -1)
633670
{
634671
//Client trying to send data to host
635672
clientId = serverClientId;
636673
}
637-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
674+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
638675
}
639676
}
640677
}

0 commit comments

Comments
 (0)