Decompiled source of RUS DeadCellsCustomItems v1.0.3

plugins/DeadCellsCustomItems-v1.0.1_rus.dll

Decompiled 6 months ago
using 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 Characters;
using Characters.Abilities;
using Characters.Gear;
using Characters.Gear.Items;
using Characters.Gear.Synergy.Inscriptions;
using Characters.Player;
using DeadCellsCustomItems.CustomAbilities;
using GameResources;
using HarmonyLib;
using Level;
using Microsoft.CodeAnalysis;
using Services;
using Singletons;
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(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Plugins.Common")]
[assembly: IgnoresAccessChecksTo("Plugins.Singletons")]
[assembly: IgnoresAccessChecksTo("Unity.Addressables")]
[assembly: AssemblyCompany("DeadCellsCustomItems")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Archlich has a fixed Death Trap skill. Infinite bone is happy again!")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+3a1355d4102e589326274b0336a681e4570f4db9")]
[assembly: AssemblyProduct("DeadCellsCustomItems")]
[assembly: AssemblyTitle("DeadCellsCustomItems")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.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;
		}
	}
}
[Serializable]
public sealed class ChangeItemWhenKilledBoss : MonoBehaviour
{
	[SerializeField]
	private Item _item = null;

	private void Awake()
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Expected O, but got Unknown
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		Character player = Singleton<Service>.Instance.levelManager.player;
		player.onKilled = (OnKilledDelegate)Delegate.Combine((Delegate?)(object)player.onKilled, (Delegate?)new OnKilledDelegate(CheckUpdateCondition));
	}

	private void OnDestroy()
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Expected O, but got Unknown
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		Character player = Singleton<Service>.Instance.levelManager.player;
		player.onKilled = (OnKilledDelegate)Delegate.Remove((Delegate?)(object)player.onKilled, (Delegate?)new OnKilledDelegate(CheckUpdateCondition));
	}

	private void CheckUpdateCondition(ITarget target, ref Damage damage)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Invalid comparison between Unknown and I4
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Invalid comparison between Unknown and I4
		//IL_0085: 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_009e: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		Character character = target.character;
		ItemReference val = default(ItemReference);
		if ((int)character.type == 3 && GearResource.instance.TryGetItemReferenceByName(((Object)_item).name.Substring(0, ((Object)_item).name.Length - 2), ref val))
		{
			ItemRequest val2 = val.LoadAsync();
			((Request<Item>)(object)val2).WaitForCompletion();
			if ((int)((Gear)_item).state == 1)
			{
				Item val3 = Singleton<Service>.Instance.levelManager.DropItem(val2, Vector3.zero);
				val3.keyword1 = _item.keyword1;
				val3.keyword2 = _item.keyword2;
				((Gear)val3)._gearTag = ((Gear)_item)._gearTag;
				_item.ChangeOnInventory(val3);
			}
		}
	}
}
[Serializable]
public sealed class ChangeItemWhenLowHealth : MonoBehaviour
{
	[SerializeField]
	private Item _item = null;

	private void Awake()
	{
		((Health)Singleton<Service>.Instance.levelManager.player.health).onChanged += CheckUpdateCondition;
	}

	private void OnDestroy()
	{
		((Health)Singleton<Service>.Instance.levelManager.player.health).onChanged -= CheckUpdateCondition;
	}

	private void CheckUpdateCondition()
	{
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Invalid comparison between Unknown and I4
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
		CharacterHealth health = Singleton<Service>.Instance.levelManager.player.health;
		if (!(((Health)health).percent < 0.2))
		{
			return;
		}
		((Health)health).Heal(((Health)health).maximumHealth / 10.0 * 4.0, true);
		ItemReference val = default(ItemReference);
		if (GearResource.instance.TryGetItemReferenceByName(((Object)_item).name + "_2", ref val))
		{
			ItemRequest val2 = val.LoadAsync();
			((Request<Item>)(object)val2).WaitForCompletion();
			if ((int)((Gear)_item).state == 1)
			{
				Item val3 = Singleton<Service>.Instance.levelManager.DropItem(val2, Vector3.zero);
				val3.keyword1 = _item.keyword1;
				val3.keyword2 = _item.keyword2;
				((Gear)val3)._gearTag = ((Gear)_item)._gearTag;
				_item.ChangeOnInventory(val3);
			}
		}
	}
}
[Serializable]
public sealed class MysteriousScrollKeyWordRandomizer : KeywordRandomizer
{
	private void Awake()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		((KeywordRandomizer)this).Awake();
		base._item.keyword1 = (Key)29;
		SecondInscriptionRandomizer();
	}

	private void SecondInscriptionRandomizer()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: 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_007e: Unknown result type (might be due to invalid IL or missing references)
		Random random = new Random();
		int num = random.Next(0, 4);
		if (num >= 0 && num < 1)
		{
			base._item.keyword2 = (Key)5;
		}
		if (num >= 1 && num < 2)
		{
			base._item.keyword2 = (Key)18;
		}
		if (num >= 2 && num < 3)
		{
			base._item.keyword2 = (Key)25;
		}
		if (num == 3)
		{
			base._item.keyword2 = (Key)36;
		}
	}
}
[Serializable]
public sealed class UpgradeMysteriousScroll : MonoBehaviour
{
	[SerializeField]
	private Item _item = null;

	private void Awake()
	{
		Singleton<Service>.Instance.levelManager.player.playerComponents.inventory.onUpdatedKeywordCounts += CheckUpdateCondition;
	}

