internal void RefreshLists() { GetSelectedResourcesParts(true); _dockedVessels = null; // now lets reconcile the selected parts based on the new list of resources... WindowManifest.ReconcileSelectedXferParts(SMAddon.smController.SelectedResources); // Now lets update the Resource Xfer Objects... SMAddon.smController.ResourcesToXfer.Clear(); if (!SMAddon.smController.SelectedResources.Contains("Crew") && !SMAddon.smController.SelectedResources.Contains("Science")) { foreach (string resource in SMAddon.smController.SelectedResources) { // Lets create a Xfer Object for managing xfer options and data. TransferResource modResource = new TransferResource(resource); modResource.srcXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedPartsTarget, resource); modResource.tgtXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedPartsSource, resource); SMAddon.smController.ResourcesToXfer.Add(modResource); } } if (SMSettings.EnableCLS && SMAddon.CanShowShipManifest(false)) { if (SMAddon.GetCLSAddon()) { SMAddon.UpdateCLSSpaces(); if (SMAddon.GetCLSVessel()) GetHatches(); } } SMAddon.FrozenKerbals = WindowRoster.GetFrozenKerbals(); GetAntennas(); GetLights(); GetSolarPanels(); WindowRoster.GetRosterList(); DockedVessels = null; }
private static void ResourceButtonToggled(string resourceName) { try { if (!SMAddon.smController.CrewTransfer.CrewXferActive && !TransferResource.ResourceXferActive) { // First, lets clear any highlighting... SMHighlighter.ClearResourceHighlighting(SMAddon.smController.SelectedResourcesParts); // Now let's update our lists... if (!SMAddon.smController.SelectedResources.Contains(resourceName)) { // now lets determine what to do with selection if (resourceName == "Crew" || resourceName == "Science" || resourceName == "ElectricCharge") { SMAddon.smController.SelectedResources.Clear(); SMAddon.smController.SelectedResources.Add(resourceName); } else { if (SMAddon.smController.SelectedResources.Contains("Crew") || SMAddon.smController.SelectedResources.Contains("Science") || SMAddon.smController.SelectedResources.Contains("ElectricCharge")) { SMAddon.smController.SelectedResources.Clear(); SMAddon.smController.SelectedResources.Add(resourceName); } else if (SMAddon.smController.SelectedResources.Count > 1) { SMAddon.smController.SelectedResources.RemoveRange(0, 1); SMAddon.smController.SelectedResources.Add(resourceName); } else SMAddon.smController.SelectedResources.Add(resourceName); } } else if (SMAddon.smController.SelectedResources.Contains(resourceName)) { SMAddon.smController.SelectedResources.Remove(resourceName); } // Now, refresh the resources parts list SMAddon.smController.GetSelectedResourcesParts(); // now lets reconcile the selected parts based on the new list of resources... ReconcileSelectedXferParts(SMAddon.smController.SelectedResources); // Now lets update the Xfer Objects... SMAddon.smController.ResourcesToXfer.Clear(); if (!SMAddon.smController.SelectedResources.Contains("Crew") && !SMAddon.smController.SelectedResources.Contains("Science")) { foreach (string resource in SMAddon.smController.SelectedResources) { // Lets create a Xfer Object for managing xfer options and data. TransferResource modResource = new TransferResource(resource); modResource.srcXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedPartsTarget, resource); modResource.tgtXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedPartsSource, resource); SMAddon.smController.ResourcesToXfer.Add(modResource); } } // Now, based on the resourceselection, do we show the Transfer window? if (SMAddon.smController.SelectedResources.Count > 0) WindowTransfer.ShowWindow = true; else WindowTransfer.ShowWindow = false; } } catch (Exception ex) { Utilities.LogMessage(string.Format(" in WindowManifest.ResourceButtonToggled. Error: {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), "Error", true); } }
internal static void XferResource(List<Part> XferParts, TransferResource modResource, double XferAmount, SMAddon.XFERMode XferMode, bool drain) { // This adjusts the delta when we get to the end of the xfer. Utilities.LogMessage("XferResource: " + modResource.ResourceName + " - 1. XferAmount = " + XferAmount.ToString() + ", Drain? " + drain.ToString(), "Info", SMSettings.VerboseLogging); // This var keeps track of what we actually moved.. double XferBalance = XferAmount; double XferBalanceOld = XferBalance; int XferTimeout = 0; // Not all parts will have enough resource to meet the SrcPartAmt to move. We need to account for that. // count up source parts with avalilabe resources. so we can devide by them while (XferBalance > 0.0000001d) { Utilities.LogMessage("XferResource: " + modResource.ResourceName + " - 2. XferBalance = " + XferBalance.ToString() + ", Is Source: " + drain.ToString(), "Info", SMSettings.VerboseLogging); // Lets account for any empty/full containers int PartCount = 0; foreach (Part part in XferParts) if ((drain && part.Resources[modResource.ResourceName].amount > 0d) || (!drain && part.Resources[modResource.ResourceName].amount < part.Resources[modResource.ResourceName].maxAmount)) PartCount += 1; // now split up the xfer amount evenly across the number of tanks that can send/receive resources double PartAmt = XferBalance / PartCount; // Calculate Xfer amounts for each part and move. foreach (Part part in XferParts) { double AmtToMove = 0d; if (drain) { AmtToMove = part.Resources[modResource.ResourceName].amount >= PartAmt ? PartAmt : part.Resources[modResource.ResourceName].amount; part.Resources[modResource.ResourceName].amount -= AmtToMove; } else { double CapacityAvail = part.Resources[modResource.ResourceName].maxAmount - part.Resources[modResource.ResourceName].amount; AmtToMove = CapacityAvail >= PartAmt ? PartAmt : CapacityAvail; part.Resources[modResource.ResourceName].amount += AmtToMove; } Utilities.LogMessage("XferResource: " + modResource.ResourceName + " - 3. AmtToMove = " + AmtToMove.ToString() + ", Drain: " + drain.ToString(), "Info", SMSettings.VerboseLogging); // Report ramaining balance after Transfer. XferBalance -= AmtToMove; } // account for rounding and double resolution issues if (XferBalance <= 0.0000001d) break; else if (XferBalance != XferBalanceOld) { XferBalanceOld = XferBalance; XferTimeout = 0; } else if (XferBalance == XferBalanceOld) { XferTimeout += 1; if (XferTimeout >= 30) { Utilities.LogMessage("XferResource Timeout! Resource: " + modResource.ResourceName + " - 3. XferBalance = " + XferBalance.ToString() + ", Drain: " + drain.ToString(), "Error", true); break; } } } }