[KSPEvent(groupName = GROUP, guiActive = true, guiName = "#LOC_KSPIE_ISRUScoop_ToggleResource", active = true)]//Toggle Resource public void ToggleResource() { currentresource++; if (AtmosphericResourceHandler.GetAtmosphericResourceName(vessel.mainBody, currentresource) == null && AtmosphericResourceHandler.GetAtmosphericResourceContent(vessel.mainBody, currentresource) > 0 && currentresource != 0) { ToggleResource(); } if (currentresource >= AtmosphericResourceHandler.GetAtmosphericCompositionForBody(vessel.mainBody).Count) { currentresource = 0; } resflow = String.Empty; resflowf = 0; }
private void ScoopAtmosphere(double deltaTimeInSeconds, bool offlineCollecting) { string currentResourceName = AtmosphericResourceHandler.GetAtmosphericResourceName(vessel.mainBody, currentresource); string resourceDisplayName = AtmosphericResourceHandler.GetAtmosphericResourceDisplayName(vessel.mainBody, currentresource); if (currentResourceName == null) { resflowf = 0; recievedPower = Localizer.Format("#LOC_KSPIE_ISRUScoop_error"); //"error" densityFractionOfUpperAthmosphere = Localizer.Format("#LOC_KSPIE_ISRUScoop_error"); //"error" return; } // map ors resource to kspi resource if (PluginHelper.OrsResourceMappings == null || !PluginHelper.OrsResourceMappings.TryGetValue(currentResourceName, out resourceStoragename)) { resourceStoragename = currentResourceName; } else if (!PartResourceLibrary.Instance.resourceDefinitions.Contains(resourceStoragename)) { resourceStoragename = currentResourceName; } var definition = PartResourceLibrary.Instance.GetDefinition(resourceStoragename); if (definition == null) { return; } double resourceDensity = definition.density; double maxAltitudeAtmosphere = PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody); double upperAtmosphereFraction = Math.Max(0, (vessel.altitude - maxAltitudeAtmosphere) / Math.Max(0.000001, maxAltitudeAtmosphere * PluginHelper.MaxAtmosphericAltitudeMult - maxAltitudeAtmosphere)); double upperAtmosphereDensity = 1 - upperAtmosphereFraction; double airDensity = part.vessel.atmDensity + (PluginHelper.MinAtmosphericAirDensity * upperAtmosphereDensity); atmosphericDensity = airDensity.ToString("0.00000000"); var hydrogenTax = 0.4 * Math.Sin(upperAtmosphereFraction * Math.PI * 0.5); var heliumTax = 0.2 * Math.Sin(upperAtmosphereFraction * Math.PI); double resourceFraction = (1.0 - hydrogenTax - heliumTax) * AtmosphericResourceHandler.GetAtmosphericResourceContent(vessel.mainBody, currentresource); // increase density hydrogen if (resourceDisplayName == ResourceSettings.Config.HydrogenGas) { resourceFraction += hydrogenTax; } else if (resourceDisplayName == ResourceSettings.Config.Helium4Gas) { resourceFraction += heliumTax; } densityFractionOfUpperAthmosphere = upperAtmosphereDensity.ToString("P3"); rescourcePercentage = resourceFraction * 100; if (resourceFraction <= 0 || vessel.altitude > (PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody) * PluginHelper.MaxAtmosphericAltitudeMult)) { resflowf = 0; recievedPower = Localizer.Format("#LOC_KSPIE_ISRUScoop_off"); //"off" densityFractionOfUpperAthmosphere = Localizer.Format("#LOC_KSPIE_ISRUScoop_toohigh"); //"too high" rescourcePercentage = 0; return; } double airspeed = part.vessel.srf_velocity.magnitude + 40.0; double air = airspeed * airDensity * 0.001 * scoopair / resourceDensity; double scoopedAtm = air * resourceFraction; double powerRequirementsInMegawatt = 40.0 * scoopair * PluginHelper.PowerConsumptionMultiplier * powerReqMult; if (scoopedAtm > 0 && part.GetResourceSpareCapacity(resourceStoragename) > 0) { // Determine available power, using EC if below 2 MW required double powerReceivedInMegawatt = consumeMegawatts(powerRequirementsInMegawatt, true, false, powerRequirementsInMegawatt < 2.0); last_power_percentage = offlineCollecting ? last_power_percentage : powerReceivedInMegawatt / powerRequirementsInMegawatt; } else { last_power_percentage = 0; powerRequirementsInMegawatt = 0; } recievedPower = PluginHelper.getFormattedPowerString(last_power_percentage * powerRequirementsInMegawatt) + " / " + PluginHelper.getFormattedPowerString(powerRequirementsInMegawatt); double resourceChange = scoopedAtm * last_power_percentage * deltaTimeInSeconds; if (offlineCollecting) { string format = resourceChange > 100 ? "0" : "0.00"; ScreenMessages.PostScreenMessage(Localizer.Format("#LOC_KSPIE_ISRUScoop_CollectedMsg") + " " + resourceChange.ToString(format) + " " + resourceStoragename, 10.0f, ScreenMessageStyle.LOWER_CENTER);//Atmospheric Scoop collected } resflowf = part.RequestResource(resourceStoragename, -resourceChange); resflowf = -resflowf / TimeWarp.fixedDeltaTime; UpdateResourceFlow(); }