Skip to content

Commit dc8adf0

Browse files
committed
Added targeted object targeted messages
1 parent 3dfc999 commit dc8adf0

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)
@@ -319,6 +320,10 @@ private void HandleIncomingData(int connectonId, byte[] data)
319320
using (BinaryReader reader = new BinaryReader(readStream))
320321
{
321322
ushort messageType = reader.ReadUInt16();
323+
bool targeted = reader.ReadBoolean();
324+
uint targetNetworkId = 0;
325+
if(targeted)
326+
targetNetworkId = reader.ReadUInt32();
322327

323328
//Client tried to send a network message that was not the connection request before he was accepted.
324329
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
@@ -332,10 +337,22 @@ private void HandleIncomingData(int connectonId, byte[] data)
332337
if (messageType >= 32)
333338
{
334339
//Custom message, invoke all message handlers
335-
foreach (KeyValuePair<int, Action<int, byte[]>> pair in MessageManager.messageCallbacks[messageType])
340+
if(targeted)
336341
{
337-
pair.Value(clientId, incommingData);
338-
}
342+
List<int> handlerIds = MessageManager.targetedMessages[messageType][targetNetworkId];
343+
Debug.Log(handlerIds.Count);
344+
for (int i = 0; i < handlerIds.Count; i++)
345+
{
346+
MessageManager.messageCallbacks[messageType][handlerIds[i]](clientId, incommingData);
347+
}
348+
}
349+
else
350+
{
351+
foreach (KeyValuePair<int, Action<int, byte[]>> pair in MessageManager.messageCallbacks[messageType])
352+
{
353+
pair.Value(clientId, incommingData);
354+
}
355+
}
339356
}
340357
else
341358
{
@@ -478,12 +495,15 @@ private void HandleIncomingData(int connectonId, byte[] data)
478495
}
479496
}
480497

481-
internal void Send(int clientId, string messageType, string channelName, byte[] data)
498+
internal void Send(int clientId, string messageType, string channelName, byte[] data, uint? networkId = null)
482499
{
483500
if(isHost && clientId == -1)
484501
{
485502
//Host trying to send data to it's own client
486-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
503+
if (networkId == null)
504+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
505+
else
506+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
487507
return;
488508
}
489509
else if(clientId == -1)
@@ -496,125 +516,139 @@ internal void Send(int clientId, string messageType, string channelName, byte[]
496516
using (BinaryWriter writer = new BinaryWriter(stream))
497517
{
498518
writer.Write(MessageManager.messageTypes[messageType]);
519+
writer.Write(networkId != null);
520+
if (networkId != null)
521+
writer.Write(networkId.Value);
499522
writer.Write((ushort)data.Length);
500523
writer.Write(data);
501524
}
502-
//2 bytes for message type and 2 bytes for byte length
503-
int size = data.Length + 4;
504525
byte[] dataToSend = stream.ToArray();
505526
NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], dataToSend, dataToSend.Length, out error);
506527
}
507528
}
508529

509-
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data)
530+
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
510531
{
511532
using (MemoryStream stream = new MemoryStream())
512533
{
513534
using (BinaryWriter writer = new BinaryWriter(stream))
514535
{
515536
writer.Write(MessageManager.messageTypes[messageType]);
537+
writer.Write(networkId != null);
538+
if (networkId != null)
539+
writer.Write(networkId.Value);
516540
writer.Write((ushort)data.Length);
517541
writer.Write(data);
518542
}
519-
//2 bytes for message type and 2 bytes for byte length
520-
int size = data.Length + 4;
521543
byte[] dataToSend = stream.ToArray();
522544
int channel = MessageManager.channels[channelName];
523545
for (int i = 0; i < clientIds.Length; i++)
524546
{
525547
int clientId = clientIds[i];
526548
if (isHost && clientId == -1)
527549
{
528-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
550+
if (networkId == null)
551+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
552+
else
553+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
529554
continue;
530555
}
531556
else if (clientId == -1)
532557
{
533558
//Client trying to send data to host
534559
clientId = serverClientId;
535560
}
536-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
561+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
537562
}
538563
}
539564
}
540565

