private void TransferOut(double deltaTime, ResourceInfo resourceInfo, ResourcePartMap partInfo) { var otherParts = resourceInfo.parts.FindAll(rpm => ((rpm.resource.maxAmount - rpm.resource.amount) > 0) && (rpm.direction == TransferDirection.NONE || rpm.direction == TransferDirection.IN || rpm.direction == TransferDirection.BALANCE)); double available = Math.Min(settings.MaxFuelFlow * settings.RateMultiplier * deltaTime, partInfo.resource.amount); double giveToEach = available / otherParts.Count; double totalGiven = 0.0; foreach (ResourcePartMap otherPartInfo in otherParts) { if (partInfo.part != otherPartInfo.part) { double amountGiven = Math.Min(giveToEach, otherPartInfo.resource.maxAmount - otherPartInfo.resource.amount); otherPartInfo.resource.amount += amountGiven; totalGiven += amountGiven; } } partInfo.resource.amount -= totalGiven; }
private void RebuildLists(Vessel vessel) { this.Log("Rebuilding resource lists."); List<string> toDelete = new List<string>(); foreach (KeyValuePair<string, ResourceInfo> resourceEntry in resources) { resourceEntry.Value.parts.RemoveAll(partInfo => !vessel.parts.Contains(partInfo.part)); if (resourceEntry.Value.parts.Count == 0) { toDelete.Add(resourceEntry.Key); } } foreach (string resource in toDelete) { resources.Remove(resource); } foreach (Part part in vessel.parts) { foreach (PartResource resource in part.Resources) { if (resources.ContainsKey(resource.resourceName)) { List<ResourcePartMap> resourceParts = resources[resource.resourceName].parts; ResourcePartMap partInfo = resourceParts.Find(info => info.part.Equals(part)); if (partInfo == null) { resourceParts.Add(new ResourcePartMap(resource, part)); } else { // Make sure we are still pointing at the right resource instance. This is a fix for compatibility with StretchyTanks. partInfo.resource = resource; } } else { ResourceInfo resourceInfo = new ResourceInfo(); resourceInfo.parts.Add(new ResourcePartMap(resource, part)); resources[resource.resourceName] = resourceInfo; } } } numberOfParts = vessel.parts.Count; currentVessel = vessel; vesselSituation = vessel.situation; }
private void TransferIn(double deltaTime, ResourceInfo resourceInfo, ResourcePartMap partInfo) { var otherParts = resourceInfo.parts.FindAll(rpm => (rpm.resource.amount > 0) && (rpm.direction == TransferDirection.NONE || rpm.direction == TransferDirection.OUT || rpm.direction == TransferDirection.DUMP || rpm.direction == TransferDirection.BALANCE)); double available = Math.Min(settings.MaxFuelFlow * settings.RateMultiplier * deltaTime, partInfo.resource.maxAmount - partInfo.resource.amount); double takeFromEach = available / otherParts.Count; double totalTaken = 0.0; foreach (ResourcePartMap otherPartInfo in otherParts) { if (partInfo.part != otherPartInfo.part) { double amountTaken = Math.Min(takeFromEach, otherPartInfo.resource.amount); otherPartInfo.resource.amount -= amountTaken; totalTaken += amountTaken; } } partInfo.resource.amount += totalTaken; }
private void DumpOut(double deltaTime, ResourceInfo resourceInfo, ResourcePartMap partInfo) { double available = Math.Min(settings.MaxFuelFlow * settings.RateMultiplier * deltaTime, partInfo.resource.amount); partInfo.resource.amount -= available; }