From 4f51f8599e22a917c3f35a2fc8bbd89f480eed96 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Mon, 24 Feb 2025 17:15:38 +0100 Subject: [PATCH] Add TechBoosterManager with configurable fuel multipliers --- Projects/TerraTech/TerraTech/Class1.cs | 1 + .../TerraTech/TerraTech/ModuleHeartManager.cs | 4 +- .../TerraTech/TerraTech/TechBoosterManager.cs | 85 +++++++++++++++++++ Projects/TerraTech/TerraTech/TerraTech.csproj | 1 + 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 Projects/TerraTech/TerraTech/TechBoosterManager.cs diff --git a/Projects/TerraTech/TerraTech/Class1.cs b/Projects/TerraTech/TerraTech/Class1.cs index 1a66b9c..02dc3ea 100644 --- a/Projects/TerraTech/TerraTech/Class1.cs +++ b/Projects/TerraTech/TerraTech/Class1.cs @@ -41,6 +41,7 @@ namespace TerraTech { TankBeamManager.Setup(Config); ModuleWeaponManager.Setup(Config); ModuleHeartManager.Setup(Config); + TechBoosterManager.Setup(Config); xpMultiplier = Config.Bind("General", "XP Multiplier", 1f, diff --git a/Projects/TerraTech/TerraTech/ModuleHeartManager.cs b/Projects/TerraTech/TerraTech/ModuleHeartManager.cs index a6b6beb..c4d632b 100644 --- a/Projects/TerraTech/TerraTech/ModuleHeartManager.cs +++ b/Projects/TerraTech/TerraTech/ModuleHeartManager.cs @@ -38,8 +38,8 @@ namespace TerraTech { } private static void ConfigureHeart(MultipliedObject obj) { - obj.AddField( - new FieldConfiguration("m_EventHorizonRadius", eventHorizonRadiusMultiplier, ShouldApply)); + obj.AddField(new FieldConfiguration("m_EventHorizonRadius", eventHorizonRadiusMultiplier, + ShouldApply)); obj.AddField(new FieldConfiguration("m_SetupTime", setupTimeMultiplier, ShouldApply)); obj.AddField(new FieldConfiguration("m_StartShrinkingRadius", startShrinkingRadiusMultiplier, ShouldApply)); diff --git a/Projects/TerraTech/TerraTech/TechBoosterManager.cs b/Projects/TerraTech/TerraTech/TechBoosterManager.cs new file mode 100644 index 0000000..3fb4f78 --- /dev/null +++ b/Projects/TerraTech/TerraTech/TechBoosterManager.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using BepInEx.Configuration; +using HarmonyLib; + +namespace TerraTech { + [HarmonyPatch] + public class TechBoosterManager { + private struct TechBoosterData { + public float m_FuelCapacity; + public float m_FuelRefill; + } + private static Dictionary techBoosterData = + new Dictionary(); + + public static ConfigEntry playerOnly; + public static ConfigEntry fuelCapacityMultiplier; + public static ConfigEntry fuelRefillMultiplier; + + public static void Setup(ConfigFile config) { + float min = 0.01f; + float max = 32f; + + playerOnly = config.Bind("TechBooster", "Player Only", false, new ConfigDescription("Player Only")); + + fuelCapacityMultiplier = config.Bind( + "TechBooster", "Fuel Capacity Multiplier", 1f, + new ConfigDescription("Fuel Capacity Multiplier", new AcceptableValueRange(min, max))); + + fuelRefillMultiplier = + config.Bind("TechBooster", "Fuel Refill Multiplier", 1f, + new ConfigDescription("Fuel Refill Multiplier", new AcceptableValueRange(min, max))); + } + + private static readonly Func ShouldApply = obj => { + if (!playerOnly.Value) + return true; + return CykUtil.IsObjectPlayerTank(obj); + }; + + [HarmonyPrefix] + [HarmonyPatch(typeof(TechBooster), "AddFuelTank")] + static void PostfixCreate(TechBooster __instance, ref ModuleFuelTank tank) { + var trav = Traverse.Create(__instance); + var fuelCapacityField = trav.Field("m_FuelCapacity"); + var fuelRefillField = trav.Field("m_FuelRefill"); + + TechBoosterData boosterData; + bool ok = techBoosterData.TryGetValue(__instance, out boosterData); + if (ok) { + boosterData.m_FuelCapacity = fuelCapacityField.GetValue() + tank.Capacity; + boosterData.m_FuelRefill = fuelRefillField.GetValue() + tank.RefillRate; + } else { + boosterData = new TechBoosterData { m_FuelCapacity = fuelCapacityField.GetValue(), + m_FuelRefill = fuelRefillField.GetValue() }; + techBoosterData[__instance] = boosterData; + } + + fuelCapacityField.SetValue(fuelCapacityField.GetValue() * fuelCapacityMultiplier.Value); + fuelRefillField.SetValue(fuelRefillField.GetValue() * fuelRefillMultiplier.Value); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(TechBooster), "RemoveFuelTank")] + static void PostfixDestroy(TechBooster __instance, ref ModuleFuelTank tank) { + var trav = Traverse.Create(__instance); + var fuelCapacityField = trav.Field("m_FuelCapacity"); + var fuelRefillField = trav.Field("m_FuelRefill"); + + TechBoosterData boosterData; + bool ok = techBoosterData.TryGetValue(__instance, out boosterData); + if (ok) { + boosterData.m_FuelCapacity -= tank.Capacity; + boosterData.m_FuelRefill -= tank.RefillRate; + } else { + boosterData = new TechBoosterData { m_FuelCapacity = fuelCapacityField.GetValue(), + m_FuelRefill = fuelRefillField.GetValue() }; + techBoosterData[__instance] = boosterData; + } + + fuelCapacityField.SetValue(fuelCapacityField.GetValue() * fuelCapacityMultiplier.Value); + fuelRefillField.SetValue(fuelRefillField.GetValue() * fuelRefillMultiplier.Value); + } + } +} diff --git a/Projects/TerraTech/TerraTech/TerraTech.csproj b/Projects/TerraTech/TerraTech/TerraTech.csproj index 91f32be..d6a6840 100644 --- a/Projects/TerraTech/TerraTech/TerraTech.csproj +++ b/Projects/TerraTech/TerraTech/TerraTech.csproj @@ -57,6 +57,7 @@ +