internal static void UndockSelectedVessel(ModDockedVessel mVessel) { List <Part> .Enumerator parts = mVessel.VesselParts.GetEnumerator(); while (parts.MoveNext()) { if (parts.Current == null) { continue; } List <ModuleDockingNode> .Enumerator dockingNodes = parts.Current.FindModulesImplementing <ModuleDockingNode>().GetEnumerator(); while (dockingNodes.MoveNext()) { if (dockingNodes.Current == null) { continue; } if (dockingNodes.Current.otherNode == null) { continue; } dockingNodes.Current.Undock(); } dockingNodes.Dispose(); } parts.Dispose(); }
internal static bool IsVesselDocked(ModDockedVessel vessel) { bool result = false; List <Part> .Enumerator parts = vessel.VesselParts.GetEnumerator(); while (parts.MoveNext()) { if (parts.Current == null) { continue; } List <ModuleDockingNode> .Enumerator nodes = parts.Current.FindModulesImplementing <ModuleDockingNode>().GetEnumerator(); while (nodes.MoveNext()) { if (nodes.Current == null) { continue; } if (nodes.Current.otherNode == null) { continue; } result = true; break; } nodes.Dispose(); if (result) { break; } } parts.Dispose(); return(result); }
internal static void CloseVesselHatches(ModDockedVessel mVessel) { // ReSharper disable once ForCanBeConvertedToForeach for (int x = 0; x < SMAddon.SmVessel.Hatches.Count; x++) { ModHatch iHatch = SMAddon.SmVessel.Hatches[x]; if (!mVessel.VesselParts.Contains(iHatch.ClsPart.Part)) { continue; } if (iHatch.HatchOpen) { iHatch.CloseHatch(true); } } }
private void BuildDockedVesselList() { if (_modDockedVessels == null) { _modDockedVessels = new List <ModDockedVessel>(); } else { _modDockedVessels.Clear(); } List <Part> .Enumerator dockingParts = (from p in Vessel.parts where p.Modules.Contains("ModuleDockingNode") select p).ToList().GetEnumerator(); while (dockingParts.MoveNext()) { if (dockingParts.Current == null) { continue; } List <ModuleDockingNode> .Enumerator dNodes = dockingParts.Current.FindModulesImplementing <ModuleDockingNode>().GetEnumerator(); while (dNodes.MoveNext()) { if (dNodes.Current == null) { continue; } if (dNodes.Current.vesselInfo == null) { continue; } ModDockedVessel modDockedVessel = new ModDockedVessel(dNodes.Current); if (modDockedVessel.LaunchId == 0) { continue; } _modDockedVessels.Add(modDockedVessel); } dNodes.Dispose(); } dockingParts.Dispose(); }
private void UpdateDockedVessels() { //Utilities.LogMessage("Entered: SMVessel.UpdateDockedVessels", Utilities.LogType.Info, SMSettings.VerboseLogging); if (FlightGlobals.ActiveVessel == null) return; _dockedVessels = new List<ModDockedVessel>(); List<Part>.Enumerator dockingParts = (from p in Vessel.parts where p.Modules.Contains("ModuleDockingNode") select p).ToList().GetEnumerator(); while (dockingParts.MoveNext()) { if (dockingParts.Current == null) continue; Part dPart = dockingParts.Current; List<PartModule>.Enumerator dNodes = (from PartModule m in dPart.Modules where m.moduleName == "ModuleDockingNode" select m).ToList().GetEnumerator(); while (dNodes.MoveNext()) { if (dNodes.Current == null) continue; PartModule pModule = dNodes.Current; DockedVesselInfo dockedInfo = ((ModuleDockingNode) pModule).vesselInfo; if (dockedInfo == null) continue; ModDockedVessel modDockedVessel = new ModDockedVessel(dockedInfo); List<uint> launchIds = (from m in _dockedVessels where m.LaunchId > 0 select m.LaunchId).ToList(); if (!launchIds.Contains(modDockedVessel.LaunchId)) _dockedVessels.Add(modDockedVessel); } } //Utilities.LogMessage("Exiting: SMVessel.UpdateDockedVessels", Utilities.LogType.Info, SMSettings.VerboseLogging); }
public static void SetMouseOverData(Rect rect, float scrollY, float scrollX, float height, ModDockedVessel vessel, Vector2 mouseposition) { // This must run during onGUI // Note rect.x and rect.y, as well as mouseposition.x and mouseposition.y are with respect to the container withing the scrollviewer. // this means both need to be aware of the viewable box boundaries if (mouseposition.y - scrollY < 0 || mouseposition.y - scrollY > height) { return; } IsMouseOver = true; MouseOverRect = new Rect(rect.x - scrollX, rect.y - scrollY, rect.width, rect.height); MouseOverPart = null; MouseOverParts = vessel.VesselParts; }
public static void SetMouseOverData(Rect rect, float scrollY, float scrollX, float height, ModDockedVessel vessel) { // This must run during onGUI if (rect.y - scrollY < 0 || rect.y - scrollY > height) { return; } IsMouseOver = true; MouseOverRect = new Rect(rect.x - scrollX, rect.y - scrollY, rect.width, rect.height); MouseOverPart = null; MouseOverParts = vessel.VesselParts; }
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; // Reset Tooltip active flag... ToolTipActive = false; _canShowToolTips = WindowSettings.ShowToolTips && ShowToolTips; Position = WindowControl.Position; GUILayout.BeginVertical(); GUI.enabled = true; //GUILayout.Label("Vessel Control Center", SMStyle.LabelTabHeader); GUILayout.Label(SmUtils.SmTags["#smloc_control_vessel_000"], SMStyle.LabelTabHeader); GUILayout.Label("____________________________________________________________________________________________", SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth)); string step = "start"; try { int combineVesselcount = 0; // Display all Vessels Docked together // ReSharper disable once ForCanBeConvertedToForeach for (int v = 0; v < SMAddon.SmVessel.DockedVessels.Count; v++) { ModDockedVessel mdv = SMAddon.SmVessel.DockedVessels[v]; GUI.enabled = mdv.IsDocked; GUILayout.BeginHorizontal(); GUIContent content = new GUIContent("", SmUtils.SmTags["#smloc_control_vessel_tt_001"]); //"Include in list of vessels to combine into a single docked vessel" bool isChecked = mdv.Combine; // temporary commenting of comnbine code to allow release. Will work for next version. //isChecked = GUILayout.Toggle(isChecked, content, GUILayout.Width(20)); if (isChecked) { combineVesselcount += 1; } if (isChecked != mdv.Combine) { mdv.Combine = isChecked; } // temporary commenting to allow release. Will work on comnbine code for next version. //Rect rect = GUILayoutUtility.GetLastRect(); //if (Event.current.type == EventType.Repaint && _canShowToolTips) // ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, scrollX); //if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition)) //{ // SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, mdv, // Event.current.mousePosition); //} content = new GUIContent(SmUtils.SmTags["#smloc_control_vessel_001"], SmUtils.SmTags["#smloc_control_vessel_tt_005"]); if (GUILayout.Button(content, GUILayout.Width(guiBtnWidth))) //"UnDock" { // close hatches If CLS applies if (SMConditions.IsClsEnabled()) { CloseVesselHatches(mdv); } // Decouple/undock selected vessel. UndockSelectedVessel(mdv); } Rect rect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.Repaint && _canShowToolTips) { ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, scrollX); } if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition)) { SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, mdv, Event.current.mousePosition); } GUI.enabled = true; if (mdv.IsEditing) { mdv.RenameVessel = GUILayout.TextField(mdv.RenameVessel, GUILayout.Width(guiLabelWidth - (guiBtnWidth + 5))); } else { GUILayout.Label($"{mdv.VesselInfo.name}", GUILayout.Width(guiLabelWidth)); } rect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition)) { SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, mdv, Event.current.mousePosition); } // now editing buttons. content = mdv.IsEditing ? new GUIContent(SmUtils.SmTags["#smloc_control_vessel_002"], SmUtils.SmTags["#smloc_control_vessel_tt_002"]) : new GUIContent(SmUtils.SmTags["#smloc_control_vessel_003"], SmUtils.SmTags["#smloc_control_vessel_tt_003"]); // "Save" // "Saves the changes to the docked vessel name." // Edit // "Change the docked vessel name." if (GUILayout.Button(content, GUILayout.Width(50))) { if (SMAddon.SmVessel.DockedVessels[v].IsEditing) { mdv.VesselInfo.name = mdv.RenameVessel; mdv.RenameVessel = null; mdv.IsEditing = false; } else { mdv.IsEditing = true; mdv.RenameVessel = SMAddon.SmVessel.DockedVessels[v].VesselInfo.name; } } rect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.Repaint && _canShowToolTips) { ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, scrollX); } if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition)) { SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, mdv, Event.current.mousePosition); } if (mdv.IsEditing) { GUIContent cancelContent = new GUIContent(SmUtils.SmTags["#smloc_control_vessel_004"], SmUtils.SmTags["#smloc_control_vessel_tt_004"]); // "Cancel","Cancel changes to docked vessel name" if (GUILayout.Button(cancelContent, GUILayout.Width(guiBtnWidth))) { mdv.RenameVessel = null; mdv.IsEditing = false; } } rect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.Repaint && _canShowToolTips) { ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, scrollX); } if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition)) { SMHighlighter.SetMouseOverData(rect, scrollY, scrollX, WindowControl.TabBox.height, mdv, Event.current.mousePosition); } GUILayout.EndHorizontal(); } // update static count for control window action buttons. CombineVesselCount = combineVesselcount; // Display MouseOverHighlighting, if any SMHighlighter.MouseOverHighlight(); } catch (Exception ex) { SmUtils.LogMessage( $" in Vessels Tab at step {step}. Error: {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true); } GUI.enabled = true; GUILayout.EndVertical(); }
private void UpdateDockedVessels() { //Utilities.LogMessage("Entered: SMVessel.UpdateDockedVessels", Utilities.LogType.Info, SMSettings.VerboseLogging); if (FlightGlobals.ActiveVessel == null) { return; } _dockedVessels = new List <ModDockedVessel>(); List <Part> .Enumerator dockingParts = (from p in Vessel.parts where p.Modules.Contains("ModuleDockingNode") select p).ToList().GetEnumerator(); while (dockingParts.MoveNext()) { if (dockingParts.Current == null) { continue; } List <ModuleDockingNode> .Enumerator dNodes = dockingParts.Current.FindModulesImplementing <ModuleDockingNode>().GetEnumerator(); while (dNodes.MoveNext()) { if (dNodes.Current == null) { continue; } if (dNodes.Current.vesselInfo == null) { continue; } ModDockedVessel modDockedVessel = new ModDockedVessel(dNodes.Current.vesselInfo); if (modDockedVessel.LaunchId == 0) { continue; } _dockedVessels.Add(modDockedVessel); } dNodes.Dispose(); } dockingParts.Dispose(); // Clean up so we have separate vessels with no overlap. ModDockedVessel master = _dockedVessels.FirstOrDefault(dockedVessel => dockedVessel.Rootpart.parent == null); if (master == null) { return; } List <ModDockedVessel> .Enumerator children = (from vessel in _dockedVessels where vessel.Rootpart.parent != null select vessel).ToList().GetEnumerator(); while (children.MoveNext()) { if (children.Current == null) { continue; } List <Part> .Enumerator parts = children.Current.VesselParts.GetEnumerator(); while (parts.MoveNext()) { if (parts.Current == null) { continue; } if (master.VesselParts.Contains(parts.Current)) { master.VesselParts.Remove(parts.Current); } } parts.Dispose(); } children.Dispose(); //Utilities.LogMessage("Exiting: SMVessel.UpdateDockedVessels", Utilities.LogType.Info, SMSettings.VerboseLogging); }
internal void GetDockedVessels() { if (_dockedVessels == null) { _dockedVessels = new List <ModDockedVessel>(); } else { _dockedVessels.Clear(); } List <Part> .Enumerator dockingParts = (from p in Vessel.parts where p.Modules.Contains("ModuleDockingNode") select p).ToList().GetEnumerator(); while (dockingParts.MoveNext()) { if (dockingParts.Current == null) { continue; } List <ModuleDockingNode> .Enumerator dNodes = dockingParts.Current.FindModulesImplementing <ModuleDockingNode>().GetEnumerator(); while (dNodes.MoveNext()) { if (dNodes.Current == null) { continue; } if (dNodes.Current.vesselInfo == null) { continue; } ModDockedVessel modDockedVessel = new ModDockedVessel(dNodes.Current); if (modDockedVessel.LaunchId == 0) { continue; } modDockedVessel.IsDocked = SMConditions.IsVesselDocked(modDockedVessel); _dockedVessels.Add(modDockedVessel); } dNodes.Dispose(); } dockingParts.Dispose(); //Now lets scrub the list to remove child vessels within the list. // this can happen when multiple decouples and docking occur... List <ModDockedVessel> vesselsToRemove = new List <ModDockedVessel>(); // create vessel list to start wtih List <ModDockedVessel> .Enumerator srcVessels = _dockedVessels.GetEnumerator(); while (srcVessels.MoveNext()) { if (srcVessels.Current == null) { continue; } // create vessel list to compare to bool isUnique = false; List <ModDockedVessel> .Enumerator cmpVessels = _dockedVessels.GetEnumerator(); while (cmpVessels.MoveNext()) { if (cmpVessels.Current == null) { continue; } if (cmpVessels.Current == srcVessels.Current) { continue; } if (vesselsToRemove.Contains(cmpVessels.Current)) { continue; } List <Part> .Enumerator vParts = cmpVessels.Current.VesselParts.GetEnumerator(); while (vParts.MoveNext()) { // if any part of the target is not in the src vessel, the src is not a child of the target vessel. move on. if (srcVessels.Current.VesselParts.Contains(vParts.Current)) { continue; } isUnique = true; break; } vParts.Dispose(); if (isUnique) { continue; } // since we are here, then all parts are in another vessel. this is likely a child. add it to the remove list. vesselsToRemove.Add(cmpVessels.Current); break; } cmpVessels.Dispose(); } srcVessels.Dispose(); if (vesselsToRemove.Count <= 0) { return; } List <ModDockedVessel> .Enumerator remove = vesselsToRemove.GetEnumerator(); while (remove.MoveNext()) { if (remove.Current == null) { continue; } _dockedVessels.Remove(remove.Current); } remove.Dispose(); }