using System; using BepInEx.Configuration; using HarmonyLib; namespace BanquetForCyka { [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); private static ConfigEntry playerOnly; private static ConfigEntry capacityPerStackMultiplier; private static ConfigEntry beamStrengthMultiplier; private static ConfigEntry beamHeightIncrementScaleMultiplier; private static ConfigEntry beamPickupRangeMultiplier; private static ConfigEntry magnetStrengthMultiplier; private static ConfigEntry magnetPickupRangeMultiplier; public static void Setup(ConfigFile config) { float min = 0.01f; float max = 32f; playerOnly = config.Bind("Item Holder", "Player Only", false, new ConfigDescription("Player Only")); playerOnly.SettingChanged += (sender, args) => DoPatch(); 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, ShouldApply)); } private static void ConfigureBeamHolder(MultipliedObject obj) { obj.AddField(new FieldConfiguration("m_BeamStrength", beamStrengthMultiplier, ShouldApply)); obj.AddField(new FieldConfiguration("m_HeightIncrementScale", beamHeightIncrementScaleMultiplier, ShouldApply)); } private static void ConfigureBeamPickup(MultipliedObject obj) { obj.AddField(new FieldConfiguration("m_PickupRange", beamPickupRangeMultiplier, ShouldApply)); } private static void ConfigureMagnetHolder(MultipliedObject obj) { obj.AddField(new FieldConfiguration("m_Strength", magnetStrengthMultiplier, ShouldApply)); } private static void ConfigureMagnetPickup(MultipliedObject obj) { obj.AddField( new FieldConfiguration("m_PickupRange", magnetPickupRangeMultiplier, ShouldApply)); } private static readonly Func ShouldApply = obj => { if (!playerOnly.Value) return true; return CykUtil.IsPlayerTank(obj as Module); }; [HarmonyPrefix] [HarmonyPatch(typeof(ModuleItemHolder), "OnAttached")] public static void PostfixCreate(ModuleItemHolder __instance) { BeamManager.OnObjectAttached(__instance); } [HarmonyPrefix] [HarmonyPatch(typeof(ModuleItemHolder), "OnDetaching")] public static void PostfixDestroy(ModuleItemHolder __instance) { BeamManager.OnObjectDetached(__instance); } [HarmonyPrefix] [HarmonyPatch(typeof(ModuleItemHolderBeam), "OnAttached")] public 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")] public 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")] public 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")] public static void PostfixDestroy(ModuleItemHolderMagnet __instance) { var trav = Traverse.Create(__instance); var pickup = trav.Field("m_Pickup").GetValue(); MagnetHolderManager.OnObjectDetached(__instance); MagnetPickupManager.OnObjectDetached(pickup); } private static void DoPatch() { BeamManager.ApplyAll(); BeamHolderManager.ApplyAll(); BeamPickupManager.ApplyAll(); MagnetHolderManager.ApplyAll(); MagnetPickupManager.ApplyAll(); } public static readonly Func Register = obj => { if (Main.debug.Value) Console.WriteLine("Registering ModuleItemHolder: {0}", obj); PostfixCreate(obj as ModuleItemHolder); return true; }; } }