Пример #1
0
        public static TrackedVessel CreateFromVessel(Vessel vessel)
        {
            TrackedVessel trackedVessel = new TrackedVessel();

            trackedVessel.vessel = vessel;
            trackedVessel.UpdateCachedValues(); // Initialize the tracking
            return(trackedVessel);
        }
Пример #2
0
        // 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());
            }
        }
Пример #3
0
        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;
                }
            }
        }