From 27d3432cbf0457a0246f493c9d73d60e4573a62a Mon Sep 17 00:00:00 2001 From: RMROC451 Date: Sat, 27 Jul 2024 22:30:40 -0500 Subject: [PATCH] #26 auto heal hotbox when found if caboose use is enabled and caboose is present in consist. --- .../Extensions/AutoEngineer_Extensions.cs | 44 +++++++++++-------- TweaksAndThings/Extensions/Car_Extensions.cs | 16 ++++++- TweaksAndThings/TweaksAndThingsPlugin.cs | 11 +++-- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/TweaksAndThings/Extensions/AutoEngineer_Extensions.cs b/TweaksAndThings/Extensions/AutoEngineer_Extensions.cs index ddfc50f..edfab78 100644 --- a/TweaksAndThings/Extensions/AutoEngineer_Extensions.cs +++ b/TweaksAndThings/Extensions/AutoEngineer_Extensions.cs @@ -6,22 +6,22 @@ namespace RMROC451.TweaksAndThings.Extensions { internal static class AutoEngineer_Extensions { - private static float CabooseHalvedFloat(this float input, bool hasCaboose) => + private static float CabooseHalvedFloat(this float input, Model.Car? hasCaboose) => hasCaboose ? input / 2 : input; - private static float CabooseAutoOilerLimit(this bool hasCaboose) => - hasCaboose ? 0.99f : AutoOiler.OilIfBelow; + private static float CabooseAutoOilerLimit(this Model.Car? caboose) => + caboose ? 0.99f : AutoOiler.OilIfBelow; public static IEnumerator MrocAutoOilerLoop(this AutoOiler oiler, Serilog.ILogger _log, bool cabooseRequired) { int originIndex = oiler.FindOriginIndex(); - bool hasCaboose = oiler._cars.CabooseInConsist(); + Model.Car? foundCaboose = oiler._cars.CabooseInConsist(); if (originIndex < 0) { _log.Error("Couldn't find origin car {car}", oiler._originCar); oiler._coroutine = null; yield break; - } else if (CabooseRequirementChecker(string.Format("{0} {1}", oiler.GetType().Name, oiler.name), cabooseRequired, hasCaboose, _log)) + } else if (CabooseRequirementChecker(string.Format("{0} {1}", oiler.GetType().Name, oiler.name), cabooseRequired, foundCaboose, _log)) { yield break; } @@ -31,30 +31,35 @@ namespace RMROC451.TweaksAndThings.Extensions oiler.name, oiler._reverse, cabooseRequired, - hasCaboose, - hasCaboose.CabooseAutoOilerLimit() + foundCaboose, + foundCaboose.CabooseAutoOilerLimit() ); while (true) { - yield return new WaitForSeconds(AutoOiler.StartDelay.CabooseHalvedFloat(hasCaboose)); + yield return new WaitForSeconds(AutoOiler.StartDelay.CabooseHalvedFloat(foundCaboose)); int carIndex = originIndex; - float adjustedTimeToWalk = AutoOiler.TimeToWalkCar.CabooseHalvedFloat(hasCaboose); + float adjustedTimeToWalk = AutoOiler.TimeToWalkCar.CabooseHalvedFloat(foundCaboose); do { if (oiler.TryGetCar(carIndex, out var car)) { float num = 0f; float origOil = car.Oiled; - if (car.NeedsOiling && car.Oiled < hasCaboose.CabooseAutoOilerLimit()) + if (car.NeedsOiling && car.Oiled < foundCaboose.CabooseAutoOilerLimit()) { float num2 = 1f - car.Oiled; car.OffsetOiled(num2); - float num3 = num2 * AutoOiler.TimeToFullyOil.CabooseHalvedFloat(hasCaboose); + float num3 = num2 * AutoOiler.TimeToFullyOil.CabooseHalvedFloat(foundCaboose); num += num3; oiler._pendingRunDuration += num3; oiler._oiledCount++; _log.Information("AutoOiler {name}: oiled {car} from {orig} => {new}", oiler.name, car, origOil, car.Oiled); } + if (car.HasHotbox && car.Oiled == 1f && cabooseRequired && foundCaboose) + { + _log.Information("AutoOiler {name}: {foundCaboose} repaired hotbox {car}", oiler.name, foundCaboose, car); + car.AdjustHotboxValue(0f); + } num += adjustedTimeToWalk; oiler._pendingRunDuration += adjustedTimeToWalk; yield return new WaitForSeconds(num); @@ -71,14 +76,16 @@ namespace RMROC451.TweaksAndThings.Extensions { while (true) { - bool hasCaboose = spotter._cars.CabooseInConsist(); + Model.Car? foundCaboose = spotter._cars.CabooseInConsist(); if (!spotter.HasCars) { yield return new WaitForSeconds(1f); continue; } - _log.Information("AutoHotboxSpotter {name}: Hotbox Spotter Running, Has Caboose => {hasCaboose}; Has Cars {hasCars}; Requires Caboose {requiresCaboose}", spotter.name, hasCaboose, spotter.HasCars, cabooseRequired); - if (CabooseRequirementChecker(string.Format("{0} {1}", spotter.GetType().Name, spotter.name), cabooseRequired, hasCaboose, _log)) + _log.Information("AutoHotboxSpotter {name}: Hotbox Spotter Running, Found Caboose => {hasCaboose}; Has Cars {hasCars}; Requires Caboose {requiresCaboose}", + spotter.name, foundCaboose, spotter.HasCars, cabooseRequired); + foundCaboose = spotter._cars.CabooseInConsist(); + if (CabooseRequirementChecker(string.Format("{0} {1}", spotter.GetType().Name, spotter.name), cabooseRequired, foundCaboose, _log)) { yield break; } @@ -86,11 +93,12 @@ namespace RMROC451.TweaksAndThings.Extensions while (spotter.HasCars) { int num = Random.Range(60, 300); - if (hasCaboose) + foundCaboose = spotter._cars.CabooseInConsist(); + if (foundCaboose) { var numOrig = num; num = Random.Range(15, 30); - _log.Information("AutoHotboxSpotter {name}: Next check went from num(60,300) => {numOrig}; to num(15,30) => {hasCaboose}; Requires Caboose {requiresCaboose}", spotter.name, numOrig, num, hasCaboose, cabooseRequired); + _log.Information("AutoHotboxSpotter {name}: Next check went from num(60,300) => {numOrig}; to num(15,30) => {hasCaboose}; Requires Caboose {requiresCaboose}", spotter.name, numOrig, num, foundCaboose, cabooseRequired); } yield return new WaitForSeconds(num); spotter.CheckForHotbox(); @@ -98,9 +106,9 @@ namespace RMROC451.TweaksAndThings.Extensions } } - private static bool CabooseRequirementChecker(string name, bool cabooseRequired, bool hasCaboose, Serilog.ILogger _log) + private static bool CabooseRequirementChecker(string name, bool cabooseRequired, Model.Car? foundCaboose, Serilog.ILogger _log) { - bool error = cabooseRequired && !hasCaboose; + bool error = cabooseRequired && foundCaboose == null; if (error) { _log.Debug("{name}: Couldn't find required caboose!", name); } diff --git a/TweaksAndThings/Extensions/Car_Extensions.cs b/TweaksAndThings/Extensions/Car_Extensions.cs index 0783eec..5e70ad7 100644 --- a/TweaksAndThings/Extensions/Car_Extensions.cs +++ b/TweaksAndThings/Extensions/Car_Extensions.cs @@ -1,4 +1,6 @@ -using Helpers; +using Game.Messages; +using Game.State; +using Helpers; using Model; using Model.Definition.Data; using Model.OpsNew; @@ -60,7 +62,9 @@ public static class Car_Extensions public static bool IsCaboose(this Car car) => car.Archetype == Model.Definition.CarArchetype.Caboose; - public static bool CabooseInConsist(this IEnumerable input) => input.FirstOrDefault(c => c.IsCaboose()); + public static bool IsCabooseAndStoppedForLoadRefresh(this Car car) => car.IsCaboose() && car.IsStopped(30f); + + public static Car? CabooseInConsist(this IEnumerable input) => input.FirstOrDefault(c => c.IsCaboose()); public static Car? CabooseWithSufficientCrewHours(this Car car, float timeNeeded, HashSet carIdsCheckedAlready, bool decrement = false) { @@ -122,4 +126,12 @@ public static class Car_Extensions }).ToList(); return source; } + + public static void AdjustHotboxValue(this Car car, float hotboxValue) => + StateManager.ApplyLocal( + new PropertyChange( + car.id, PropertyChange.KeyForControl(PropertyChange.Control.Hotbox), + new FloatPropertyValue(hotboxValue) + ) + ); } diff --git a/TweaksAndThings/TweaksAndThingsPlugin.cs b/TweaksAndThings/TweaksAndThingsPlugin.cs index 30d488a..2cadcc9 100644 --- a/TweaksAndThings/TweaksAndThingsPlugin.cs +++ b/TweaksAndThings/TweaksAndThingsPlugin.cs @@ -90,10 +90,13 @@ public class TweaksAndThingsPlugin : SingletonPluginBase, }); } + private static string cabooseUse => "Caboose Use"; + private static string autoAiRequirment => "AutoAI\nRequirement"; + private void CabooseMods(UIPanelBuilder builder) { builder.AddField( - "Caboose Use", + cabooseUse, builder.AddToggle( () => settings?.EndGearHelpersRequirePayment ?? false, delegate (bool enabled) @@ -109,12 +112,14 @@ public class TweaksAndThingsPlugin : SingletonPluginBase, Caboose starts reloading `Crew Hours` at any Team or Repair track (no waybill), after being stationary for 30 seconds. -AutoOiler Update: Increases limit that crew will oiling a car from 75% -> 99%, also halves the time it takes (simulating crew from lead end and caboose handling half the train) +AutoOiler Update: Increases limit that crew will oiling a car from 75% -> 99%, also halves the time it takes (simulating crew from lead end and caboose handling half the train). + +AutoOiler Update: if `{cabooseUse}` & `{autoAiRequirment.Replace("\n", " ")}` checked, then when a caboose is present, the AutoOiler will repair hotboxes afer oiling them to 100%. AutoHotboxSpotter Update: decrease the random wait from 30 - 300 seconds to 15 - 30 seconds (Safety Is Everyone's Job)"); builder.AddField( - $"AutoAI\nRequirement", + autoAiRequirment, builder.AddToggle( () => settings?.RequireConsistCabooseForOilerAndHotboxSpotter ?? false, delegate (bool enabled)