public VesselFlightStateUpdate(VesselFlightStateMsgData msgData)
        {
            VesselId      = msgData.VesselId;
            GameTimeStamp = msgData.GameTime;
            SubspaceId    = msgData.SubspaceId;

            CtrlState.CopyFrom(msgData);
        }
        public void CopyFrom(VesselFlightStateUpdate update)
        {
            VesselId      = update.VesselId;
            GameTimeStamp = update.GameTimeStamp;
            SubspaceId    = update.SubspaceId;

            CtrlState.CopyFrom(update.CtrlState);
        }
        public void CopyFrom(Vessel vessel)
        {
            if (vessel == null)
            {
                return;
            }

            CtrlState.CopyFrom(vessel.ctrlState);
        }
        /// <summary>
        /// Call this method to apply a vessel update using interpolation
        /// </summary>
        public FlightCtrlState GetInterpolatedValue()
        {
            if (!VesselCommon.IsSpectating && FlightGlobals.ActiveVessel && FlightGlobals.ActiveVessel.id == VesselId)
            {
                //Do not apply flight states updates to our OWN controlled vessel
                return(FlightGlobals.ActiveVessel.ctrlState);
            }

            if (InterpolationFinished && VesselFlightStateSystem.TargetFlightStateQueue.TryGetValue(VesselId, out var queue) && queue.TryDequeue(out var targetUpdate))
            {
                if (Target == null)
                {
                    //This is the case of first iteration
                    GameTimeStamp = targetUpdate.GameTimeStamp - TimeSpan.FromMilliseconds(SettingsSystem.ServerSettings.SecondaryVesselUpdatesMsInterval).TotalSeconds;

                    CopyFrom(FlightGlobals.FindVessel(VesselId));
                }
                else
                {
                    GameTimeStamp = Target.GameTimeStamp;
                    SubspaceId    = Target.SubspaceId;

                    CtrlState.CopyFrom(Target.CtrlState);
                }

                LerpPercentage = 0;

                if (Target != null)
                {
                    Target.CopyFrom(targetUpdate);
                    VesselFlightStateSystem.TargetFlightStateQueue[VesselId].Recycle(targetUpdate);
                }
                else
                {
                    Target = targetUpdate;
                }

                AdjustExtraInterpolationTimes();

                //UpdateProtoVesselValues();
            }

            if (Target == null)
            {
                return(InterpolatedCtrlState);
            }

            InterpolatedCtrlState.Lerp(CtrlState, Target.CtrlState, LerpPercentage);
            LerpPercentage += (float)(Time.fixedDeltaTime / InterpolationDuration);

            return(InterpolatedCtrlState);
        }
        /// <summary>
        /// Here we apply the CURRENT vessel flight state to this update.
        /// </summary>
        private void ProcessRestart()
        {
            if (Target != null)
            {
                GameTimeStamp = Target.GameTimeStamp;
                SubspaceId    = Target.SubspaceId;

                CtrlState.CopyFrom(Target.CtrlState);
            }
            else
            {
                var vessel = FlightGlobals.fetch.LmpFindVessel(VesselId);
                if (vessel == null)
                {
                    return;
                }

                CtrlState.CopyFrom(vessel.ctrlState);
            }
        }