using System; using BepInEx.Configuration; using HarmonyLib; namespace BanquetForCyka { [HarmonyPatch] public class ModuleItemProducerManager { private static readonly MultipliedObjectManager Manager = new MultipliedObjectManager(ConfigureModuleItemProducer); private static ConfigEntry playerOnly; private static ConfigEntry resourceGroundRadiusMultiplier; private static ConfigEntry minDispenseIntervalMultiplier; private static ConfigEntry secPerItemProducedMultiplier; public static void Setup(ConfigFile config) { float min = 0.01f; float max = 32f; playerOnly = config.Bind("Item Producer", "Player Only", false, new ConfigDescription("Player Only")); playerOnly.SettingChanged += (sender, args) => DoPatch(); resourceGroundRadiusMultiplier = config.Bind( "Item Producer", "Resource Ground Radius Multiplier", 1f, new ConfigDescription("Resource Ground Radius Multiplier", new AcceptableValueRange(min, max))); resourceGroundRadiusMultiplier.SettingChanged += (sender, args) => DoPatch(); minDispenseIntervalMultiplier = config.Bind( "Item Producer", "Min Dispense Interval Multiplier", 1f, new ConfigDescription("Min Dispense Interval Multiplier", new AcceptableValueRange(min, max))); minDispenseIntervalMultiplier.SettingChanged += (sender, args) => DoPatch(); secPerItemProducedMultiplier = config.Bind( "Item Producer", "Sec Per Item Produced Multiplier", 1f, new ConfigDescription("Sec Per Item Produced Multiplier", new AcceptableValueRange(min, max))); secPerItemProducedMultiplier.SettingChanged += (sender, args) => DoPatch(); } private static void ConfigureModuleItemProducer(MultipliedObject obj) { obj.AddField(new FieldConfiguration("m_ResourceGroundRadius", resourceGroundRadiusMultiplier, ShouldApply)); obj.AddField(new FieldConfiguration("m_MinDispenseInterval", minDispenseIntervalMultiplier, ShouldApply)); obj.AddField(new FieldConfiguration("m_SecPerItemProduced", secPerItemProducedMultiplier, ShouldApply)); } private static readonly Func ShouldApply = obj => { if (!playerOnly.Value) return true; return CykUtil.IsPlayerTank(obj as Module); }; [HarmonyPrefix] [HarmonyPatch(typeof(ModuleItemProducer), "GetClosestResourceReservoirInRange")] public static void PostfixCreate(ModuleItemProducer __instance) { Manager.OnObjectAttached(__instance); } [HarmonyPrefix] [HarmonyPatch(typeof(ModuleItemProducer), "OnDetaching")] public static void PostfixDestroy(ModuleItemProducer __instance) { Manager.OnObjectDetached(__instance); } private static void DoPatch() { Manager.ApplyAll(); } public static readonly Func Register = obj => { if (Main.debug.Value) Console.WriteLine("Registering ModuleItemProducer: {0}", obj); PostfixCreate(obj as ModuleItemProducer); return true; }; } }