541-
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data)
566+
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
542567
{
543568
using (MemoryStream stream = new MemoryStream())
544569
{
545570
using (BinaryWriter writer = new BinaryWriter(stream))
546571
{
547572
writer.Write(MessageManager.messageTypes[messageType]);
573+
writer.Write(networkId != null);
574+
if (networkId != null)
575+
writer.Write(networkId.Value);
548576
writer.Write((ushort)data.Length);
549577
writer.Write(data);
550578
}
551-
//2 bytes for message type and 2 bytes for byte length
552-
int size = data.Length + 4;
553579
byte[] dataToSend = stream.ToArray();
554580
int channel = MessageManager.channels[channelName];
555581
for (int i = 0; i < clientIds.Count; i++)
556582
{
557583
int clientId = clientIds[i];
558584
if (isHost && clientId == -1)
559585
{
560-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
586+
if (networkId == null)
587+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
588+
else
589+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
561590
continue;
562591
}
563592
else if (clientId == -1)
564593
{
565594
//Client trying to send data to host
566595
clientId = serverClientId;
567596
}
568-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
597+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
569598
}
570599
}
571600
}
572601

573-
internal void Send(string messageType, string channelName, byte[] data)
602+
internal void Send(string messageType, string channelName, byte[] data, uint? networkId = null)
574603
{
575604
using (MemoryStream stream = new MemoryStream())
576605
{
577606
using (BinaryWriter writer = new BinaryWriter(stream))
578607
{
579608
writer.Write(MessageManager.messageTypes[messageType]);
609+
writer.Write(networkId != null);
610+
if (networkId != null)
611+
writer.Write(networkId.Value);
580612
writer.Write((ushort)data.Length);
581613
writer.Write(data);
582614
}
583-
//2 bytes for message type and 2 bytes for byte length
584-
int size = data.Length + 4;
585615
byte[] dataToSend = stream.ToArray();
586616
int channel = MessageManager.channels[channelName];
587617
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
588618
{
589619
int clientId = pair.Key;
590620
if(isHost && pair.Key == -1)
591621
{
592-
MessageManager.InvokeMessageHandlers(messageType, data, pair.Key);
622+
if (networkId == null)
623+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
624+
else
625+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
593626
continue;
594627
}
595628
else if (clientId == -1)
596629
{
597630
//Client trying to send data to host
598631
clientId = serverClientId;
599632
}
600-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
633+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
601634

602635
}
603636
}
604637
}
605638

606-
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore)
639+
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore, uint? networkId = null)
607640
{
608641
using (MemoryStream stream = new MemoryStream())
609642
{
610643
using (BinaryWriter writer = new BinaryWriter(stream))
611644
{
612645
writer.Write(MessageManager.messageTypes[messageType]);
646+
writer.Write(networkId != null);
647+
if (networkId != null)
648+
writer.Write(networkId.Value);
613649
writer.Write((ushort)data.Length);
614650
writer.Write(data);
615651
}
616-
//2 bytes for message type and 2 bytes for byte length
617-
int size = data.Length + 4;
618652
byte[] dataToSend = stream.ToArray();
619653
int channel = MessageManager.channels[channelName];
620654
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
@@ -624,15 +658,18 @@ internal void Send(string messageType, string channelName, byte[] data, int clie
624658
int clientId = pair.Key;
625659
if (isHost && pair.Key == -1)
626660
{
627-
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
661+
if (networkId == null)
662+
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
663+
else
664+
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
628665
continue;
629666
}
630667
else if (clientId == -1)
631668
{
632669
//Client trying to send data to host
633670
clientId = serverClientId;
634671
}
635-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
672+
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
636673
}
637674
}
638675
}

0 commit comments

Comments
 (0)