@@ -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