Пример #1
0
        internal static void Display(Vector2 displayViewerPosition)
        {
            //float scrollX = WindowControl.Position.x + 20;
            //float scrollY = WindowControl.Position.y + 50 - displayViewerPosition.y;
            float scrollX = 20;
            float scrollY = displayViewerPosition.y;

            // Reset Tooltip active flag...
            ToolTipActive             = false;
            SMHighlighter.IsMouseOver = false;

            GUILayout.BeginVertical();
            GUI.enabled = true;
            //GUILayout.Label("External Light Control Center ", SMStyle.LabelTabHeader);
            GUILayout.Label(SmUtils.Localize("#smloc_control_light_000"), SMStyle.LabelTabHeader);
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));
            string step = "start";

            try
            {
                // Display all Lights
                List <ModLight> .Enumerator iLights = SMAddon.SmVessel.Lights.GetEnumerator();
                while (iLights.MoveNext())
                {
                    if (iLights.Current == null)
                    {
                        continue;
                    }
                    string label      = $"{iLights.Current.Status} - {iLights.Current.Title}";
                    bool   onState    = iLights.Current.IsOn;
                    bool   newOnState = GUILayout.Toggle(onState, label, GUILayout.Width(guiToggleWidth), GUILayout.Height(40));
                    step = "button toggle check";
                    if (!onState && newOnState)
                    {
                        iLights.Current.TurnOnLight();
                    }
                    else if (onState && !newOnState)
                    {
                        iLights.Current.TurnOffLight();
                    }
                    Rect rect = GUILayoutUtility.GetLastRect();
                    if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition))
                    {
                        SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, iLights.Current.SPart, Event.current.mousePosition);
                    }
                }
                iLights.Dispose();

                // Display MouseOverHighlighting, if any
                SMHighlighter.MouseOverHighlight();
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $" in Light Tab at step {step}.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error,
                    true);
            }
            GUILayout.EndVertical();
        }
