コード例 #1
0
ファイル: Antenna.cs プロジェクト: yadenisyur/Kerbalism
        public ProtoPartAntenna(ProtoPartModuleSnapshot antenna, ProtoPartSnapshot partSnap, Vessel v, string ModuleName, uint part_id)
        {
            this.protoPartSnap = partSnap;
            this.vessel        = v;
            this.part_id       = part_id;

            if (ModuleName == "ModuleDataTransmitter")
            {
                if (partSnap.FindModule("ModuleDeployableAntenna") != null)
                {
                    this.ModuleName = "ModuleDeployableAntenna";
                    this.antenna    = partSnap.FindModule("ModuleDeployableAntenna");
                }
                else if (partSnap.FindModule("ModuleAnimateGeneric") != null)
                {
                    this.ModuleName = "ModuleAnimateGeneric";
                    this.antenna    = partSnap.FindModule("ModuleAnimateGeneric");
                }
                else
                {
                    this.ModuleName = "ModuleDataTransmitter";
                    this.antenna    = antenna;
                }
            }
            else
            {
                this.antenna    = antenna;
                this.ModuleName = ModuleName;
            }
        }
コード例 #2
0
        public ProtoAntennaDevice(PartModule prefab, ProtoPartSnapshot protoPart, ProtoPartModuleSnapshot protoModule, string ModuleName)
            : base(prefab, protoPart, protoModule)
        {
            if (ModuleName == "ModuleDataTransmitter")
            {
                this.ModuleName = "ModuleDataTransmitter";
                this.antenna    = protoModule;

                if (protoPart.FindModule("ModuleDeployableAntenna") != null)
                {
                    this.ModuleName = "ModuleDeployableAntenna";
                    this.antenna    = protoPart.FindModule("ModuleDeployableAntenna");
                }
                else if (protoPart.FindModule("ModuleAnimateGeneric") != null &&
                         !protoPart.partName.Contains("Lander"))                   // see above
                {
                    this.ModuleName = "ModuleAnimateGeneric";
                    this.antenna    = protoPart.FindModule("ModuleAnimateGeneric");
                }
            }
            else
            {
                this.antenna    = protoModule;
                this.ModuleName = ModuleName;
            }
        }
