Exemple #1
0
        internal static double CalculateOtherPower(Vessel vessel)
        {
            double otherPower = 0;
            List <ModuleGenerator> powerModules =
                vessel.FindPartModulesImplementing <ModuleGenerator> ();

            for (int i = 0; i < powerModules.Count; i++)
            {
                // Find standard RTGs
                ModuleGenerator powerModule = powerModules [i];
                if (powerModule.generatorIsActive || powerModule.isAlwaysActive)
                {
                    for (int j = 0; j < powerModule.resHandler.outputResources.Count; ++j)
                    {
                        var resource = powerModule.resHandler.outputResources [j];
                        if (resource.name == "ElectricCharge")
                        {
                            otherPower += resource.rate * powerModule.efficiency;
                        }
                    }
                }
            }

            for (int i = 0; i < vessel.parts.Count; i++)
            {
                var part = vessel.parts [i];
                // Search for other generators
                PartModuleList modules = part.Modules;

                for (int j = 0; j < modules.Count; j++)
                {
                    var module = modules [j];

                    // Near future fission reactors
                    if (module.moduleName == "FissionGenerator")
                    {
                        otherPower += double.Parse(module.Fields.GetValue("CurrentGeneration").ToString());
                    }
                }

                // USI reactors
                ModuleResourceConverter converterModule = part.FindModuleImplementing <ModuleResourceConverter> ();
                if (converterModule != null)
                {
                    if (converterModule.ModuleIsActive() && converterModule.ConverterName == "Reactor")
                    {
                        for (int j = 0; j < converterModule.outputList.Count; ++j)
                        {
                            var resource = converterModule.outputList [j];
                            if (resource.ResourceName == "ElectricCharge")
                            {
                                otherPower += resource.Ratio * converterModule.GetEfficiencyMultiplier();
                            }
                        }
                    }
                }
            }
            return(otherPower);
        }         // So many ifs.....
