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); } }
/// <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; }
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(); } }
public void OnVesselDestroyed(Vessel v) { if (vessel != v) { return; } storage = new List <IScienceDataContainer>(); magicTransmitter = null; vessel = null; }
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; } }
/// <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"); }