Decompiled source of ScrapMe v0.3.2

plugins/not_score.ScrapMe/ScrapMe.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
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 HG.Reflection;
using HarmonyLib;
using ItemQualities;
using Microsoft.CodeAnalysis;
using RiskOfOptions;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Items;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ScrapMe")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+dd0d94e6831e6d6098a0cc3571d58899b30038d1")]
[assembly: AssemblyProduct("ScrapMe")]
[assembly: AssemblyTitle("ScrapMe")]
[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 ScrapMe
{
	public class BanRecords
	{
		public class CharItemRecord
		{
			internal Dictionary<BodyIndex, HashSet<ItemIndex>> record = new Dictionary<BodyIndex, HashSet<ItemIndex>>();

			public HashSet<ItemIndex> this[BodyIndex index]
			{
				get
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					return GetValue(index);
				}
				set
				{
					//IL_0006: Unknown result type (might be due to invalid IL or missing references)
					record[index] = value;
				}
			}

			private HashSet<ItemIndex> GetValue(BodyIndex key)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: 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)
				if (!record.ContainsKey(key))
				{
					record[key] = new HashSet<ItemIndex>();
				}
				return record[key];
			}
		}

		internal class PresetBans
		{
			private readonly string charName;

			private readonly HashSet<string> itemNames;

			public PresetBans(string bodyName, IEnumerable<string> itemNames)
			{
				charName = bodyName;
				this.itemNames = new HashSet<string>(itemNames);
			}

			[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
			public void Resolve()
			{
				//IL_0019: 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)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Invalid comparison between Unknown and I4
				//IL_006a: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_0074: Invalid comparison between Unknown and I4
				//IL_0097: 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_00e1: Unknown result type (might be due to invalid IL or missing references)
				if (charName == null)
				{
					return;
				}
				BodyIndex val = BodyCatalog.FindBodyIndex(charName);
				if ((int)val == -1)
				{
					Log.Warning("Couldn't find body matching " + charName + ", skipping");
					return;
				}
				HashSet<ItemIndex> hashSet = new HashSet<ItemIndex>();
				foreach (string itemName in itemNames)
				{
					ItemIndex val2 = ItemCatalog.FindItemIndex(itemName);
					if ((int)val2 == -1)
					{
						Log.Message("Couldn't find item matching " + itemName + ", skipping");
					}
					else
					{
						hashSet.Add(val2);
					}
				}
				ScrapMe.plugin.bans.dev[val].UnionWith(hashSet);
				if (QualityCompat.enabled)
				{
					QualityCompat.SetQualityVariantBans(val);
				}
			}
		}

		public CharItemRecord dev = new CharItemRecord();

		internal CharItemRecord quality = new CharItemRecord();

		internal CharItemRecord user = new CharItemRecord();

		internal CharItemRecord unbans = new CharItemRecord();

		internal static readonly List<PresetBans> presets = new List<PresetBans>(2)
		{
			new PresetBans("RobRavagerBody", new <>z__ReadOnlyArray<string>(new string[2] { "JumpBoost", "JumpDamageStrike" })),
			new PresetBans("RobBelmontBody", new <>z__ReadOnlyArray<string>(new string[3] { "BarrierOnCooldown", "JumpBoost", "JumpDamageStrike" }))
		};

		internal IEnumerable<BodyIndex> MappedBodies => dev.record.Keys.Union(quality.record.Keys).Union(user.record.Keys).Union(unbans.record.Keys);

		public HashSet<ItemIndex> All(BodyIndex index, bool withQuality = true)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			IEnumerable<ItemIndex> first = dev[index].Union(user[index]);
			if (withQuality)
			{
				first = first.Union(quality[index]);
			}
			return first.Except(unbans[index]).ToHashSet();
		}
	}
	internal class ConfigManager
	{
		public readonly ConfigEntry<string> charNames = ((BaseUnityPlugin)ScrapMe.plugin).Config.Bind<string>("! Main", "Characters to Change", "", "Characters to look for, comma-separated. Must be as prefab names, i.e. CommandoBody.");

		public readonly Dictionary<string, ConfigEntry<string>> itemBans = new Dictionary<string, ConfigEntry<string>>();

		public readonly Dictionary<string, ConfigEntry<string>> itemUnbans = new Dictionary<string, ConfigEntry<string>>();

		public readonly HashSet<string> mappedChars = new HashSet<string>();

		public bool BindBody(string body)
		{
			if (!mappedChars.Add(body))
			{
				return false;
			}
			ConfigEntry<string> val = ((BaseUnityPlugin)ScrapMe.plugin).Config.Bind<string>("Characters", body + "_ItemBans", "", "Items to auto-scrap for " + body + ", comma-separated, using prefab names, i.e. HealingPotion.");
			itemBans[body] = val;
			RiskOfOptionsCompat.CreateConfigEntry(val);
			ConfigEntry<string> val2 = ((BaseUnityPlugin)ScrapMe.plugin).Config.Bind<string>("Characters", body + "_ItemUnbans", "", "Unbanned items for " + body + ". Use at your own risk; the items were likely banned for a reason.");
			itemUnbans[body] = val2;
			RiskOfOptionsCompat.CreateConfigEntry(val2);
			return true;
		}

		public void Load()
		{
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			((BaseUnityPlugin)ScrapMe.plugin).Config.SaveOnConfigSet = false;
			IEnumerable<string> enumerable = from b in charNames.Value.Split(",")
				select b.Trim() into b
				where !string.IsNullOrEmpty(b)
				select b;
			foreach (string item in enumerable)
			{
				BodyIndex val = BodyCatalog.FindBodyIndex(item);
				BindBody(item);
				HashSet<string> source = new HashSet<string>(from b in itemBans[item].Value.Split(",")
					select b.Trim() into b
					where !string.IsNullOrEmpty(b)
					select b);
				ScrapMe.plugin.bans.user[val] = new HashSet<ItemIndex>(((IEnumerable<string>)source).Select((Func<string, ItemIndex>)ItemCatalog.FindItemIndex));
				HashSet<string> source2 = new HashSet<string>(from b in itemUnbans[item].Value.Split(",")
					select b.Trim() into b
					where !string.IsNullOrEmpty(b)
					select b);
				ScrapMe.plugin.bans.unbans[val] = new HashSet<ItemIndex>(((IEnumerable<string>)source2).Select((Func<string, ItemIndex>)ItemCatalog.FindItemIndex));
				if (QualityCompat.enabled)
				{
					QualityCompat.SetQualityVariantBans(val);
				}
			}
			((BaseUnityPlugin)ScrapMe.plugin).Config.Save();
			((BaseUnityPlugin)ScrapMe.plugin).Config.SaveOnConfigSet = true;
		}

		public void Cleanup()
		{
		}

		public bool UnbindBody(string bodyName)
		{
			if (RiskOfOptionsCompat.mappedEntries.Contains(bodyName))
			{
				return false;
			}
			((BaseUnityPlugin)ScrapMe.plugin).Config.Remove(((ConfigEntryBase)itemBans[bodyName]).Definition);
			((BaseUnityPlugin)ScrapMe.plugin).Config.Remove(((ConfigEntryBase)itemUnbans[bodyName]).Definition);
			return true;
		}
	}
	internal static class Log
	{
		private static ManualLogSource _logSource;

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

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

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

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

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

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

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	public static class QualityCompat
	{
		private static bool? _enabled;

		public static bool enabled
		{
			get
			{
				if (!_enabled.HasValue)
				{
					_enabled = Chainloader.PluginInfos.ContainsKey("com.Gorakh.ItemQualities");
				}
				return _enabled.Value;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static void SetQualityVariantBans()
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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)
			if (!enabled)
			{
				return;
			}
			ScrapMe.plugin.bans.quality.record.Clear();
			foreach (BodyIndex mappedBody in ScrapMe.plugin.bans.MappedBodies)
			{
				SetQualityVariantBans(mappedBody);
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static void SetQualityVariantBans(BodyIndex bodyIndex)
		{
			//IL_0021: 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_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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Invalid comparison between Unknown and I4
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			if (!enabled)
			{
				return;
			}
			HashSet<ItemIndex> hashSet = ScrapMe.plugin.bans.quality[bodyIndex];
			hashSet.Clear();
			foreach (ItemIndex item in ScrapMe.plugin.bans.All(bodyIndex, withQuality: false))
			{
				for (QualityTier val = (QualityTier)(QualityCatalog.GetQualityTier(item) + 1); (int)val < 4; val = (QualityTier)(val + 1))
				{
					ItemIndex itemIndexOfQuality = QualityCatalog.GetItemIndexOfQuality(item, val);
					if ((int)itemIndexOfQuality != -1)
					{
						hashSet.Add(itemIndexOfQuality);
					}
				}
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		internal static ItemIndex CarryQualityToNewItem(ItemIndex oldItem, ItemIndex newItem)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			if (!enabled)
			{
				return newItem;
			}
			if (QualityCatalog.GetQualityTier(oldItem) == QualityCatalog.GetQualityTier(newItem))
			{
				return newItem;
			}
			return QualityCatalog.GetItemIndexOfQuality(newItem, QualityCatalog.GetQualityTier(oldItem));
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		internal static IEnumerable<ItemIndex> GetQualityVariants(ItemIndex baseItemIndex)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected I4, but got Unknown
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected I4, but got Unknown
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected I4, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected I4, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected I4, but got Unknown
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			if (!enabled)
			{
				return new <>z__ReadOnlySingleElementList<ItemIndex>(baseItemIndex);
			}
			ItemQualityGroup itemQualityGroup = QualityCatalog.GetItemQualityGroup(QualityCatalog.FindItemQualityGroupIndex(baseItemIndex));
			return new <>z__ReadOnlyArray<ItemIndex>((ItemIndex[])(object)new ItemIndex[5]
			{
				(ItemIndex)(int)itemQualityGroup.BaseItemIndex,
				(ItemIndex)(int)itemQualityGroup.UncommonItemIndex,
				(ItemIndex)(int)itemQualityGroup.RareItemIndex,
				(ItemIndex)(int)itemQualityGroup.EpicItemIndex,
				(ItemIndex)(int)itemQualityGroup.LegendaryItemIndex
			});
		}
	}
	public static class RiskOfOptionsCompat
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static UnityAction <0>__CreateCurrentBodyEntry;
		}

		private static bool? _enabled;

		internal static readonly HashSet<string> mappedEntries = new HashSet<string>();

		public static bool enabled
		{
			get
			{
				if (!_enabled.HasValue)
				{
					_enabled = Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions");
				}
				return _enabled.Value;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		internal static void InitConfigMenu()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			if (enabled)
			{
				ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(ScrapMe.plugin.configManager.charNames));
				object obj = <>O.<0>__CreateCurrentBodyEntry;
				if (obj == null)
				{
					UnityAction val = CreateCurrentBodyEntry;
					<>O.<0>__CreateCurrentBodyEntry = val;
					obj = (object)val;
				}
				ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Create Entry for Current Character", "! Main", (UnityAction)obj));
				ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Apply Changes", "! Main", new UnityAction(ScrapMe.plugin.configManager.Load)));
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		internal static void CreateCurrentBodyEntry()
		{
			IEnumerable<string> enumerable = PlayerCharacterMasterController.instances.Select((PlayerCharacterMasterController b) => ((Object)b.body).name);
			foreach (string item in enumerable)
			{
				string prefabNameFromClone = Utils.GetPrefabNameFromClone(item);
				if (ScrapMe.plugin.configManager.BindBody(prefabNameFromClone))
				{
					ConfigEntry<string> charNames = ScrapMe.plugin.configManager.charNames;
					charNames.Value = charNames.Value + "," + prefabNameFromClone;
					Log.Info("Created entry for body " + prefabNameFromClone);
				}
				else
				{
					Log.Info("Already had entry for " + prefabNameFromClone + ", skipping");
				}
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		internal static void CreateConfigEntry(ConfigEntry<string> associated)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			if (enabled)
			{
				string key = ((ConfigEntryBase)associated).Definition.Key;
				if (!mappedEntries.Contains(key))
				{
					ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(associated));
					mappedEntries.Add(key);
				}
			}
		}
	}
	public static class RoR2EventHooks
	{
		public static void Register()
		{
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(OnLoad));
			ItemTransformation.onItemTransformedServerGlobal += HandleItemTransform;
		}

		public static void HandleItemTransform(TryTransformResult result)
		{
			//IL_0001: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Invalid comparison between Unknown and I4
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: 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_00a3: 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)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Invalid comparison between Unknown and I4
			//IL_00e0: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			Inventory inventory = result.inventory;
			if ((Object)(object)inventory == (Object)null)
			{
				return;
			}
			ItemIndex itemIndex = result.givenItem.itemIndex;
			if ((int)itemIndex == -1 || Utils.IsCorrespondingVoidInInv(itemIndex, inventory))
			{
				return;
			}
			CharacterMaster component = ((Component)inventory).GetComponent<CharacterMaster>();
			if ((Object)(object)component == (Object)null)
			{
				return;
			}
			CharacterBody body = component.GetBody();
			if ((Object)(object)body == (Object)null || !ScrapMe.plugin.bans.All(body.bodyIndex).Contains(itemIndex))
			{
				return;
			}
			ItemIndex replacementItem = Utils.GetReplacementItem(itemIndex);
			if (replacementItem != itemIndex)
			{
				if ((int)replacementItem == -1)
				{
					Log.Warning($"Replacing transformed item {itemIndex} with no item");
				}
				ItemTransformation val = default(ItemTransformation);
				((ItemTransformation)(ref val)).originalItemIndex = itemIndex;
				((ItemTransformation)(ref val)).newItemIndex = replacementItem;
				((ItemTransformation)(ref val)).maxToTransform = int.MaxValue;
				val.transformationType = (ItemTransformationTypeIndex)(-1);
				ItemTransformation val2 = val;
				TryTransformResult val3 = default(TryTransformResult);
				if (!((ItemTransformation)(ref val2)).TryTransform(inventory, ref val3))
				{
					Log.Warning($"Failed to replace transformed item {itemIndex} with {replacementItem}");
				}
			}
		}

		public static void OnLoad()
		{
			ScrapMe plugin = ScrapMe.plugin;
			plugin.PresetBans();
			plugin.configManager.Load();
			RiskOfOptionsCompat.InitConfigMenu();
		}
	}
	internal static class RoR2Patches
	{
		[HarmonyPatch(typeof(GenericPickupController), "AttemptGrant")]
		[HarmonyPrefix]
		public static void ReplaceWithScrapIfBannedForChar(CharacterBody body, GenericPickupController __instance, bool __runOriginal)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: 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: Invalid comparison between Unknown and I4
			//IL_0098: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Invalid comparison between Unknown and I4
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			if (!__runOriginal || (Object)(object)__instance == (Object)null || (Object)(object)body == (Object)null)
			{
				return;
			}
			HashSet<ItemIndex> hashSet = ScrapMe.plugin.bans.All(body.bodyIndex);
			if (hashSet.Count == 0)
			{
				return;
			}
			UniquePickup pickup = __instance.pickup;
			PickupDef pickupDef = PickupCatalog.GetPickupDef(pickup.pickupIndex);
			if (pickupDef == null || (int)pickupDef.itemIndex == -1)
			{
				return;
			}
			Log.Debug(((Object)body).name + " picking up " + pickupDef.internalName);
			if (hashSet.Contains(pickupDef.itemIndex) && !((Object)(object)body.inventory == (Object)null) && !Utils.IsCorrespondingVoidInInv(pickupDef.itemIndex, body.inventory))
			{
				ItemIndex replacementItem = Utils.GetReplacementItem(pickupDef.itemIndex);
				if ((int)replacementItem != -1)
				{
					ItemDef itemDef = ItemCatalog.GetItemDef(replacementItem);
					PickupIndex val = PickupCatalog.FindPickupIndex(itemDef.itemIndex);
					Log.Info($"Replacing {pickupDef.internalName} with {((Object)itemDef).name} (index {val})");
					__instance.pickup = new UniquePickup
					{
						pickupIndex = val,
						decayValue = __instance.pickup.decayValue,
						upgradeValue = __instance.pickup.upgradeValue
					};
				}
			}
		}
	}
	[BepInPlugin("not_score.ScrapMe", "ScrapMe", "0.3.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ScrapMe : BaseUnityPlugin
	{
		public static ScrapMe plugin;

		public const string PluginGUID = "not_score.ScrapMe";

		public const string PluginAuthor = "not_score";

		public const string PluginName = "ScrapMe";

		public const string PluginVersion = "0.3.0";

		internal ConfigManager configManager;

		internal readonly BanRecords bans = new BanRecords();

		internal void Awake()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			plugin = this;
			Log.Init(((BaseUnityPlugin)this).Logger);
			Harmony val = new Harmony("not_score.ScrapMe");
			val.PatchAll(typeof(RoR2Patches));
			configManager = new ConfigManager();
			RoR2EventHooks.Register();
		}

		public HashSet<ItemIndex> GetDevBans(BodyIndex bodyIndex)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			return ((int)bodyIndex == -1) ? null : bans.dev[bodyIndex];
		}

		internal void PresetBans()
		{
			BanRecords.presets.ForEach(delegate(BanRecords.PresetBans preset)
			{
				preset.Resolve();
			});
		}
	}
	public static class Utils
	{
		private static Dictionary<ItemTier, ItemIndex> scrapLookup = new Dictionary<ItemTier, ItemIndex>();

		[Obsolete]
		public static string GetPrefabNameFromItem(string itemName)
		{
			return itemName.Substring(itemName.IndexOf("Index.") + 6);
		}

		public static ItemIndex GetScrapForTier(ItemTier tier)
		{
			//IL_0006: 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_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected I4, but got Unknown
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: 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: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: 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_00df: Unknown result type (might be due to invalid IL or missing references)
			if (!scrapLookup.ContainsKey(tier))
			{
				switch ((int)tier)
				{
				case 3:
					scrapLookup[tier] = ItemCatalog.FindItemIndex("Pearl");
					break;
				case 0:
				case 6:
					scrapLookup[tier] = ItemCatalog.FindItemIndex("ScrapWhite");
					break;
				case 1:
				case 7:
					scrapLookup[tier] = ItemCatalog.FindItemIndex("ScrapGreen");
					break;
				case 2:
				case 8:
					scrapLookup[tier] = ItemCatalog.FindItemIndex("ScrapRed");
					break;
				case 4:
				case 9:
					scrapLookup[tier] = ItemCatalog.FindItemIndex("ScrapYellow");
					break;
				default:
					Log.Error("Failed to find appropriate replacement for item in tier " + ((Object)ItemTierCatalog.GetItemTierDef(tier)).name);
					return (ItemIndex)0;
				}
			}
			return scrapLookup[tier];
		}

		public static ItemIndex GetReplacementItem(ItemIndex item)
		{
			//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)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: 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)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			ItemIndex scrapForTier = GetScrapForTier(ItemCatalog.GetItemDef(item).tier);
			if (QualityCompat.enabled)
			{
				return QualityCompat.CarryQualityToNewItem(item, scrapForTier);
			}
			return scrapForTier;
		}

		public static string GetPrefabNameFromClone(string cloneName)
		{
			return cloneName.Substring(0, cloneName.LastIndexOf("(Clone)"));
		}

		public static string SanitizePrefabName(string prefabName)
		{
			return prefabName;
		}

		public static void CheckInventory(CharacterBody body)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)body == (Object)null)
			{
				return;
			}
			HashSet<ItemIndex> hashSet = ScrapMe.plugin.bans.All(body.bodyIndex);
			foreach (ItemIndex item in hashSet)
			{
				int itemCountPermanent = body.inventory.GetItemCountPermanent(item);
				if (itemCountPermanent > 0)
				{
					body.inventory.RemoveItemPermanent(item, itemCountPermanent);
					body.inventory.GiveItemPermanent(GetReplacementItem(item), itemCountPermanent);
				}
				float tempItemRawValue = body.inventory.GetTempItemRawValue(item);
				if (tempItemRawValue > 0f)
				{
					body.inventory.RemoveItemTemp(item, (float)(int)Math.Ceiling(tempItemRawValue));
					body.inventory.GiveItemTemp(GetReplacementItem(item), tempItemRawValue);
				}
			}
		}

		public static bool IsCorrespondingVoidInInv(ItemIndex item, Inventory inv)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			return GetCorrespondingVoids(item).Any((ItemIndex i) => (int)i != -1 && inv.GetItemCountEffective(i) > 0);
		}

		internal static IEnumerable<ItemIndex> GetCorrespondingVoids(ItemIndex corruptionCheck)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: 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)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			ItemIndex transformedItemIndex = ContagiousItemManager.GetTransformedItemIndex(corruptionCheck);
			if ((int)transformedItemIndex == -1)
			{
				return Array.Empty<ItemIndex>();
			}
			if (QualityCompat.enabled)
			{
				return QualityCompat.GetQualityVariants(transformedItemIndex);
			}
			return new <>z__ReadOnlySingleElementList<ItemIndex>(transformedItemIndex);
		}
	}
}
[CompilerGenerated]
internal sealed class <>z__ReadOnlyArray<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T>
{
	int ICollection.Count => _items.Length;

