Decompiled source of EquipmentAndQuickSlots v2.1.14

Plugins/EquipmentAndQuickSlots.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using Auga;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Common;
using CreatureLevelControl;
using HarmonyLib;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: AssemblyTitle("EquipmentAndQuickSlots")]
[assembly: AssemblyConfiguration("")]
[assembly: Guid("08ed5bc9-9e0c-4343-90a5-92497be6e216")]
[assembly: AssemblyCompany("Randy Knapp Mods")]
[assembly: AssemblyFileVersion("2.1.14")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: ComVisible(false)]
[assembly: AssemblyDescription("")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCopyright("Copyright © Randy Knapp 2023")]
[assembly: AssemblyProduct("EquipmentAndQuickSlots")]
[assembly: CompilationRelaxations(8)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.1.14.0")]
[module: UnverifiableCode]
public static class PlayerExtensions
{
	public static ZDO GetZDO(this Player player)
	{
		return ((Character)player).m_nview.GetZDO();
	}
}
namespace Common
{
	public class ConfigPositionedElement : MonoBehaviour
	{
		public ConfigEntry<TextAnchor> AnchorConfig;

		public ConfigEntry<Vector2> PositionConfig;

		protected RectTransform _rt;

		protected TextAnchor _currentAnchor;

		public virtual void Awake()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			_rt = (RectTransform)((Component)this).transform;
			EnsureCorrectPosition();
		}

		public virtual void Update()
		{
			EnsureCorrectPosition();
		}

		public virtual void EnsureCorrectPosition()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_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: 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_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected I4, but got Unknown
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: 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)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: 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_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: 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_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
			if (AnchorConfig != null && PositionConfig != null && (_currentAnchor != AnchorConfig.Value || !(_rt.anchoredPosition == PositionConfig.Value)))
			{
				_currentAnchor = AnchorConfig.Value;
				TextAnchor currentAnchor = _currentAnchor;
				TextAnchor val = currentAnchor;
				Vector2 val2 = default(Vector2);
				switch ((int)val)
				{
				case 0:
				{
					RectTransform rt25 = _rt;
					RectTransform rt26 = _rt;
					RectTransform rt27 = _rt;
					((Vector2)(ref val2))..ctor(0f, 1f);
					rt27.anchorMax = val2;
					Vector2 pivot = (rt26.anchorMin = val2);
					rt25.pivot = pivot;
					break;
				}
				case 1:
				{
					RectTransform rt22 = _rt;
					RectTransform rt23 = _rt;
					RectTransform rt24 = _rt;
					((Vector2)(ref val2))..ctor(0.5f, 1f);
					rt24.anchorMax = val2;
					Vector2 pivot = (rt23.anchorMin = val2);
					rt22.pivot = pivot;
					break;
				}
				case 2:
				{
					RectTransform rt19 = _rt;
					RectTransform rt20 = _rt;
					RectTransform rt21 = _rt;
					((Vector2)(ref val2))..ctor(1f, 1f);
					rt21.anchorMax = val2;
					Vector2 pivot = (rt20.anchorMin = val2);
					rt19.pivot = pivot;
					break;
				}
				case 3:
				{
					RectTransform rt16 = _rt;
					RectTransform rt17 = _rt;
					RectTransform rt18 = _rt;
					((Vector2)(ref val2))..ctor(0f, 0.5f);
					rt18.anchorMax = val2;
					Vector2 pivot = (rt17.anchorMin = val2);
					rt16.pivot = pivot;
					break;
				}
				case 4:
				{
					RectTransform rt13 = _rt;
					RectTransform rt14 = _rt;
					RectTransform rt15 = _rt;
					((Vector2)(ref val2))..ctor(0.5f, 0.5f);
					rt15.anchorMax = val2;
					Vector2 pivot = (rt14.anchorMin = val2);
					rt13.pivot = pivot;
					break;
				}
				case 5:
				{
					RectTransform rt10 = _rt;
					RectTransform rt11 = _rt;
					RectTransform rt12 = _rt;
					((Vector2)(ref val2))..ctor(1f, 0.5f);
					rt12.anchorMax = val2;
					Vector2 pivot = (rt11.anchorMin = val2);
					rt10.pivot = pivot;
					break;
				}
				case 6:
				{
					RectTransform rt7 = _rt;
					RectTransform rt8 = _rt;
					RectTransform rt9 = _rt;
					((Vector2)(ref val2))..ctor(0f, 0f);
					rt9.anchorMax = val2;
					Vector2 pivot = (rt8.anchorMin = val2);
					rt7.pivot = pivot;
					break;
				}
				case 7:
				{
					RectTransform rt4 = _rt;
					RectTransform rt5 = _rt;
					RectTransform rt6 = _rt;
					((Vector2)(ref val2))..ctor(0.5f, 0f);
					rt6.anchorMax = val2;
					Vector2 pivot = (rt5.anchorMin = val2);
					rt4.pivot = pivot;
					break;
				}
				case 8:
				{
					RectTransform rt = _rt;
					RectTransform rt2 = _rt;
					RectTransform rt3 = _rt;
					((Vector2)(ref val2))..ctor(1f, 0f);
					rt3.anchorMax = val2;
					Vector2 pivot = (rt2.anchorMin = val2);
					rt.pivot = pivot;
					break;
				}
				}
				_rt.anchoredPosition = PositionConfig.Value;
			}
		}
	}
	[Serializable]
	public class RecipeRequirementConfig
	{
		public string item = "";

		public int amount = 1;
	}
	[Serializable]
	public class RecipeConfig
	{
		public string name = "";

		public string item = "";

		public int amount = 1;

		public string craftingStation = "";

		public int minStationLevel = 1;

		public bool enabled = true;

		public string repairStation = "";

		public List<RecipeRequirementConfig> resources = new List<RecipeRequirementConfig>();
	}
	[Serializable]
	public class RecipesConfig
	{
		public List<RecipeConfig> recipes = new List<RecipeConfig>();
	}
	public static class GameObjectExtensions
	{
		public static RectTransform RectTransform(this GameObject go)
		{
			Transform transform = go.transform;
			return (RectTransform)(object)((transform is RectTransform) ? transform : null);
		}

		public static T RequireComponent<T>(this GameObject go) where T : Component
		{
			T component = go.GetComponent<T>();
			return ((Object)(object)component == (Object)null) ? go.AddComponent<T>() : component;
		}
	}
	public class GotDestroyed : MonoBehaviour
	{
		public void OnDisable()
		{
			Debug.LogError((object)("I got destroyed! (" + ((Object)((Component)this).gameObject).name + ")"));
			Debug.Log((object)Environment.StackTrace);
		}
	}
	public class MultiValueDictionary<TKey, TValue> : Dictionary<TKey, List<TValue>>
	{
		public void Add(TKey key, TValue value)
		{
			if (!TryGetValue(key, out var value2))
			{
				value2 = new List<TValue>();
				Add(key, value2);
			}
			value2.Add(value);
		}

		public bool ContainsValue(TKey key, TValue value)
		{
			if (TryGetValue(key, out var value2))
			{
				return value2.Contains(value);
			}
			return false;
		}

		public void Remove(TKey key, TValue value)
		{
			if (TryGetValue(key, out var value2))
			{
				value2.Remove(value);
				if (value2.Count <= 0)
				{
					Remove(key);
				}
			}
		}

		public void Merge(MultiValueDictionary<TKey, TValue> toMergeWith)
		{
			if (toMergeWith == null)
			{
				return;
			}
			foreach (KeyValuePair<TKey, List<TValue>> item in toMergeWith)
			{
				foreach (TValue item2 in item.Value)
				{
					Add(item.Key, item2);
				}
			}
		}

		public List<TValue> GetValues(TKey key, bool returnEmptySet = false)
		{
			if (!TryGetValue(key, out var value) && returnEmptySet)
			{
				return new List<TValue>();
			}
			return value;
		}
	}
	public static class PrefabCreator
	{
		public static ManualLogSource Logger;

		public static Dictionary<string, CraftingStation> CraftingStations;

		public static T RequireComponent<T>(GameObject go) where T : Component
		{
			T val = go.GetComponent<T>();
			if ((Object)(object)val == (Object)null)
			{
				val = go.AddComponent<T>();
			}
			return val;
		}

		public static void Reset()
		{
			CraftingStations = null;
		}

		private static void InitCraftingStations()
		{
			if (CraftingStations != null)
			{
				return;
			}
			CraftingStations = new Dictionary<string, CraftingStation>();
			foreach (Recipe recipe in ObjectDB.instance.m_recipes)
			{
				if ((Object)(object)recipe.m_craftingStation != (Object)null && !CraftingStations.ContainsKey(((Object)recipe.m_craftingStation).name))
				{
					CraftingStations.Add(((Object)recipe.m_craftingStation).name, recipe.m_craftingStation);
				}
			}
		}

		public static Recipe CreateRecipe(string name, string itemId, RecipeConfig recipeConfig)
		{
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Expected O, but got Unknown
			InitCraftingStations();
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemId);
			if ((Object)(object)itemPrefab == (Object)null)
			{
				ManualLogSource logger = Logger;
				if (logger != null)
				{
					logger.LogWarning((object)("[PrefabCreator] Could not find item prefab (" + itemId + ")"));
				}
				return null;
			}
			Recipe val = ScriptableObject.CreateInstance<Recipe>();
			((Object)val).name = name;
			val.m_amount = recipeConfig.amount;
			val.m_minStationLevel = recipeConfig.minStationLevel;
			val.m_item = itemPrefab.GetComponent<ItemDrop>();
			val.m_enabled = recipeConfig.enabled;
			if (!string.IsNullOrEmpty(recipeConfig.craftingStation))
			{
				if (!CraftingStations.ContainsKey(recipeConfig.craftingStation))
				{
					ManualLogSource logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("[PrefabCreator] Could not find crafting station (" + itemId + "): " + recipeConfig.craftingStation));
					}
					string text = string.Join(", ", CraftingStations.Keys);
					ManualLogSource logger3 = Logger;
					if (logger3 != null)
					{
						logger3.LogInfo((object)("[PrefabCreator] Available Stations: " + text));
					}
				}
				else
				{
					val.m_craftingStation = CraftingStations[recipeConfig.craftingStation];
				}
			}
			if (!string.IsNullOrEmpty(recipeConfig.repairStation))
			{
				if (!CraftingStations.ContainsKey(recipeConfig.repairStation))
				{
					ManualLogSource logger4 = Logger;
					if (logger4 != null)
					{
						logger4.LogWarning((object)("[PrefabCreator] Could not find repair station (" + itemId + "): " + recipeConfig.repairStation));
					}
					string text2 = string.Join(", ", CraftingStations.Keys);
					ManualLogSource logger5 = Logger;
					if (logger5 != null)
					{
						logger5.LogInfo((object)("[PrefabCreator] Available Stations: " + text2));
					}
				}
				else
				{
					val.m_repairStation = CraftingStations[recipeConfig.repairStation];
				}
			}
			List<Requirement> list = new List<Requirement>();
			foreach (RecipeRequirementConfig resource in recipeConfig.resources)
			{
				GameObject itemPrefab2 = ObjectDB.instance.GetItemPrefab(resource.item);
				if ((Object)(object)itemPrefab2 == (Object)null)
				{
					ManualLogSource logger6 = Logger;
					if (logger6 != null)
					{
						logger6.LogError((object)("[PrefabCreator] Could not find requirement item (" + itemId + "): " + resource.item));
					}
				}
				else
				{
					list.Add(new Requirement
					{
						m_amount = resource.amount,
						m_resItem = itemPrefab2.GetComponent<ItemDrop>()
					});
				}
			}
			val.m_resources = list.ToArray();
			return val;
		}

		public static Recipe AddNewRecipe(string name, string itemId, RecipeConfig recipeConfig)
		{
			Recipe val = CreateRecipe(name, itemId, recipeConfig);
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("[PrefabCreator] Failed to create recipe (" + name + ")"));
				}
				return null;
			}
			return AddNewRecipe(val);
		}

		public static Recipe AddNewRecipe(Recipe recipe)
		{
			int num = ObjectDB.instance.m_recipes.RemoveAll((Recipe x) => ((Object)x).name == ((Object)recipe).name);
			if (num > 0)
			{
				ManualLogSource logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)$"[PrefabCreator] Removed recipe ({((Object)recipe).name}): {num}");
				}
			}
			ObjectDB.instance.m_recipes.Add(recipe);
			ManualLogSource logger2 = Logger;
			if (logger2 != null)
			{
				logger2.LogInfo((object)("[PrefabCreator] Added recipe: " + ((Object)recipe).name));
			}
			return recipe;
		}
	}
	[Serializable]
	public struct SerializableVector3
	{
		public float x;

		public float y;

		public float z;

		public SerializableVector3(float x, float y, float z)
		{
			this.x = x;
			this.y = y;
			this.z = z;
		}

		public void ToPackage(ZPackage pkg)
		{
			pkg.Write(x);
			pkg.Write(y);
			pkg.Write(z);
		}

		public static SerializableVector3 FromPackage(ZPackage pkg)
		{
			SerializableVector3 result = default(SerializableVector3);
			result.x = pkg.ReadSingle();
			result.y = pkg.ReadSingle();
			result.z = pkg.ReadSingle();
			return result;
		}

		public override string ToString()
		{
			return $"[{x}, {y}, {z}]";
		}

		public static implicit operator Vector3(SerializableVector3 s)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			return new Vector3(s.x, s.y, s.z);
		}

		public static implicit operator SerializableVector3(Vector3 v)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			return new SerializableVector3(v.x, v.y, v.z);
		}

		public static SerializableVector3 operator +(SerializableVector3 a, SerializableVector3 b)
		{
			return new SerializableVector3(a.x + b.x, a.y + b.y, a.z + b.z);
		}

		public static SerializableVector3 operator -(SerializableVector3 a, SerializableVector3 b)
		{
			return new SerializableVector3(a.x - b.x, a.y - b.y, a.z - b.z);
		}

		public static SerializableVector3 operator -(SerializableVector3 a)
		{
			return new SerializableVector3(0f - a.x, 0f - a.y, 0f - a.z);
		}

		public static SerializableVector3 operator *(SerializableVector3 a, float m)
		{
			return new SerializableVector3(a.x * m, a.y * m, a.z * m);
		}

		public static SerializableVector3 operator *(float m, SerializableVector3 a)
		{
			return new SerializableVector3(a.x * m, a.y * m, a.z * m);
		}

		public static SerializableVector3 operator /(SerializableVector3 a, float d)
		{
			return new SerializableVector3(a.x / d, a.y / d, a.z / d);
		}
	}
	public static class Utils
	{
		public static void PrintObject(object o)
		{
			if (o == null)
			{
				Debug.Log((object)"null");
			}
			else
			{
				Debug.Log((object)(o?.ToString() + ":\n" + GetObjectString(o, "  ")));
			}
		}

		public static string GetObjectString(object obj, string indent)
		{
			string text = "";
			Type type = obj.GetType();
			IEnumerable<FieldInfo> enumerable = from f in type.GetFields()
				where f.IsPublic
				select f;
			foreach (FieldInfo item in enumerable)
			{
				object value = item.GetValue(obj);
				string text2 = ((value == null) ? "null" : value.ToString());
				text = text + "\n" + indent + item.Name + ": " + text2;
			}
			return text;
		}

		public static Sprite LoadSpriteFromFile(string spritePath)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			spritePath = Path.Combine(Paths.PluginPath, spritePath);
			if (File.Exists(spritePath))
			{
				byte[] array = File.ReadAllBytes(spritePath);
				Texture2D val = new Texture2D(20, 20);
				if (ImageConversion.LoadImage(val, array))
				{
					return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), default(Vector2), 100f);
				}
			}
			return null;
		}

		public static Sprite LoadSpriteFromFile(string modFolder, string iconName)
		{
			string spritePath = Path.Combine(modFolder, iconName);
			return LoadSpriteFromFile(spritePath);
		}

		public static string RemoveBetween(string s, string from, string to)
		{
			int num = 0;
			while (num >= 0)
			{
				num = s.IndexOf(from, StringComparison.InvariantCulture);
				if (num < 0)
				{
					break;
				}
				int num2 = s.IndexOf(to, num, StringComparison.InvariantCulture);
				if (num2 < 0)
				{
					break;
				}
				s = s.Remove(num, num2 - num + to.Length);
			}
			return s;
		}

		public static void CopyFields(object originalObject, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public)
		{
			FieldInfo[] fields = typeToReflect.GetFields(bindingFlags);
			foreach (FieldInfo fieldInfo in fields)
			{
				object value = fieldInfo.GetValue(originalObject);
				fieldInfo.SetValue(cloneObject, value);
			}
		}

		public static bool IsServer()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Invalid comparison between Unknown and I4
			return ZNet.instance.IsServer() || ZNet.instance.IsDedicated() || (int)SystemInfo.graphicsDeviceType == 4;
		}
	}
	public static class ArrayUtils
	{
		public static bool IsNullOrEmpty<T>(T[] a)
		{
			return a == null || a.Length == 0;
		}

		public static T[] Copy<T>(T[] other)
		{
			return other?.ToArray();
		}
	}
	public static class ListExtensions
	{
		public static bool TryFind<T>(this List<T> list, Predicate<T> predicate, out T result)
		{
			int num = list.FindIndex(predicate);
			if (num != -1)
			{
				result = list[num];
				return true;
			}
			result = default(T);
			return false;
		}
	}
	public class WeightedRandomCollection<T>
	{
		private readonly Random _random;

		private List<T> _list;

		private Func<T, float> _weightSelector;

		private bool _removeOnSelect;

		public float TotalWeight { get; private set; }

		public WeightedRandomCollection(Random random)
		{
			_random = random;
		}

		public WeightedRandomCollection(Random random, IEnumerable<T> collection, Func<T, float> weightSelector, bool removeOnSelect = false)
		{
			_random = random ?? new Random();
			Setup(collection, weightSelector, removeOnSelect);
		}

		public void Setup(IEnumerable<T> collection, Func<T, float> weightSelector, bool removeOnSelect = false)
		{
			_list = collection.ToList();
			_weightSelector = weightSelector;
			_removeOnSelect = removeOnSelect;
			TotalWeight = _list.Sum(_weightSelector);
		}

		public T Roll()
		{
			if (_list == null)
			{
				return default(T);
			}
			float num = (float)_random.NextDouble() * TotalWeight;
			float num2 = 0f;
			T val = default(T);
			foreach (var item in _list.Select((T weightedItem) => new
			{
				Value = weightedItem,
				Weight = _weightSelector(weightedItem)
			}))
			{
				num2 += item.Weight;
				if (num2 >= num)
				{
					val = item.Value;
					break;
				}
			}
			if (_removeOnSelect)
			{
				_list.Remove(val);
				TotalWeight = _list.Sum(_weightSelector);
			}
			return val;
		}

		public List<T> Roll(int numberOfRolls)
		{
			if (_list == null)
			{
				return null;
			}
			List<T> list = new List<T>();
			for (int i = 0; i < numberOfRolls; i++)
			{
				T x = Roll();
				if (!EqualityComparer<T>.Default.Equals(x, default(T)))
				{
					list.Add(Roll());
				}
			}
			return list;
		}

		public void Reset()
		{
			_list = null;
			_weightSelector = null;
			_removeOnSelect = false;
			TotalWeight = 0f;
		}
	}
}
namespace EquipmentAndQuickSlots
{
	public static class InventoryExtensions
	{
		public static bool IsExtended(this Inventory inventory)
		{
			return inventory is ExtendedInventory;
		}