	private void OnDestroy()
	{
		Singleton<Service>.Instance.levelManager.player.playerComponents.inventory.onUpdatedKeywordCounts -= CheckUpdateCondition;
	}

	private void CheckUpdateCondition()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Invalid comparison between Unknown and I4
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Invalid comparison between Unknown and I4
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Invalid comparison between Unknown and I4
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Invalid comparison between Unknown and I4
		//IL_021a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0221: Invalid comparison between Unknown and I4
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_010a: Invalid comparison between Unknown and I4
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: 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_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01be: Invalid comparison between Unknown and I4
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: 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_0145: 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_026c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0272: Invalid comparison between Unknown and I4
		//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0287: Unknown result type (might be due to invalid IL or missing references)
		//IL_029b: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
		ItemReference val = default(ItemReference);
		if ((int)_item.keyword2 == 5 && GearResource.instance.TryGetItemReferenceByName(((Object)_item).name + "_1", ref val))
		{
			ItemRequest val2 = val.LoadAsync();
			((Request<Item>)(object)val2).WaitForCompletion();
			if ((int)((Gear)_item).state == 1)
			{
				Item val3 = Singleton<Service>.Instance.levelManager.DropItem(val2, Vector3.zero);
				val3.keyword1 = _item.keyword1;
				val3.keyword2 = _item.keyword2;
				_item.ChangeOnInventory(val3);
			}
		}
		ItemReference val4 = default(ItemReference);
		if ((int)_item.keyword2 == 18 && GearResource.instance.TryGetItemReferenceByName(((Object)_item).name + "_2", ref val4))
		{
			ItemRequest val5 = val4.LoadAsync();
			((Request<Item>)(object)val5).WaitForCompletion();
			if ((int)((Gear)_item).state == 1)
			{
				Item val6 = Singleton<Service>.Instance.levelManager.DropItem(val5, Vector3.zero);
				val6.keyword1 = _item.keyword1;
				val6.keyword2 = _item.keyword2;
				_item.ChangeOnInventory(val6);
			}
		}
		ItemReference val7 = default(ItemReference);
		if ((int)_item.keyword2 == 25 && GearResource.instance.TryGetItemReferenceByName(((Object)_item).name + "_3", ref val7))
		{
			ItemRequest val8 = val7.LoadAsync();
			((Request<Item>)(object)val8).WaitForCompletion();
			if ((int)((Gear)_item).state == 1)
			{
				Item val9 = Singleton<Service>.Instance.levelManager.DropItem(val8, Vector3.zero);
				val9.keyword1 = _item.keyword1;
				val9.keyword2 = _item.keyword2;
				_item.ChangeOnInventory(val9);
			}
		}
		ItemReference val10 = default(ItemReference);
		if ((int)_item.keyword2 == 36 && GearResource.instance.TryGetItemReferenceByName(((Object)_item).name + "_4", ref val10))
		{
			ItemRequest val11 = val10.LoadAsync();
			((Request<Item>)(object)val11).WaitForCompletion();
			if ((int)((Gear)_item).state == 1)
			{
				Item val12 = Singleton<Service>.Instance.levelManager.DropItem(val11, Vector3.zero);
				val12.keyword1 = _item.keyword1;
				val12.keyword2 = _item.keyword2;
				_item.ChangeOnInventory(val12);
			}
		}
	}
}
namespace DeadCellsCustomItems
{
	[Serializable]
	public class CustomItemReference : ItemReference
	{
		private string _originalName;

		public string itemName_EN;

		public string itemName_KR;

		public string itemDescription_EN;

		public string itemDescription_KR;

		public string itemLore_EN;

		public string itemLore_KR;

		public Values stats;

		public Ability[] abilities;

		public Type[] extraComponents;

		public string[] forbiddenDrops = new string[0];

		public Sprite miniIcon;

		private Item item = null;

		private static GameObject rootObj;

		public string name
		{
			get
			{
				return ((GearReference)this).name;
			}
			set
			{
				_originalName = value;
				((GearReference)this).name = "Custom-" + _originalName;
				((GearReference)this).guid = "custom_item://" + value;
				((GearReference)this).displayNameKey = "item/" + ((GearReference)this).name + "/name";
			}
		}

		public string itemName => itemName_EN;

		public string itemDescription => itemDescription_EN;

		public string itemLore => itemLore_EN;

		public CustomItemReference()
		{
			((GearReference)this).obtainable = true;
			((GearReference)this).needUnlock = false;
			((GearReference)this).path = "Assets/Gear/Items/BasicCarleonSword.prefab";
		}

