public RealTimeUpdateResponse(BinaryReader reader)
        {
            EventIndex   = reader.ReadUInt16();
            SessionIndex = reader.ReadUInt16();
            SessionType  = (SessionType)reader.ReadByte();
            Phase        = (SessionPhase)reader.ReadByte();
            var sessionTime = reader.ReadSingle();

            SessionTime = TimeSpan.FromMilliseconds(sessionTime);
            var sessionEndTime = reader.ReadSingle();

            SessionEndTime = TimeSpan.FromMilliseconds(sessionEndTime);

            FocusedCarIndex = reader.ReadInt32();
            ActiveCameraSet = ReadString(reader);
            ActiveCamera    = ReadString(reader);
            CurrentHudPage  = ReadString(reader);

            IsReplayPlaying = reader.ReadByte() > 0;
            if (IsReplayPlaying)
            {
                ReplaySessionTime   = reader.ReadSingle();
                ReplayRemainingTime = reader.ReadSingle();
            }

            TimeOfDay   = TimeSpan.FromMilliseconds(reader.ReadSingle());
            AmbientTemp = reader.ReadByte();
            TrackTemp   = reader.ReadByte();
            Clouds      = reader.ReadByte() / 10.0f;
            RainLevel   = reader.ReadByte() / 10.0f;
            Wetness     = reader.ReadByte() / 10.0f;

            BestSessionLap = LapInfo.FromReader(reader);
        }
        public RealTimeCarUpdateResponse(BinaryReader reader)
        {
            CarIndex       = reader.ReadUInt16();
            DriverIndex    = reader.ReadUInt16();   // Driver swap will make this change
            DriverCount    = reader.ReadByte();
            Gear           = reader.ReadByte() - 2; // -2 makes the R -1, N 0 and the rest as-is
            WorldPosX      = reader.ReadSingle();
            WorldPosY      = reader.ReadSingle();
            Yaw            = reader.ReadSingle();
            CarLocation    = (CarLocation)reader.ReadByte(); // - , Track, Pitlane, PitEntry, PitExit = 4
            Kmh            = reader.ReadUInt16();
            Position       = reader.ReadUInt16();            // official P/Q/R position (1 based)
            CupPosition    = reader.ReadUInt16();            // official P/Q/R position (1 based)
            TrackPosition  = reader.ReadUInt16();            // position on track (1 based)
            SplinePosition = reader.ReadSingle();            // track position between 0.0 and 1.0
            Laps           = reader.ReadUInt16();

            Delta          = reader.ReadInt32(); // Realtime delta to best session lap
            BestSessionLap = LapInfo.FromReader(reader);
            LastLap        = LapInfo.FromReader(reader);
            CurrentLap     = LapInfo.FromReader(reader);
        }