Exemple #1
0
        internal static void UpdateDisplayPumps()
        {
            // Now lets update the Resource Xfer pumps for display use...
            if (!SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources))
            {
                return;
            }
            if (!WindowTransfer.DisplayPumps.Any())
            {
                CreateDisplayPumps();
            }

            // Lets create a pump Object for managing pump options and data.
            List <Part> sourceParts = WindowTransfer.ShowSourceVessels
        ? SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsSource,
                                                   SMAddon.SmVessel.SelectedResources)
        : SMAddon.SmVessel.SelectedPartsSource;
            List <Part> targetParts = WindowTransfer.ShowTargetVessels
        ? SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsTarget,
                                                   SMAddon.SmVessel.SelectedResources)
        : SMAddon.SmVessel.SelectedPartsTarget;

            List <TransferPump> .Enumerator dPumps = WindowTransfer.DisplayPumps.GetEnumerator();
            while (dPumps.MoveNext())
            {
                if (dPumps.Current == null)
                {
                    continue;
                }
                // Lets update pump data (it persists).
                TransferPump pump = dPumps.Current;
                switch (pump.PumpType)
                {
                case TypePump.Dump:
                case TypePump.SourceToTarget:
                    pump.FromParts = sourceParts;
                    pump.ToParts   = targetParts;
                    break;

                case TypePump.TargetToSource:
                    pump.FromParts = targetParts;
                    pump.ToParts   = sourceParts;
                    break;
                }
                pump.EditSliderAmount =
                    CalcMaxPumpAmt(pump.FromParts, pump.ToParts, SMAddon.SmVessel.SelectedResources)
                    .ToString(CultureInfo.InvariantCulture);
            }
            dPumps.Dispose();
        }
Exemple #2
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);
            }
        }
Exemple #3
0
        internal static void CreateDisplayPumps()
        {
            // Now lets update the Resource Xfer pumps for display use...
            WindowTransfer.DisplayPumps.Clear();
            if (!SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources))
            {
                return;
            }
            // Lets create a pump Object for managing pump options and data.
            List <Part> displaySourceParts = WindowTransfer.ShowSourceVessels
        ? SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsSource,
                                                   SMAddon.SmVessel.SelectedResources)
        : SMAddon.SmVessel.SelectedPartsSource;
            List <Part> displayTargetParts = WindowTransfer.ShowTargetVessels
        ? SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsTarget,
                                                   SMAddon.SmVessel.SelectedResources)
        : SMAddon.SmVessel.SelectedPartsTarget;

            List <string> .Enumerator resources = SMAddon.SmVessel.SelectedResources.GetEnumerator();
            while (resources.MoveNext())
            {
                TransferPump pump1 = new TransferPump
                {
                    Resource         = resources.Current,
                    PumpType         = TypePump.SourceToTarget,
                    PumpAmount       = CalcMaxPumpAmt(displaySourceParts, displayTargetParts, SMAddon.SmVessel.SelectedResources),
                    EditSliderAmount =
                        CalcMaxPumpAmt(displaySourceParts, displayTargetParts, SMAddon.SmVessel.SelectedResources)
                        .ToString(CultureInfo.InvariantCulture),
                    FromParts = displaySourceParts,
                    ToParts   = displayTargetParts
                };
                WindowTransfer.DisplayPumps.Add(pump1);

                TransferPump pump2 = new TransferPump
                {
                    Resource         = resources.Current,
                    PumpType         = TypePump.TargetToSource,
                    PumpAmount       = CalcMaxPumpAmt(displayTargetParts, displaySourceParts, SMAddon.SmVessel.SelectedResources),
                    EditSliderAmount =
                        CalcMaxPumpAmt(displayTargetParts, displaySourceParts, SMAddon.SmVessel.SelectedResources)
                        .ToString(CultureInfo.InvariantCulture),
                    FromParts = displayTargetParts,
                    ToParts   = displaySourceParts
                };
                WindowTransfer.DisplayPumps.Add(pump2);
            }
            resources.Dispose();
        }
Exemple #4
0
        private static bool IsPumpComplete(TransferPump pump)
        {
            bool results = pump.PumpStatus == PumpState.Off ||
                           pump.PumpStatus == PumpState.Stop ||
                           pump.FromIsEmpty ||
                           (pump.PumpType != TypePump.Dump && pump.ToIsFull) ||
                           pump.AmtPumped >= pump.PumpAmount ||
                           pump.PumpAmount - pump.AmtPumped < SMSettings.Tolerance ||
                           (pump.PumpType != TypePump.Dump &&
                            CalcMaxPumpAmt(pump.FromParts, pump.ToParts, new List <string> {
                pump.Resource
            }) <
                            SMSettings.Tolerance);

            return(results);
        }
Exemple #5
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);
            }
        }
