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