		public Item GetItem(Item baseItem)
		{
			//IL_008c: 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_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: 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)
			//IL_0034: Expected O, but got Unknown
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Expected O, but got Unknown
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Expected O, but got Unknown
			//IL_01a2: Expected O, but got Unknown
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Expected O, but got Unknown
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Expected O, but got Unknown
			if ((Object)(object)item == (Object)null)
			{
				if ((Object)(object)rootObj == (Object)null)
				{
					rootObj = new GameObject("CustomItems");
					rootObj.SetActive(false);
					Object.DontDestroyOnLoad((Object)(object)rootObj);
				}
				item = Object.Instantiate<Item>(baseItem, rootObj.transform);
				Object.DontDestroyOnLoad((Object)(object)item);
				((Object)((Component)item).gameObject).name = name;
				item.keyword1 = base.prefabKeyword1;
				item.keyword2 = base.prefabKeyword2;
				((Gear)item)._stat = stats;
				((Gear)item)._rarity = ((GearReference)this).rarity;
				((Gear)item)._gearTag = ((GearReference)this).gearTag;
				((Gear)item)._groupItemKeys = forbiddenDrops.Select((string name) => "Custom-" + name).ToArray();
				LoadSprites();
				if ((Object)(object)((GearReference)this).icon != (Object)null)
				{
					((Gear)item).dropped.spriteRenderer.sprite = ((GearReference)this).icon;
				}
				if (abilities != null && abilities.Length != 0)
				{
					GameObject val = new GameObject("Ability Attacher");
					val.transform.parent = ((Component)item).gameObject.transform;
					Item obj = item;
					Subcomponents val2 = new Subcomponents();
					Subcomponents val3 = val2;
					obj._abilityAttacher = val2;
					Subcomponents val4 = val3;
					((SubcomponentArray<AbilityAttacher>)(object)val4)._container = val;
					((SubcomponentArray<AbilityAttacher>)(object)val4)._components = (AbilityAttacher[])(object)new AbilityAttacher[abilities.Length];
					abilities[0]._defaultIcon = miniIcon;
					for (int i = 0; i < abilities.Length; i++)
					{
						GameObject val5 = new GameObject("[" + i + "]", new Type[1] { typeof(AlwaysAbilityAttacher) });
						val5.transform.parent = val.transform;
						AlwaysAbilityAttacher component = val5.GetComponent<AlwaysAbilityAttacher>();
						component._abilityComponent = CreateAbilityObject(val5, abilities[i]);
						((SubcomponentArray<AbilityAttacher>)(object)val4)._components[i] = (AbilityAttacher)(object)component;
					}
				}
				if (extraComponents != null && extraComponents.Length != 0)
				{
					GameObject val6 = new GameObject("Extra Behaviors");
					val6.transform.parent = ((Component)item).gameObject.transform;
					Type[] array = extraComponents;
					foreach (Type type in array)
					{
						Component obj2 = val6.AddComponent(type);
						FieldInfo fieldInfo = AccessTools.Field(type, "_item");
						if (fieldInfo != null)
						{
							fieldInfo.SetValue(obj2, item);
						}
					}
				}
			}
			return item;
		}

		private static AbilityComponent CreateAbilityObject(GameObject parent, Ability ability)
		{
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			Type abilityType = ((object)ability).GetType();
			Assembly assembly = abilityType.Assembly;
			string componentName = abilityType.Name + "Component";
			Type[] array = (from type in assembly.GetTypes()
				where string.Equals(type.Namespace, abilityType.Namespace, StringComparison.Ordinal) && string.Equals(type.Name, componentName, StringComparison.Ordinal)
				select type).ToArray();
			if (array.Length == 1)
			{
				Type type2 = array[0];
				GameObject val = new GameObject("Ability", new Type[1] { type2 });
				val.transform.parent = parent.transform;
				FieldInfo fieldInfo = AccessTools.Field(type2, "_ability");
				Component component = val.GetComponent(type2);
				fieldInfo.SetValue(component, ability);
				return (AbilityComponent)component;
			}
			throw new NotImplementedException("Ability Component Type " + componentName + " not found.");
		}

		public void LoadSprites()
		{
			GetIcon();
			GetThumbnail();
			GetMiniIcon();
		}

		public Sprite GetIcon()
		{
			if ((Object)(object)((GearReference)this).icon == (Object)null)
			{
				((GearReference)this).icon = LoadSprite("Icon", 32f);
			}
			return ((GearReference)this).icon;
		}

		public Sprite GetThumbnail()
		{
			if ((Object)(object)((GearReference)this).thumbnail == (Object)null)
			{
				((GearReference)this).thumbnail = LoadSprite("Thumbnail", 32f);
				if ((Object)(object)((GearReference)this).thumbnail != (Object)null)
				{
					((Object)((GearReference)this).thumbnail).name = name;
				}
			}
			return ((GearReference)this).thumbnail;
		}

		public Sprite GetMiniIcon()
		{
			if ((Object)(object)miniIcon == (Object)null)
			{
				miniIcon = LoadSprite("AbilityIcon", 36f);
				if ((Object)(object)miniIcon != (Object)null)
				{
					((Object)miniIcon).name = name;
				}
			}
			return miniIcon;
		}

