Decompiled source of RegeneratingScrapTweak v1.1.0

RegeneratingScrapTweak.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.Audio;
using RoR2.Items;
using UnityEngine;
using UnityEngine.AddressableAssets;

[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("RegeneratingScrapTweak")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RegeneratingScrapTweak")]
[assembly: AssemblyTitle("RegeneratingScrapTweak")]
[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 RegeneratingScrapTweak
{
	internal static class Log
	{
		internal static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void LogDebug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void LogError(object data)
		{
			_logSource.LogError(data);
		}

		internal static void LogFatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void LogInfo(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void LogMessage(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void LogWarning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	[BepInPlugin("Tero.RegeneratingScrapTweak", "RegeneratingScrapTweak", "1.1.0")]
	[R2APISubmoduleDependency(new string[] { "LanguageAPI" })]
	public class RegeneratingScrapTweak : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_Init <>9__14_0;

			public static hook_IsAffordable <>9__14_1;

			public static hook_PayCost <>9__14_2;

			internal void <Awake>b__14_0(orig_Init orig)
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke();
				if ((Object)(object)Items.RegeneratingScrap != (Object)null)
				{
					ItemDef itemDef = ItemCatalog.GetItemDef(Items.RegeneratingScrap.itemIndex);
					Log.LogDebug(itemDef.descriptionToken);
					Log.LogDebug(itemDef.pickupToken);
				}
				if (TradeForRed && TradeForYellow)
				{
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with ANY 3D Printer. Usable once per stage.", "en");
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with ANY 3D Printer. At the start of each stage, it regenerates.", "en");
				}
				else if (TradeForYellow)
				{
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsDamage>Overgrown</style> 3D Printers. Usable once per stage.", "en");
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsDamage>Overgrown</style> 3D Printers. At the start of each stage, it regenerates.", "en");
				}
				else if (TradeForRed)
				{
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsHealth>Legendary</style> 3D Printers. Usable once per stage.", "en");
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsHealth>Legendary</style> 3D Printers. At the start of each stage, it regenerates.", "en");
				}
				else
				{
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with Common or <style=cIsHealing>Uncommon</style> 3D Printers. Usable once per stage.", "en");
					LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with Common or <style=cIsHealing>Uncommon</style> 3D Printers. At the start of each stage, it regenerates.", "en");
				}
			}

			internal bool <Awake>b__14_1(orig_IsAffordable orig, CostTypeDef self, int cost, Interactor activator)
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Invalid comparison between Unknown and I4
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cf: Invalid comparison between Unknown and I4
				//IL_018b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0191: Invalid comparison between Unknown and I4
				if (self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 0)
				{
					CharacterBody component = ((Component)activator).GetComponent<CharacterBody>();
					if (!Object.op_Implicit((Object)(object)component))
					{
						return false;
					}
					Inventory inventory = component.inventory;
					if (!Object.op_Implicit((Object)(object)inventory))
					{
						return false;
					}
					int num = 0;
					if ((Object)(object)Items.RegeneratingScrap != (Object)null)
					{
						num = inventory.GetItemCountEffective(Items.RegeneratingScrap);
					}
					if (num >= cost)
					{
						return true;
					}
					return inventory.HasAtLeastXTotalRemovablePermanentItemsOfTier((ItemTier)0, cost - num);
				}
				if (TradeForRed && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 2)
				{
					CharacterBody component2 = ((Component)activator).GetComponent<CharacterBody>();
					if (!Object.op_Implicit((Object)(object)component2))
					{
						return false;
					}
					Inventory inventory2 = component2.inventory;
					if (!Object.op_Implicit((Object)(object)inventory2))
					{
						return false;
					}
					int num2 = 0;
					if ((Object)(object)Items.RegeneratingScrap != (Object)null)
					{
						num2 = inventory2.GetItemCountEffective(Items.RegeneratingScrap);
					}
					if (num2 >= cost)
					{
						return true;
					}
					return inventory2.HasAtLeastXTotalRemovablePermanentItemsOfTier((ItemTier)2, cost - num2);
				}
				if (TradeForYellow && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 4)
				{
					CharacterBody component3 = ((Component)activator).GetComponent<CharacterBody>();
					if (!Object.op_Implicit((Object)(object)component3))
					{
						return false;
					}
					Inventory inventory3 = component3.inventory;
					if (!Object.op_Implicit((Object)(object)inventory3))
					{
						return false;
					}
					int num3 = 0;
					if ((Object)(object)Items.RegeneratingScrap != (Object)null)
					{
						num3 = inventory3.GetItemCountEffective(Items.RegeneratingScrap);
					}
					if (num3 >= cost)
					{
						return true;
					}
					return inventory3.HasAtLeastXTotalRemovablePermanentItemsOfTier((ItemTier)4, cost - num3);
				}
				return orig.Invoke(self, cost, activator);
			}

			internal void <Awake>b__14_2(orig_PayCost orig, CostTypeDef self, PayCostContext context, PayCostResults results)
			{
				//IL_0014: 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_003b: Invalid comparison between Unknown and I4
				//IL_0057: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Invalid comparison between Unknown and I4
				//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0103: Unknown result type (might be due to invalid IL or missing references)
				//IL_0115: Unknown result type (might be due to invalid IL or missing references)
				//IL_0137: Unknown result type (might be due to invalid IL or missing references)
				//IL_0139: Unknown result type (might be due to invalid IL or missing references)
				//IL_0184: Unknown result type (might be due to invalid IL or missing references)
				//IL_0191: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0313: Unknown result type (might be due to invalid IL or missing references)
				//IL_031d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0267: Unknown result type (might be due to invalid IL or missing references)
				//IL_0293: Unknown result type (might be due to invalid IL or missing references)
				//IL_0298: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_02cf: Expected O, but got Unknown
				if ((self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 0) || (TradeForRed && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 2) || (TradeForYellow && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 4))
				{
					int num = 0;
					CharacterBody component = ((Component)context.activator).GetComponent<CharacterBody>();
					if (!Object.op_Implicit((Object)(object)component))
					{
						orig.Invoke(self, context, results);
						return;
					}
					Inventory activatorInventory = context.activatorInventory;
					if (!Object.op_Implicit((Object)(object)activatorInventory))
					{
						orig.Invoke(self, context, results);
						return;
					}
					if ((Object)(object)Items.RegeneratingScrap != (Object)null)
					{
						num = activatorInventory.GetItemCountEffective(Items.RegeneratingScrap);
					}
					ItemTransformation val;
					if (num >= context.cost)
					{
						val = default(ItemTransformation);
						((ItemTransformation)(ref val)).originalItemIndex = Items.RegeneratingScrap.itemIndex;
						((ItemTransformation)(ref val)).newItemIndex = Items.RegeneratingScrapConsumed.itemIndex;
						((ItemTransformation)(ref val)).maxToTransform = context.cost;
						((ItemTransformation)(ref val)).forbidTempItems = true;
						ItemTransformation val2 = val;
						TryTransformResult val3 = default(TryTransformResult);
						if (((ItemTransformation)(ref val2)).TryTransform(activatorInventory, ref val3))
						{
							results.AddTakenItemsFromTransformation(ref val3);
						}
					}
					else
					{
						context.cost -= num;
						orig.Invoke(self, context, results);
						if (num > 0)
						{
							val = default(ItemTransformation);
							((ItemTransformation)(ref val)).originalItemIndex = Items.RegeneratingScrap.itemIndex;
							((ItemTransformation)(ref val)).newItemIndex = Items.RegeneratingScrapConsumed.itemIndex;
							((ItemTransformation)(ref val)).maxToTransform = num;
							((ItemTransformation)(ref val)).forbidTempItems = true;
							ItemTransformation val4 = val;
							TryTransformResult val5 = default(TryTransformResult);
							if (((ItemTransformation)(ref val4)).TryTransform(activatorInventory, ref val5))
							{
								results.AddTakenItemsFromTransformation(ref val5);
							}
							context.cost = num;
						}
					}
					if (num <= 0)
					{
						return;
					}
					EntitySoundManager.EmitSoundServer(NetworkSoundEventCatalog.FindNetworkSoundEventIndex("Play_item_proc_regenScrap_consume"), ((Component)context.activatorBody).gameObject);
					ModelLocator component2 = ((Component)context.activatorBody).GetComponent<ModelLocator>();
					if (Object.op_Implicit((Object)(object)component))
					{
						Transform modelTransform = component2.modelTransform;
						if (Object.op_Implicit((Object)(object)modelTransform))
						{
							CharacterModel component3 = ((Component)modelTransform).GetComponent<CharacterModel>();
							if (Object.op_Implicit((Object)(object)component3))
							{
								List<GameObject> itemDisplayObjects = component3.GetItemDisplayObjects(Items.RegeneratingScrap.itemIndex);
								if (itemDisplayObjects.Count > 0)
								{
									GameObject val6 = itemDisplayObjects[0];
									GameObject val7 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/RegeneratingScrap/RegeneratingScrapExplosionDisplay.prefab").WaitForCompletion();
									EffectData val8 = new EffectData
									{
										origin = val6.transform.position,
										rotation = val6.transform.rotation
									};
									EffectManager.SpawnEffect(val7, val8, true);
								}
							}
						}
					}
					EffectManager.SimpleMuzzleFlash(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/RegeneratingScrap/RegeneratingScrapExplosionInPrinter.prefab").WaitForCompletion(), context.purchasedObject, "DropPivot", true);
					CharacterMasterNotificationQueue.SendTransformNotification(context.activatorBody.master, Items.RegeneratingScrap.itemIndex, Items.RegeneratingScrapConsumed.itemIndex, (TransformationType)0);
					MultiShopCardUtils.OnNonMoneyPurchase(context);
				}
				else
				{
					orig.Invoke(self, context, results);
				}
			}
		}

		public const string PluginGUID = "Tero.RegeneratingScrapTweak";

		public const string PluginAuthor = "Tero";

		public const string PluginName = "RegeneratingScrapTweak";

		public const string PluginVersion = "1.1.0";

		public static bool TradeForYellow;

		public static bool TradeForRed;

		public static ConfigEntry<bool> CanTradeForYellow { get; set; }

		public static ConfigEntry<bool> CanTradeForRed { get; set; }

		public void Awake()
		{
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Expected O, but got Unknown
			Log.Init(((BaseUnityPlugin)this).Logger);
			try
			{
				CanTradeForYellow = ((BaseUnityPlugin)this).Config.Bind<bool>("RegeneratingScrapTweak", "CanTradeForYellow", false, "Whether or not Regenerating Scrap can count as a Yellow item");
				TradeForYellow = CanTradeForYellow.Value;
			}
			catch (Exception)
			{
			}
			try
			{
				CanTradeForRed = ((BaseUnityPlugin)this).Config.Bind<bool>("RegeneratingScrapTweak", "CanTradeForRed", false, "Whether or not Regenerating Scrap can count as a Red item");
				TradeForRed = CanTradeForRed.Value;
			}
			catch (Exception)
			{
			}
			object obj = <>c.<>9__14_0;
			if (obj == null)
			{
				hook_Init val = delegate(orig_Init orig)
				{
					//IL_001d: Unknown result type (might be due to invalid IL or missing references)
					orig.Invoke();
					if ((Object)(object)Items.RegeneratingScrap != (Object)null)
					{
						ItemDef itemDef = ItemCatalog.GetItemDef(Items.RegeneratingScrap.itemIndex);
						Log.LogDebug(itemDef.descriptionToken);
						Log.LogDebug(itemDef.pickupToken);
					}
					if (TradeForRed && TradeForYellow)
					{
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with ANY 3D Printer. Usable once per stage.", "en");
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with ANY 3D Printer. At the start of each stage, it regenerates.", "en");
					}
					else if (TradeForYellow)
					{
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsDamage>Overgrown</style> 3D Printers. Usable once per stage.", "en");
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsDamage>Overgrown</style> 3D Printers. At the start of each stage, it regenerates.", "en");
					}
					else if (TradeForRed)
					{
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsHealth>Legendary</style> 3D Printers. Usable once per stage.", "en");
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with Common, <style=cIsHealing>Uncommon</style>, or <style=cIsHealth>Legendary</style> 3D Printers. At the start of each stage, it regenerates.", "en");
					}
					else
					{
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_PICKUP", "Prioritized when used with Common or <style=cIsHealing>Uncommon</style> 3D Printers. Usable once per stage.", "en");
						LanguageAPI.Add("ITEM_REGENERATINGSCRAP_DESC", "Does nothing. Prioritized when used with Common or <style=cIsHealing>Uncommon</style> 3D Printers. At the start of each stage, it regenerates.", "en");
					}
				};
				<>c.<>9__14_0 = val;
				obj = (object)val;
			}
			ItemCatalog.Init += (hook_Init)obj;
			object obj2 = <>c.<>9__14_1;
			if (obj2 == null)
			{
				hook_IsAffordable val2 = delegate(orig_IsAffordable orig, CostTypeDef self, int cost, Interactor activator)
				{
					//IL_0014: Unknown result type (might be due to invalid IL or missing references)
					//IL_001a: Invalid comparison between Unknown and I4
					//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
					//IL_00cf: Invalid comparison between Unknown and I4
					//IL_018b: Unknown result type (might be due to invalid IL or missing references)
					//IL_0191: Invalid comparison between Unknown and I4
					if (self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 0)
					{
						CharacterBody component4 = ((Component)activator).GetComponent<CharacterBody>();
						if (!Object.op_Implicit((Object)(object)component4))
						{
							return false;
						}
						Inventory inventory = component4.inventory;
						if (!Object.op_Implicit((Object)(object)inventory))
						{
							return false;
						}
						int num2 = 0;
						if ((Object)(object)Items.RegeneratingScrap != (Object)null)
						{
							num2 = inventory.GetItemCountEffective(Items.RegeneratingScrap);
						}
						if (num2 >= cost)
						{
							return true;
						}
						return inventory.HasAtLeastXTotalRemovablePermanentItemsOfTier((ItemTier)0, cost - num2);
					}
					if (TradeForRed && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 2)
					{
						CharacterBody component5 = ((Component)activator).GetComponent<CharacterBody>();
						if (!Object.op_Implicit((Object)(object)component5))
						{
							return false;
						}
						Inventory inventory2 = component5.inventory;
						if (!Object.op_Implicit((Object)(object)inventory2))
						{
							return false;
						}
						int num3 = 0;
						if ((Object)(object)Items.RegeneratingScrap != (Object)null)
						{
							num3 = inventory2.GetItemCountEffective(Items.RegeneratingScrap);
						}
						if (num3 >= cost)
						{
							return true;
						}
						return inventory2.HasAtLeastXTotalRemovablePermanentItemsOfTier((ItemTier)2, cost - num3);
					}
					if (TradeForYellow && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 4)
					{
						CharacterBody component6 = ((Component)activator).GetComponent<CharacterBody>();
						if (!Object.op_Implicit((Object)(object)component6))
						{
							return false;
						}
						Inventory inventory3 = component6.inventory;
						if (!Object.op_Implicit((Object)(object)inventory3))
						{
							return false;
						}
						int num4 = 0;
						if ((Object)(object)Items.RegeneratingScrap != (Object)null)
						{
							num4 = inventory3.GetItemCountEffective(Items.RegeneratingScrap);
						}
						if (num4 >= cost)
						{
							return true;
						}
						return inventory3.HasAtLeastXTotalRemovablePermanentItemsOfTier((ItemTier)4, cost - num4);
					}
					return orig.Invoke(self, cost, activator);
				};
				<>c.<>9__14_1 = val2;
				obj2 = (object)val2;
			}
			CostTypeDef.IsAffordable += (hook_IsAffordable)obj2;
			object obj3 = <>c.<>9__14_2;
			if (obj3 == null)
			{
				hook_PayCost val3 = delegate(orig_PayCost orig, CostTypeDef self, PayCostContext context, PayCostResults results)
				{
					//IL_0014: 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_003b: Invalid comparison between Unknown and I4
					//IL_0057: Unknown result type (might be due to invalid IL or missing references)
					//IL_005d: Invalid comparison between Unknown and I4
					//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
					//IL_0103: Unknown result type (might be due to invalid IL or missing references)
					//IL_0115: Unknown result type (might be due to invalid IL or missing references)
					//IL_0137: Unknown result type (might be due to invalid IL or missing references)
					//IL_0139: Unknown result type (might be due to invalid IL or missing references)
					//IL_0184: Unknown result type (might be due to invalid IL or missing references)
					//IL_0191: Unknown result type (might be due to invalid IL or missing references)
					//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
					//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
					//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
					//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
					//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
					//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
					//IL_0313: Unknown result type (might be due to invalid IL or missing references)
					//IL_031d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0267: Unknown result type (might be due to invalid IL or missing references)
					//IL_0293: Unknown result type (might be due to invalid IL or missing references)
					//IL_0298: Unknown result type (might be due to invalid IL or missing references)
					//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
					//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
					//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
					//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
					//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
					//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
					//IL_02cf: Expected O, but got Unknown
					if ((self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 0) || (TradeForRed && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 2) || (TradeForYellow && self.costStringFormatToken == "COST_ITEM_FORMAT" && (int)self.itemTier == 4))
					{
						int num = 0;
						CharacterBody component = ((Component)context.activator).GetComponent<CharacterBody>();
						if (!Object.op_Implicit((Object)(object)component))
						{
							orig.Invoke(self, context, results);
						}
						else
						{
							Inventory activatorInventory = context.activatorInventory;
							if (!Object.op_Implicit((Object)(object)activatorInventory))
							{
								orig.Invoke(self, context, results);
							}
							else
							{
								if ((Object)(object)Items.RegeneratingScrap != (Object)null)
								{
									num = activatorInventory.GetItemCountEffective(Items.RegeneratingScrap);
								}
								ItemTransformation val4;
								if (num >= context.cost)
								{
									val4 = default(ItemTransformation);
									((ItemTransformation)(ref val4)).originalItemIndex = Items.RegeneratingScrap.itemIndex;
									((ItemTransformation)(ref val4)).newItemIndex = Items.RegeneratingScrapConsumed.itemIndex;
									((ItemTransformation)(ref val4)).maxToTransform = context.cost;
									((ItemTransformation)(ref val4)).forbidTempItems = true;
									ItemTransformation val5 = val4;
									TryTransformResult val6 = default(TryTransformResult);
									if (((ItemTransformation)(ref val5)).TryTransform(activatorInventory, ref val6))
									{
										results.AddTakenItemsFromTransformation(ref val6);
									}
								}
								else
								{
									context.cost -= num;
									orig.Invoke(self, context, results);
									if (num > 0)
									{
										val4 = default(ItemTransformation);
										((ItemTransformation)(ref val4)).originalItemIndex = Items.RegeneratingScrap.itemIndex;
										((ItemTransformation)(ref val4)).newItemIndex = Items.RegeneratingScrapConsumed.itemIndex;
										((ItemTransformation)(ref val4)).maxToTransform = num;
										((ItemTransformation)(ref val4)).forbidTempItems = true;
										ItemTransformation val7 = val4;
										TryTransformResult val8 = default(TryTransformResult);
										if (((ItemTransformation)(ref val7)).TryTransform(activatorInventory, ref val8))
										{
											results.AddTakenItemsFromTransformation(ref val8);
										}
										context.cost = num;
									}
								}
								if (num > 0)
								{
									EntitySoundManager.EmitSoundServer(NetworkSoundEventCatalog.FindNetworkSoundEventIndex("Play_item_proc_regenScrap_consume"), ((Component)context.activatorBody).gameObject);
									ModelLocator component2 = ((Component)context.activatorBody).GetComponent<ModelLocator>();
									if (Object.op_Implicit((Object)(object)component))
									{
										Transform modelTransform = component2.modelTransform;
										if (Object.op_Implicit((Object)(object)modelTransform))
										{
											CharacterModel component3 = ((Component)modelTransform).GetComponent<CharacterModel>();
											if (Object.op_Implicit((Object)(object)component3))
											{
												List<GameObject> itemDisplayObjects = component3.GetItemDisplayObjects(Items.RegeneratingScrap.itemIndex);
												if (itemDisplayObjects.Count > 0)
												{
													GameObject val9 = itemDisplayObjects[0];
													GameObject val10 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/RegeneratingScrap/RegeneratingScrapExplosionDisplay.prefab").WaitForCompletion();
													EffectData val11 = new EffectData
													{
														origin = val9.transform.position,
														rotation = val9.transform.rotation
													};
													EffectManager.SpawnEffect(val10, val11, true);
												}
											}
										}
									}
									EffectManager.SimpleMuzzleFlash(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/RegeneratingScrap/RegeneratingScrapExplosionInPrinter.prefab").WaitForCompletion(), context.purchasedObject, "DropPivot", true);
									CharacterMasterNotificationQueue.SendTransformNotification(context.activatorBody.master, Items.RegeneratingScrap.itemIndex, Items.RegeneratingScrapConsumed.itemIndex, (TransformationType)0);
									MultiShopCardUtils.OnNonMoneyPurchase(context);
								}
							}
						}
					}
					else
					{
						orig.Invoke(self, context, results);
					}
				};
				<>c.<>9__14_2 = val3;
				obj3 = (object)val3;
			}
			CostTypeDef.PayCost += (hook_PayCost)obj3;
		}
	}
}