mirror of
https://github.com/rmroc451/TweaksAndThings.git
synced 2025-12-17 17:59:39 -06:00
updates
This commit is contained in:
@@ -2,6 +2,6 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<MajorVersion>1</MajorVersion>
|
<MajorVersion>1</MajorVersion>
|
||||||
<MinorVersion>2</MinorVersion>
|
<MinorVersion>2</MinorVersion>
|
||||||
<PatchVersion>6</PatchVersion>
|
<PatchVersion>7</PatchVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -2,12 +2,14 @@
|
|||||||
using Game.State;
|
using Game.State;
|
||||||
using Helpers;
|
using Helpers;
|
||||||
using Model;
|
using Model;
|
||||||
|
using Model.Definition;
|
||||||
using Model.Definition.Data;
|
using Model.Definition.Data;
|
||||||
using Model.Ops;
|
using Model.Ops;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Security.AccessControl;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace RMROC451.TweaksAndThings.Extensions;
|
namespace RMROC451.TweaksAndThings.Extensions;
|
||||||
@@ -62,10 +64,16 @@ public static class Car_Extensions
|
|||||||
|
|
||||||
public static bool IsCaboose(this Car car) => car.Archetype == Model.Definition.CarArchetype.Caboose;
|
public static bool IsCaboose(this Car car) => car.Archetype == Model.Definition.CarArchetype.Caboose;
|
||||||
|
|
||||||
public static bool IsCabooseAndStoppedForLoadRefresh(this Car car) => car.IsCaboose() && car.IsStopped(30f);
|
public static bool IsCabooseAndStoppedForLoadRefresh(this Car car, bool isFull) => car.IsCaboose() && car.IsStopped(30f) && !isFull;
|
||||||
|
|
||||||
public static Car? CabooseInConsist(this IEnumerable<Car> input) => input.FirstOrDefault(c => c.IsCaboose());
|
public static Car? CabooseInConsist(this IEnumerable<Car> input) => input.FirstOrDefault(c => c.IsCaboose());
|
||||||
|
|
||||||
|
public static bool ConsistNoFreight(this IEnumerable<Car> input) =>
|
||||||
|
input.Where(c => !c.IsLocomotive).Any() &&
|
||||||
|
input
|
||||||
|
.Where(c => !c.IsLocomotive)
|
||||||
|
.All(c => !c.Archetype.IsFreight());
|
||||||
|
|
||||||
public static Car? CabooseWithSufficientCrewHours(this Car car, float timeNeeded, HashSet<string> carIdsCheckedAlready, bool decrement = false)
|
public static Car? CabooseWithSufficientCrewHours(this Car car, float timeNeeded, HashSet<string> carIdsCheckedAlready, bool decrement = false)
|
||||||
{
|
{
|
||||||
Car? output = null;
|
Car? output = null;
|
||||||
|
|||||||
34
TweaksAndThings/Extensions/TextSprite_Extensions.cs
Normal file
34
TweaksAndThings/Extensions/TextSprite_Extensions.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
using RMROC451.TweaksAndThings.Patches;
|
||||||
|
using Serilog;
|
||||||
|
using UnityEngine;
|
||||||
|
using ILogger = Serilog.ILogger;
|
||||||
|
|
||||||
|
namespace RMROC451.TweaksAndThings.Extensions;
|
||||||
|
|
||||||
|
public static class TextSprite_Extensions
|
||||||
|
{
|
||||||
|
public static string TriColorPiePercent(this float quantity, float capacity)
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
if (capacity <= 0f)
|
||||||
|
{
|
||||||
|
num = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float num2 = Mathf.Clamp01(quantity / capacity);
|
||||||
|
int num3 = ((!(num2 < 0.01f)) ? ((!(num2 > 0.99f)) ? (Mathf.FloorToInt(num2 * 15f) + 1) : 16) : 0);
|
||||||
|
num = num3;
|
||||||
|
}
|
||||||
|
string color = "#219106"; //Green
|
||||||
|
if (num > 5 && num <= 10)
|
||||||
|
{
|
||||||
|
color = "#CE8326"; //orange
|
||||||
|
} else if (num <= 5)
|
||||||
|
{
|
||||||
|
color = "#D53427"; //Red
|
||||||
|
}
|
||||||
|
|
||||||
|
return $"<sprite tint=1 color={color} name=Pie{num:D2}>";
|
||||||
|
}
|
||||||
|
}
|
||||||
52
TweaksAndThings/Patches/BindingsWindow_Patches.cs
Normal file
52
TweaksAndThings/Patches/BindingsWindow_Patches.cs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
using HarmonyLib;
|
||||||
|
using Railloader;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using TMPro;
|
||||||
|
using UI.Builder;
|
||||||
|
using UI.PreferencesWindow;
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
|
|
||||||
|
namespace RMROC451.TweaksAndThings.Patches;
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(BindingsWindow))]
|
||||||
|
[HarmonyPatch(nameof(BindingsWindow.Build), typeof(UIPanelBuilder))]
|
||||||
|
[HarmonyPatchCategory("RMROC451TweaksAndThings")]
|
||||||
|
internal class BindingsWindow_Build_Patch
|
||||||
|
{
|
||||||
|
public static bool Prefix(BindingsWindow __instance, UIPanelBuilder builder)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
//TweaksAndThingsPlugin tweaksAndThings = SingletonPluginBase<TweaksAndThingsPlugin>.Shared;
|
||||||
|
//if (!tweaksAndThings.IsEnabled) return true;
|
||||||
|
|
||||||
|
//(string title, InputAction[] actions)[] rebindableActions = BindingsWindow.RebindableActions;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//HashSet<InputAction> conflicts = BindingsWindow.FindConflicts(rebindableActions.SelectMany(((string title, InputAction[] actions) t) => t.actions));
|
||||||
|
//__instance._conflicts = conflicts;
|
||||||
|
//__instance._builder = builder;
|
||||||
|
//builder.AddTabbedPanels(__instance._selectedTabState, delegate (UITabbedPanelBuilder uITabbedPanelBuilder)
|
||||||
|
//{
|
||||||
|
// (string, InputAction[])[] array = rebindableActions;
|
||||||
|
// for (int i = 0; i < array.Length; i++)
|
||||||
|
// {
|
||||||
|
// var (text, actions) = array[i];
|
||||||
|
// uITabbedPanelBuilder.AddTab(text, text, delegate (UIPanelBuilder uIPanelBuilder)
|
||||||
|
// {
|
||||||
|
// uIPanelBuilder.VScrollView(delegate (UIPanelBuilder uIPanelBuilder2)
|
||||||
|
// {
|
||||||
|
// InputAction[] array2 = actions;
|
||||||
|
// foreach (InputAction val in array2)
|
||||||
|
// {
|
||||||
|
// //uIPanelBuilder2.AddInputBindingControl(val, conflicts.Contains(val), DidRebind);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//});
|
||||||
|
//return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -173,20 +173,7 @@ internal class CarInspector_PopulateCarPanel_Patch
|
|||||||
|
|
||||||
case MrocHelperType.GladhandAndAnglecock:
|
case MrocHelperType.GladhandAndAnglecock:
|
||||||
consist.Do(c =>
|
consist.Do(c =>
|
||||||
ends.Do(end =>
|
CarEndAirUpdate(c)
|
||||||
{
|
|
||||||
EndGear endGear = c[end];
|
|
||||||
|
|
||||||
StateManager.ApplyLocal(
|
|
||||||
new PropertyChange(
|
|
||||||
c.id,
|
|
||||||
KeyValueKeyFor(EndGearStateKey.Anglecock, c.LogicalToEnd(end)),
|
|
||||||
new FloatPropertyValue(endGear.IsCoupled ? 1f : 0f)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (c.TryGetAdjacentCar(end, out Model.Car c2)) StateManager.ApplyLocal(new SetGladhandsConnected(c.id, c2.id, true));
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -201,7 +188,25 @@ internal class CarInspector_PopulateCarPanel_Patch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CalculateCostIfEnabled(Car car, MrocHelperType mrocHelperType, bool buttonsHaveCost, IEnumerable<Car> consist)
|
internal static void CarEndAirUpdate(Car c)
|
||||||
|
{
|
||||||
|
ends.Do(end =>
|
||||||
|
{
|
||||||
|
EndGear endGear = c[end];
|
||||||
|
|
||||||
|
StateManager.ApplyLocal(
|
||||||
|
new PropertyChange(
|
||||||
|
c.id,
|
||||||
|
KeyValueKeyFor(EndGearStateKey.Anglecock, c.LogicalToEnd(end)),
|
||||||
|
new FloatPropertyValue(endGear.IsCoupled ? 1f : 0f)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (c.TryGetAdjacentCar(end, out Model.Car c2)) StateManager.ApplyLocal(new SetGladhandsConnected(c.id, c2.id, true));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void CalculateCostIfEnabled(Car car, MrocHelperType mrocHelperType, bool buttonsHaveCost, IEnumerable<Car> consist)
|
||||||
{
|
{
|
||||||
if (buttonsHaveCost)
|
if (buttonsHaveCost)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,16 +1,34 @@
|
|||||||
using HarmonyLib;
|
using Core;
|
||||||
|
using HarmonyLib;
|
||||||
|
using Model;
|
||||||
|
using Network;
|
||||||
using Railloader;
|
using Railloader;
|
||||||
|
using RMROC451.TweaksAndThings.Enums;
|
||||||
|
using RMROC451.TweaksAndThings.Extensions;
|
||||||
using RollingStock;
|
using RollingStock;
|
||||||
|
using Serilog;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.Remoting.Messaging;
|
||||||
|
using UI;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
namespace RMROC451.TweaksAndThings.Patches;
|
namespace RMROC451.TweaksAndThings.Patches;
|
||||||
|
|
||||||
|
enum MrocAction
|
||||||
|
{
|
||||||
|
Follow,
|
||||||
|
Inspect,
|
||||||
|
ConnectConsistAir,
|
||||||
|
ToggleConsistBrakes
|
||||||
|
}
|
||||||
|
|
||||||
[HarmonyPatch(typeof(CarPickable))]
|
[HarmonyPatch(typeof(CarPickable))]
|
||||||
[HarmonyPatch(nameof(CarPickable.Activate), typeof(PickableActivateEvent))]
|
[HarmonyPatch(nameof(CarPickable.Activate), typeof(PickableActivateEvent))]
|
||||||
[HarmonyPatchCategory("RMROC451TweaksAndThings")]
|
[HarmonyPatchCategory("RMROC451TweaksAndThings")]
|
||||||
internal class CarPickable_Activate_Patch
|
internal class CarPickable_Activate_Patch
|
||||||
{
|
{
|
||||||
|
private static Serilog.ILogger _log => Log.ForContext<CarPickable_Activate_Patch>();
|
||||||
|
|
||||||
static float clicked = 0;
|
static float clicked = 0;
|
||||||
static float clicktime = 0;
|
static float clicktime = 0;
|
||||||
@@ -20,20 +38,111 @@ internal class CarPickable_Activate_Patch
|
|||||||
{
|
{
|
||||||
TweaksAndThingsPlugin tweaksAndThings = SingletonPluginBase<TweaksAndThingsPlugin>.Shared;
|
TweaksAndThingsPlugin tweaksAndThings = SingletonPluginBase<TweaksAndThingsPlugin>.Shared;
|
||||||
if (!tweaksAndThings.IsEnabled) return true;
|
if (!tweaksAndThings.IsEnabled) return true;
|
||||||
|
bool bCtrlAltHeld = GameInput.IsControlDown && GameInput.IsAltDown;
|
||||||
|
|
||||||
if (OnPointerDown(evt))
|
_log.ForContext("car", __instance.car).Information($"{GameInput.IsShiftDown} {GameInput.IsControlDown} {GameInput.IsAltDown} {bCtrlAltHeld} ");
|
||||||
|
|
||||||
|
//On Double click of a car: follow
|
||||||
|
if (OnPointerDown(evt, PickableActivation.Primary))
|
||||||
{
|
{
|
||||||
CameraSelector.shared.FollowCar(__instance.car);
|
CameraSelector.shared.FollowCar(__instance.car);
|
||||||
|
_log.ForContext("car", __instance.car).Information("just click!");
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
//single click with keys pressed:
|
||||||
|
else if (evt.Activation == PickableActivation.Primary)
|
||||||
|
{
|
||||||
|
bool output = true;
|
||||||
|
var consist = __instance.car.EnumerateCoupled();
|
||||||
|
bool handbrakesApplied = consist.Any(c => c.HandbrakeApplied());
|
||||||
|
bool airSystemIssues = consist.Any(c => c.EndAirSystemIssue());
|
||||||
|
bool needsOiling = GameInput.IsShiftDown && consist.All(c => c.IsStopped()) && consist.Any(c => c.NeedsOiling || c.HasHotbox) && (consist.CabooseInConsist() || !tweaksAndThings.RequireConsistCabooseForOilerAndHotboxSpotter());
|
||||||
|
var chargeIt = handbrakesApplied || airSystemIssues || needsOiling;
|
||||||
|
//CTRL + ALT + SHIFT : BrakesAngleCocksAndOiling
|
||||||
|
//CTRL + ALT : Release Consist Brakes and Check AngleCocks
|
||||||
|
//CTRL + SHIFT : Toggle Consist Brakes
|
||||||
|
//CTRL : Toggle Car Brakes & Airup Car
|
||||||
|
//ALT + SHIFT : Check Consist AngleCocks
|
||||||
|
//ALT : Open Inspector to Car
|
||||||
|
if (bCtrlAltHeld)
|
||||||
|
{
|
||||||
|
BrakesAngleCocksAndOiling(__instance, tweaksAndThings, GameInput.IsShiftDown, consist, handbrakesApplied, airSystemIssues, needsOiling, chargeIt);
|
||||||
|
_log.ForContext("car", __instance.car).Information($"ctrlAlt{(GameInput.IsShiftDown ? "shift" : string.Empty)}Held!");
|
||||||
|
output = false;
|
||||||
|
}
|
||||||
|
else if (GameInput.IsControlDown && GameInput.IsShiftDown)
|
||||||
|
{
|
||||||
|
CarInspector_PopulateCarPanel_Patch.MrocConsistHelper(__instance.car, MrocHelperType.Handbrake, tweaksAndThings.EndGearHelpersRequirePayment());
|
||||||
|
_log.ForContext("car", __instance.car).Information("ctrlShiftHeld!");
|
||||||
|
output = false;
|
||||||
|
}
|
||||||
|
else if (GameInput.IsAltDown && GameInput.IsShiftDown)
|
||||||
|
{
|
||||||
|
if (airSystemIssues)
|
||||||
|
CarInspector_PopulateCarPanel_Patch.MrocConsistHelper(__instance.car, MrocHelperType.GladhandAndAnglecock, tweaksAndThings.EndGearHelpersRequirePayment());
|
||||||
|
_log.ForContext("car", __instance.car).Information("altShiftHeld!");
|
||||||
|
output = false;
|
||||||
|
}
|
||||||
|
else if (GameInput.IsAltDown)
|
||||||
|
{
|
||||||
|
UI.CarInspector.CarInspector.Show(__instance.car);
|
||||||
|
_log.ForContext("car", __instance.car).Information("altHeld!");
|
||||||
|
output = false;
|
||||||
|
}
|
||||||
|
else if (GameInput.IsControlDown)
|
||||||
|
{
|
||||||
|
__instance.car.SetHandbrake(!__instance.car.HandbrakeApplied());
|
||||||
|
CarInspector_PopulateCarPanel_Patch.CarEndAirUpdate(__instance.car);
|
||||||
|
_log.ForContext("car", __instance.car).Information("ctrlHeld!");
|
||||||
|
output = false;
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
|
||||||
|
|
||||||
|
//else if (ctrlHeld && shiftHeld)
|
||||||
|
//{
|
||||||
|
// var selected = UI.CarInspector.CarInspector._instance._selectedTabState.Value;
|
||||||
|
// UI.CarInspector.CarInspector.Show(__instance.car);
|
||||||
|
// UI.CarInspector.CarInspector._instance._selectedTabState.Value = selected;
|
||||||
|
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool OnPointerDown(PickableActivateEvent evt)
|
private static void BrakesAngleCocksAndOiling(CarPickable __instance, TweaksAndThingsPlugin tweaksAndThings, bool shiftHeld, System.Collections.Generic.IEnumerable<Car> consist, bool handbrakesApplied, bool airSystemIssues, bool needsOiling, bool chargeIt)
|
||||||
|
{
|
||||||
|
int hbFix = 0;
|
||||||
|
if (handbrakesApplied)
|
||||||
|
CarInspector_PopulateCarPanel_Patch.MrocConsistHelper(__instance.car, MrocHelperType.Handbrake, false);
|
||||||
|
if (airSystemIssues)
|
||||||
|
CarInspector_PopulateCarPanel_Patch.MrocConsistHelper(__instance.car, MrocHelperType.GladhandAndAnglecock, false);
|
||||||
|
if (needsOiling)
|
||||||
|
{
|
||||||
|
foreach (var car in consist.Where(c => c.NeedsOiling || c.HasHotbox))
|
||||||
|
{
|
||||||
|
float num2 = 1f - car.Oiled;
|
||||||
|
car.OffsetOiled(num2);
|
||||||
|
hbFix += car.HasHotbox ? 1 : 0;
|
||||||
|
if (car.HasHotbox) car.AdjustHotboxValue(0f);
|
||||||
|
}
|
||||||
|
if (hbFix > 0)
|
||||||
|
Multiplayer.Broadcast($"Near {Hyperlink.To(__instance.car)}: \"{hbFix.Pluralize("hotbox") + " repaired!"}\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chargeIt)
|
||||||
|
CarInspector_PopulateCarPanel_Patch.CalculateCostIfEnabled(__instance.car, MrocHelperType.Handbrake, tweaksAndThings.EndGearHelpersRequirePayment(), consist);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool OnPointerDown(
|
||||||
|
PickableActivateEvent evt,
|
||||||
|
PickableActivation btn = PickableActivation.Primary
|
||||||
|
)
|
||||||
{
|
{
|
||||||
bool output = false;
|
bool output = false;
|
||||||
if (evt.Activation == PickableActivation.Primary)
|
if (evt.Activation == btn)
|
||||||
{
|
{
|
||||||
clicked++;
|
clicked++;
|
||||||
if (clicked == 1) clicktime = Time.time;
|
if (clicked == 1) clicktime = Time.time;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ using UI;
|
|||||||
using UI.EngineRoster;
|
using UI.EngineRoster;
|
||||||
using UI.Tooltips;
|
using UI.Tooltips;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Game.State;
|
||||||
|
|
||||||
|
|
||||||
namespace RMROC451.TweaksAndThings.Patches;
|
namespace RMROC451.TweaksAndThings.Patches;
|
||||||
@@ -28,6 +29,9 @@ internal class EngineRosterRow_Refresh_Patch
|
|||||||
TweaksAndThingsPlugin? tweaksAndThings = SingletonPluginBase<TweaksAndThingsPlugin>.Shared;
|
TweaksAndThingsPlugin? tweaksAndThings = SingletonPluginBase<TweaksAndThingsPlugin>.Shared;
|
||||||
RosterFuelColumnSettings? rosterFuelColumnSettings = tweaksAndThings?.settings?.EngineRosterFuelColumnSettings;
|
RosterFuelColumnSettings? rosterFuelColumnSettings = tweaksAndThings?.settings?.EngineRosterFuelColumnSettings;
|
||||||
|
|
||||||
|
string fuelInfoText = string.Empty;
|
||||||
|
string fuelInfoTooltip = string.Empty;
|
||||||
|
|
||||||
if (tweaksAndThings == null ||
|
if (tweaksAndThings == null ||
|
||||||
rosterFuelColumnSettings == null ||
|
rosterFuelColumnSettings == null ||
|
||||||
!tweaksAndThings.IsEnabled ||
|
!tweaksAndThings.IsEnabled ||
|
||||||
@@ -38,8 +42,9 @@ internal class EngineRosterRow_Refresh_Patch
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string fuelInfoText = string.Empty;
|
IEnumerable<Car> consist = __instance._engine.EnumerateCoupled().Where(c => c.EnableOiling);
|
||||||
string fuelInfoTooltip = string.Empty;
|
bool cabooseRequirementFulfilled = consist.CabooseInConsist() || !tweaksAndThings.RequireConsistCabooseForOilerAndHotboxSpotter() || consist.ConsistNoFreight();
|
||||||
|
float offendingPercentage = 0;
|
||||||
Car engineOrTender = __instance._engine;
|
Car engineOrTender = __instance._engine;
|
||||||
List<LoadSlot> loadSlots = __instance._engine.Definition.LoadSlots;
|
List<LoadSlot> loadSlots = __instance._engine.Definition.LoadSlots;
|
||||||
if (!loadSlots.Any())
|
if (!loadSlots.Any())
|
||||||
@@ -57,12 +62,42 @@ internal class EngineRosterRow_Refresh_Patch
|
|||||||
{
|
{
|
||||||
CarLoadInfo valueOrDefault = loadInfo.GetValueOrDefault();
|
CarLoadInfo valueOrDefault = loadInfo.GetValueOrDefault();
|
||||||
var fuelLevel = FuelLevel(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity);
|
var fuelLevel = FuelLevel(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity);
|
||||||
|
offendingPercentage = CalcPercentLoad(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity);
|
||||||
fuelInfoText += loadSlots[i].RequiredLoadIdentifier == offender ? fuelLevel + " " : string.Empty;
|
fuelInfoText += loadSlots[i].RequiredLoadIdentifier == offender ? fuelLevel + " " : string.Empty;
|
||||||
//fuelInfoText += TextSprites.PiePercent(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity) + " ";
|
//fuelInfoText += TextSprites.PiePercent(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity) + " ";
|
||||||
fuelInfoTooltip += $"{TextSprites.PiePercent(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity)} {valueOrDefault.LoadString(CarPrototypeLibrary.instance.LoadForId(valueOrDefault.LoadId))}\n";
|
fuelInfoTooltip += $"{TextSprites.PiePercent(valueOrDefault.Quantity, loadSlots[i].MaximumCapacity)} {valueOrDefault.LoadString(CarPrototypeLibrary.instance.LoadForId(valueOrDefault.LoadId))}\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (cabooseRequirementFulfilled && StateManager.Shared.Storage.OilFeature)
|
||||||
|
{
|
||||||
|
float lowestOilLevel = consist.OrderBy(c => c.Oiled).FirstOrDefault().Oiled;
|
||||||
|
var oilLevel = FuelLevel(lowestOilLevel, 1);
|
||||||
|
fuelInfoTooltip += $"{lowestOilLevel.TriColorPiePercent(1)} {oilLevel} Consist Oil Lowest Level\n";
|
||||||
|
if (CalcPercentLoad(lowestOilLevel, 1) < offendingPercentage)
|
||||||
|
{
|
||||||
|
fuelInfoText = $"{oilLevel} ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (consist.Any(c => c.HasHotbox))
|
||||||
|
{
|
||||||
|
fuelInfoText = $"{TextSprites.Hotbox} ";
|
||||||
|
fuelInfoTooltip = $"{TextSprites.Hotbox} Hotbox detected!\n{fuelInfoTooltip}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!cabooseRequirementFulfilled && StateManager.Shared.Storage.OilFeature)
|
||||||
|
{
|
||||||
|
fuelInfoTooltip += $"Add Caboose To Consist For Consist Oil Level Reporting\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error(ex, "Error Detecting oiling consist status for engine roster");
|
||||||
|
}
|
||||||
|
|
||||||
switch (rosterFuelColumnSettings.EngineRosterFuelStatusColumn)
|
switch (rosterFuelColumnSettings.EngineRosterFuelStatusColumn)
|
||||||
{
|
{
|
||||||
case EngineRosterFuelDisplayColumn.Engine:
|
case EngineRosterFuelDisplayColumn.Engine:
|
||||||
@@ -77,7 +112,6 @@ internal class EngineRosterRow_Refresh_Patch
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception ex)
|
} catch (Exception ex)
|
||||||
{
|
{
|
||||||
rosterFuelColumnSettings.EngineRosterFuelStatusColumn = EngineRosterFuelDisplayColumn.None;
|
rosterFuelColumnSettings.EngineRosterFuelStatusColumn = EngineRosterFuelDisplayColumn.None;
|
||||||
@@ -91,10 +125,15 @@ internal class EngineRosterRow_Refresh_Patch
|
|||||||
tooltip.TooltipInfo = new TooltipInfo(tooltip.tooltipTitle, fuelInfoTooltip);
|
tooltip.TooltipInfo = new TooltipInfo(tooltip.tooltipTitle, fuelInfoTooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string FuelLevel(float quantity, float capacity)
|
public static float CalcPercentLoad(float quantity, float capacity)
|
||||||
{
|
{
|
||||||
float num = capacity <= 0f ? 0 : Mathf.Clamp(quantity / capacity * 100, 0, 100);
|
float num = capacity <= 0f ? 0 : Mathf.Clamp(quantity / capacity * 100, 0, 100);
|
||||||
|
|
||||||
return $"{Mathf.FloorToInt(num):D2}%";
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string FuelLevel(float quantity, float capacity)
|
||||||
|
{
|
||||||
|
return $"{Mathf.FloorToInt(CalcPercentLoad(quantity, capacity)):D2}%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,12 +85,13 @@ internal class OpsController_AnnounceCoalescedPayments_Patch
|
|||||||
float rate2 = 24 * 2 * 8;// carLoadRate = 8 crew hours in 30 min loading; (24h * 2 to get half hour chunks * 8 hours to load in those chunks)
|
float rate2 = 24 * 2 * 8;// carLoadRate = 8 crew hours in 30 min loading; (24h * 2 to get half hour chunks * 8 hours to load in those chunks)
|
||||||
float num2 = 99999999; //QuantityInStorage for crew-hours (infinite where crew can be shuffling about)
|
float num2 = 99999999; //QuantityInStorage for crew-hours (infinite where crew can be shuffling about)
|
||||||
float quantityToLoad = Mathf.Min(num2, IndustryComponent.RateToValue(rate2, deltaTime));
|
float quantityToLoad = Mathf.Min(num2, IndustryComponent.RateToValue(rate2, deltaTime));
|
||||||
|
OpsCarAdapter? oca = car.IsCaboose() ? new OpsCarAdapter(car, OpsController.Shared) : null;
|
||||||
|
bool isFull = !car.IsCaboose() ? true : (oca?.IsFull(CrewHoursLoad()) ?? true);
|
||||||
if (car.IsCaboose() && !CrewCarStatus(car).spotted)
|
if (car.IsCaboose() && !CrewCarStatus(car).spotted)
|
||||||
{
|
{
|
||||||
CrewCarDict[car.id] = (true, CrewCarDict[car.id].filling);
|
CrewCarDict[car.id] = (true, !isFull);
|
||||||
}
|
}
|
||||||
if (car.IsCabooseAndStoppedForLoadRefresh())
|
if (car.IsCabooseAndStoppedForLoadRefresh(isFull))
|
||||||
{
|
{
|
||||||
if (!CrewCarDict[car.id].filling) Multiplayer.Broadcast($"{Hyperlink.To(car)}: \"Topping off caboose crew.\"");
|
if (!CrewCarDict[car.id].filling) Multiplayer.Broadcast($"{Hyperlink.To(car)}: \"Topping off caboose crew.\"");
|
||||||
CrewCarDict[car.id] = (CrewCarDict[car.id].spotted, true);
|
CrewCarDict[car.id] = (CrewCarDict[car.id].spotted, true);
|
||||||
@@ -100,7 +101,7 @@ internal class OpsController_AnnounceCoalescedPayments_Patch
|
|||||||
Multiplayer.Broadcast($"{Hyperlink.To(car)}: \"Caboose crew topped off.\"");
|
Multiplayer.Broadcast($"{Hyperlink.To(car)}: \"Caboose crew topped off.\"");
|
||||||
CrewCarDict[car.id] = (CrewCarDict[car.id].spotted, false);
|
CrewCarDict[car.id] = (CrewCarDict[car.id].spotted, false);
|
||||||
}
|
}
|
||||||
new OpsCarAdapter(car, OpsController.Shared).Load(CrewHoursLoad(), quantityToLoad);
|
(oca ?? new OpsCarAdapter(car, OpsController.Shared)).Load(CrewHoursLoad(), quantityToLoad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
using HarmonyLib;
|
using Game.State;
|
||||||
|
using HarmonyLib;
|
||||||
using Model;
|
using Model;
|
||||||
using Model.Ops;
|
using Model.Ops;
|
||||||
using Railloader;
|
using Railloader;
|
||||||
using RMROC451.TweaksAndThings.Extensions;
|
using RMROC451.TweaksAndThings.Extensions;
|
||||||
|
using Serilog;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using UI.Tags;
|
using UI.Tags;
|
||||||
@@ -26,18 +28,23 @@ internal class TagController_UpdateTag_Patch
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProceedWithPostFix(car, tagCallout);
|
ProceedWithPostFix(car, tagCallout, tweaksAndThings.RequireConsistCabooseForOilerAndHotboxSpotter());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ProceedWithPostFix(Car car, TagCallout tagCallout)
|
private static void ProceedWithPostFix(Car car, TagCallout tagCallout, bool cabooseRequired)
|
||||||
{
|
{
|
||||||
tagCallout.callout.Title = string.Format(tagTitleFormat, "{0}", car.DisplayName);
|
tagCallout.callout.Title = string.Format(tagTitleFormat, "{0}", car.DisplayName);
|
||||||
List<string> tags = new();
|
List<string> tags = new();
|
||||||
|
|
||||||
if (OpsController_AnnounceCoalescedPayments_Patch.CrewCarStatus(car).spotted) tags.Add("+");
|
if (OpsController_AnnounceCoalescedPayments_Patch.CrewCarStatus(car).spotted) tags.Add("+");
|
||||||
if (car.HasHotbox) tags.Add(TextSprites.Hotbox);
|
//if (car.EnableOiling) tags.Add(car.HasHotbox ? TextSprites.Hotbox : $"<cspace=-1em>{TextSprites.Warning}{car.Oiled.TriColorPiePercent(1)}</cspace>");
|
||||||
|
if (car.EnableOiling) tags.Add(car.HasHotbox ? TextSprites.Hotbox : car.Oiled.TriColorPiePercent(1));
|
||||||
|
IEnumerable<Car> consist = car.EnumerateCoupled().Where(c => c.EnableOiling);
|
||||||
|
bool cabooseRequirementFulfilled = consist.CabooseInConsist() || !cabooseRequired || consist.ConsistNoFreight();
|
||||||
|
if (cabooseRequirementFulfilled && car.IsLocomotive && !car.NeedsOiling && StateManager.Shared.Storage.OilFeature && consist.Any(c => c.NeedsOiling))
|
||||||
|
tags.Add(consist.OrderBy(c => c.Oiled).FirstOrDefault().Oiled.TriColorPiePercent(1));
|
||||||
if (car.EndAirSystemIssue()) tags.Add(TextSprites.CycleWaybills);
|
if (car.EndAirSystemIssue()) tags.Add(TextSprites.CycleWaybills);
|
||||||
if (car.HandbrakeApplied()) tags.Add(TextSprites.HandbrakeWheel);
|
if (car.HandbrakeApplied()) tags.Add(TextSprites.HandbrakeWheel);
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
<!-- <MajorVersion>1</MajorVersion> -->
|
<!-- <MajorVersion>1</MajorVersion> -->
|
||||||
<!-- <MinorVersion>0</MinorVersion> -->
|
<!-- <MinorVersion>0</MinorVersion> -->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Patches\BindingsWindow_Patches.cs" />
|
||||||
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="mroc-cabeese.json" />
|
<None Remove="mroc-cabeese.json" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -22,8 +25,12 @@
|
|||||||
<GameAssembly Include="Ops" />
|
<GameAssembly Include="Ops" />
|
||||||
<GameAssembly Include="StrangeCustoms" />
|
<GameAssembly Include="StrangeCustoms" />
|
||||||
|
|
||||||
|
<GameAssembly Include="Unity.InputSystem" />
|
||||||
<GameAssembly Include="UnityEngine.CoreModule" />
|
<GameAssembly Include="UnityEngine.CoreModule" />
|
||||||
<GameAssembly Include="UnityEngine.UI" />
|
<GameAssembly Include="UnityEngine.UI" />
|
||||||
|
<GameAssembly Include="UnityEngine.UIModule" />
|
||||||
|
<GameAssembly Include="UnityEngine.InputLegacyModule" />
|
||||||
|
<GameAssembly Include="UnityEngine.InputModule" />
|
||||||
<GameAssembly Include="Unity.TextMeshPro" />
|
<GameAssembly Include="Unity.TextMeshPro" />
|
||||||
|
|
||||||
<GameAssembly Include="System.Net.Http" />
|
<GameAssembly Include="System.Net.Http" />
|
||||||
|
|||||||
Reference in New Issue
Block a user