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.Config.Name != 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 (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(); 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); 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 #region Long Loop - Crew if (isLongLoop) { //Ensure status is current UpdateStatus(); //First - Hab effects. if (LifeSupportManager.IsOnKerbin(vessel)) { k.LastAtHome = Planetarium.GetUniversalTime(); k.MaxOffKerbinTime = 648000; 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(); } } 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) { 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(_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; } } 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 (vessel.isEVA) { CheckEVA(vessel); return; } if (_partCount != vessel.parts.Count) { if (_partCount > 0) { refreshVesselTime = true; } _partCount = vessel.parts.Count; } if (isDirty) { isDirty = false; UpdateVesselInfo(); UpdateStatus(); } if (_currentCrew == 0) { VesselStatus.VesselName = vessel.vesselName; VesselStatus.NumCrew = vessel.GetCrewCount(); VesselStatus.CrewCap = vessel.GetCrewCapacity(); VesselStatus.LastECCheck = Planetarium.GetUniversalTime(); VesselStatus.LastFeeding = Planetarium.GetUniversalTime(); VesselStatus.LastUpdate = Planetarium.GetUniversalTime(); LifeSupportManager.Instance.TrackVessel(VesselStatus); LastUpdateTime = Planetarium.GetUniversalTime(); 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 (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(); var vCrew = vessel.GetVesselCrew(); var count = vCrew.Count; var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel); for (int i = 0; i < count; ++i) { var c = vCrew[i]; bool isGrouchyHab = false; bool isGrouchySupplies = false; bool isGrouchyEC = false; bool isScout = c.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; //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 || isScout || isHomeWorld || isPermaHab) { 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 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(); var isAnyGrouch = isGrouchyEC || isGrouchyHab || isGrouchySupplies; if (isGrouchyEC && !isCatchup) { ApplyEffect(k, c, LifeSupportManager.GetNoECEffect(k.KerbalName), "power loss"); } else if (isGrouchySupplies && !isCatchup) { ApplyEffect(k, c, LifeSupportManager.GetNoSupplyEffect(k.KerbalName), "lack of supplies"); } else if (isGrouchyHab && !isCatchup) { ApplyEffect(k, c, LifeSupportManager.GetNoHomeEffect(k.KerbalName), "homesickness"); } else if (c.experienceTrait.Title != k.OldTrait && !isAnyGrouch) { 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)); } }
private List <LifeSupportVesselDisplayStat> UpdateGUIStats() { var secondsPerDay = GameSettings.KERBIN_TIME ? (21600) : (86400); var useHabPenalties = (LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffectVets + LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffect > 0); LifeSupportManager.Instance.UpdateVesselStats(); var statList = new List <LifeSupportVesselDisplayStat>(); var checkVessels = new List <Guid>(); foreach (var v in FlightGlobals.Vessels.Where(v => v.isEVA)) { checkVessels.Add(v.id); } foreach (var vslId in checkVessels) { var vsl = FlightGlobals.Vessels.FirstOrDefault(v => v.id == vslId); if (vsl == null) { continue; } var lblColor = "FFD966"; var vstat = new LifeSupportVesselDisplayStat(); vstat.VesselName = String.Format("<color=#{0}>{1}</color>", lblColor, vsl.vesselName); vstat.LastUpdate = vsl.missionTime; var sitString = "(EVA)"; var remEVATime = LifeSupportScenario.Instance.settings.GetSettings().EVATime - vsl.missionTime; var timeString = LifeSupportUtilities.SecondsToKerbinTime(Math.Max(0, remEVATime)); if (remEVATime > 0) { vstat.SummaryLabel = String.Format( "<color=#3DB1FF>{0}/{1} - </color><color=#9EE4FF>{2}</color><color=#3DB1FF> time remaining</color>" , vsl.mainBody.bodyName , sitString , timeString.Substring(timeString.IndexOf(':') + 1)); } else { vstat.SummaryLabel = "<color=#FF8585>EVA Time Expired</color>"; } vstat.crew = new List <LifeSupportCrewDisplayStat>(); statList.Add(vstat); } var vesselList = new List <VesselSupplyStatus>(); vesselList.AddRange(LifeSupportManager.Instance.VesselSupplyInfo); foreach (var vsl in vesselList) { var vstat = new LifeSupportVesselDisplayStat(); Vessel thisVessel = FlightGlobals.Vessels.First(v => v.id.ToString() == vsl.VesselId); double supmult = LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount *Convert.ToDouble(vsl.NumCrew) * vsl.RecyclerMultiplier; var supPerDay = secondsPerDay * supmult; var estFood = supmult * (Planetarium.GetUniversalTime() - vsl.LastFeeding); double ecmult = LifeSupportScenario.Instance.settings.GetSettings().ECAmount *Convert.ToDouble(vsl.NumCrew); var ecPerDay = secondsPerDay * ecmult; var estEC = ecmult * (Planetarium.GetUniversalTime() - vsl.LastECCheck); int numSharedHabVessels = 0; var habTime = LifeSupportManager.GetTotalHabTime(vsl, out numSharedHabVessels); var supAmount = GetResourceInVessel(thisVessel, "Supplies"); if (supAmount == 0) { supAmount = Math.Max(0, (vsl.SuppliesLeft * supmult) - estFood); } var ecAmount = GetResourceInVessel(thisVessel, "ElectricCharge"); if (ecAmount == 0) { ecAmount = Math.Max(0, (vsl.ECLeft * ecmult) - estEC); } bool isOldData = Planetarium.GetUniversalTime() - vsl.LastUpdate > 2; var lblColor = isOldData ? "C4C4C4" : "ACFF40"; vstat.VesselName = String.Format("<color=#{0}>{1}</color>", lblColor, vsl.VesselName); vstat.VesselId = vsl.VesselId; vstat.LastUpdate = vsl.LastUpdate; var sitString = "Orbiting"; thisVessel.checkSplashed(); if (thisVessel.Splashed) { sitString = "Splashed"; } thisVessel.checkLanded(); if (thisVessel.Landed) { sitString = "Landed"; } var habString = "indefinite"; if (useHabPenalties) { habString = LifeSupportUtilities.SecondsToKerbinTime(habTime, true); } vstat.SummaryLabel = String.Format( "<color=#3DB1FF>{0}/{1} - </color><color=#9EE4FF>{2:0}</color><color=#3DB1FF> supplies (</color><color=#9EE4FF>{3:0.0}</color><color=#3DB1FF>/day) hab for </color><color=#9EE4FF>{4}</color>" , thisVessel.mainBody.bodyName , sitString , supAmount , supPerDay , habString); vstat.crew = new List <LifeSupportCrewDisplayStat>(); if (useHabPenalties) { vstat.SummaryLabel += String.Format( "<color=#3DB1FF> (</color><color=#9EE4FF>{0}</color><color=#3DB1FF> {1} shared within </color><color=#9EE4FF>{2}</color><color=#3DB1FF>m)</color>", isOldData ? "?" : numSharedHabVessels.ToString(), numSharedHabVessels == 1 ? "vessel" : "vessels", LifeSupportScenario.Instance.settings.GetSettings().HabRange); } foreach (var c in thisVessel.GetVesselCrew()) { var cStat = new LifeSupportCrewDisplayStat(); var cls = LifeSupportManager.Instance.FetchKerbal(c); cStat.CrewName = String.Format("<color=#FFFFFF>{0} ({1})</color>", c.name, c.experienceTrait.Title.Substring(0, 1)); var ecLeft = (ecAmount / ecPerDay * secondsPerDay) + LifeSupportScenario.Instance.settings.GetSettings().ECTime; if (ecAmount <= LifeSupportScenario.Instance.settings.GetSettings().ECAmount&& !LifeSupportManager.IsOnKerbin(thisVessel)) { ecLeft = cls.LastEC - Planetarium.GetUniversalTime() + LifeSupportScenario.Instance.settings.GetSettings().ECTime; } var lblECTime = LifeSupportUtilities.SecondsToKerbinTime(ecLeft); var lblEC = "6FFF00"; if (ecLeft < LifeSupportScenario.Instance.settings.GetSettings().ECTime) { lblEC = "FFE100"; } if (ecLeft < LifeSupportScenario.Instance.settings.GetSettings().ECTime / 2) { lblEC = "FFAE00"; } if (ecLeft <= ResourceUtilities.FLOAT_TOLERANCE) { lblEC = "FF5E5E"; lblECTime = "expired"; } cStat.ECLabel = String.Format("<color=#{0}>{1}</color>", lblEC, lblECTime); var snacksLeft = (supAmount / supPerDay * secondsPerDay) + LifeSupportScenario.Instance.settings.GetSettings().SupplyTime; if (supAmount <= LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount&& !LifeSupportManager.IsOnKerbin(thisVessel)) { snacksLeft = cls.LastMeal - Planetarium.GetUniversalTime() + LifeSupportScenario.Instance.settings.GetSettings().SupplyTime; } var lblSupTime = LifeSupportUtilities.SecondsToKerbinTime(snacksLeft); var lblSup = "6FFF00"; if (snacksLeft < LifeSupportScenario.Instance.settings.GetSettings().SupplyTime) { lblSup = "FFE100"; } if (snacksLeft < LifeSupportScenario.Instance.settings.GetSettings().SupplyTime / 2) { lblSup = "FFAE00"; } if (snacksLeft <= ResourceUtilities.FLOAT_TOLERANCE) { lblSup = "FF5E5E"; lblSupTime = "expired"; } cStat.SupplyLabel = String.Format("<color=#{0}>{1}</color>", lblSup, lblSupTime); var habTimeLeft = habTime - (Planetarium.GetUniversalTime() - cls.TimeEnteredVessel); var homeTimeLeft = cls.MaxOffKerbinTime - Planetarium.GetUniversalTime(); var crewHabString = "indefinite"; var crewHomeString = "indefinite"; var lblHab = "6FFF00"; var lblHome = "6FFF00"; if (useHabPenalties) { crewHomeString = LifeSupportUtilities.SecondsToKerbinTime(homeTimeLeft); crewHabString = LifeSupportUtilities.SecondsToKerbinTime(habTimeLeft); } if (habTimeLeft < secondsPerDay * 30) { lblHab = "FFE100"; } if (habTimeLeft < secondsPerDay * 15) { lblHab = "FFAE00"; } if (habTimeLeft < 0) { lblHab = "FF5E5E"; crewHabString = "expired"; } cStat.HabLabel = String.Format("<color=#{0}>{1}</color>", lblHab, crewHabString); if (homeTimeLeft < secondsPerDay * 30) //15 days { lblHome = "FFE100"; } if (homeTimeLeft < secondsPerDay * 15) { lblHome = "FFAE00"; } if (homeTimeLeft < 0) { lblHome = "FF5E5E"; crewHomeString = "expired"; } cStat.HomeLabel = String.Format("<color=#{0}>{1}</color>", lblHome, crewHomeString); vstat.crew.Add(cStat); } statList.Add(vstat); } return(statList); }
public void FixedUpdate() { if (part.protoModuleCrew.Count == 0) { return; } if (Planetarium.GetUniversalTime() < _lastProcessingTime + _checkInterval) { return; } _lastProcessingTime = Planetarium.GetUniversalTime(); UnlockTins(); //Check our time double deltaTime = GetDeltaTime(); if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE) { return; } ConverterResults result = ResConverter.ProcessRecipe(deltaTime, LifeSupportRecipe, part, this, 1f); var v = LifeSupportManager.Instance.FetchVessel(part.vessel.id.ToString()); v.LastUpdate = Planetarium.GetUniversalTime(); v.VesselName = part.vessel.vesselName; v.NumCrew = part.vessel.GetCrewCount(); v.RecyclerMultiplier = (float)LifeSupportManager.GetRecyclerMultiplier(part.vessel); v.CrewCap = part.vessel.GetCrewCapacity(); CheckForDeadKerbals(); //Update Hab info var habMulti = 0d; var habTime = 0d; var totParts = 0d; var maxParts = 0d; var habMods = part.vessel.FindPartModulesImplementing <ModuleHabitation>(); foreach (var hab in habMods) { //Next. Certain modules, in addition to crew capacity, have living space. habTime += hab.KerbalMonths; //Lastly. Some modules act more as 'multipliers', dramatically extending a hab's workable lifespan. habMulti += (hab.HabMultiplier * Math.Min(1, hab.CrewCapacity / v.NumCrew)); } 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"; } //we will add a bit of a fudge factor for supplies var tolerance = deltaTime / 2f; foreach (var c in part.protoModuleCrew) { bool isGrouchyHab = false; bool isGrouchySupplies = false; //Fetch them from the queue var k = LifeSupportManager.Instance.FetchKerbal(c); //Update our stuff //First - Hab effects. if (LifeSupportManager.IsOnKerbin(part.vessel)) { k.LastOnKerbin = Planetarium.GetUniversalTime(); k.MaxOffKerbinTime = Planetarium.GetUniversalTime() + 972000000; k.TimeEnteredVessel = Planetarium.GetUniversalTime(); } else { if (part.vessel.id.ToString() != k.LastVesselId) { k.LastVesselId = part.vessel.id.ToString(); k.TimeEnteredVessel = Planetarium.GetUniversalTime(); } } isGrouchyHab = CheckHabSideEffects(k, v); //Second - Supply if (!LifeSupportManager.IsOnKerbin(part.vessel) && (deltaTime - result.TimeFactor > tolerance)) { isGrouchySupplies = CheckSupplySideEffects(k); } else { //All is well k.LastMeal = lastUpdateTime; v.LastFeeding = lastUpdateTime; } k.LastUpdate = Planetarium.GetUniversalTime(); if (!isGrouchyHab && !isGrouchySupplies) { RemoveGrouchiness(c, k); } if (deltaTime < _checkInterval * 2) { if (isGrouchyHab) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportSetup.Instance.LSConfig.NoHomeEffectVets : LifeSupportSetup.Instance.LSConfig.NoHomeEffect); } if (isGrouchySupplies) { ApplyEffect(k, c, LifeSupportManager.isVet(k.KerbalName) ? LifeSupportSetup.Instance.LSConfig.NoSupplyEffectVets : LifeSupportSetup.Instance.LSConfig.NoSupplyEffect); } } LifeSupportManager.Instance.TrackKerbal(k); var supAmpunt = _resBroker.AmountAvailable(part, "Supplies", deltaTime, "ALL_VESSEL"); v.SuppliesLeft = supAmpunt / LifeSupportSetup.Instance.LSConfig.SupplyAmount / part.vessel.GetCrewCount() / LifeSupportManager.GetRecyclerMultiplier(vessel); } LifeSupportManager.Instance.TrackVessel(v); }
private LifeSupportCrewDisplayStat GetCrewStat(ProtoCrewMember c, Vessel vessel, double vesselSuppliesTimeLeft, double vesselEcTimeLeft, double vesselEcAmount, double vesselHabTime) { var cls = LifeSupportManager.Instance.FetchKerbal(c); //Guard clause in case we just changed vessels if (cls.CurrentVesselId != vessel.id.ToString() && cls.PreviousVesselId != vessel.id.ToString()) { cls.PreviousVesselId = cls.CurrentVesselId; cls.CurrentVesselId = vessel.id.ToString(); cls.TimeEnteredVessel = Planetarium.GetUniversalTime(); LifeSupportManager.Instance.TrackKerbal(cls); } // not sure this is correct or needed var ecTimeLeft = vesselEcTimeLeft; if (vesselEcAmount <= LifeSupportScenario.Instance.settings.GetSettings().ECAmount&& !LifeSupportManager.IsOnKerbin(vessel)) { ecTimeLeft = cls.LastEC - Planetarium.GetUniversalTime(); } var cStat = new LifeSupportCrewDisplayStat(); cStat.CrewName = GetCrewNameLabel(c, cls); cStat.ComputeEc(ecTimeLeft, c); cStat.ComputeSupply(vesselSuppliesTimeLeft, c); cStat.ComputeHab(vesselHabTime, c, cls); cStat.ComputeHome(c, cls); LifeSupportManager.Instance.TrackKerbal(cls); return(cStat); }
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)); } }
private List <LifeSupportVesselDisplayStat> UpdateGUIStats() { var useHabPenalties = (LifeSupportSetup.Instance.LSConfig.NoHomeEffectVets + LifeSupportSetup.Instance.LSConfig.NoHomeEffect > 0); LifeSupportManager.Instance.UpdateVesselStats(); var statList = new List <LifeSupportVesselDisplayStat>(); var checkVessels = new List <Guid>(); foreach (var v in FlightGlobals.Vessels.Where(v => v.isEVA)) { checkVessels.Add(v.id); } foreach (var vslId in checkVessels) { var vsl = FlightGlobals.Vessels.FirstOrDefault(v => v.id == vslId); if (vsl == null) { continue; } var lblColor = "FFD966"; var vstat = new LifeSupportVesselDisplayStat(); vstat.VesselName = String.Format("<color=#{0}>{1}</color>", lblColor, vsl.vesselName); vstat.LastUpdate = vsl.missionTime; var sitString = "(EVA)"; var remEVATime = LifeSupportSetup.Instance.LSConfig.EVATime - vsl.missionTime; var timeString = LifeSupportUtilities.SecondsToKerbinTime(Math.Max(0, remEVATime)); if (remEVATime > 0) { vstat.SummaryLabel = String.Format( "<color=#3DB1FF>{0}/{1} - </color><color=#9EE4FF>{2}</color><color=#3DB1FF> time remaining</color>" , vsl.mainBody.bodyName , sitString , timeString.Substring(timeString.IndexOf(':') + 1)); } else { vstat.SummaryLabel = "<color=#FF8585>EVA Time Expired</color>"; } vstat.crew = new List <LifeSupportCrewDisplayStat>(); statList.Add(vstat); } var vesselList = new List <VesselSupplyStatus>(); vesselList.AddRange(LifeSupportManager.Instance.VesselSupplyInfo); foreach (var vsl in vesselList) { var vstat = new LifeSupportVesselDisplayStat(); Vessel thisVessel = FlightGlobals.Vessels.First(v => v.id.ToString() == vsl.VesselId); double supmult = LifeSupportSetup.Instance.LSConfig.SupplyAmount * Convert.ToDouble(vsl.NumCrew) * vsl.RecyclerMultiplier; var supPerDay = (21600 * supmult); var estFood = supmult * (Planetarium.GetUniversalTime() - vsl.LastFeeding); var habTime = LifeSupportManager.GetTotalHabTime(vsl); var supAmount = GetSuppliesInVessel(thisVessel); if (supAmount == 0) { supAmount = Math.Max(0, (vsl.SuppliesLeft * supmult) - estFood); } var lblColor = "ACFF40"; if (Planetarium.GetUniversalTime() - vsl.LastUpdate > 2) { lblColor = "C4C4C4"; } vstat.VesselName = String.Format("<color=#{0}>{1}</color>", lblColor, vsl.VesselName); vstat.LastUpdate = vsl.LastUpdate; var sitString = "Orbiting"; if (thisVessel.Splashed || thisVessel.heightFromTerrain < 1000) { sitString = "Splashed"; } if (thisVessel.Landed || thisVessel.heightFromTerrain < 1000) { sitString = "Landed"; } var habString = "indefinite"; if (useHabPenalties) { habString = LifeSupportUtilities.SecondsToKerbinTime(habTime, true); } vstat.SummaryLabel = String.Format("<color=#3DB1FF>{0}/{1} - </color><color=#9EE4FF>{2:0}</color><color=#3DB1FF> supplies (</color><color=#9EE4FF>{3:0.0}</color><color=#3DB1FF>/day) hab for </color><color=#9EE4FF>{4}</color>" , thisVessel.mainBody.bodyName , sitString , supAmount , supPerDay , habString); vstat.crew = new List <LifeSupportCrewDisplayStat>(); foreach (var c in thisVessel.GetVesselCrew()) { var cStat = new LifeSupportCrewDisplayStat(); var cls = LifeSupportManager.Instance.FetchKerbal(c); cStat.CrewName = String.Format("<color=#FFFFFF>{0} ({1})</color>", c.name, c.experienceTrait.Title.Substring(0, 1)); var snacksLeft = supAmount / supPerDay * 60 * 60 * 6; if (supAmount <= ResourceUtilities.FLOAT_TOLERANCE && !LifeSupportManager.IsOnKerbin(thisVessel)) { snacksLeft = cls.LastMeal - Planetarium.GetUniversalTime(); } var lblSup = "6FFF00"; if (snacksLeft < 60 * 60 * 6 * 15) //15 days { lblSup = "FFE100"; } if (snacksLeft < 0) { lblSup = "FFAE00"; } if (snacksLeft < -60 * 60 * 6 * 15) { lblSup = "FF5E5E"; } cStat.SupplyLabel = String.Format("<color=#{0}>{1}</color>", lblSup, LifeSupportUtilities.SecondsToKerbinTime(snacksLeft)); var timeLeft = Math.Min(cls.MaxOffKerbinTime - Planetarium.GetUniversalTime(), habTime - (Planetarium.GetUniversalTime() - cls.TimeEnteredVessel)); var lblHab = "6FFF00"; if (timeLeft < 60 * 60 * 6 * 15) //15 days { lblHab = "FFE100"; } if (timeLeft < 0) { lblHab = "FFAE00"; } if (timeLeft < -60 * 60 * 6 * 15) { lblHab = "FF5E5E"; } var crewHabString = "indefinite"; if (useHabPenalties) { crewHabString = LifeSupportUtilities.SecondsToKerbinTime(timeLeft); } cStat.HabLabel = String.Format("<color=#{0}>{1}</color>", lblHab, crewHabString); vstat.crew.Add(cStat); } statList.Add(vstat); } return(statList); }