/* First step is to consider every vessel within Max_refuel_radius and * determine whether it is a hub airport control tower. * [kmk] disable this */ public static void refuel_hub_airport(Vessel vessel) { disqual = null; /* Find all vessels within the refueling apron radius. One of them may be a hub control tower. * In that case, we can refuel. */ List <Vessel> nearby = find_locale(vessel.mainBody, vessel.longitude, vessel.latitude, Max_refuel_radius); foreach (var tower in nearby) { if (check_airport(tower)) { Telemagic.logTM($"refueling {vessel.vesselName}"); Telemagic.refuel(vessel); return; } } if (disqual != null) { Telemagic.message(vessel, $"{disqual} at {name}"); } }
internal static void refuel(Vessel vessel, Vessel sourceVessel = null) { if (vessel.parts == null) { return; } logTM($"considering {vessel.vesselName} for refueling..."); // the intention here was to discover a way to equip a solo Kerbal with a flag. logTM($"{vessel.vesselName} is {vessel.RevealType()}"); if (vessel.isEVA) { foreach (var part in vessel.parts) { logTM($"{part.name} is {part.GetType()}"); if (part.name.Contains("kerbalEVA")) { logTM($"{Hub.display(part)}"); foreach (var mod in part.Modules) //vessel.vesselModules) { { logTM($"mod {mod.name}"); } foreach (var res in part.Resources) { logTM($"res {res.resourceName}"); } } } logTM($"that's all"); } // does the vessel have chutes? var repacked_chute_count = 0; foreach (var part in vessel.parts) { if (part.name.Contains("chute") || part.name.Contains("Drogue")) { logTM($"chute: {part.name} mods:{part.Modules.Count}"); foreach (var mod in part.Modules) { logTM($"mod {mod.name}"); if (mod.name.Contains("chute") || mod.name.Contains("Drogue")) { var chute = mod as ModuleParachute; if (chute != null && chute.deploymentState != ModuleParachute.deploymentStates.STOWED) { chute.Disarm(); chute.Repack(); repacked_chute_count++; } } } } else { var crew = part.protoModuleCrew; foreach (var member in crew) { logTM($"{member.name} in {vessel.vesselName}"); ///member. } } } if (repacked_chute_count > 0) { Telemagic.message(vessel, $"{repacked_chute_count} chutes repacked."); } // dynamic Fueler component to fuel the craft in "real-time"... FlightGlobals.ActiveVessel.gameObject.AddComponent <TelemagicFueler>(); }
public void Update() { if (vessel == null) { vessel = BeginRefueling(); Telemagic.logTM($"TelemagicFueler starting for {vessel?.vesselName}"); Telemagic.message(vessel, $"refueling has commenced..."); } if (vessel?.parts != null) { string resourceName; /* Cycle through all resources and replenish them. * * Cancel fueling if brakes are released or engines started. */ if (!Telemagic.enginesRunning(vessel) && Telemagic.brakesApplied(vessel) && timeRemaining > 0) { var deltaTime = Math.Min(Time.deltaTime, timeRemaining); timeRemaining -= deltaTime; int tankNumber = 0; foreach (var part in vessel.parts) { int nres = part.Resources.Count; for (int i = 0; i < nres; ++i) { PartResource resource = part.Resources[i]; if (resource.flowState && resource.isVisible) { tankNumber++; resourceName = resource.resourceName; FuelState fuelState = vesselFuelTotals.getResource(resourceName); if (fuelState == null) { continue; } // apportion the standard flow by available tank capacity as a ratio of total remaining capacity var transferAmount = 0.0; var capacity = resource.maxAmount - resource.amount; if (fuelState.amount < fuelState.maxAmount) { transferAmount = fuelState.targetTransferAmount * capacity / (fuelState.maxAmount - fuelState.amount) * deltaTime / refuelingDuration; } //Telemagic.logTM($"{vessel.vesselName} {tankNumber} {resourceName} {resource.amount} {resource.maxAmount} +{transferAmount} target {fuelState.targetTransferAmount}"); fuelState.actualTransferAmount += transferAmount; if (transferAmount > 0) { if (transferAmount > capacity) { transferAmount = capacity; } part.TransferResource(resource.info.id, transferAmount); } FuelTotals.transferred += transferAmount; } } } /* Update total amount transferred to client. */ foreach (var total in vesselFuelTotals) { total.Value.amount += total.Value.actualTransferAmount; //Telemagic.logTM($"{vessel.vesselName} {total.Value.resourceName} +{total.Value.actualTransferAmount} = {total.Value.amount}"); var sourceFuelState = sourceVesselFuelTotals?.getResource(total.Value.resourceName); if (sourceFuelState != null) { sourceFuelState.targetTransferAmount = total.Value.actualTransferAmount; sourceFuelState.actualTransferAmount = 0; } total.Value.actualTransferAmount = 0; } /* Debit the source vessel, if there is one. */ if (sourceVesselFuelTotals != null) { tankNumber = 0; foreach (var part in sourceVessel.parts) { int nparts = part.Resources.Count; for (int partx = 0; partx < nparts; partx++) { PartResource resource = part.Resources[partx]; //Telemagic.logTM($"Processing {resource.resourceName} in the source: {sourceVessel?.vesselName}"); if (resource.flowState && resource.isVisible) { tankNumber++; resourceName = resource.resourceName; // check that it is a resource that would have been drawn by the client FuelState fuelState = vesselFuelTotals.getResource(resourceName); if (fuelState != null && fuelState.targetTransferAmount > 0) { fuelState = sourceVesselFuelTotals.getResource(resourceName); // how much? var transferAmount = 0.0; if (fuelState.amount > 0) { transferAmount = resource.amount / fuelState.amount * fuelState.targetTransferAmount; } //Telemagic.logTM($"{sourceVessel.vesselName} {tankNumber} {resourceName} {resource.amount} {resource.maxAmount} -{transferAmount}"); fuelState.actualTransferAmount += transferAmount; part.TransferResource(resource.info.id, -transferAmount); FuelTotals.transferred -= transferAmount; } } } } // Update total amount withdrawn from source. foreach (var total in sourceVesselFuelTotals) { total.Value.amount -= total.Value.actualTransferAmount; //Telemagic.logTM($"{sourceVessel.vesselName} {total.Value.resourceName} -{total.Value.actualTransferAmount} = {total.Value.amount}"); } } return; } Telemagic.message(vessel, $"refueling complete."); } // finished Telemagic.logTM($"TelemagicFueler terminating for {vessel?.vesselName}"); Destroy(this); }