Add ModuleItemHolderManager for configurable item holder settings

This commit is contained in:
2025-02-24 09:53:24 +01:00
parent 551acd2690
commit 95fdbc7cda
3 changed files with 146 additions and 0 deletions

View File

@@ -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,

View File

@@ -0,0 +1,144 @@
using System;
using BepInEx.Configuration;
using HarmonyLib;
namespace TerraTech {
[HarmonyPatch]
public class ModuleItemHolderManager {
private static readonly MultipliedObjectManager<ModuleItemHolder> beamManager =
new MultipliedObjectManager<ModuleItemHolder>(ConfigureBeam);
private static readonly MultipliedObjectManager<ModuleItemHolderBeam> beamHolderManager =
new MultipliedObjectManager<ModuleItemHolderBeam>(ConfigureBeamHolder);
private static readonly MultipliedObjectManager<ModuleItemPickup> beamPickupManager =
new MultipliedObjectManager<ModuleItemPickup>(ConfigureBeamPickup);
private static readonly MultipliedObjectManager<ModuleItemHolderMagnet> magnetHolderManager =
new MultipliedObjectManager<ModuleItemHolderMagnet>(ConfigureMagnetHolder);
private static readonly MultipliedObjectManager<ModuleItemPickup> magnetPickupManager =
new MultipliedObjectManager<ModuleItemPickup>(ConfigureMagnetPickup);
public static ConfigEntry<float> capacityPerStackMultiplier;
public static ConfigEntry<float> beamStrengthMultiplier;
public static ConfigEntry<float> beamHeightIncrementScaleMultiplier;
public static ConfigEntry<float> beamPickupRangeMultiplier;
public static ConfigEntry<float> magnetStrengthMultiplier;
public static ConfigEntry<float> 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<float>(min, max)));
capacityPerStackMultiplier.SettingChanged += (sender, args) => DoPatch();
beamStrengthMultiplier = config.Bind(
"Item Holder", "Beam Strength Multiplier", 1f,
new ConfigDescription("Beam Strength Multiplier", new AcceptableValueRange<float>(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<float>(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<float>(min, max)));
beamPickupRangeMultiplier.SettingChanged += (sender, args) => DoPatch();
magnetStrengthMultiplier = config.Bind(
"Item Holder", "Magnet Strength Multiplier", 1f,
new ConfigDescription("Magnet Strength Multiplier", new AcceptableValueRange<float>(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<float>(min, max)));
magnetPickupRangeMultiplier.SettingChanged += (sender, args) => DoPatch();
}
private static void ConfigureBeam(MultipliedObject<ModuleItemHolder> obj) {
obj.AddField(new FieldConfiguration<int>("m_CapacityPerStack", capacityPerStackMultiplier));
}
private static void ConfigureBeamHolder(MultipliedObject<ModuleItemHolderBeam> obj) {
obj.AddField(new FieldConfiguration<float>("m_BeamStrength", beamStrengthMultiplier));
obj.AddField(new FieldConfiguration<float>("m_HeightIncrementScale", beamHeightIncrementScaleMultiplier));
}
private static void ConfigureBeamPickup(MultipliedObject<ModuleItemPickup> obj) {
obj.AddField(new FieldConfiguration<float>("m_PickupRange", beamPickupRangeMultiplier));
}
private static void ConfigureMagnetHolder(MultipliedObject<ModuleItemHolderMagnet> obj) {
obj.AddField(new FieldConfiguration<float>("m_Strength", magnetStrengthMultiplier));
}
private static void ConfigureMagnetPickup(MultipliedObject<ModuleItemPickup> obj) {
obj.AddField(new FieldConfiguration<float>("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<ModuleItemPickup>();
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<ModuleItemPickup>();
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<ModuleItemPickup>();
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<ModuleItemPickup>();
magnetHolderManager.OnObjectDetached(__instance);
magnetPickupManager.OnObjectDetached(pickup);
}
public static void DoPatch() {
beamManager.ApplyAll();
beamHolderManager.ApplyAll();
beamPickupManager.ApplyAll();
magnetHolderManager.ApplyAll();
magnetPickupManager.ApplyAll();
}
}
}

View File

@@ -49,6 +49,7 @@
<Compile Include="ModuleEnergyManager.cs" />
<Compile Include="ModuleEnergyStoreManager.cs" />
<Compile Include="ModuleGyroManager.cs" />
<Compile Include="ModuleItemHolderManager.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="0Harmony">