Decompiled source of ItemLuck v1.0.1

ItemLuck.dll

Decompiled 5 months ago
using System;
using System.Collections.Generic;
using System.ComponentModel;
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 System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.ScavBackpack;
using Microsoft.CodeAnalysis;
using On.EntityStates.ScavBackpack;
using On.RoR2;
using On.RoR2.Artifacts;
using RiskOfOptions;
using RiskOfOptions.Components.Options;
using RiskOfOptions.Components.Panel;
using RiskOfOptions.Components.RuntimePrefabs;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Artifacts;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("ItemLuck")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+6828a68ef7c4460a8d7be2b6f8885d07f1597043")]
[assembly: AssemblyProduct("ItemLuck")]
[assembly: AssemblyTitle("ItemLuck")]
[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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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;
		}
	}
	[EditorBrowsable(EditorBrowsableState.Never)]
	public static class IsExternalInit
	{
	}
}
namespace ItemLuck
{
	public record Element(bool IsSelected, string Name, float Weigth);
	public class DescriptionBuilder
	{
		private readonly StringBuilder _sb;

		public DescriptionBuilder(StringBuilder sb)
		{
			_sb = sb;
		}

		public void AppendElements(List<Element> elements)
		{
			float num = elements.Sum((Element x) => x.Weigth);
			float num2 = 1f / (float)elements.Count;
			for (int i = 0; i < elements.Count; i++)
			{
				Element element = elements[i];
				if (element.IsSelected)
				{
					_sb.Append("<color=\"yellow\">");
				}
				_sb.Append(element.Name);
				if (element.IsSelected)
				{
					_sb.Append("</color>");
				}
				_sb.Append(": ");
				float num3 = element.Weigth / num;
				float num4 = num3 - num2;
				bool num5 = Mathf.Abs(num4) <= 0.001f;
				if (!num5)
				{
					if (num3 > num2)
					{
						_sb.Append("<color=\"green\">");
					}
					else
					{
						_sb.Append("<color=\"red\">");
					}
				}
				_sb.Append($"{num3 * 100f:0.##}%");
				if (!num5)
				{
					_sb.Append("</color>");
					_sb.Append(" (");
					if (num4 > 0f)
					{
						_sb.Append('+');
					}
					_sb.Append($"{num4 * 100f:0.##}%");
					_sb.Append(')');
				}
				_sb.AppendLine();
			}
		}
	}
	public static class ModOptionPanelControllerExtensions
	{
		private static readonly FieldInfo _panelField = typeof(ModOptionPanelController).GetField("_panel", BindingFlags.Instance | BindingFlags.NonPublic);

