Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of LimitedInteractables v1.3.1
LimitedInteractables.dll
Decompiled 4 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using BubbetsItems; using EntityStates; using EntityStates.DroneAssemblyStation; using EntityStates.DroneCombiner; using EntityStates.DroneScrapper; using EntityStates.Duplicator; using EntityStates.MealPrep; using EntityStates.Scrapper; using HarmonyLib; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.DroneAssemblyStation; using On.EntityStates.DroneCombiner; using On.EntityStates.DroneScrapper; using On.EntityStates.Duplicator; using On.EntityStates.MealPrep; using On.EntityStates.Scrapper; using On.RoR2; using R2API; using RoR2; using ShrineOfRepair.Behaviours; using ShrineOfRepair.Modules; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LimitedInteractables")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+5c5354fbd558b225db284cbad0fe0113c85a74fe")] [assembly: AssemblyProduct("LimitedInteractables")] [assembly: AssemblyTitle("LimitedInteractables")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LimitedInteractables { public class CleansingPool { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_0; public static Action <>9__0_1; public static hook_Start <>9__0_2; public static hook_OnInteractionBegin <>9__0_3; public static hook_DropPickup <>9__0_4; internal void <Patch>b__0_0(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscShrineCleanse", "RoR2/Base/ShrineCleanse/iscShrineCleanse.asset", Main.CleansingPoolFrequency.Value, Main.CleansingPoolCost.Value); } internal void <Patch>b__0_1() { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) if (!Main.CleansingPoolTakesEquipments.Value) { ShrineCleanseBehavior.cleansableEquipments = Array.Empty<EquipmentIndex>(); LunarItemOrEquipmentCostTypeHelper.lunarEquipmentIndices = Array.Empty<EquipmentIndex>(); } else { if (!Main.CleansingPoolVoidLunar.Value || !Chainloader.PluginInfos.ContainsKey("bubbet.bubbetsitems")) { return; } List<ItemIndex> list = new List<ItemIndex>(ShrineCleanseBehavior.cleansableItems); ItemIndex val = (ItemIndex)0; for (ItemIndex val2 = (ItemIndex)ItemCatalog.itemCount; val < val2; val = (ItemIndex)(val + 1)) { ItemDef itemDef = ItemCatalog.GetItemDef(val); if (isVoidLunar(itemDef.tier)) { list.Add(val); } } ShrineCleanseBehavior.cleansableItems = list.ToArray(); List<ItemIndex> list2 = new List<ItemIndex>(); list2.AddRange(ItemCatalog.lunarItemList); ItemIndex val3 = (ItemIndex)0; for (ItemIndex val4 = (ItemIndex)ItemCatalog.itemCount; val3 < val4; val3 = (ItemIndex)(val3 + 1)) { ItemDef itemDef2 = ItemCatalog.GetItemDef(val3); if (isVoidLunar(itemDef2.tier)) { list2.Add(itemDef2.itemIndex); } } LunarItemOrEquipmentCostTypeHelper.lunarItemIndices = list2.ToArray(); } } internal void <Patch>b__0_2(orig_Start orig, ShopTerminalBehavior self) { if (((Object)((Component)self).gameObject).name.Contains("ShrineCleanse")) { Main.InitUses(((Component)self).gameObject, Main.CleansingPoolUses.Value); } orig.Invoke(self); } internal void <Patch>b__0_3(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (((Object)((Component)self).gameObject).name.Contains("ShrineCleanse") && Main.uses.ContainsKey(((Component)self).gameObject)) { Main.uses[((Component)self).gameObject]--; if (Main.uses[((Component)self).gameObject] <= 0) { ((Behaviour)((Component)self).GetComponent<PurchaseInteraction>()).enabled = false; } } orig.Invoke(self, activator); } internal void <Patch>b__0_4(orig_DropPickup orig, ShopTerminalBehavior self) { if (((Object)((Component)self).gameObject).name.Contains("ShrineCleanse") && Run.instance.runRNG.RangeFloat(0f, 1f) > Main.CleansingPoolChance.Value) { self.SetHasBeenPurchased(true); } else { orig.Invoke(self); } } } public static void Patch() { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscShrineCleanse", "RoR2/Base/ShrineCleanse/iscShrineCleanse.asset", Main.CleansingPoolFrequency.Value, Main.CleansingPoolCost.Value); }; RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) if (!Main.CleansingPoolTakesEquipments.Value) { ShrineCleanseBehavior.cleansableEquipments = Array.Empty<EquipmentIndex>(); LunarItemOrEquipmentCostTypeHelper.lunarEquipmentIndices = Array.Empty<EquipmentIndex>(); } else if (Main.CleansingPoolVoidLunar.Value && Chainloader.PluginInfos.ContainsKey("bubbet.bubbetsitems")) { List<ItemIndex> list = new List<ItemIndex>(ShrineCleanseBehavior.cleansableItems); ItemIndex val4 = (ItemIndex)0; for (ItemIndex val5 = (ItemIndex)ItemCatalog.itemCount; val4 < val5; val4 = (ItemIndex)(val4 + 1)) { ItemDef itemDef = ItemCatalog.GetItemDef(val4); if (isVoidLunar(itemDef.tier)) { list.Add(val4); } } ShrineCleanseBehavior.cleansableItems = list.ToArray(); List<ItemIndex> list2 = new List<ItemIndex>(); list2.AddRange(ItemCatalog.lunarItemList); ItemIndex val6 = (ItemIndex)0; for (ItemIndex val7 = (ItemIndex)ItemCatalog.itemCount; val6 < val7; val6 = (ItemIndex)(val6 + 1)) { ItemDef itemDef2 = ItemCatalog.GetItemDef(val6); if (isVoidLunar(itemDef2.tier)) { list2.Add(itemDef2.itemIndex); } } LunarItemOrEquipmentCostTypeHelper.lunarItemIndices = list2.ToArray(); } }); object obj = <>c.<>9__0_2; if (obj == null) { hook_Start val = delegate(orig_Start orig, ShopTerminalBehavior self) { if (((Object)((Component)self).gameObject).name.Contains("ShrineCleanse")) { Main.InitUses(((Component)self).gameObject, Main.CleansingPoolUses.Value); } orig.Invoke(self); }; <>c.<>9__0_2 = val; obj = (object)val; } ShopTerminalBehavior.Start += (hook_Start)obj; object obj2 = <>c.<>9__0_3; if (obj2 == null) { hook_OnInteractionBegin val2 = delegate(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (((Object)((Component)self).gameObject).name.Contains("ShrineCleanse") && Main.uses.ContainsKey(((Component)self).gameObject)) { Main.uses[((Component)self).gameObject]--; if (Main.uses[((Component)self).gameObject] <= 0) { ((Behaviour)((Component)self).GetComponent<PurchaseInteraction>()).enabled = false; } } orig.Invoke(self, activator); }; <>c.<>9__0_3 = val2; obj2 = (object)val2; } PurchaseInteraction.OnInteractionBegin += (hook_OnInteractionBegin)obj2; object obj3 = <>c.<>9__0_4; if (obj3 == null) { hook_DropPickup val3 = delegate(orig_DropPickup orig, ShopTerminalBehavior self) { if (((Object)((Component)self).gameObject).name.Contains("ShrineCleanse") && Run.instance.runRNG.RangeFloat(0f, 1f) > Main.CleansingPoolChance.Value) { self.SetHasBeenPurchased(true); } else { orig.Invoke(self); } }; <>c.<>9__0_4 = val3; obj3 = (object)val3; } ShopTerminalBehavior.DropPickup += (hook_DropPickup)obj3; } public static bool isVoidLunar(ItemTier tier) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) return tier == BubbetsItemsPlugin.VoidLunarTier.tier; } } public class DroneAssembly { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Converter<string, string> <>9__0_3; public static hook_Awake <>9__0_0; public static hook_OnInteractionBegin <>9__0_1; public static hook_TransferItem <>9__0_2; internal string <Patch>b__0_3(string x) { return x.Trim(); } internal void <Patch>b__0_0(orig_Awake orig, PurchaseInteraction self) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (NetworkServer.active && ((Object)self).name.Contains("DroneAssemblyStation")) { Main.InitUses(((Component)self).gameObject, Main.DroneAssemblyMaxUses.Value); GameObject gameObject = ((Component)((Component)self).GetComponent<ModelLocator>().modelTransform).gameObject; gameObject.transform.localPosition = gameObject.transform.localPosition + Vector3.up * 0.5f; gameObject.transform.eulerAngles = gameObject.transform.eulerAngles + new Vector3(0f, 0f, 90f); } } internal void <Patch>b__0_1(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (self.CanBeAffordedByInteractor(activator) && ((Object)self).name.Contains("DroneAssemblyStation")) { Main.uses[((Component)self).gameObject]--; } orig.Invoke(self, activator); } internal void <Patch>b__0_2(orig_TransferItem orig, AssemblingDroneState self) { orig.Invoke(self); if (Main.uses.ContainsKey(((EntityState)self).gameObject) && Main.uses[((EntityState)self).gameObject] == 0) { ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().SetAvailable(false); } } } public static void Patch() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Expected O, but got Unknown //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Invalid comparison between Unknown and I8 //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Expected O, but got Unknown //IL_010c: Unknown result type (might be due to invalid IL or missing references) InteractableSpawnCard val = Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"RoR2/DLC3/DroneAssemblyStation/iscDroneAssemblyStation.asset").WaitForCompletion(); ((SpawnCard)val).directorCreditCost = (int)Main.DroneAssemblyCost.Value; val.maxSpawnsPerStage = Main.DroneAssemblyMaxSpawns.Value; DirectorCard card = new DirectorCard { spawnCard = (SpawnCard)(object)val, selectionWeight = (int)Main.DroneAssemblyFrequency.Value }; DirectorCardHolder val2 = new DirectorCardHolder { Card = card, InteractableCategory = (InteractableCategory)8 }; foreach (string item in Main.DroneAssemblyStages.Value.Split(',').ToList().ConvertAll((string x) => x.Trim())) { bool flag = false; foreach (object value in Enum.GetValues(typeof(Stage))) { Stage val3 = (Stage)value; if ((long)val3 == 1 || !(item == DirectorAPI.ToInternalStageName(val3))) { continue; } Helpers.AddNewInteractableToStage(val2, val3, ""); flag = true; break; } if (!flag) { Helpers.AddNewInteractableToStage(val2, (Stage)1, item); } } object obj = <>c.<>9__0_0; if (obj == null) { hook_Awake val4 = delegate(orig_Awake orig, PurchaseInteraction self) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (NetworkServer.active && ((Object)self).name.Contains("DroneAssemblyStation")) { Main.InitUses(((Component)self).gameObject, Main.DroneAssemblyMaxUses.Value); GameObject gameObject = ((Component)((Component)self).GetComponent<ModelLocator>().modelTransform).gameObject; gameObject.transform.localPosition = gameObject.transform.localPosition + Vector3.up * 0.5f; gameObject.transform.eulerAngles = gameObject.transform.eulerAngles + new Vector3(0f, 0f, 90f); } }; <>c.<>9__0_0 = val4; obj = (object)val4; } PurchaseInteraction.Awake += (hook_Awake)obj; object obj2 = <>c.<>9__0_1; if (obj2 == null) { hook_OnInteractionBegin val5 = delegate(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (self.CanBeAffordedByInteractor(activator) && ((Object)self).name.Contains("DroneAssemblyStation")) { Main.uses[((Component)self).gameObject]--; } orig.Invoke(self, activator); }; <>c.<>9__0_1 = val5; obj2 = (object)val5; } PurchaseInteraction.OnInteractionBegin += (hook_OnInteractionBegin)obj2; object obj3 = <>c.<>9__0_2; if (obj3 == null) { hook_TransferItem val6 = delegate(orig_TransferItem orig, AssemblingDroneState self) { orig.Invoke(self); if (Main.uses.ContainsKey(((EntityState)self).gameObject) && Main.uses[((EntityState)self).gameObject] == 0) { ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().SetAvailable(false); } }; <>c.<>9__0_2 = val6; obj3 = (object)val6; } AssemblingDroneState.TransferItem += (hook_TransferItem)obj3; } } public class DroneCombiner { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_0; public static hook_Awake <>9__0_1; public static hook_OnInteractionBegin <>9__0_2; public static hook_OnEnter <>9__0_3; internal void <Patch>b__0_0(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDroneCombinerStation", "RoR2/DLC3/DroneCombinerStation/iscDroneCombinerStation.asset", Main.DroneCombinerFrequency.Value, Main.DroneCombinerCost.Value, Main.DroneAssemblyMaxSpawns.Value); } internal void <Patch>b__0_1(orig_Awake orig, PurchaseInteraction self) { orig.Invoke(self); if (NetworkServer.active && ((Object)self).name.Contains("DroneCombinerStation")) { Main.InitUses(((Component)self).gameObject, Main.DroneCombinerMaxUses.Value); } } internal void <Patch>b__0_2(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (self.CanBeAffordedByInteractor(activator) && ((Object)self).name.Contains("DroneCombinerStation")) { Main.uses[((Component)self).gameObject]--; } orig.Invoke(self, activator); } internal void <Patch>b__0_3(orig_OnEnter orig, DroneCombinerCombining self) { orig.Invoke(self); if (Main.uses.ContainsKey(((EntityState)self).gameObject) && Main.uses[((EntityState)self).gameObject] == 0) { ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().SetAvailable(false); } } } public static void Patch() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDroneCombinerStation", "RoR2/DLC3/DroneCombinerStation/iscDroneCombinerStation.asset", Main.DroneCombinerFrequency.Value, Main.DroneCombinerCost.Value, Main.DroneAssemblyMaxSpawns.Value); }; object obj = <>c.<>9__0_1; if (obj == null) { hook_Awake val = delegate(orig_Awake orig, PurchaseInteraction self) { orig.Invoke(self); if (NetworkServer.active && ((Object)self).name.Contains("DroneCombinerStation")) { Main.InitUses(((Component)self).gameObject, Main.DroneCombinerMaxUses.Value); } }; <>c.<>9__0_1 = val; obj = (object)val; } PurchaseInteraction.Awake += (hook_Awake)obj; object obj2 = <>c.<>9__0_2; if (obj2 == null) { hook_OnInteractionBegin val2 = delegate(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (self.CanBeAffordedByInteractor(activator) && ((Object)self).name.Contains("DroneCombinerStation")) { Main.uses[((Component)self).gameObject]--; } orig.Invoke(self, activator); }; <>c.<>9__0_2 = val2; obj2 = (object)val2; } PurchaseInteraction.OnInteractionBegin += (hook_OnInteractionBegin)obj2; object obj3 = <>c.<>9__0_3; if (obj3 == null) { hook_OnEnter val3 = delegate(orig_OnEnter orig, DroneCombinerCombining self) { orig.Invoke(self); if (Main.uses.ContainsKey(((EntityState)self).gameObject) && Main.uses[((EntityState)self).gameObject] == 0) { ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().SetAvailable(false); } }; <>c.<>9__0_3 = val3; obj3 = (object)val3; } DroneCombinerCombining.OnEnter += (hook_OnEnter)obj3; } } public class DroneScrapper { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_0; public static hook_OnEnter <>9__0_1; public static hook_OnEnter <>9__0_2; internal void <Patch>b__0_0(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDroneScrapper", "RoR2/DLC3/DroneScrapper/iscDroneScrapper.asset", Main.DroneScrapperFrequency.Value, Main.DroneScrapperCost.Value); } internal void <Patch>b__0_1(orig_OnEnter orig, DroneScrapperBaseState self) { GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if (!Main.uses.ContainsKey(gameObject)) { Main.uses.Add(gameObject, Main.DroneScrapperMaxUses.Value); } orig.Invoke(self); if (Main.uses[gameObject] <= 0) { ((Component)((EntityState)self).outer).GetComponent<DroneScrapperPickerController>().SetAvailable(false); } } internal void <Patch>b__0_2(orig_OnEnter orig, DroneScrapping self) { GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if ((Object)(object)gameObject != (Object)null && Main.uses.ContainsKey(gameObject)) { Main.uses[gameObject]--; } orig.Invoke(self); } } public static void Patch() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDroneScrapper", "RoR2/DLC3/DroneScrapper/iscDroneScrapper.asset", Main.DroneScrapperFrequency.Value, Main.DroneScrapperCost.Value); }; object obj = <>c.<>9__0_1; if (obj == null) { hook_OnEnter val = delegate(orig_OnEnter orig, DroneScrapperBaseState self) { GameObject gameObject2 = ((Component)((EntityState)self).outer).gameObject; if (!Main.uses.ContainsKey(gameObject2)) { Main.uses.Add(gameObject2, Main.DroneScrapperMaxUses.Value); } orig.Invoke(self); if (Main.uses[gameObject2] <= 0) { ((Component)((EntityState)self).outer).GetComponent<DroneScrapperPickerController>().SetAvailable(false); } }; <>c.<>9__0_1 = val; obj = (object)val; } DroneScrapperBaseState.OnEnter += (hook_OnEnter)obj; object obj2 = <>c.<>9__0_2; if (obj2 == null) { hook_OnEnter val2 = delegate(orig_OnEnter orig, DroneScrapping self) { GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if ((Object)(object)gameObject != (Object)null && Main.uses.ContainsKey(gameObject)) { Main.uses[gameObject]--; } orig.Invoke(self); }; <>c.<>9__0_2 = val2; obj2 = (object)val2; } DroneScrapping.OnEnter += (hook_OnEnter)obj2; } } public class Duplicator { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_0; public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_1; public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_2; public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_3; public static hook_Awake <>9__0_4; public static hook_OnInteractionBegin <>9__0_5; public static hook_DropDroplet <>9__0_6; internal void <Patch>b__0_0(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicator", "RoR2/Base/Duplicator/iscDuplicator.asset", Main.DuplicatorFrequencyWhite.Value, Main.DuplicatorCostWhite.Value); } internal void <Patch>b__0_1(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicatorLarge", "RoR2/Base/DuplicatorLarge/iscDuplicatorLarge.asset", Main.DuplicatorFrequencyGreen.Value, Main.DuplicatorCostGreen.Value); } internal void <Patch>b__0_2(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicatorMilitary", "RoR2/Base/DuplicatorMilitary/iscDuplicatorMilitary.asset", Main.DuplicatorFrequencyRed.Value, Main.DuplicatorCostRed.Value); } internal void <Patch>b__0_3(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicatorWild", "RoR2/Base/DuplicatorWild/iscDuplicatorWild.asset", Main.DuplicatorFrequencyYellow.Value, Main.DuplicatorCostYellow.Value); } internal void <Patch>b__0_4(orig_Awake orig, PurchaseInteraction self) { orig.Invoke(self); if (NetworkServer.active) { if (((Object)self).name.Contains("DuplicatorWild")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesYellow.Value); } else if (((Object)self).name.Contains("DuplicatorMilitary")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesRed.Value); } else if (((Object)self).name.Contains("DuplicatorLarge")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesGreen.Value); } else if (((Object)self).name.Contains("Duplicator")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesWhite.Value); } } } internal void <Patch>b__0_5(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (self.CanBeAffordedByInteractor(activator) && ((Object)self).name.Contains("Duplicator")) { Main.uses[((Component)self).gameObject]--; } orig.Invoke(self, activator); } internal void <Patch>b__0_6(orig_DropDroplet orig, Duplicating self) { orig.Invoke(self); if (Main.uses.ContainsKey(((EntityState)self).gameObject) && Main.uses[((EntityState)self).gameObject] == 0) { ((Component)((EntityState)self).outer).GetComponent<ShopTerminalBehavior>().SetHasBeenPurchased(true); ((Component)((EntityState)self).outer).GetComponent<ShopTerminalBehavior>().SetNoPickup(); ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().Networkavailable = false; } } } public static void Patch() { //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicator", "RoR2/Base/Duplicator/iscDuplicator.asset", Main.DuplicatorFrequencyWhite.Value, Main.DuplicatorCostWhite.Value); }; Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicatorLarge", "RoR2/Base/DuplicatorLarge/iscDuplicatorLarge.asset", Main.DuplicatorFrequencyGreen.Value, Main.DuplicatorCostGreen.Value); }; Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicatorMilitary", "RoR2/Base/DuplicatorMilitary/iscDuplicatorMilitary.asset", Main.DuplicatorFrequencyRed.Value, Main.DuplicatorCostRed.Value); }; Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscDuplicatorWild", "RoR2/Base/DuplicatorWild/iscDuplicatorWild.asset", Main.DuplicatorFrequencyYellow.Value, Main.DuplicatorCostYellow.Value); }; object obj = <>c.<>9__0_4; if (obj == null) { hook_Awake val = delegate(orig_Awake orig, PurchaseInteraction self) { orig.Invoke(self); if (NetworkServer.active) { if (((Object)self).name.Contains("DuplicatorWild")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesYellow.Value); } else if (((Object)self).name.Contains("DuplicatorMilitary")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesRed.Value); } else if (((Object)self).name.Contains("DuplicatorLarge")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesGreen.Value); } else if (((Object)self).name.Contains("Duplicator")) { Main.InitUses(((Component)self).gameObject, Main.DuplicatorUsesWhite.Value); } } }; <>c.<>9__0_4 = val; obj = (object)val; } PurchaseInteraction.Awake += (hook_Awake)obj; object obj2 = <>c.<>9__0_5; if (obj2 == null) { hook_OnInteractionBegin val2 = delegate(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { if (self.CanBeAffordedByInteractor(activator) && ((Object)self).name.Contains("Duplicator")) { Main.uses[((Component)self).gameObject]--; } orig.Invoke(self, activator); }; <>c.<>9__0_5 = val2; obj2 = (object)val2; } PurchaseInteraction.OnInteractionBegin += (hook_OnInteractionBegin)obj2; object obj3 = <>c.<>9__0_6; if (obj3 == null) { hook_DropDroplet val3 = delegate(orig_DropDroplet orig, Duplicating self) { orig.Invoke(self); if (Main.uses.ContainsKey(((EntityState)self).gameObject) && Main.uses[((EntityState)self).gameObject] == 0) { ((Component)((EntityState)self).outer).GetComponent<ShopTerminalBehavior>().SetHasBeenPurchased(true); ((Component)((EntityState)self).outer).GetComponent<ShopTerminalBehavior>().SetNoPickup(); ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().Networkavailable = false; } }; <>c.<>9__0_6 = val3; obj3 = (object)val3; } Duplicating.DropDroplet += (hook_DropDroplet)obj3; } } public class LunarTablet { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<Stage> <>9__2_0; public static hook_OnInteractionBegin <>9__2_1; internal void <Patch>b__2_0(Stage self) { if (self.sceneDef.cachedName != "bazaar") { return; } GameObject obj = GameObject.Find("HOLDER: Store"); object obj2; if (obj == null) { obj2 = null; } else { Transform transform = obj.transform; if (transform == null) { obj2 = null; } else { Transform obj3 = transform.Find("LunarShop"); if (obj3 == null) { obj2 = null; } else { Transform obj4 = obj3.Find("LunarRecycler"); obj2 = ((obj4 != null) ? ((Component)obj4).GetComponent<PurchaseInteraction>() : null); } } } PurchaseInteraction val = (PurchaseInteraction)obj2; if ((Object)(object)val != (Object)null) { if (Main.LunarTabletCost.Value == 0) { ((Component)val).gameObject.SetActive(false); return; } slab = ((Component)val).gameObject; val.cost = Main.LunarTabletCost.Value; uses = Main.LunarTabletUses.Value; } } internal void <Patch>b__2_1(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { bool flag = self.CanBeAffordedByInteractor(activator); orig.Invoke(self, activator); if ((Object)(object)((Component)self).gameObject == (Object)(object)slab && flag) { uses--; if (uses == 0) { ((Behaviour)self).enabled = false; } } } } public static GameObject slab; public static int uses; public static void Patch() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown Stage.onStageStartGlobal += delegate(Stage self) { if (!(self.sceneDef.cachedName != "bazaar")) { GameObject obj2 = GameObject.Find("HOLDER: Store"); object obj3; if (obj2 == null) { obj3 = null; } else { Transform transform = obj2.transform; if (transform == null) { obj3 = null; } else { Transform obj4 = transform.Find("LunarShop"); if (obj4 == null) { obj3 = null; } else { Transform obj5 = obj4.Find("LunarRecycler"); obj3 = ((obj5 != null) ? ((Component)obj5).GetComponent<PurchaseInteraction>() : null); } } } PurchaseInteraction val2 = (PurchaseInteraction)obj3; if ((Object)(object)val2 != (Object)null) { if (Main.LunarTabletCost.Value == 0) { ((Component)val2).gameObject.SetActive(false); } else { slab = ((Component)val2).gameObject; val2.cost = Main.LunarTabletCost.Value; uses = Main.LunarTabletUses.Value; } } } }; object obj = <>c.<>9__2_1; if (obj == null) { hook_OnInteractionBegin val = delegate(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator) { bool flag = self.CanBeAffordedByInteractor(activator); orig.Invoke(self, activator); if ((Object)(object)((Component)self).gameObject == (Object)(object)slab && flag) { uses--; if (uses == 0) { ((Behaviour)self).enabled = false; } } }; <>c.<>9__2_1 = val; obj = (object)val; } PurchaseInteraction.OnInteractionBegin += (hook_OnInteractionBegin)obj; } } [BepInPlugin("prodzpod.LimitedInteractables", "LimitedInteractables", "1.3.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Main : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<Stage> <>9__54_0; public static Action<SceneDirector, DirectorCardCategorySelection> <>9__54_1; public static hook_GetContextString <>9__54_2; public static hook_GetContextString <>9__54_3; public static hook_GetContextString <>9__54_4; public static hook_GetContextString <>9__54_5; public static hook_GetDisplayName <>9__54_6; internal void <Awake>b__54_0(Stage stage) { uses.Clear(); } internal void <Awake>b__54_1(SceneDirector director, DirectorCardCategorySelection selection) { if (NetworkServer.active && Main.onGenerateInteractableCardSelection != null) { Main.onGenerateInteractableCardSelection(director, selection); } } internal string <Awake>b__54_2(orig_GetContextString orig, PurchaseInteraction self, Interactor activator) { return orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); } internal string <Awake>b__54_3(orig_GetContextString orig, ShrineCleanseBehavior self, Interactor activator) { return orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); } internal string <Awake>b__54_4(orig_GetContextString orig, PickupPickerController self, Interactor activator) { return orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); } internal string <Awake>b__54_5(orig_GetContextString orig, DroneScrapperPickerController self, Interactor activator) { return orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); } internal string <Awake>b__54_6(orig_GetDisplayName orig, PurchaseInteraction self) { return orig.Invoke(self) + GetUsesString(((Component)self).gameObject); } } public const string PluginGUID = "prodzpod.LimitedInteractables"; public const string PluginAuthor = "prodzpod"; public const string PluginName = "LimitedInteractables"; public const string PluginVersion = "1.3.0"; public static ManualLogSource Log; public static Harmony Harmony; public static PluginInfo pluginInfo; public static ConfigFile Config; public static ConfigEntry<int> ScrapperStackAtOnce; public static ConfigEntry<float> ScrapperFrequency; public static ConfigEntry<float> ScrapperCost; public static ConfigEntry<int> ScrapperMaxUses; public static ConfigEntry<float> ScrapperChance; public static ConfigEntry<float> DroneScrapperFrequency; public static ConfigEntry<float> DroneScrapperCost; public static ConfigEntry<int> DroneScrapperMaxUses; public static ConfigEntry<string> DroneAssemblyStages; public static ConfigEntry<float> DroneAssemblyFrequency; public static ConfigEntry<float> DroneAssemblyCost; public static ConfigEntry<int> DroneAssemblyMaxUses; public static ConfigEntry<int> DroneAssemblyMaxSpawns; public static ConfigEntry<float> DroneCombinerFrequency; public static ConfigEntry<float> DroneCombinerCost; public static ConfigEntry<int> DroneCombinerMaxUses; public static ConfigEntry<int> DroneCombinerMaxSpawns; public static ConfigEntry<float> DuplicatorFrequencyWhite; public static ConfigEntry<float> DuplicatorFrequencyGreen; public static ConfigEntry<float> DuplicatorFrequencyRed; public static ConfigEntry<float> DuplicatorFrequencyYellow; public static ConfigEntry<float> DuplicatorCostWhite; public static ConfigEntry<float> DuplicatorCostGreen; public static ConfigEntry<float> DuplicatorCostRed; public static ConfigEntry<float> DuplicatorCostYellow; public static ConfigEntry<int> DuplicatorUsesWhite; public static ConfigEntry<int> DuplicatorUsesGreen; public static ConfigEntry<int> DuplicatorUsesRed; public static ConfigEntry<int> DuplicatorUsesYellow; public static ConfigEntry<string> RepairRepairList; public static ConfigEntry<int> RepairStackAtOnce; public static ConfigEntry<int> LunarTabletCost; public static ConfigEntry<int> LunarTabletUses; public static ConfigEntry<bool> CleansingPoolTakesEquipments; public static ConfigEntry<bool> CleansingPoolVoidLunar; public static ConfigEntry<float> CleansingPoolFrequency; public static ConfigEntry<float> CleansingPoolCost; public static ConfigEntry<int> CleansingPoolUses; public static ConfigEntry<float> CleansingPoolChance; public static ConfigEntry<int> CHEFMaxUses; public static ConfigEntry<float> CHEFChance; public static ConfigEntry<int> RecyclerMaxUses; public static Dictionary<GameObject, int> uses; public static event Action<SceneDirector, DirectorCardCategorySelection> onGenerateInteractableCardSelection; public void Awake() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_067b: Unknown result type (might be due to invalid IL or missing references) //IL_0680: Unknown result type (might be due to invalid IL or missing references) //IL_0686: Expected O, but got Unknown //IL_06a0: Unknown result type (might be due to invalid IL or missing references) //IL_06a5: Unknown result type (might be due to invalid IL or missing references) //IL_06ab: Expected O, but got Unknown //IL_06c5: Unknown result type (might be due to invalid IL or missing references) //IL_06ca: Unknown result type (might be due to invalid IL or missing references) //IL_06d0: Expected O, but got Unknown //IL_06ea: Unknown result type (might be due to invalid IL or missing references) //IL_06ef: Unknown result type (might be due to invalid IL or missing references) //IL_06f5: Expected O, but got Unknown //IL_070f: Unknown result type (might be due to invalid IL or missing references) //IL_0714: Unknown result type (might be due to invalid IL or missing references) //IL_071a: Expected O, but got Unknown pluginInfo = ((BaseUnityPlugin)this).Info; Harmony = new Harmony("prodzpod.LimitedInteractables"); Log = ((BaseUnityPlugin)this).Logger; Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.LimitedInteractables.cfg"), true); uses = new Dictionary<GameObject, int>(); Stage.onServerStageComplete += delegate { uses.Clear(); }; DuplicatorFrequencyWhite = Config.Bind<float>("3D Printer Tweaks", "Common Printer Frequency", 1f, "Multiplier for Scrapper spawn frequency."); DuplicatorFrequencyGreen = Config.Bind<float>("3D Printer Tweaks", "Uncommon Printer Frequency", 1f, "Multiplier for Scrapper spawn frequency."); DuplicatorFrequencyRed = Config.Bind<float>("3D Printer Tweaks", "Legendary Printer Frequency", 1f, "Multiplier for Scrapper spawn frequency."); DuplicatorFrequencyYellow = Config.Bind<float>("3D Printer Tweaks", "Boss Printer Frequency", 1f, "Multiplier for Scrapper spawn frequency."); DuplicatorCostWhite = Config.Bind<float>("3D Printer Tweaks", "Common Printer Cost", 1f, "Multiplier for Scrapper spawn cost."); DuplicatorCostGreen = Config.Bind<float>("3D Printer Tweaks", "Uncommon Printer Cost", 1f, "Multiplier for Scrapper spawn cost."); DuplicatorCostRed = Config.Bind<float>("3D Printer Tweaks", "Legendary Printer Cost", 1f, "Multiplier for Scrapper spawn cost."); DuplicatorCostYellow = Config.Bind<float>("3D Printer Tweaks", "Boss Printer Cost", 0.8f, "Multiplier for Scrapper spawn cost."); DuplicatorUsesWhite = Config.Bind<int>("3D Printer Tweaks", "Common Printer Max Uses", 0, "Max number of items to duplicate. Set to 0 to disable."); DuplicatorUsesGreen = Config.Bind<int>("3D Printer Tweaks", "Uncommon Printer Max Uses", 0, "Max number of items to duplicate. Set to 0 to disable."); DuplicatorUsesRed = Config.Bind<int>("3D Printer Tweaks", "Legendary Printer Max Uses", 0, "Max number of items to duplicate. Set to 0 to disable."); DuplicatorUsesYellow = Config.Bind<int>("3D Printer Tweaks", "Boss Printer Max Uses", 1, "Max number of items to duplicate. Set to 0 to disable."); Duplicator.Patch(); ScrapperStackAtOnce = Config.Bind<int>("Scrapper Tweaks", "Scrapper Stacks at Once", 1, "Max number of items to scrap at once. Set to 0 to disable."); ScrapperFrequency = Config.Bind<float>("Scrapper Tweaks", "Scrapper Frequency", 1f, "Multiplier for Scrapper spawn frequency."); ScrapperCost = Config.Bind<float>("Scrapper Tweaks", "Scrapper Cost", 1f, "Multiplier for Scrapper spawn cost."); ScrapperMaxUses = Config.Bind<int>("Scrapper Tweaks", "Scrapper Max Uses", 3, "Max number of items to scrap per scrapper. Set to 0 to disable."); ScrapperChance = Config.Bind<float>("Scrapper Tweaks", "Scrapper Chance", 1f, "Chance for scrapper to give you scrap."); Scrapper.Patch(); DroneScrapperFrequency = Config.Bind<float>("Drone Scrapper Tweaks", "Scrapper Frequency", 1f, "Multiplier for Drone Scrapper spawn frequency."); DroneScrapperCost = Config.Bind<float>("Drone Scrapper Tweaks", "Scrapper Cost", 1f, "Multiplier for Drone Scrapper spawn cost."); DroneScrapperMaxUses = Config.Bind<int>("Drone Scrapper Tweaks", "Scrapper Max Uses", 3, "Max number of drones to scrap per drone scrapper. Set to 0 to disable."); DroneScrapper.Patch(); DroneAssemblyStages = Config.Bind<string>("Drone Assembly Station Tweaks", "Drone Assembly Station Stages", "", "Stages to spawn the unused station (separated by comma)"); DroneAssemblyMaxSpawns = Config.Bind<int>("Drone Assembly Station Tweaks", "Drone Assembly Station Max Spawns per Stage", -1, "Max number of stations per stage. Set to -1 to uncap."); DroneAssemblyFrequency = Config.Bind<float>("Drone Assembly Station Tweaks", "Drone Assembly Station Frequency", 1f, "Drone Assembly Station spawn frequency."); DroneAssemblyCost = Config.Bind<float>("Drone Assembly Station Tweaks", "Drone Assembly Station Cost", 15f, "Drone Assembly Station spawn cost. default is equal to combiner."); DroneAssemblyMaxUses = Config.Bind<int>("Drone Assembly Station Tweaks", "Drone Assembly Station Max Uses", 1, "Max number of items to upgrade drones. Set to 0 to disable."); DroneAssembly.Patch(); DroneCombinerMaxSpawns = Config.Bind<int>("Drone Combiner Station Tweaks", "Drone Combiner Station Max Spawns per Stage", 1, "Max number of stations per stage. Set to -1 to uncap."); DroneCombinerFrequency = Config.Bind<float>("Drone Combiner Station Tweaks", "Drone Combiner Station Frequency", 1f, "Multiplier for Drone Combiner Station spawn frequency."); DroneCombinerCost = Config.Bind<float>("Drone Combiner Station Tweaks", "Drone Combiner Station Cost", 1f, "Multiplier for Drone Combiner Station spawn cost."); DroneCombinerMaxUses = Config.Bind<int>("Drone Combiner Station Tweaks", "Drone Combiner Station Max Uses", 3, "Max number of items to combine drones. Set to 0 to disable."); DroneCombiner.Patch(); RepairRepairList = Config.Bind<string>("Shrine of Repair Tweaks", "Shrine of Repair True Repair List", "ExtraLifeConsumed, ExtraLifeVoidConsumed, FragileDamageBonusConsumed, HealingPotionConsumed, RegeneratingScrapConsumed, BossHunterConsumed", "List of repairs to count in the following configs."); RepairStackAtOnce = Config.Bind<int>("Shrine of Repair Tweaks", "Shrine of Repair Stacks at Once", 0, "Max number of items to repair at once. ONLY AFFECTS ONES ON TRUE REPAIR LIST. Set to 0 to disable."); if (Chainloader.PluginInfos.ContainsKey("com.Viliger.ShrineOfRepair") && RepairStackAtOnce.Value > 0) { ShrineRepair.Patch(); } LunarTabletCost = Config.Bind<int>("Lunar Tablet Tweaks", "Lunar Tablet Start Cost", 5, "Set to 0 to remove it completely"); LunarTabletUses = Config.Bind<int>("Lunar Tablet Tweaks", "Lunar Tablet Max Uses", 0, "Set to 0 for vanilla behaviour"); LunarTablet.Patch(); CleansingPoolTakesEquipments = Config.Bind<bool>("Cleansing Pool Tweaks", "Cleansing Pool Accepts Lunar Equipments", true, "yeah"); CleansingPoolVoidLunar = Config.Bind<bool>("Cleansing Pool Tweaks", "Cleansing Pool Accepts Void Lunar", true, "Set to false to not accept void lunar at in Cleansing Pools."); CleansingPoolFrequency = Config.Bind<float>("Cleansing Pool Tweaks", "Cleansing Pool Frequency", 1f, "Multiplier for Cleansing Pool spawn frequency."); CleansingPoolCost = Config.Bind<float>("Cleansing Pool Tweaks", "Cleansing Pool Cost", 1f, "Multiplier for Cleansing Pool spawn cost."); CleansingPoolUses = Config.Bind<int>("Cleansing Pool Tweaks", "Cleansing Pool Max Uses", 0, "Set to 0 for vanilla behaviour"); CleansingPoolChance = Config.Bind<float>("Cleansing Pool Tweaks", "Cleansing Pool Chance", 1f, "Chance for Cleansing Pool to give you scrap."); CleansingPool.Patch(); CHEFMaxUses = Config.Bind<int>("CHEF Tweaks", "CHEF Max Uses", 3, "Max number of items to craft per chef. Set to 0 to disable."); CHEFChance = Config.Bind<float>("CHEF Tweaks", "CHEF Chance", 1f, "Chance for chef to actually give you the item."); MealPrep.Patch(); RecyclerMaxUses = Config.Bind<int>("Recycler Tweaks", "Recycler Max Uses", 1, "Vanilla: 1, set to 0 to disable."); Recycler.Patch(); SceneDirector.onGenerateInteractableCardSelection += delegate(SceneDirector director, DirectorCardCategorySelection selection) { if (NetworkServer.active && Main.onGenerateInteractableCardSelection != null) { Main.onGenerateInteractableCardSelection(director, selection); } }; object obj = <>c.<>9__54_2; if (obj == null) { hook_GetContextString val = (orig_GetContextString orig, PurchaseInteraction self, Interactor activator) => orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); <>c.<>9__54_2 = val; obj = (object)val; } PurchaseInteraction.GetContextString += (hook_GetContextString)obj; object obj2 = <>c.<>9__54_3; if (obj2 == null) { hook_GetContextString val2 = (orig_GetContextString orig, ShrineCleanseBehavior self, Interactor activator) => orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); <>c.<>9__54_3 = val2; obj2 = (object)val2; } ShrineCleanseBehavior.GetContextString += (hook_GetContextString)obj2; object obj3 = <>c.<>9__54_4; if (obj3 == null) { hook_GetContextString val3 = (orig_GetContextString orig, PickupPickerController self, Interactor activator) => orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); <>c.<>9__54_4 = val3; obj3 = (object)val3; } PickupPickerController.GetContextString += (hook_GetContextString)obj3; object obj4 = <>c.<>9__54_5; if (obj4 == null) { hook_GetContextString val4 = (orig_GetContextString orig, DroneScrapperPickerController self, Interactor activator) => orig.Invoke(self, activator) + GetUsesString(((Component)self).gameObject); <>c.<>9__54_5 = val4; obj4 = (object)val4; } DroneScrapperPickerController.GetContextString += (hook_GetContextString)obj4; object obj5 = <>c.<>9__54_6; if (obj5 == null) { hook_GetDisplayName val5 = (orig_GetDisplayName orig, PurchaseInteraction self) => orig.Invoke(self) + GetUsesString(((Component)self).gameObject); <>c.<>9__54_6 = val5; obj5 = (object)val5; } PurchaseInteraction.GetDisplayName += (hook_GetDisplayName)obj5; } public static string GetUsesString(GameObject obj) { int usesInt = GetUsesInt(obj); if (usesInt == -1) { return ""; } return string.Format(" ({0} use{1})", usesInt, (usesInt > 1) ? "s" : ""); } public static int GetUsesInt(GameObject obj) { if (uses.ContainsKey(obj) && uses[obj] > 0) { return uses[obj]; } if ((Object)(object)obj == (Object)(object)LunarTablet.slab && LunarTablet.uses > 0) { return LunarTablet.uses; } if (Chainloader.PluginInfos.ContainsKey("com.Viliger.ShrineOfRepair")) { return GetRepairUses(obj); } return -1; } public static int GetRepairUses(GameObject obj) { ShrineOfRepairPickerManager component = obj.GetComponent<ShrineOfRepairPickerManager>(); if ((Object)(object)component != (Object)null && component.uses < ShrineOfRepairConfigManager.MaxUses.Value) { return ShrineOfRepairConfigManager.MaxUses.Value - component.uses; } return -1; } public static void InitUses(GameObject self, int use) { if (NetworkServer.active) { if (!uses.ContainsKey(self)) { uses.Add(self, use); } else { uses[self] = use; } } } public static void TweakFrequencyAndCost(DirectorCardCategorySelection dccs, string name, string cscName, float frequency, float cost, int max = -2) { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) int categoryIndex = GetCategoryIndex(dccs, name); if (categoryIndex < 0) { return; } DirectorCard card = GetCard(dccs, categoryIndex, name); if (card == null) { return; } List<DirectorCard> list = dccs.categories[categoryIndex].cards.ToList(); list.Remove(card); dccs.categories[categoryIndex].cards = list.ToArray(); if (!((float)card.selectionWeight * frequency <= 0f)) { SpawnCard val = Addressables.LoadAssetAsync<SpawnCard>((object)cscName).WaitForCompletion(); val.directorCreditCost = Mathf.Max(1, (int)((float)val.directorCreditCost * cost)); if (max != -2) { ((InteractableSpawnCard)val).maxSpawnsPerStage = max; } DirectorCard val2 = new DirectorCard { spawnCard = val, selectionWeight = Mathf.Max(0, (int)((float)card.selectionWeight * frequency)) }; dccs.AddCard(categoryIndex, val2); } } public static int GetCategoryIndex(DirectorCardCategorySelection dccs, string name) { for (int i = 0; i < dccs.categories.Length; i++) { DirectorCard[] cards = dccs.categories[i].cards; foreach (DirectorCard val in cards) { if (((Object)val.spawnCard).name.StartsWith(name)) { return i; } } } return -1; } public static DirectorCard GetCard(DirectorCardCategorySelection dccs, int category, string name) { DirectorCard[] cards = dccs.categories[category].cards; foreach (DirectorCard val in cards) { if (((Object)val.spawnCard).name.StartsWith(name)) { return val; } } return null; } } public class MealPrep { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnEnter <>9__0_0; public static hook_OnEnter <>9__0_1; internal void <Patch>b__0_0(orig_OnEnter orig, MealPrepBaseState self) { GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if (!Main.uses.ContainsKey(gameObject)) { Main.uses.Add(gameObject, Main.CHEFMaxUses.Value); } orig.Invoke(self); if (Main.uses[gameObject] <= 0) { ((PickupPickerController)((Component)((EntityState)self).outer).GetComponent<CraftingController>()).SetAvailable(false); } } internal void <Patch>b__0_1(orig_OnEnter orig, Cooking self) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if ((Object)(object)gameObject != (Object)null && Main.uses.ContainsKey(gameObject)) { Main.uses[gameObject]--; } if (Run.instance.runRNG.RangeFloat(0f, 1f) > Main.CHEFChance.Value) { ((MealPrepBaseState)self).pickupToDrop = PickupIndex.none; } orig.Invoke(self); } } public static void Patch() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown object obj = <>c.<>9__0_0; if (obj == null) { hook_OnEnter val = delegate(orig_OnEnter orig, MealPrepBaseState self) { GameObject gameObject2 = ((Component)((EntityState)self).outer).gameObject; if (!Main.uses.ContainsKey(gameObject2)) { Main.uses.Add(gameObject2, Main.CHEFMaxUses.Value); } orig.Invoke(self); if (Main.uses[gameObject2] <= 0) { ((PickupPickerController)((Component)((EntityState)self).outer).GetComponent<CraftingController>()).SetAvailable(false); } }; <>c.<>9__0_0 = val; obj = (object)val; } MealPrepBaseState.OnEnter += (hook_OnEnter)obj; object obj2 = <>c.<>9__0_1; if (obj2 == null) { hook_OnEnter val2 = delegate(orig_OnEnter orig, Cooking self) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if ((Object)(object)gameObject != (Object)null && Main.uses.ContainsKey(gameObject)) { Main.uses[gameObject]--; } if (Run.instance.runRNG.RangeFloat(0f, 1f) > Main.CHEFChance.Value) { ((MealPrepBaseState)self).pickupToDrop = PickupIndex.none; } orig.Invoke(self); }; <>c.<>9__0_1 = val2; obj2 = (object)val2; } Cooking.OnEnter += (hook_OnEnter)obj2; } } public class Recycler { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<Stage> <>9__1_0; public static hook_Start <>9__1_1; public static Func<Instruction, bool> <>9__1_4; public static Func<Instruction, bool> <>9__1_5; public static Func<GenericPickupController, bool> <>9__1_6; public static Manipulator <>9__1_2; public static hook_GetLocalizedStringByToken <>9__1_3; internal void <Patch>b__1_0(Stage stage) { uses.Clear(); } internal void <Patch>b__1_1(orig_Start orig, GenericPickupController self) { if (!uses.ContainsKey(self)) { uses.Add(self, Main.RecyclerMaxUses.Value); } else { uses[self] = Main.RecyclerMaxUses.Value; } orig.Invoke(self); } internal void <Patch>b__1_2(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 1), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<GenericPickupController>(x, "set_NetworkRecycled") }); val.Remove(); val.Emit(OpCodes.Ldloc_0); val.EmitDelegate<Func<GenericPickupController, bool>>((Func<GenericPickupController, bool>)delegate(GenericPickupController self) { uses[self]--; return (uses[self] == 0) ? true : false; }); } internal bool <Patch>b__1_4(Instruction x) { return ILPatternMatchingExt.MatchLdcI4(x, 1); } internal bool <Patch>b__1_5(Instruction x) { return ILPatternMatchingExt.MatchCallOrCallvirt<GenericPickupController>(x, "set_NetworkRecycled"); } internal bool <Patch>b__1_6(GenericPickupController self) { uses[self]--; if (uses[self] == 0) { return true; } return false; } internal string <Patch>b__1_3(orig_GetLocalizedStringByToken orig, Language self, string token) { if (token == "EQUIPMENT_RECYCLER_PICKUP") { string text = "Transform an Item or Equipment into a different one."; if (Main.RecyclerMaxUses.Value > 0) { text = text + " Can only recycle up to " + Main.RecyclerMaxUses.Value + " times."; } return text; } if (token == "EQUIPMENT_RECYCLER_DESC") { string text2 = "<style=cIsUtility>Transform</style> an Item or Equipment into a different one."; if (Main.RecyclerMaxUses.Value > 0) { text2 = text2 + " <style=cIsUtility>Can only be converted into the same tier " + Main.RecyclerMaxUses.Value + " times</style>."; } return text2; } return orig.Invoke(self, token); } } public static Dictionary<GenericPickupController, int> uses; public static void Patch() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown uses = new Dictionary<GenericPickupController, int>(); Stage.onServerStageComplete += delegate { uses.Clear(); }; object obj = <>c.<>9__1_1; if (obj == null) { hook_Start val = delegate(orig_Start orig, GenericPickupController self) { if (!uses.ContainsKey(self)) { uses.Add(self, Main.RecyclerMaxUses.Value); } else { uses[self] = Main.RecyclerMaxUses.Value; } orig.Invoke(self); }; <>c.<>9__1_1 = val; obj = (object)val; } GenericPickupController.Start += (hook_Start)obj; object obj2 = <>c.<>9__1_2; if (obj2 == null) { Manipulator val2 = delegate(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) ILCursor val4 = new ILCursor(il); val4.GotoNext(new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 1), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<GenericPickupController>(x, "set_NetworkRecycled") }); val4.Remove(); val4.Emit(OpCodes.Ldloc_0); val4.EmitDelegate<Func<GenericPickupController, bool>>((Func<GenericPickupController, bool>)delegate(GenericPickupController self) { uses[self]--; return (uses[self] == 0) ? true : false; }); }; <>c.<>9__1_2 = val2; obj2 = (object)val2; } EquipmentSlot.FireRecycle += (Manipulator)obj2; object obj3 = <>c.<>9__1_3; if (obj3 == null) { hook_GetLocalizedStringByToken val3 = delegate(orig_GetLocalizedStringByToken orig, Language self, string token) { if (token == "EQUIPMENT_RECYCLER_PICKUP") { string text = "Transform an Item or Equipment into a different one."; if (Main.RecyclerMaxUses.Value > 0) { text = text + " Can only recycle up to " + Main.RecyclerMaxUses.Value + " times."; } return text; } if (token == "EQUIPMENT_RECYCLER_DESC") { string text2 = "<style=cIsUtility>Transform</style> an Item or Equipment into a different one."; if (Main.RecyclerMaxUses.Value > 0) { text2 = text2 + " <style=cIsUtility>Can only be converted into the same tier " + Main.RecyclerMaxUses.Value + " times</style>."; } return text2; } return orig.Invoke(self, token); }; <>c.<>9__1_3 = val3; obj3 = (object)val3; } Language.GetLocalizedStringByToken += (hook_GetLocalizedStringByToken)obj3; } } public class Scrapper { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<SceneDirector, DirectorCardCategorySelection> <>9__0_0; public static hook_PreStartClient <>9__0_1; public static hook_OnEnter <>9__0_2; public static hook_OnEnter <>9__0_3; internal void <Patch>b__0_0(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscScrapper", "RoR2/Base/Scrapper/iscScrapper.asset", Main.ScrapperFrequency.Value, Main.ScrapperCost.Value); } internal void <Patch>b__0_1(orig_PreStartClient orig, ScrapperController self) { self.maxItemsToScrapAtATime = Main.ScrapperStackAtOnce.Value; orig.Invoke(self); } internal void <Patch>b__0_2(orig_OnEnter orig, ScrapperBaseState self) { GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if (!Main.uses.ContainsKey(gameObject)) { Main.uses.Add(gameObject, Main.ScrapperMaxUses.Value); } orig.Invoke(self); if (Main.uses[gameObject] <= 0) { ((Component)((EntityState)self).outer).GetComponent<PickupPickerController>().SetAvailable(false); } } internal void <Patch>b__0_3(orig_OnEnter orig, Scrapping self) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if ((Object)(object)gameObject != (Object)null && Main.uses.ContainsKey(gameObject)) { Main.uses[gameObject]--; } if (Run.instance.runRNG.RangeFloat(0f, 1f) > Main.ScrapperChance.Value) { ((ScrapperBaseState)self).scrapperController.pickupPrintQueue[0] = UniquePickup.none; } orig.Invoke(self); } } public static void Patch() { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown Main.onGenerateInteractableCardSelection += delegate(SceneDirector dir, DirectorCardCategorySelection sel) { Main.TweakFrequencyAndCost(sel, "iscScrapper", "RoR2/Base/Scrapper/iscScrapper.asset", Main.ScrapperFrequency.Value, Main.ScrapperCost.Value); }; if (Main.ScrapperStackAtOnce.Value > 0) { object obj = <>c.<>9__0_1; if (obj == null) { hook_PreStartClient val = delegate(orig_PreStartClient orig, ScrapperController self) { self.maxItemsToScrapAtATime = Main.ScrapperStackAtOnce.Value; orig.Invoke(self); }; <>c.<>9__0_1 = val; obj = (object)val; } ScrapperController.PreStartClient += (hook_PreStartClient)obj; } object obj2 = <>c.<>9__0_2; if (obj2 == null) { hook_OnEnter val2 = delegate(orig_OnEnter orig, ScrapperBaseState self) { GameObject gameObject2 = ((Component)((EntityState)self).outer).gameObject; if (!Main.uses.ContainsKey(gameObject2)) { Main.uses.Add(gameObject2, Main.ScrapperMaxUses.Value); } orig.Invoke(self); if (Main.uses[gameObject2] <= 0) { ((Component)((EntityState)self).outer).GetComponent<PickupPickerController>().SetAvailable(false); } }; <>c.<>9__0_2 = val2; obj2 = (object)val2; } ScrapperBaseState.OnEnter += (hook_OnEnter)obj2; object obj3 = <>c.<>9__0_3; if (obj3 == null) { hook_OnEnter val3 = delegate(orig_OnEnter orig, Scrapping self) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)((EntityState)self).outer).gameObject; if ((Object)(object)gameObject != (Object)null && Main.uses.ContainsKey(gameObject)) { Main.uses[gameObject]--; } if (Run.instance.runRNG.RangeFloat(0f, 1f) > Main.ScrapperChance.Value) { ((ScrapperBaseState)self).scrapperController.pickupPrintQueue[0] = UniquePickup.none; } orig.Invoke(self); }; <>c.<>9__0_3 = val3; obj3 = (object)val3; } Scrapping.OnEnter += (hook_OnEnter)obj3; } } public class ShrineRepair { [HarmonyPatch(typeof(ShrineOfRepairPickerManager), "HandleSelection", new Type[] { typeof(int) })] public class PatchSelection { public static void ILManipulator(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchStloc(x, 3) }); val.Emit(OpCodes.Ldloc_0); val.EmitDelegate<Func<int, PickupDef, int>>((Func<int, PickupDef, int>)delegate(int count, PickupDef pickupDef) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (((pickupDef == null) ? (-1) : ((int)pickupDef.itemIndex)) == -1) { return count; } return repairList.Contains(((Object)ItemCatalog.GetItemDef(pickupDef.itemIndex)).name) ? Mathf.Min(count, Main.RepairStackAtOnce.Value) : count; }); } } [HarmonyPatch(typeof(ShrineOfRepairPickerManager), "HandleInteraction", new Type[] { typeof(Interactor) })] public class PatchInteraction { public static void ILManipulator(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchStloc(x, 6) }); val.Emit(OpCodes.Ldloc, 5); val.EmitDelegate<Func<int, KeyValuePair<ItemIndex, ItemIndex>, int>>((Func<int, KeyValuePair<ItemIndex, ItemIndex>, int>)((int count, KeyValuePair<ItemIndex, ItemIndex> repairItems) => repairList.Contains(((Object)ItemCatalog.GetItemDef(repairItems.Key)).name) ? Mathf.Min(count, Main.RepairStackAtOnce.Value) : count)); } } public static List<string> repairList = new List<string>(); public static void Patch() { string[] array = Main.RepairRepairList.Value.Split(','); foreach (string text in array) { repairList.Add(text.Trim()); } Main.Log.LogDebug((object)("Repair Repair List: " + GeneralExtensions.Join<string>((IEnumerable<string>)repairList, (Func<string, string>)null, ", "))); Main.Harmony.PatchAll(typeof(PatchSelection)); Main.Harmony.PatchAll(typeof(PatchInteraction)); } } }