		private Sprite LoadSprite(string type, float pixelsPerUnit)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_00b4: 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)
			Sprite result = null;
			try
			{
				Assembly assembly = typeof(CustomItemReference).Assembly;
				Stream manifestResourceStream = assembly.GetManifestResourceStream("DeadCellsCustomItems.Sprites." + _originalName + "." + type + ".png");
				byte[] array = new byte[manifestResourceStream.Length];
				manifestResourceStream.Read(array, 0, (int)manifestResourceStream.Length);
				Texture2D val = new Texture2D(2, 2);
				ImageConversion.LoadImage(val, array);
				((Texture)val).filterMode = (FilterMode)0;
				int num = Math.Max(((Texture)val).width, ((Texture)val).height);
				result = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), pixelsPerUnit);
			}
			catch (Exception)
			{
			}
			return result;
		}
	}
	public class CustomItems
	{
		public static readonly List<CustomItemReference> Items = InitializeItems();

		private static List<CustomItemReference> InitializeItems()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Expected O, but got Unknown
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Expected O, but got Unknown
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Expected O, but got Unknown
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Expected O, but got Unknown
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Expected O, but got Unknown
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024d: 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_02f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0300: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Expected O, but got Unknown
			//IL_0352: Unknown result type (might be due to invalid IL or missing references)
			//IL_0358: Expected O, but got Unknown
			//IL_0358: Unknown result type (might be due to invalid IL or missing references)
			//IL_0362: Expected O, but got Unknown
			//IL_038c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_041b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0421: Expected O, but got Unknown
			//IL_0436: Unknown result type (might be due to invalid IL or missing references)
			//IL_043c: Expected O, but got Unknown
			//IL_043c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0446: Expected O, but got Unknown
			//IL_0470: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0505: Expected O, but got Unknown
			//IL_051a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0520: Expected O, but got Unknown
			//IL_0520: Unknown result type (might be due to invalid IL or missing references)
			//IL_052a: Expected O, but got Unknown
			//IL_0554: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e9: Expected O, but got Unknown
			//IL_05fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0604: Expected O, but got Unknown
			//IL_0619: Unknown result type (might be due to invalid IL or missing references)
			//IL_061f: Expected O, but got Unknown
			//IL_0634: Unknown result type (might be due to invalid IL or missing references)
			//IL_063a: Expected O, but got Unknown
			//IL_063a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0644: Expected O, but got Unknown
			//IL_0666: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_06bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_06fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_074b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0754: Unknown result type (might be due to invalid IL or missing references)
			//IL_079d: Unknown result type (might be due to invalid IL or missing references)
			//IL_07ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_07f6: Unknown result type (might be due to invalid IL or missing references)
			List<CustomItemReference> list = new List<CustomItemReference>();
			CustomItemReference customItemReference = new CustomItemReference();
			customItemReference.name = "CursedSword";
			((GearReference)customItemReference).rarity = (Rarity)3;
			customItemReference.itemName_EN = "Проклятый меч";
			customItemReference.itemName_KR = "저주받은 검";
			customItemReference.itemDescription_EN = "Увеличивает <color=#F25D1C>физическую атаку</color> на 1000% и усиливает <color=#F25D1C>физический урон</color> на 400%..\nМгновенная смерть при получении урона, ни ртутные сердца, ни броня не работают.";
			customItemReference.itemDescription_KR = "<color=#F25D1C>물리공격력</color>이 1000% 증가 및 300% 증폭됩니다.\n피격 시 무적과 패링을 제외한 모든 피해 무효화 수단을 무시하고 즉사합니다.";
			customItemReference.itemLore_EN = "Убей, пока тебя не убили. Просто, правда?";
			customItemReference.itemLore_KR = "자, 죽기 전에 죽이면 돼. 간단하지?";
			((ItemReference)customItemReference).prefabKeyword1 = (Key)10;
			((ItemReference)customItemReference).prefabKeyword2 = (Key)2;
			customItemReference.stats = new Values((Value[])(object)new Value[2]
			{
				new Value(Category.PercentPoint, Kind.PhysicalAttackDamage, 10.0),
				new Value(Category.Percent, Kind.PhysicalAttackDamage, 5.0)
			});
			customItemReference.abilities = (Ability[])(object)new Ability[1]
			{
				new InstaKillIgnoringNegation()
			};
			list.Add(customItemReference);
			CustomItemReference customItemReference2 = new CustomItemReference();
			customItemReference2.name = "MysteriousScroll";
			((GearReference)customItemReference2).rarity = (Rarity)2;
			customItemReference2.itemName_EN = "Таинственный свиток";
			customItemReference2.itemName_KR = "미지의 두루마리";
			customItemReference2.itemDescription_EN = "Увеличивает <color=#F25D1C>физическую атаку</color> на 25%.\nУвеличивает скорость перезарядки навыков на 25%.\nУменьшает входящий урон на 10%.\nУвеличивает максимальное количество ОЗ на 30.\nВторая надпись этого предмета выбирается случайным образом между Отвагой, Циклом маны, Местью и Загадкой.\nУлучшенная версия этого предмета меняется в зависимости от его второй надписи.";
			customItemReference2.itemDescription_KR = "<color=#F25D1C>물리공격력</color>이 25% 증가합니다.\n스킬 쿨다운 속도가 25% 증가합니다.\n받는 데미지가 10% 감소합니다.\n최대체력이 20 증가합니다\n이 아이템의 두번째 각인은 임의로 용기, 마나 순환, 복수, 그리고 신비중 하나로 지정됩니다.\n이 아이템의 강화된 버전은 두번째 각인에 따라 바뀝니다.";
			customItemReference2.itemLore_EN = "Незнание того, что внутри, делает его ценным.";
			customItemReference2.itemLore_KR = "안에 뭐가 들었는지 모르니까 가치가 있는 법이다.";
			((ItemReference)customItemReference2).prefabKeyword1 = (Key)29;
			((ItemReference)customItemReference2).prefabKeyword2 = (Key)0;
			customItemReference2.stats = new Values((Value[])(object)new Value[4]
			{
				new Value(Category.PercentPoint, Kind.PhysicalAttackDamage, 0.25),
				new Value(Category.PercentPoint, Kind.SkillCooldownSpeed, 0.25),
				new Value(Category.Percent, Kind.TakingDamage, 0.9),
				new Value(Category.Fixed, Kind.Health, 20.0)
			});
			customItemReference2.extraComponents = new Type[1] { typeof(MysteriousScrollKeyWordRandomizer) };
			list.Add(customItemReference2);
			CustomItemReference customItemReference3 = new CustomItemReference();
			customItemReference3.name = "MysteriousScroll_2";
			((GearReference)customItemReference3).obtainable = false;
			((GearReference)customItemReference3).rarity = (Rarity)2;
			customItemReference3.itemName_EN = "Свиток силы: Эволюция";
			customItemReference3.itemName_KR = "권능의 두루마리: 진화체";
			customItemReference3.itemDescription_EN = "Если этот предмет был найден непреднамеренно, пожалуйста, сообщите мне как можно скорее!";
			customItemReference3.itemDescription_KR = "만약 예기치 않게 이 아이템을 발견하셨다면, 저한테 바로 신고해주세요!";
			customItemReference3.itemLore_EN = "О-откуда ты это взял...?";
			customItemReference3.itemLore_KR = "뭐야... 이거 어디서 가져온거야..?";
			((ItemReference)customItemReference3).prefabKeyword1 = (Key)29;
			((ItemReference)customItemReference3).prefabKeyword2 = (Key)0;
			customItemReference3.forbiddenDrops = new string[1] { "MysteriousScroll" };
			customItemReference3.extraComponents = new Type[1] { typeof(UpgradeMysteriousScroll) };
			list.Add(customItemReference3);
			CustomItemReference customItemReference4 = new CustomItemReference();
			customItemReference4.name = "MysteriousScroll_2_1";
			((GearReference)customItemReference4).obtainable = false;
			((GearReference)customItemReference4).rarity = (Rarity)2;
			customItemReference4.itemName_EN = "Свиток силы: Жестокость";
			customItemReference4.itemName_KR = "권능의 두루마리: 잔혹성";
			customItemReference4.itemDescription_EN = "Увеличивает <color=#F25D1C>физическую атаку</color> на 75%.\nУвеличивает максимальное количество ОЗ на 55.";
			customItemReference4.itemDescription_KR = "<color=#F25D1C>물리공격력</color>이 75% 증가합니다.\n최대체력이 55 증가합니다.";
			customItemReference4.itemLore_EN = "Свиток силы, олицетворяющий жестокость.\nТолько истинные бойцы могут научиться использовать этот свиток.";
			customItemReference4.itemLore_KR = "잔혹성을 대표하는 권능의 두루마리.\n진정한 싸움꾼들만이 이 두루마리를 응용할 수 있다.";
			((ItemReference)customItemReference4).prefabKeyword1 = (Key)0;
			((ItemReference)customItemReference4).prefabKeyword2 = (Key)0;
			customItemReference4.forbiddenDrops = new string[1] { "MysteriousScroll" };
			customItemReference4.stats = new Values((Value[])(object)new Value[2]
			{
				new Value(Category.PercentPoint, Kind.PhysicalAttackDamage, 0.75),
				new Value(Category.Fixed, Kind.Health, 55.0)
			});
			list.Add(customItemReference4);
			CustomItemReference customItemReference5 = new CustomItemReference();
			customItemReference5.name = "MysteriousScroll_2_2";
			((GearReference)customItemReference5).obtainable = false;
			((GearReference)customItemReference5).rarity = (Rarity)2;
			customItemReference5.itemName_EN = "Свиток силы: Тактика";
			customItemReference5.itemName_KR = "권능의 두루마리: 전략가";
			customItemReference5.itemDescription_EN = "Увеличивает скорость перезарядки навыков на 75%.\nУвеличивает максимальное ОЗ на 40.";
			customItemReference5.itemDescription_KR = "스킬 쿨다운 속도가 75% 증가합니다.\n최대체력이 40 증가합니다.";
			customItemReference5.itemLore_EN = "Свиток силы, представляющий тактику.\nВсегда помните, что терпение - ключ к победе";
			customItemReference5.itemLore_KR = "전략가를 대표하는 권능의 두루마리.\n침착함이야말로 승리를 향한 길임을 명심하자.";
			((ItemReference)customItemReference5).prefabKeyword1 = (Key)0;
			((ItemReference)customItemReference5).prefabKeyword2 = (Key)0;
			customItemReference5.forbiddenDrops = new string[1] { "MysteriousScroll" };
			customItemReference5.stats = new Values((Value[])(object)new Value[2]
			{
				new Value(Category.PercentPoint, Kind.SkillCooldownSpeed, 0.75),
				new Value(Category.Fixed, Kind.Health, 40.0)
			});
			list.Add(customItemReference5);
			CustomItemReference customItemReference6 = new CustomItemReference();
			customItemReference6.name = "MysteriousScroll_2_3";
			((GearReference)customItemReference6).obtainable = false;
			((GearReference)customItemReference6).rarity = (Rarity)2;
			customItemReference6.itemName_EN = "Свиток силы: Выживание";
			customItemReference6.itemName_KR = "권능의 두루마리: 생존술";
			customItemReference6.itemDescription_EN = "Снижает входящий урон на 30%.\nУвеличивает максимальное количество ОЗ на 60";
			customItemReference6.itemDescription_KR = "받는 데미지가 30% 감소합니다.\n최대체력이 60 증가합니다.";
			customItemReference6.itemLore_EN = "Свиток силы, олицетворяющий выживание.\nНе сильнейший выживает, а выживший становится сильнейшим.";
			customItemReference6.itemLore_KR = "생존술을 대표하는 권능의 두루마리.\n강한 자가 살아남는 것이 아니라, 살아남는 자가 강한 것이다.";
			((ItemReference)customItemReference6).prefabKeyword1 = (Key)0;
			((ItemReference)customItemReference6).prefabKeyword2 = (Key)0;
			customItemReference6.forbiddenDrops = new string[1] { "MysteriousScroll" };
			customItemReference6.stats = new Values((Value[])(object)new Value[2]
			{
				new Value(Category.Percent, Kind.TakingDamage, 0.7),
				new Value(Category.Fixed, Kind.Health, 60.0)
			});
			list.Add(customItemReference6);
			CustomItemReference customItemReference7 = new CustomItemReference();
			customItemReference7.name = "MysteriousScroll_2_4";
			((GearReference)customItemReference7).obtainable = false;
			((GearReference)customItemReference7).rarity = (Rarity)2;
			customItemReference7.itemName_EN = "Эпический свиток силы";
			customItemReference7.itemName_KR = "전능의 두루마리";
			customItemReference7.itemDescription_EN = "Увеличивает <color=#F25D1C>физическую атаку</color> на 40%.\nУвеличивает скорость перезарядки навыков на 40%.\nУменьшает входящий урон на 20%.\nУвеличивает максимальное количество ОЗ на 45.";
			customItemReference7.itemDescription_KR = "<color=#F25D1C>물리공격력</color>이 40% 증가합니다.\n스킬 쿨다운 속도가 40% 증가합니다.\n받는 데미지가 20% 감소합니다.\n최대체력이 45 증가합니다.";
			customItemReference7.itemLore_EN = "Это сделает тренировки как минимум в 3 раза эффективнее!";
			customItemReference7.itemLore_KR = "이걸로 수련의 능률이 3배는 오르겠군!";
			((ItemReference)customItemReference7).prefabKeyword1 = (Key)0;
			((ItemReference)customItemReference7).prefabKeyword2 = (Key)0;
			customItemReference7.forbiddenDrops = new string[1] { "MysteriousScroll" };
			customItemReference7.stats = new Values((Value[])(object)new Value[4]
			{
				new Value(Category.PercentPoint, Kind.PhysicalAttackDamage, 0.4),
				new Value(Category.PercentPoint, Kind.SkillCooldownSpeed, 0.4),
				new Value(Category.Percent, Kind.TakingDamage, 0.8),
				new Value(Category.Fixed, Kind.Health, 45.0)
			});
			list.Add(customItemReference7);
			CustomItemReference customItemReference8 = new CustomItemReference();
			customItemReference8.name = "ShieldOfGreed";
			((GearReference)customItemReference8).rarity = (Rarity)0;
			customItemReference8.itemName_EN = "Щит жадности";
			customItemReference8.itemName_KR = "탐욕의 방패";
			customItemReference8.itemDescription_EN = "Получив удар, вы получаете 15 золотых (максимум 5 раз за комнату)";
			customItemReference8.itemDescription_KR = "피격 시 15 금화가 떨어집니다 (방마다 5회 제한).";
			customItemReference8.itemLore_EN = "Серьезно, кто вообще может заработать на том, что его бьют?\nДавайте сделаем это.";
			customItemReference8.itemLore_KR = "맞으면서 돈을 벌다니, 그것 참 한심한 생각이군.\n당장 하자.";
			((ItemReference)customItemReference8).prefabKeyword1 = (Key)8;
			((ItemReference)customItemReference8).prefabKeyword2 = (Key)32;
			customItemReference8.abilities = (Ability[])(object)new Ability[1]
			{
				new GainGoldUponHit()
			};
			list.Add(customItemReference8);
			CustomItemReference customItemReference9 = new CustomItemReference();
			customItemReference9.name = "EmergencyHealthFlask";
			((GearReference)customItemReference9).rarity = (Rarity)1;
			customItemReference9.itemName_EN = "Экстренная фляга";
			customItemReference9.itemName_KR = "비상용 회복약";
			customItemReference9.itemDescription_EN = "При ОЗ ниже 20%, опустошает флягу здоровья и восстанавливает 40% ОЗ";
			customItemReference9.itemDescription_KR = "현재 체력이 20% 미만일 시 회복약을 비우며 현재 체력의 40%를 회복합니다.";
			customItemReference9.itemLore_EN = "Она одноразовая, поэтому обращайтесь с ней осторожно";
			customItemReference9.itemLore_KR = "일회용이니 취급에 주의해주세요.";
			((ItemReference)customItemReference9).prefabKeyword1 = (Key)1;
			((ItemReference)customItemReference9).prefabKeyword2 = (Key)14;
			customItemReference9.extraComponents = new Type[1] { typeof(ChangeItemWhenLowHealth) };
			list.Add(customItemReference9);
			CustomItemReference customItemReference10 = new CustomItemReference();
			customItemReference10.name = "EmergencyHealthFlask_2";
			((GearReference)customItemReference10).obtainable = false;
			((GearReference)customItemReference10).rarity = (Rarity)1;
			customItemReference10.itemName_EN = "Пустая фляга";
			customItemReference10.itemName_KR = "빈 유리관";
			customItemReference10.itemDescription_EN = "После победы над боссом пополняет пустую флягу";
			customItemReference10.itemDescription_KR = "보스 처치 시 회복약이 다시 채워집니다.";
			customItemReference10.itemLore_EN = "Вы не должны... пить это...";
			customItemReference10.itemLore_KR = "아니... 그걸 한입에 쳐 마시면... 하...";
			((ItemReference)customItemReference10).prefabKeyword1 = (Key)1;
			((ItemReference)customItemReference10).prefabKeyword2 = (Key)14;
			customItemReference10.extraComponents = new Type[1] { typeof(ChangeItemWhenKilledBoss) };
			list.Add(customItemReference10);
			return list;
		}

		internal static void LoadSprites()
		{
			Items.ForEach(delegate(CustomItemReference item)
			{
				item.LoadSprites();
			});
		}

		internal static Dictionary<string, string> MakeStringDictionary()
		{
			Dictionary<string, string> dictionary = new Dictionary<string, string>(Items.Count * 8);
			foreach (CustomItemReference item in Items)
			{
				dictionary.Add("item/" + item.name + "/name", item.itemName);
				dictionary.Add("item/" + item.name + "/desc", item.itemDescription);
				dictionary.Add("item/" + item.name + "/flavor", item.itemLore);
			}
			return dictionary;
		}

		internal static List<EnhancementMap> ListMasterpieces()
		{
			Dictionary<string, CustomItemReference> masterpieces = Items.Where((CustomItemReference i) => (int)((ItemReference)i).prefabKeyword1 == 29 || (int)((ItemReference)i).prefabKeyword2 == 29).ToDictionary((CustomItemReference i) => i.name);
			return masterpieces.Where((KeyValuePair<string, CustomItemReference> item) => masterpieces.ContainsKey(item.Key + "_2")).Select((Func<KeyValuePair<string, CustomItemReference>, EnhancementMap>)((KeyValuePair<string, CustomItemReference> item) => new EnhancementMap
			{
				_from = new AssetReference(((GearReference)item.Value).guid),
				_to = new AssetReference(((GearReference)masterpieces[item.Key + "_2"]).guid)
			})).ToList();
		}
	}
	[HarmonyPatch]
	public class CustomItemsPatch
	{
		public delegate void ManatechPartDelegate();

		public delegate void InventoryUpdateDelegate(Inventory inventory);

		private static Dictionary<ItemRequest, CustomItemReference> currentRequests = new Dictionary<ItemRequest, CustomItemReference>();

		private static Dictionary<GearRequest, CustomItemReference> currentGearRequests = new Dictionary<GearRequest, CustomItemReference>();

		private static Dictionary<string, string> ItemStrings = new Dictionary<string, string>();

		public static event ManatechPartDelegate OnManatechPart;

		public static event InventoryUpdateDelegate OnInventoryUpdate;

		[HarmonyPrefix]
		[HarmonyPatch(typeof(GearResource), "Initialize")]
		private static void InjectCustomItems(ref GearResource __instance)
		{
			ItemReference[] array = (ItemReference[])(object)CustomItems.Items.ToArray();
			ItemReference[] array2 = array;
			CustomItems.LoadSprites();
			ItemStrings = CustomItems.MakeStringDictionary();
			int num = __instance._items.Length;
			Array.Resize(ref __instance._items, num + array2.Length);
			array2.CopyTo(__instance._items, num);
			Sprite[] array3 = (from item in array2
				where (Object)(object)((GearReference)item).thumbnail != (Object)null
				select ((GearReference)item).thumbnail).ToArray();
			int num2 = __instance._gearThumbnails.Length;
			Array.Resize(ref __instance._gearThumbnails, num2 + array3.Length);
			array3.CopyTo(__instance._gearThumbnails, num2);
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Masterpiece), "Initialize")]
		private static void InjectMasterpieces(ref Masterpiece __instance)
		{
			EnhancementMap[] array = CustomItems.ListMasterpieces().ToArray();
			int num = __instance._enhancementMaps.Length;
			Array.Resize(ref __instance._enhancementMaps, num + array.Length);
			array.CopyTo(__instance._enhancementMaps, num);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(ItemReference), "LoadAsync")]
		private static void RegisterGearRequest(ref ItemReference __instance, ref ItemRequest __result)
		{
			if (__instance is CustomItemReference value)
			{
				currentRequests.Add(__result, value);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GearReference), "LoadAsync")]
		private static void RegisterGearRequest(ref GearReference __instance, ref GearRequest __result)
		{
			if (__instance is CustomItemReference value)
			{
				currentGearRequests.Add(__result, value);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(LevelManager), "DropItem", new Type[]
		{
			typeof(ItemRequest),
			typeof(Vector3)
		})]
		private static bool DropCustomItem(ref LevelManager __instance, ItemRequest gearRequest, Vector3 position, ref Item __result)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			return ProcessDrop<ItemRequest, Item>(ref __instance, gearRequest, position, ref __result, currentRequests);
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(LevelManager), "DropGear", new Type[]
		{
			typeof(GearRequest),
			typeof(Vector3)
		})]
		private static bool DropCustomGear(ref LevelManager __instance, GearRequest gearRequest, Vector3 position, ref Gear __result)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			return ProcessDrop<GearRequest, Gear>(ref __instance, gearRequest, position, ref __result, currentGearRequests);
		}

		private static bool ProcessDrop<TRequest, TResult>(ref LevelManager __instance, TRequest request, Vector3 position, ref TResult __result, Dictionary<TRequest, CustomItemReference> requestDict) where TRequest : Request<TResult> where TResult : Gear
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (!requestDict.ContainsKey(request))
			{
				return true;
			}
			CustomItemReference customItemReference = requestDict[request];
			Item item = customItemReference.GetItem(((Component)(object)((Request<TResult>)request).asset).gameObject.GetComponent<Item>());
			__result = (TResult)(object)__instance.DropItem(item, position);
			requestDict.Remove(request);
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Localization), "GetLocalizedString", new Type[] { typeof(string) })]
		private static bool InjectCustomStrings(string key, ref string __result)
		{
			if (!ItemStrings.ContainsKey(key))
			{
				return true;
			}
			__result = ItemStrings[key];
			return false;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(DroppedManatechPart), "PickedUpBy")]
		private static void ManatechPickedupHook(Character character)
		{
			CustomItemsPatch.OnManatechPart?.Invoke();
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Inventory), "UpdateSynergy")]
		private static void InventoryUpdateHook(ref Inventory __instance)
		{
			CustomItemsPatch.OnInventoryUpdate?.Invoke(__instance);
		}
	}
	[BepInPlugin("DeadCellsCustomItems", "DeadCellsCustomItems", "1.0.1")]
	public class Plugin : BaseUnityPlugin
	{
		private void Awake()
		{
			Harmony.CreateAndPatchAll(typeof(CustomItemsPatch), (string)null);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Mod DeadCellsCustomItems is loaded!");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "DeadCellsCustomItems";

		public const string PLUGIN_NAME = "DeadCellsCustomItems";

		public const string PLUGIN_VERSION = "1.0.1";
	}
}
namespace DeadCellsCustomItems.CustomAbilities
{
	public abstract class AbilityComponentHack<T> : AbilityComponent<T>, ISerializationCallbackReceiver where T : Ability, ICloneable
	{
		[SerializeReference]
		private T _abilityReference;

