Esempio n. 1
0
 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();
 }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 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);
         }
     }
 }
Esempio n. 4
0
 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();
 }
Esempio n. 5
0
 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);
 }
Esempio n. 6
0
 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;
 }
Esempio n. 7
0
 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;
 }
Esempio n. 8
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;
            // 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();
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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();
        }