From 5723e9592e6fc09099b8e95c8a19d8f1293a29d3 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Mon, 24 Feb 2025 16:36:02 +0100 Subject: [PATCH] Add ModuleHeartManager with configurable multipliers --- Projects/TerraTech/TerraTech/Class1.cs | 1 + .../TerraTech/TerraTech/ModuleHeartManager.cs | 70 +++++++++++++++++++ Projects/TerraTech/TerraTech/TerraTech.csproj | 1 + 3 files changed, 72 insertions(+) create mode 100644 Projects/TerraTech/TerraTech/ModuleHeartManager.cs diff --git a/Projects/TerraTech/TerraTech/Class1.cs b/Projects/TerraTech/TerraTech/Class1.cs index 76856bc..1a66b9c 100644 --- a/Projects/TerraTech/TerraTech/Class1.cs +++ b/Projects/TerraTech/TerraTech/Class1.cs @@ -40,6 +40,7 @@ namespace TerraTech { ModuleWheelsManager.Setup(Config); TankBeamManager.Setup(Config); ModuleWeaponManager.Setup(Config); + ModuleHeartManager.Setup(Config); xpMultiplier = Config.Bind("General", "XP Multiplier", 1f, diff --git a/Projects/TerraTech/TerraTech/ModuleHeartManager.cs b/Projects/TerraTech/TerraTech/ModuleHeartManager.cs new file mode 100644 index 0000000..a6b6beb --- /dev/null +++ b/Projects/TerraTech/TerraTech/ModuleHeartManager.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using BepInEx.Configuration; +using HarmonyLib; + +namespace TerraTech { + [HarmonyPatch] + public class ModuleHeartManager { + private static readonly MultipliedObjectManager manager = + new MultipliedObjectManager(ConfigureHeart); + + public static ConfigEntry playerOnly; + public static ConfigEntry eventHorizonRadiusMultiplier; + public static ConfigEntry setupTimeMultiplier; + public static ConfigEntry startShrinkingRadiusMultiplier; + + public static void Setup(ConfigFile config) { + float min = 0.01f; + float max = 32f; + + playerOnly = config.Bind("Heart", "Player Only", false, new ConfigDescription("Player Only")); + playerOnly.SettingChanged += (sender, args) => DoPatch(); + + eventHorizonRadiusMultiplier = config.Bind( + "Heart", "Event Horizon Radius Multiplier", 1f, + new ConfigDescription("Event Horizon Radius Multiplier", new AcceptableValueRange(min, max))); + eventHorizonRadiusMultiplier.SettingChanged += (sender, args) => DoPatch(); + + setupTimeMultiplier = + config.Bind("Heart", "Setup Time Multiplier", 1f, + new ConfigDescription("Setup Time Multiplier", new AcceptableValueRange(min, max))); + setupTimeMultiplier.SettingChanged += (sender, args) => DoPatch(); + + startShrinkingRadiusMultiplier = config.Bind( + "Heart", "Start Shrinking Radius Multiplier", 1f, + new ConfigDescription("Start Shrinking Radius Multiplier", new AcceptableValueRange(min, max))); + startShrinkingRadiusMultiplier.SettingChanged += (sender, args) => DoPatch(); + } + + private static void ConfigureHeart(MultipliedObject obj) { + obj.AddField( + new FieldConfiguration("m_EventHorizonRadius", eventHorizonRadiusMultiplier, ShouldApply)); + obj.AddField(new FieldConfiguration("m_SetupTime", setupTimeMultiplier, ShouldApply)); + obj.AddField(new FieldConfiguration("m_StartShrinkingRadius", startShrinkingRadiusMultiplier, + ShouldApply)); + } + + private static readonly Func ShouldApply = obj => { + if (!playerOnly.Value) + return true; + return CykUtil.IsObjectPlayerTank(obj); + }; + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleHeart), "OnAttached")] + static void PostfixCreate(ModuleHeart __instance) { + manager.OnObjectAttached(__instance); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleHeart), "OnDetaching")] + static void PostfixDestroy(ModuleHeart __instance) { + manager.OnObjectDetached(__instance); + } + + public static void DoPatch() { + manager.ApplyAll(); + } + } +} diff --git a/Projects/TerraTech/TerraTech/TerraTech.csproj b/Projects/TerraTech/TerraTech/TerraTech.csproj index ba5a471..91f32be 100644 --- a/Projects/TerraTech/TerraTech/TerraTech.csproj +++ b/Projects/TerraTech/TerraTech/TerraTech.csproj @@ -56,6 +56,7 @@ +