コード例 #3
0
ファイル: Addon.cs プロジェクト: linuxgurugamer/L-Tech
        void FindVesselsWithSkylab(Vessel vesselDestroyed = null)
        {
            Log.Info("Addon.FindVesselsWithSkylab");

            vesselsWithSkylab.Clear();

            for (int vesselIdx = 0; vesselIdx < FlightGlobals.Vessels.Count; vesselIdx++)
            {
                Vessel v = FlightGlobals.Vessels[vesselIdx];
                Log.Info("vesselIdx[" + vesselIdx + "]: " + v.vesselName);
                if (vesselDestroyed != null && v.persistentId == vesselDestroyed.persistentId)
                {
                    Log.Info("Ignoring destroyed vessel: " + vesselDestroyed.vesselName);
                    continue;
                }
                if (v.packed)
                {
                    for (int i2 = 0; i2 < v.protoVessel.protoPartSnapshots.Count; i2++)
                    {
                        ProtoPartSnapshot p = v.protoVessel.protoPartSnapshots[i2];
                        var pms             = p.FindModule("SkylabExperiment");
                        if (pms != null)
                        {
                            vesselsWithSkylab.Add(v);
                            break;
                        }
                    }
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Load BV controllers from the config
        /// </summary>
        internal void LoadControllers()
        {
            Vessel            vessel = null;
            ProtoPartSnapshot part   = null;

            BVControllers.Clear();

            for (int i = 0; i < FlightGlobals.Vessels.Count; i++)
            {
                vessel = FlightGlobals.Vessels[i];
                ConfigNode vesselConfigNode = new ConfigNode();
                vessel.protoVessel.Save(vesselConfigNode);
                for (int k = 0; k < vessel.protoVessel.protoPartSnapshots.Count; k++)
                {
                    part = vessel.protoVessel.protoPartSnapshots[k];
                    ProtoPartModuleSnapshot module = part.FindModule("BonVoyageModule");
                    if (module != null)
                    {
                        ConfigNode BVModule   = module.moduleValues;
                        string     vesselType = BVModule.GetValue("vesselType");
                        if (vessel.isActiveVessel)
                        {
                            BonVoyageModule m = vessel.FindPartModuleImplementing <BonVoyageModule>();
                            if (m != null)
                            {
                                vesselType = m.vesselType;
                            }
                            else
                            {
                                continue;
                            }
                        }
                        BVController controller = null;
                        switch (vesselType)
                        {
                        case "0":     // rover
                            controller = new RoverController(vessel, BVModule);
                            break;

                        case "1":     // ship
                            controller = new ShipController(vessel, BVModule);
                            break;

                        default:     // default to rover
                            controller = new RoverController(vessel, BVModule);
                            break;
                        }
                        BVControllers.Add(controller);
                        break;
                    }
                }
            }
        }
コード例 #5
0
 private static void UpdatePartModulesInProtoPart(ProtoPartSnapshot protoPartToUpdate, ProtoPartSnapshot partSnapshot)
 {
     //Run trough all the part DEFINITION modules
     foreach (var moduleSnapshotDefinition in partSnapshot.modules.Where(m => !VesselModulesToIgnore.ModulesToIgnore.Contains(m.moduleName)))
     {
         //Get the corresponding module from the actual vessel PROTOPART
         var currentModule = protoPartToUpdate.FindModule(moduleSnapshotDefinition.moduleName);
         if (currentModule != null)
         {
             moduleSnapshotDefinition.moduleValues.CopyTo(currentModule.moduleValues);
         }
     }
 }
コード例 #6
0
        private static void LoadTweakScalePartModules(ProtoPartSnapshot protoPartSnapshot, VesselData vesselData)
        {
            ProtoPartModuleSnapshot protoPartModuleSnapshot = protoPartSnapshot.FindModule("TweakScale");

            if (protoPartModuleSnapshot == null)
            {
                return;
            }

            double.TryParse(protoPartModuleSnapshot.moduleValues.GetValue("currentScale"), out double currentScale);
            double.TryParse(protoPartModuleSnapshot.moduleValues.GetValue("defaultScale"), out double defaultScale);

            double tweakScalePartMultiplier = defaultScale > 0 && currentScale > 0 ? currentScale / defaultScale : 1;

            vesselData.PartSizeMultipliers.Add(protoPartSnapshot.persistentId, tweakScalePartMultiplier);
        }
コード例 #7
0
        private static void UpdatePartFairings(ProtoPartSnapshot partSnapshot, Part part)
        {
            var fairingModule = part.FindModuleImplementing <ModuleProceduralFairing>();

            if (fairingModule != null)
            {
                if (FsmField?.GetValue(fairingModule) is KerbalFSM fsmVal)
                {
                    var currentState = fsmVal.CurrentState;
                    var protoFsmVal  = partSnapshot.FindModule("ModuleProceduralFairing")?.moduleValues?.GetValue("fsm");

                    if (protoFsmVal != null && currentState.ToString() != protoFsmVal)
                    {
                        fairingModule.DeployFairing();
                    }
                }
            }
        }
コード例 #8
0
 public ProtoHarvesterDevice(Harvester prefab, ProtoPartSnapshot protoPart, ProtoPartModuleSnapshot protoModule)
     : base(prefab, protoPart, protoModule)
 {
     this.animator = protoPart.FindModule("ModuleAnimationGroup");
 }
コード例 #9
0
        /// <summary>
        /// Read the part data of an unloaded/loaded vessel and store in data structures
        /// </summary>
        protected List <CNCAntennaPartInfo> readAntennaData()
        {
            List <CNCAntennaPartInfo> antennas = new List <CNCAntennaPartInfo>();
            int numParts = (!this.vessel.loaded) ? this.vessel.protoVessel.protoPartSnapshots.Count : this.vessel.Parts.Count;

            //inspect each part
            for (int partIndex = 0; partIndex < numParts; partIndex++)
            {
                Part thisPart;
                ProtoPartSnapshot partSnapshot = null;

                if (this.Vessel.loaded)
                {
                    thisPart = this.vessel.Parts[partIndex];
                }
                else
                {
                    partSnapshot = this.vessel.protoVessel.protoPartSnapshots[partIndex];
                    thisPart     = partSnapshot.partInfo.partPrefab;
                }

                bool populatedAntennaInfo = false;
                CNCAntennaPartInfo      newAntennaPartInfo = new CNCAntennaPartInfo();;
                ProtoPartModuleSnapshot partModuleSnapshot = null;

                //inspect each module of the part
                for (int moduleIndex = 0; moduleIndex < thisPart.Modules.Count; moduleIndex++)
                {
                    PartModule thisPartModule = thisPart.Modules[moduleIndex];

                    if (thisPartModule is CNConstellationAntennaModule) // is it CNConstellationAntennaModule?
                    {
                        if (!this.Vessel.loaded)
                        {
                            partModuleSnapshot = partSnapshot.FindModule(thisPartModule, moduleIndex);

                            newAntennaPartInfo.frequency = short.Parse(partModuleSnapshot.moduleValues.GetValue("Frequency"));
                            string oname = partModuleSnapshot.moduleValues.GetValue("OptionalName");
                            newAntennaPartInfo.name     = (oname.Length == 0) ? partSnapshot.partInfo.title : oname;
                            newAntennaPartInfo.inUse    = bool.Parse(partModuleSnapshot.moduleValues.GetValue("InUse"));
                            newAntennaPartInfo.CosAngle = double.Parse(partModuleSnapshot.moduleValues.GetValue("CosAngle"));
                        }
                        else
                        {
                            CNConstellationAntennaModule antennaMod = (CNConstellationAntennaModule)thisPartModule;
                            newAntennaPartInfo.frequency = antennaMod.Frequency;
                            newAntennaPartInfo.name      = antennaMod.Name;
                            newAntennaPartInfo.inUse     = antennaMod.InUse;
                        }

                        populatedAntennaInfo = true;
                    }
                    else if (thisPartModule is ICommAntenna) // is it ModuleDataTransmitter?
                    {
                        ICommAntenna thisAntenna = thisPartModule as ICommAntenna;

                        if (!this.Vessel.loaded)
                        {
                            partModuleSnapshot = partSnapshot.FindModule(thisPartModule, moduleIndex);
                        }

                        newAntennaPartInfo.antennaPower              = (!this.vessel.loaded) ? thisAntenna.CommPowerUnloaded(partModuleSnapshot) : thisAntenna.CommPower;
                        newAntennaPartInfo.antennaCombinable         = thisAntenna.CommCombinable;
                        newAntennaPartInfo.antennaCombinableExponent = thisAntenna.CommCombinableExponent;
                        newAntennaPartInfo.antennaType           = thisAntenna.CommType;
                        newAntennaPartInfo.partReference         = thisPart; //unique ID for part is not available
                        newAntennaPartInfo.partSnapshotReference = partSnapshot;
                        newAntennaPartInfo.canComm = (!this.vessel.loaded) ? thisAntenna.CanCommUnloaded(partModuleSnapshot) : thisAntenna.CanComm();

                        populatedAntennaInfo = true;
                    }
                }

                if (populatedAntennaInfo) // valid info?
                {
                    antennas.Add(newAntennaPartInfo);
                    CNCLog.Debug("CommNet Vessel '{0}' has antenna '{1}' of {2} and {3} power (w/o range modifier)", this.Vessel.GetName(), newAntennaPartInfo.name, newAntennaPartInfo.frequency, newAntennaPartInfo.antennaPower);
                }
            }

            return(antennas);
        }
コード例 #10
0
        public Antenna_Info(Vessel v)
        {
            List <AntennaPartInfo> adaptorsInfoList = new List <AntennaPartInfo>();

            int numParts = (!v.loaded) ? v.protoVessel.protoPartSnapshots.Count : v.Parts.Count;

            for (int partIndex = 0; partIndex < numParts; partIndex++)
            {
                Part part;
                ProtoPartSnapshot protoPart = null;

                if (v.loaded)
                {
                    part = v.Parts[partIndex];
                }
                else
                {
                    protoPart = v.protoVessel.protoPartSnapshots[partIndex];
                    part      = PartLoader.getPartInfoByName(protoPart.partName).partPrefab;
                }

                bool                    hasInfo         = false;
                AntennaPartInfo         antennaPartInfo = new AntennaPartInfo();
                ProtoPartModuleSnapshot protoPartModule = null;

                // Inspect each module of the part
                for (int moduleIndex = 0; moduleIndex < part.Modules.Count; moduleIndex++)
                {
                    NetworkAdaptor antennaMod = new NetworkAdaptor();
                    PartModule     pModule    = part.Modules[moduleIndex];
                    if (pModule is NetworkAdaptor)
                    {
                        if (v.loaded)
                        {
                            antennaMod = (NetworkAdaptor)pModule;
                            antennaPartInfo.frequency = antennaMod.frequency;
                            antennaPartInfo.ecCost    = antennaMod.ecCost;
                            antennaPartInfo.rate      = antennaMod.rate;
                            antennaPartInfo.name      = part.partInfo.title;
                        }
                        else
                        {
                            ProtoPartModuleSnapshot netAdaptor = FlightGlobals.FindProtoPartByID(protoPart.flightID).FindModule("NetworkAdaptor");
                            antennaPartInfo.frequency = Lib.Proto.GetShort(netAdaptor, "frequency");
                            antennaPartInfo.ecCost    = Lib.Proto.GetDouble(netAdaptor, "ecCost");
                            antennaPartInfo.rate      = Lib.Proto.GetDouble(netAdaptor, "rate");
                            antennaPartInfo.name      = protoPart.partInfo.title;
                        }

                        hasInfo = true;
                    }
                    else if (pModule is ICommAntenna)
                    {
                        ICommAntenna antenna = pModule as ICommAntenna;

                        // This method only works when v.Loaded, otherwise this brings a wrong deployState
                        ModuleDeployableAntenna anim = part.FindModuleImplementing <ModuleDeployableAntenna>();

                        // Assume extended if there is no animator
                        if (anim != null)
                        {
                            if (!v.loaded)
                            {
                                // This method works to !v.Loaded
                                ProtoPartModuleSnapshot deployState = FlightGlobals.FindProtoPartByID(protoPart.flightID).FindModule("ModuleDeployableAntenna");
                                antennaPartInfo.deployState = Lib.KCOMMNET.String_to_DeployState(Lib.Proto.GetString(deployState, "deployState"));
                            }
                            else
                            {
                                antennaPartInfo.deployState = anim.deployState;
                            }
                        }
                        else
                        {
                            antennaPartInfo.deployState = ModuleDeployablePart.DeployState.EXTENDED;
                        }

                        if (!v.loaded)
                        {
                            protoPartModule = protoPart.FindModule(pModule, moduleIndex);
                        }

                        antennaPartInfo.antennaPower              = (!v.loaded) ? antenna.CommPowerUnloaded(protoPartModule) : antenna.CommPower;
                        antennaPartInfo.antennaCombinable         = antenna.CommCombinable;
                        antennaPartInfo.antennaCombinableExponent = antenna.CommCombinableExponent;
                        antennaPartInfo.antennaType = antenna.CommType;
                        //antennaPartInfo.partReference = part;
                        //antennaPartInfo.partSnapshotReference = protoPart;
                        antennaPartInfo.canComm = (!v.loaded) ? antenna.CanCommUnloaded(protoPartModule) : antenna.CanComm();

                        hasInfo = true;
                    }
                }

                if (hasInfo)
                {
                    adaptorsInfoList.Add(antennaPartInfo);
                }
            }

            freqSortedList     = adaptorsInfoList.OrderBy(a => a.frequency).ToList(); // order by frequency
            adaptorsSortedList = adaptorsInfoList.OrderBy(a => a.name).ToList();      // order by device name

            AntennaCalc(freqSortedList);
        }
コード例 #11
0
        public AntennaInfoCommNet(Vessel v, bool powered, bool storm, bool transmitting)
        {
            int transmitterCount = 0;

            rate = 1;
            double ec_transmitter = 0;

            // if vessel is loaded
            if (v.loaded)
            {
                List <ModuleDataTransmitter> transmitters;

                if (!Cache.HasVesselObjectsCache(v, "commnet"))
                {
                    // find transmitters
                    transmitters = v.FindPartModulesImplementing <ModuleDataTransmitter>();
                    if (transmitters == null)
                    {
                        transmitters = new List <ModuleDataTransmitter>();
                    }
                    Cache.SetVesselObjectsCache(v, "commnet", transmitters);
                }
                else
                {
                    transmitters = Cache.VesselObjectsCache <List <ModuleDataTransmitter> >(v, "commnet");
                }

                foreach (ModuleDataTransmitter t in transmitters)
                {
                    // Disable all stock buttons
                    t.Events["TransmitIncompleteToggle"].active = false;
                    t.Events["StartTransmission"].active        = false;
                    t.Events["StopTransmission"].active         = false;
                    t.Actions["StartTransmissionAction"].active = false;

                    if (t.antennaType == AntennaType.INTERNAL)                     // do not include internal data rate, ec cost only
                    {
                        ec += t.DataResourceCost * t.DataRate;
                    }
                    else
                    {
                        // do we have an animation
                        ModuleDeployableAntenna animation        = t.part.FindModuleImplementing <ModuleDeployableAntenna>();
                        ModuleAnimateGeneric    animationGeneric = t.part.FindModuleImplementing <ModuleAnimateGeneric>();
                        if (animation != null)
                        {
                            // only include data rate and ec cost if transmitter is extended
                            if (animation.deployState == ModuleDeployablePart.DeployState.EXTENDED)
                            {
                                rate *= t.DataRate;
                                transmitterCount++;
                                var e = t.DataResourceCost * t.DataRate;
                                ec_transmitter += e;
                            }
                        }
                        else if (animationGeneric != null)
                        {
                            // only include data rate and ec cost if transmitter is extended
                            if (animationGeneric.animSpeed > 0)
                            {
                                rate *= t.DataRate;
                                transmitterCount++;
                                var e = t.DataResourceCost * t.DataRate;
                                ec_transmitter += e;
                            }
                        }
                        // no animation
                        else
                        {
                            rate *= t.DataRate;
                            transmitterCount++;
                            var e = t.DataResourceCost * t.DataRate;
                            ec_transmitter += e;
                        }
                    }
                }
            }
            // if vessel is not loaded
            else
            {
                List <KeyValuePair <ModuleDataTransmitter, ProtoPartSnapshot> > transmitters;
                if (!Cache.HasVesselObjectsCache(v, "commnet_bg"))
                {
                    transmitters = new List <KeyValuePair <ModuleDataTransmitter, ProtoPartSnapshot> >();
                    // find proto transmitters
                    foreach (ProtoPartSnapshot p in v.protoVessel.protoPartSnapshots)
                    {
                        // get part prefab (required for module properties)
                        Part part_prefab = PartLoader.getPartInfoByName(p.partName).partPrefab;

                        foreach (ModuleDataTransmitter t in part_prefab.FindModulesImplementing <ModuleDataTransmitter>())
                        {
                            transmitters.Add(new KeyValuePair <ModuleDataTransmitter, ProtoPartSnapshot>(t, p));
                        }
                    }

                    Cache.SetVesselObjectsCache(v, "commnet_bg", transmitters);
                }
                else
                {
                    // cache transmitters
                    transmitters = Cache.VesselObjectsCache <List <KeyValuePair <ModuleDataTransmitter, ProtoPartSnapshot> > >(v, "commnet_bg");
                }

                foreach (var pair in transmitters)
                {
                    ModuleDataTransmitter t = pair.Key;
                    ProtoPartSnapshot     p = pair.Value;

                    if (t.antennaType == AntennaType.INTERNAL)                     // do not include internal data rate, ec cost only
                    {
                        ec += t.DataResourceCost * t.DataRate;
                    }
                    else
                    {
                        // do we have an animation
                        ProtoPartModuleSnapshot m = p.FindModule("ModuleDeployableAntenna") ?? p.FindModule("ModuleAnimateGeneric");
                        if (m != null)
                        {
                            // only include data rate and ec cost if transmitter is extended
                            string deployState = Lib.Proto.GetString(m, "deployState");
                            float  animSpeed   = Lib.Proto.GetFloat(m, "animSpeed");
                            if (deployState == "EXTENDED" || animSpeed > 0)
                            {
                                rate *= t.DataRate;
                                transmitterCount++;
                                ec_transmitter += t.DataResourceCost * t.DataRate;
                            }
                        }
                        // no animation
                        else
                        {
                            rate *= t.DataRate;
                            transmitterCount++;
                            ec_transmitter += t.DataResourceCost * t.DataRate;
                        }
                    }
                }
            }

            if (transmitterCount > 1)
            {
                rate = Math.Pow(rate, 1.0 / transmitterCount);
            }
            else if (transmitterCount == 0)
            {
                rate = 0;
            }

            // when transmitting, transmitters need more EC for the signal amplifiers.
            // while not transmitting, transmitters only use 10-20% of that
            ec_transmitter *= transmitting ? Settings.TransmitterActiveEcFactor : Settings.TransmitterPassiveEcFactor;

            ec += ec_transmitter;

            Init(v, powered, storm);
        }
コード例 #12
0
        public virtual AntennaInfo AntennaInfo()
        {
            int transmitterCount = 0;

            antennaInfo.rate = 1;
            double ec_transmitter = 0;

            // if vessel is loaded
            if (v.loaded)
            {
                List <ModuleDataTransmitter> transmitters = GetTransmittersLoaded(v);

                foreach (ModuleDataTransmitter t in transmitters)
                {
                    // Disable all stock buttons
                    t.Events["TransmitIncompleteToggle"].active = false;
                    t.Events["StartTransmission"].active        = false;
                    t.Events["StopTransmission"].active         = false;
                    t.Actions["StartTransmissionAction"].active = false;

                    // ignore broken / disabled transmitters
                    if (!t.isEnabled)
                    {
                        continue;
                    }

                    if (t.antennaType == AntennaType.INTERNAL)                     // do not include internal data rate, ec cost only
                    {
                        antennaInfo.ec += t.DataResourceCost * t.DataRate;
                    }
                    else
                    {
                        // do we have an animation
                        ModuleDeployableAntenna animation        = t.part.FindModuleImplementing <ModuleDeployableAntenna>();
                        ModuleAnimateGeneric    animationGeneric = t.part.FindModuleImplementing <ModuleAnimateGeneric>();
                        if (animation != null)
                        {
                            // only include data rate and ec cost if transmitter is extended
                            if (animation.deployState == ModuleDeployablePart.DeployState.EXTENDED)
                            {
                                antennaInfo.rate *= t.DataRate;
                                transmitterCount++;
                                var e = t.DataResourceCost * t.DataRate;
                                ec_transmitter += e;
                            }
                        }
                        else if (animationGeneric != null)
                        {
                            // only include data rate and ec cost if transmitter is extended
                            if (animationGeneric.animSpeed > 0)
                            {
                                antennaInfo.rate *= t.DataRate;
                                transmitterCount++;
                                var e = t.DataResourceCost * t.DataRate;
                                ec_transmitter += e;
                            }
                        }
                        // no animation
                        else
                        {
                            antennaInfo.rate *= t.DataRate;
                            transmitterCount++;
                            var e = t.DataResourceCost * t.DataRate;
                            ec_transmitter += e;
                        }
                    }
                }
            }
            // if vessel is not loaded
            else
            {
                List <KeyValuePair <ModuleDataTransmitter, ProtoPartSnapshot> > transmitters = GetTransmittersUnloaded(v);

                foreach (var pair in transmitters)
                {
                    ModuleDataTransmitter t = pair.Key;
                    ProtoPartSnapshot     p = pair.Value;

                    // ignore broken/disabled transmitters
                    var mdt = p.FindModule("ModuleDataTransmitter");
                    if (mdt != null && !Lib.Proto.GetBool(mdt, "isEnabled", true))
                    {
                        continue;
                    }

                    if (t.antennaType == AntennaType.INTERNAL)                     // do not include internal data rate, ec cost only
                    {
                        antennaInfo.ec += t.DataResourceCost * t.DataRate;
                    }
                    else
                    {
                        // do we have an animation
                        ProtoPartModuleSnapshot m = p.FindModule("ModuleDeployableAntenna") ?? p.FindModule("ModuleAnimateGeneric");
                        if (m != null)
                        {
                            // only include data rate and ec cost if transmitter is extended
                            string deployState = Lib.Proto.GetString(m, "deployState");
                            float  animSpeed   = Lib.Proto.GetFloat(m, "animSpeed");
                            if (deployState == "EXTENDED" || animSpeed > 0)
                            {
                                antennaInfo.rate *= t.DataRate;
                                transmitterCount++;
                                ec_transmitter += t.DataResourceCost * t.DataRate;
                            }
                        }
                        // no animation
                        else
                        {
                            antennaInfo.rate *= t.DataRate;
                            transmitterCount++;
                            ec_transmitter += t.DataResourceCost * t.DataRate;
                        }
                    }
                }
            }

            if (transmitterCount > 1)
            {
                antennaInfo.rate = Math.Pow(antennaInfo.rate, 1.0 / transmitterCount);
            }

            else if (transmitterCount == 0)
            {
                antennaInfo.rate = 0;
            }

            // when transmitting, transmitters need more EC for the signal amplifiers.
            // while not transmitting, transmitters only use 10-20% of that
            ec_transmitter *= antennaInfo.transmitting ? Settings.TransmitterActiveEcFactor : Settings.TransmitterPassiveEcFactor;

            antennaInfo.ec      = ec_transmitter * Settings.TransmitterActiveEcFactor;
            antennaInfo.ec_idle = ec_transmitter * Settings.TransmitterPassiveEcFactor;

            Init();

            if (antennaInfo.linked && transmitterCount > 0)
            {
                var bitsPerMB = 1024.0 * 1024.0 * 8.0;
                antennaInfo.rate += Settings.DataRateMinimumBitsPerSecond / bitsPerMB;
            }

            return(antennaInfo);
        }
コード例 #13
0
        public static void BackgroundUpdate(Vessel v, ProtoPartSnapshot p, ProtoPartModuleSnapshot antenna, Vessel_Info vi, Resource_Info ec, double elapsed_s)
        {
            if (Features.Deploy)
            {
                bool isDeploy;
                bool has_ec = ec.amount > double.Epsilon;

                ProtoPartModuleSnapshot deployModule = p.FindModule("AntennaDeploy");
                ProtoPartModuleSnapshot anim;

                if (deployModule == null)
                {
                    Lib.Debug("AntennaDeploy is null. Load vessel to try fix it");
                    return;
                }

                // if it is transmitting, leave with Kerbalism
                if (Features.Science && (vi.transmitting.Length > 0 || vi.relaying.Length > 0))
                {
                    return;
                }

                if (has_ec)
                {
                    if (Features.Signal)
                    {
                        anim = p.FindModule("ModuleAnimationGroup");
                        if (anim != null)
                        {
                            isDeploy = Lib.Proto.GetBool(anim, "isDeployed");
                        }
                        else
                        {
                            isDeploy = true;
                        }

                        if (!Settings.ExtendedAntenna || isDeploy)
                        {
                            Lib.Proto.Set(antenna, "extended", true);
                            ec.Consume(Lib.Proto.GetDouble(deployModule, "ecCost") * elapsed_s);
                        }
                    }
                    else if (Features.KCommNet)
                    {
                        anim = p.FindModule("ModuleDeployableAntenna");
                        if (anim != null)
                        {
                            isDeploy = Lib.Proto.GetString(anim, "deployState") == "EXTENDED";
                        }
                        else
                        {
                            isDeploy = true;
                        }

                        if (isDeploy)
                        {
                            Lib.Proto.Set(antenna, "canComm", true);
                            ec.Consume(Lib.Proto.GetDouble(deployModule, "ecCost") * elapsed_s);
                        }
                    }
                }
                else
                {
                    if (Features.Signal)
                    {
                        Lib.Proto.Set(antenna, "extended", false);
                    }
                    else if (Features.KCommNet)
                    {
                        Lib.Proto.Set(antenna, "canComm", false);
                    }
                }
            }
        }