Exemple #2
0
        private void AttemptTransfer()
        {
            Part targetPart = GetPartClicked();

            // No part was clicked
            if (targetPart == null)
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoPartSelected"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                EndTransfer();
            }
            else
            {
                // part cannot be on another vessel
                if (!VesselConnected(targetPart))
                {
                    ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortUnconnected"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    EndTransfer();
                    return;
                }

                RadioactiveStorageContainer container = targetPart.GetComponent <RadioactiveStorageContainer>();
                if (container == null)
                {
                    ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoRadStorage"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    EndTransfer();
                }
                else
                {
                    ModuleResourceConverter converter = container.GetComponent <ModuleResourceConverter>();
                    FissionReactor          reactor   = container.GetComponent <FissionReactor>();

                    if (core != null && core.CoreTemperature > container.MaxTempForTransfer)
                    {
                        ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortTooHot", container.MaxTempForTransfer.ToString("F0")), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }
                    else if (converter != null && converter.ModuleIsActive())
                    {
                        ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortToRunningConverter"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }
                    else if (reactor != null && reactor.ModuleIsActive())
                    {
                        ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortToRunningReactor"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }
                    else
                    {
                        // get available space in the target container
                        double availableSpace    = container.GetResourceAmount(curTransferType, true) - container.GetResourceAmount(curTransferType);
                        double availableResource = this.GetResourceAmount(curTransferType);
                        // transfer as much as possible
                        double amount = this.part.RequestResource(curTransferType, availableSpace);
                        container.part.RequestResource(curTransferType, -amount);
                        ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_Success", amount.ToString("F1"), curTransferType.ToString()), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                        transferring    = false;
                        curTransferType = "";
                    }
                }
            }
        }
        protected void EvaluateSafety()
        {
            // ModuleResourceConverter (ie fission reactor)
            if (converter != null)
            {
                if (converter.ModuleIsActive())
                {
                    Unsafe = true;
                    Utils.Log("This part is now unsafe!");
                }
            }

            // ModuleEnginesFX (ie nuclear engine)
            foreach (ModuleEnginesFX engine in engines)
            {
                if (engine.EngineIgnited)
                {
                    Unsafe = true;
                    Utils.Log("This part is now unsafe!");
                }
            }
        }
Exemple #4
0
        public bool PartCanTransferResource(string nm)
        {
            // Some modules need to be off.
            ModuleResourceConverter converter = GetComponent <ModuleResourceConverter>();
            FissionReactor          reactor   = GetComponent <FissionReactor>();

            if (converter != null && converter.ModuleIsActive())
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortFromRunningConverter"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }
            if (reactor != null && reactor.ModuleIsActive())
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortFromRunningReactor"), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }

            // Fail if the part is too hot
            if (core != null && core.CoreTemperature > MaxTempForTransfer)
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortTooHot", MaxTempForTransfer.ToString("F0")), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }
            // Fail if that part can't contain this resource
            if ((GetResourceAmount(nm, true) <= 0d))
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoResource", nm), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }
            // Fail if this part has no resource
            if (GetResourceAmount(nm) <= 0d)
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(Localizer.Format("#LOC_NFElectrical_ModuleRadioactiveStorageContainer_Message_AbortNoResource", nm), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }

            return(true);
        }
Exemple #5
0
        public bool PartCanTransferResource(string nm)
        {
            // Some modules need to be off.
            ModuleResourceConverter converter = GetComponent <ModuleResourceConverter>();
            FissionReactor          reactor   = GetComponent <FissionReactor>();

            if (converter != null && converter.ModuleIsActive())
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer from a running converter!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }
            if (reactor != null && reactor.ModuleIsActive())
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer from a running reactor! Seriously a bad idea!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }

            // Fail if the part is too hot
            if (part.temperature > MaxTempForTransfer)
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage(String.Format("This part must be below {0:F0} K to transfer!", MaxTempForTransfer), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }
            // Fail if that part can't contain this resource
            if ((GetResourceAmount(nm, true) <= 0d))
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage("This part has no " + nm + " to transfer!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }
            // Fail if this part has no resource
            if (GetResourceAmount(nm) <= 0d)
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage("This part has no " + nm + " to transfer!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                return(false);
            }

            return(true);
        }
        /// <summary>
        /// Calculate available power from generators and reactors
        /// </summary>
        /// <returns></returns>
        private double GetAvailablePower_Other()
        {
            double otherPower = 0;

            // Go through all parts and get power from generators and reactors
            for (int i = 0; i < vessel.parts.Count; ++i)
            {
                var part = vessel.parts[i];

                // Standard RTG
                ModuleGenerator powerModule = part.FindModuleImplementing <ModuleGenerator>();
                if (powerModule != null)
                {
                    if (powerModule.generatorIsActive || powerModule.isAlwaysActive)
                    {
                        // Go through resources and get EC power
                        for (int j = 0; j < powerModule.resHandler.outputResources.Count; ++j)
                        {
                            var resource = powerModule.resHandler.outputResources[j];
                            if (resource.name == "ElectricCharge")
                            {
                                otherPower += resource.rate * powerModule.efficiency;
                            }
                        }
                    }
                }

                // Other generators
                PartModuleList modules = part.Modules;
                for (int j = 0; j < modules.Count; ++j)
                {
                    var module = modules[j];

                    // Near future fission reactors
                    if (module.moduleName == "FissionGenerator")
                    {
                        otherPower += double.Parse(module.Fields.GetValue("CurrentGeneration").ToString());
                    }

                    // KSP Interstellar generators
                    if ((module.moduleName == "ThermalElectricEffectGenerator") || (module.moduleName == "IntegratedThermalElectricPowerGenerator") || (module.moduleName == "ThermalElectricPowerGenerator") ||
                        (module.moduleName == "IntegratedChargedParticlesPowerGenerator") || (module.moduleName == "ChargedParticlesPowerGenerator") || (module.moduleName == "FNGenerator"))
                    {
                        if (bool.Parse(module.Fields.GetValue("IsEnabled").ToString()))
                        {
                            //otherPower += double.Parse(module.Fields.GetValue("maxElectricdtps").ToString()); // Doesn't work as expected

                            string maxPowerStr = module.Fields.GetValue("MaxPowerStr").ToString();
                            double maxPower    = 0;

                            if (maxPowerStr.Contains("GW"))
                            {
                                maxPower = double.Parse(maxPowerStr.Replace(" GW", "")) * 1000000;
                            }
                            else if (maxPowerStr.Contains("MW"))
                            {
                                maxPower = double.Parse(maxPowerStr.Replace(" MW", "")) * 1000;
                            }
                            else
                            {
                                maxPower = double.Parse(maxPowerStr.Replace(" KW", ""));
                            }

                            otherPower += maxPower;
                        }
                    }
                }

                // WBI reactors, USI reactors and MKS Power Pack
                ModuleResourceConverter converterModule = part.FindModuleImplementing <ModuleResourceConverter>();
                if (converterModule != null)
                {
                    if (converterModule.ModuleIsActive() &&
                        ((converterModule.ConverterName == "Nuclear Reactor") || (converterModule.ConverterName == "Reactor") || (converterModule.ConverterName == "Generator")))
                    {
                        for (int j = 0; j < converterModule.outputList.Count; ++j)
                        {
                            var resource = converterModule.outputList[j];
                            if (resource.ResourceName == "ElectricCharge")
                            {
                                otherPower += resource.Ratio * converterModule.GetEfficiencyMultiplier();
                            }
                        }
                    }
                }
            }

            return(otherPower);
        }
Exemple #7
0
        private double CalculateOtherPower()
        {
            double otherPower = 0;

            for (int i = 0; i < this.vessel.parts.Count; ++i)
            {
                var part = this.vessel.parts[i];
                // Find standard RTGs
                ModuleGenerator powerModule = part.FindModuleImplementing <ModuleGenerator>();
                if (powerModule != null)
                {
                    if (powerModule.generatorIsActive || powerModule.isAlwaysActive)
                    {
                        for (int j = 0; j < powerModule.resHandler.outputResources.Count; ++j)
                        {
                            var resource = powerModule.resHandler.outputResources[j];
                            if (resource.name == "ElectricCharge")
                            {
                                otherPower += resource.rate * powerModule.efficiency;
                            }
                        }
                    }
                }

                // Search for other generators
                PartModuleList modules = part.Modules;

                for (int j = 0; j < modules.Count; ++j)
                {
                    var module = modules[j];

                    // Near future fission reactors
                    if (module.moduleName == "FissionGenerator")
                    {
                        otherPower += double.Parse(module.Fields.GetValue("CurrentGeneration").ToString());
                    }

                    // KSP Interstellar generators
                    if (module.moduleName == "FNGenerator")
                    {
                        string maxPowerStr = module.Fields.GetValue("MaxPowerStr").ToString();
                        double maxPower    = 0;

                        if (maxPowerStr.Contains("GW"))
                        {
                            maxPower = double.Parse(maxPowerStr.Replace(" GW", "")) * 1000000;
                        }
                        else if (maxPowerStr.Contains("MW"))
                        {
                            maxPower = double.Parse(maxPowerStr.Replace(" MW", "")) * 1000;
                        }
                        else
                        {
                            maxPower = double.Parse(maxPowerStr.Replace(" KW", ""));
                        }

                        otherPower += maxPower;
                    }
                }

                // WBI reactors, USI reactors and MKS Power Pack
                ModuleResourceConverter converterModule = part.FindModuleImplementing <ModuleResourceConverter>();
                if (converterModule != null)
                {
                    if (converterModule.ModuleIsActive() &&
                        ((converterModule.ConverterName == "Nuclear Reactor") || (converterModule.ConverterName == "Reactor") || (converterModule.ConverterName == "Generator")))
                    {
                        for (int j = 0; j < converterModule.outputList.Count; ++j)
                        {
                            var resource = converterModule.outputList[j];
                            if (resource.ResourceName == "ElectricCharge")
                            {
                                otherPower += resource.Ratio * converterModule.GetEfficiencyMultiplier();
                            }
                        }
                    }
                }
            }
            return(otherPower);
        }         // So many ifs.....
Exemple #8
0
        private void AttemptTransfer()
        {
            Part targetPart = GetPartClicked();

            // No part was clicked
            if (targetPart == null)
            {
                ScreenMessages.PostScreenMessage(new ScreenMessage("No part selected, exiting transfer mode...", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                EndTransfer();
            }
            else
            {
                // part cannot be on another vessel
                if (!VesselConnected(targetPart))
                {
                    ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer to an unconnected vessel, exiting transfer mode...", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    EndTransfer();
                    return;
                }

                RadioactiveStorageContainer container = targetPart.GetComponent <RadioactiveStorageContainer>();
                if (container == null)
                {
                    ScreenMessages.PostScreenMessage(new ScreenMessage("Selected part can't handle radioactive storage, exiting transfer mode...", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    EndTransfer();
                }
                else
                {
                    Debug.Log("A");
                    ModuleResourceConverter converter = container.GetComponent <ModuleResourceConverter>();
                    FissionReactor          reactor   = container.GetComponent <FissionReactor>();
                    Debug.Log("B");
                    if (part.temperature > container.MaxTempForTransfer)
                    {
                        ScreenMessages.PostScreenMessage(new ScreenMessage(String.Format("Selected part must be below {0:F0} K to transfer!", container.MaxTempForTransfer), 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }

                    else if (converter != null && converter.ModuleIsActive())
                    {
                        ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer into a running converter!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }
                    else if (reactor != null && reactor.ModuleIsActive())
                    {
                        ScreenMessages.PostScreenMessage(new ScreenMessage("Cannot transfer into a running reactor! Seriously a bad idea!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }
                    else
                    {
                        Debug.Log("s");
                        // get available space in the target container
                        double availableSpace    = container.GetResourceAmount(curTransferType, true) - container.GetResourceAmount(curTransferType);
                        double availableResource = this.GetResourceAmount(curTransferType);
                        Debug.Log("1");
                        // transfer as much as possible
                        double amount = this.part.RequestResource(curTransferType, availableSpace);
                        container.part.RequestResource(curTransferType, -amount);
                        Debug.Log("2");
                        ScreenMessages.PostScreenMessage(new ScreenMessage(String.Format("Transferred {0:F0} ", amount) + curTransferType + " to container!", 5.0f, ScreenMessageStyle.UPPER_CENTER));
                    }
                }
            }
        }