Пример #2
0
 internal static void FreezeKerbal(ProtoCrewMember kerbal)
 {
     try
     {
         if (!InstalledMods.IsDfApiReady)
         {
             return;
         }
         List <Part> .Enumerator cryofreezers = SmUtils.GetFreezerParts().GetEnumerator();
         while (cryofreezers.MoveNext())
         {
             if (cryofreezers.Current == null)
             {
                 continue;
             }
             if (!cryofreezers.Current.protoModuleCrew.Contains(kerbal))
             {
                 continue;
             }
             // ReSharper disable once SuspiciousTypeConversion.Global
             PartModule deepFreezer = SMConditions.GetFreezerModule(cryofreezers.Current);
             if (deepFreezer != null)
             {
                 new DfWrapper.DeepFreezer(deepFreezer).BeginFreezeKerbal(kerbal);
             }
             break;
         }
         cryofreezers.Dispose();
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage($" in FreezeKerbal.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                            SmUtils.LogType.Error, true);
     }
 }
Пример #3
0
 private static string GetFrozenKerbalDetails(ProtoCrewMember kerbal)
 {
     try
     {
         string rosterDetails = "";
         if (!DfWrapper.ApiReady)
         {
             DfWrapper.InitDfWrapper();
         }
         if (DfWrapper.ApiReady)
         {
             rosterDetails = DfWrapper.DeepFreezeApi.FrozenKerbals.ContainsKey(kerbal.name)
     ? $"{SmUtils.SmTags["#smloc_roster_015"]} - {DfWrapper.DeepFreezeApi.FrozenKerbals[kerbal.name].VesselName.Replace("(unloaded)", "")}"
     : SmUtils.SmTags["#smloc_roster_015"];
         }
         return(rosterDetails);
     }
     catch (Exception ex)
     {
         if (!SMAddon.FrameErrTripped)
         {
             SmUtils.LogMessage($" in GetRosterList().\r\nError:  {ex}", SmUtils.LogType.Error, true);
         }
         return($"{SmUtils.SmTags["#smloc_error_001"]}:"); // "Display Error"
     }
 }
Пример #4
0
        static ClsClient()
        {
            try
            {
                // Original call.  deep dives into all assemblies...
                //Type cls_type = AssemblyLoader
                //  .loadedAssemblies
                //  .SelectMany(a => a.assembly.GetExportedTypes())
                //  .SingleOrDefault(t => t.FullName == "ConnectedLivingSpace.CLSAddon");

                // this replacement call attempts to filter dynamic assemblies...  Dot.Net 2.0 vs Dot.Net 4.0
                //Type newType = AssemblyLoader
                //  .loadedAssemblies.Where(a => a.assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder == false)
                //  .SelectMany(a => a.assembly.GetExportedTypes())
                //  .SingleOrDefault(t => t.FullName == "ConnectedLivingSpace.CLSAddon");

                // Lighter weight, and should not "dive into" assemblies unnecessarily.
                Type clsType =
                    AssemblyLoader.loadedAssemblies.Where(a => a.name.Contains("ConnectedLivingSpace"))
                    .SelectMany(a => a.assembly.GetExportedTypes())
                    .SingleOrDefault(t => t.FullName == "ConnectedLivingSpace.CLSAddon");

                if (clsType != null)
                {
                    _cls = clsType.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static);
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage($"Cannot load CLS assembly.  Error:  {ex}", SmUtils.LogType.Error, false);
            }
        }
Пример #5
0
        internal void CrewTransferStopAction()
        {
            // This adds the kerbal(s) to the destination part(s)
            try
            {
                // Add Source Crewmember to target part
                if (FromCrewMember != null && ToPart.CrewCapacity > ToPart.protoModuleCrew.Count)
                {
                    AddCrewMember(FromCrewMember, ToPart, ToSeat);
                }

                // Add Target Crewmember to source part
                if (ToCrewMember != null && FromPart.CrewCapacity > FromPart.protoModuleCrew.Count)
                {
                    AddCrewMember(ToCrewMember, FromPart, FromSeat);
                }

                SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true;
                SMAddon.FireEventTriggers();
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
            }
        }
Пример #6
0
        internal static void TransferScienceLab(PartModule source, PartModule target, Selection sel)
        {
            try
            {
                // Create lookup list to avoid a slow linear search for each item
                // Value is number of labs that have processed it
                // (would allow to only move data not processed in all labs if there are multiple)
                Dictionary <string, int>            processedScience = new Dictionary <string, int>();
                List <ModuleScienceLab> .Enumerator labs             = SMAddon.SmVessel.Vessel.FindPartModulesImplementing <ModuleScienceLab>().GetEnumerator();
                while (labs.MoveNext())
                {
                    List <string> .Enumerator dataitems = labs.Current.ExperimentData.GetEnumerator();
                    while (dataitems.MoveNext())
                    {
                        if (!processedScience.ContainsKey(dataitems.Current))
                        {
                            processedScience.Add(dataitems.Current, 1);
                        }
                        else
                        {
                            processedScience[dataitems.Current]++;
                        }
                    }
                    dataitems.Dispose();
                }
                labs.Dispose();

                ScienceData[] moduleScience = (IScienceDataContainer)source != null ? ((IScienceDataContainer)source).GetData() : null;

                if (moduleScience == null || moduleScience.Length <= 0)
                {
                    return;
                }
                IEnumerator dataItems = moduleScience.GetEnumerator();
                while (dataItems.MoveNext())
                {
                    if (dataItems.Current == null)
                    {
                        continue;
                    }
                    ScienceData data      = (ScienceData)dataItems.Current;
                    bool        processed = processedScience.ContainsKey(data.subjectID);

                    if ((sel == Selection.OnlyProcessed && processed) ||
                        (sel == Selection.OnlyUnprocessed && !processed))
                    {
                        if (((ModuleScienceContainer)target).AddData(data))
                        {
                            ((IScienceDataContainer)source).DumpData(data);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage($" in ProcessController.TransferScienceLab:  Error:  {ex}", SmUtils.LogType.Info, SMSettings.VerboseLogging);
            }
        }
Пример #7
0
        internal static void Savelog()
        {
            try
            {
                // time to create a file...
                string filename = $"DebugLog_{DateTime.Now.ToString(CultureInfo.InvariantCulture).Replace(" ", "_").Replace("/", "").Replace(":", "")}.txt";

                string path = Directory.GetCurrentDirectory() + @"\GameData\ShipManifest\";
                if (SMSettings.DebugLogPath.StartsWith(@"\\"))
                {
                    SMSettings.DebugLogPath = SMSettings.DebugLogPath.Substring(2, SMSettings.DebugLogPath.Length - 2);
                }
                else if (SMSettings.DebugLogPath.StartsWith(@"\"))
                {
                    SMSettings.DebugLogPath = SMSettings.DebugLogPath.Substring(1, SMSettings.DebugLogPath.Length - 1);
                }

                if (!SMSettings.DebugLogPath.EndsWith(@"\"))
                {
                    SMSettings.DebugLogPath += @"\";
                }

                filename = path + SMSettings.DebugLogPath + filename;
                SmUtils.LogMessage($"File Name = {filename}", SmUtils.LogType.Info, true);

                try
                {
                    StringBuilder             sb    = new StringBuilder();
                    List <string> .Enumerator lines = SmUtils.LogItemList.GetEnumerator();
                    while (lines.MoveNext())
                    {
                        if (lines.Current == null)
                        {
                            continue;
                        }
                        sb.AppendLine(lines.Current);
                    }
                    lines.Dispose();

                    File.WriteAllText(filename, sb.ToString());

                    SmUtils.LogMessage("File written", SmUtils.LogType.Info, true);
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage($"Error Writing File:  {ex}", SmUtils.LogType.Error, true);
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage($" in Savelog.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error,
                                   true);
            }
        }
Пример #8
0
        internal static void Display(Vector2 displayViewerPosition)
        {
            //float scrollX = WindowControl.Position.x + 10;
            //float scrollY = WindowControl.Position.y + 50 - displayViewerPosition.y;
            float scrollX = 10;
            float scrollY = 50 - displayViewerPosition.y;

            // Reset Tooltip active flag...
            ToolTipActive             = false;
            SMHighlighter.IsMouseOver = false;

            GUILayout.BeginVertical();
            GUI.enabled = true;
            //GUILayout.Label("Science Lab Control Center ", SMStyle.LabelTabHeader);
            GUILayout.Label(SmUtils.Localize("#smloc_control_lab_000"), SMStyle.LabelTabHeader);
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(350));
            string step = "start";

            try
            {
                // Display all Labs
                List <ModuleScienceLab> .Enumerator iLabs = SMAddon.SmVessel.Labs.GetEnumerator();
                while (iLabs.MoveNext())
                {
                    if (iLabs.Current == null)
                    {
                        continue;
                    }

                    step        = "gui enable";
                    GUI.enabled = true;
                    string label = $"{iLabs.Current.name} - ({(iLabs.Current.IsOperational() ? SmUtils.Localize("#smloc_control_lab_001") : SmUtils.Localize("#smloc_control_lab_002"))})"; // Operational, InOp
                    GUILayout.Label(label, GUILayout.Width(260), GUILayout.Height(40));

                    Rect rect = GUILayoutUtility.GetLastRect();
                    if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition))
                    {
                        SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, iLabs.Current.part);
                    }
                }
                iLabs.Dispose();

                // Display MouseOverHighlighting, if any
                SMHighlighter.MouseOverHighlight();
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $" in Solar Panel Tab at step {step}.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                    SmUtils.LogType.Error, true);
            }
            GUILayout.EndVertical();
        }
Пример #9
0
        internal static void TransferScience(PartModule source, PartModule target)
        {
            try
            {
                ScienceData[] moduleScience = (IScienceDataContainer)source != null ? ((IScienceDataContainer)source).GetData() : null;

                if (moduleScience == null || moduleScience.Length <= 0)
                {
                    return;
                }
                //Utilities.LogMessage("ProcessController.TransferScience:  moduleScience has data...", Utilities.LogType.Info,
                //  SMSettings.VerboseLogging);

                if ((IScienceDataContainer)target == null)
                {
                    return;
                }
                // Lets store the data from the source.
                if (!((ModuleScienceContainer)target).StoreData(
                        new List <IScienceDataContainer> {
                    (IScienceDataContainer)source
                }, false))
                {
                    return;
                }

                //Utilities.LogMessage("ProcessController.TransferScience:  ((ModuleScienceContainer)source) data stored",
                //  "Info", SMSettings.VerboseLogging);
                IEnumerator dataItems = moduleScience.GetEnumerator();
                while (dataItems.MoveNext())
                {
                    if (dataItems.Current == null)
                    {
                        continue;
                    }
                    ScienceData data = (ScienceData)dataItems.Current;
                    ((IScienceDataContainer)source).DumpData(data);
                }

                if (!SMSettings.RealControl)
                {
                    ((ModuleScienceExperiment)source).ResetExperiment();
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage($" in ProcessController.TransferScience:  Error:  {ex}", SmUtils.LogType.Info, SMSettings.VerboseLogging);
            }
        }
Пример #10
0
        internal static void DumpResources(List <TransferPump> pumps)
        {
            // This initiates the Dump process and with realism off, does the dump immediately; with realism on, initiates the real time process.
            try
            {
                if (SMSettings.RealXfers)
                {
                    // Turn on Pumps for timed process...
                    List <TransferPump> .Enumerator epumps = pumps.GetEnumerator();
                    while (epumps.MoveNext())
                    {
                        if (epumps.Current == null)
                        {
                            continue;
                        }
                        TransferPump pump = epumps.Current;
                        pump.PumpRatio = 1;
                        pump.IsPumpOn  = true;
                    }
                    epumps.Dispose();
                    // Add pumps to pump queue
                    SMAddon.SmVessel.TransferPumps.AddRange(pumps);

                    // Start the process.  This flag is checked in SMAddon.Update()
                    TransferPump.PumpProcessOn = true;
                }
                else
                {
                    List <TransferPump> .Enumerator epumps = pumps.GetEnumerator();
                    while (epumps.MoveNext())
                    {
                        if (epumps.Current == null)
                        {
                            continue;
                        }
                        TransferPump pump = epumps.Current;
                        pump.RunPumpCycle(pump.PumpAmount);
                    }
                    epumps.Dispose();
                    SMAddon.SmVessel.TransferPumps.Clear();
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $" in  ProcessController.DumpResources.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                    SmUtils.LogType.Error, true);
            }
        }
Пример #11
0
        internal static void MouseOverHighlight(Part part)
        {
            string step = "begin";

            try
            {
                step = "inside box - Part Selection?";
                SetPartHighlight(part, SMSettings.Colors[SMSettings.MouseOverColor]);
                EdgeHighight(part, true);
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage($" in SMHighlighter.MouseOverHighlight at step {step}.  Error:  {ex}",
                                   SmUtils.LogType.Error, true);
            }
        }
Пример #12
0
 internal static void HireKerbal(ProtoCrewMember kerbal)
 {
     try
     {
         if (kerbal.type != ProtoCrewMember.KerbalType.Applicant)
         {
             throw new Exception("Tried to hire a kerbal which isn't an Applicant: " + kerbal.ToString());
         }
         HighLogic.CurrentGame.CrewRoster.HireApplicant(kerbal);
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage($" in HireKerbal.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                            SmUtils.LogType.Error, true);
     }
 }
Пример #13
0
        internal static bool CanShowShipManifest(bool ignoreShowSm = false)
        {
            try
            {
                bool canShow = false;
                if (SMAddon.ShowUi &&
                    HighLogic.LoadedScene == GameScenes.FLIGHT &&
                    !IsPauseMenuOpen() &&
                    !IsFlightDialogDisplaying() &&
                    FlightGlobals.fetch != null &&
                    FlightGlobals.ActiveVessel != null &&
                    !FlightGlobals.ActiveVessel.isEVA &&
                    FlightGlobals.ActiveVessel.vesselType != VesselType.Flag
                    //&& FlightGlobals.ActiveVessel.vesselType != VesselType.Debris
                    //&& FlightGlobals.ActiveVessel.vesselType != VesselType.Unknown
                    //&& CameraManager.Instance.currentCameraMode != CameraManager.CameraMode.IVA
                    )
                {
                    canShow = ignoreShowSm || WindowManifest.ShowWindow;
                }
                return(canShow);
            }
            catch (Exception ex)
            {
                if (!SMAddon.FrameErrTripped)
                {
                    string values = $"SmAddon.ShowUI = {SMAddon.ShowUi}\r\n";
                    values += $"HighLogic.LoadedScene = {HighLogic.LoadedScene}\r\n";
                    values += $"PauseMenu.isOpen = {IsPauseMenuOpen()}\r\n";
                    values += $"FlightResultsDialog.isDisplaying = {IsFlightDialogDisplaying()}\r\n";
                    values += $"FlightGlobals.fetch != null = {(FlightGlobals.fetch != null)}\r\n";
                    values += $"FlightGlobals.ActiveVessel != null = {(FlightGlobals.ActiveVessel != null)}\r\n";
                    values += $"!FlightGlobals.ActiveVessel.isEVA = {(FlightGlobals.ActiveVessel != null && FlightGlobals.ActiveVessel.isEVA)}\r\n";
                    if (FlightGlobals.ActiveVessel != null)
                    {
                        values += $"FlightGlobals.ActiveVessel.vesselType = {FlightGlobals.ActiveVessel.vesselType}\r\n";
                    }
                    values += $"CameraManager.Instance.currentCameraMode != CameraManager.CameraMode.IVA = {(CameraManager.Instance.currentCameraMode != CameraManager.CameraMode.IVA)}";

                    SmUtils.LogMessage(
                        $" in CanShowShipManifest (repeating error).  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}\r\n\r\nValues:  {values}", SmUtils.LogType.Error, true);
                    SMAddon.FrameErrTripped = true;
                }
                return(false);
            }
        }
Пример #14
0
 internal static void RepairKerbal(ProtoCrewMember kerbal)
 {
     try
     {
         if (!SMConditions.KerbalIsBroken(kerbal))
         {
             throw new Exception("Tried to repair an unbroken kerbal: " + kerbal.ToString());
         }
         // For now, the only broken Kerbals are "Assigned" but for some reason are still Applicants. So we convert them to Crew.
         kerbal.type = ProtoCrewMember.KerbalType.Crew;
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage($" in RepairKerbal.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                            SmUtils.LogType.Error, true);
     }
 }
Пример #15
0
 internal static void GetRosterList()
 {
     try
     {
         RosterList.Clear();
         RosterList = HighLogic.CurrentGame.CrewRoster.Crew.ToList();
         // Support for DeepFreeze
         if (InstalledMods.IsDfInstalled && DfWrapper.ApiReady)
         {
             RosterList.AddRange(HighLogic.CurrentGame.CrewRoster.Unowned);
         }
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage($"Error in GetRosterList().\r\nError:  {ex}", SmUtils.LogType.Error, true);
     }
 }
Пример #16
0
        /// <summary>
        ///   This method is called by WindowTransfer.Xferbutton press.
        /// </summary>
        /// <param name="xferPumps"></param>
        internal static void TransferResources(List <TransferPump> xferPumps)
        {
            try
            {
                if (SMSettings.RealXfers)
                {
                    List <TransferPump> .Enumerator pumps = xferPumps.GetEnumerator();
                    while (pumps.MoveNext())
                    {
                        if (pumps.Current == null)
                        {
                            continue;
                        }
                        TransferPump pump = pumps.Current;
                        pump.IsPumpOn = true;
                    }
                    pumps.Dispose();
                    // now lets start the pumping process...
                    SMAddon.SmVessel.TransferPumps.AddRange(xferPumps);

                    // Start the process.  This flag is checked in SMAddon.Update()
                    TransferPump.PumpProcessOn = true;
                }
                else
                {
                    //Not in Realism mode, so just move the resource...
                    List <TransferPump> .Enumerator pumps = xferPumps.GetEnumerator();
                    while (pumps.MoveNext())
                    {
                        if (pumps.Current == null)
                        {
                            continue;
                        }
                        TransferPump pump = pumps.Current;
                        pump.RunPumpCycle(pump.PumpAmount);
                    }
                    pumps.Dispose();
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $" in  ProcessController.TransferResources.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                    SmUtils.LogType.Error, true);
            }
        }
Пример #17
0
        private static void PreLaunchGui()
        {
            try
            {
                if (SMSettings.EnablePfCrews)
                {
                    GUILayout.BeginHorizontal();
                    // Realism Mode is desirable, as there is a cost associated with a kerbal on a flight.   No cheating!
                    if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_005"), SMStyle.ButtonStyle, GUILayout.Width(134), GUILayout.Height(20))) // "Fill Crew"
                    {
                        SMAddon.SmVessel.FillCrew();
                    }
                    if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_006"), SMStyle.ButtonStyle, GUILayout.Width(134), GUILayout.Height(20))) // "Empty Crew"
                    {
                        SMAddon.SmVessel.EmptyCrew();
                    }
                    GUILayout.EndHorizontal();
                }

                if (!SMSettings.EnablePfResources)
                {
                    return;
                }
                GUILayout.BeginHorizontal();
                if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_007"), SMStyle.ButtonStyle, GUILayout.Width(134), GUILayout.Height(20))) // "Fill Resources"
                {
                    SMAddon.SmVessel.FillResources();
                }
                if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_008"), SMStyle.ButtonStyle, GUILayout.Width(134), GUILayout.Height(20))) // "Empty Resources"
                {
                    SMAddon.SmVessel.DumpAllResources();
                }
                GUILayout.EndHorizontal();
            }
            catch (Exception ex)
            {
                if (!SMAddon.FrameErrTripped)
                {
                    SmUtils.LogMessage(
                        $" in PreLaunchGui.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                        SmUtils.LogType.Error, true);
                    SMAddon.FrameErrTripped = true;
                }
            }
        }
Пример #18
0
 internal void CrewTransferStartAction()
 {
     // This removes the kerbal(s) from the current (source) part(s)
     if (FromCrewMember != null)
     {
         try
         {
             if (FromCrewMember != null)
             {
                 RemoveCrewMember(FromCrewMember, FromPart);
             }
             if (ToCrewMember != null)
             {
                 RemoveCrewMember(ToCrewMember, ToPart);
             }
             //SMAddon.FireEventTriggers();
         }
         catch (Exception ex)
         {
             SmUtils.LogMessage(
                 $"in CrewTransferStartAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                 SmUtils.LogType.Error, true);
         }
     }
     else
     {
         // Must be multi-crew...
         try
         {
             foreach (var xferCrew in CrewMembersToTransfer)
             {
                 //RemoveCrewMember(xferCrew.kerbal, xferCrew.partSource);
             }
             //if (FromCrewMembers != null) RemoveCrewMembers(FromCrewMembers, FromParts);
             //SMAddon.FireEventTriggers();
         }
         catch (Exception ex)
         {
             SmUtils.LogMessage(
                 $"in CrewTransferStartAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                 SmUtils.LogType.Error, true);
         }
     }
 }
Пример #19
0
 internal void CrewTransferStartAction()
 {
     // This removes the kerbal(s) from the current (source) part(s)
     try
     {
         if (FromCrewMember != null)
         {
             RemoveCrewMember(FromCrewMember, FromPart);
         }
         if (ToCrewMember != null)
         {
             RemoveCrewMember(ToCrewMember, ToPart);
         }
         SMAddon.FireEventTriggers();
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage(
             $"in CrewTransferStartAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
     }
 }
Пример #20
0
 internal static void SetPartHighlight(Part part, Color color)
 {
     if (part == null)
     {
         return;
     }
     try
     {
         if (!part.HighlightActive)
         {
             part.SetHighlight(true, false);
         }
         part.highlightType = Part.HighlightType.AlwaysOn;
         part.SetHighlightColor(color);
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage(
             $" in  SetPartHighlight.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
     }
 }
Пример #21
0
        internal static void ThawKerbal(string kerbalName)
        {
            try
            {
                if (InstalledMods.IsDfApiReady)
                {
                    DfWrapper.KerbalInfo iKerbal = DfWrapper.DeepFreezeApi.FrozenKerbals[kerbalName];

                    List <Part> .Enumerator cryofreezers = SmUtils.GetFreezerParts().GetEnumerator();
                    while (cryofreezers.MoveNext())
                    {
                        if (cryofreezers.Current == null)
                        {
                            continue;
                        }
                        if (cryofreezers.Current.flightID == iKerbal.PartId)
                        {
                            // ReSharper disable once SuspiciousTypeConversion.Global
                            PartModule deepFreezer = SMConditions.GetFreezerModule(cryofreezers.Current);
                            if (deepFreezer != null)
                            {
                                new DfWrapper.DeepFreezer(deepFreezer).BeginThawKerbal(kerbalName);
                            }
                            break;
                        }
                    }
                    cryofreezers.Dispose();
                }
                else
                {
                    SmUtils.LogMessage($"ThawKerbal.  IsDFInstalled:  {InstalledMods.IsDfInstalled}", SmUtils.LogType.Info,
                                       true);
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage($" in ThawKerbal.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                                   SmUtils.LogType.Error, true);
            }
        }
Пример #22
0
 internal static void HighlightClsVessel(bool enabled, bool force = false)
 {
     try
     {
         if (SMAddon.ClsAddon.Vessel == null)
         {
             SMAddon.UpdateClsSpaces();
         }
         if (SMAddon.ClsAddon.Vessel == null)
         {
             return;
         }
         List <ICLSSpace> .Enumerator spaces = SMAddon.ClsAddon.Vessel.Spaces.GetEnumerator();
         while (spaces.MoveNext())
         {
             if (spaces.Current == null)
             {
                 continue;
             }
             List <ICLSPart> .Enumerator parts = spaces.Current.Parts.GetEnumerator();
             while (parts.MoveNext())
             {
                 parts.Current?.Highlight(enabled, force);
             }
             parts.Dispose();
         }
         spaces.Dispose();
     }
     catch (Exception ex)
     {
         if (!SMAddon.FrameErrTripped)
         {
             SmUtils.LogMessage(
                 $" in HighlightCLSVessel (repeating error).  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
             SMAddon.FrameErrTripped = true;
         }
     }
 }
Пример #23
0
 internal static void GetRosterList()
 {
     try
     {
         RosterList.Clear();
         var  roster         = HighLogic.CurrentGame.CrewRoster;
         bool haveDeepFreeze = InstalledMods.IsDfInstalled && DfWrapper.ApiReady;
         for (int c = 0; c < roster.Count; c++)
         {
             // Filter out unowned kerbals if we don't have DeepFreeze
             // TODO: Perhaps we should allow editing of these Kerbals anyway?
             var kerbal = roster[c];
             if (kerbal.type == ProtoCrewMember.KerbalType.Unowned && !haveDeepFreeze)
             {
                 continue;
             }
             RosterList.Add(kerbal);
         }
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage($"Error in GetRosterList().\r\nError:  {ex}", SmUtils.LogType.Error, true);
     }
 }
Пример #24
0
 internal static void SetPartsHighlight(List <Part> parts, Color color, bool force = false)
 {
     try
     {
         List <Part> .Enumerator list = parts.GetEnumerator();
         while (list.MoveNext())
         {
             if (list.Current == null)
             {
                 continue;
             }
             if (!list.Current.HighlightActive || force)
             {
                 SetPartHighlight(list.Current, color);
             }
         }
         list.Dispose();
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage(
             $" in  SetPartsHighlight.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
     }
 }
Пример #25
0
        internal void CrewTransferAction()
        {
            try
            {
                // Both parts have internal models...
                if (FromPart.internalModel != null && ToPart.internalModel != null)
                {
                    if (ToSeat.taken)
                    {
                        // Remove the crew members from the part(s)...
                        RemoveCrewMember(FromCrewMember, FromPart);

                        // Swap places if there is no standing room available
                        if (ToPart.CrewCapacity == ToPart.protoModuleCrew.Count)
                        {
                            RemoveCrewMember(ToCrewMember, ToPart);
                            FromPart.AddCrewmemberAt(ToCrewMember, FromPart.internalModel.seats.IndexOf(FromSeat));
                            // Add the crew members back into the part(s) at their new seats.
                            ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
                        }
                        else
                        {
                            // Just move.
                            RemoveCrewMember(FromCrewMember, FromPart);
                            AddCrewMember(FromCrewMember, ToPart);
                        }
                        SMAddon.FireEventTriggers();
                    }
                    else
                    {
                        // Just move.
                        RemoveCrewMember(FromCrewMember, FromPart);
                        ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
                        SMAddon.FireEventTriggers();
                    }
                }
                else // one or both parts do not have an internal model
                {
                    // no portraits, so let's just move kerbals...
                    if (ToCrewMember != null)
                    {
                        RemoveCrewMember(FromCrewMember, FromPart);
                        RemoveCrewMember(ToCrewMember, ToPart);
                        AddCrewMember(FromCrewMember, ToPart);
                        AddCrewMember(ToCrewMember, FromPart);
                    }
                    else
                    {
                        RemoveCrewMember(FromCrewMember, FromPart);
                        AddCrewMember(FromCrewMember, ToPart);
                    }
                    SMAddon.FireEventTriggers();
                }
                if (SMSettings.EnableStockCrewXfer)
                {
                    // Now let's deal with third party mod support...
                    SourceAction        = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart);
                    FireSourceXferEvent = true;

                    //If a swap, we need to handle that too...
                    if (ToCrewMember != null)
                    {
                        TargetAction        = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart);
                        FireTargetXferEvent = true;
                    }
                }

                FromPart.vessel.SpawnCrew();

                // not sure if these help.   We have been experiencing issues with "ghost" kerbals & EVAs/docking/undocking after Crew Moves.
                // trying this to see if it "cleans up" any internal tracking inside of KSP...
                FromPart.RegisterCrew();
                ToPart.RegisterCrew();

                SMAddon.SmVessel.RespawnCrew();
                SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true;
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
            }
        }
Пример #26
0
        internal void CrewTransferStopAction()
        {
            // This adds the kerbal(s) to the destination part(s)
            if (FromCrewMember != null)
            {
                try
                {
                    // Add Source Crewmember to target part
                    if (FromCrewMember != null && ToPart.CrewCapacity > ToPart.protoModuleCrew.Count)
                    {
                        AddCrewMember(FromCrewMember, ToPart, ToSeat);
                    }

                    // Add Target Crewmember to source part
                    if (ToCrewMember != null && FromPart.CrewCapacity > FromPart.protoModuleCrew.Count)
                    {
                        AddCrewMember(ToCrewMember, FromPart, FromSeat);
                    }
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                        SmUtils.LogType.Error, true);
                }
            }
            else
            {
                // Must be multi-crew...
                try
                {
                    List <Part> .Enumerator toPart = ToParts.GetEnumerator();
                    int crewIdx = 0;
                    while (toPart.MoveNext())
                    {
                        if (toPart.Current == null)
                        {
                            continue;
                        }
                        // Add Source Crewmember(s) to target part
                        if (toPart.Current.CrewCapacity <= toPart.Current.protoModuleCrew.Count)
                        {
                            continue;
                        }
                        int space = toPart.Current.CrewCapacity - toPart.Current.protoModuleCrew.Count;
                        for (int idx = 0; idx < space; idx++)
                        {
                            if (crewIdx > FromCrewMembers.Count - 1)
                            {
                                break;
                            }
                            AddCrewMember(FromCrewMembers[crewIdx], toPart.Current);
                            crewIdx++;
                        }
                    }
                    toPart.Dispose();
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                        SmUtils.LogType.Error, true);
                }
            }
        }
Пример #27
0
        internal void CrewTransferProcesses()
        {
            try
            {
                if (!CrewXferActive)
                {
                    return;
                }
                if (CameraManager.Instance.currentCameraMode == CameraManager.CameraMode.IVA)
                {
                    ScreenMessages.PostScreenMessage("<color=orange>Cannot go IVA.  An SM Crew Xfer is in progress</color>", 4f);
                    CameraManager.Instance.SetCameraMode(CameraManager.CameraMode.Flight);
                }

                switch (CrewXferState)
                {
                case XferState.Off:
                    // We're just starting loop, so set some evnironment stuff.
                    // We want to run the start sound no matter what the realism settings are
                    // to give an audio indication to the player that the process is active
                    Timestamp = DateTime.Now;
                    SMSound.SourceCrewStart.Play();
                    CrewXferState = XferState.Start;
                    break;

                case XferState.Start:

                    SMAddon.Elapsed += (DateTime.Now - Timestamp).TotalSeconds;

                    if (SMSettings.RealXfers)
                    {
                        // Play run sound when start sound is nearly done. (repeats)
                        if (SMAddon.Elapsed >= SMSound.ClipPumpStart.length - 0.25)
                        {
                            SMSound.SourceCrewStart.Stop();
                            SMSound.SourceCrewRun.Play();
                            SMAddon.Elapsed = 0;
                            CrewXferState   = XferState.Transfer;
                        }
                    }
                    else
                    {
                        CrewXferState = XferState.Transfer;
                    }
                    break;

                case XferState.Transfer:

                    SMAddon.Elapsed += (DateTime.Now - Timestamp).TotalSeconds;

                    if (SMSettings.RealXfers)
                    {
                        // wait for movement to end...
                        if (SMAddon.Elapsed >= CrewXferDelaySec || (IsSeat2SeatXfer && SMAddon.Elapsed > Seat2SeatXferDelaySec))
                        {
                            CrewXferState = XferState.Stop;
                            CrewTransferStartAction();
                        }
                    }
                    else
                    {
                        if (SMAddon.Elapsed > 1)
                        {
                            CrewXferState = XferState.Stop;
                        }
                    }
                    break;

                case XferState.Stop:

                    // Spawn crew in parts and in vessel.
                    if (SMSettings.RealXfers)
                    {
                        // play crew sit.
                        SMSound.SourceCrewRun.Stop();
                        SMSound.SourceCrewStop.Play();
                    }
                    CrewTransferStartAction();
                    CrewTransferStopAction();
                    Vessel.CrewWasModified(SMAddon.SmVessel.Vessel);
                    SMAddon.SmVessel.Vessel.DespawnCrew();
                    SMAddon.Elapsed = 0;
                    CrewXferState   = XferState.Portraits;
                    IvaDelayActive  = true;
                    break;

                case XferState.Portraits:

                    // Account for crew move callbacks by adding a frame delay for portrait updates after crew move...
                    SMAddon.SmVessel.Vessel.SpawnCrew();
                    if (IvaDelayActive && IvaPortraitDelay < SMSettings.IvaUpdateFrameDelay)
                    {
                        IvaPortraitDelay += 1;
                    }
                    else if ((IvaDelayActive && IvaPortraitDelay >= SMSettings.IvaUpdateFrameDelay) || !IvaDelayActive)
                    {
                        if (IsStockXfer)
                        {
                            ScreenMessages.PostScreenMessage(
                                $"<color=yellow>{FromCrewMember.name} moved (by SM) to {ToPart.partInfo.title}.</color>", 5f);
                        }

                        ResetXferProcess();
                    }
                    break;
                }
                if (CrewXferState != XferState.Off)
                {
                    Timestamp = DateTime.Now;
                }
            }
            catch (Exception ex)
            {
                if (!SMAddon.FrameErrTripped)
                {
                    SmUtils.LogMessage($"Transfer State:  {CrewXferState}...", SmUtils.LogType.Error, true);
                    SmUtils.LogMessage(
                        $" in CrewTransferProcess (repeating error).  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
                    SMAddon.FrameErrTripped = true;
                    ResetXferProcess();
                }
            }
        }
Пример #28
0
        internal static void Display(Vector2 displayViewerPosition)
        {
            //float scrollX = WindowControl.Position.x;
            //float scrollY = WindowControl.Position.y + 50 - displayViewerPosition.y;
            float scrollX = 0;
            float scrollY = displayViewerPosition.y;

            // Reset Tooltip active flag...
            ToolTipActive             = false;
            SMHighlighter.IsMouseOver = false;

            GUILayout.BeginVertical();
            GUI.enabled = true;
            GUILayout.Label(
                //InstalledMods.IsRtInstalled ? "Antenna Control Center  (RemoteTech detected)" : "Antenna Control Center ",
                InstalledMods.IsRtInstalled ? SmUtils.Localize("#smloc_control_antenna_001") : SmUtils.Localize("#smloc_control_antenna_000"),
                SMStyle.LabelTabHeader);
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));
            string step = "start";

            try
            {
                // Display all antennas
                List <ModAntenna> .Enumerator iAntennas = SMAddon.SmVessel.Antennas.GetEnumerator();
                while (iAntennas.MoveNext())
                {
                    if (iAntennas.Current == null)
                    {
                        continue;
                    }
                    if (!IsRtAntennas && iAntennas.Current.IsRtModule)
                    {
                        IsRtAntennas = true;
                    }
                    step = "get Antenna label";
                    string label   = $"{iAntennas.Current.AntennaStatus} - {iAntennas.Current.Title}";
                    bool   open    = iAntennas.Current.Extended;
                    bool   newOpen = GUILayout.Toggle(open, label, GUILayout.Width(guiToggleWidth), GUILayout.Height(40));
                    step = "button toggle check";
                    if (!open && newOpen)
                    {
                        iAntennas.Current.ExtendAntenna();
                    }
                    else if (open && !newOpen)
                    {
                        iAntennas.Current.RetractAntenna();
                    }

                    Rect rect = GUILayoutUtility.GetLastRect();
                    if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition))
                    {
                        SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, iAntennas.Current.SPart, Event.current.mousePosition);
                    }
                }
                iAntennas.Dispose();

                // Display MouseOverHighlighting, if any
                SMHighlighter.MouseOverHighlight();
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $" in Antenna Tab at step {step}.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                    SmUtils.LogType.Error, true);
            }
            GUILayout.EndVertical();
        }
Пример #29
0
        internal static void ResolveResourcePartSelections(List <string> resourceNames)
        {
            try
            {
                if (resourceNames.Count > 0)
                {
                    List <Part> newSources = new List <Part>();
                    List <Part> newTargets = new List <Part>();
                    if (WindowTransfer.ShowSourceVessels &&
                        SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources))
                    {
                        SMAddon.SmVessel.SelectedPartsSource =
                            SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsSource, resourceNames);
                        if (!WindowTransfer.ShowTargetVessels)
                        {
                            List <Part> .Enumerator srcParts = SMAddon.SmVessel.SelectedPartsSource.GetEnumerator();
                            while (srcParts.MoveNext())
                            {
                                if (srcParts.Current == null)
                                {
                                    continue;
                                }
                                if (!SMAddon.SmVessel.SelectedPartsTarget.Contains(srcParts.Current))
                                {
                                    continue;
                                }
                                SMAddon.SmVessel.SelectedPartsTarget.Remove(srcParts.Current);
                            }
                            srcParts.Dispose();
                        }
                    }
                    else
                    {
                        List <Part> .Enumerator parts = SMAddon.SmVessel.SelectedPartsSource.GetEnumerator();
                        while (parts.MoveNext())
                        {
                            if (parts.Current == null)
                            {
                                continue;
                            }
                            if (resourceNames.Count > 1)
                            {
                                if (parts.Current.Resources.Contains(resourceNames[0]) && parts.Current.Resources.Contains(resourceNames[1]))
                                {
                                    newSources.Add(parts.Current);
                                }
                            }
                            else
                            {
                                if (resourceNames[0] == SMConditions.ResourceType.Crew.ToString() && parts.Current.CrewCapacity > 0)
                                {
                                    newSources.Add(parts.Current);
                                }
                                else if (resourceNames[0] == SMConditions.ResourceType.Science.ToString() &&
                                         parts.Current.FindModulesImplementing <IScienceDataContainer>().Count > 0)
                                {
                                    newSources.Add(parts.Current);
                                }
                                else if (parts.Current.Resources.Contains(resourceNames[0]))
                                {
                                    newSources.Add(parts.Current);
                                }
                            }
                        }
                        parts.Dispose();
                        SMAddon.SmVessel.SelectedPartsSource.Clear();
                        SMAddon.SmVessel.SelectedPartsSource = newSources;
                    }

                    if (WindowTransfer.ShowTargetVessels &&
                        SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources))
                    {
                        SMAddon.SmVessel.SelectedPartsTarget =
                            SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsTarget, resourceNames);
                        if (!WindowTransfer.ShowSourceVessels)
                        {
                            List <Part> .Enumerator tgtParts = SMAddon.SmVessel.SelectedPartsTarget.GetEnumerator();
                            while (tgtParts.MoveNext())
                            {
                                if (tgtParts.Current == null)
                                {
                                    continue;
                                }
                                if (!SMAddon.SmVessel.SelectedPartsSource.Contains(tgtParts.Current))
                                {
                                    continue;
                                }
                                SMAddon.SmVessel.SelectedPartsSource.Remove(tgtParts.Current);
                            }
                            tgtParts.Dispose();
                        }
                    }
                    else
                    {
                        List <Part> .Enumerator tgtParts = SMAddon.SmVessel.SelectedPartsTarget.GetEnumerator();
                        while (tgtParts.MoveNext())
                        {
                            if (tgtParts.Current == null)
                            {
                                continue;
                            }
                            if (resourceNames.Count > 1)
                            {
                                if (tgtParts.Current.Resources.Contains(resourceNames[0]) && tgtParts.Current.Resources.Contains(resourceNames[1]))
                                {
                                    newTargets.Add(tgtParts.Current);
                                }
                            }
                            else
                            {
                                if (resourceNames[0] == SMConditions.ResourceType.Crew.ToString() && tgtParts.Current.CrewCapacity > 0)
                                {
                                    newTargets.Add(tgtParts.Current);
                                }
                                else if (resourceNames[0] == SMConditions.ResourceType.Science.ToString() &&
                                         tgtParts.Current.FindModulesImplementing <IScienceDataContainer>().Count > 0)
                                {
                                    newTargets.Add(tgtParts.Current);
                                }
                                else if (tgtParts.Current.Resources.Contains(resourceNames[0]))
                                {
                                    newTargets.Add(tgtParts.Current);
                                }
                            }
                        }
                        tgtParts.Dispose();
                        SMAddon.SmVessel.SelectedPartsTarget.Clear();
                        SMAddon.SmVessel.SelectedPartsTarget = newTargets;
                    }

                    if (SMConditions.AreSelectedResourcesTypeOther(resourceNames))
                    {
                        TransferPump.CreateDisplayPumps();
                        return;
                    }

                    SMAddon.SmVessel.SelectedVesselsSource.Clear();
                    SMAddon.SmVessel.SelectedVesselsTarget.Clear();
                }
                else
                {
                    SMAddon.SmVessel.SelectedPartsSource.Clear();
                    SMAddon.SmVessel.SelectedPartsTarget.Clear();
                    SMAddon.SmVessel.SelectedVesselsSource.Clear();
                    SMAddon.SmVessel.SelectedVesselsTarget.Clear();
                }
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $" in WindowManifest.ReconcileSelectedXferParts.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                    SmUtils.LogType.Error, true); // in, Error
            }
        }
Пример #30
0
        private static void WindowToggleButtons()
        {
            GUILayout.BeginHorizontal();

            GUIStyle settingsStyle = WindowSettings.ShowWindow ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_012"), settingsStyle, GUILayout.Height(20))) // "Settings"
            {
                try
                {
                    WindowSettings.ShowWindow = !WindowSettings.ShowWindow;
                    if (WindowSettings.ShowWindow)
                    {
                        // Store settings in case we cancel later...
                        SMSettings.MemStoreTempSettings();
                    }
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $" opening Settings Window.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error,
                        true);
                }
            }

            GUIStyle rosterStyle = WindowRoster.ShowWindow ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_013"), rosterStyle, GUILayout.Height(20))) // "Roster"
            {
                try
                {
                    WindowRoster.ShowWindow = !WindowRoster.ShowWindow;
                    if (WindowRoster.ShowWindow)
                    {
                        WindowRoster.GetRosterList();
                    }
                    else
                    {
                        WindowRoster.SelectedKerbal = null;
                        WindowRoster.ToolTip        = "";
                    }
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $" opening Roster Window.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error,
                        true);
                }
            }

            GUIStyle controlStyle = WindowControl.ShowWindow ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(SmUtils.Localize("#smloc_manifest_014"), controlStyle, GUILayout.Height(20))) // "Control"
            {
                try
                {
                    WindowControl.ShowWindow = !WindowControl.ShowWindow;
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $" opening Control Window.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error,
                        true);
                }
            }
            GUILayout.EndHorizontal();
        }