public VoiceChatPacketRouter(IMultiplayerSessionManager sessionManager, VoipSender voipSender, ICodecFactory codecFactory, DiContainer container)
        {
            _container     = container;
            SessionManager = sessionManager;
            //ConnectionManager = connectionManager;
            //VoipReceiver = voipReceiver;
            CodecFactory = codecFactory;
            VoipSender   = voipSender;
#if DEBUG
            dummyReceiver = container.InstantiateComponentOnNewGameObject <VoipReceiver>();
            var settings = new Codecs.Opus.OpusSettings()
            {
                SampleRate = 48000, Channels = 1
            };
            dummyReceiver.Initialize(sessionManager.localPlayer, codecFactory.CreateDecoder(Codecs.Opus.OpusDefaults.CodecId, settings));
            voipSender.OnAudioGenerated += (s, e) => { dummyReceiver.HandleAudioDataReceived(s, e); };
#endif
            AddEvents();
            sessionManager.RegisterSerializer((MultiplayerSessionManager.MessageType) 128, _mainSerializer);
            _mainSerializer.RegisterSubSerializer((byte)VoipPacketType.VoiceData, _voipDataSerializer);
            _mainSerializer.RegisterSubSerializer((byte)VoipPacketType.InfoRequest, _voipMetadataSerializer);
            _mainSerializer.RegisterSubSerializer((byte)VoipPacketType.VoiceMetadata, _voipMetadataSerializer);
            _voipDataSerializer.RegisterCallback((byte)VoipPacketType.VoiceData, HandleVoipDataPacket, VoipDataPacket.Obtain);
            Plugin.Log?.Debug($"VoiceChatPacketRouter Constructed.");
            foreach (IConnectedPlayer?player in sessionManager.connectedPlayers)
            {
                if (!player.isMe)
                {
                    CreatePlayerVoipReceiver(player.userId, player);
                }
            }
            //if (sessionManager.isConnected)
            IsConnected = true;
        }
        public void RegisterCallback <T>(ExtendedSessionManager.MessageType serializerType, Action <T, ExtendedPlayer> callback, Func <T> constructor) where T : INetSerializable
        {
            Action <T, IConnectedPlayer> extendedCallback = delegate(T packet, IConnectedPlayer player)
            {
                ExtendedPlayer extendedPlayer = GetExtendedPlayer(player);
                callback(packet, extendedPlayer);
            };

            _packetSerializer.RegisterCallback(serializerType, extendedCallback, constructor);
        }