		public static ExtendedInventory Extended(this Inventory inventory)
		{
			return (inventory is ExtendedInventory extendedInventory) ? extendedInventory : null;
		}

		public static bool DoExtendedCall(this Inventory inventory)
		{
			return inventory.Extended() != null && !inventory.Extended().CallBase;
		}

		public static bool CountAsEmptySlots(this Inventory inventory, Player player)
		{
			return inventory != player.GetEquipmentSlotInventory();
		}
	}
	public class ExtendedInventory : Inventory
	{
		private readonly Player _player;

		private List<Inventory> _inventories;

		public bool CallBase { get; set; }

		public ExtendedInventory(Player player, string name, Sprite bkg, int w, int h)
			: base(name, bkg, w, h)
		{
			_player = player;
		}

		public void OverrideAwake()
		{
			_player.InitializeExtendedPlayer();
			_inventories = _player.GetAllInventories();
			OverrideUpdateTotalWeight();
		}

		public bool OverrideCanAddItem(GameObject prefab, int stack)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.CountAsEmptySlots(_player) && x.CanAddItem(prefab, stack));
			CallBase = false;
			return result;
		}

		public bool OverrideCanAddItem(ItemData item, int stack)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.CountAsEmptySlots(_player) && x.CanAddItem(item, stack));
			CallBase = false;
			return result;
		}

		public bool OverrideAddItem(ItemData item)
		{
			CallBase = true;
			bool result = false;
			foreach (Inventory inventory in _inventories)
			{
				if (!inventory.CountAsEmptySlots(_player) || !inventory.AddItem(item))
				{
					continue;
				}
				OverrideUpdateTotalWeight();
				result = true;
				break;
			}
			CallBase = false;
			return result;
		}

		public Vector2i OverrideFindEmptySlot(bool topFirst)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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)
			CallBase = true;
			Vector2i val = default(Vector2i);
			((Vector2i)(ref val))..ctor(-1, -1);
			foreach (Inventory inventory in _inventories)
			{
				if (inventory.CountAsEmptySlots(_player))
				{
					val = inventory.FindEmptySlot(topFirst);
					if (val.x != -1)
					{
						break;
					}
				}
			}
			CallBase = false;
			return val;
		}

		public ItemData OverrideFindFreeStackItem(string name, int quality, float worldLevel)
		{
			ItemData val = null;
			foreach (Inventory inventory in _inventories)
			{
				if (inventory.CountAsEmptySlots(_player))
				{
					val = inventory.FindFreeStackItem(name, quality, worldLevel);
					if (val != null)
					{
						break;
					}
				}
			}
			return val;
		}

		public bool OverrideContainsItem(ItemData item)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.ContainsItem(item));
			CallBase = false;
			return result;
		}

		public List<ItemData> OverrideGetEquipedItems()
		{
			CallBase = true;
			List<ItemData> result = new List<ItemData>();
			_inventories.ForEach(delegate(Inventory x)
			{
				result.AddRange(x.GetEquippedItems());
			});
			CallBase = false;
			return result;
		}

		public void OverrideGetWornItems(List<ItemData> worn)
		{
			CallBase = true;
			_inventories.ForEach(delegate(Inventory x)
			{
				x.GetWornItems(worn);
			});
			CallBase = false;
		}

		public void OverrideGetValuableItems(List<ItemData> items)
		{
			CallBase = true;
			_inventories.ForEach(delegate(Inventory x)
			{
				x.GetValuableItems(items);
			});
			CallBase = false;
		}

		public List<ItemData> OverrideGetAllItems()
		{
			CallBase = true;
			List<ItemData> result = new List<ItemData>();
			_inventories.ForEach(delegate(Inventory x)
			{
				result.AddRange(x.m_inventory);
			});
			CallBase = false;
			return result;
		}

		public void OverrideGetAllItems(string name, List<ItemData> items)
		{
			CallBase = true;
			_inventories.ForEach(delegate(Inventory x)
			{
				x.GetAllItems(name, items);
			});
			CallBase = false;
		}

		public void OverrideGetAllItems(ItemType type, List<ItemData> items)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			CallBase = true;
			_inventories.ForEach(delegate(Inventory x)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				x.GetAllItems(type, items);
			});
			CallBase = false;
		}

		public int OverrideGetEmptySlots()
		{
			CallBase = true;
			int result = _inventories.Sum((Inventory x) => x.CountAsEmptySlots(_player) ? x.GetEmptySlots() : 0);
			CallBase = false;
			return result;
		}

		public bool OverrideHaveEmptySlot()
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.CountAsEmptySlots(_player) && x.HaveEmptySlot());
			CallBase = false;
			return result;
		}

		public bool OverrideRemoveOneItem(ItemData item)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.RemoveOneItem(item));
			OverrideUpdateTotalWeight();
			CallBase = false;
			return result;
		}

		public bool OverrideRemoveItem(ItemData item)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.RemoveItem(item));
			OverrideUpdateTotalWeight();
			CallBase = false;
			return result;
		}

		public bool OverrideRemoveItem(ItemData item, int amount)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.RemoveItem(item, amount));
			OverrideUpdateTotalWeight();
			CallBase = false;
			return result;
		}

		public void OverrideRemoveItem(string name, int amount, int itemQuality = -1, bool worldLevelBased = true)
		{
			CallBase = true;
			foreach (Inventory inventory in _inventories)
			{
				foreach (ItemData item in inventory.m_inventory)
				{
					if (item.m_shared.m_name == name && (itemQuality < 0 || item.m_quality == itemQuality) && (!worldLevelBased || item.m_worldLevel >= Game.m_worldLevel))
					{
						int num = Mathf.Min(item.m_stack, amount);
						item.m_stack -= num;
						amount -= num;
						inventory.Changed();
						if (amount <= 0)
						{
							break;
						}
					}
				}
				inventory.m_inventory.RemoveAll((ItemData x) => x.m_stack <= 0);
				OverrideUpdateTotalWeight();
			}
			CallBase = false;
		}

		public bool OverrideHaveItem(string name, bool matchWorldLevel)
		{
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.HaveItem(name, matchWorldLevel));
			CallBase = false;
			return result;
		}

		public bool OverrideHaveItem(ItemType type, bool matchWorldLevel)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			CallBase = true;
			bool result = _inventories.Any((Inventory x) => x.HaveItem(type, matchWorldLevel));
			CallBase = false;
			return result;
		}

		public void OverrideGetAllPieceTables(List<PieceTable> tables)
		{
			CallBase = true;
			_inventories.ForEach(delegate(Inventory x)
			{
				x.GetAllPieceTables(tables);
			});
			CallBase = false;
		}

		public int OverrideCountItems(string name, bool matchWorldLevel)
		{
			CallBase = true;
			int result = _inventories.Sum((Inventory x) => x.CountItems(name, -1, matchWorldLevel));
			CallBase = false;
			return result;
		}

		public ItemData OverrideGetItem(string name, int quality = -1, bool isPrefabName = false)
		{
			CallBase = true;
			ItemData val = null;
			foreach (Inventory inventory in _inventories)
			{
				val = inventory.GetItem(name, quality, isPrefabName);
				if (val != null)
				{
					break;
				}
			}
			CallBase = false;
			return val;
		}

		public ItemData OverrideGetAmmoItem(string ammoName, string matchPrefabName = null)
		{
			CallBase = true;
			ItemData val = null;
			foreach (Inventory inventory in _inventories)
			{
				val = inventory.GetAmmoItem(ammoName, matchPrefabName);
				if (val != null)
				{
					break;
				}
			}
			CallBase = false;
			return val;
		}

		public int OverrideFindFreeStackSpace(string name, float worldLevel)
		{
			CallBase = true;
			int result = _inventories.Sum((Inventory x) => x.FindFreeStackSpace(name, worldLevel));
			CallBase = false;
			return result;
		}

		public int OverrideNrOfItems()
		{
			CallBase = true;
			int result = _inventories.Sum((Inventory x) => x.NrOfItems());
			CallBase = false;
			return result;
		}

		public float OverrideSlotsUsedPercentage()
		{
			float num = _inventories.Sum((Inventory x) => x.m_inventory.Count);
			float num2 = _inventories.Sum((Inventory x) => x.m_width * x.m_height);
			return num / num2 * 100f;
		}

		public void OverrideUpdateTotalWeight()
		{
			CallBase = true;
			base.m_totalWeight = 0f;
			float[] array = new float[_inventories.Count()];
			for (int i = 0; i < _inventories.Count(); i++)
			{
				foreach (ItemData item in _inventories[i].m_inventory)
				{
					array[i] += item.GetWeight(-1);
				}
				base.m_totalWeight += array[i];
			}
			CallBase = false;
		}

		public bool OverrideIsTeleportable()
		{
			CallBase = true;
			bool result = _inventories.All((Inventory x) => x.IsTeleportable());
			CallBase = false;
			return result;
		}
	}
	public static class CustomHotkeyBar
	{
		[HarmonyPatch(typeof(HotkeyBar), "UpdateIcons")]
		public static class HotkeyBar_UpdateIcons_Patch
		{
			public static void UpdateIcons(HotkeyBar instance, Player player, List<ItemData> m_items)
			{
				if (!(((Object)instance).name != "QuickSlotsHotkeyBar"))
				{
					player.GetQuickSlotInventory().GetBoundItems(m_items);
				}
			}

			public static int UpdateIconCount(int defaultCount, HotkeyBar instance)
			{
				if (((Object)instance).name != "QuickSlotsHotkeyBar")
				{
					return defaultCount;
				}
				return 3;
			}

			public static void UpdateIconBinding(HotkeyBar instance, int index, ElementData elementData)
			{
				if (!(((Object)instance).name != "QuickSlotsHotkeyBar"))
				{
					TMP_Text component = ((Component)elementData.m_go.transform.Find("binding")).GetComponent<TMP_Text>();
					((Behaviour)component).enabled = true;
					component.overflowMode = (TextOverflowModes)0;
					component.textWrappingMode = (TextWrappingModes)0;
					component.text = EquipmentAndQuickSlots.GetBindingLabel(index);
				}
			}

			[UsedImplicitly]
			public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				List<CodeInstruction> instrs = instructions.ToList();
				bool patched1 = false;
				bool patched2 = false;
				bool patched3 = false;
				int counter9 = 0;
				MethodInfo boundItemsMethod = AccessTools.DeclaredMethod(typeof(Inventory), "GetBoundItems", (Type[])null, (Type[])null);
				FieldInfo itemsListField = AccessTools.DeclaredField(typeof(HotkeyBar), "m_items");
				MethodInfo setTextProperty = AccessTools.PropertySetter(typeof(TMP_Text), "text");
				int i = 0;
				while (i < instrs.Count)
				{
					yield return LogMessage(instrs[i]);
					counter9++;
					if (i > 6 && instrs[i].opcode == OpCodes.Callvirt && instrs[i].operand.Equals(boundItemsMethod))
					{
						CodeInstruction ldArgInstruction = new CodeInstruction(OpCodes.Ldarg_0, (object)null);
						if (instrs[i].labels.Count > 0)
						{
							CodeInstructionExtensions.MoveLabelsTo(instrs[i], ldArgInstruction);
						}
						yield return LogMessage(ldArgInstruction);
						counter9++;
						yield return LogMessage(new CodeInstruction(OpCodes.Ldarg_1, (object)null));
						counter9++;
						yield return LogMessage(new CodeInstruction(OpCodes.Ldarg_0, (object)null));
						counter9++;
						yield return LogMessage(new CodeInstruction(OpCodes.Ldfld, (object)itemsListField));
						counter9++;
						yield return LogMessage(new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(HotkeyBar_UpdateIcons_Patch), "UpdateIcons", (Type[])null, (Type[])null)));
						counter9++;
						patched1 = true;
					}
					else if (i > 6 && instrs[i].opcode == OpCodes.Ldc_I4_0 && instrs[i + 1].opcode == OpCodes.Stloc_0)
					{
						yield return LogMessage(new CodeInstruction(OpCodes.Ldarg_0, (object)null));
						counter9++;
						yield return LogMessage(new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(HotkeyBar_UpdateIcons_Patch), "UpdateIconCount", (Type[])null, (Type[])null)));
						counter9++;
						patched2 = true;
					}
					else if (i > 6 && instrs[i].opcode == OpCodes.Callvirt && instrs[i].operand.Equals(setTextProperty) && instrs[i - 1].opcode == OpCodes.Call && instrs[i - 17].opcode == OpCodes.Ldstr && instrs[i - 17].operand.Equals("binding"))
					{
						object indexOperand = ((instrs[i - 6].opcode == OpCodes.Ldloc_S) ? instrs[i - 6].operand : null);
						object elementDataOperand = ((instrs[i + 1].opcode == OpCodes.Ldloc_S) ? instrs[i + 1].operand : null);
						if (indexOperand != null)
						{
							yield return LogMessage(new CodeInstruction(OpCodes.Ldarg_0, (object)null));
							counter9++;
							yield return LogMessage(new CodeInstruction(OpCodes.Ldloc_S, indexOperand));
							counter9++;
							yield return LogMessage(new CodeInstruction(OpCodes.Ldloc_S, elementDataOperand));
							counter9++;
							yield return LogMessage(new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(HotkeyBar_UpdateIcons_Patch), "UpdateIconBinding", (Type[])null, (Type[])null)));
							counter9++;
							patched3 = true;
						}
						else
						{
							EquipmentAndQuickSlots.LogError("Can't Find Index Operand !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
						}
					}
					int num = i + 1;
					i = num;
				}
				if (!patched1 || !patched2 || !patched3)
				{
					EquipmentAndQuickSlots.LogWarning("Not all Transpilers for UpdateIcons worked.");
					EquipmentAndQuickSlots.LogWarning($"patched1: {patched1}");
					EquipmentAndQuickSlots.LogWarning($"patched2: {patched2}");
					EquipmentAndQuickSlots.LogWarning($"patched3: {patched3}");
					Thread.Sleep(5000);
				}
				static CodeInstruction LogMessage(CodeInstruction instruction)
				{
					return instruction;
				}
			}
		}
	}
	[HarmonyPatch(typeof(Hud), "Awake")]
	public static class Hud_Awake_Patch
	{
		public static void Postfix(Hud __instance)
		{
			HotkeyBar componentInChildren = ((Component)__instance).GetComponentInChildren<HotkeyBar>();
			if (EquipmentAndQuickSlots.QuickSlotsEnabled.Value && (Object)(object)((Component)componentInChildren).transform.parent.Find("QuickSlotsHotkeyBar") == (Object)null)
			{
				GameObject val = Object.Instantiate<GameObject>(((Component)componentInChildren).gameObject, __instance.m_rootObject.transform, true);
				((Object)val).name = "QuickSlotsHotkeyBar";
				val.GetComponent<HotkeyBar>().m_selected = -1;
				ConfigPositionedElement configPositionedElement = val.AddComponent<ConfigPositionedElement>();
				configPositionedElement.PositionConfig = EquipmentAndQuickSlots.QuickSlotsPosition;
				configPositionedElement.AnchorConfig = EquipmentAndQuickSlots.QuickSlotsAnchor;
				configPositionedElement.EnsureCorrectPosition();
			}
		}
	}
	public static class HotkeyBarController
	{
		[HarmonyPatch(typeof(Hud), "Update")]
		public static class Hud_Update_Patch
		{
			public static void Postfix(Hud __instance)
			{
				Player localPlayer = Player.m_localPlayer;
				if (HotkeyBars == null)
				{
					HotkeyBars = ((Component)((Component)__instance).transform.parent).GetComponentsInChildren<HotkeyBar>().ToList();
				}
				if ((Object)(object)localPlayer != (Object)null)
				{
					if (SelectedHotkeyBarIndex >= 0 && SelectedHotkeyBarIndex < HotkeyBars.Count)
					{
						HotkeyBar hotkeyBar = HotkeyBars[SelectedHotkeyBarIndex];
						UpdateHotkeyBarInput(hotkeyBar);
					}
					else
					{
						UpdateInitialHotkeyBarInput();
					}
				}
				foreach (HotkeyBar hotkeyBar2 in HotkeyBars)
				{
					if (hotkeyBar2.m_selected > hotkeyBar2.m_elements.Count - 1)
					{
						hotkeyBar2.m_selected = Mathf.Max(0, hotkeyBar2.m_elements.Count - 1);
					}
					hotkeyBar2.UpdateIcons(localPlayer);
				}
			}

			private static void UpdateInitialHotkeyBarInput()
			{
				if (ZInput.GetButtonDown("JoyDPadLeft") || ZInput.GetButtonDown("JoyDPadRight"))
				{
					SelectHotkeyBar(0, fromRight: false);
				}
			}

			public static void UpdateHotkeyBarInput(HotkeyBar hotkeyBar)
			{
				Player localPlayer = Player.m_localPlayer;
				if (hotkeyBar.m_selected >= 0 && (Object)(object)localPlayer != (Object)null && !InventoryGui.IsVisible() && !Menu.IsVisible() && !GameCamera.InFreeFly())
				{
					if (ZInput.GetButtonDown("JoyDPadLeft"))
					{
						if (hotkeyBar.m_selected == 0)
						{
							GotoHotkeyBar(SelectedHotkeyBarIndex - 1);
						}
						else
						{
							hotkeyBar.m_selected = Mathf.Max(0, hotkeyBar.m_selected - 1);
						}
					}
					else if (ZInput.GetButtonDown("JoyDPadRight"))
					{
						if (hotkeyBar.m_selected == hotkeyBar.m_elements.Count - 1)
						{
							GotoHotkeyBar(SelectedHotkeyBarIndex + 1);
						}
						else
						{
							hotkeyBar.m_selected = Mathf.Min(hotkeyBar.m_elements.Count - 1, hotkeyBar.m_selected + 1);
						}
					}
					if (ZInput.GetButtonDown("JoyDPadUp"))
					{
						if (((Object)hotkeyBar).name == "QuickSlotsHotkeyBar")
						{
							Inventory quickSlotInventory = localPlayer.GetQuickSlotInventory();
							ItemData itemAt = quickSlotInventory.GetItemAt(hotkeyBar.m_selected, 0);
							((Humanoid)localPlayer).UseItem((Inventory)null, itemAt, false);
						}
						else
						{
							localPlayer.UseHotbarItem(hotkeyBar.m_selected + 1);
						}
					}
				}
				if (hotkeyBar.m_selected > hotkeyBar.m_elements.Count - 1)
				{
					hotkeyBar.m_selected = Mathf.Max(0, hotkeyBar.m_elements.Count - 1);
				}
			}

			public static void GotoHotkeyBar(int newIndex)
			{
				if (newIndex >= 0 && newIndex < HotkeyBars.Count)
				{
					bool fromRight = newIndex < SelectedHotkeyBarIndex;
					SelectHotkeyBar(newIndex, fromRight);
				}
			}

			public static void SelectHotkeyBar(int index, bool fromRight)
			{
				if (index < 0 || index >= HotkeyBars.Count)
				{
					return;
				}
				SelectedHotkeyBarIndex = index;
				for (int i = 0; i < HotkeyBars.Count; i++)
				{
					HotkeyBar val = HotkeyBars[i];
					if (i == index)
					{
						val.m_selected = (fromRight ? (val.m_elements.Count - 1) : 0);
					}
					else
					{
						val.m_selected = -1;
					}
				}
			}

			public static void DeselectHotkeyBar()
			{
				SelectedHotkeyBarIndex = -1;
				foreach (HotkeyBar hotkeyBar in HotkeyBars)
				{
					hotkeyBar.m_selected = -1;
				}
			}
		}

		[HarmonyPatch(typeof(Hud), "OnDestroy")]
		public static class Hud_OnDestroy_Patch
		{
			public static void Postfix(Hud __instance)
			{
				HotkeyBars = null;
				SelectedHotkeyBarIndex = -1;
			}
		}

		public static List<HotkeyBar> HotkeyBars;

		public static int SelectedHotkeyBarIndex = -1;
	}
	[HarmonyPatch(typeof(HotkeyBar), "Update")]
	public static class HotkeyBar_Update_Patch
	{
		public static bool Prefix(HotkeyBar __instance)
		{
			return false;
		}
	}
	public static class EquipmentSlotHelper
	{
		public class SwapData
		{
			public Inventory InventoryA;

			public ItemData Item;

			public Inventory InventoryB;

			public Vector2i SlotB;

			public SwapData(Inventory inventoryA, ItemData item, Inventory inventoryB, Vector2i slotB)
			{
				//IL_001e: 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)
				InventoryA = inventoryA;
				Item = item;
				InventoryB = inventoryB;
				SlotB = slotB;
			}
		}

		[HarmonyPatch(typeof(Humanoid), "EquipItem")]
		public static class Humanoid_EquipItem_Patch
		{
			public static bool Prefix()
			{
				DoingEquip = true;
				return true;
			}

			public static void Postfix(Humanoid __instance, bool __result, ItemData item)
			{
				if (EquipmentAndQuickSlots.EquipmentSlotsEnabled.Value && AllowMove && (Object)(object)__instance != (Object)null && ((Character)__instance).IsPlayer() && ((Character)__instance).m_nview.IsValid())
				{
					RefreshEquipmentInSlots((Player)(object)((__instance is Player) ? __instance : null));
				}
				DoingEquip = false;
			}
		}

		[HarmonyPatch(typeof(Humanoid), "UnequipItem")]
		public static class Humanoid_UnequipItem_Patch
		{
			public static void Postfix(Humanoid __instance, ItemData item)
			{
				if (EquipmentAndQuickSlots.EquipmentSlotsEnabled.Value && AllowMove && !DoingEquip && (Object)(object)__instance != (Object)null && ((Character)__instance).IsPlayer() && ((Character)__instance).m_nview.IsValid() && item != null)
				{
					RefreshEquipmentInSlots((Player)(object)((__instance is Player) ? __instance : null));
				}
			}
		}

		public static bool DoingEquip = false;

		public static bool AllowMove = true;

		public static void Swap(Inventory inventoryA, ItemData item, Inventory inventoryB, Vector2i slotB)
		{
			//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_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			Vector2i gridPos = item.m_gridPos;
			if (inventoryA == inventoryB && item.m_gridPos == slotB)
			{
				EquipmentAndQuickSlots.Log("Item already in correct slot");
				return;
			}
			ItemData itemAt = inventoryB.GetItemAt(slotB.x, slotB.y);
			if (itemAt != null)
			{
				EquipmentAndQuickSlots.Log("Item exists in other slot (" + itemAt.m_shared.m_name + ")");
				inventoryB.m_inventory.Remove(itemAt);
			}
			inventoryA.m_inventory.Remove(item);
			inventoryB.m_inventory.Add(item);
			item.m_gridPos = slotB;
			if (itemAt != null)
			{
				itemAt.m_gridPos = gridPos;
				inventoryA.m_inventory.Add(itemAt);
			}
			inventoryA.Changed();
			inventoryB.Changed();
		}

		public static void RefreshEquipmentInSlots(Player player)
		{
			//IL_014e: 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_0089: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: Unknown result type (might be due to invalid IL or missing references)
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0322: Unknown result type (might be due to invalid IL or missing references)
			//IL_0324: Unknown result type (might be due to invalid IL or missing references)
			//IL_032e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_033a: Unknown result type (might be due to invalid IL or missing references)
			//IL_033f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0352: Unknown result type (might be due to invalid IL or missing references)
			//IL_0354: Unknown result type (might be due to invalid IL or missing references)
			//IL_036a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_043c: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02db: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			List<Inventory> allInventories = player.GetAllInventories();
			Inventory equipmentSlotInventory = player.GetEquipmentSlotInventory();
			List<SwapData> list = new List<SwapData>();
			List<SwapData> list2 = new List<SwapData>();
			foreach (Inventory item in allInventories)
			{
				if (item == equipmentSlotInventory)
				{
					continue;
				}
				foreach (ItemData item2 in item.m_inventory)
				{
					if (item2.m_equipped && EquipmentAndQuickSlots.IsSlotEquippable(item2))
					{
						Vector2i equipmentSlotForType = EquipmentAndQuickSlots.GetEquipmentSlotForType(item2.m_shared.m_itemType);
						if (equipmentSlotForType.x >= 0 && equipmentSlotForType.y >= 0)
						{
							list.Add(new SwapData(item, item2, equipmentSlotInventory, equipmentSlotForType));
							EquipmentAndQuickSlots.LogWarning("move (" + item2.m_shared.m_name + ") to equip slot");
						}
					}
				}
			}
			foreach (SwapData item3 in list)
			{
				Swap(item3.InventoryA, item3.Item, item3.InventoryB, item3.SlotB);
			}
			list.Clear();
			foreach (ItemData item4 in equipmentSlotInventory.m_inventory)
			{
				if (!item4.m_equipped || !EquipmentAndQuickSlots.IsSlotEquippable(item4))
				{
					List<Inventory> allInventories2 = player.GetAllInventories();
					bool flag = false;
					foreach (Inventory item5 in allInventories2)
					{
						if (item5.CountAsEmptySlots(player))
						{
							ExtendedInventory extendedInventory = item5.Extended();
							if (extendedInventory != null)
							{
								extendedInventory.CallBase = true;
							}
							Vector2i val = item5.FindEmptySlot(false);
							if (extendedInventory != null)
							{
								extendedInventory.CallBase = false;
							}
							if (val.x >= 0 && val.y >= 0)
							{
								flag = true;
								list.Add(new SwapData(equipmentSlotInventory, item4, item5, val));
								break;
							}
						}
					}
					EquipmentAndQuickSlots.LogWarning("move (" + item4.m_shared.m_name + ") to main inventory");
					if (!flag)
					{
						if (!CanEquip(item4, player))
						{
							((Character)player).Message((MessageType)2, "Item force unequipped, inventory full, dropped item", 0, (Sprite)null);
							list2.Add(new SwapData(equipmentSlotInventory, item4, null, default(Vector2i)));
						}
						else
						{
							((Humanoid)player).EquipItem(item4, false);
							((Character)player).Message((MessageType)2, "Could not unequip, inventory full", 0, (Sprite)null);
						}
					}
				}
				else
				{
					Vector2i equipmentSlotForType2 = EquipmentAndQuickSlots.GetEquipmentSlotForType(item4.m_shared.m_itemType);
					if (equipmentSlotForType2.x >= 0 && equipmentSlotForType2.y >= 0 && item4.m_gridPos != equipmentSlotForType2)
					{
						item4.m_gridPos = equipmentSlotForType2;
						EquipmentAndQuickSlots.LogWarning($"move ({item4.m_shared.m_name}) to correct slot ({equipmentSlotForType2})");
					}
				}
			}
			foreach (SwapData item6 in list2)
			{
				ItemDrop.DropItem(item6.Item, item6.Item.m_stack, ((Component)player).transform.position, Quaternion.identity);
				item6.InventoryA.RemoveItem(item6.Item);
			}
			list2.Clear();
			foreach (SwapData item7 in list)
			{
				Swap(item7.InventoryA, item7.Item, item7.InventoryB, item7.SlotB);
			}
			list.Clear();
		}

		public static bool CanEquip(ItemData item, Player player)
		{
			if (((Humanoid)player).IsItemEquiped(item) || ((Character)player).InAttack() || ((Character)player).InDodge() || (((Character)player).IsPlayer() && !((Character)player).IsDead() && ((Character)player).IsSwimming() && !((Character)player).IsOnGround()) || (item.m_shared.m_useDurability && item.m_durability <= 0f))
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(GuiBar), "Awake")]
	public static class GuiBar_Awake_Patch
	{
		private static bool Prefix(GuiBar __instance)
		{
			//IL_0019: 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)
			if (((Object)__instance).name == "durability" && __instance.m_bar.sizeDelta.x != 54f)
			{
				__instance.m_bar.sizeDelta = new Vector2(54f, 0f);
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(InventoryGrid), "GetElement", new Type[]
	{
		typeof(int),
		typeof(int),
		typeof(int)
	})]
	public static class InventoryGrid_GetElement_Patch
	{
		private static bool Prefix(InventoryGrid __instance, ref Element __result, int x, int y, int width)
		{
			int num = y * width + x;
			if (num < 0 || num >= __instance.m_elements.Count)
			{
				EquipmentAndQuickSlots.LogError($"Tried to get element for item ({x}, {y}) in inventory ({__instance.m_inventory.m_name}) but that element is outside the bounds!");
				__result = null;
			}
			else
			{
				__result = __instance.m_elements[num];
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(InventoryGrid), "UpdateGui", new Type[]
	{
		typeof(Player),
		typeof(ItemData)
	})]
	public static class InventoryGrid_UpdateGui_Patch
	{
		private static void Postfix(InventoryGrid __instance)
		{
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: 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_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: 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_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_027a: Unknown result type (might be due to invalid IL or missing references)
			if (((Object)__instance).name == "QuickSlotGrid")
			{
				for (int i = 0; i < 3; i++)
				{
					Element val = __instance.m_elements[i];
					TMP_Text component = ((Component)val.m_go.transform.Find("binding")).GetComponent<TMP_Text>();
					((Behaviour)component).enabled = true;
					component.overflowMode = (TextOverflowModes)0;
					component.textWrappingMode = (TextWrappingModes)0;
					component.text = EquipmentAndQuickSlots.GetBindingLabel(i);
				}
			}
			else
			{
				if (!(((Object)__instance).name == "EquipmentSlotGrid"))
				{
					return;
				}
				float num = __instance.m_elementSpace + 10f;
				float num2 = __instance.m_elementSpace + 10f;
				string[] array = new string[5] { "Head", "Chest", "Legs", "Shoulders", "Utility" };
				Vector2[] array2 = (Vector2[])(object)new Vector2[5]
				{
					default(Vector2),
					new Vector2(0f, 0f - num2),
					new Vector2(0f, -2f * num2),
					new Vector2(num, -0.5f * num2),
					new Vector2(num, -1.5f * num2)
				};
				Vector2[] array3 = (Vector2[])(object)new Vector2[5]
				{
					default(Vector2),
					new Vector2(-0.45f * num, -0.9f * num2),
					new Vector2(0f, -1.8f * num2),
					new Vector2(0.45f * num, -0.9f * num2),
					new Vector2(1.3f * num, 0f)
				};
				Vector2 val3 = default(Vector2);
				for (int j = 0; j < EquipmentAndQuickSlots.EquipSlotCount; j++)
				{
					Element val2 = __instance.m_elements[j];
					TMP_Text component2 = ((Component)val2.m_go.transform.Find("binding")).GetComponent<TMP_Text>();
					((Behaviour)component2).enabled = !EquipmentAndQuickSlots.HasAuga;
					if (!EquipmentAndQuickSlots.HasAuga)
					{
						component2.overflowMode = (TextOverflowModes)0;
						component2.textWrappingMode = (TextWrappingModes)0;
						component2.text = array[j];
						component2.rectTransform.anchoredPosition = new Vector2(32f, 5f);
					}
					((Vector2)(ref val3))..ctor(-20f, 79f);
					if (EquipmentAndQuickSlots.HasAuga)
					{
						val2.m_go.RectTransform().anchoredPosition = val3 + array3[j];
					}
					else
					{
						val2.m_go.RectTransform().anchoredPosition = val3 + array2[j];
					}
				}
			}
		}
	}
	public static class InventoryGui_Patch
	{
		[HarmonyPatch(typeof(InventoryGui), "Awake")]
		public static class InventoryGui_Awake_Patch
		{
			public static void Postfix(InventoryGui __instance)
			{
				if (EquipmentAndQuickSlots.QuickSlotsEnabled.Value)
				{
					BuildQuickSlotGrid(__instance);
				}
				if (EquipmentAndQuickSlots.EquipmentSlotsEnabled.Value)
				{
					BuildEquipmentSlotGrid(__instance);
				}
			}

			private static void BuildQuickSlotGrid(InventoryGui inventoryGui)
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				Vector2 position = (EquipmentAndQuickSlots.HasAuga ? new Vector2(3f, -108f) : new Vector2(3f, -160f));
				BuildInventoryGrid(ref QuickSlotGrid, "QuickSlotGrid", position, new Vector2(232f, 90f), inventoryGui);
			}

			private static void BuildEquipmentSlotGrid(InventoryGui inventoryGui)
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				Vector2 position = (EquipmentAndQuickSlots.HasAuga ? new Vector2(3f, 40f) : new Vector2(3f, 20f));
				BuildInventoryGrid(ref EquipmentSlotGrid, "EquipmentSlotGrid", position, new Vector2(210f, 270f), inventoryGui);
			}

			private static void BuildInventoryGrid(ref InventoryGrid grid, string name, Vector2 position, Vector2 size, InventoryGui inventoryGui)
			{
				//IL_0204: Unknown result type (might be due to invalid IL or missing references)
				//IL_020a: Expected O, but got Unknown
				//IL_0249: Unknown result type (might be due to invalid IL or missing references)
				//IL_024f: Expected O, but got Unknown
				//IL_0268: Unknown result type (might be due to invalid IL or missing references)
				//IL_026e: Expected O, but got Unknown
				//IL_026f: 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_0165: Expected O, but got Unknown
				//IL_0186: Unknown result type (might be due to invalid IL or missing references)
				//IL_018d: Expected O, but got Unknown
				//IL_0199: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_0070: Unknown result type (might be due to invalid IL or missing references)
				//IL_0077: Expected O, but got Unknown
				//IL_0083: Unknown result type (might be due to invalid IL or missing references)
				//IL_009a: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_011e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0125: Expected O, but got Unknown
				//IL_0131: Unknown result type (might be due to invalid IL or missing references)
				//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_03ab: Expected O, but got Unknown
				//IL_03c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_03d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_03df: Expected O, but got Unknown
				//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0401: Unknown result type (might be due to invalid IL or missing references)
				//IL_0416: Unknown result type (might be due to invalid IL or missing references)
				//IL_0439: Unknown result type (might be due to invalid IL or missing references)
				//IL_0493: Unknown result type (might be due to invalid IL or missing references)
				//IL_049a: Expected O, but got Unknown
				//IL_04af: Unknown result type (might be due to invalid IL or missing references)
				//IL_04bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_04cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_04e9: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)grid != (Object)null)
				{
					Object.Destroy((Object)(object)grid);
					grid = null;
				}
				if ((Object)(object)EAQSPanel == (Object)null)
				{
					if (EquipmentAndQuickSlots.HasAuga)
					{
						EAQSPanel = Auga.API.Panel_Create((Transform)(object)inventoryGui.m_player, new Vector2(255f, 352f), "EAQS", withCornerDecoration: false);
						RectTransform val = (RectTransform)EAQSPanel.transform;
						val.anchorMin = new Vector2(0f, 1f);
						val.anchorMax = new Vector2(0f, 1f);
						val.anchoredPosition = new Vector2(752f, -166f);
						val.SetSizeWithCurrentAnchors((Axis)0, 255f);
						val.SetSizeWithCurrentAnchors((Axis)1, 352f);
						GameObject val2 = Object.Instantiate<GameObject>(EquipmentAndQuickSlots.Paperdolls, EAQSPanel.transform, false);
						((Object)val2).name = "Paperdolls";
						GameObject val3 = Auga.API.Divider_CreateSmall(EAQSPanel.transform, "Divider", 215f);
						val = (RectTransform)val3.transform;
						val.anchoredPosition = new Vector2(0f, -157f);
					}
					else
					{
						EAQSPanel = new GameObject("EAQS", new Type[1] { typeof(RectTransform) });
						EAQSPanel.transform.SetParent((Transform)(object)inventoryGui.m_player);
						RectTransform val4 = (RectTransform)EAQSPanel.transform;
						val4.anchorMin = new Vector2(0f, 1f);
						val4.anchorMax = new Vector2(0f, 1f);
						val4.anchoredPosition = new Vector2(752f, -166f);
						val4.SetSizeWithCurrentAnchors((Axis)0, 255f);
						val4.SetSizeWithCurrentAnchors((Axis)1, 352f);
					}
				}
				GameObject val5 = new GameObject(name, new Type[1] { typeof(RectTransform) });
				val5.SetActive(false);
				val5.transform.SetParent(EAQSPanel.transform, false);
				grid = val5.AddComponent<InventoryGrid>();
				GameObject val6 = new GameObject("Root", new Type[1] { typeof(RectTransform) });
				val6.transform.SetParent(val5.transform, false);
				RectTransform val7 = (RectTransform)val5.transform;
				val7.anchoredPosition = position;
				grid.m_elementPrefab = inventoryGui.m_playerGrid.m_elementPrefab;
				ref RectTransform gridRoot = ref grid.m_gridRoot;
				Transform transform = val6.transform;
				gridRoot = (RectTransform)(object)((transform is RectTransform) ? transform : null);
				grid.m_elementSpace = inventoryGui.m_playerGrid.m_elementSpace;
				val5.SetActive(true);
				grid.ResetView();
				if (name == "EquipmentSlotGrid")
				{
					InventoryGrid obj = grid;
					obj.m_onSelected = (Action<InventoryGrid, ItemData, Vector2i, Modifier>)Delegate.Combine(obj.m_onSelected, OnEquipmentSelected(inventoryGui));
					InventoryGrid obj2 = grid;
					obj2.m_onRightClick = (Action<InventoryGrid, ItemData, Vector2i>)Delegate.Combine(obj2.m_onRightClick, OnEquipmentRightClicked(inventoryGui));
				}
				else
				{
					InventoryGrid obj3 = grid;
					obj3.m_onSelected = (Action<InventoryGrid, ItemData, Vector2i, Modifier>)Delegate.Combine(obj3.m_onSelected, OnSelected(inventoryGui));
					InventoryGrid obj4 = grid;
					obj4.m_onRightClick = (Action<InventoryGrid, ItemData, Vector2i>)Delegate.Combine(obj4.m_onRightClick, OnRightClicked(inventoryGui));
				}
				grid.m_uiGroup = ((Component)grid).gameObject.AddComponent<UIGroupHandler>();
				grid.m_uiGroup.m_groupPriority = 1;
				grid.m_uiGroup.m_active = true;
				if (!EquipmentAndQuickSlots.HasAuga)
				{
					GameObject val8 = new GameObject("SelectedFrame", new Type[1] { typeof(RectTransform) });
					val8.transform.SetParent(val5.transform, false);
					((Graphic)val8.AddComponent<Image>()).color = Color.yellow;
					RectTransform val9 = (RectTransform)val8.transform;
					((Transform)val9).SetAsFirstSibling();
					val9.anchoredPosition = new Vector2(0f, 0f);
					val9.SetSizeWithCurrentAnchors((Axis)0, size.x + 2f);
					val9.SetSizeWithCurrentAnchors((Axis)1, size.y + 2f);
					((Transform)val9).localScale = new Vector3(1f, 1f, 1f);
					grid.m_uiGroup.m_enableWhenActiveAndGamepad = val8;
					GameObject gameObject = ((Component)((Transform)inventoryGui.m_player).Find("Bkg")).gameObject;
					GameObject val10 = Object.Instantiate<GameObject>(gameObject, val5.transform);
					((Object)val10).name = name + "Bkg";
					RectTransform val11 = (RectTransform)val10.transform;
					((Transform)val11).SetSiblingIndex(1);
					val11.anchoredPosition = new Vector2(0f, 0f);
					val11.SetSizeWithCurrentAnchors((Axis)0, size.x);
					val11.SetSizeWithCurrentAnchors((Axis)1, size.y);
					((Transform)val11).localScale = new Vector3(1f, 1f, 1f);
				}
				List<UIGroupHandler> list = inventoryGui.m_uiGroups.ToList();
				list.Insert(2, grid.m_uiGroup);
				inventoryGui.m_uiGroups = list.ToArray();
			}

			private static Action<InventoryGrid, ItemData, Vector2i, Modifier> OnSelected(InventoryGui inventoryGui)
			{
				return delegate(InventoryGrid inventoryGrid, ItemData item, Vector2i pos, Modifier mod)
				{
					//IL_0026: Unknown result type (might be due to invalid IL or missing references)
					//IL_002f: Unknown result type (might be due to invalid IL or missing references)
					//IL_004a: 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)
					EquipmentAndQuickSlots.Log($"OnSelected: inventoryGrid={inventoryGrid}, item={item?.m_shared.m_name}, pos={pos}, mod={mod}");
					inventoryGui.OnSelectedItem(inventoryGrid, item, pos, mod);
				};
			}

			private static Action<InventoryGrid, ItemData, Vector2i> OnRightClicked(InventoryGui inventoryGui)
			{
				return delegate(InventoryGrid inventoryGrid, ItemData item, Vector2i pos)
				{
					//IL_0018: Unknown result type (might be due to invalid IL or missing references)
					EquipmentAndQuickSlots.Log($"OnRightClicked: inventoryGrid={inventoryGrid}, item={item?.m_shared.m_name}, pos={pos}");
					if (item != null && !((Object)(object)Player.m_localPlayer == (Object)null))
					{
						((Humanoid)Player.m_localPlayer).UseItem((Inventory)(object)((Humanoid)Player.m_localPlayer).m_inventory.Extended(), item, true);
					}
				};
			}

			private static Action<InventoryGrid, ItemData, Vector2i, Modifier> OnEquipmentSelected(InventoryGui inventoryGui)
			{
				return delegate(InventoryGrid inventoryGrid, ItemData item, Vector2i pos, Modifier mod)
				{
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					//IL_0070: Unknown result type (might be due to invalid IL or missing references)
					//IL_0081: Unknown result type (might be due to invalid IL or missing references)
					//IL_0086: Unknown result type (might be due to invalid IL or missing references)
					Player localPlayer = Player.m_localPlayer;
					EquipmentAndQuickSlots.Log($"OnEquipmentSelected: inventoryGrid={inventoryGrid}, item={item?.m_shared.m_name}, pos={pos}, mod={mod}");
					if ((Object)(object)localPlayer != (Object)null && inventoryGui.m_dragItem != null && EquipmentAndQuickSlots.IsSlotEquippable(inventoryGui.m_dragItem) && pos == EquipmentAndQuickSlots.GetEquipmentSlotForType(inventoryGui.m_dragItem.m_shared.m_itemType))
					{
						localPlayer.QueueEquipAction(inventoryGui.m_dragItem);
						inventoryGui.SetupDragItem((ItemData)null, (Inventory)null, 0);
					}
				};
			}

			private static Action<InventoryGrid, ItemData, Vector2i> OnEquipmentRightClicked(InventoryGui inventoryGui)
			{
				return delegate(InventoryGrid inventoryGrid, ItemData item, Vector2i pos)
				{
					//IL_001e: Unknown result type (might be due to invalid IL or missing references)
					Player localPlayer = Player.m_localPlayer;
					EquipmentAndQuickSlots.Log($"OnEquipmentRightClicked: inventoryGrid={inventoryGrid}, item={item?.m_shared.m_name}, pos={pos}");
					if (item != null && (Object)(object)localPlayer != (Object)null && item.m_equipped && ((Humanoid)localPlayer).IsItemEquiped(item) && inventoryGui.m_dragItem == null)
					{
						Player.m_localPlayer.QueueUnequipAction(item);
					}
				};
			}
		}

		[HarmonyPatch(typeof(InventoryGui), "UpdateInventory")]
		public static class InventoryGui_UpdateInventory_Patch
		{
			public static bool Prefix(InventoryGui __instance, Player player)
			{
				((Humanoid)player).m_inventory.Extended().CallBase = true;
				__instance.m_playerGrid.UpdateInventory(((Humanoid)player).m_inventory, player, __instance.m_dragItem);
				((Humanoid)player).m_inventory.Extended().CallBase = false;
				if ((Object)(object)QuickSlotGrid != (Object)null)
				{
					Inventory quickSlotInventory = player.GetQuickSlotInventory();
					if (quickSlotInventory != null)
					{
						QuickSlotGrid.UpdateInventory(quickSlotInventory, player, __instance.m_dragItem);
					}
				}
				if ((Object)(object)EquipmentSlotGrid != (Object)null)
				{
					Inventory equipmentSlotInventory = player.GetEquipmentSlotInventory();
					if (equipmentSlotInventory != null)
					{
						EquipmentSlotGrid.UpdateInventory(equipmentSlotInventory, player, __instance.m_dragItem);
					}
				}
				if (EquipmentAndQuickSlots.HasAuga && (Object)(object)EAQSPanel != (Object)null)
				{
					Transform val = EAQSPanel.transform.Find("Paperdolls");
					if (((Humanoid)player).m_visEquipment.GetModelIndex() == 1)
					{
						((Component)((Component)val).transform.Find("Male")).gameObject.SetActive(false);
					}
					else
					{
						((Component)((Component)val).transform.Find("Female")).gameObject.SetActive(false);
					}
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(InventoryGui), "UpdateGamepad")]
		public static class InventoryGui_UpdateGamepad_Patch
		{
			[UsedImplicitly]
			public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator ilGenerator)
			{
				FieldInfo activeGroupField = AccessTools.DeclaredField(typeof(InventoryGui), "m_activeGroup");
				List<CodeInstruction> instrs = instructions.ToList();
				int counter = 0;
				int skipLines2 = 0;
				int i = 0;
				while (i < instrs.Count)
				{
					if (i > 5 && instrs[i].opcode == OpCodes.Ldfld && instrs[i].operand.Equals(activeGroupField) && instrs[i + 1].opcode == OpCodes.Ldc_I4_3 && instrs[i + 2].opcode == OpCodes.Bne_Un)
					{
						yield return EquipmentAndQuickSlots.LogMessage(new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(InventoryGui_UpdateGamepad_Patch), "GetMaxUiGroups", (Type[])null, (Type[])null)), counter);
						counter++;
						skipLines2++;
						yield return EquipmentAndQuickSlots.LogMessage(new CodeInstruction(OpCodes.Brtrue, instrs[i + 2].operand), counter);
						skipLines2++;
						i += skipLines2;
					}
					else
					{
						yield return EquipmentAndQuickSlots.LogMessage(instrs[i], counter);
						counter++;
					}
					int num = i + 1;
					i = num;
				}
			}

			public static bool GetMaxUiGroups(InventoryGui instance)
			{
				return instance.m_activeGroup != instance.m_uiGroups.Length - 1;
			}
		}

		public static InventoryGrid QuickSlotGrid;

		public static InventoryGrid EquipmentSlotGrid;

		public static GameObject EAQSPanel;
	}
	[HarmonyPatch(typeof(InventoryGui), "DoCrafting")]
	public static class InventoryGui_DoCrafting_Patch
	{
		public static bool Prefix(InventoryGui __instance, Player player, bool __runOriginal)
		{
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			if (!__runOriginal)
			{
				return false;
			}
			if ((Object)(object)__instance.m_craftRecipe == (Object)null || __instance.m_craftRecipe.m_requireOnlyOneIngredient)
			{
				return true;
			}
			ItemData craftUpgradeItem = __instance.m_craftUpgradeItem;
			int num = ((craftUpgradeItem == null) ? 1 : (craftUpgradeItem.m_quality + 1));
			if (num > __instance.m_craftRecipe.m_item.m_itemData.m_shared.m_maxQuality || (!player.HaveRequirements(__instance.m_craftRecipe, false, num, 1) && !player.NoCostCheat()) || (__instance.m_craftUpgradeItem != null && !((Humanoid)player).GetInventory().ContainsItem(__instance.m_craftUpgradeItem)) || (__instance.m_craftUpgradeItem == null && !((Humanoid)player).GetInventory().HaveEmptySlot()))
			{
				return false;
			}
			if (__instance.m_craftRecipe.m_item.m_itemData.m_shared.m_dlc.Length > 0 && !DLCMan.instance.IsDLCInstalled(__instance.m_craftRecipe.m_item.m_itemData.m_shared.m_dlc))
			{
				return false;
			}
			ItemData craftUpgradeItem2 = __instance.m_craftUpgradeItem;
			if (craftUpgradeItem2 != null)
			{
				craftUpgradeItem2.m_quality = num;
				craftUpgradeItem2.m_durability = craftUpgradeItem2.GetMaxDurability();
				if (!player.NoCostCheat())
				{
					player.ConsumeResources(__instance.m_craftRecipe.m_resources, num, -1, 1);
				}
				__instance.UpdateCraftingPanel(false);
				CraftingStation currentCraftingStation = Player.m_localPlayer.GetCurrentCraftingStation();
				if ((Object)(object)currentCraftingStation != (Object)null)
				{
					currentCraftingStation.m_craftItemDoneEffects.Create(((Component)player).transform.position, Quaternion.identity, (Transform)null, 1f, -1);
				}
				else
				{
					__instance.m_craftItemDoneEffects.Create(((Component)player).transform.position, Quaternion.identity, (Transform)null, 1f, -1);
				}
				Dictionary<PlayerStatType, float> stats = Game.instance.GetPlayerProfile().m_playerStats.m_stats;
				float value = stats[(PlayerStatType)13] + 1f;
				stats[(PlayerStatType)13] = value;
				Gogan.LogEvent("Game", "Crafted", __instance.m_craftRecipe.m_item.m_itemData.m_shared.m_name, (long)num);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch]
	public static class InventoryGui_UpdateContainer_Patch
	{
		public static int InUpdateContainerCall;

		[HarmonyPrefix]
		[HarmonyPatch(typeof(InventoryGui), "UpdateContainer")]
		public static void InventoryGui_UpdateContainer_Prefix()
		{
			InUpdateContainerCall++;
		}

		[HarmonyPatch(typeof(InventoryGui), "UpdateContainer")]
		[HarmonyPostfix]
		public static void InventoryGui_UpdateContainer_Postfix()
		{
			InUpdateContainerCall--;
		}

		[HarmonyPatch(typeof(InventoryGui), "SetupDragItem")]
		[HarmonyPrefix]
		public static bool InventoryGui_SetupDragItem_Prefix(InventoryGui __instance, ItemData item)
		{
			if (InUpdateContainerCall > 0 && item == null && __instance.m_dragInventory != null && IsOneOfPlayersInventory(__instance.m_dragInventory))
			{
				return false;
			}
			return true;
		}

		public static bool IsOneOfPlayersInventory(Inventory inventory)
		{
			foreach (Inventory allInventory in Player.m_localPlayer.GetAllInventories())
			{
				if (inventory == allInventory)
				{
					return true;
				}
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(Inventory), "CanAddItem", new Type[]
	{
		typeof(GameObject),
		typeof(int)
	})]
	public static class Inventory_CanAddItem_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, GameObject prefab, int stack)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideCanAddItem(prefab, stack);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "CanAddItem", new Type[]
	{
		typeof(ItemData),
		typeof(int)
	})]
	public static class Inventory_CanAddItem2_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, ItemData item, int stack)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideCanAddItem(item, stack);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "AddItem", new Type[] { typeof(ItemData) })]
	public static class Inventory_AddItem2_Patch
	{
		public static bool CallingExtended;

		public static bool Prefix(Inventory __instance, ref bool __result, ItemData item, out bool __state)
		{
			__state = false;
			if (__instance.DoExtendedCall())
			{
				CallingExtended = true;
				__state = true;
				__result = __instance.Extended().OverrideAddItem(item);
				return false;
			}
			return true;
		}

		public static void Postfix(bool __state)
		{
			if (__state)
			{
				CallingExtended = false;
			}
		}
	}
	[HarmonyPatch(typeof(Inventory), "FindEmptySlot")]
	public static class Inventory_FindEmptySlot_Patch
	{
		public static bool Prefix(Inventory __instance, bool topFirst, ref Vector2i __result)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideFindEmptySlot(topFirst);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "FindFreeStackItem")]
	public static class Inventory_FindFreeStackItem_Patch
	{
		private static bool DoExtended = true;

		public static bool Prefix(Inventory __instance, string name, int quality, float worldLevel, ref ItemData __result, out bool __state)
		{
			__state = false;
			if (DoExtended && Inventory_AddItem2_Patch.CallingExtended && __instance.IsExtended())
			{
				__state = true;
				DoExtended = false;
				__result = __instance.Extended().OverrideFindFreeStackItem(name, quality, worldLevel);
				return false;
			}
			return true;
		}

		public static void Postfix(bool __state)
		{
			if (__state)
			{
				DoExtended = true;
			}
		}
	}
	[HarmonyPatch(typeof(Inventory), "ContainsItem")]
	public static class Inventory_ContainsItem_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, ItemData item)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideContainsItem(item);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "RemoveOneItem")]
	public static class Inventory_RemoveOneItem_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, ItemData item)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideRemoveOneItem(item);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "RemoveItem", new Type[] { typeof(ItemData) })]
	public static class Inventory_RemoveItem2_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, ItemData item)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideRemoveItem(item);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "RemoveItem", new Type[]
	{
		typeof(ItemData),
		typeof(int)
	})]
	public static class Inventory_RemoveItem3_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, ItemData item, int amount)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideRemoveItem(item, amount);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "RemoveItem", new Type[]
	{
		typeof(string),
		typeof(int),
		typeof(int),
		typeof(bool)
	})]
	public static class Inventory_RemoveItem4_Patch
	{
		public static bool Prefix(Inventory __instance, string name, int amount, int itemQuality, bool worldLevelBased)
		{
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideRemoveItem(name, amount, itemQuality, worldLevelBased);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "HaveItem", new Type[]
	{
		typeof(string),
		typeof(bool)
	})]
	public static class Inventory_HaveItem_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result, string name, bool matchWorldLevel = true)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideHaveItem(name, matchWorldLevel);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "HaveItem", new Type[]
	{
		typeof(ItemType),
		typeof(bool)
	})]
	public static class Inventory_HaveItem_Patch2
	{
		public static bool Prefix(Inventory __instance, ref bool __result, ItemType type, bool matchWorldLevel = true)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideHaveItem(type, matchWorldLevel);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetAllPieceTables")]
	public static class Inventory_GetAllPieceTables_Patch
	{
		public static bool Prefix(Inventory __instance, List<PieceTable> tables)
		{
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideGetAllPieceTables(tables);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "CountItems")]
	public static class Inventory_CountItems_Patch
	{
		public static bool Prefix(Inventory __instance, ref int __result, string name, bool matchWorldLevel = true)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideCountItems(name, matchWorldLevel);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetItem", new Type[]
	{
		typeof(string),
		typeof(int),
		typeof(bool)
	})]
	public static class Inventory_GetItem2_Patch
	{
		public static bool Prefix(Inventory __instance, ref ItemData __result, string name, int quality, bool isPrefabName)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideGetItem(name, quality, isPrefabName);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetAmmoItem", new Type[]
	{
		typeof(string),
		typeof(string)
	})]
	public static class Inventory_GetAmmoItem_Patch
	{
		public static bool Prefix(Inventory __instance, ref ItemData __result, string ammoName, string matchPrefabName)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideGetAmmoItem(ammoName, matchPrefabName);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "FindFreeStackSpace")]
	public static class Inventory_FindFreeStackSpace_Patch
	{
		public static bool Prefix(Inventory __instance, ref int __result, string name, float worldLevel)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideFindFreeStackSpace(name, worldLevel);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "NrOfItems")]
	public static class Inventory_NrOfItems_Patch
	{
		public static bool Prefix(Inventory __instance, ref int __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideNrOfItems();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "SlotsUsedPercentage")]
	public static class Inventory_SlotsUsedPercentage_Patch
	{
		public static bool Prefix(Inventory __instance, ref float __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideSlotsUsedPercentage();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetEmptySlots")]
	public static class Inventory_GetEmptySlots_Patch
	{
		public static bool Prefix(Inventory __instance, ref int __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideGetEmptySlots();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "HaveEmptySlot")]
	public static class Inventory_HaveEmptySlot_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideHaveEmptySlot();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetEquippedItems")]
	public static class Inventory_GetEquipedtems_Patch
	{
		public static bool Prefix(Inventory __instance, ref List<ItemData> __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideGetEquipedItems();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetWornItems")]
	public static class Inventory_GetWornItems_Patch
	{
		public static bool Prefix(Inventory __instance, List<ItemData> worn)
		{
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideGetWornItems(worn);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetValuableItems")]
	public static class Inventory_GetValuableItems_Patch
	{
		public static bool Prefix(Inventory __instance, List<ItemData> items)
		{
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideGetValuableItems(items);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetAllItems", new Type[] { })]
	public static class Inventory_GetAllItems_Patch
	{
		public static bool Prefix(Inventory __instance, ref List<ItemData> __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideGetAllItems();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetAllItems", new Type[]
	{
		typeof(string),
		typeof(List<ItemData>)
	})]
	public static class Inventory_GetAllItems2_Patch
	{
		public static bool Prefix(Inventory __instance, string name, List<ItemData> items)
		{
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideGetAllItems(name, items);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "GetAllItems", new Type[]
	{
		typeof(ItemType),
		typeof(List<ItemData>)
	})]
	public static class Inventory_GetAllItems3_Patch
	{
		public static bool Prefix(Inventory __instance, ItemType type, List<ItemData> items)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideGetAllItems(type, items);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "UpdateTotalWeight")]
	public static class Inventory_UpdateTotalWeight_Patch
	{
		public static bool Prefix(Inventory __instance)
		{
			if (__instance.DoExtendedCall())
			{
				__instance.Extended().OverrideUpdateTotalWeight();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Inventory), "IsTeleportable")]
	public static class Inventory_IsTeleportable_Patch
	{
		public static bool Prefix(Inventory __instance, ref bool __result)
		{
			if (__instance.DoExtendedCall())
			{
				__result = __instance.Extended().OverrideIsTeleportable();
				return false;
			}
			return true;
		}
	}
	public class ExtendedPlayerData : MonoBehaviour
	{
		public Inventory QuickSlotInventory = new Inventory("QuickSlotInventory", (Sprite)null, 3, 1);

		public Inventory EquipmentSlotInventory = new Inventory("EquipmentSlotInventory", (Sprite)null, EquipmentAndQuickSlots.EquipSlotCount, 1);

		private Player _player;

		private bool _isLoading;

		public const string Sentinel = "<|>";

		public void Awake()
		{
			Inventory quickSlotInventory = QuickSlotInventory;
			quickSlotInventory.m_onChanged = (Action)Delegate.Combine(quickSlotInventory.m_onChanged, new Action(OnInventoryChanged));
			Inventory equipmentSlotInventory = EquipmentSlotInventory;
			equipmentSlotInventory.m_onChanged = (Action)Delegate.Combine(equipmentSlotInventory.m_onChanged, new Action(OnInventoryChanged));
		}

		private void OnInventoryChanged()
		{
			if (!_isLoading)
			{
				Save();
			}
		}

		public void Save()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Expected O, but got Unknown
			if ((Object)(object)_player == (Object)null)
			{
				EquipmentAndQuickSlots.LogError("Tried to save an ExtendedPlayerData without a player!");
				return;
			}
			SaveValue(_player, "ExtendedPlayerData", "This player is using ExtendedPlayerData!");
			ZPackage val = new ZPackage();
			QuickSlotInventory.Save(val);
			SaveValue(_player, "QuickSlotInventory", val.GetBase64());
			val = new ZPackage();
			EquipmentSlotInventory.Save(val);
			SaveValue(_player, "EquipmentSlotInventory", val.GetBase64());
		}

		public void Load(Player fromPlayer)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Expected O, but got Unknown
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Expected O, but got Unknown
			if ((Object)(object)fromPlayer == (Object)null)
			{
				EquipmentAndQuickSlots.LogError("Tried to load an ExtendedPlayerData with a null player!");
				return;
			}
			_player = fromPlayer;
			LoadValue(fromPlayer, "ExtendedPlayerData", out var _);
			if (LoadValue(fromPlayer, "QuickSlotInventory", out var value2))
			{
				ZPackage val = new ZPackage(value2);
				_isLoading = true;
				QuickSlotInventory.Load(val);
				if (!EquipmentAndQuickSlots.QuickSlotsEnabled.Value)
				{
					((Humanoid)_player).m_inventory.MoveAll(QuickSlotInventory);
					val = new ZPackage(value2);
					QuickSlotInventory.Save(val);
					SaveValue(_player, "QuickSlotInventory", val.GetBase64());
				}
				_isLoading = false;
			}
			if (LoadValue(fromPlayer, "EquipmentSlotInventory", out var value3))
			{
				ZPackage val2 = new ZPackage(value3);
				_isLoading = true;
				EquipmentSlotInventory.Load(val2);
				if (!EquipmentAndQuickSlots.EquipmentSlotsEnabled.Value)
				{
					((Humanoid)_player).m_inventory.MoveAll(EquipmentSlotInventory);
					val2 = new ZPackage(value2);
					EquipmentSlotInventory.Save(val2);
					SaveValue(_player, "EquipmentSlotInventory", val2.GetBase64());
				}
				_isLoading = false;
			}
		}

		private static void SaveValue(Player player, string key, string value)
		{
			if (player.m_knownTexts.ContainsKey(key))
			{
				EquipmentAndQuickSlots.LogWarning("Found KnownText for save data, converting to customData");
				player.m_knownTexts.Remove(key);
			}
			if (player.m_customData.ContainsKey(key))
			{
				player.m_customData[key] = value;
			}
			else
			{
				player.m_customData.Add(key, value);
			}
		}

		private static bool LoadValue(Player player, string key, out string value)
		{
			if (player.m_customData.TryGetValue(key, out value))
			{
				return true;
			}
			if (!player.m_knownTexts.TryGetValue(key, out value))
			{
				key = "<|>" + key;
			}
			bool flag = player.m_knownTexts.TryGetValue(key, out value);
			if (flag)
			{
				EquipmentAndQuickSlots.LogWarning("Loaded data from knownTexts. Will be converted to customData on save.");
			}
			return flag;
		}
	}
	public static class PlayerExtensions
	{
		public static List<Inventory> GetAllInventories(this Player player)
		{
			List<Inventory> list = new List<Inventory>();
			list.Add(((Humanoid)player).m_inventory);
			if (EquipmentAndQuickSlots.QuickSlotsEnabled.Value && player.IsExtended() && player.GetQuickSlotInventory() != null)
			{
				list.Add(player.GetQuickSlotInventory());
			}
			if (EquipmentAndQuickSlots.EquipmentSlotsEnabled.Value && player.IsExtended() && player.GetEquipmentSlotInventory() != null)
			{
				list.Add(player.GetEquipmentSlotInventory());
			}
			return list;
		}

		public static Inventory GetInventoryForItem(this Player player, ItemData item)
		{
			((Humanoid)player).m_inventory.Extended().CallBase = true;
			List<Inventory> allInventories = player.GetAllInventories();
			foreach (Inventory item2 in allInventories)
			{
				if (item2.ContainsItem(item))
				{
					((Humanoid)player).m_inventory.Extended().CallBase = false;
					return item2;
				}
			}
			((Humanoid)player).m_inventory.Extended().CallBase = false;
			return null;
		}

		public static Inventory GetQuickSlotInventory(this Player player)
		{
			if ((Object)(object)player != (Object)null)
			{
				ExtendedPlayerData extendedPlayerData = player.Extended();
				if ((Object)(object)extendedPlayerData != (Object)null)
				{
					return extendedPlayerData.QuickSlotInventory;
				}
			}
			return null;
		}

		public static Inventory GetEquipmentSlotInventory(this Player player)
		{
			if ((Object)(object)player != (Object)null)
			{
				ExtendedPlayerData extendedPlayerData = player.Extended();
				if ((Object)(object)extendedPlayerData != (Object)null)
				{
					return extendedPlayerData.EquipmentSlotInventory;
				}
			}
			return null;
		}

		public static ItemData GetQuickSlotItem(this Player player, int index)
		{
			if (index < 0 || index > 3)
			{
				return null;
			}
			ExtendedPlayerData extendedPlayerData = player.Extended();
			if ((Object)(object)extendedPlayerData != (Object)null)
			{
				return extendedPlayerData.QuickSlotInventory.GetItemAt(index, 0);
			}
			return null;
		}

		public static ItemData GetEquipmentSlotItem(this Player player, int index)
		{
			if ((Object)(object)player == (Object)null)
			{
				return null;
			}
			if (index < 0 || index > EquipmentAndQuickSlots.EquipSlotCount)
			{
				return null;
			}
			ExtendedPlayerData extendedPlayerData = player.Extended();
			if ((Object)(object)extendedPlayerData != (Object)null)
			{
				return extendedPlayerData.EquipmentSlotInventory.GetItemAt(index, 0);
			}
			return null;
		}

		public static void InitializeExtendedPlayer(this Player player)
		{
			if (!((Object)(object)player == (Object)null) && !player.IsExtended())
			{
				ExtendedPlayerData extendedPlayerData = ((Component)player).gameObject.AddComponent<ExtendedPlayerData>();
				extendedPlayerData.Load(player);
			}
		}

		public static bool IsExtended(this Player player)
		{
			return (Object)(object)((player != null) ? ((Component)player).gameObject.GetComponent<ExtendedPlayerData>() : null) != (Object)null;
		}

		public static ExtendedPlayerData Extended(this Player player)
		{
			return (player != null) ? ((Component)player).gameObject.GetComponent<ExtendedPlayerData>() : null;
		}

		public static void BeforeSave(this Player player)
		{
			player.InitializeExtendedPlayer();
			player.Extended().Save();
		}

		public static void AfterLoad(this Player player)
		{
			player.InitializeExtendedPlayer();
			player.Extended().Load(player);
			player.EquipInventoryItems();
		}
	}
	[HarmonyPatch(typeof(Player), "Save")]
	public static class Player_Save_Patch
	{
		public static bool Prefix(Player __instance)
		{
			__instance.BeforeSave();
			return true;
		}
	}
	[HarmonyPatch(typeof(Player), "Load")]
	public static class Player_Load_Patch
	{
		public static void Postfix(Player __instance)
		{
			__instance.AfterLoad();
			foreach (Inventory allInventory in __instance.GetAllInventories())
			{
				allInventory.m_onChanged = null;
				allInventory.m_onChanged = (Action)Delegate.Combine(allInventory.m_onChanged, new Action(__instance.OnInventoryChanged));
			}
		}
	}
	[HarmonyPatch(typeof(Player), "Awake")]
	public static class Player_Awake_Patch
	{
		public static void Postfix(Player __instance)
		{
			Inventory inventory = ((Humanoid)__instance).m_inventory;
			inventory.m_onChanged = null;
			FieldInfo field = typeof(Humanoid).GetField("m_inventory", BindingFlags.Instance | BindingFlags.NonPublic);
			field.SetValue(__instance, new ExtendedInventory(__instance, inventory.m_name, inventory.m_bkg, inventory.m_width, inventory.m_height));
			((Humanoid)__instance).m_inventory.Extended().OverrideAwake();
		}
	}
	[HarmonyPatch(typeof(Player), "CreateTombStone")]
	public static class Player_CreateTombStone_Patch
	{
		public static bool Prefix(Player __instance)
		{
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_036d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0374: Expected O, but got Unknown
			//IL_0390: Unknown result type (might be due to invalid IL or missing references)
			//IL_0397: Expected O, but got Unknown
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_027a: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_0339: Unknown result type (might be due to invalid IL or missing references)
			//IL_0340: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0316: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Expected O, but got Unknown
			bool globalKey = ZoneSystem.instance.GetGlobalKey((GlobalKeys)14);
			bool globalKey2 = ZoneSystem.instance.GetGlobalKey((GlobalKeys)15);
			bool globalKey3 = ZoneSystem.instance.GetGlobalKey((GlobalKeys)16);
			bool globalKey4 = ZoneSystem.instance.GetGlobalKey((GlobalKeys)17);
			bool flag = globalKey2 || globalKey3;
			bool flag2 = !globalKey && !globalKey2 && !globalKey3 && !globalKey4;
			if (globalKey)
			{
				return true;
			}
			List<Inventory> allInventories = __instance.GetAllInventories();
			if (allInventories.Sum((Inventory x) => x.NrOfItems()) == 0)
			{
				return true;
			}
			EquipmentSlotHelper.AllowMove = false;
			UnequipNonEAQSSlots(__instance);
			EquipmentAndQuickSlots.LogWarning("== PLAYER DIED ==");
			Inventory