		public void OnAfterDeserialize()
		{
			if (base._ability == null && _abilityReference != null)
			{
				base._ability = (T)_abilityReference.Clone();
			}
		}

		public void OnBeforeSerialize()
		{
			_abilityReference = base._ability;
		}
	}
	[Serializable]
	public class GainGoldUponHit : Ability, ICloneable
	{
		public class Instance : AbilityInstance<GainGoldUponHit>
		{
			private int _stacks;

			private LevelManager _levelManager;

			public override int iconStacks => _stacks;

			public override Sprite icon
			{
				get
				{
					if (_stacks == 0)
					{
						return null;
					}
					return ((Ability)base.ability)._defaultIcon;
				}
			}

			public Instance(Character owner, GainGoldUponHit ability)
				: base(owner, ability)
			{
				_levelManager = Singleton<Service>.Instance.levelManager;
			}

			public override void OnAttach()
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Expected O, but got Unknown
				((Health)((AbilityInstance)this).owner.health).onTakeDamage.Add(100000, new TakeDamageDelegate(HandleOnTakeDamage));
				_levelManager.onMapLoadedAndFadedIn += ResetStack;
				_stacks = 5;
			}

			public override void OnDetach()
			{
				//IL_0018: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Expected O, but got Unknown
				((Health)((AbilityInstance)this).owner.health).onTakeDamage.Remove(new TakeDamageDelegate(HandleOnTakeDamage));
				_levelManager.onMapLoadedAndFadedIn -= ResetStack;
			}

