/// <summary> /// Check vessels that must be loaded /// </summary> private void CheckVesselsToLoad() { try { if (ProtoSystemBasicReady && !VesselCommon.ActiveVesselIsInSafetyBubble()) { //Load vessels that don't exist, are in our subspace and out of safety bubble var vesselsToLoad = VesselsProtoStore.AllPlayerVessels .Where(v => !v.Value.VesselExist && v.Value.ShouldBeLoaded && !v.Value.IsInSafetyBubble); foreach (var vesselProto in vesselsToLoad) { if (VesselRemoveSystem.VesselWillBeKilled(vesselProto.Key)) { continue; } LunaLog.Log($"[LMP]: Loading vessel {vesselProto.Key}"); CurrentlyUpdatingVesselId = vesselProto.Key; if (VesselLoader.LoadVessel(vesselProto.Value.ProtoVessel)) { LunaLog.Log($"[LMP]: Vessel {vesselProto.Key} loaded"); } CurrentlyUpdatingVesselId = Guid.Empty; } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToLoad {e}"); } }
/// <summary> /// Check vessels that must be loaded /// </summary> public void CheckVesselsToLoad() { if (HighLogic.LoadedScene < GameScenes.SPACECENTER) { return; } try { foreach (var keyVal in VesselProtos) { if (keyVal.Value.TryPeek(out var vesselProto) && vesselProto.GameTime <= TimeSyncSystem.UniversalTime) { keyVal.Value.TryDequeue(out _); if (VesselRemoveSystem.VesselWillBeKilled(vesselProto.VesselId)) { continue; } var forceReload = vesselProto.ForceReload; var protoVessel = vesselProto.CreateProtoVessel(); keyVal.Value.Recycle(vesselProto); if (protoVessel == null || protoVessel.HasInvalidParts(!VesselsUnableToLoad.Contains(vesselProto.VesselId))) { VesselsUnableToLoad.Add(vesselProto.VesselId); continue; } VesselsUnableToLoad.Remove(vesselProto.VesselId); var existingVessel = FlightGlobals.FindVessel(vesselProto.VesselId); if (existingVessel == null) { if (VesselLoader.LoadVessel(protoVessel, forceReload)) { LunaLog.Log($"[LMP]: Vessel {protoVessel.vesselID} loaded"); VesselLoadEvent.onLmpVesselLoaded.Fire(protoVessel.vesselRef); } } else { if (VesselLoader.LoadVessel(protoVessel, forceReload)) { LunaLog.Log($"[LMP]: Vessel {protoVessel.vesselID} reloaded"); VesselReloadEvent.onLmpVesselReloaded.Fire(protoVessel.vesselRef); } } } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToLoad {e}"); } }
/// <summary> /// Check vessels that must be loaded /// </summary> private void CheckVesselsToLoad() { if (HighLogic.LoadedScene < GameScenes.SPACECENTER) { return; } try { foreach (var keyVal in VesselProtos) { if (keyVal.Value.TryPeek(out var vesselProto) && vesselProto.GameTime <= TimeSyncSystem.UniversalTime) { keyVal.Value.TryDequeue(out _); if (VesselRemoveSystem.VesselWillBeKilled(vesselProto.VesselId)) { continue; } var protoVessel = vesselProto.CreateProtoVessel(); keyVal.Value.Recycle(vesselProto); if (protoVessel == null) { return; } var existingVessel = FlightGlobals.fetch.LmpFindVessel(vesselProto.VesselId); if (existingVessel == null) { LunaLog.Log($"[LMP]: Loading vessel {vesselProto.VesselId}"); if (VesselLoader.LoadVessel(protoVessel)) { LunaLog.Log($"[LMP]: Vessel {protoVessel.vesselID} loaded"); VesselLoadEvent.onLmpVesselLoaded.Fire(protoVessel.vesselRef); } } else { LunaLog.Log($"[LMP]: Reloading vessel {vesselProto.VesselId}"); if (VesselLoader.LoadVessel(protoVessel)) { LunaLog.Log($"[LMP]: Vessel {protoVessel.vesselID} reloaded"); VesselReloadEvent.onLmpVesselReloaded.Fire(protoVessel.vesselRef); } } } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToLoad {e}"); } }
/// <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 loaded /// </summary> private void CheckVesselsToLoad() { try { if (ProtoSystemBasicReady) { //Load vessels that don't exist, are in our subspace and out of safety bubble var vesselsToLoad = VesselsProtoStore.AllPlayerVessels.Where(v => !v.Value.VesselExist && v.Value.ShouldBeLoaded); foreach (var vesselProto in vesselsToLoad) { if (VesselRemoveSystem.VesselWillBeKilled(vesselProto.Key)) { continue; } //If the vessel spawned later than the current time avoid loading it if (VesselsProtoStore.VesselsSpawnTime.TryGetValue(vesselProto.Key, out var spawnTime) && TimeSyncerSystem.UniversalTime < spawnTime) { continue; } //Only load vessels that are in safety bubble when not in flight if (vesselProto.Value.IsInSafetyBubble && HighLogic.LoadedScene == GameScenes.FLIGHT) { continue; } LunaLog.Log($"[LMP]: Loading vessel {vesselProto.Key}"); if (VesselLoader.LoadVessel(vesselProto.Value.ProtoVessel)) { LunaLog.Log($"[LMP]: Vessel {vesselProto.Key} loaded"); VesselLoadEvent.onLmpVesselLoaded.Fire(vesselProto.Value.Vessel); } } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToLoad {e}"); } }
/// <summary> /// Check vessels that must be loaded /// </summary> private void CheckVesselsToLoad() { try { if (ProtoSystemBasicReady) { //Load vessels that don't exist, are in our subspace and out of safety bubble var vesselsToLoad = VesselsProtoStore.AllPlayerVessels.Where(v => !v.Value.VesselExist && v.Value.ShouldBeLoaded); foreach (var vesselProto in vesselsToLoad) { if (VesselRemoveSystem.VesselWillBeKilled(vesselProto.Key)) { continue; } //Only load vessels that are in safety bubble on the track station if (vesselProto.Value.IsInSafetyBubble && HighLogic.LoadedScene != GameScenes.TRACKSTATION) { continue; } if (VesselCommon.ActiveVesselIsInSafetyBubble() && VesselCommon.IsNearKsc(vesselProto.Value.ProtoVessel, 20000)) { continue; } LunaLog.Log($"[LMP]: Loading vessel {vesselProto.Key}"); CurrentlyUpdatingVesselId = vesselProto.Key; if (VesselLoader.LoadVessel(vesselProto.Value.ProtoVessel)) { LunaLog.Log($"[LMP]: Vessel {vesselProto.Key} loaded"); } CurrentlyUpdatingVesselId = Guid.Empty; } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToLoad {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}"); } }
/// <summary> /// Check vessels that must be loaded /// </summary> private void CheckVesselsToLoad() { try { if (ProtoSystemBasicReady) { //Load vessels that don't exist, are in our subspace and out of safety bubble var vesselsToLoad = VesselsProtoStore.AllPlayerVessels.Where(v => !v.Value.VesselExist && v.Value.ShouldBeLoaded); foreach (var vesselProto in vesselsToLoad) { if (VesselRemoveSystem.VesselWillBeKilled(vesselProto.Key)) { continue; } //Only load vessels that are in safety bubble when not in flight if (vesselProto.Value.IsInSafetyBubble && HighLogic.LoadedScene == GameScenes.FLIGHT) { continue; } LunaLog.Log($"[LMP]: Loading vessel {vesselProto.Key}"); if (VesselLoader.LoadVessel(vesselProto.Value.ProtoVessel)) { LunaLog.Log($"[LMP]: Vessel {vesselProto.Key} loaded"); } } } } catch (Exception e) { LunaLog.LogError($"[LMP]: Error in CheckVesselsToLoad {e}"); } }