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.....
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!"); } } }
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); }
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); }
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.....
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)); } } } }