			private bool HandleOnTakeDamage(ref Damage damage)
			{
				//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_00aa: Unknown result type (might be due to invalid IL or missing references)
				if (((AbilityInstance)this).owner.invulnerable.value)
				{
					return false;
				}
				AttackType attackType = damage.attackType;
				if (((object)(AttackType)(ref attackType)).Equals((object)(AttackType)0))
				{
					return false;
				}
				if (damage.@null)
				{
					return false;
				}
				if (((Damage)(ref damage)).amount < 1.0)
				{
					return false;
				}
				if (_stacks <= 0)
				{
					return false;
				}
				_stacks--;
				Singleton<Service>.Instance.levelManager.DropGold(15, 5, ((Component)((AbilityInstance)this).owner).transform.position);
				return false;
			}

			private void ResetStack()
			{
				_stacks = 5;
			}
		}

		public override IAbilityInstance CreateInstance(Character owner)
		{
			return (IAbilityInstance)(object)new Instance(owner, this);
		}

		public object Clone()
		{
			return new GainGoldUponHit
			{
				_defaultIcon = base._defaultIcon
			};
		}
	}
	public sealed class GainGoldUponHitComponent : AbilityComponentHack<GainGoldUponHit>
	{
	}
	[Serializable]
	public class InstaKillIgnoringNegation : Ability, ICloneable
	{
		public class Instance : AbilityInstance<InstaKillIgnoringNegation>
		{
			public Instance(Character owner, InstaKillIgnoringNegation ability)
				: base(owner, ability)
			{
			}

			public override void OnAttach()
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Expected O, but got Unknown
				((Health)((AbilityInstance)this).owner.health).onTakeDamage.Add(2000, new TakeDamageDelegate(HandleOnTakeDamage));
			}

			public override void OnDetach()
			{
				//IL_0018: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Expected O, but got Unknown
				((Health)((AbilityInstance)this).owner.health).onTakeDamage.Remove(new TakeDamageDelegate(HandleOnTakeDamage));
			}

			private bool HandleOnTakeDamage(ref Damage damage)
			{
				//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)
				if (((AbilityInstance)this).owner.invulnerable.value)
				{
					return false;
				}
				AttackType attackType = damage.attackType;
				if (((object)(AttackType)(ref attackType)).Equals((object)(AttackType)0))
				{
					return false;
				}
				if (damage.@null)
				{
					return false;
				}
				if (((Damage)(ref damage)).amount < 1.0)
				{
					return false;
				}
				((Health)((AbilityInstance)this).owner.health).TryKill();
				return false;
			}
		}

		public override IAbilityInstance CreateInstance(Character owner)
		{
			return (IAbilityInstance)(object)new Instance(owner, this);
		}

		public object Clone()
		{
			return new InstaKillIgnoringNegation
			{
				_defaultIcon = base._defaultIcon
			};
		}
	}
	public sealed class InstaKillIgnoringNegationComponent : AbilityComponentHack<InstaKillIgnoringNegation>
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}