	bool ICollection.IsSynchronized => false;

	object ICollection.SyncRoot => this;

	object IList.this[int index]
	{
		get
		{
			return _items[index];
		}
		set
		{
			throw new NotSupportedException();
		}
	}

	bool IList.IsFixedSize => true;

	bool IList.IsReadOnly => true;

	int IReadOnlyCollection<T>.Count => _items.Length;

	T IReadOnlyList<T>.this[int index] => _items[index];

	int ICollection<T>.Count => _items.Length;

	bool ICollection<T>.IsReadOnly => true;

	T IList<T>.this[int index]
	{
		get
		{
			return _items[index];
		}
		set
		{
			throw new NotSupportedException();
		}
	}

	public <>z__ReadOnlyArray(T[] items)
	{
		_items = items;
	}

	IEnumerator IEnumerable.GetEnumerator()
	{
		return ((IEnumerable)_items).GetEnumerator();
	}

	void ICollection.CopyTo(Array array, int index)
	{
		((ICollection)_items).CopyTo(array, index);
	}

	int IList.Add(object value)
	{
		throw new NotSupportedException();
	}

	void IList.Clear()
	{
		throw new NotSupportedException();
	}

	bool IList.Contains(object value)
	{
		return ((IList)_items).Contains(value);
	}

	int IList.IndexOf(object value)
	{
		return ((IList)_items).IndexOf(value);
	}

