diff --git a/Projects/TerraTech/TerraTech/Class1.cs b/Projects/TerraTech/TerraTech/Class1.cs index 8f163f3..ffdf58f 100644 --- a/Projects/TerraTech/TerraTech/Class1.cs +++ b/Projects/TerraTech/TerraTech/Class1.cs @@ -34,6 +34,7 @@ namespace TerraTech { ModuleEnergyManager.Setup(Config); ModuleEnergyStoreManager.Setup(Config); ModuleGyroManager.Setup(Config); + ModuleItemHolderManager.Setup(Config); xpMultiplier = Config.Bind("General", "XP Multiplier", 1f, diff --git a/Projects/TerraTech/TerraTech/ModuleItemHolderManager.cs b/Projects/TerraTech/TerraTech/ModuleItemHolderManager.cs new file mode 100644 index 0000000..589f4a6 --- /dev/null +++ b/Projects/TerraTech/TerraTech/ModuleItemHolderManager.cs @@ -0,0 +1,144 @@ +using System; +using BepInEx.Configuration; +using HarmonyLib; + +namespace TerraTech { + [HarmonyPatch] + public class ModuleItemHolderManager { + private static readonly MultipliedObjectManager beamManager = + new MultipliedObjectManager(ConfigureBeam); + private static readonly MultipliedObjectManager beamHolderManager = + new MultipliedObjectManager(ConfigureBeamHolder); + private static readonly MultipliedObjectManager beamPickupManager = + new MultipliedObjectManager(ConfigureBeamPickup); + + private static readonly MultipliedObjectManager magnetHolderManager = + new MultipliedObjectManager(ConfigureMagnetHolder); + private static readonly MultipliedObjectManager magnetPickupManager = + new MultipliedObjectManager(ConfigureMagnetPickup); + + public static ConfigEntry capacityPerStackMultiplier; + public static ConfigEntry beamStrengthMultiplier; + public static ConfigEntry beamHeightIncrementScaleMultiplier; + public static ConfigEntry beamPickupRangeMultiplier; + public static ConfigEntry magnetStrengthMultiplier; + public static ConfigEntry magnetPickupRangeMultiplier; + + public static void Setup(ConfigFile config) { + float min = 0.01f; + float max = 32f; + + capacityPerStackMultiplier = config.Bind( + "Item Holder", "Capacity Per Stack Multiplier", 1f, + new ConfigDescription("Capacity Per Stack Multiplier", new AcceptableValueRange(min, max))); + capacityPerStackMultiplier.SettingChanged += (sender, args) => DoPatch(); + + beamStrengthMultiplier = config.Bind( + "Item Holder", "Beam Strength Multiplier", 1f, + new ConfigDescription("Beam Strength Multiplier", new AcceptableValueRange(min, max))); + beamStrengthMultiplier.SettingChanged += (sender, args) => DoPatch(); + + beamHeightIncrementScaleMultiplier = + config.Bind("Item Holder", "Beam Height Increment Scale Multiplier", 1f, + new ConfigDescription("Beam Height Increment Scale Multiplier", + new AcceptableValueRange(min, max))); + beamHeightIncrementScaleMultiplier.SettingChanged += (sender, args) => DoPatch(); + + beamPickupRangeMultiplier = config.Bind( + "Item Holder", "Beam Pickup Range Multiplier", 1f, + new ConfigDescription("Beam Pickup Range Multiplier", new AcceptableValueRange(min, max))); + beamPickupRangeMultiplier.SettingChanged += (sender, args) => DoPatch(); + + magnetStrengthMultiplier = config.Bind( + "Item Holder", "Magnet Strength Multiplier", 1f, + new ConfigDescription("Magnet Strength Multiplier", new AcceptableValueRange(min, max))); + magnetStrengthMultiplier.SettingChanged += (sender, args) => DoPatch(); + + magnetPickupRangeMultiplier = config.Bind( + "Item Holder", "Magnet Pickup Range Multiplier", 1f, + new ConfigDescription("Magnet Pickup Range Multiplier", new AcceptableValueRange(min, max))); + magnetPickupRangeMultiplier.SettingChanged += (sender, args) => DoPatch(); + } + + private static void ConfigureBeam(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_CapacityPerStack", capacityPerStackMultiplier)); + } + + private static void ConfigureBeamHolder(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_BeamStrength", beamStrengthMultiplier)); + obj.AddField(new FieldConfiguration("m_HeightIncrementScale", beamHeightIncrementScaleMultiplier)); + } + + private static void ConfigureBeamPickup(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_PickupRange", beamPickupRangeMultiplier)); + } + + private static void ConfigureMagnetHolder(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_Strength", magnetStrengthMultiplier)); + } + + private static void ConfigureMagnetPickup(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_PickupRange", magnetPickupRangeMultiplier)); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleItemHolder), "OnAttached")] + static void PostfixCreate(ModuleItemHolder __instance) { + beamManager.OnObjectAttached(__instance); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleItemHolder), "OnDetaching")] + static void PostfixDestroy(ModuleItemHolder __instance) { + beamManager.OnObjectDetached(__instance); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleItemHolderBeam), "OnAttached")] + static void PostfixCreate(ModuleItemHolderBeam __instance) { + var trav = Traverse.Create(__instance); + var pickup = trav.Field("m_Pickup").GetValue(); + + beamHolderManager.OnObjectAttached(__instance); + beamPickupManager.OnObjectAttached(pickup); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleItemHolderBeam), "OnDetaching")] + static void PostfixDestroy(ModuleItemHolderBeam __instance) { + var trav = Traverse.Create(__instance); + var pickup = trav.Field("m_Pickup").GetValue(); + + beamHolderManager.OnObjectDetached(__instance); + beamPickupManager.OnObjectDetached(pickup); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleItemHolderMagnet), "OnAttached")] + static void PostfixCreate(ModuleItemHolderMagnet __instance) { + var trav = Traverse.Create(__instance); + var pickup = trav.Field("m_Pickup").GetValue(); + + magnetHolderManager.OnObjectAttached(__instance); + magnetPickupManager.OnObjectAttached(pickup); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ModuleItemHolderMagnet), "OnDetaching")] + static void PostfixDestroy(ModuleItemHolderMagnet __instance) { + var trav = Traverse.Create(__instance); + var pickup = trav.Field("m_Pickup").GetValue(); + + magnetHolderManager.OnObjectDetached(__instance); + magnetPickupManager.OnObjectDetached(pickup); + } + + public static void DoPatch() { + beamManager.ApplyAll(); + beamHolderManager.ApplyAll(); + beamPickupManager.ApplyAll(); + magnetHolderManager.ApplyAll(); + magnetPickupManager.ApplyAll(); + } + } +} diff --git a/Projects/TerraTech/TerraTech/TerraTech.csproj b/Projects/TerraTech/TerraTech/TerraTech.csproj index 0cacbf3..74f65a2 100644 --- a/Projects/TerraTech/TerraTech/TerraTech.csproj +++ b/Projects/TerraTech/TerraTech/TerraTech.csproj @@ -49,6 +49,7 @@ +