Exemple #1
0
        /*  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}");
            }
        }
Exemple #2
0
        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>();
        }
Exemple #3
0
        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);
        }