	void IList.Insert(int index, object value)
	{
		throw new NotSupportedException();
	}

	void IList.Remove(object value)
	{
		throw new NotSupportedException();
	}

	void IList.RemoveAt(int index)
	{
		throw new NotSupportedException();
	}

	IEnumerator<T> IEnumerable<T>.GetEnumerator()
	{
		return ((IEnumerable<T>)_items).GetEnumerator();
	}

	void ICollection<T>.Add(T item)
	{
		throw new NotSupportedException();
	}

	void ICollection<T>.Clear()
	{
		throw new NotSupportedException();
	}

	bool ICollection<T>.Contains(T item)
	{
		return ((ICollection<T>)_items).Contains(item);
	}

	void ICollection<T>.CopyTo(T[] array, int arrayIndex)
	{
		((ICollection<T>)_items).CopyTo(array, arrayIndex);
	}

	bool ICollection<T>.Remove(T item)
	{
		throw new NotSupportedException();
	}

	int IList<T>.IndexOf(T item)
	{
		return ((IList<T>)_items).IndexOf(item);
	}

	void IList<T>.Insert(int index, T item)
	{
		throw new NotSupportedException();
	}

	void IList<T>.RemoveAt(int index)
	{
		throw new NotSupportedException();
	}
}
[CompilerGenerated]
internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T>
{
	private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T>
	{
		object IEnumerator.Current => _item;

		T IEnumerator<T>.Current => _item;

		public Enumerator(T item)
		{
			_item = item;
		}

		bool IEnumerator.MoveNext()
		{
			return !_moveNextCalled && (_moveNextCalled = true);
		}

		void IEnumerator.Reset()
		{
			_moveNextCalled = false;
		}

		void IDisposable.Dispose()
		{
		}
	}

	int ICollection.Count => 1;

	bool ICollection.IsSynchronized => false;

	object ICollection.SyncRoot => this;

	object IList.this[int index]
	{
		get
		{
			if (index != 0)
			{
				throw new IndexOutOfRangeException();
			}
			return _item;
		}
		set
		{
			throw new NotSupportedException();
		}
	}

	bool IList.IsFixedSize => true;

	bool IList.IsReadOnly => true;

	int IReadOnlyCollection<T>.Count => 1;

	T IReadOnlyList<T>.this[int index]
	{
		get
		{
			if (index != 0)
			{
				throw new IndexOutOfRangeException();
			}
			return _item;
		}
	}

	int ICollection<T>.Count => 1;

	bool ICollection<T>.IsReadOnly => true;

	T IList<T>.this[int index]
	{
		get
		{
			if (index != 0)
			{
				throw new IndexOutOfRangeException();
			}
			return _item;
		}
		set
		{
			throw new NotSupportedException();
		}
	}

	public <>z__ReadOnlySingleElementList(T item)
	{
		_item = item;
	}

	IEnumerator IEnumerable.GetEnumerator()
	{
		return new Enumerator(_item);
	}

	void ICollection.CopyTo(Array array, int index)
	{
		array.SetValue(_item, index);
	}

	int IList.Add(object value)
	{
		throw new NotSupportedException();
	}

	void IList.Clear()
	{
		throw new NotSupportedException();
	}

	bool IList.Contains(object value)
	{
		return EqualityComparer<T>.Default.Equals(_item, (T)value);
	}

	int IList.IndexOf(object value)
	{
		return (!EqualityComparer<T>.Default.Equals(_item, (T)value)) ? (-1) : 0;
	}

	void IList.Insert(int index, object value)
	{
		throw new NotSupportedException();
	}

	void IList.Remove(object value)
	{
		throw new NotSupportedException();
	}

	void IList.RemoveAt(int index)
	{
		throw new NotSupportedException();
	}

	IEnumerator<T> IEnumerable<T>.GetEnumerator()
	{
		return new Enumerator(_item);
	}

	void ICollection<T>.Add(T item)
	{
		throw new NotSupportedException();
	}

	void ICollection<T>.Clear()
	{
		throw new NotSupportedException();
	}

	bool ICollection<T>.Contains(T item)
	{
		return EqualityComparer<T>.Default.Equals(_item, item);
	}

	void ICollection<T>.CopyTo(T[] array, int arrayIndex)
	{
		array[arrayIndex] = _item;
	}

	bool ICollection<T>.Remove(T item)
	{
		throw new NotSupportedException();
	}

	int IList<T>.IndexOf(T item)
	{
		return (!EqualityComparer<T>.Default.Equals(_item, item)) ? (-1) : 0;
	}

	void IList<T>.Insert(int index, T item)
	{
		throw new NotSupportedException();
	}

	void IList<T>.RemoveAt(int index)
	{
		throw new NotSupportedException();
	}
}