Exemple #6
0
        internal static void ProcessActivePumps()
        {
            // This routine acts as a queue
            // WHen a pump is set to IsPumOn = true, it will be processed by this routine.
            //Utilities.LogMessage("Entering:  TransferPump.ProcessActivePumps", Utilities.LogType.Info, SMSettings.VerboseLogging);
            List <TransferPump> pumpsToRemove = new List <TransferPump>();

            // this task runs every Update when active.
            try
            {
                List <TransferPump> .Enumerator tPumps = SMAddon.SmVessel.TransferPumps.GetEnumerator();
                while (tPumps.MoveNext())
                {
                    if (tPumps.Current == null)
                    {
                        continue;
                    }
                    // Check Pump state:
                    if (!tPumps.Current.IsPumpOn)
                    {
                        continue;
                    }
                    TransferPump pump = tPumps.Current;
                    switch (pump.PumpStatus)
                    {
                    case PumpState.Off:
                        //Utilities.LogMessage("Entering:  TransferPump.ProcessActivePumps - Off", Utilities.LogType.Info, SMSettings.VerboseLogging);
                        pump.TimeStamp = DateTime.Now;
                        pump.Start();
                        pump.PumpStatus = PumpState.Start;
                        break;

                    case PumpState.Start:
                        //Utilities.LogMessage("Entering:  TransferPump.ProcessActivePumps - Start", Utilities.LogType.Info, SMSettings.VerboseLogging);
                        // Calculate Elapsed.
                        pump.Elapsed += (DateTime.Now - pump.TimeStamp).TotalSeconds;
                        if (pump.Elapsed >= SMSound.SourcePumpStart.clip.length - 0.25)
                        {
                            pump.Run();
                            pump.PumpStatus = PumpState.Run;
                        }
                        break;

                    case PumpState.Run:
                        //Utilities.LogMessage("Entering:  TransferPump.ProcessActivePumps - Run", Utilities.LogType.Info, SMSettings.VerboseLogging);
                        // 1.  Get Elapsed from last run
                        double deltaT = (DateTime.Now - pump.TimeStamp).TotalSeconds;

                        // 2. Lets wait long enough to get a resource volume worth moving
                        pump.TimeStamp = DateTime.Now;
                        pump.Running(deltaT);
                        break;

                    case PumpState.Stop:
                        //Utilities.LogMessage("Entering:  TransferPump.ProcessActivePumps - Stop", Utilities.LogType.Info, SMSettings.VerboseLogging);
                        pump.Stop();
                        pump.PumpStatus = PumpState.Off;
                        pumpsToRemove.Add(pump);
                        break;
                    }
                }
                tPumps.Dispose();
                if (pumpsToRemove.Count <= 0)
                {
                    return;
                }
                List <TransferPump> .Enumerator rpumps = pumpsToRemove.GetEnumerator();
                while (rpumps.MoveNext())
                {
                    if (rpumps.Current == null)
                    {
                        continue;
                    }
                    SMAddon.SmVessel.TransferPumps.Remove(rpumps.Current);
                }
                rpumps.Dispose();
                pumpsToRemove.Clear();
            }
            catch (Exception ex)
            {
                if (!SMAddon.FrameErrTripped)
                {
                    SMUtils.LogMessage(
                        string.Format(" in TransferPump.ProcessActivePumps (repeating error).  Error:  {0} \r\n\r\n{1}", ex.Message,
                                      ex.StackTrace), SMUtils.LogType.Error, true);
                    SMAddon.FrameErrTripped = true;
                }
            }
            finally
            {
                PumpProcessOn = IsAnyPumpOn();
                UpdateDisplayPumps();
            }
        }
 private static void PartButtonToggled(TransferPump.TypePump pumpType, Part part)
 {
     string step = "Part Button Toggled";
       try
       {
     if (SMConditions.IsTransferInProgress()) return;
     if (pumpType == TransferPump.TypePump.SourceToTarget)
     {
       // Now lets update the list...
       if (SMAddon.SmVessel.SelectedPartsSource.Contains(part))
       {
     SMAddon.SmVessel.SelectedPartsSource.Remove(part);
       }
       else
       {
     if (!SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources))
       SMAddon.SmVessel.SelectedPartsSource.Clear();
     SMAddon.SmVessel.SelectedPartsSource.Add(part);
       }
       if (SMConditions.IsClsActive())
       {
     SMAddon.UpdateClsSpaces();
       }
       SMAddon.SmVessel.SelectedModuleSource = null;
       _scienceModulesSource = null;
     }
     else
     {
       if (SMAddon.SmVessel.SelectedPartsTarget.Contains(part))
       {
     SMAddon.SmVessel.SelectedPartsTarget.Remove(part);
       }
       else
       {
     if (!SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources))
       SMAddon.SmVessel.SelectedPartsTarget.Clear();
     SMAddon.SmVessel.SelectedPartsTarget.Add(part);
       }
       SMAddon.SmVessel.SelectedModuleTarget = null;
     }
     step = "Set Xfer amounts?";
     if (!SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources)) return;
     TransferPump.UpdateDisplayPumps();
       }
       catch (Exception ex)
       {
     if (!SMAddon.FrameErrTripped)
     {
       Utilities.LogMessage(
     "Error in WindowTransfer.PartButtonToggled (" + pumpType + ") at step:  " + step + ".  Error:  " + ex,
     Utilities.LogType.Error, true);
       SMAddon.FrameErrTripped = true;
     }
       }
 }
 internal static bool CanResourceBeXferred(TransferPump.TypePump thisXferMode, double maxXferAmount)
 {
     return (!TransferPump.PumpProcessOn && maxXferAmount > 0) ||
      (TransferPump.PumpProcessOn && SMAddon.ActivePumpType == thisXferMode);
 }
 private static void TextBetweenViewers(IList<Part> selectedParts, TransferPump.TypePump pumpType)
 {
     string labelText = "";
       GUILayout.BeginHorizontal();
       if (SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()))
     labelText = selectedParts.Count > 0 ? string.Format("{0}", selectedParts[0].partInfo.title) : "No Part Selected";
       else
       {
     if (selectedParts != null)
     {
       if (selectedParts.Count > 1)
     labelText = string.Format("{0}", "Multiple Parts Selected");
       else if (selectedParts.Count == 1)
     labelText = string.Format("{0}", selectedParts[0].partInfo.title);
       else
     labelText = string.Format("{0}", "No Part Selected");
     }
       }
       GUILayout.Label(labelText, SMStyle.LabelStyleNoWrap, GUILayout.Width(200));
       if (CanShowVessels())
       {
     if (pumpType == TransferPump.TypePump.SourceToTarget)
     {
       bool prevValue = ShowSourceVessels;
       ShowSourceVessels = GUILayout.Toggle(ShowSourceVessels, "Vessels", GUILayout.Width(90));
       if (!prevValue && ShowSourceVessels)
     WindowManifest.ResolveResourcePartSelections(SMAddon.SmVessel.SelectedResources);
     }
     else
     {
       bool prevValue = ShowSourceVessels;
       ShowTargetVessels = GUILayout.Toggle(ShowTargetVessels, "Vessels", GUILayout.Width(90));
       if (!prevValue && ShowSourceVessels)
     WindowManifest.ResolveResourcePartSelections(SMAddon.SmVessel.SelectedResources);
     }
       }
       GUILayout.EndHorizontal();
 }
        private static void ResourceDumpFillButtons(List<string> selectedResources, TransferPump.TypePump pumpType, Part part)
        {
            uint pumpId = TransferPump.GetPumpIdFromHash(string.Join("", selectedResources.ToArray()), part, part,
            pumpType, TransferPump.TriggerButton.Transfer);
              GUIContent dumpContent = !TransferPump.IsPumpInProgress(pumpId)
            ? new GUIContent("Dump", "Dumps the selected resource in this vessel")
            : new GUIContent("Stop", "Halts the dumping of the selected resource in this vessel");
              GUIStyle style1 = pumpType == TransferPump.TypePump.SourceToTarget
            ? SMStyle.ButtonSourceStyle
            : SMStyle.ButtonTargetStyle;
              GUI.enabled = CanDumpPart(part);

              if (GUILayout.Button(dumpContent, style1, GUILayout.Width(45), GUILayout.Height(20)))
              {
            SMPart.ToggleDumpResource(part, selectedResources, pumpId);
              }
              Rect rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && ShowToolTips)
            ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);

              GUIStyle style2 = pumpType == TransferPump.TypePump.SourceToTarget
            ? SMStyle.ButtonSourceStyle
            : SMStyle.ButtonTargetStyle;
              // Fills should only be in Non Realism mode or if Preflight Resources are seleced...
              if (SMSettings.RealismMode && !SMSettings.EnablePfResources) return;
              if (selectedResources.Count > 1)
            GUI.enabled = part.Resources[selectedResources[0]].amount <
                      part.Resources[selectedResources[0]].maxAmount ||
                      part.Resources[selectedResources[1]].amount <
                      part.Resources[selectedResources[1]].maxAmount;
              else
            GUI.enabled = part.Resources[selectedResources[0]].amount <
                      part.Resources[selectedResources[0]].maxAmount;
              if (GUILayout.Button("Fill", style2, GUILayout.Width(30), GUILayout.Height(20)))
              {
            SMPart.FillResource(part, selectedResources[0]);
            if (selectedResources.Count > 1)
              SMPart.FillResource(part, selectedResources[1]);
              }
              rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && ShowToolTips)
            ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
        }
        private static void ResourceFlowButtons(TransferPump.TypePump pumpType, int scrollX)
        {
            string step = "";
              try
              {
            List<TransferPump>.Enumerator displayPumps = TransferPump.GetDisplayPumpsByType(pumpType).GetEnumerator();
            while (displayPumps.MoveNext())
            {
              if (displayPumps.Current == null) continue;
              // this var is used for button state change management
              bool flowState = displayPumps.Current.FromParts.Any(part => part.Resources[displayPumps.Current.Resource].flowState);
              string flowtext = flowState ? "On" : "Off";

              // Flow control Display
              step = "resource quantities labels";

              GUILayout.BeginHorizontal();

              GUILayout.Label(
            string.Format("{0}: ({1}/{2})", displayPumps.Current.Resource, displayPumps.Current.FromRemaining.ToString("#######0.##"),
              displayPumps.Current.FromCapacity.ToString("######0.##")), SMStyle.LabelStyleNoWrap, GUILayout.Width(220),
            GUILayout.Height(18));
              GUILayout.Label(string.Format("{0}", flowtext), GUILayout.Width(20), GUILayout.Height(18));
              if (SMAddon.SmVessel.Vessel.IsControllable)
              {
            step = "render flow button(s)";
            if (
              GUILayout.Button(
                new GUIContent("Flow", "Enables/Disables flow of selected resource(s) from selected part(s)."),
                GUILayout.Width(40), GUILayout.Height(20)))
            {
              List<Part>.Enumerator parts = displayPumps.Current.FromParts.GetEnumerator();
              while (parts.MoveNext())
              {
                if (parts.Current == null) continue;
                parts.Current.Resources[displayPumps.Current.Resource].flowState = !flowState;
              }
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
              Rect rect = GUILayoutUtility.GetLastRect();
              ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
              }
              GUILayout.EndHorizontal();
            }
              }
              catch (Exception ex)
              {
            if (!SMAddon.FrameErrTripped)
            {
              Utilities.LogMessage(
            string.Format(" in WindowTransfer.ResourceFlowButtons at step:  " + step + ".  Error:  {0} \r\n\r\n{1}",
              ex.Message, ex.StackTrace), Utilities.LogType.Error, true);
              SMAddon.FrameErrTripped = true;
            }
              }
        }
 private static void VesselButtonToggled(TransferPump.TypePump pumpType, ModDockedVessel modVessel)
 {
     string step = "Vessel Button Toggled";
       try
       {
     if (pumpType == TransferPump.TypePump.SourceToTarget)
     {
       // Now lets update the list...
       if (SMAddon.SmVessel.SelectedVesselsSource.Contains(modVessel))
     SMAddon.SmVessel.SelectedVesselsSource.Remove(modVessel);
       else
     SMAddon.SmVessel.SelectedVesselsSource.Add(modVessel);
       SMAddon.SmVessel.SelectedPartsSource =
     SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsSource,
       SMAddon.SmVessel.SelectedResources);
     }
     else
     {
       if (SMAddon.SmVessel.SelectedVesselsTarget.Contains(modVessel))
     SMAddon.SmVessel.SelectedVesselsTarget.Remove(modVessel);
       else
     SMAddon.SmVessel.SelectedVesselsTarget.Add(modVessel);
       SMAddon.SmVessel.SelectedPartsTarget =
     SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsTarget,
       SMAddon.SmVessel.SelectedResources);
     }
     WindowManifest.ResolveResourcePartSelections(SMAddon.SmVessel.SelectedResources);
       }
       catch (Exception ex)
       {
     if (!SMAddon.FrameErrTripped)
     {
       Utilities.LogMessage(
     "Error in WindowTransfer.VesselButtonToggled (" + pumpType + ") at step:  " + step + ".  Error:  " + ex,
     Utilities.LogType.Error, true);
       SMAddon.FrameErrTripped = true;
     }
       }
 }
 private static bool IsPumpComplete(TransferPump pump)
 {
     bool results = pump.PumpStatus == PumpState.Off ||
             pump.PumpStatus == PumpState.Stop ||
             pump.FromIsEmpty ||
             (pump.PumpType != TypePump.Dump && pump.ToIsFull) ||
             pump.AmtPumped >= pump.PumpAmount ||
             pump.PumpAmount - pump.AmtPumped < SMSettings.Tolerance ||
             (pump.PumpType != TypePump.Dump &&
              CalcMaxPumpAmt(pump.FromParts, pump.ToParts, new List<string> {pump.Resource}) <
              SMSettings.Tolerance);
       return results;
 }
        private static void VesselTransferViewer(List<string> selectedResources, TransferPump.TypePump pumpType,
      Vector2 viewerScrollPosition)
        {
            float scrollX = Position.x + (pumpType == TransferPump.TypePump.SourceToTarget ? 20 : 320);
              float scrollY = Position.y + 30 - viewerScrollPosition.y;
              string step = "begin";
              try
              {
            step = "begin button loop";
            List<ModDockedVessel>.Enumerator modDockedVessels = SMAddon.SmVessel.DockedVessels.GetEnumerator();
            while (modDockedVessels.MoveNext())
            {
              if (modDockedVessels.Current == null) continue;
              // Build the part button title...
              step = "vessel button title";
              string strDescription = GetResourceDescription(selectedResources, modDockedVessels.Current);

              // set the conditions for a button style change.
              int btnWidth = 265;
              if (!SMSettings.RealismMode)
            btnWidth = 180;

              // Set style based on viewer and toggled state.
              step = "Set style";
              GUIStyle style = GetVesselButtonStyle(pumpType, modDockedVessels.Current);

              GUILayout.BeginHorizontal();

              // Now let's account for any target buttons already pressed. (sources and targets for resources cannot be the same)
              GUI.enabled = CanSelectVessel(pumpType, modDockedVessels.Current);

              step = "Render vessel Buttons";
              if (GUILayout.Button(string.Format("{0}", strDescription), style, GUILayout.Width(btnWidth),
            GUILayout.Height(20)))
              {
            VesselButtonToggled(pumpType, modDockedVessels.Current);
              }
              Rect rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition))
              {
            SMHighlighter.IsMouseOver = true;
            SMHighlighter.MouseOverMode = pumpType;
            SMHighlighter.MouseOverRect = new Rect(scrollX + rect.x, scrollY + rect.y, rect.width, rect.height);
            SMHighlighter.MouseOverpart = null;
            SMHighlighter.MouseOverparts = modDockedVessels.Current.VesselParts;
              }

              // Reset Button enabling.
              GUI.enabled = true;

              //step = "Render dump/fill buttons";
              if (!SMSettings.RealismMode)
              {
            if (selectedResources.Count > 1)
              GUI.enabled = TransferPump.CalcRemainingResource(modDockedVessels.Current.VesselParts, selectedResources[0]) > 0 ||
                            TransferPump.CalcRemainingResource(modDockedVessels.Current.VesselParts, selectedResources[1]) > 0;
            else
              GUI.enabled = TransferPump.CalcRemainingResource(modDockedVessels.Current.VesselParts, selectedResources[0]) > 0;
            GUIStyle style1 = pumpType == TransferPump.TypePump.SourceToTarget
              ? SMStyle.ButtonSourceStyle
              : SMStyle.ButtonTargetStyle;
            uint pumpId = TransferPump.GetPumpIdFromHash(string.Join("", selectedResources.ToArray()),
              modDockedVessels.Current.VesselParts.First(), modDockedVessels.Current.VesselParts.Last(), pumpType,
              TransferPump.TriggerButton.Transfer);
            GUIContent dumpContent = !TransferPump.IsPumpInProgress(pumpId)
              ? new GUIContent("Dump", "Dumps the selected resource in this Part")
              : new GUIContent("Stop", "Halts the dumping of the selected resource in this part");
            if (GUILayout.Button(dumpContent, style1, GUILayout.Width(45), GUILayout.Height(20)))
            {
              SMPart.ToggleDumpResource(modDockedVessels.Current.VesselParts, selectedResources, pumpId);
            }

            GUIStyle style2 = pumpType == TransferPump.TypePump.SourceToTarget
              ? SMStyle.ButtonSourceStyle
              : SMStyle.ButtonTargetStyle;
            if (selectedResources.Count > 1)
              GUI.enabled = TransferPump.CalcRemainingCapacity(modDockedVessels.Current.VesselParts, selectedResources[0]) > 0 ||
                            TransferPump.CalcRemainingCapacity(modDockedVessels.Current.VesselParts, selectedResources[0]) > 0;
            else
              GUI.enabled = TransferPump.CalcRemainingCapacity(modDockedVessels.Current.VesselParts, selectedResources[0]) > 0;
            if (GUILayout.Button("Fill", style2, GUILayout.Width(30), GUILayout.Height(20)))
            {
              SMPart.FillResource(modDockedVessels.Current.VesselParts, selectedResources[0]);
              if (selectedResources.Count > 1)
                SMPart.FillResource(modDockedVessels.Current.VesselParts, selectedResources[1]);
            }
            GUI.enabled = true;
              }
              GUILayout.EndHorizontal();
            }
              }
              catch (Exception ex)
              {
            if (!SMAddon.FrameErrTripped)
            {
              Utilities.LogMessage(
            "Error in Windowtransfer.VesselTransferViewer (" + pumpType + ") at step:  " + step + ".  Error:  " + ex,
            Utilities.LogType.Error, true);
              SMAddon.FrameErrTripped = true;
            }
              }
        }
 private static bool IsPartSelectable(string selectedResource, TransferPump.TypePump pumpType, Part part)
 {
     if (selectedResource == SMConditions.ResourceType.Crew.ToString() ||
       selectedResource == SMConditions.ResourceType.Science.ToString()) return true;
       bool isSelectable = true;
       if (pumpType == TransferPump.TypePump.SourceToTarget)
       {
     if (SMAddon.SmVessel.SelectedPartsTarget.Contains(part))
       isSelectable = false;
       }
       else
       {
     if (SMAddon.SmVessel.SelectedPartsSource.Contains(part))
       isSelectable = false;
       }
       return isSelectable;
 }
 private static GUIStyle GetVesselButtonStyle(TransferPump.TypePump pumpType, ModDockedVessel modDockedVessel)
 {
     GUIStyle style;
       if (pumpType == TransferPump.TypePump.SourceToTarget)
       {
     style = SMAddon.SmVessel.SelectedVesselsSource.Contains(modDockedVessel)
       ? SMStyle.ButtonToggledSourceStyle
       : SMStyle.ButtonSourceStyle;
       }
       else
       {
     style = SMAddon.SmVessel.SelectedVesselsTarget.Contains(modDockedVessel)
       ? SMStyle.ButtonToggledTargetStyle
       : SMStyle.ButtonTargetStyle;
       }
       return style;
 }
 private static GUIStyle GetPartButtonStyle(TransferPump.TypePump pumpType, Part part)
 {
     GUIStyle style;
       if (pumpType == TransferPump.TypePump.SourceToTarget)
       {
     style = SMAddon.SmVessel.SelectedPartsSource.Contains(part)
       ? SMStyle.ButtonToggledSourceStyle
       : SMStyle.ButtonSourceStyle;
       }
       else
       {
     style = SMAddon.SmVessel.SelectedPartsTarget.Contains(part)
       ? SMStyle.ButtonToggledTargetStyle
       : SMStyle.ButtonTargetStyle;
       }
       return style;
 }
 private static bool CanSelectVessel(TransferPump.TypePump pumpType, ModDockedVessel modDockedVessel)
 {
     bool isSelectable = true;
       if (pumpType == TransferPump.TypePump.SourceToTarget)
       {
     if (SMAddon.SmVessel.SelectedVesselsTarget.Contains(modDockedVessel))
       isSelectable = false;
       }
       else
       {
     if (SMAddon.SmVessel.SelectedVesselsSource.Contains(modDockedVessel))
       isSelectable = false;
       }
       return isSelectable;
 }
        private static void PartsTransferViewer(List<string> selectedResources, TransferPump.TypePump pumpType,
      Vector2 viewerScrollPosition)
        {
            float scrollX = Position.x + (pumpType == TransferPump.TypePump.SourceToTarget ? 20 : 320);
              float scrollY = Position.y + 30 - viewerScrollPosition.y;
              string step = "begin";
              try
              {
            step = "begin button loop";
            List<Part>.Enumerator parts = SMAddon.SmVessel.SelectedResourcesParts.GetEnumerator();
            while (parts.MoveNext())
            {
              if (parts.Current == null) continue;
              // Build the part button title...
              step = "part button title";
              string strDescription = GetResourceDescription(selectedResources, parts.Current);

              // set the conditions for a button style change.
              int btnWidth = 273; // Start with full width button...
              if (SMConditions.AreSelectedResourcesTypeOther(selectedResources))
            btnWidth = !SMSettings.RealismMode || SMSettings.EnablePfResources ? 173 : 223;
              else if (selectedResources.Contains(SMConditions.ResourceType.Crew.ToString()) && SMConditions.CanShowCrewFillDumpButtons())
            btnWidth = 173;

              // Set style based on viewer and toggled state.
              step = "Set style";
              GUIStyle style = GetPartButtonStyle(pumpType, parts.Current);

              GUILayout.BeginHorizontal();

              // Now let's account for any target buttons already pressed. (sources and targets for resources cannot be the same)
              GUI.enabled = IsPartSelectable(selectedResources[0], pumpType, parts.Current);

              step = "Render part Buttons";
              if (GUILayout.Button(strDescription, style, GUILayout.Width(btnWidth), GUILayout.Height(20)))
              {
            PartButtonToggled(pumpType, parts.Current);
              }
              Rect rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && rect.Contains(Event.current.mousePosition))
              {
            SMHighlighter.IsMouseOver = true;
            SMHighlighter.MouseOverMode = pumpType;
            SMHighlighter.MouseOverRect = new Rect(scrollX + rect.x, scrollY + rect.y, rect.width, rect.height);
            SMHighlighter.MouseOverpart = parts.Current;
              }

              // Reset Button enabling.
              GUI.enabled = true;

              step = "Render dump/fill buttons";
              if (selectedResources.Contains(SMConditions.ResourceType.Crew.ToString()))
              {
            if (SMConditions.CanShowCrewFillDumpButtons())
            CrewFillDumpButtons(parts.Current);
              }
              if (SMConditions.AreSelectedResourcesTypeOther(selectedResources))
              {
            ResourceDumpFillButtons(selectedResources, pumpType, parts.Current);
              }
              GUI.enabled = true;
              GUILayout.EndHorizontal();
            }
              }
              catch (Exception ex)
              {
            if (!SMAddon.FrameErrTripped)
            {
              Utilities.LogMessage(
            "Error in Windowtransfer.PartsTransferViewer (" + pumpType + ") at step:  " + step + ".  Error:  " + ex,
            Utilities.LogType.Error, true);
              SMAddon.FrameErrTripped = true;
            }
              }
        }
        private static void ResourceDetailsViewer(TransferPump.TypePump pumpType)
        {
            // Let's get the pump objects we may use...
              List<string> selectedResources = SMAddon.SmVessel.SelectedResources;
              List<TransferPump> pumps = TransferPump.GetDisplayPumpsByType(pumpType);
              if (!(from pump in pumps where pump.FromParts.Count > 0 select pump).Any()) return;

              // This routine assumes that a resource has been selected on the Resource manifest window.
              // Set scrollX offsets for left and right viewers
              int xOffset = 30;
              string toolTip = "";

              TransferPump activePump = TransferPump.GetRatioPump(pumps);
              TransferPump ratioPump = TransferPump.GetRatioPump(pumps, true);
              activePump.PumpRatio = 1;
              ratioPump.PumpRatio = TransferPump.CalcRatio(pumps);

              // Set tooltips directional data
              string strTarget = pumpType == TransferPump.TypePump.SourceToTarget ? "Target" : "Source";

              // Resource Flow control Display loop
              ResourceFlowButtons(pumpType, xOffset);

              // Xfer Controls Display
              // let's determine how much of a resource we can move to the target.
              double thisXferAmount = double.Parse(activePump.EditSliderAmount);
              double maxPumpAmount = TransferPump.CalcMaxPumpAmt(pumps[0].FromParts, pumps[0].ToParts, selectedResources);
              if (maxPumpAmount <= 0 && !TransferPump.PumpProcessOn) return;
              GUILayout.BeginHorizontal();
              string label;
              Rect rect;
              if (TransferPump.PumpProcessOn)
              {
            // We want to show this during transfer if the direction is correct...
            if (activePump.PumpType == pumpType)
            {
              GUILayout.Label("Xfer Remaining:", GUILayout.Width(120));
              GUILayout.Label(activePump.PumpBalance.ToString("#######0.##"));
              if (SMAddon.SmVessel.SelectedResources.Count > 1)
            GUILayout.Label(" | " + ratioPump.PumpBalance.ToString("#######0.##"));
            }
              }
              else
              {
            if (selectedResources.Count > 1)
            {
              label = "Xfer Amts:";
              toolTip = "Displays xfer amounts of both resourses selected.";
              toolTip += "\r\nAllows editing of part's larger capacity resourse xfer value.";
              toolTip += "\r\nIt then calculates the smaller xfer amount using a ratio";
              toolTip += "\r\n of the smaller capacity resource to the larger.";
            }
            else
            {
              label = "Xfer Amt:";
              toolTip += "Displays the Amount of selected resource to xfer.";
              toolTip += "\r\nAllows editing of the xfer value.";
            }
            GUILayout.Label(new GUIContent(label, toolTip), GUILayout.Width(65));
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
              ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, xOffset);
            activePump.EditSliderAmount = GUILayout.TextField(activePump.EditSliderAmount, 20, GUILayout.Width(95),
              GUILayout.Height(20));
            thisXferAmount = double.Parse(activePump.EditSliderAmount);
            double ratioXferAmt = thisXferAmount * ratioPump.PumpRatio > ratioPump.FromCapacity
              ? ratioPump.FromCapacity
              : thisXferAmount * ratioPump.PumpRatio;
            if (SMAddon.SmVessel.SelectedResources.Count > 1)
            {
              label = " | " + ratioXferAmt.ToString("#######0.##");
              toolTip = "Smaller Tank xfer amount.  Calculated at " + ratioPump.PumpRatio +
                    ".\r\n(Note: A value of 0.818181 = 0.9/1.1)";
              GUILayout.Label(new GUIContent(label, toolTip), GUILayout.Width(80));
              rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && ShowToolTips)
            ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, xOffset);
            }
              }
              GUILayout.EndHorizontal();

              if (SMConditions.IsShipControllable() && SMConditions.CanResourceBeXferred(pumpType, maxPumpAmount))
              {
            GUILayout.BeginHorizontal();
            GUIStyle noPad = SMStyle.LabelStyleNoPad;
            label = "Xfer:";
            toolTip =
              "Xfer amount slider control.\r\nMove slider to select a different value.\r\nYou can use this instead of the text box above.";
            GUILayout.Label(new GUIContent(label, toolTip), noPad, GUILayout.Width(50), GUILayout.Height(20));
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
              ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, xOffset);
            thisXferAmount = GUILayout.HorizontalSlider((float)thisXferAmount, 0, (float)maxPumpAmount,
              GUILayout.Width(190));
            activePump.EditSliderAmount = thisXferAmount.ToString(CultureInfo.InvariantCulture);
            // set Xfer button style
            GUIContent xferContent = !TransferPump.PumpProcessOn
              ? new GUIContent("Xfer", "Transfers the selected resource(s)\r\nto the selected " + strTarget + " Part(s)")
              : new GUIContent("Stop",
            "Halts the Transfer of the selected resource(s)\r\nto the selected " + strTarget + " Part(s)");

            if (GUILayout.Button(xferContent, GUILayout.Width(40), GUILayout.Height(18)))
            {
              uint pumpId = TransferPump.GetPumpIdFromHash(string.Join("", selectedResources.ToArray()),
            pumps[0].FromParts.First(), pumps[0].ToParts.Last(), pumpType, TransferPump.TriggerButton.Transfer);
              if (!TransferPump.PumpProcessOn)
              {
            //Calc amounts and update xfer modules
            TransferPump.AssignPumpAmounts(pumps, thisXferAmount, pumpId);
            ProcessController.TransferResources(pumps);
              }
              else TransferPump.AbortAllPumpsInProcess(pumpId);
            }
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
              ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, xOffset);
            GUILayout.EndHorizontal();
              }
        }
 internal static void ToggleDumpResource(string resourceName, uint pumpId)
 {
     //Fired by Resource Dump on Manifest Window.
       TransferPump pump = new TransferPump(resourceName, TransferPump.TypePump.Dump, TransferPump.TriggerButton.Manifest,
     TransferPump.CalcRemainingResource(SMAddon.SmVessel.PartsByResource[resourceName], resourceName))
       {
     FromParts = SMAddon.SmVessel.PartsByResource[resourceName],
     PumpId = pumpId
       };
       if (!TransferPump.IsPumpInProgress(pumpId))
       {
     SMAddon.SmVessel.TransferPumps.Add(pump);
     ProcessController.DumpResources(SMAddon.SmVessel.TransferPumps);
       }
       else TransferPump.AbortAllPumpsInProcess(pumpId);
 }
        internal static void CreateDisplayPumps()
        {
            // Now lets update the Resource Xfer pumps for display use...
              WindowTransfer.DisplayPumps.Clear();
              if (!SMConditions.AreSelectedResourcesTypeOther(SMAddon.SmVessel.SelectedResources)) return;
              // Lets create a pump Object for managing pump options and data.
              List<Part> displaySourceParts = WindowTransfer.ShowSourceVessels
            ? SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsSource,
              SMAddon.SmVessel.SelectedResources)
            : SMAddon.SmVessel.SelectedPartsSource;
              List<Part> displayTargetParts = WindowTransfer.ShowTargetVessels
            ? SMAddon.SmVessel.GetSelectedVesselsParts(SMAddon.SmVessel.SelectedVesselsTarget,
              SMAddon.SmVessel.SelectedResources)
            : SMAddon.SmVessel.SelectedPartsTarget;

              List<string>.Enumerator resources = SMAddon.SmVessel.SelectedResources.GetEnumerator();
              while (resources.MoveNext())
              {
            TransferPump pump1 = new TransferPump
            {
              Resource = resources.Current,
              PumpType = TypePump.SourceToTarget,
              PumpAmount = CalcMaxPumpAmt(displaySourceParts, displayTargetParts, SMAddon.SmVessel.SelectedResources),
              EditSliderAmount =
            CalcMaxPumpAmt(displaySourceParts, displayTargetParts, SMAddon.SmVessel.SelectedResources)
              .ToString(CultureInfo.InvariantCulture),
              FromParts = displaySourceParts,
              ToParts = displayTargetParts
            };
            WindowTransfer.DisplayPumps.Add(pump1);

            TransferPump pump2 = new TransferPump
            {
              Resource = resources.Current,
              PumpType = TypePump.TargetToSource,
              PumpAmount = CalcMaxPumpAmt(displayTargetParts, displaySourceParts, SMAddon.SmVessel.SelectedResources),
              EditSliderAmount =
            CalcMaxPumpAmt(displayTargetParts, displaySourceParts, SMAddon.SmVessel.SelectedResources)
              .ToString(CultureInfo.InvariantCulture),
              FromParts = displayTargetParts,
              ToParts = displaySourceParts
            };
            WindowTransfer.DisplayPumps.Add(pump2);
              }
        }