public override double TransferTo(PartResourceInfo destination, double amount) { RocketFuelResource dest = (RocketFuelResource)destination; double liquidSpace = dest.liquidFuel.maxAmount - dest.liquidFuel.amount, oxidizerSpace = dest.oxidizer.maxAmount - dest.oxidizer.amount; amount = Math.Min(Math.Min(amount, Amount), Math.Min(liquidSpace * (10d / 9), oxidizerSpace * (10d / 11))); double fuel = amount * (9d / 10), oxygen = amount * (11d / 10); dest.liquidFuel.amount += fuel; liquidFuel.amount -= fuel; dest.oxidizer.amount += oxygen; oxidizer.amount -= oxygen; return(amount); }
private void RebuildLists(Vessel vessel) { this.Log("Rebuilding resource lists."); // try to restore the old vessel info if we're switching vessels if (vesselInfo.vessel != vessel) { recentVessels.RemoveAll(v => !FlightGlobals.Vessels.Contains(v.vessel)); // remove information about dead vessels int index = recentVessels.FindIndex(v => v.vessel == vessel); if (vesselInfo.vessel != null) // save the current data if it's not the initial, uninitialized state { recentVessels.Add(vesselInfo); } if (index >= 0) // if we found the vessel in our memory, use it { vesselInfo = recentVessels[index]; recentVessels.RemoveAt(index); // we'll add it back the next time we switch ships } else { vesselInfo = new VesselInfo(vessel); } if (recentVessels.Count >= MaxRecentVessels) { recentVessels.RemoveAt(0); } } // Remove parts that don't exist any more List <string> toDelete = new List <string>(); foreach (KeyValuePair <string, ResourceInfo> resourceEntry in vesselInfo.resources) { // this.Log( "Removing Parts for: " + resourceEntry.Key ); resourceEntry.Value.parts.RemoveAll(partInfo => !vessel.parts.Contains(partInfo.part)); if (resourceEntry.Value.parts.Count == 0) { // this.Log( "Remove: " + resourceEntry.Key ); toDelete.AddUnique(resourceEntry.Key); } } // See if we have eliminated a whole resource foreach (string resource in toDelete) { vesselInfo.resources.Remove(resource); // this.Log( "Removed: " + resource ); } // If tanks change their contents then we need to keep up. toDelete.Clear( ); foreach (Part part in vessel.parts) { foreach (KeyValuePair <string, ResourceInfo> resourceEntry in vesselInfo.resources) { if (resourceEntry.Key == "_RocketFuel") // "_RocketFuel" isn't real { List <ResourcePartMap> PartsToRemove = new List <ResourcePartMap>( ); foreach (ResourcePartMap pi in resourceEntry.Value.parts) { if (pi.part == part) { if (!part.Resources.Contains("Oxidizer") || !part.Resources.Contains("LiquidFuel")) { PartsToRemove.Add(pi); // this.Log( part.name + " changed" ); } } } foreach (ResourcePartMap pi in PartsToRemove) { resourceEntry.Value.parts.Remove(pi); } if (resourceEntry.Value.parts.Count == 0) { // this.Log( "Remove: " + resourceEntry.Key ); toDelete.AddUnique(resourceEntry.Key); } } else { List <ResourcePartMap> PartsToRemove = new List <ResourcePartMap>( ); foreach (ResourcePartMap pi in resourceEntry.Value.parts) { if (pi.part == part) { if (!part.Resources.Contains(resourceEntry.Key)) { PartsToRemove.Add(pi); // this.Log( part.name + " changed" ); } } } foreach (ResourcePartMap pi in PartsToRemove) { resourceEntry.Value.parts.Remove(pi); } if (resourceEntry.Value.parts.Count == 0) { // this.Log( "Remove: " + resourceEntry.Key ); toDelete.AddUnique(resourceEntry.Key); } } } } // See if we have eliminated a whole resource foreach (string resource in toDelete) { vesselInfo.resources.Remove(resource); // this.Log( "Removed: " + resource ); } // Add all resources in all tanks Dictionary <object, int> shipIds = ComputeShipIds(vessel); foreach (Part part in vessel.parts) { if (part.Resources.Contains("Oxidizer") && part.Resources.Contains("LiquidFuel")) { AddResource("_RocketFuel", part, shipIds, (p, n) => { var r = new RocketFuelResource(); r.Refresh(p); return(r); }); } foreach (PartResource resource in part.Resources) { //this.Log( part.name + " - " + resource.resourceName + ":" + resource.amount.ToString( ) ); // skip the electric charge resource of engines with alternators, because they can't be balanced. // any charge placed in an alternator just disappears if (resource.resourceName == "ElectricCharge" && part.Modules.GetModules <ModuleAlternator>().Count != 0) { continue; } AddResource(resource.resourceName, part, shipIds, (p, n) => { var r = new SimplePartResource(n); r.Refresh(p); return(r); }); } } SortParts((a, b) => a.shipId - b.shipId); // make sure resources are grouped by ship ID vesselInfo.lastPartCount = vessel.parts.Count; vesselInfo.lastSituation = vessel.situation; }