public override void OnStart(PartModule.StartState state) { if (state == StartState.Editor) { return; } decay_resource = part.Resources[resourceName]; part.force_activate(); double time_diff = lastActiveTime - Planetarium.GetUniversalTime(); if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct)) { density_rat = decay_resource.info.density / PartResourceLibrary.Instance.GetDefinition(decayProduct).density; } if (time_diff > 0) { double n_0 = decay_resource.amount; decay_resource.amount = n_0 * Math.Exp(-decayConstant * time_diff); double n_change = n_0 - decay_resource.amount; if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct)) { ORSHelper.fixedRequestResource(part, decayProduct, -n_change * density_rat); } } }
public override void OnFixedUpdate() { if (scoopIsEnabled) { string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource); if (atmospheric_resource_name != null) { //Common double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density; double respcent = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource); double airdensity = part.vessel.atmDensity / 1000; double powerrequirements = scoopair / 0.15f * ecRequirement; double airspeed = part.vessel.srf_velocity.magnitude + 40.0; double air = airspeed * airdensity * scoopair / resourcedensity; if (respcent > 0 && vessel.altitude <= ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody)) { double scoopedAtm = air * respcent; float powerreceived = (float)Math.Max(part.RequestResource("ElectricCharge", powerrequirements * TimeWarp.fixedDeltaTime), 0); float powerpcnt = (float)(powerreceived / powerrequirements / TimeWarp.fixedDeltaTime); resflowf = (float)ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime); resflowf = -resflowf / TimeWarp.fixedDeltaTime; } } } }
void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> change) { bool shouldReinitialise = false; if (change.from == Vessel.Situations.DOCKED) { shouldReinitialise = true; } if (change.to == Vessel.Situations.DOCKED) { shouldReinitialise = true; } if (shouldReinitialise) { ORSHelper.removeVesselFromCache(change.host); Debug.Log("[KSP Interstellar] GameEventSubscriber - OnVesselSituationChange reinitialising"); var generators = change.host.FindPartModulesImplementing <FNGenerator>(); generators.ForEach(g => g.OnStart(PartModule.StartState.Docked)); var radiators = change.host.FindPartModulesImplementing <FNRadiator>(); radiators.ForEach(g => g.OnStart(PartModule.StartState.Docked)); } }
public void FixedUpdate() { if (decay_resource == null) { return; } if (!HighLogic.LoadedSceneIsFlight) { return; } lastActiveTime = Planetarium.GetUniversalTime(); if (CheatOptions.UnbreakableJoints) { return; } double decay_amount = decayConstant * decay_resource.amount * TimeWarp.fixedDeltaTime; decay_resource.amount -= decay_amount; if (resourceDefinitionsContainDecayProduct) { ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount * density_rat); } }
public override void OnFixedUpdate() { if (scoopIsEnabled) { string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource); if (atmospheric_resource_name != null) { double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density; double respcent = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource); //double resourcedensity = PartResourceLibrary.Instance.GetDefinition(PluginHelper.atomspheric_resources_tocollect[currentresource]).density; //double respcent = PluginHelper.getAtmosphereResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource); double airdensity = part.vessel.atmDensity / 1000; double powerrequirements = scoopair / 0.15f * 6f; double airspeed = part.vessel.srf_velocity.magnitude + 40.0; double air = airspeed * airdensity * scoopair / resourcedensity; if (respcent > 0 && vessel.altitude <= PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody)) { double scoopedAtm = air * respcent; float powerreceived = Math.Max(consumeFNResource(powerrequirements * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0); float powerpcnt = (float)(powerreceived / powerrequirements / TimeWarp.fixedDeltaTime); //resflowf = (float)part.RequestResource(atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime); resflowf = (float)ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime); resflowf = -resflowf / TimeWarp.fixedDeltaTime; } } else { } } }
public override void OnStart(PartModule.StartState state) { if (state == StartState.Editor) { return; } decay_resource = part.Resources[resourceName]; part.force_activate(); if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct)) { density_rat = decay_resource.info.density / PartResourceLibrary.Instance.GetDefinition(decayProduct).density; } double time_diff = Planetarium.GetUniversalTime() - lastActiveTime; if (time_diff > 0) { double decay_amount = decayWithProductionRate(time_diff); ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount * density_rat); decay_resource.amount -= decay_amount; } lastActiveTime = (float)Planetarium.GetUniversalTime(); }
public double ReprocessFuel(double rate) { if (part.Resources.Contains(InterstellarResourcesConfiguration.Instance.Actinides)) { PartResource actinides = part.Resources[InterstellarResourcesConfiguration.Instance.Actinides]; double new_actinides_amount = Math.Max(actinides.amount - rate, 0); double actinides_change = actinides.amount - new_actinides_amount; actinides.amount = new_actinides_amount; double depleted_fuels_change = actinides_change * 0.2; depleted_fuels_change = -ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.DepletedFuel, -depleted_fuels_change); double sum_useage_per_mw = current_fuel_mode.ReactorFuels.Sum(fuel => fuel.FuelUsePerMJ * fuelUsePerMJMult); foreach (ReactorFuel fuel in current_fuel_mode.ReactorFuels) { PartResource fuel_resource = part.Resources[fuel.FuelName]; double fraction = sum_useage_per_mw > 0.0 ? fuel.FuelUsePerMJ * fuelUsePerMJMult / sum_useage_per_mw : 1; double new_fuel_amount = Math.Min(fuel_resource.amount + depleted_fuels_change * 4.0 * fraction, fuel_resource.maxAmount); fuel_resource.amount = new_fuel_amount; } return(actinides_change); } return(0); }
public override void OnFixedUpdate() { if (CollectorIsEnabled) { string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource); if (atmospheric_resource_name != null) { //range is 10% of the atmosphere var range = ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody) * 1.1; double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density; double respcent = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource); //If we're in the narrow band of the upper atmosphere if (vessel.altitude <= range && respcent > 0 && vessel.altitude >= ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody)) { /** RAILS **/ if (Time.timeSinceLevelLoad < 1.0f || !FlightGlobals.ready) { return; } if (lastUpdateTime == 0.0f) { // Just started running lastUpdateTime = Planetarium.GetUniversalTime(); return; } double deltaTime = Math.Min(Planetarium.GetUniversalTime() - lastUpdateTime, Utilities.MaxDeltaTime); lastUpdateTime += deltaTime; /** RAILS **/ double powerrequirements = particleRate / 0.15f * ecRequirement; double desiredPower = powerrequirements * TimeWarp.fixedDeltaTime; double maxPower = powerrequirements * Math.Max(Utilities.ElectricityMaxDeltaTime, TimeWarp.fixedDeltaTime); var powerRequested = Math.Min(desiredPower, maxPower); double particles = particleRate / resourcedensity; double CollectedParticles = particles * respcent; float powerreceived = (float) Math.Max( part.RequestResource("ElectricCharge", powerRequested), 0); float powerpcnt = (float)(powerreceived / desiredPower); resflowf = (float) ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -CollectedParticles * powerpcnt * deltaTime); resflowf = -resflowf / (float)deltaTime; } } } }
public void produceAntimatterFrame(double rate_multiplier) { double energy_provided = rate_multiplier * GameConstants.baseAMFPowerConsumption * 1E6f; double antimatter_density = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Antimatter).density; double antimatter_mass = energy_provided / GameConstants.warpspeed / GameConstants.warpspeed / 200000.0f / antimatter_density * efficiency; current_rate = -ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Antimatter, -antimatter_mass * TimeWarp.fixedDeltaTime) / TimeWarp.fixedDeltaTime; }
public override void OnFixedUpdate() { double decay_amount = decayConstant * decay_resource.amount * TimeWarp.fixedDeltaTime; decay_resource.amount -= decay_amount; if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct)) { ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount); } }
public override void OnFixedUpdate() { drawCount++; float lat = (float)vessel.mainBody.GetLatitude(this.vessel.GetWorldPos3D()); float flux = VanAllen.getBeltAntiparticles(vessel.mainBody.flightGlobalsIndex, (float)vessel.altitude, lat); //part.RequestResource("Antimatter", -flux * TimeWarp.fixedDeltaTime); ORSHelper.fixedRequestResource(part, "Antimatter", -flux * TimeWarp.fixedDeltaTime); last_active_time = (float)Planetarium.GetUniversalTime(); collection_rate_d = flux * 86400; }
public override void OnFixedUpdate() { double decay_amount = decayConstant * decay_resource.amount * TimeWarp.fixedDeltaTime; decay_resource.amount -= decay_amount; if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct)) { ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount * density_rat); } lastActiveTime = (float)Planetarium.GetUniversalTime(); }
protected override double consumeReactorResource(double resource) { double deuterium_he3_consumption = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_d_he3_cons_constant : resource * GameConstants.antimatter_initiated_d_he3_cons_constant; double un_consumption = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_uf4_cons_constant : resource * GameConstants.antimatter_initiated_uf4_cons_constant; double antimatter_consumption = GameConstants.antimatter_initiated_antimatter_cons_constant * resource; double delta_deut = deuterium.amount - Math.Max(0, deuterium.amount - deuterium_he3_consumption); double delta_he3 = he3.amount - Math.Max(0, he3.amount - deuterium_he3_consumption); double delta_un = un.amount - Math.Max(0, un.amount - un_consumption); double delta_amat = ORSHelper.fixedRequestResource(part, "Antimatter", antimatter_consumption); deuterium.amount = Math.Max(0, deuterium.amount - deuterium_he3_consumption); he3.amount = Math.Max(0, he3.amount - deuterium_he3_consumption); un.amount = Math.Max(0, un.amount - un_consumption); return(resource * Math.Min(delta_deut / deuterium_he3_consumption, Math.Min(delta_he3 / deuterium_he3_consumption, Math.Min(delta_un / un_consumption, delta_amat / antimatter_consumption)))); }
protected override double returnReactorResource(double resource) { double deuterium_he3_consumption = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_d_he3_cons_constant : resource * GameConstants.antimatter_initiated_d_he3_cons_constant; double un_consumption = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_uf4_cons_constant : resource * GameConstants.antimatter_initiated_uf4_cons_constant; double antimatter_consumption = GameConstants.antimatter_initiated_antimatter_cons_constant * resource; double delta_deut = Math.Min(deuterium.maxAmount, deuterium.amount + deuterium_he3_consumption) - deuterium.amount; double delta_he3 = Math.Min(he3.maxAmount, he3.amount + deuterium_he3_consumption) - he3.amount; double delta_un = Math.Min(un.maxAmount, un.amount + un_consumption) - un.amount; double delta_amat = -ORSHelper.fixedRequestResource(part, "Antimatter", -antimatter_consumption); deuterium.amount = Math.Min(deuterium.maxAmount, deuterium.amount + deuterium_he3_consumption); he3.amount = Math.Min(he3.maxAmount, he3.amount + deuterium_he3_consumption); un.amount = Math.Min(un.maxAmount, un.amount + un_consumption); return(resource); }
public void performReprocessingFrame(double rate_multiplier) { List <FNNuclearReactor> nuclear_reactors = vessel.FindPartModulesImplementing <FNNuclearReactor>(); double remaining_capacity_to_reprocess = GameConstants.baseReprocessingRate * TimeWarp.fixedDeltaTime / 86400.0 * rate_multiplier; double enum_actinides_change = 0; double amount_to_reprocess = 0; foreach (FNNuclearReactor nuclear_reactor in nuclear_reactors) { // reprocess each one PartResource actinides = nuclear_reactor.part.Resources["Actinides"]; if (remaining_capacity_to_reprocess > 0) { double new_actinides_amount = Math.Max(actinides.amount - remaining_capacity_to_reprocess, 0); double actinides_change = actinides.amount - new_actinides_amount; actinides.amount = new_actinides_amount; if (nuclear_reactor.uranium_fuel) { PartResource uf4 = nuclear_reactor.part.Resources["UF4"]; double depleted_fuels_change = actinides_change * 0.2; depleted_fuels_change = -ORSHelper.fixedRequestResource(part, "DepletedFuel", -depleted_fuels_change); double new_uf4_amount = Math.Min(uf4.amount + depleted_fuels_change * 4, uf4.maxAmount); double uf4_change = new_uf4_amount - uf4.amount; uf4.amount = new_uf4_amount; enum_actinides_change += depleted_fuels_change * 5; } else { PartResource thf4 = nuclear_reactor.part.Resources["ThF4"]; double depleted_fuels_change = actinides_change * 0.2; depleted_fuels_change = -ORSHelper.fixedRequestResource(part, "DepletedFuel", -depleted_fuels_change); double new_thf4_amount = Math.Min(thf4.amount + depleted_fuels_change * 4, thf4.maxAmount); double thf4_change = new_thf4_amount - thf4.amount; thf4.amount = new_thf4_amount; enum_actinides_change += depleted_fuels_change * 5; } remaining_capacity_to_reprocess = Math.Max(0, actinides_change); //enum_actinides_change += actinides_change; } amount_to_reprocess += actinides.amount; } remaining_to_reprocess = amount_to_reprocess; current_rate = enum_actinides_change; }
private void ScoopAthmosphere(double deltaTimeInSeconds, bool offlineCollecting) { string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource); if (atmospheric_resource_name == null) { resflowf = 0.0f; return; } double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density; double respcent = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource); //double resourcedensity = PartResourceLibrary.Instance.GetDefinition(PluginHelper.atomspheric_resources_tocollect[currentresource]).density; //double respcent = PluginHelper.getAtmosphereResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource); double airdensity = (part.vessel.atmDensity + PluginHelper.MinAtmosphericAirDensity) / 1000.0; double powerrequirements = (scoopair / 0.15f) * 6f * (float)PluginHelper.PowerConsumptionMultiplier; double airspeed = part.vessel.srf_velocity.magnitude + 40.0; double air = airspeed * airdensity * scoopair / resourcedensity; if (respcent == 0 || vessel.altitude > (PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody) * PluginHelper.MaxAtmosphericAltitudeMult)) { resflowf = 0.0f; return; } double scoopedAtm = air * respcent; float powerreceived = Math.Max(consumeFNResource(powerrequirements * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0); last_power_percentage = offlineCollecting ? last_power_percentage : (float)(powerreceived / powerrequirements / TimeWarp.fixedDeltaTime); double resourceChange = scoopedAtm * last_power_percentage * deltaTimeInSeconds; if (offlineCollecting) { string numberformat = resourceChange > 100 ? "0" : "0.00"; ScreenMessages.PostScreenMessage("Atmospheric Scoop collected " + resourceChange.ToString(numberformat) + " " + atmospheric_resource_name, 10.0f, ScreenMessageStyle.LOWER_CENTER); } //resflowf = (float)part.RequestResource(atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime); resflowf = (float)ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -resourceChange); resflowf = -resflowf / TimeWarp.fixedDeltaTime; }
public override void OnUpdate() { if (vessel != null) { double airdensity = part.vessel.atmDensity; double airspeed = part.vessel.srf_velocity.magnitude + 40.0; double air = airspeed * airdensity * scoopair; if (vessel.altitude <= ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody)) { double scoopedAtm = air; resflowf = (float) ORSHelper.fixedRequestResource(part, intakeResourceStr, -scoopedAtm * TimeWarp.fixedDeltaTime); resflowf = -resflowf / TimeWarp.fixedDeltaTime; resflow = resflowf.ToString("0.0000"); } } }
public override void OnFixedUpdate() { if (cryostat_resource != null && cryostat_resource.amount > 0.0) { double charge = consumeFNResource(powerReqKW / 1000.0 * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES) * 1000.0; if (charge <= powerReqKW * TimeWarp.fixedDeltaTime) { double rem_charge = powerReqKW * TimeWarp.fixedDeltaTime - charge; charge += ORSHelper.fixedRequestResource(part, "ElectricCharge", rem_charge); } power_d = charge / TimeWarp.fixedDeltaTime; if (charge >= powerReqKW) { cryostat_resource.amount = Math.Max(0, cryostat_resource.amount - boilOffRate * TimeWarp.fixedDeltaTime * cryostat_resource.maxAmount); } else { cryostat_resource.amount = Math.Max(0, cryostat_resource.amount - (boilOffRate + boilOffAddition) * TimeWarp.fixedDeltaTime * cryostat_resource.maxAmount * boilOffMultiplier); } } }
public override void OnStart(PartModule.StartState state) { if (state == StartState.Editor) { return; } this.part.force_activate(); double now = Planetarium.GetUniversalTime(); double time_diff = now - last_active_time; if (last_active_time != 0 && vessel.orbit.eccentricity < 1) { double lat = vessel.mainBody.GetLatitude(vessel.transform.position); double vessel_avg_alt = (vessel.orbit.ApR + vessel.orbit.PeR) / 2.0f; double vessel_inclination = vessel.orbit.inclination; float flux = (VanAllen.getBeltAntiparticles(vessel.mainBody.flightGlobalsIndex, (float)vessel_avg_alt, (float)vessel_inclination) + VanAllen.getBeltAntiparticles(vessel.mainBody.flightGlobalsIndex, (float)vessel_avg_alt, 0.0f)) / 2.0f; //vessel.orbit. double antimatter_to_add = time_diff * flux; //part.RequestResource("Antimatter", -antimatter_to_add); ORSHelper.fixedRequestResource(part, "Antimatter", -antimatter_to_add); } }
public override void OnStart(PartModule.StartState state) { double time_diff = lastActiveTime - Planetarium.GetUniversalTime(); if (state == StartState.Editor) { return; } if (part.Resources.Contains(resourceName)) { decay_resource = part.Resources[resourceName]; } else { decay_resource = null; return; } resourceDefinitionsContainDecayProduct = PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct); if (resourceDefinitionsContainDecayProduct) { density_rat = decay_resource.info.density / PartResourceLibrary.Instance.GetDefinition(decayProduct).density; } if (!CheatOptions.UnbreakableJoints && decay_resource != null && time_diff > 0) { double n_0 = decay_resource.amount; decay_resource.amount = n_0 * Math.Exp(-decayConstant * time_diff); double n_change = n_0 - decay_resource.amount; if (resourceDefinitionsContainDecayProduct) { ORSHelper.fixedRequestResource(part, decayProduct, -n_change * density_rat); } } }
protected void doPersistentResourceUpdate() { double now = Planetarium.GetUniversalTime(); double time_diff = now - last_active_time; foreach (ReactorFuel fuel in current_fuel_mode.ReactorFuels) { consumeReactorFuel(fuel, time_diff * ongoing_consumption_rate * fuel.FuelUsePerMJ); // consume fuel } if (breedtritium) { tritium_rate = MaximumPower / 1000.0 / GameConstants.tritiumBreedRate; PartResourceDefinition lithium_definition = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Lithium); PartResourceDefinition tritium_definition = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Tritium); List <PartResource> lithium_resources = part.GetConnectedResources(InterstellarResourcesConfiguration.Instance.Lithium).ToList(); List <PartResource> tritium_resources = part.GetConnectedResources(InterstellarResourcesConfiguration.Instance.Tritium).ToList(); double lithium_current_amount = lithium_resources.Sum(rs => rs.amount); double tritium_missing_amount = tritium_resources.Sum(rs => rs.maxAmount - rs.amount); double lithium_to_take = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, lithium_current_amount); double tritium_to_add = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, tritium_missing_amount) * lithium_definition.density / tritium_definition.density;; ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Lithium, Math.Min(tritium_to_add, lithium_to_take)); ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Tritium, -Math.Min(tritium_to_add, lithium_to_take)); } }
public override void OnFixedUpdate() { if (antimatter != null) { float mult = 1; current_antimatter = (float)antimatter.amount; explosion_size = Mathf.Sqrt(current_antimatter) * 5.0f; if (chargestatus > 0 && (current_antimatter > 0.00001 * antimatter.maxAmount)) { chargestatus -= 1.0f * TimeWarp.fixedDeltaTime; } if (chargestatus >= GameConstants.MAX_ANTIMATTER_TANK_STORED_CHARGE) { mult = 0.5f; } if (should_charge || (current_antimatter > 0.00001 * antimatter.maxAmount)) { float charge_to_add = consumeFNResource(mult * 2.0 * chargeNeeded / 1000.0 * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES) * 1000.0f / chargeNeeded; chargestatus += charge_to_add; if (charge_to_add < 2f * TimeWarp.fixedDeltaTime) { float more_charge_to_add = ORSHelper.fixedRequestResource(part, "ElectricCharge", mult * 2 * chargeNeeded * TimeWarp.fixedDeltaTime) / chargeNeeded; charge_to_add += more_charge_to_add; chargestatus += more_charge_to_add; } if (charge_to_add >= 1f * TimeWarp.fixedDeltaTime) { charging = true; } else { charging = false; if (TimeWarp.CurrentRateIndex > 3 && (current_antimatter > 0.00001 * antimatter.maxAmount)) { TimeWarp.SetRate(3, true); ScreenMessages.PostScreenMessage("Cannot Time Warp faster than 50x while Antimatter Tank is Unpowered", 1.0f, ScreenMessageStyle.UPPER_CENTER); } } //print (chargestatus); if (chargestatus <= 0) { chargestatus = 0; if (current_antimatter > 0.00001 * antimatter.maxAmount) { explode_counter++; if (explode_counter > 5) { doExplode(); } } } else { explode_counter = 0; } if (chargestatus > GameConstants.MAX_ANTIMATTER_TANK_STORED_CHARGE) { chargestatus = GameConstants.MAX_ANTIMATTER_TANK_STORED_CHARGE; } } else { } } if (exploding && lightGameObject != null) { if (Mathf.Sqrt(cur_explosion_size) > explosion_size) { lightGameObject.collider.enabled = false; //Destroy (lightGameObject); } cur_explosion_size += TimeWarp.fixedDeltaTime * explosion_size * explosion_size / explosion_time; lightGameObject.transform.localScale = new Vector3(Mathf.Sqrt(cur_explosion_size), Mathf.Sqrt(cur_explosion_size), Mathf.Sqrt(cur_explosion_size)); lightGameObject.light.range = Mathf.Sqrt(cur_explosion_size) * 15f; if (Mathf.Sqrt(cur_explosion_size) > explosion_size) { TimeWarp.SetRate(0, true); vessel.GoOffRails(); Vessel[] list_of_vessels_to_explode = FlightGlobals.Vessels.ToArray(); foreach (Vessel vess_to_explode in list_of_vessels_to_explode) { if (Vector3d.Distance(vess_to_explode.transform.position, vessel.transform.position) <= explosion_size) { if (vess_to_explode.packed == false) { Part[] parts_to_explode = vess_to_explode.Parts.ToArray(); foreach (Part part_to_explode in parts_to_explode) { if (part_to_explode != null) { part_to_explode.explode(); } } } } } Part[] explode_parts = vessel.Parts.ToArray(); foreach (Part explode_part in explode_parts) { if (explode_part != vessel.rootPart && explode_part != this.part) { explode_part.explode(); } } vessel.rootPart.explode(); this.part.explode(); // this.part.explode (); // vessel.rootPart.explode (); } } }
public override void OnFixedUpdate() { base.OnFixedUpdate(); if (IsEnabled && ThermalPower > 0) { if (getResourceBarRatio(FNResourceManager.FNRESOURCE_WASTEHEAT) >= 0.95 && canShutdown) { deactivate_timer++; if (deactivate_timer > 3) { IsEnabled = false; if (FlightGlobals.ActiveVessel == vessel) { ScreenMessages.PostScreenMessage("Warning Dangerous Overheating Detected: Emergency reactor shutdown occuring NOW!", 5.0f, ScreenMessageStyle.UPPER_CENTER); } } return; } deactivate_timer = 0; double resource_provided = consumeReactorResource(resourceRate * TimeWarp.fixedDeltaTime); resource_ratio = resource_provided / resourceRate / TimeWarp.fixedDeltaTime; double power_to_supply = Math.Max(ThermalPower * TimeWarp.fixedDeltaTime * resource_ratio, 0); double min_throttle = minimumThrottle; if (resource_ratio > 0) { min_throttle = min_throttle / resource_ratio; } if (double.IsNaN(power_to_supply) || double.IsInfinity(power_to_supply)) { power_to_supply = 0; } // charged power double charged_particles_to_supply = power_to_supply * chargedParticleRatio; //double min_charged = convert_charged_to_thermal ? 0 : minimumThrottle; double min_charged = minimumThrottle; double charged_power_received = supplyManagedFNResourceWithMinimum(charged_particles_to_supply, min_charged, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES); if (chargedParticleRatio > 0) { charged_power_ratio = charged_power_received / ThermalPower / chargedParticleRatio / TimeWarp.fixedDeltaTime; } else { charged_power_ratio = 0; } //double converted_thermal_power = convert_charged_to_thermal ? (charged_particles_to_supply - charged_power_received) : 0; double converted_thermal_power = 0; // thermal power //min_throttle = Math.Max(min_throttle, charged_power_ratio); double thermal_power_to_supply = power_to_supply * (1.0 - chargedParticleRatio); double thermal_power_received = supplyManagedFNResourceWithMinimum(thermal_power_to_supply + converted_thermal_power, min_throttle, FNResourceManager.FNRESOURCE_THERMALPOWER); total_power = (thermal_power_received + charged_power_received); if (getResourceBarRatio(FNResourceManager.FNRESOURCE_WASTEHEAT) < 0.95) { supplyFNResource(total_power, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated } if ((1 - chargedParticleRatio) > 0) { thermal_power_ratio = thermal_power_received / ThermalPower / (1 - chargedParticleRatio) / TimeWarp.fixedDeltaTime; } else { thermal_power_ratio = 0; } // total power total_power_ratio = total_power / ThermalPower / TimeWarp.fixedDeltaTime; ongoing_consumption_rate = (float)total_power_ratio; double return_ratio = 1 - total_power_ratio; double resource_returned = returnReactorResource(resource_provided * return_ratio); powerPcnt = (float)(resource_ratio * 100.0 * total_power_ratio); tritium_rate = (float)(thermal_power_received / TimeWarp.fixedDeltaTime / 1000.0f / GameConstants.tritiumBreedRate) * (1 - chargedParticleRatio); if (breedtritium) { double lith_rate = tritium_rate * TimeWarp.fixedDeltaTime; //double lith_used = part.RequestResource("Lithium", lith_rate); double lith_used = ORSHelper.fixedRequestResource(part, "Lithium", lith_rate); tritium_produced_f = (float)(-ORSHelper.fixedRequestResource(part, "Tritium", -lith_used) / TimeWarp.fixedDeltaTime); //tritium_produced_f = (float) (-part.RequestResource("Tritium", -lith_used) / TimeWarp.fixedDeltaTime); if (tritium_produced_f <= 0) { breedtritium = false; } } if (Planetarium.GetUniversalTime() != 0) { last_active_time = (float)Planetarium.GetUniversalTime(); } if (resource_ratio < minimumThrottle * 0.99 && isNeutronRich() && canShutdown) { IsEnabled = false; } decay_products_ongoing = false; } else { if (ThermalPower > 0 && Planetarium.GetUniversalTime() - last_active_time <= 3 * 86400 && getIsNuclear()) { double daughter_half_life = 86400.0 / 24.0 * 9.0; double time_t = Planetarium.GetUniversalTime() - last_active_time; double power_fraction = 0.1 * Math.Exp(-time_t / daughter_half_life); double power_to_supply = Math.Max(ThermalPower * TimeWarp.fixedDeltaTime * power_fraction, 0); double thermal_power_received = supplyManagedFNResourceWithMinimum(power_to_supply, 1.0, FNResourceManager.FNRESOURCE_THERMALPOWER); supplyFNResource(thermal_power_received, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated thermal_power_ratio = thermal_power_received / ThermalPower / TimeWarp.fixedDeltaTime; total_power_ratio = thermal_power_received / ThermalPower / TimeWarp.fixedDeltaTime; charged_power_ratio = 0; powerPcnt = (float)(100.0 * total_power_ratio); ongoing_consumption_rate = (float)total_power_ratio; decay_products_ongoing = true; } else { decay_products_ongoing = false; } } }
public override void OnFixedUpdate() { float global_rate_multipliers = 1; crew_capacity_ratio = ((float)part.protoModuleCrew.Count) / ((float)part.CrewCapacity); global_rate_multipliers = global_rate_multipliers * crew_capacity_ratio; if (ResearchAndDevelopment.Instance != null) { if (!double.IsNaN(science_awaiting_addition) && !double.IsInfinity(science_awaiting_addition) && science_awaiting_addition > 0) { ResearchAndDevelopment.Instance.Science = ResearchAndDevelopment.Instance.Science + (float)science_awaiting_addition; ScreenMessages.PostScreenMessage(science_awaiting_addition.ToString("0") + " science has been added to the R&D centre.", 2.5f, ScreenMessageStyle.UPPER_CENTER); science_awaiting_addition = 0; } } if (IsEnabled) { if (active_mode == 0) // Research { double electrical_power_provided = consumeFNResource(GameConstants.basePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.basePowerConsumption); global_rate_multipliers = global_rate_multipliers * electrical_power_ratio; float stupidity = 0; foreach (ProtoCrewMember proto_crew_member in part.protoModuleCrew) { stupidity += proto_crew_member.stupidity; } stupidity = 1.5f - stupidity / 2.0f; float altitude_multiplier = (float)(vessel.altitude / (vessel.mainBody.Radius)); altitude_multiplier = Math.Max(altitude_multiplier, 1); science_rate_f = (float)(GameConstants.baseScienceRate * PluginHelper.getScienceMultiplier(vessel.mainBody.flightGlobalsIndex, vessel.LandedOrSplashed) / 86400.0f * global_rate_multipliers * stupidity / (Mathf.Sqrt(altitude_multiplier))); if (ResearchAndDevelopment.Instance != null) { if (!double.IsNaN(science_rate_f) && !double.IsInfinity(science_rate_f)) { ResearchAndDevelopment.Instance.Science = ResearchAndDevelopment.Instance.Science + science_rate_f * TimeWarp.fixedDeltaTime; } } } else if (active_mode == 1) // Fuel Reprocessing { double electrical_power_provided = consumeFNResource(GameConstants.basePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.basePowerConsumption); global_rate_multipliers = global_rate_multipliers * electrical_power_ratio; reprocessor.performReprocessingFrame(global_rate_multipliers); if (reprocessor.getActinidesRemovedPerHour() > 0) { reprocessing_rate_f = (float)(reprocessor.getRemainingAmountToReprocess() / reprocessor.getActinidesRemovedPerHour()); } else { IsEnabled = false; } } else if (active_mode == 2) //Antimatter { double electrical_power_provided = consumeFNResource(GameConstants.baseAMFPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.baseAMFPowerConsumption); global_rate_multipliers = crew_capacity_ratio * electrical_power_ratio; anti_factory.produceAntimatterFrame(global_rate_multipliers); antimatter_rate_f = (float)anti_factory.getAntimatterProductionRate(); } else if (active_mode == 3) { IsEnabled = false; } else if (active_mode == 4) // Centrifuge { if (vessel.Splashed) { float electrical_power_provided = consumeFNResource(GameConstants.baseCentriPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.baseCentriPowerConsumption); global_rate_multipliers = global_rate_multipliers * electrical_power_ratio; float deut_produced = (float)(global_rate_multipliers * GameConstants.deuterium_timescale * GameConstants.deuterium_abudance * 1000.0f); deut_rate_f = -ORSHelper.fixedRequestResource(part, "Deuterium", -deut_produced * TimeWarp.fixedDeltaTime) / TimeWarp.fixedDeltaTime; } else { ScreenMessages.PostScreenMessage("You must be splashed down to perform this activity.", 5.0f, ScreenMessageStyle.UPPER_CENTER); IsEnabled = false; } } if (electrical_power_ratio <= 0) { deut_rate_f = 0; electrolysis_rate_f = 0; science_rate_f = 0; antimatter_rate_f = 0; reprocessing_rate_f = 0; } last_active_time = (float)Planetarium.GetUniversalTime(); } else { } }
public override void OnFixedUpdate() { float global_rate_multipliers = 1; crew_capacity_ratio = ((float)part.protoModuleCrew.Count) / ((float)part.CrewCapacity); global_rate_multipliers = global_rate_multipliers * crew_capacity_ratio; if (!IsEnabled) { return; } if (active_mode == 0) // Research { double electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BasePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BasePowerConsumption / powerReqMult); global_rate_multipliers = global_rate_multipliers * electrical_power_ratio; float kerbalScienceSkillFactor = part.protoModuleCrew.Sum(proto_crew_member => GetKerbalScienceFactor(proto_crew_member) / 2f); float altitude_multiplier = Math.Max((float)(vessel.altitude / (vessel.mainBody.Radius)), 1); science_rate_f = (float)(kerbalScienceSkillFactor * GameConstants.baseScienceRate * PluginHelper.getScienceMultiplier(vessel) //PluginHelper.getScienceMultiplier(vessel.mainBody.flightGlobalsIndex, vessel.LandedOrSplashed) / GameConstants.EARH_DAY_SECONDS * global_rate_multipliers / (Mathf.Sqrt(altitude_multiplier))); if (ResearchAndDevelopment.Instance != null && !double.IsNaN(science_rate_f) && !double.IsInfinity(science_rate_f)) { //ResearchAndDevelopment.Instance.Science = ResearchAndDevelopment.Instance.Science + science_rate_f * TimeWarp.fixedDeltaTime; science_to_add += science_rate_f * TimeWarp.fixedDeltaTime; } } else if (active_mode == 1) // Fuel Reprocessing { double electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BasePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BasePowerConsumption / powerReqMult); global_rate_multipliers = global_rate_multipliers * electrical_power_ratio; reprocessor.UpdateFrame(global_rate_multipliers, true); if (reprocessor.getActinidesRemovedPerHour() > 0) { reprocessing_rate_f = (float)(reprocessor.getRemainingAmountToReprocess() / reprocessor.getActinidesRemovedPerHour()); } else { IsEnabled = false; } } else if (active_mode == 2) //Antimatter { double electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BaseAMFPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BaseAMFPowerConsumption / powerReqMult); global_rate_multipliers = crew_capacity_ratio * electrical_power_ratio; anti_factory.produceAntimatterFrame(global_rate_multipliers); antimatter_rate_f = (float)anti_factory.getAntimatterProductionRate(); } else if (active_mode == 3) { IsEnabled = false; } else if (active_mode == 4) // Centrifuge { if (vessel.Splashed) { float electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BaseCentriPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES); electrical_power_ratio = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BaseCentriPowerConsumption / powerReqMult); global_rate_multipliers = global_rate_multipliers * electrical_power_ratio; float deut_produced = (float)(global_rate_multipliers * GameConstants.deuterium_timescale * GameConstants.deuterium_abudance * 1000.0f); deut_rate_f = -ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Deuterium, -deut_produced * TimeWarp.fixedDeltaTime) / TimeWarp.fixedDeltaTime; } else { ScreenMessages.PostScreenMessage("You must be splashed down to perform this activity.", 5.0f, ScreenMessageStyle.UPPER_CENTER); IsEnabled = false; } } if (electrical_power_ratio <= 0) { deut_rate_f = 0; electrolysis_rate_f = 0; science_rate_f = 0; antimatter_rate_f = 0; reprocessing_rate_f = 0; } last_active_time = (float)Planetarium.GetUniversalTime(); }
public override void OnFixedUpdate() { decay_ongoing = false; base.OnFixedUpdate(); if (IsEnabled && MaximumPower > 0) { if (reactorIsOverheating()) { if (FlightGlobals.ActiveVessel == vessel) { ScreenMessages.PostScreenMessage("Warning Dangerous Overheating Detected: Emergency reactor shutdown occuring NOW!", 5.0f, ScreenMessageStyle.UPPER_CENTER); } IsEnabled = false; return; } // Max Power double max_power_to_supply = Math.Max(MaximumPower * TimeWarp.fixedDeltaTime, 0); double fuel_ratio = Math.Min(current_fuel_mode.ReactorFuels.Min(fuel => getFuelAvailability(fuel) / fuel.GetFuelUseForPower(FuelEfficiency, max_power_to_supply)), 1.0); double min_throttle = fuel_ratio > 0 ? minimumThrottle / fuel_ratio : 1; max_power_to_supply = max_power_to_supply * fuel_ratio; // Charged Power double max_charged_to_supply = Math.Max(MaximumChargedPower * TimeWarp.fixedDeltaTime, 0) * fuel_ratio; double charged_particles_to_supply = max_charged_to_supply; double charged_power_received = supplyManagedFNResourceWithMinimum(charged_particles_to_supply, minimumThrottle, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES); double charged_power_ratio = ChargedParticleRatio > 0 ? charged_power_received / max_charged_to_supply : 0; ongoing_charged_power_f = (float)(charged_power_received / TimeWarp.fixedDeltaTime); // Thermal Power double max_thermal_to_supply = Math.Max(MaximumThermalPower * TimeWarp.fixedDeltaTime, 0) * fuel_ratio; double thermal_power_to_supply = max_thermal_to_supply; double thermal_power_received = supplyManagedFNResourceWithMinimum(thermal_power_to_supply, min_throttle, FNResourceManager.FNRESOURCE_THERMALPOWER); double thermal_power_ratio = (1 - ChargedParticleRatio) > 0 ? thermal_power_received / max_thermal_to_supply : 0; ongoing_thermal_power_f = (float)(thermal_power_received / TimeWarp.fixedDeltaTime); // Total double total_power_received = thermal_power_received + charged_power_received; total_power_per_frame = total_power_received; double total_power_ratio = total_power_received / MaximumPower / TimeWarp.fixedDeltaTime; ongoing_consumption_rate = (float)total_power_ratio; foreach (ReactorFuel fuel in current_fuel_mode.ReactorFuels) { consumeReactorFuel(fuel, total_power_received * fuel.FuelUsePerMJ); // consume fuel } ongoing_total_power_f = ongoing_charged_power_f + ongoing_thermal_power_f; // Waste Heat supplyFNResource(total_power_received, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated // powerPcnt = 100.0 * total_power_ratio; if (min_throttle > 1.05) { IsEnabled = false; } if (breedtritium) { PartResourceDefinition lithium_def = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Lithium); PartResourceDefinition tritium_def = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Tritium); double breed_rate = thermal_power_received / TimeWarp.fixedDeltaTime / 100000.0 / GameConstants.tritiumBreedRate; double lith_rate = breed_rate * TimeWarp.fixedDeltaTime / lithium_def.density; double lith_used = ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Lithium, lith_rate); double lt_density_ratio = lithium_def.density / tritium_def.density; tritium_produced_f = (float)(-ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Tritium, -lith_used * 3.0 / 7.0 * lt_density_ratio) / TimeWarp.fixedDeltaTime); if (tritium_produced_f <= 0) { breedtritium = false; } } if (Planetarium.GetUniversalTime() != 0) { last_active_time = (float)(Planetarium.GetUniversalTime()); } } else if (MaximumPower > 0 && Planetarium.GetUniversalTime() - last_active_time <= 3 * 86400 && IsNuclear) { double daughter_half_life = 86400.0 / 24.0 * 9.0; double time_t = Planetarium.GetUniversalTime() - last_active_time; double power_fraction = 0.1 * Math.Exp(-time_t / daughter_half_life); double power_to_supply = Math.Max(MaximumPower * TimeWarp.fixedDeltaTime * power_fraction, 0); double thermal_power_received = supplyManagedFNResourceWithMinimum(power_to_supply, 1.0, FNResourceManager.FNRESOURCE_THERMALPOWER); double total_power_ratio = thermal_power_received / MaximumPower / TimeWarp.fixedDeltaTime; ongoing_consumption_rate = (float)total_power_ratio; supplyFNResource(thermal_power_received, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated powerPcnt = 100.0 * total_power_ratio; decay_ongoing = true; } else { powerPcnt = 0; } }
// the main collecting function private void CollectRegolith(double deltaTimeInSeconds, bool offlineCollecting) { //Debug.Log("Inside Collect function."); //dConcentrationRegolith = CalculateRegolithConcentration(FlightGlobals.currentMainBody.position, localStar.transform.position, vessel.altitude); dConcentrationRegolith = GetFinalConcentration(); string strRegolithResourceName = InterstellarResourcesConfiguration.Instance.Regolith; double dPowerRequirementsMW = (double)PluginHelper.PowerConsumptionMultiplier * mwRequirements; // change the mwRequirements number in part config to change the power consumption // gets density of the regolith resource dRegolithDensity = PartResourceLibrary.Instance.GetDefinition(strRegolithResourceName).density; var partsThatContainRegolith = part.GetConnectedResources(strRegolithResourceName); dRegolithSpareCapacity = partsThatContainRegolith.Sum(r => r.maxAmount - r.amount); if (offlineCollecting) { dConcentrationRegolith = dLastRegolithConcentration; // if resolving offline collection, pass the saved value, because OnStart doesn't resolve the above function CalculateRegolithConcentration correctly } if (dConcentrationRegolith > 0 && (dRegolithSpareCapacity > 0)) { // calculate available power double dPowerReceivedMW = Math.Max((double)consumeFNResource(dPowerRequirementsMW * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0); double dNormalisedRevievedPowerMW = dPowerReceivedMW / TimeWarp.fixedDeltaTime; // if power requirement sufficiently low, retreive power from KW source if (dPowerRequirementsMW < 2 && dNormalisedRevievedPowerMW <= dPowerRequirementsMW) { double dRequiredKW = (dPowerRequirementsMW - dNormalisedRevievedPowerMW) * 1000; double dReceivedKW = ORSHelper.fixedRequestResource(part, FNResourceManager.STOCK_RESOURCE_ELECTRICCHARGE, dRequiredKW * TimeWarp.fixedDeltaTime); dPowerReceivedMW += (dReceivedKW / 1000); } dLastPowerPercentage = offlineCollecting ? dLastPowerPercentage : (float)(dPowerReceivedMW / dPowerRequirementsMW / TimeWarp.fixedDeltaTime); // show in GUI strCollectingStatus = "Collecting regolith"; } else { dLastPowerPercentage = 0; dPowerRequirementsMW = 0; } // set the GUI string to state the number of KWs received if the MW requirements were lower than 2, otherwise in MW strReceivedPower = dPowerRequirementsMW < 2 ? (dLastPowerPercentage * dPowerRequirementsMW * 1000).ToString("0.0") + " KW / " + (dPowerRequirementsMW * 1000).ToString("0.0") + " KW" : (dLastPowerPercentage * dPowerRequirementsMW).ToString("0.0") + " MW / " + dPowerRequirementsMW.ToString("0.0") + " MW"; /** The first important bit. * This determines how much solar wind will be collected. Can be tweaked in part configs by changing the collector's effectiveness. * */ double dResourceChange = (dConcentrationRegolith * drillSize * dRegolithDensity) * effectiveness * dLastPowerPercentage * deltaTimeInSeconds; // if the vessel has been out of focus, print out the collected amount for the player if (offlineCollecting) { string strNumberFormat = dResourceChange > 100 ? "0" : "0.00"; // let the player know that offline collecting worked ScreenMessages.PostScreenMessage("The Regolith Drill collected " + dResourceChange.ToString(strNumberFormat) + " units of " + strRegolithResourceName, 10.0f, ScreenMessageStyle.LOWER_CENTER); } // this is the second important bit - do the actual change of the resource amount in the vessel dResourceFlow = (float)ORSHelper.fixedRequestResource(part, strRegolithResourceName, -dResourceChange); dResourceFlow = -dResourceFlow / TimeWarp.fixedDeltaTime; /* This takes care of wasteheat production (but takes into account if waste heat mechanics weren't disabled). * It's affected by two properties of the drill part - its power requirements and waste heat production percentage. * More power hungry drills will produce more heat. More effective drills will produce less heat. More effective power hungry drills should produce * less heat than less effective power hungry drills. This should allow us to bring some variety into parts, if we want to. */ if (!CheatOptions.IgnoreMaxTemperature) // is this player not using no-heat cheat mode? { dTotalWasteHeatProduction = dPowerRequirementsMW * wasteHeatModifier; // calculate amount of heat to be produced supplyFNResourceFixed(dTotalWasteHeatProduction * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_WASTEHEAT); // push the heat onto them } }
// the main collecting function private void CollectSolarWind(double deltaTimeInSeconds, bool offlineCollecting) { dConcentrationSolarWind = CalculateSolarWindConcentration(part.vessel.solarFlux); string strSolarWindResourceName = InterstellarResourcesConfiguration.Instance.SolarWind; double dPowerRequirementsMW = (double)PluginHelper.PowerConsumptionMultiplier * mwRequirements; // change the mwRequirements number in part config to change the power consumption // checks for free space in solar wind 'tanks' dSolarWindSpareCapacity = part.GetResourceSpareCapacity(strSolarWindResourceName); // gets density of the solar wind resource dSolarWindDensity = PartResourceLibrary.Instance.GetDefinition(strSolarWindResourceName).density; if (dConcentrationSolarWind > 0 && (dSolarWindSpareCapacity > 0)) { // calculate available power double dPowerReceivedMW = Math.Max((double)consumeFNResource(dPowerRequirementsMW * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0); double dNormalisedRevievedPowerMW = dPowerReceivedMW / TimeWarp.fixedDeltaTime; // if power requirement sufficiently low, retreive power from KW source if (dPowerRequirementsMW < 2 && dNormalisedRevievedPowerMW <= dPowerRequirementsMW) { double dRequiredKW = (dPowerRequirementsMW - dNormalisedRevievedPowerMW) * 1000; double dReceivedKW = ORSHelper.fixedRequestResource(part, FNResourceManager.STOCK_RESOURCE_ELECTRICCHARGE, dRequiredKW * TimeWarp.fixedDeltaTime); dPowerReceivedMW += (dReceivedKW / 1000); } fLastPowerPercentage = offlineCollecting ? fLastPowerPercentage : (float)(dPowerReceivedMW / dPowerRequirementsMW / TimeWarp.fixedDeltaTime); // show in GUI strCollectingStatus = "Collecting solar wind"; } else { fLastPowerPercentage = 0; dPowerRequirementsMW = 0; } // set the GUI string to state the number of KWs received if the MW requirements were lower than 2, otherwise in MW strReceivedPower = dPowerRequirementsMW < 2 ? (fLastPowerPercentage * dPowerRequirementsMW * 1000).ToString("0.0") + " KW / " + (dPowerRequirementsMW * 1000).ToString("0.0") + " KW" : (fLastPowerPercentage * dPowerRequirementsMW).ToString("0.0") + " MW / " + dPowerRequirementsMW.ToString("0.0") + " MW"; /** The first important bit. * This determines how much solar wind will be collected. Can be tweaked in part configs by changing the collector's effectiveness. * */ double dResourceChange = (dConcentrationSolarWind * surfaceArea * dSolarWindDensity) * effectiveness * fLastPowerPercentage * deltaTimeInSeconds; // if the vessel has been out of focus, print out the collected amount for the player if (offlineCollecting) { string strNumberFormat = dResourceChange > 100 ? "0" : "0.00"; ScreenMessages.PostScreenMessage("The Solar Wind Collector collected " + dResourceChange.ToString(strNumberFormat) + " units of " + strSolarWindResourceName, 10.0f, ScreenMessageStyle.LOWER_CENTER); } // this is the second important bit - do the actual change of the resource amount in the vessel fResourceFlow = (float)ORSHelper.fixedRequestResource(part, strSolarWindResourceName, -dResourceChange); fResourceFlow = -fResourceFlow / TimeWarp.fixedDeltaTime; }
public override void OnStart(PartModule.StartState state) { String[] resources_to_supply = { FNResourceManager.FNRESOURCE_THERMALPOWER, FNResourceManager.FNRESOURCE_WASTEHEAT, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES }; this.resources_to_supply = resources_to_supply; //name_to_use = originalName; base.OnStart(state); Actions["ActivateReactorAction"].guiName = Events["ActivateReactor"].guiName = String.Format("Activate Reactor"); Actions["DeactivateReactorAction"].guiName = Events["DeactivateReactor"].guiName = String.Format("Deactivate Reactor"); Actions["ToggleReactorAction"].guiName = String.Format("Toggle Reactor"); if (state == StartState.Editor) { if (startDisabled) { Events["ActivateReactorVAB"].guiActiveEditor = true; Events["DeactivateReactorVAB"].guiActiveEditor = false; } if (hasTechsRequiredToUpgrade()) { isupgraded = true; upgradePartModule(); } return; } if (hasTechsRequiredToUpgrade()) { hasrequiredupgrade = true; } if (startDisabled) { last_active_time = (float)(Planetarium.GetUniversalTime() - 4.0 * 86400.0); IsEnabled = false; startDisabled = false; } anim = part.FindModelAnimators(animName).FirstOrDefault(); if (anim != null) { anim [animName].layer = 1; if (!IsEnabled) { anim [animName].normalizedTime = 1f; anim [animName].speed = -1f; } else { anim [animName].normalizedTime = 0f; anim [animName].speed = 1f; } anim.Play(); } if (IsEnabled && last_active_time > 0) { double now = Planetarium.GetUniversalTime(); double time_diff = now - last_active_time; double resource_to_take = consumeReactorResource(resourceRate * time_diff * ongoing_consumption_rate); if (breedtritium) { tritium_rate = (float)(ThermalPower / 1000.0f / GameConstants.tritiumBreedRate); List <PartResource> lithium_resources = new List <PartResource>(); part.GetConnectedResources(PartResourceLibrary.Instance.GetDefinition("Lithium").id, lithium_resources); double lithium_current_amount = 0; foreach (PartResource lithium_resource in lithium_resources) { lithium_current_amount += lithium_resource.amount; } List <PartResource> tritium_resources = new List <PartResource>(); part.GetConnectedResources(PartResourceLibrary.Instance.GetDefinition("Tritium").id, tritium_resources); double tritium_missing_amount = 0; foreach (PartResource tritium_resource in tritium_resources) { tritium_missing_amount += tritium_resource.maxAmount - tritium_resource.amount; } double lithium_to_take = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, lithium_current_amount); double tritium_to_add = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, tritium_missing_amount); ORSHelper.fixedRequestResource(part, "Lithium", Math.Min(tritium_to_add, lithium_to_take)); ORSHelper.fixedRequestResource(part, "Tritium", -Math.Min(tritium_to_add, lithium_to_take)); } } this.part.force_activate(); }
public JsonResult SaveOrsObligation(FormCollection collection) { Int32 id = Convert.ToInt32(collection.Get("ID")); String data = collection.Get("data"); Int32 line_id = 0; List <Object> list = JsonConvert.DeserializeObject <List <Object> >(data); foreach (Object s in list) { try { dynamic sb = JsonConvert.DeserializeObject <dynamic>(s.ToString()); String expenese_title = (String)sb.expense_title; var uacs = db.uacs.Where(p => p.Title == expenese_title).FirstOrDefault(); if (uacs != null) { line_id = Convert.ToInt32(sb.ID); var ors_uacs = db.ors_expense_codes.Where(p => p.ID == line_id).FirstOrDefault(); if (User.IsInRole("Admin") || User.IsInRole("Employee")) { ors_uacs.uacs = sb.expense_title; try { ors_uacs.amount = Convert.ToDouble(sb.amount); } catch { ors_uacs.amount = 0.00; } try { ors_uacs.NetAmount = Convert.ToDouble(sb.NetAmount); } catch { ors_uacs.NetAmount = 0.00; } try { ors_uacs.TaxAmount = Convert.ToDouble(sb.TaxAmount); } catch { ors_uacs.TaxAmount = 0.00; } try { ors_uacs.Others = Convert.ToDouble(sb.Others); } catch { ors_uacs.Others = 0.00; } } else if (User.IsInRole("Cashier")) { try { ors_uacs.NetAmount = Convert.ToDouble(sb.NetAmount); } catch { ors_uacs.NetAmount = 0.00; } try { ors_uacs.TaxAmount = Convert.ToDouble(sb.TaxAmount); } catch { ors_uacs.TaxAmount = 0.00; } try { ors_uacs.Others = Convert.ToDouble(sb.Others); } catch { ors_uacs.Others = 0.00; } } try { db.SaveChanges(); } catch { } } } catch (Exception ex) { dynamic sb = JsonConvert.DeserializeObject <dynamic>(s.ToString()); try { String expenese_title = (String)sb.expense_title; var uacs = db.uacs.Where(p => p.Title == expenese_title).FirstOrDefault(); if (uacs != null) { if (User.IsInRole("Admin") || User.IsInRole("Cashier")) { var uacs_exist = (from exist in db.ors_expense_codes where exist.uacs == expenese_title && exist.ors_obligation == id select exist).ToList(); if (uacs_exist.Count <= 0) { ORS_EXPENSE_CODES oec = new ORS_EXPENSE_CODES(); oec.uacs = sb.expense_title; oec.ors_obligation = id; try { oec.amount = Convert.ToDouble(sb.amount); } catch { oec.amount = 0.00; } try { oec.TaxAmount = Convert.ToDouble(sb.TaxAmount); } catch { oec.TaxAmount = 0.00; } try { oec.NetAmount = Convert.ToDouble(sb.NetAmount); } catch { oec.NetAmount = 0.00; } try { oec.Others = Convert.ToDouble(sb.Others); } catch { oec.Others = 0.00; } db.ors_expense_codes.Add(oec); db.SaveChanges(); ORSHelper.InsertORSNo(id); var ors_allotments = (from ors in db.ors join allotments in db.allotments on ors.allotment equals allotments.ID where ors.ID == id select new { _allotment = allotments.ID, fundsource_id = (from _fsh in db.fsh where _fsh.allotment == allotments.ID.ToString() && _fsh.Code == ors.FundSource select _fsh.ID).FirstOrDefault() }).FirstOrDefault(); var ors_fundsource_uacs = (from _fsa in db.fsa where _fsa.fundsource == ors_allotments.fundsource_id.ToString() && _fsa.expense_title == oec.uacs select _fsa.ID).ToList(); if (ors_fundsource_uacs.Count <= 0) { FundSourceAmount new_fsa = new FundSourceAmount(); new_fsa.expense_title = oec.uacs; new_fsa.amount = 0; new_fsa.fundsource = ors_allotments.fundsource_id.ToString(); db.fsa.Add(new_fsa); db.SaveChanges(); } } } } } catch (Exception innerex) { } } } return(GetORSUacs(id.ToString())); }