Exemple #1
0
 private void RemoveMagicTransmitter(bool rootOnly = true)
 {
     magicTransmitter = null;
     if (vessel == null || vessel.rootPart == null || vessel.rootPart.Modules == null || vessel.Parts == null)
     {
         return;
     }
     try
     {
         if (vessel.rootPart.Modules.Contains("MagicDataTransmitter"))
         {
             vessel.rootPart.RemoveModule(vessel.rootPart.Modules.OfType <MagicDataTransmitter>().Single());
         }
         if (rootOnly)
         {
             return;
         }
         for (int i = vessel.Parts.Count - 1; i >= 0; i--)
         {
             Part current = vessel.Parts[i];
             if (current.Modules.Contains("MagicDataTransmitter"))
             {
                 current.RemoveModule(current.Modules.OfType <MagicDataTransmitter>().First());
             }
         }
     }
     catch (Exception ex)
     {
         Log.Warning("RemoveMagicTransmitter: caught exception {0}", ex);
     }
 }
Exemple #2
0
        /// <summary>
        /// Remove the magic transmitter (if it exists) from the given Vessel.
        /// Mainly used so that only the active vessel has a magic transmitter.
        ///
        /// There's a chance that in specific circumstances, having an unmonitored
        /// magic transmitter might cause problems.
        ///
        /// </summary>
        /// <param name="v"></param>
        /// <param name="rootOnly"></param>
        private void RemoveMagicTransmitter(bool rootOnly = true)
        {
            if (vessel != null)
            {
                if (vessel.rootPart != null)
                {
                    try
                    {
                        if (vessel.rootPart.Modules.Contains("MagicDataTransmitter"))
                        {
                            vessel.rootPart.RemoveModule(vessel.rootPart.Modules.OfType <MagicDataTransmitter>().Single());
                        }

                        if (!rootOnly)
                        {
                            foreach (var part in vessel.Parts)
                            {
                                if (part.Modules.Contains("MagicDataTransmitter"))
                                {
                                    part.RemoveModule(part.Modules.OfType <MagicDataTransmitter>().First());
                                }
                            }
                        }
                    } catch (Exception e)
                    {
                        Log.Warning("RemoveMagicTransmitter: caught exception {0}", e);
                    }
                }
            }

            magicTransmitter = null;
        }
Exemple #3
0
        private IEnumerator Rebuild()
        {
            IsBusy = true;
            storage.Clear();
            List <KeyValuePair <List <ScienceData>, Callback> > queuedData = magicTransmitter != null?magicTransmitter.GetQueuedData() : new List <KeyValuePair <List <ScienceData>, Callback> >();

            magicTransmitter = null;
            yield return(new WaitForFixedUpdate());

            if (FlightGlobals.ActiveVessel != vessel)
            {
                RemoveMagicTransmitter();
            }
            while (FlightGlobals.ActiveVessel != null && !vessel.loaded || !FlightGlobals.ready)
            {
                yield return(new WaitForFixedUpdate());
            }
            if (FlightGlobals.ActiveVessel == null)
            {
                IsBusy = false;
            }
            else
            {
                vessel  = FlightGlobals.ActiveVessel;
                storage = vessel.FindPartModulesImplementing <IScienceDataContainer>();
                List <IScienceDataTransmitter> source = (from tx in vessel.FindPartModulesImplementing <IScienceDataTransmitter>()
                                                         where !(tx is MagicDataTransmitter)
                                                         select tx).ToList();
                if (source.Any())
                {
                    magicTransmitter = vessel.rootPart.gameObject.GetComponent <MagicDataTransmitter>();
                    if (magicTransmitter != null)
                    {
                        magicTransmitter.RefreshTransmitterQueues(queuedData);
                    }
                    else
                    {
                        magicTransmitter = vessel.rootPart.AddModule("MagicDataTransmitter") as MagicDataTransmitter;
                        if (magicTransmitter != null)
                        {
                            magicTransmitter.cacheOwner = this;
                        }
                    }
                }
                else
                {
                    RemoveMagicTransmitter(false);
                    Log.Debug("ALERT:Vessel {0} has no transmitters; no magic transmitter added", vessel.name);
                }
                IsBusy = false;
                Log.Debug("ALERT:Rebuilt StorageCache");
            }
            if (Windows.DraggableExperimentList.Instance != null)
            {
                Windows.DraggableExperimentList.Instance.CheckForCollection();
            }
        }
