public static TrackedVessel CreateFromVessel(Vessel vessel) { TrackedVessel trackedVessel = new TrackedVessel(); trackedVessel.vessel = vessel; trackedVessel.UpdateCachedValues(); // Initialize the tracking return(trackedVessel); }
// Updates the list of tracked vessels as well as all the vessels on it (updates the resources in the vessels and // kills the crew, if appropriate): public static void UpdateAllTrackedVessels() { try { long time = DateTime.Now.Ticks; int trackingsAdded = 0; int trackingsRemoved = 0; // This should only happen when the game is still loading, at least there should be some asteroids: if (FlightGlobals.Vessels.Count == 0) { trackedVessels.Clear(); return; } // Find new vessels, which are not yet tracked and track them: List <Guid> trackedIds = new List <Guid>(); foreach (TrackedVessel trackedVessel in trackedVessels) { trackedIds.Add(trackedVessel.vessel.id); } List <Vessel> missingVessels = FlightGlobals.Vessels.FindAll(x => !trackedIds.Contains(x.id)); foreach (Vessel vessel in missingVessels) { if (vessel.vesselType == VesselType.Flag || vessel.vesselType == VesselType.SpaceObject || vessel.vesselType == VesselType.Unknown) { continue; } trackedVessels.Add(TrackedVessel.CreateFromVessel(vessel)); trackingsAdded++; } // Find vessels, which were removed: List <Guid> existingIds = new List <Guid>(); foreach (Vessel vessel in FlightGlobals.Vessels) { existingIds.Add(vessel.id); } List <TrackedVessel> trackedVesselsToRemove = trackedVessels.FindAll(x => x?.vessel?.id == null || !existingIds.Contains(x.vessel.id)); foreach (TrackedVessel trackedVessel in trackedVesselsToRemove) { trackedVessels.Remove(trackedVessel); trackingsRemoved++; } // Update all the tracked vessels: foreach (TrackedVessel trackedVessel in trackedVessels) { trackedVessel.Update(); } time = (DateTime.Now.Ticks - time) / TimeSpan.TicksPerSecond; Debug.Log("[CLLS] tracked " + trackingsAdded.ToString() + " new, removed " + trackingsRemoved.ToString() + " old and updated " + trackedVessels.Count.ToString() + " vessels in " + time.ToString("0.000s")); } catch (Exception e) { Debug.LogError("[CLLS] UpdateAllTrackedVessels(): " + e.ToString()); } }
public override void OnUpdate() { base.OnUpdate(); Vessel vessel = this.part.vessel; if (!vessel.loaded) { return; // Shouldn't happen, but better safe than sorry } TrackedVessel trackedVessel = CLLS.GetTrackedVessel(vessel); // Only calculate the remaining days of life support if there are kerbals on board and they use it: if (trackedVessel.cachedCrewCount <= 0 || trackedVessel.cachedLifeSupportDeltaPerHour > 0) { lifeSupportStatus = "On Standby"; } else { double lifeSupport = trackedVessel.cachedLifeSupport; double consumptionPerHour = -trackedVessel.cachedLifeSupportDeltaPerHour; double displayRate; string unit; displayRate = (float)((lifeSupport / consumptionPerHour)) / CLLS.GetDayLength(); // Show remaining days unit = " days "; // If there is only very little left, go to hours or even minutes: if (displayRate < 2) { displayRate *= 6; unit = " hours "; } if (displayRate < 1) { displayRate *= 60; unit = " min. "; } if (lifeSupport <= 0) { lifeSupportStatus = "DEPLETED"; } else { lifeSupportStatus = displayRate.ToString("0.00") + unit; } } }