diff --git a/Projects/TerraTech/TerraTech/Class1.cs b/Projects/TerraTech/TerraTech/Class1.cs index 02dc3ea..6049ca1 100644 --- a/Projects/TerraTech/TerraTech/Class1.cs +++ b/Projects/TerraTech/TerraTech/Class1.cs @@ -41,7 +41,7 @@ namespace TerraTech { TankBeamManager.Setup(Config); ModuleWeaponManager.Setup(Config); ModuleHeartManager.Setup(Config); - TechBoosterManager.Setup(Config); + ModuleFuelTankManager.Setup(Config); xpMultiplier = Config.Bind("General", "XP Multiplier", 1f, diff --git a/Projects/TerraTech/TerraTech/ModuleFuelTankManager.cs b/Projects/TerraTech/TerraTech/ModuleFuelTankManager.cs new file mode 100644 index 0000000..db31e85 --- /dev/null +++ b/Projects/TerraTech/TerraTech/ModuleFuelTankManager.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using BepInEx.Configuration; +using HarmonyLib; + +namespace TerraTech { + [HarmonyPatch] + public class ModuleFuelTankManager { + private static readonly MultipliedObjectManager manager = + new MultipliedObjectManager(ConfigureFuelTank); + + 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("FuelTank", "Player Only", false, new ConfigDescription("Player Only")); + playerOnly.SettingChanged += (sender, args) => DoPatch(); + + fuelCapacityMultiplier = config.Bind( + "FuelTank", "Fuel Capacity Multiplier", 1f, + new ConfigDescription("Fuel Capacity Multiplier", new AcceptableValueRange(min, max))); + fuelCapacityMultiplier.SettingChanged += (sender, args) => DoPatch(); + + fuelRefillMultiplier = + config.Bind("FuelTank", "Fuel Refill Multiplier", 1f, + new ConfigDescription("Fuel Refill Multiplier", new AcceptableValueRange(min, max))); + fuelRefillMultiplier.SettingChanged += (sender, args) => DoPatch(); + } + + private static void ConfigureFuelTank(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_Capacity", fuelCapacityMultiplier, ShouldApply)); + obj.AddField(new FieldConfiguration("m_RefillRate", fuelRefillMultiplier, ShouldApply)); + } + + private static readonly Func ShouldApply = obj => { + if (!playerOnly.Value) + return true; + return CykUtil.IsObjectPlayerTank(obj); + }; + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleFuelTank), "OnAttached")] + static void PostfixCreate(ModuleFuelTank __instance) { + manager.OnObjectAttached(__instance); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleFuelTank), "OnDetaching")] + static void PostfixDestroy(ModuleFuelTank __instance) { + manager.OnObjectDetached(__instance); + } + + public static void DoPatch() { + manager.ApplyAll(); + } + } +} diff --git a/Projects/TerraTech/TerraTech/TechBoosterManager.cs b/Projects/TerraTech/TerraTech/TechBoosterManager.cs deleted file mode 100644 index 3fb4f78..0000000 --- a/Projects/TerraTech/TerraTech/TechBoosterManager.cs +++ /dev/null @@ -1,85 +0,0 @@ -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 d6a6840..0f23881 100644 --- a/Projects/TerraTech/TerraTech/TerraTech.csproj +++ b/Projects/TerraTech/TerraTech/TerraTech.csproj @@ -57,7 +57,7 @@ - + diff --git a/Projects/TerraTech/format.sh b/Projects/TerraTech/format.sh index 406fa8a..e62a815 100644 --- a/Projects/TerraTech/format.sh +++ b/Projects/TerraTech/format.sh @@ -1 +1 @@ -clang-format -i TerraTech/*.cs +wgo -dir TerraTech echo "Formatters" :: clang-format -i TerraTech/*.cs