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