Exemple #4
0
 public void OnVesselDestroyed(Vessel v)
 {
     if (vessel != v)
     {
         return;
     }
     storage          = new List <IScienceDataContainer>();
     magicTransmitter = null;
     vessel           = null;
 }
Exemple #5
0
        public void OnVesselDestroyed(Vessel v)
        {
            if (vessel == v)
            {
                Log.Debug("StorageCache.OnVesselDestroyed");

                //RemoveMagicTransmitter();
                // temporary: seeing if attempting to remove transmitter while
                // vessel is being destroyed is causing:
                //      Destroying object multiple times. Don't use DestroyImmediate on the same object in OnDisable or OnDestroy."

                storage          = new StorageList();
                magicTransmitter = null;
                vessel           = null;
            }
        }
Exemple #6
0
        /// <summary>
        /// Rebuild storage cache.  This object is shared between
        /// all ExperimentObservers and allows them to determine what data
        /// is onboard the craft, being transmitted or has been submitted to
        /// R&D
        /// </summary>
        private System.Collections.IEnumerator Rebuild()
        {
            IsBusy = true;

            Log.Debug("StorageCache: Rebuilding ...");

            yield return(new WaitForFixedUpdate());

            if (FlightGlobals.ActiveVessel != vessel)
            {
                // this could be an indication that we're not monitoring
                // the active vessel properly
                Log.Error("StorageCache: Active vessel is not monitored vessel.");


                RemoveMagicTransmitter();
                vessel = FlightGlobals.ActiveVessel;
            }

            while (!FlightGlobals.ready || !vessel.loaded)
            {
                Log.Debug("StorageCache.Rebuild - waiting");
                yield return(new WaitForFixedUpdate());
            }


            // ScienceContainers are straightforward ...
            storage = vessel.FindPartModulesImplementing <IScienceDataContainer>();
            Log.Debug("StorageCache: located {0} IScienceDataContainers", storage.Count);


            // now we must deal with IScienceDataTransmitters, which are not
            // quite as simple due to the MagicDataTransmitter we're faking

            // remove any existing magic transmitters
            //   note: we include non-root parts here because it's possible
            //         for two vessels to have merged, due to docking for instance.
            //
            //          We could theoretically only remove MagicTransmitters from
            //          the root parts of docked vessels, but there may be cases
            //          where vessels that couldn't normally dock do (some kind of plugin perhaps)
            //          so I've opted for a general solution here
            RemoveMagicTransmitter(false);


            // count the number of "real" transmitters onboard
            List <IScienceDataTransmitter> transmitters = FlightGlobals.ActiveVessel.FindPartModulesImplementing <IScienceDataTransmitter>();

            transmitters.RemoveAll(tx => tx is MagicDataTransmitter);


            if (transmitters.Count > 0)
            {
                // as long as at least one transmitter is "real", the
                // vessel's root part should have a MagicDataTransmitter
                if (transmitters.Any(tx => !(tx is MagicDataTransmitter)))
                {
                    magicTransmitter            = vessel.rootPart.AddModule("MagicDataTransmitter") as MagicDataTransmitter;
                    magicTransmitter.cacheOwner = this;

                    Log.Debug("Added MagicDataTransmitter to root part {0}", FlightGlobals.ActiveVessel.rootPart.ConstructID);
                }
            }
            else
            {
                Log.Debug("Vessel {0} has no transmitters; no magic transmitter added", vessel.name);
            }

            IsBusy = false;
            Log.Debug("Rebuilt StorageCache");
        }