protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); if (result.TimeFactor >= ResourceUtilities.FLOAT_TOLERANCE && !status.EndsWith("load")) { statusPercent = 0d; //Force a reset of the load display. } }
protected override void PostProcess(ConverterResults result, double deltaTime) { for (int i = 0; i < resource_amounts.Length; i++) { double amount = resource_amounts[i] * result.TimeFactor; resource_providers[i].ExtractResource (ResourceName, location, amount); } if (result.TimeFactor < 1E-09) { status = "stalled"; } }
protected override void PostProcess(ConverterResults result, double deltaTime) { var v = LifeSupportManager.Instance.FetchVessel(part.vessel.id.ToString()); v.LastUpdate = Planetarium.GetUniversalTime(); v.VesselName = part.vessel.vesselName; v.NumCrew = part.vessel.GetCrewCount(); //How close before we assume we're done? var tolerance = deltaTime/2f; foreach (var c in part.protoModuleCrew) { //Fetch them from the queue var k = LifeSupportManager.Instance.FetchKerbal(c); //Update our stuff var onKerbin = (part.vessel.mainBody.name == "Kerbin" && part.vessel.altitude < 50000); if (!onKerbin && (deltaTime - result.TimeFactor > tolerance)) { //Sadness CheckSideEffects(k, c); } else { //All is well k.LastMeal = lastUpdateTime; v.LastFeeding = lastUpdateTime; if (c.type == ProtoCrewMember.KerbalType.Tourist && k.IsGrouchy) { string msg = string.Format("{0} has returned to duty", c.name); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); c.type = ProtoCrewMember.KerbalType.Crew; KerbalRoster.SetExperienceTrait(c, ""); k.IsGrouchy = false; } } k.LastUpdate = Planetarium.GetUniversalTime(); LifeSupportManager.Instance.TrackKerbal(k); var supAmpunt = _resBroker.AmountAvailable(part, "Supplies", deltaTime, "ALL_VESSEL"); v.SuppliesLeft = supAmpunt/0.00005f/part.vessel.GetCrewCount(); LifeSupportManager.Instance.TrackVessel(v); } }
protected override void PostProcess(ConverterResults result, double deltaTime) { var baseTime = TimeMultiplier*result.TimeFactor; var kerbals = vessel.GetVesselCrew() .Where(c => string.IsNullOrEmpty(restrictedClass) || c.experienceTrait.Title == restrictedClass); if(PartOnly) kerbals = part.protoModuleCrew .Where(c => string.IsNullOrEmpty(restrictedClass) || c.experienceTrait.Title == restrictedClass); var timePerKerbal = baseTime/kerbals.Count(); foreach (var k in kerbals) { var lsKerbal = LifeSupportManager.Instance.FetchKerbal(k); if(homeTimer) lsKerbal.MaxOffKerbinTime += timePerKerbal; if(habTimer) lsKerbal.TimeEnteredVessel += timePerKerbal; LifeSupportManager.Instance.TrackKerbal(lsKerbal); } }
public void FixedUpdate() { if (!HighLogic.LoadedSceneIsFlight) { return; } try { bool isLongLoop = false; var offKerbin = !LifeSupportManager.IsOnKerbin(part.vessel); UnlockTins(); CheckVesselId(); //Check our time double deltaTime = GetDeltaTime(); if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE * 10) { return; } if (Planetarium.GetUniversalTime() >= _lastProcessingTime + _checkInterval) { isLongLoop = true; _lastProcessingTime = Planetarium.GetUniversalTime(); } var v = LifeSupportManager.Instance.FetchVessel(part.vessel.id.ToString()); v.LastUpdate = Planetarium.GetUniversalTime(); v.VesselName = part.vessel.vesselName; v.NumCrew = part.vessel.GetCrewCount(); v.CrewCap = part.vessel.GetCrewCapacity(); if (isLongLoop) { v.RecyclerMultiplier = (float)LifeSupportManager.GetRecyclerMultiplier(part.vessel); CheckForDeadKerbals(); } if (part.protoModuleCrew.Count > 0) { #region Long loop - Vessel //Only check effects periodically, this is for performance reasons. if (isLongLoop) { //Update Hab info var habMulti = CalculateVesselHabMultiplier(part.vessel, v.NumCrew); var habTime = CalculateVesselHabExtraTime(part.vessel); var totParts = 0d; var maxParts = 0d; v.ExtraHabSpace = habTime; v.VesselHabMultiplier = habMulti; //We also have to temper this with whether or not these parts are worn out. if (part.Resources.Contains("ReplacementParts")) { var res = part.Resources["ReplacementParts"]; totParts = res.amount; maxParts = res.maxAmount; } //Worn out parts have a corresponding negative effect. if (maxParts > 0) { v.VesselHabMultiplier *= (totParts / maxParts); v.ExtraHabSpace *= (totParts / maxParts); if (totParts < 1) { wearPercent = "Broken!"; } else { wearPercent = String.Format("{0:0.00}%", (1d - (totParts / maxParts)) * 100); } } else { wearPercent = "Like New"; } } #endregion //we will add a bit of a fudge factor for supplies var tolerance = deltaTime / 2f; //nom nom nom! ConverterResults resultSupply = ResConverter.ProcessRecipe(deltaTime, SupplyRecipe, part, this, 1f); ConverterResults resultEC = ResConverter.ProcessRecipe(deltaTime, ECRecipe, part, this, 1f); foreach (var c in part.protoModuleCrew) { bool isGrouchyHab = false; bool isGrouchySupplies = false; bool isGrouchyEC = false; //Fetch them from the queue var k = LifeSupportManager.Instance.FetchKerbal(c); //Update our stuff #region Long Loop - Crew if (isLongLoop) { //First - Hab effects. if (LifeSupportManager.IsOnKerbin(part.vessel)) { k.LastAtHome = Planetarium.GetUniversalTime(); k.MaxOffKerbinTime = 648000; k.TimeEnteredVessel = Planetarium.GetUniversalTime(); } else { if (part.vessel.id.ToString() != k.CurrentVesselId) { if (part.vessel.id.ToString() != k.PreviousVesselId) { k.TimeEnteredVessel = Planetarium.GetUniversalTime(); } k.PreviousVesselId = k.CurrentVesselId; k.CurrentVesselId = part.vessel.id.ToString(); } } isGrouchyHab = CheckHabSideEffects(k, v); //Second - Supply if (offKerbin && (deltaTime - resultSupply.TimeFactor > tolerance)) { isGrouchySupplies = CheckSupplySideEffects(k); } else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE) { //All is well k.LastMeal = lastUpdateTime; v.LastFeeding = lastUpdateTime; } //Third - EC //Second - Supply if (offKerbin && (deltaTime - resultEC.TimeFactor > tolerance)) { isGrouchyEC = CheckECSideEffects(k); } else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE) { //All is well k.LastEC = lastUpdateTime; v.LastECCheck = lastUpdateTime; } k.LastUpdate = Planetarium.GetUniversalTime(); if (isGrouchyEC) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect); } else if (isGrouchySupplies) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect); } else if (isGrouchyHab) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffectVets : LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffect); } else if (c.experienceTrait.Title != k.OldTrait) { RemoveGrouchiness(c, k); } LifeSupportManager.Instance.TrackKerbal(k); } #endregion - Crew var supAmount = _resBroker.AmountAvailable(part, "Supplies", deltaTime, ResourceFlowMode.ALL_VESSEL); var ecAmount = _resBroker.AmountAvailable(part, "ElectricCharge", deltaTime, ResourceFlowMode.ALL_VESSEL); v.SuppliesLeft = supAmount / LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount / part.vessel.GetCrewCount() / v.RecyclerMultiplier; v.ECLeft = ecAmount / LifeSupportScenario.Instance.settings.GetSettings().ECAmount / part.vessel.GetCrewCount(); } } LifeSupportManager.Instance.TrackVessel(v); } catch (Exception ex) { print(String.Format("ERROR {0} IN ModuleLifeSupport", ex.Message)); } }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); EfficiencyMultiplier = result.TimeFactor / deltaTime; }
protected override void PostProcess(ConverterResults result, double deltaTime) { if (!HighLogic.LoadedSceneIsFlight) { return; } base.PostProcess(result, deltaTime); var baseTime = TimeMultiplier * result.TimeFactor; var kerbals = new List <ProtoCrewMember>(); var crew = vessel.GetVesselCrew(); if (PartOnly) { crew = part.protoModuleCrew; } var hasMale = false; var hasFemale = false; var count = crew.Count; for (int i = 0; i < count; ++i) { var c = crew[i]; if (c.gender == ProtoCrewMember.Gender.Male) { hasMale = true; } if (c.gender == ProtoCrewMember.Gender.Female) { hasFemale = true; } if (string.IsNullOrEmpty(restrictedClass) || c.experienceTrait.Title == restrictedClass) { kerbals.Add(c); } } var timePerKerbal = baseTime / kerbals.Count; count = kerbals.Count; for (int i = 0; i < count; ++i) { var k = kerbals[i]; var lsKerbal = LifeSupportManager.Instance.FetchKerbal(k); if (homeTimer) { lsKerbal.MaxOffKerbinTime += timePerKerbal; } if (habTimer) { lsKerbal.TimeEnteredVessel += timePerKerbal; } LifeSupportManager.Instance.TrackKerbal(lsKerbal); } //Kolony Growth if (KolonyGrowthEnabled && part.CrewCapacity > part.protoModuleCrew.Count) { GrowthTime += result.TimeFactor; if (GrowthTime >= GestationTime) { GrowthTime = 0d; SpawnKerbal(); } } }
protected override float GetHeatMultiplier(ConverterResults result, double deltaTime) { return(1 / (float)rate * HeatThrottle); }
protected override void PostProcess(ConverterResults result, double deltaTime) { var diff = Math.Abs(deltaTime - result.TimeFactor); RecyclerIsActive = diff < 0.00001f; }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); if (HighLogic.LoadedSceneIsFlight == false) { return; } //Check activation if (IsActivated == false) { lodeStatus = Localizer.Format(statusNAName); return; } //Check broken if (isBroken) { StopResourceConverter(); return; } //Check situation if (this.part.vessel.situation != Vessel.Situations.PRELAUNCH && this.part.vessel.situation != Vessel.Situations.LANDED) { lodeStatus = Localizer.Format(statusNAName); //Record the time delta for catch-up purposes. if (deltaTime >= TimeWarp.fixedDeltaTime) { totalDelta += deltaTime; } return; } //Check nearest lode if (nearestLode == null) { UpdateLode(); if (nearestLode == null) { lodeStatus = Localizer.Format(statusNoNearbyName); totalDelta = 0; return; } } //Check amount remaining if (nearestLode.amountRemaining == 0) { lodeStatus = Localizer.Format(statusDepletedName); return; } //Check storage space double currentAmount; double maxAmount; this.part.vessel.resourcePartSet.GetConnectedResourceTotals(outputDef.id, out currentAmount, out maxAmount, true); if (maxAmount < 0.0001) { lodeStatus = Localizer.Format(statusFullName); return; } if (currentAmount / maxAmount > 0.999999) { lodeStatus = Localizer.Format(statusFullName); return; } //Ok, we have some room. Calculate how much to request from the lode. //Base is 1 unit of resource per second, modified by efficiency and deltaTime. //Make sure we go through the processing loop at least once. totalDelta += deltaTime; double requestAmount = Efficiency * EfficiencyBonus * totalDelta; if (requestAmount < 0.0001f) { Debug.Log("No units of resource to request!"); return; } //Make sure we don't pull more than we need. double maxRequestAmount = maxAmount - currentAmount; if (requestAmount > maxRequestAmount) { requestAmount = maxRequestAmount; } //Make sure the lode has enough if (nearestLode.amountRemaining < requestAmount) { requestAmount = nearestLode.amountRemaining; } //Now we can do our business. Add the resource to the vessel. double amountObtained = Math.Abs(this.part.RequestResource(outputDef.id, -requestAmount)); totalDelta -= amountObtained; if (totalDelta < 0) { totalDelta = 0; } //Update the lode. nearestLode.amountRemaining -= amountObtained; if (nearestLode.amountRemaining < 0.0001) { nearestLode.amountRemaining = 0f; } //Status update lodeStatus = Localizer.Format(statusOKName); }
public virtual void PostProcess(ConverterResults result, double deltaTime) { }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); RecyclerIsActive = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE; AdjustedRecyclePercent = (float)(RecyclePercent * (result.TimeFactor / deltaTime)); }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); //Below is a lengthy operation, make sure that sufficient time has passed. elapsedDistributionTime += deltaTime; if (elapsedDistributionTime < DISTRIBUTION_TIMER) { return; } List <SExperimentResource> requiredResources = null; Dictionary <string, List <WBIModuleScienceExperiment> > requiredResourceMap = new Dictionary <string, List <WBIModuleScienceExperiment> >(); int totalSlots = experimentSlots.Length; int totalResources; WBIModuleScienceExperiment experimentSlot; SExperimentResource experimentResource; PartResource resource; double shareAmount; double remainder; List <WBIModuleScienceExperiment> experiments; //Reset distribution timer elapsedDistributionTime = 0f; //Make sure we have experiment slots GetExperimentSlots(); //Check for completion and compile the list of resources that the experiments need. for (int index = 0; index < totalSlots; index++) { //Get the experiment slot experimentSlot = experimentSlots[index]; if (experimentSlot.experimentID == experimentSlot.defaultExperiment) { continue; } //First, check for completion if (experimentSlot.CheckCompletion()) { continue; } //Now get all the resources that the experiment needs requiredResources = experimentSlot.GetRequiredResources(); //Update the map totalResources = requiredResources.Count; if (totalResources > 0) { for (int curResourceIndex = 0; curResourceIndex < totalResources; curResourceIndex++) { experimentResource = requiredResources[curResourceIndex]; //Create list if needed if (requiredResourceMap.ContainsKey(experimentResource.name) == false) { requiredResourceMap.Add(experimentResource.name, new List <WBIModuleScienceExperiment>()); } //Now update the list requiredResourceMap[experimentResource.name].Add(experimentSlot); } } } //Now that we know who needs what, divy up the resources. totalResources = this.part.Resources.Count; if (totalResources > 0) { for (int curResourceIndex = 0; curResourceIndex < totalResources; curResourceIndex++) { resource = this.part.Resources[curResourceIndex]; if (requiredResourceMap.ContainsKey(resource.resourceName)) { //Calculate share amount shareAmount = resource.amount / requiredResourceMap[resource.resourceName].Count; if (shareAmount < 0.0001f) { continue; } //Debugging: track the share amount if (debugMode) { if (shareAmounts.ContainsKey(resource.resourceName) == false) { shareAmounts.Add(resource.resourceName, 0); } if (currentAmounts.ContainsKey(resource.resourceName) == false) { currentAmounts.Add(resource.resourceName, 0); } currentAmounts[resource.resourceName] = resource.amount; shareAmounts[resource.resourceName] = shareAmount; } //Get the experiments experiments = requiredResourceMap[resource.resourceName]; //Now go through all the experiments and tell them to take their share totalSlots = experiments.Count; remainder = 0; for (int index = 0; index < totalSlots; index++) { remainder += experiments[index].TakeShare(resource.resourceName, shareAmount); } //Resource has been divied up. resource.amount = remainder; if (resource.amount < 0.0001f) { resource.amount = 0f; } } } } }
protected override void PostProcess(ConverterResults result, double deltaTime) { var diff = Math.Abs(deltaTime - result.TimeFactor); converterEnabled = diff < 0.00001f; }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result,deltaTime); EfficiencyMultiplier = result.TimeFactor/deltaTime; }
public void FixedUpdate() { if (!HighLogic.LoadedSceneIsFlight || vessel == null || !vessel.loaded) { return; } if (vessel.isEVA) { CheckEVA(vessel); return; } if (_partCount != vessel.parts.Count) { if (_partCount > 0) { _isStatusRefreshRequired = true; } _partCount = vessel.parts.Count; } if (_isDirty) { _isDirty = false; UpdateVesselInfo(); UpdateStatus(); } var now = Planetarium.GetUniversalTime(); if (_currentCrewCount == 0) { VesselStatus.VesselName = vessel.vesselName; VesselStatus.NumCrew = vessel.GetCrewCount(); VesselStatus.CrewCap = vessel.GetCrewCapacity(); VesselStatus.LastECCheck = now; VesselStatus.LastFeeding = now; VesselStatus.LastUpdate = now; LifeSupportManager.Instance.TrackVessel(VesselStatus); LastUpdateTime = now; return; } try { bool isLongLoop = false; var offKerbin = !LifeSupportManager.IsOnKerbin(vessel); CheckVesselId(); // Check our time double deltaTime = GetDeltaTime(); bool isCatchup = deltaTime / 2 > TimeWarp.fixedDeltaTime; if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE * 10) { return; } if (now >= _lastProcessingTime + _checkInterval) { isLongLoop = true; _lastProcessingTime = now; } VesselStatus.LastUpdate = now; VesselStatus.VesselName = vessel.vesselName; VesselStatus.NumCrew = vessel.GetCrewCount(); VesselStatus.CrewCap = vessel.GetCrewCapacity(); if (isLongLoop) { CheckForDeadKerbals(); } if (_currentCrewCount > 0) { //Guard clause if (_crewPart == null) { UpdateVesselInfo(); } //we will add a bit of a fudge factor for supplies var tolerance = deltaTime / 2f; //nom nom nom! ConverterResults resultSupply = Converter.ProcessRecipe(deltaTime, SupplyRecipe, _crewPart, null, 1f); ConverterResults resultEC = Converter.ProcessRecipe(deltaTime, ECRecipe, _crewPart, null, 1f); #region Long Loop - Crew if (isLongLoop) { //Ensure status is current UpdateStatus(); var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel); if (_oldHabChecksum < ResourceUtilities.FLOAT_TOLERANCE) { _oldHabChecksum = LifeSupportManager.GetHabChecksum(VesselStatus, vessel); } var newHabChecksum = LifeSupportManager.GetHabChecksum(VesselStatus, vessel); if (Math.Abs(_oldHabChecksum - newHabChecksum) > ResourceUtilities.FLOAT_TOLERANCE) { Debug.Log("[USI-LS] Vessel situation changed, refreshing life support"); _isStatusRefreshRequired = true; _oldHabChecksum = newHabChecksum; } var crewRoster = vessel.GetVesselCrew(); var count = crewRoster.Count; for (int i = 0; i < count; ++i) { var crewMember = crewRoster[i]; bool isGrouchyHab = false; bool isGrouchySupplies = false; bool isGrouchyEC = false; bool isScout = crewMember.HasEffect("ExplorerSkill") && habTime >= LifeSupportScenario.Instance.settings.GetSettings().ScoutHabTime; bool isPermaHab = habTime >= LifeSupportScenario.Instance.settings.GetSettings().PermaHabTime; bool isHomeWorld = CheckIfHomeWorld() && habTime >= LifeSupportScenario.Instance.settings.GetSettings().ScoutHabTime&& vessel.LandedOrSplashed; // Get the crew member's life support stats var trackedKerbal = LifeSupportManager.Instance.FetchKerbal(crewMember); // Update life support stats if (_isStatusRefreshRequired) { trackedKerbal.TimeEnteredVessel = now; _isStatusRefreshRequired = false; LifeSupportManager.Instance.TrackKerbal(trackedKerbal); } // Update Hab effects if (!offKerbin || isScout || isHomeWorld || isPermaHab) { trackedKerbal.TimeEnteredVessel = now; trackedKerbal.LastAtHome = now; trackedKerbal.MaxOffKerbinTime = habTime + trackedKerbal.LastAtHome; } else { if (vessel.id.ToString() != trackedKerbal.CurrentVesselId) { if (vessel.id.ToString() != trackedKerbal.PreviousVesselId) { trackedKerbal.TimeEnteredVessel = now; } trackedKerbal.PreviousVesselId = trackedKerbal.CurrentVesselId; trackedKerbal.CurrentVesselId = vessel.id.ToString(); LifeSupportManager.Instance.TrackKerbal(trackedKerbal); } isGrouchyHab = CheckHabSideEffects(trackedKerbal); } // Update Supplies effects if (offKerbin && (deltaTime - resultSupply.TimeFactor > tolerance)) { isGrouchySupplies = CheckSupplySideEffects(trackedKerbal); } else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE) { //All is well trackedKerbal.LastMeal = LastUpdateTime; VesselStatus.LastFeeding = LastUpdateTime; } // Update ElectricCharge effects if (offKerbin && (deltaTime - resultEC.TimeFactor > tolerance)) { isGrouchyEC = CheckECSideEffects(trackedKerbal); } else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE) { //All is well trackedKerbal.LastEC = LastUpdateTime; VesselStatus.LastECCheck = LastUpdateTime; } trackedKerbal.LastUpdate = now; var isAnyGrouch = isGrouchyEC || isGrouchyHab || isGrouchySupplies; if (isGrouchyEC && !isCatchup) { ApplyEffect( trackedKerbal, crewMember, LifeSupportManager.GetNoECEffect(trackedKerbal.KerbalName), "power loss"); } else if (isGrouchySupplies && !isCatchup) { ApplyEffect( trackedKerbal, crewMember, LifeSupportManager.GetNoSupplyEffect(trackedKerbal.KerbalName), "lack of supplies"); } else if (isGrouchyHab && !isCatchup) { ApplyEffect( trackedKerbal, crewMember, LifeSupportManager.GetNoHomeEffect(trackedKerbal.KerbalName), "homesickness"); } else if (crewMember.experienceTrait.Title != trackedKerbal.OldTrait && !isAnyGrouch) { RemoveGrouchiness(crewMember, trackedKerbal); } LifeSupportManager.Instance.TrackKerbal(trackedKerbal); } } #endregion - Crew var remainingSupplies = ResourceBroker.AmountAvailable( _crewPart, "Supplies", deltaTime, ResourceFlowMode.ALL_VESSEL); var remainingBattery = ResourceBroker.AmountAvailable( _crewPart, "ElectricCharge", deltaTime, ResourceFlowMode.ALL_VESSEL); var suppliesConsumption = LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount; var electricityConsumption = LifeSupportScenario.Instance.settings.GetSettings().ECAmount; VesselStatus.SuppliesLeft = remainingSupplies / suppliesConsumption / _currentCrewCount / VesselStatus.RecyclerMultiplier; VesselStatus.ECLeft = remainingBattery / electricityConsumption / _currentCrewCount; } else { VesselStatus.LastECCheck = now; VesselStatus.LastFeeding = now; VesselStatus.LastUpdate = now; } LifeSupportManager.Instance.TrackVessel(VesselStatus); } catch (Exception ex) { print(string.Format("ERROR {0} IN ModuleLifeSupport", ex.Message)); } }
public void FixedUpdate() { if (!HighLogic.LoadedSceneIsFlight || vessel == null) { return; } if (!vessel.loaded) { return; } if (_partCount != vessel.parts.Count) { if (_partCount > 0) { refreshVesselTime = true; } _partCount = vessel.parts.Count; } if (isDirty) { isDirty = false; UpdateVesselInfo(); UpdateStatus(); } if (_currentCrew == 0) { return; } try { bool isLongLoop = false; var offKerbin = !LifeSupportManager.IsOnKerbin(vessel); UnlockTins(); CheckVesselId(); //Check our time double deltaTime = GetDeltaTime(); bool isCatchup = deltaTime - 1 > TimeWarp.fixedDeltaTime; if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE * 10) { return; } if (Planetarium.GetUniversalTime() >= _lastProcessingTime + _checkInterval) { isLongLoop = true; _lastProcessingTime = Planetarium.GetUniversalTime(); } VesselStatus.LastUpdate = Planetarium.GetUniversalTime(); VesselStatus.VesselName = vessel.vesselName; VesselStatus.NumCrew = vessel.GetCrewCount(); VesselStatus.CrewCap = vessel.GetCrewCapacity(); if (isLongLoop) { CheckForDeadKerbals(); } if (_currentCrew > 0) { //Guard clause if (_crewPart == null) { UpdateVesselInfo(); } //we will add a bit of a fudge factor for supplies var tolerance = deltaTime / 2f; //nom nom nom! ConverterResults resultSupply = ResConverter.ProcessRecipe(deltaTime, SupplyRecipe, _crewPart, null, 1f); ConverterResults resultEC = ResConverter.ProcessRecipe(deltaTime, ECRecipe, _crewPart, null, 1f); #region Long Loop - Crew if (isLongLoop) { //Ensure status is current UpdateStatus(); foreach (var c in vessel.GetVesselCrew()) { bool isGrouchyHab = false; bool isGrouchySupplies = false; bool isGrouchyEC = false; //Fetch them from the queue var k = LifeSupportManager.Instance.FetchKerbal(c); //Update our stuff if (refreshVesselTime) { k.TimeEnteredVessel = Planetarium.GetUniversalTime(); refreshVesselTime = false; LifeSupportManager.Instance.TrackKerbal(k); } //First - Hab effects. if (!offKerbin) { var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel); k.LastAtHome = Planetarium.GetUniversalTime(); k.MaxOffKerbinTime = habTime + k.LastAtHome; k.TimeEnteredVessel = Planetarium.GetUniversalTime(); } else { if (vessel.id.ToString() != k.CurrentVesselId) { if (vessel.id.ToString() != k.PreviousVesselId) { k.TimeEnteredVessel = Planetarium.GetUniversalTime(); } k.PreviousVesselId = k.CurrentVesselId; k.CurrentVesselId = vessel.id.ToString(); LifeSupportManager.Instance.TrackKerbal(k); } isGrouchyHab = CheckHabSideEffects(k); } //Second - Supply if (offKerbin && (deltaTime - resultSupply.TimeFactor > tolerance)) { isGrouchySupplies = CheckSupplySideEffects(k); } else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE) { //All is well k.LastMeal = LastUpdateTime; VesselStatus.LastFeeding = LastUpdateTime; } //Third - EC //Second - Supply if (offKerbin && (deltaTime - resultEC.TimeFactor > tolerance)) { isGrouchyEC = CheckECSideEffects(k); } else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE) { //All is well k.LastEC = LastUpdateTime; VesselStatus.LastECCheck = LastUpdateTime; } k.LastUpdate = Planetarium.GetUniversalTime(); if (isGrouchyEC & !isCatchup) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect, "power loss"); } else if (isGrouchySupplies & !isCatchup) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect, "lack of supplies"); } else if (isGrouchyHab & !isCatchup) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffectVets : LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffect, "homesickness"); } else if (c.experienceTrait.Title != k.OldTrait) { RemoveGrouchiness(c, k); } LifeSupportManager.Instance.TrackKerbal(k); } } #endregion - Crew var supAmount = _resBroker.AmountAvailable(_crewPart, "Supplies", deltaTime, ResourceFlowMode.ALL_VESSEL); var ecAmount = _resBroker.AmountAvailable(_crewPart, "ElectricCharge", deltaTime, ResourceFlowMode.ALL_VESSEL); VesselStatus.SuppliesLeft = supAmount / LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount / _currentCrew / VesselStatus.RecyclerMultiplier; VesselStatus.ECLeft = ecAmount / LifeSupportScenario.Instance.settings.GetSettings().ECAmount / _currentCrew; } else { VesselStatus.LastECCheck = Planetarium.GetUniversalTime(); VesselStatus.LastFeeding = Planetarium.GetUniversalTime(); VesselStatus.LastUpdate = Planetarium.GetUniversalTime(); } LifeSupportManager.Instance.TrackVessel(VesselStatus); } catch (Exception ex) { print(String.Format("ERROR {0} IN ModuleLifeSupport", ex.Message)); } }
public override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); IsOperational = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE; }
protected override float GetHeatMultiplier(ConverterResults result, double deltaTime) { return(0f); }
protected override float GetHeatMultiplier(ConverterResults result, double deltaTime) { return 1 / (float)rate * HeatThrottle; }
protected override void PostProcess(ConverterResults result, double deltaTime) { PartIsActive = Math.Abs(deltaTime - result.TimeFactor) < ResourceUtilities.FLOAT_TOLERANCE; CurrentEfficiency = result.TimeFactor / deltaTime * eMultiplier; }
protected override float GetHeatMultiplier(ConverterResults result, double deltaTime) { return 0f; }
protected override void PostProcess(ConverterResults result, double deltaTime) { bool missingResources = false; Events["StartResourceConverter"].guiActive = false; Events["StopResourceConverter"].guiActive = false; if (FlightGlobals.ready == false) { return; } if (HighLogic.LoadedSceneIsFlight == false) { return; } if (ModuleIsActive() == false) { return; } if (this.part.vessel.IsControllable == false) { StopResourceConverter(); return; } if (hoursPerCycle == 0f) { return; } //If w're missing required resources, then we're done string missingRequiredResource = GetMissingRequiredResource(); if (!string.IsNullOrEmpty(missingRequiredResource)) { status = requiredResource + missingRequiredResource; StopResourceConverter(); return; } //Make sure we have the minimum crew if (hasMinimumCrew() == false) { return; } //Now run the base converter stuff base.PostProcess(result, deltaTime); if (cycleStartTime == 0f) { cycleStartTime = Planetarium.GetUniversalTime(); lastUpdateTime = cycleStartTime; elapsedTime = 0.0f; return; } //Calculate the crew skill and seconds of research per cycle. //Thes values can change if the player swaps out crew. totalCrewSkill = GetTotalCrewSkill(); secondsPerCycle = GetSecondsPerCycle(); //If we're missing resources then we're done. if (!string.IsNullOrEmpty(result.Status)) { if (result.Status.ToLower().Contains("missing")) { status = result.Status; missingResources = true; return; } } //Calculate elapsed time elapsedTime = Planetarium.GetUniversalTime() - cycleStartTime; //Calculate progress CalculateProgress(); //If we've elapsed time cycle then perform the analyis. float completionRatio = (float)(elapsedTime / secondsPerCycle); if (completionRatio > 1.0f && !missingResources) { int cyclesSinceLastUpdate = Mathf.RoundToInt(completionRatio); int currentCycle; for (currentCycle = 0; currentCycle < cyclesSinceLastUpdate; currentCycle++) { PerformAnalysis(); //Reset start time cycleStartTime = Planetarium.GetUniversalTime(); } } }
protected override float GetHeatMultiplier(ConverterResults result, double deltaTime) { //No need for heat generation return 0f; }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); RecyclerIsActive = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE; }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); Events["StartResourceConverter"].guiActive = false; Events["StopResourceConverter"].guiActive = false; if (FlightGlobals.ready == false) return; if (HighLogic.LoadedSceneIsFlight == false) return; if (ModuleIsActive() == false) return; if (this.part.vessel.IsControllable == false) { StopConverter(); return; } if (hoursPerCycle == 0f) return; //Calculate the crew skill and seconds of research per cycle. //Thes values can change if the player swaps out crew. totalCrewSkill = GetTotalCrewSkill(); secondsPerCycle = GetSecondsPerCycle(); //Calculate elapsed time elapsedTime = Planetarium.GetUniversalTime() - cycleStartTime; //Calculate progress CalculateProgress(); //If we've completed our research cycle then perform the analyis. int cyclesSinceLastUpdate = Mathf.RoundToInt((float)(elapsedTime / secondsPerCycle)); int currentCycle; for (currentCycle = 0; currentCycle < cyclesSinceLastUpdate; currentCycle++) { PerformAnalysis(); //Reset start time cycleStartTime = Planetarium.GetUniversalTime(); } //If we're missing resources then stop the converter if (result.Status.ToLower().Contains("missing")) { StopConverter(); status = result.Status; } }
protected override void PostProcess(ConverterResults result, double deltaTime) { base.PostProcess(result, deltaTime); HabIsActive = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE; HabAdjustment = result.TimeFactor / deltaTime; }
protected override void PostProcess(ConverterResults result, double deltaTime) { RecyclerIsActive = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE; }
protected override void PostProcess(ConverterResults result, double deltaTime) { RecyclerIsActive = Math.Abs(result.TimeFactor - deltaTime) < ResourceUtilities.FLOAT_TOLERANCE; }