/// <summary> /// Check vessels that must be reloaded /// </summary> private void CheckVesselsToRefresh() { try { if ((DateTime.UtcNow - LastReloadCheck).TotalMilliseconds > 1500 && ProtoSystemBasicReady) { VesselsToRefresh.Clear(); //We get the vessels that already exist VesselsToRefresh.AddRange(VesselsProtoStore.AllPlayerVessels .Where(pv => pv.Value.VesselExist && pv.Value.VesselHasUpdate) .Select(v => v.Key)); //Do not iterate directly trough the AllPlayerVessels dictionary as the collection can be modified in another threads! foreach (var vesselIdToReload in VesselsToRefresh) { if (VesselRemoveSystem.VesselWillBeKilled(vesselIdToReload)) { continue; } //Do not handle vessel proto updates over our OWN active vessel if we are not spectating //If there is an undetected dock (our protovessel has been modified) it will be detected //in the docksystem if (vesselIdToReload == FlightGlobals.ActiveVessel?.id && !VesselCommon.IsSpectating) { continue; } if (VesselsProtoStore.AllPlayerVessels.TryGetValue(vesselIdToReload, out var vesselProtoUpdate)) { CurrentlyUpdatingVesselId = vesselIdToReload; ProtoToVesselRefresh.UpdateVesselPartsFromProtoVessel(vesselProtoUpdate.Vessel, vesselProtoUpdate.ProtoVessel, vesselProtoUpdate.VesselParts.Keys); vesselProtoUpdate.VesselHasUpdate = false; CurrentlyUpdatingVesselId = Guid.Empty; } } LastReloadCheck = DateTime.UtcNow; } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToReload {e}"); } }
/// <summary> /// Check vessels that must be reloaded /// </summary> private void CheckVesselsToRefresh() { try { if (TimeUtil.IsInInterval(ref _lastReloadCheck, 1500) && ProtoSystemBasicReady) { VesselsToRefresh.Clear(); //We get the vessels that already exist VesselsToRefresh.AddRange(VesselsProtoStore.AllPlayerVessels .Where(pv => pv.Value.VesselExist && pv.Value.VesselHasUpdate && !pv.Value.HasInvalidParts) .Select(v => v.Key)); //Do not iterate directly trough the AllPlayerVessels dictionary as the collection can be modified in another threads! foreach (var vesselIdToReload in VesselsToRefresh) { if (VesselRemoveSystem.VesselWillBeKilled(vesselIdToReload)) { continue; } if (FlightGlobals.ActiveVessel?.id == vesselIdToReload) { LunaLog.LogWarning("Reloading our OWN active vessel!"); } if (VesselsProtoStore.AllPlayerVessels.TryGetValue(vesselIdToReload, out var vesselProtoUpd)) { CurrentlyUpdatingVesselId = vesselIdToReload; ProtoToVesselRefresh.UpdateVesselPartsFromProtoVessel(vesselProtoUpd.Vessel, vesselProtoUpd.ProtoVessel, vesselProtoUpd.ForceReload, vesselProtoUpd.VesselParts.Keys); vesselProtoUpd.VesselHasUpdate = false; VesselReloadEvent.onLmpVesselReloaded.Fire(vesselProtoUpd.Vessel); CurrentlyUpdatingVesselId = Guid.Empty; } } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToReload {e}"); } }