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(); }
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); } }
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" } }
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); } }
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); } }
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); } }
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); } }
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(); }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
/// <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); } }
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; } } }
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); } } }
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); } }
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); } }
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); } }
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; } } }
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); } }
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); } }
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); } }
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); } } }
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(); } } }
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(); }
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 } }
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(); }