		public static ModOptionsPanelPrefab GetPanel(this ModOptionPanelController controller)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			return (ModOptionsPanelPrefab)_panelField.GetValue(controller);
		}
	}
	public class TierList
	{
		private readonly Dictionary<ItemIndex, ConfigEntry<Tier>> _itemConfigByItem;

		private readonly Dictionary<EquipmentIndex, ConfigEntry<Tier>> _equipmentConfigByItem;

		private TierList(Dictionary<ItemIndex, ConfigEntry<Tier>> itemConfigByItem, Dictionary<EquipmentIndex, ConfigEntry<Tier>> equipmentConfigByItem)
		{
			_itemConfigByItem = itemConfigByItem;
			_equipmentConfigByItem = equipmentConfigByItem;
		}

		public static TierList Create(ConfigFile config)
		{
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			Log.Debug("Initializing TierList");
			DefaultTierList defaultTierList = DefaultTierList.Create();
			Dictionary<ItemIndex, Rank<ItemDef>> dictionary = defaultTierList.Items.ToDictionary((Rank<ItemDef> x) => x.Def.itemIndex);
			Dictionary<ItemIndex, ConfigEntry<Tier>> dictionary2 = new Dictionary<ItemIndex, ConfigEntry<Tier>>();
			var items = from x in GetValidItems()
				select new
				{
					Name = NormaliseName(Language.GetString(x.nameToken)),
					ItemDef = x
				} into x
				orderby x.ItemDef.tier, x.Name
				select x;
			foreach (var item in items)
			{
				Tier tier = Tier.Unspecified;
				if (dictionary.TryGetValue(item.ItemDef.itemIndex, out var value))
				{
					tier = value.Tier;
				}
				ConfigEntry<Tier> val = config.Bind<Tier>(item.ItemDef.tier.GetShortName(), item.Name, tier, "test2");
				dictionary2[item.ItemDef.itemIndex] = val;
				Func<List<Element>> getElements = () => (from x in items
					where x.ItemDef.tier == item.ItemDef.tier
					select new Element((Object)(object)x.ItemDef == (Object)(object)item.ItemDef, x.Name, (ItemLuckPlugin.TierList.GetTier(x.ItemDef.itemIndex) ?? Tier.Unspecified).ApplyItemLuck(1f)) into x
					orderby x.Name
					select x).ToList();
				UpdatableChoiceOption choiceOption2 = new UpdatableChoiceOption((ConfigEntryBase)(object)val, getElements);
				ModSettingsManager.AddOption((BaseOption)(object)choiceOption2);
				val.SettingChanged += delegate
				{
					UpdatableOptions.UpdateDescriptions();
					choiceOption2.UpdatePanel();
				};
			}
			Dictionary<EquipmentIndex, Rank<EquipmentDef>> dictionary3 = defaultTierList.Equipments.ToDictionary((Rank<EquipmentDef> x) => x.Def.equipmentIndex);
			Dictionary<EquipmentIndex, ConfigEntry<Tier>> dictionary4 = new Dictionary<EquipmentIndex, ConfigEntry<Tier>>();
			var equipements = from x in GetValidEquipments()
				select new
				{
					Name = NormaliseName(Language.GetString(x.nameToken)),
					EquipmentDef = x
				} into x
				orderby x.Name
				select x;
			foreach (var equipment in equipements)
			{
				Tier tier2 = Tier.Unspecified;
				if (dictionary3.TryGetValue(equipment.EquipmentDef.equipmentIndex, out var value2))
				{
					tier2 = value2.Tier;
				}
				ConfigEntry<Tier> val2 = config.Bind<Tier>("Equipments", equipment.Name, tier2, (ConfigDescription)null);
				dictionary4[equipment.EquipmentDef.equipmentIndex] = val2;
				Func<List<Element>> getElements2 = () => (from x in equipements
					select new Element((Object)(object)x.EquipmentDef == (Object)(object)equipment.EquipmentDef, x.Name, (ItemLuckPlugin.TierList.GetTier(x.EquipmentDef.equipmentIndex) ?? Tier.Unspecified).ApplyItemLuck(1f)) into x
					orderby x.Name
					select x).ToList();
				UpdatableChoiceOption choiceOption = new UpdatableChoiceOption((ConfigEntryBase)(object)val2, getElements2);
				ModSettingsManager.AddOption((BaseOption)(object)choiceOption);
				val2.SettingChanged += delegate
				{
					UpdatableOptions.UpdateDescriptions();
					choiceOption.UpdatePanel();
				};
			}
			Log.Debug("TierList Initialized");
			return new TierList(dictionary2, dictionary4);
			static string NormaliseName(string name)
			{
				return Regex.Replace(name, "[=\\n\\t\\\\\"'\\[\\]]", "").Trim();
			}
		}

		public static IEnumerable<ItemDef> GetValidItems()
		{
			return from x in ItemCatalog.itemDefs
				where (int)x.tier != 5
				where x.canRemove
				where !x.hidden
				where x.DoesNotContainTag((ItemTag)10)
				where x.DoesNotContainTag((ItemTag)9)
				select x;
		}

		public static IEnumerable<EquipmentDef> GetValidEquipments()
		{
			return EquipmentCatalog.equipmentDefs.Where((EquipmentDef x) => x.canDrop);
		}

		public Tier? GetTier(ItemIndex itemIndex)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (_itemConfigByItem.TryGetValue(itemIndex, out var value))
			{
				return value.Value;
			}
			return null;
		}

		public Tier? GetTier(EquipmentIndex equipmentIndex)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (_equipmentConfigByItem.TryGetValue(equipmentIndex, out var value))
			{
				return value.Value;
			}
			return null;
		}
	}
	public class UpdatableChoiceOption : ChoiceOption, IUpdatableOption
	{
		private DropDownController _dropdownController;

		private Func<List<Element>> _getElements;

		public UpdatableChoiceOption(ConfigEntryBase configEntry, Func<List<Element>> getElements)
			: base(configEntry)
		{
			_getElements = getElements;
			UpdatableOptions.Instances.Add(this);
		}

		public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			GameObject val = ((ChoiceOption)this).CreateOptionGameObject(prefab, parent);
			_dropdownController = val.GetComponentInChildren<DropDownController>();
			((MPButton)val.GetComponentInChildren<HGButton>()).onSelect.AddListener(new UnityAction(UpdatePanel));
			return val;
		}

		private string GetCurrentDescription()
		{
			List<Element> elements = _getElements();
			StringBuilder stringBuilder = new StringBuilder();
			new DescriptionBuilder(stringBuilder).AppendElements(elements);
			return stringBuilder.ToString();
		}

		public void UpdateDescription()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			string currentDescription = GetCurrentDescription();
			((BaseOption)this).SetDescription(currentDescription, new BaseOptionConfig());
		}

		public void UpdatePanel()
		{
			ModOptionsPanelPrefab panel = ((ModSetting)_dropdownController).optionController.GetPanel();
			string currentDescription = GetCurrentDescription();
			((TMP_Text)panel.ModOptionsDescriptionPanel.GetComponentInChildren<HGTextMeshProUGUI>()).SetText(currentDescription, true);
		}
	}
	public interface IUpdatableOption
	{
		void UpdateDescription();

		void UpdatePanel();
	}
	public static class UpdatableOptions
	{
		public static List<IUpdatableOption> Instances { get; } = new List<IUpdatableOption>();


		public static void UpdateDescriptions()
		{
			foreach (IUpdatableOption instance in Instances)
			{
				instance.UpdateDescription();
			}
		}
	}
	public class UpdatableStepSliderOption : StepSliderOption, IUpdatableOption
	{
		private ModSettingsStepSlider _silder;

		public UpdatableStepSliderOption(ConfigEntry<float> configEntry, StepSliderConfig config)
			: base(configEntry, config)
		{
			UpdatableOptions.Instances.Add(this);
		}

		public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			GameObject val = ((StepSliderOption)this).CreateOptionGameObject(prefab, parent);
			_silder = val.GetComponentInChildren<ModSettingsStepSlider>();
			((MPButton)val.GetComponentInChildren<HGButton>()).onSelect.AddListener(new UnityAction(UpdatePanel));
			return val;
		}

		private string GetCurrentDescription()
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			var list = (from x in TierList.GetValidItems()
				select new
				{
					Tier = x.tier,
					Element = new Element(IsSelected: false, Language.GetString(x.nameToken), (ItemLuckPlugin.TierList.GetTier(x.itemIndex) ?? Tier.Unspecified).ApplyItemLuck(1f))
				} into x
				group x by x.Tier into x
				orderby x.Key
				select new
				{
					Color = ColorCatalog.GetColor(ItemTierCatalog.GetItemTierDef(x.Key).colorIndex),
					CategoryName = x.Key.GetFullName(),
					Elements = (from x in x
						select x.Element into x
						orderby x.Name
						select x).ToList()
				}).ToList();
			list.Add(new
			{
				Color = ColorCatalog.GetColor((ColorIndex)5),
				CategoryName = "Equipments",
				Elements = (from x in TierList.GetValidEquipments()
					select new Element(IsSelected: false, Language.GetString(x.nameToken), (ItemLuckPlugin.TierList.GetTier(x.equipmentIndex) ?? Tier.Unspecified).ApplyItemLuck(1f))).ToList()
			});
			StringBuilder stringBuilder = new StringBuilder();
			DescriptionBuilder descriptionBuilder = new DescriptionBuilder(stringBuilder);
			foreach (var item in list)
			{
				stringBuilder.Append("<color=#" + ColorUtility.ToHtmlStringRGB(Color32.op_Implicit(item.Color)) + ">");
				stringBuilder.Append(item.CategoryName);
				stringBuilder.Append(":</color>");
				stringBuilder.AppendLine();
				descriptionBuilder.AppendElements(item.Elements);
				stringBuilder.AppendLine();
			}
			return stringBuilder.ToString();
		}

		public void UpdateDescription()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			string currentDescription = GetCurrentDescription();
			((BaseOption)this).SetDescription(currentDescription, new BaseOptionConfig());
		}

		public void UpdatePanel()
		{
			ModOptionsPanelPrefab panel = ((ModSetting)_silder).optionController.GetPanel();
			string currentDescription = GetCurrentDescription();
			((TMP_Text)panel.ModOptionsDescriptionPanel.GetComponentInChildren<HGTextMeshProUGUI>()).SetText(currentDescription, true);
		}
	}
	public class DefaultTierList
	{
		public List<Rank<ItemDef>> Items { get; }

		public List<Rank<EquipmentDef>> Equipments { get; }

		private DefaultTierList(List<Rank<ItemDef>> items, List<Rank<EquipmentDef>> equipments)
		{
			Items = items;
			Equipments = equipments;
		}

		public static DefaultTierList Create()
		{
			List<Rank<ItemDef>> items = new List<Rank<ItemDef>>
			{
				new Rank<ItemDef>(Items.Hoof, Tier.S),
				new Rank<ItemDef>(Items.CritGlasses, Tier.S),
				new Rank<ItemDef>(Items.SprintBonus, Tier.S),
				new Rank<ItemDef>(Items.FragileDamageBonus, Tier.S),
				new Rank<ItemDef>(Items.AttackSpeedAndMoveSpeed, Tier.A),
				new Rank<ItemDef>(Items.IgniteOnKill, Tier.A),
				new Rank<ItemDef>(Items.BleedOnHit, Tier.A),
				new Rank<ItemDef>(Items.Syringe, Tier.A),
				new Rank<ItemDef>(Items.Bear, Tier.A),
				new Rank<ItemDef>(Items.HealWhileSafe, Tier.A),
				new Rank<ItemDef>(Items.OutOfCombatArmor, Tier.A),
				new Rank<ItemDef>(Items.BossDamageBonus, Tier.A),
				new Rank<ItemDef>(Items.TreasureCache, Tier.B),
				new Rank<ItemDef>(Items.StickyBomb, Tier.B),
				new Rank<ItemDef>(Items.Crowbar, Tier.B),
				new Rank<ItemDef>(Items.ArmorPlate, Tier.B),
				new Rank<ItemDef>(Items.NearbyDamageBonus, Tier.B),
				new Rank<ItemDef>(Items.SecondarySkillMagazine, Tier.B),
				new Rank<ItemDef>(Items.BarrierOnKill, Tier.C),
				new Rank<ItemDef>(Items.PersonalShield, Tier.C),
				new Rank<ItemDef>(Items.HealingPotion, Tier.C),
				new Rank<ItemDef>(Items.Firework, Tier.C),
				new Rank<ItemDef>(Items.Tooth, Tier.C),
				new Rank<ItemDef>(Items.GoldOnHurt, Tier.D),
				new Rank<ItemDef>(Items.Mushroom, Tier.D),
				new Rank<ItemDef>(Items.Medkit, Tier.D),
				new Rank<ItemDef>(Items.StunChanceOnHit, Tier.D),
				new Rank<ItemDef>(Items.WardOnLevel, Tier.F),
				new Rank<ItemDef>(Items.FlatHealth, Tier.F),
				new Rank<ItemDef>(Items.Feather, Tier.S),
				new Rank<ItemDef>(Items.IceRing, Tier.S),
				new Rank<ItemDef>(Items.FireRing, Tier.S),
				new Rank<ItemDef>(Items.Missile, Tier.S),
				new Rank<ItemDef>(Items.ChainLightning, Tier.A),
				new Rank<ItemDef>(Items.ExplodeOnDeath, Tier.A),
				new Rank<ItemDef>(Items.PrimarySkillShuriken, Tier.A),
				new Rank<ItemDef>(Items.StrengthenBurn, Tier.B),
				new Rank<ItemDef>(Items.JumpBoost, Tier.B),
				new Rank<ItemDef>(Items.SprintArmor, Tier.B),
				new Rank<ItemDef>(Items.BonusGoldPackOnKill, Tier.C),
				new Rank<ItemDef>(Items.EquipmentMagazine, Tier.C),
				new Rank<ItemDef>(Items.FreeChest, Tier.C),
				new Rank<ItemDef>(Items.SlowOnHit, Tier.C),
				new Rank<ItemDef>(Items.AttackSpeedOnCrit, Tier.C),
				new Rank<ItemDef>(Items.SprintOutOfCombat, Tier.C),
				new Rank<ItemDef>(Items.ExecuteLowHealthElite, Tier.C),
				new Rank<ItemDef>(Items.DeathMark, Tier.C),
				new Rank<ItemDef>(Items.EnergizedOnEquipmentUse, Tier.D),
				new Rank<ItemDef>(Items.Bandolier, Tier.D),
				new Rank<ItemDef>(Items.RegeneratingScrap, Tier.D),
				new Rank<ItemDef>(Items.HealOnCrit, Tier.D),
				new Rank<ItemDef>(Items.Squid, Tier.F),
				new Rank<ItemDef>(Items.Thorns, Tier.F),
				new Rank<ItemDef>(Items.Infusion, Tier.F),
				new Rank<ItemDef>(Items.WarCryOnMultiKill, Tier.F),
				new Rank<ItemDef>(Items.Phasing, Tier.F),
				new Rank<ItemDef>(Items.MoveSpeedOnKill, Tier.F),
				new Rank<ItemDef>(Items.Seed, Tier.F),
				new Rank<ItemDef>(Items.TPHealingNova, Tier.F),
				new Rank<ItemDef>(Items.TreasureCacheVoid, Tier.S),
				new Rank<ItemDef>(Items.BearVoid, Tier.S),
				new Rank<ItemDef>(Items.ChainLightningVoid, Tier.S),
				new Rank<ItemDef>(Items.MissileVoid, Tier.S),
				new Rank<ItemDef>(Items.ExplodeOnDeathVoid, Tier.A),
				new Rank<ItemDef>(Items.MushroomVoid, Tier.A),
				new Rank<ItemDef>(Items.ExtraLifeVoid, Tier.A),
				new Rank<ItemDef>(Items.EquipmentMagazineVoid, Tier.A),
				new Rank<ItemDef>(Items.BleedOnHitVoid, Tier.B),
				new Rank<ItemDef>(Items.SlowOnHitVoid, Tier.B),
				new Rank<ItemDef>(Items.CritGlassesVoid, Tier.D),
				new Rank<ItemDef>(Items.CloverVoid, Tier.D),
				new Rank<ItemDef>(Items.VoidMegaCrabItem, Tier.F),
				new Rank<ItemDef>(Items.ElementalRingVoid, Tier.F),
				new Rank<ItemDef>(Items.ShieldOnly, Tier.S),
				new Rank<ItemDef>(Items.AutoCastEquipment, Tier.S),
				new Rank<ItemDef>(Items.LunarSpecialReplacement, Tier.S),
				new Rank<ItemDef>(Items.LunarDagger, Tier.S),
				new Rank<ItemDef>(Items.RandomlyLunar, Tier.A),
				new Rank<ItemDef>(Items.FocusConvergence, Tier.B),
				new Rank<ItemDef>(Items.LunarBadLuck, Tier.B),
				new Rank<ItemDef>(Items.LunarUtilityReplacement, Tier.B),
				new Rank<ItemDef>(Items.LunarSun, Tier.B),
				new Rank<ItemDef>(Items.LunarPrimaryReplacement, Tier.B),
				new Rank<ItemDef>(Items.LunarSecondaryReplacement, Tier.B),
				new Rank<ItemDef>(Items.RepeatHeal, Tier.C),
				new Rank<ItemDef>(Items.GoldOnHit, Tier.C),
				new Rank<ItemDef>(Items.RandomDamageZone, Tier.C),
				new Rank<ItemDef>(Items.LunarTrinket, Tier.D),
				new Rank<ItemDef>(Items.MonstersOnShrineUse, Tier.D),
				new Rank<ItemDef>(Items.HalfAttackSpeedHalfCooldowns, Tier.F),
				new Rank<ItemDef>(Items.HalfSpeedDoubleHealth, Tier.F),
				new Rank<ItemDef>(Items.LightningStrikeOnHit, Tier.S),
				new Rank<ItemDef>(Items.FireballsOnHit, Tier.S),
				new Rank<ItemDef>(Items.BleedOnHitAndExplode, Tier.S),
				new Rank<ItemDef>(Items.ShinyPearl, Tier.S),
				new Rank<ItemDef>(Items.SprintWisp, Tier.S),
				new Rank<ItemDef>(Items.RoboBallBuddy, Tier.A),
				new Rank<ItemDef>(Items.SiphonOnLowHealth, Tier.C),
				new Rank<ItemDef>(Items.BeetleGland, Tier.C),
				new Rank<ItemDef>(Items.NovaOnLowHealth, Tier.D),
				new Rank<ItemDef>(Items.TitanGoldDuringTP, Tier.D),
				new Rank<ItemDef>(Items.ParentEgg, Tier.D),
				new Rank<ItemDef>(Items.Pearl, Tier.D),
				new Rank<ItemDef>(Items.Knurl, Tier.D),
				new Rank<ItemDef>(Items.MinorConstructOnKill, Tier.F),
				new Rank<ItemDef>(Items.FallBoots, Tier.S),
				new Rank<ItemDef>(Items.Clover, Tier.S),
				new Rank<ItemDef>(Items.DroneWeapons, Tier.S),
				new Rank<ItemDef>(Items.ExtraLife, Tier.S),
				new Rank<ItemDef>(Items.BounceNearby, Tier.S),
				new Rank<ItemDef>(Items.PermanentDebuffOnHit, Tier.S),
				new Rank<ItemDef>(Items.Behemoth, Tier.S),
				new Rank<ItemDef>(Items.MoreMissile, Tier.A),
				new Rank<ItemDef>(Items.ShockNearby, Tier.A),
				new Rank<ItemDef>(Items.Dagger, Tier.A),
				new Rank<ItemDef>(Items.ArmorReductionOnHit, Tier.A),
				new Rank<ItemDef>(Items.CritDamage, Tier.A),
				new Rank<ItemDef>(Items.UtilitySkillMagazine, Tier.A),
				new Rank<ItemDef>(Items.Icicle, Tier.B),
				new Rank<ItemDef>(Items.Talisman, Tier.C),
				new Rank<ItemDef>(Items.LaserTurbine, Tier.C),
				new Rank<ItemDef>(Items.Plant, Tier.C),
				new Rank<ItemDef>(Items.AlienHead, Tier.C),
				new Rank<ItemDef>(Items.IncreaseHealing, Tier.D),
				new Rank<ItemDef>(Items.KillEliteFrenzy, Tier.D),
				new Rank<ItemDef>(Items.ImmuneToDebuff, Tier.D),
				new Rank<ItemDef>(Items.GhostOnKill, Tier.D),
				new Rank<ItemDef>(Items.RandomEquipmentTrigger, Tier.D),
				new Rank<ItemDef>(Items.HeadHunter, Tier.F),
				new Rank<ItemDef>(Items.NovaOnHeal, Tier.F),
				new Rank<ItemDef>(Items.BarrierOnOverHeal, Tier.F)
			};
			List<Rank<EquipmentDef>> equipments = new List<Rank<EquipmentDef>>
			{
				new Rank<EquipmentDef>(Equipment.Tonic, Tier.S),
				new Rank<EquipmentDef>(Equipment.Recycle, Tier.S),
				new Rank<EquipmentDef>(Equipment.BossHunter, Tier.S),
				new Rank<EquipmentDef>(Equipment.MultiShopCard, Tier.S),
				new Rank<EquipmentDef>(Equipment.Lightning, Tier.A),
				new Rank<EquipmentDef>(Equipment.GoldGat, Tier.A),
				new Rank<EquipmentDef>(Equipment.Jetpack, Tier.A),
				new Rank<EquipmentDef>(Equipment.Saw, Tier.A),
				new Rank<EquipmentDef>(Equipment.CommandMissile, Tier.B),
				new Rank<EquipmentDef>(Equipment.FireBallDash, Tier.B),
				new Rank<EquipmentDef>(Equipment.Gateway, Tier.B),
				new Rank<EquipmentDef>(Equipment.BFG, Tier.C),
				new Rank<EquipmentDef>(Equipment.GummyClone, Tier.C),
				new Rank<EquipmentDef>(Equipment.Cleanse, Tier.C),
				new Rank<EquipmentDef>(Equipment.VendingMachine, Tier.C),
				new Rank<EquipmentDef>(Equipment.BurnNearby, Tier.C),
				new Rank<EquipmentDef>(Equipment.Blackhole, Tier.C),
				new Rank<EquipmentDef>(Equipment.DeathProjectile, Tier.C),
				new Rank<EquipmentDef>(Equipment.CritOnUse, Tier.C),
				new Rank<EquipmentDef>(Equipment.GainArmor, Tier.C),
				new Rank<EquipmentDef>(Equipment.Meteor, Tier.C),
				new Rank<EquipmentDef>(Equipment.TeamWarCry, Tier.C),
				new Rank<EquipmentDef>(Equipment.LifestealOnHit, Tier.D),
				new Rank<EquipmentDef>(Equipment.PassiveHealing, Tier.D),
				new Rank<EquipmentDef>(Equipment.Fruit, Tier.D),
				new Rank<EquipmentDef>(Equipment.DroneBackup, Tier.F),
				new Rank<EquipmentDef>(Equipment.Molotov, Tier.F),
				new Rank<EquipmentDef>(Equipment.Scanner, Tier.F),
				new Rank<EquipmentDef>(Equipment.CrippleWard, Tier.F)
			};
			return new DefaultTierList(items, equipments);
		}
	}
	public class Disposable : IDisposable
	{
		private readonly Action _dispose;

		public static Disposable Empty { get; } = new Disposable(delegate
		{
		});


		public Disposable(Action dispose)
		{
			_dispose = dispose;
		}

		public void Dispose()
		{
			_dispose();
		}
	}
	public class CompositeDisposable : IDisposable
	{
		private readonly List<IDisposable> _disposables;

		public CompositeDisposable()
		{
			_disposables = new List<IDisposable>();
		}

		public void Add(IDisposable disposable)
		{
			_disposables.Add(disposable);
		}

		public void AddRange(IEnumerable<IDisposable> disposables)
		{
			_disposables.AddRange(disposables);
		}

		public void Dispose()
		{
			foreach (IDisposable disposable in _disposables)
			{
				disposable.Dispose();
			}
		}
	}
	public static class Hooks
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Init <0>__ItemCatalog_Init;

			public static hook_Roll <1>__ChestBehavior_Roll;

			public static hook_GenerateNewPickupServer_bool <2>__ShopTerminalBehavior_GenerateNewPickupServer_bool;

			public static hook_GenerateEntriesServer <3>__RouletteChestController_GenerateEntriesServer;

			public static hook_AddShrineStack <4>__ShrineChanceBehavior_AddShrineStack;

			public static hook_GenerateDropPreReplacement <5>__FreeChestDropTable_GenerateDropPreReplacement;

			public static hook_Roll <6>__OptionChestBehavior_Roll;

			public static hook_DropRewards <7>__BossGroup_DropRewards;

			public static hook_FixedUpdate <8>__Opening_FixedUpdate;

			public static hook_RollItem <9>__ChestBehavior_RollItem;

			public static hook_GenerateDropPreReplacement <10>__DoppelgangerDropTable_GenerateDropPreReplacement;

			public static hook_OnServerCharacterDeath <11>__SacrificeArtifactManager_OnServerCharacterDeath;

			public static hook_DropRewards <12>__InfiniteTowerWaveController_DropRewards;

			public static hook_GenerateUniqueDropsPreReplacement <13>__ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement;

			public static hook_EndRound <14>__ArenaMissionController_EndRound;

			public static hook_FireRecycle <15>__EquipmentSlot_FireRecycle;
		}

		private static ConfigFile _config;

		public static void Init(ConfigFile config)
		{
			//IL_0016: 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_0021: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Expected O, but got Unknown
			//IL_00b6: 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_00c1: Expected O, but got Unknown
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Expected O, but got Unknown
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Expected O, but got Unknown
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Expected O, but got Unknown
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Expected O, but got Unknown
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Expected O, but got Unknown
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Expected O, but got Unknown
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Expected O, but got Unknown
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Expected O, but got Unknown
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Expected O, but got Unknown
			_config = config;
			object obj = <>O.<0>__ItemCatalog_Init;
			if (obj == null)
			{
				hook_Init val = ItemCatalog_Init;
				<>O.<0>__ItemCatalog_Init = val;
				obj = (object)val;
			}
			ItemCatalog.Init += (hook_Init)obj;
			object obj2 = <>O.<1>__ChestBehavior_Roll;
			if (obj2 == null)
			{
				hook_Roll val2 = ChestBehavior_Roll;
				<>O.<1>__ChestBehavior_Roll = val2;
				obj2 = (object)val2;
			}
			ChestBehavior.Roll += (hook_Roll)obj2;
			object obj3 = <>O.<2>__ShopTerminalBehavior_GenerateNewPickupServer_bool;
			if (obj3 == null)
			{
				hook_GenerateNewPickupServer_bool val3 = ShopTerminalBehavior_GenerateNewPickupServer_bool;
				<>O.<2>__ShopTerminalBehavior_GenerateNewPickupServer_bool = val3;
				obj3 = (object)val3;
			}
			ShopTerminalBehavior.GenerateNewPickupServer_bool += (hook_GenerateNewPickupServer_bool)obj3;
			object obj4 = <>O.<3>__RouletteChestController_GenerateEntriesServer;
			if (obj4 == null)
			{
				hook_GenerateEntriesServer val4 = RouletteChestController_GenerateEntriesServer;
				<>O.<3>__RouletteChestController_GenerateEntriesServer = val4;
				obj4 = (object)val4;
			}
			RouletteChestController.GenerateEntriesServer += (hook_GenerateEntriesServer)obj4;
			object obj5 = <>O.<4>__ShrineChanceBehavior_AddShrineStack;
			if (obj5 == null)
			{
				hook_AddShrineStack val5 = ShrineChanceBehavior_AddShrineStack;
				<>O.<4>__ShrineChanceBehavior_AddShrineStack = val5;
				obj5 = (object)val5;
			}
			ShrineChanceBehavior.AddShrineStack += (hook_AddShrineStack)obj5;
			object obj6 = <>O.<5>__FreeChestDropTable_GenerateDropPreReplacement;
			if (obj6 == null)
			{
				hook_GenerateDropPreReplacement val6 = FreeChestDropTable_GenerateDropPreReplacement;
				<>O.<5>__FreeChestDropTable_GenerateDropPreReplacement = val6;
				obj6 = (object)val6;
			}
			FreeChestDropTable.GenerateDropPreReplacement += (hook_GenerateDropPreReplacement)obj6;
			object obj7 = <>O.<6>__OptionChestBehavior_Roll;
			if (obj7 == null)
			{
				hook_Roll val7 = OptionChestBehavior_Roll;
				<>O.<6>__OptionChestBehavior_Roll = val7;
				obj7 = (object)val7;
			}
			OptionChestBehavior.Roll += (hook_Roll)obj7;
			object obj8 = <>O.<7>__BossGroup_DropRewards;
			if (obj8 == null)
			{
				hook_DropRewards val8 = BossGroup_DropRewards;
				<>O.<7>__BossGroup_DropRewards = val8;
				obj8 = (object)val8;
			}
			BossGroup.DropRewards += (hook_DropRewards)obj8;
			object obj9 = <>O.<8>__Opening_FixedUpdate;
			if (obj9 == null)
			{
				hook_FixedUpdate val9 = Opening_FixedUpdate;
				<>O.<8>__Opening_FixedUpdate = val9;
				obj9 = (object)val9;
			}
			Opening.FixedUpdate += (hook_FixedUpdate)obj9;
			object obj10 = <>O.<9>__ChestBehavior_RollItem;
			if (obj10 == null)
			{
				hook_RollItem val10 = ChestBehavior_RollItem;
				<>O.<9>__ChestBehavior_RollItem = val10;
				obj10 = (object)val10;
			}
			ChestBehavior.RollItem += (hook_RollItem)obj10;
			object obj11 = <>O.<10>__DoppelgangerDropTable_GenerateDropPreReplacement;
			if (obj11 == null)
			{
				hook_GenerateDropPreReplacement val11 = DoppelgangerDropTable_GenerateDropPreReplacement;
				<>O.<10>__DoppelgangerDropTable_GenerateDropPreReplacement = val11;
				obj11 = (object)val11;
			}
			DoppelgangerDropTable.GenerateDropPreReplacement += (hook_GenerateDropPreReplacement)obj11;
			object obj12 = <>O.<11>__SacrificeArtifactManager_OnServerCharacterDeath;
			if (obj12 == null)
			{
				hook_OnServerCharacterDeath val12 = SacrificeArtifactManager_OnServerCharacterDeath;
				<>O.<11>__SacrificeArtifactManager_OnServerCharacterDeath = val12;
				obj12 = (object)val12;
			}
			SacrificeArtifactManager.OnServerCharacterDeath += (hook_OnServerCharacterDeath)obj12;
			object obj13 = <>O.<12>__InfiniteTowerWaveController_DropRewards;
			if (obj13 == null)
			{
				hook_DropRewards val13 = InfiniteTowerWaveController_DropRewards;
				<>O.<12>__InfiniteTowerWaveController_DropRewards = val13;
				obj13 = (object)val13;
			}
			InfiniteTowerWaveController.DropRewards += (hook_DropRewards)obj13;
			object obj14 = <>O.<13>__ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement;
			if (obj14 == null)
			{
				hook_GenerateUniqueDropsPreReplacement val14 = ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement;
				<>O.<13>__ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement = val14;
				obj14 = (object)val14;
			}
			ArenaMonsterItemDropTable.GenerateUniqueDropsPreReplacement += (hook_GenerateUniqueDropsPreReplacement)obj14;
			object obj15 = <>O.<14>__ArenaMissionController_EndRound;
			if (obj15 == null)
			{
				hook_EndRound val15 = ArenaMissionController_EndRound;
				<>O.<14>__ArenaMissionController_EndRound = val15;
				obj15 = (object)val15;
			}
			ArenaMissionController.EndRound += (hook_EndRound)obj15;
			object obj16 = <>O.<15>__EquipmentSlot_FireRecycle;
			if (obj16 == null)
			{
				hook_FireRecycle val16 = EquipmentSlot_FireRecycle;
				<>O.<15>__EquipmentSlot_FireRecycle = val16;
				obj16 = (object)val16;
			}
			EquipmentSlot.FireRecycle += (hook_FireRecycle)obj16;
		}

		private static void ItemCatalog_Init(orig_Init orig)
		{
			orig.Invoke();
			ItemLuckPlugin.TierList = TierList.Create(_config);
			UpdatableOptions.UpdateDescriptions();
		}

		private static void ChestBehavior_Roll(orig_Roll orig, ChestBehavior self)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled && Object.op_Implicit((Object)(object)self.dropTable))
			{
				using (ReplaceDropTable(self.dropTable, "ChestBehavior_Roll"))
				{
					orig.Invoke(self);
					return;
				}
			}
			orig.Invoke(self);
		}

		private static void ShopTerminalBehavior_GenerateNewPickupServer_bool(orig_GenerateNewPickupServer_bool orig, ShopTerminalBehavior self, bool newHidden)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable(self.dropTable, "ShopTerminalBehavior_GenerateNewPickupServer_bool"))
				{
					orig.Invoke(self, newHidden);
					return;
				}
			}
			orig.Invoke(self, newHidden);
		}

		private static void RouletteChestController_GenerateEntriesServer(orig_GenerateEntriesServer orig, RouletteChestController self, FixedTimeStamp startTime)
		{
			//IL_002e: 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 (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable(self.dropTable, "RouletteChestController_GenerateEntriesServer"))
				{
					orig.Invoke(self, startTime);
					return;
				}
			}
			orig.Invoke(self, startTime);
		}

		private static void ShrineChanceBehavior_AddShrineStack(orig_AddShrineStack orig, ShrineChanceBehavior self, Interactor activator)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable(self.dropTable, "ShrineChanceBehavior_AddShrineStack"))
				{
					orig.Invoke(self, activator);
					return;
				}
			}
			orig.Invoke(self, activator);
		}

		private static void BossGroup_DropRewards(orig_DropRewards orig, BossGroup self)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (CompositeDisposable compositeDisposable = new CompositeDisposable())
				{
					if (Object.op_Implicit((Object)(object)self.dropTable))
					{
						compositeDisposable.Add(ReplaceDropTable(self.dropTable, "BossGroup_DropRewards"));
					}
					else
					{
						Log.Info("dropTable is " + (((object)self.dropTable)?.GetType().Name ?? "null"));
					}
					foreach (PickupDropTable item in self.bossDropTables.Distinct())
					{
						compositeDisposable.Add(ReplaceDropTable(item, "BossGroup_DropRewards"));
					}
					orig.Invoke(self);
					return;
				}
			}
			orig.Invoke(self);
		}

		private static void Opening_FixedUpdate(orig_FixedUpdate orig, Opening self)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_0060: 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)
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				ChestBehavior component = ((EntityState)self).GetComponent<ChestBehavior>();
				BasicPickupDropTable dropTable = (BasicPickupDropTable)component.dropTable;
				using (CreateSelectorCopy(dropTable.selector, delegate(WeightedSelection<PickupIndex> x)
				{
					dropTable.selector = x;
				}))
				{
					dropTable.selector.Clear();
					List<PickupIndex> list = new List<PickupIndex> { PickupCatalog.FindPickupIndex(MiscPickups.LunarCoin.miscPickupIndex) };
					dropTable.Add(Run.instance.availableTier1DropList, component.tier1Chance / (float)Run.instance.availableTier1DropList.Count);
					dropTable.Add(Run.instance.availableTier2DropList, component.tier2Chance / (float)Run.instance.availableTier2DropList.Count);
					dropTable.Add(Run.instance.availableTier3DropList, component.tier3Chance / (float)Run.instance.availableTier3DropList.Count);
					dropTable.Add(Run.instance.availableLunarCombinedDropList, component.lunarChance / (float)Run.instance.availableLunarCombinedDropList.Count);
					dropTable.Add(list, component.lunarCoinChance);
					using (ReplaceDropTable((PickupDropTable)(object)dropTable, "Opening_FixedUpdate"))
					{
						orig.Invoke(self);
						return;
					}
				}
			}
			orig.Invoke(self);
		}

		private static void ChestBehavior_RollItem(orig_RollItem orig, ChestBehavior self)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				self.Roll();
			}
			else
			{
				orig.Invoke(self);
			}
		}

		private static PickupIndex FreeChestDropTable_GenerateDropPreReplacement(orig_GenerateDropPreReplacement orig, FreeChestDropTable self, Xoroshiro128Plus rng)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				orig.Invoke(self, rng);
				using (ReplaceDropTable((PickupDropTable)(object)self, "FreeChestDropTable_GenerateDropPreReplacement"))
				{
					return PickupDropTable.GenerateDropFromWeightedSelection(rng, self.selector);
				}
			}
			return orig.Invoke(self, rng);
		}

		private static PickupIndex DoppelgangerDropTable_GenerateDropPreReplacement(orig_GenerateDropPreReplacement orig, DoppelgangerDropTable self, Xoroshiro128Plus rng)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable((PickupDropTable)(object)self, "DoppelgangerDropTable_GenerateDropPreReplacement"))
				{
					return orig.Invoke(self, rng);
				}
			}
			return orig.Invoke(self, rng);
		}

		private static void SacrificeArtifactManager_OnServerCharacterDeath(orig_OnServerCharacterDeath orig, DamageReport damageReport)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable(SacrificeArtifactManager.dropTable, "SacrificeArtifactManager_OnServerCharacterDeath"))
				{
					orig.Invoke(damageReport);
					return;
				}
			}
			orig.Invoke(damageReport);
		}

		private static void OptionChestBehavior_Roll(orig_Roll orig, OptionChestBehavior self)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable(self.dropTable, "OptionChestBehavior_Roll"))
				{
					orig.Invoke(self);
					return;
				}
			}
			orig.Invoke(self);
		}

		private static void InfiniteTowerWaveController_DropRewards(orig_DropRewards orig, InfiniteTowerWaveController self)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable(self.rewardDropTable, "InfiniteTowerWaveController_DropRewards"))
				{
					orig.Invoke(self);
					return;
				}
			}
			orig.Invoke(self);
		}

		private static PickupIndex[] ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement(orig_GenerateUniqueDropsPreReplacement orig, ArenaMonsterItemDropTable self, int maxDrops, Xoroshiro128Plus rng)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (ReplaceDropTable((PickupDropTable)(object)self, "ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement"))
				{
					return orig.Invoke(self, maxDrops, rng);
				}
			}
			return orig.Invoke(self, maxDrops, rng);
		}

		private static void ArenaMissionController_EndRound(orig_EndRound orig, ArenaMissionController self)
		{
			if (ItemLuckPlugin.UpdateLuckEnabled)
			{
				using (CompositeDisposable compositeDisposable = new CompositeDisposable())
				{
					PickupDropTable[] playerRewardOrder = self.playerRewardOrder;
					foreach (PickupDropTable dropTable in playerRewardOrder)
					{
						compositeDisposable.Add(ReplaceDropTable(dropTable, "ArenaMissionController_EndRound"));
					}
					orig.Invoke(self);
					return;
				}
			}
			orig.Invoke(self);
		}

		private static bool EquipmentSlot_FireRecycle(orig_FireRecycle orig, EquipmentSlot self)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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_005c: 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_00a7: 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)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: 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)
			if (!ItemLuckPlugin.UpdateLuckEnabled)
			{
				return orig.Invoke(self);
			}
			self.UpdateTargets(Equipment.Recycle.equipmentIndex, false);
			GenericPickupController pickupController = self.currentTarget.pickupController;
			if (!Object.op_Implicit((Object)(object)pickupController) || pickupController.Recycled)
			{
				return false;
			}
			PickupIndex initialPickupIndex = pickupController.pickupIndex;
			self.subcooldownTimer = 0.2f;
			List<PickupIndex> list = (from pickupIndex in PickupTransmutationManager.GetAvailableGroupFromPickupIndex(pickupController.pickupIndex)
				where pickupIndex != initialPickupIndex
				select pickupIndex).ToList();
			if (list == null || list.Count == 0)
			{
				return false;
			}
			WeightedSelection<PickupIndex> val = new WeightedSelection<PickupIndex>(list.Count);
			foreach (PickupIndex item in list)
			{
				val.AddChoice(item, 1f);
			}
			ReplaceSelector(val, "EquipmentSlot_FireRecycle", null);
			pickupController.NetworkpickupIndex = val.Evaluate(Run.instance.treasureRng.nextNormalizedFloat);
			EffectManager.SimpleEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/OmniEffect/OmniRecycleEffect"), ((Component)pickupController.pickupDisplay).transform.position, Quaternion.identity, true);
			pickupController.NetworkRecycled = true;
			self.InvalidateCurrentTarget();
			return true;
		}

		private static IDisposable ReplaceDropTable(PickupDropTable dropTable, string caller)
		{
			BasicPickupDropTable basicDropTable = (BasicPickupDropTable)(object)((dropTable is BasicPickupDropTable) ? dropTable : null);
			if (basicDropTable != null)
			{
				IDisposable result = CreateSelectorCopy(basicDropTable.selector, delegate(WeightedSelection<PickupIndex> x)
				{
					basicDropTable.selector = x;
				});
				ReplaceSelector(basicDropTable.selector, caller, dropTable);
				return result;
			}
			ExplicitPickupDropTable explicitDropTable = (ExplicitPickupDropTable)(object)((dropTable is ExplicitPickupDropTable) ? dropTable : null);
			if (explicitDropTable != null)
			{
				IDisposable result2 = CreateSelectorCopy(explicitDropTable.weightedSelection, delegate(WeightedSelection<PickupIndex> x)
				{
					explicitDropTable.weightedSelection = x;
				});
				ReplaceSelector(explicitDropTable.weightedSelection, caller, dropTable);
				return result2;
			}
			FreeChestDropTable freeChestDropTable = (FreeChestDropTable)(object)((dropTable is FreeChestDropTable) ? dropTable : null);
			if (freeChestDropTable != null)
			{
				IDisposable result3 = CreateSelectorCopy(freeChestDropTable.selector, delegate(WeightedSelection<PickupIndex> x)
				{
					freeChestDropTable.selector = x;
				});
				ReplaceSelector(freeChestDropTable.selector, caller, dropTable);
				return result3;
			}
			DoppelgangerDropTable doppelgangerDropTable = (DoppelgangerDropTable)(object)((dropTable is DoppelgangerDropTable) ? dropTable : null);
			if (doppelgangerDropTable != null)
			{
				IDisposable result4 = CreateSelectorCopy(doppelgangerDropTable.selector, delegate(WeightedSelection<PickupIndex> x)
				{
					doppelgangerDropTable.selector = x;
				});
				ReplaceSelector(doppelgangerDropTable.selector, caller, dropTable);
				return result4;
			}
			ArenaMonsterItemDropTable arenaMonsterItemDropTable = (ArenaMonsterItemDropTable)(object)((dropTable is ArenaMonsterItemDropTable) ? dropTable : null);
			if (arenaMonsterItemDropTable != null)
			{
				IDisposable result5 = CreateSelectorCopy(arenaMonsterItemDropTable.selector, delegate(WeightedSelection<PickupIndex> x)
				{
					arenaMonsterItemDropTable.selector = x;
				});
				ReplaceSelector(arenaMonsterItemDropTable.selector, caller, dropTable);
				return result5;
			}
			Log.Warning("Failed to override " + caller + " dropTable");
			Log.Warning(caller + " dropTable is of type " + (((object)dropTable)?.GetType().FullName ?? "null"));
			return Disposable.Empty;
		}

		private static void ReplaceSelector(WeightedSelection<PickupIndex> selector, string caller, PickupDropTable dropTable)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < selector.Count; i++)
			{
				ref ChoiceInfo<PickupIndex> reference = ref selector.choices[i];
				float weight = reference.weight;
				float num = (ItemLuckPlugin.TierList.GetTier(((PickupIndex)(ref reference.value)).itemIndex) ?? ItemLuckPlugin.TierList.GetTier(((PickupIndex)(ref reference.value)).equipmentIndex) ?? Tier.Unspecified).ApplyItemLuck(reference.weight);
				selector.ModifyChoiceWeight(i, num);
				Log.Debug($"{Language.GetString(((PickupIndex)(ref reference.value)).pickupDef.nameToken)} weight changed from {weight} to {num}");
			}
			Log.Debug(caller + " " + ((object)dropTable)?.GetType()?.Name + " (" + ((dropTable != null) ? ((Object)dropTable).name : null) + ") replaced");
		}

		private static IDisposable CreateSelectorCopy(WeightedSelection<PickupIndex> selector, Action<WeightedSelection<PickupIndex>> setSelector)
		{
			WeightedSelection<PickupIndex> oldSelector = selector;
			setSelector(new WeightedSelection<PickupIndex>(8)
			{
				Capacity = selector.Capacity,
				choices = selector.choices.ToArray(),
				totalWeight = selector.totalWeight,
				Count = selector.Count
			});
			return new Disposable(delegate
			{
				setSelector(oldSelector);
			});
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("Lawlzee.ItemLuck", "ItemLuck", "1.0.1")]
	public class ItemLuckPlugin : BaseUnityPlugin
	{
		public const string PluginGUID = "Lawlzee.ItemLuck";

		public const string PluginAuthor = "Lawlzee";

		public const string PluginName = "ItemLuck";

		public const string PluginVersion = "1.0.1";

		public static ConfigEntry<bool> ModEnabled;

		public static ConfigEntry<float> ItemLuck;

		public static TierList TierList;

		public static bool UpdateLuckEnabled
		{
			get
			{
				if (ModEnabled.Value)
				{
					return ItemLuck.Value != 0f;
				}
				return false;
			}
		}

		public void Awake()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//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_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Expected O, but got Unknown
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			Log.Init(((BaseUnityPlugin)this).Logger);
			ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Configuration", "Mod enabled", true, "Mod enabled");
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ModEnabled));
			ItemLuck = ((BaseUnityPlugin)this).Config.Bind<float>("Configuration", "Item luck", 2f, "Controls the item luck");
			UpdatableStepSliderOption option = new UpdatableStepSliderOption(ItemLuck, new StepSliderConfig
			{
				min = -8f,
				max = 8f,
				increment = 0.05f,
				formatString = "{0:+0.##;-0.##;0.##}"
			});
			ModSettingsManager.AddOption((BaseOption)(object)option);
			ItemLuck.SettingChanged += delegate
			{
				UpdatableOptions.UpdateDescriptions();
				option.UpdatePanel();
			};
			Texture2D val = LoadTexture("icon.png");
			ModSettingsManager.SetModIcon(Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f)));
			Hooks.Init(((BaseUnityPlugin)this).Config);
		}

		private Texture2D LoadTexture(string name)
		{
			//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_0028: Expected O, but got Unknown
			//IL_002a: Expected O, but got Unknown
			Texture2D val = new Texture2D(2, 2);
			ImageConversion.LoadImage(val, File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), name)));
			return val;
		}
	}
	public static class ItemTierExtensions
	{
		public static string GetShortName(this ItemTier itemTier)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected I4, but got Unknown
			return (int)itemTier switch
			{
				0 => "White items", 
				1 => "Green items", 
				2 => "Red items", 
				3 => "Lunar items", 
				4 => "Boss items", 
				6 => "Void items", 
				7 => "Void items", 
				8 => "Void items", 
				9 => "Void items", 
				_ => "Other items", 
			};
		}

		public static string GetFullName(this ItemTier itemTier)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected I4, but got Unknown
			return (int)itemTier switch
			{
				0 => "White items", 
				1 => "Green items", 
				2 => "Red items", 
				3 => "Lunar items", 
				4 => "Boss items", 
				6 => "Void white items", 
				7 => "Void green items", 
				8 => "Void red items", 
				9 => "Void boss items", 
				_ => "Other items", 
			};
		}
	}
	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 enum Tier
	{
		S,
		A,
		B,
		C,
		D,
		F,
		Unspecified
	}
	public static class TierExtensions
	{
		public static float ToMultiplier(this Tier tier)
		{
			return tier switch
			{
				Tier.S => 1f, 
				Tier.A => 0.6f, 
				Tier.B => 0.2f, 
				Tier.C => -0.2f, 
				Tier.D => -0.6f, 
				Tier.F => -1f, 
				_ => 0f, 
			};
		}

		public static float ApplyItemLuck(this Tier itemTier, float currentWeigth)
		{
			float num = itemTier.ToMultiplier();
			return 2f * currentWeigth / (1f + Mathf.Exp(num * ItemLuckPlugin.ItemLuck.Value * -0.8f));
		}
	}
	public class Rank<T>
	{
		public T Def { get; }

		public Tier Tier { get; }

		public Rank(T index, Tier tier)
		{
			Def = index;
			Tier = tier;
		}
	}
}