/// <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> /// Call this method to apply a vessel update using interpolation /// </summary> public FlightCtrlState GetInterpolatedValue() { if (!VesselCommon.IsSpectating && 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; } ProcessRestart(); LerpPercentage = 0; if (Target != null) { Target.CopyFrom(targetUpdate); VesselFlightStateSystem.TargetFlightStateQueue[VesselId].Recycle(targetUpdate); } else { Target = targetUpdate; } AdjustExtraInterpolationTimes(); //UpdateProtoVesselValues(); } if (Target == null) { return(InterpolatedCtrlState); } if (LerpPercentage > 1) { //We only send flight states of the ACTIVE vessel so perhaps some player switched a vessel and we are not receiveing any flight state //To solve this just remove the vessel from the system VesselFlightStateSystem.Singleton.RemoveVessel(VesselId); } InterpolatedCtrlState.Lerp(CtrlState, Target.CtrlState, LerpPercentage); LerpPercentage += (float)(Time.fixedDeltaTime / InterpolationDuration); return(InterpolatedCtrlState); }