Decompiled source of EpicLoot v0.10.6

plugins/EpicLoot.dll

Decompiled a week ago
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Numerics;
using System.Reflection;
using System.Reflection.Emit;
using System.Resources;
using System.Runtime;
using System.Runtime.CompilerServices;
using System.Runtime.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Configuration;
using System.Runtime.Serialization.Diagnostics;
using System.Runtime.Serialization.Diagnostics.Application;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Json;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Xml.XPath;
using AdventureBackpacks.API;
using Auga;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using Common;
using EpicLoot.Abilities;
using EpicLoot.Adventure;
using EpicLoot.Adventure.Feature;
using EpicLoot.Crafting;
using EpicLoot.CraftingV2;
using EpicLoot.Data;
using EpicLoot.GatedItemType;
using EpicLoot.Healing;
using EpicLoot.LegendarySystem;
using EpicLoot.LootBeams;
using EpicLoot.MagicItemEffects;
using EpicLoot.Patching;
using EpicLoot_UnityLib;
using HarmonyLib;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Linq.JsonPath;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;
using ServerSync;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: Guid("963cf4f8-ba02-49fc-8884-97e781e6bc18")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("EpicLoot")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Randy Knapp Mods")]
[assembly: AssemblyProduct("EpicLoot")]
[assembly: AssemblyCopyright("Copyright © Randy Knapp 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: AssemblyFileVersion("0.10.6")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.10.6.0")]
[module: UnverifiableCode]
[module: <96a40f52-64db-463f-bbd1-e733ea2e7336>RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[<8ba3e0e0-ae75-4921-8926-2ef1e9d188ce>Embedded]
	[CompilerGenerated]
	internal sealed class <8ba3e0e0-ae75-4921-8926-2ef1e9d188ce>EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	[<8ba3e0e0-ae75-4921-8926-2ef1e9d188ce>Embedded]
	[CompilerGenerated]
	internal sealed class <dd159757-bc1a-4143-9133-445be4f0e0bd>NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public <dd159757-bc1a-4143-9133-445be4f0e0bd>NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public <dd159757-bc1a-4143-9133-445be4f0e0bd>NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	[<8ba3e0e0-ae75-4921-8926-2ef1e9d188ce>Embedded]
	internal sealed class <23926492-2d90-4483-97ae-deb1b77a5139>NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public <23926492-2d90-4483-97ae-deb1b77a5139>NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[<8ba3e0e0-ae75-4921-8926-2ef1e9d188ce>Embedded]
	[CompilerGenerated]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class <96a40f52-64db-463f-bbd1-e733ea2e7336>RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public <96a40f52-64db-463f-bbd1-e733ea2e7336>RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
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_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			_rt = (RectTransform)((Component)this).transform;
			EnsureCorrectPosition();
		}

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

		public virtual void EnsureCorrectPosition()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected I4, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0213: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: 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_0252: 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_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0293: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: 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;
				Vector2 val = default(Vector2);
				switch ((int)currentAnchor)
				{
				case 0:
				{
					RectTransform rt25 = _rt;
					RectTransform rt26 = _rt;
					RectTransform rt27 = _rt;
					((Vector2)(ref val))..ctor(0f, 1f);
					rt27.anchorMax = val;
					Vector2 pivot = (rt26.anchorMin = val);
					rt25.pivot = pivot;
					break;
				}
				case 1:
				{
					RectTransform rt22 = _rt;
					RectTransform rt23 = _rt;
					RectTransform rt24 = _rt;
					((Vector2)(ref val))..ctor(0.5f, 1f);
					rt24.anchorMax = val;
					Vector2 pivot = (rt23.anchorMin = val);
					rt22.pivot = pivot;
					break;
				}
				case 2:
				{
					RectTransform rt19 = _rt;
					RectTransform rt20 = _rt;
					RectTransform rt21 = _rt;
					((Vector2)(ref val))..ctor(1f, 1f);
					rt21.anchorMax = val;
					Vector2 pivot = (rt20.anchorMin = val);
					rt19.pivot = pivot;
					break;
				}
				case 3:
				{
					RectTransform rt16 = _rt;
					RectTransform rt17 = _rt;
					RectTransform rt18 = _rt;
					((Vector2)(ref val))..ctor(0f, 0.5f);
					rt18.anchorMax = val;
					Vector2 pivot = (rt17.anchorMin = val);
					rt16.pivot = pivot;
					break;
				}
				case 4:
				{
					RectTransform rt13 = _rt;
					RectTransform rt14 = _rt;
					RectTransform rt15 = _rt;
					((Vector2)(ref val))..ctor(0.5f, 0.5f);
					rt15.anchorMax = val;
					Vector2 pivot = (rt14.anchorMin = val);
					rt13.pivot = pivot;
					break;
				}
				case 5:
				{
					RectTransform rt10 = _rt;
					RectTransform rt11 = _rt;
					RectTransform rt12 = _rt;
					((Vector2)(ref val))..ctor(1f, 0.5f);
					rt12.anchorMax = val;
					Vector2 pivot = (rt11.anchorMin = val);
					rt10.pivot = pivot;
					break;
				}
				case 6:
				{
					RectTransform rt7 = _rt;
					RectTransform rt8 = _rt;
					RectTransform rt9 = _rt;
					((Vector2)(ref val))..ctor(0f, 0f);
					rt9.anchorMax = val;
					Vector2 pivot = (rt8.anchorMin = val);
					rt7.pivot = pivot;
					break;
				}
				case 7:
				{
					RectTransform rt4 = _rt;
					RectTransform rt5 = _rt;
					RectTransform rt6 = _rt;
					((Vector2)(ref val))..ctor(0.5f, 0f);
					rt6.anchorMax = val;
					Vector2 pivot = (rt5.anchorMin = val);
					rt4.pivot = pivot;
					break;
				}
				case 8:
				{
					RectTransform rt = _rt;
					RectTransform rt2 = _rt;
					RectTransform rt3 = _rt;
					((Vector2)(ref val))..ctor(1f, 0f);
					rt3.anchorMax = val;
					Vector2 pivot = (rt2.anchorMin = val);
					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>();
			if (!((Object)(object)component == (Object)null))
			{
				return component;
			}
			return go.AddComponent<T>();
		}
	}
	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_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: 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_0224: 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 = "";
			foreach (FieldInfo item in from f in obj.GetType().GetFields()
				where f.IsPublic
				select f)
			{
				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_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			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)
		{
			return LoadSpriteFromFile(Path.Combine(modFolder, iconName));
		}

		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 obj in fields)
			{
				object value = obj.GetValue(originalObject);
				obj.SetValue(cloneObject, value);
			}
		}

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

		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 EpicLoot
{
	public static class EpicLootAuga
	{
		public static Button ReplaceButton(Button button, bool icon = false, bool keepListeners = false)
		{
			return ReplaceButtonInternal(API.MediumButton_Create(((Component)button).transform.parent, ((Object)button).name, string.Empty), button, icon, keepListeners);
		}

		public static Button ReplaceButtonFancy(Button button, bool icon = false, bool keepListeners = false)
		{
			return ReplaceButtonInternal(API.FancyButton_Create(((Component)button).transform.parent, ((Object)button).name, string.Empty), button, icon, keepListeners);
		}

		private static Button ReplaceButtonInternal(Button newButton, Button button, bool icon, bool keepListeners)
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_0064: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Expected O, but got Unknown
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			if (icon)
			{
				Object.Destroy((Object)(object)((Component)((Component)newButton).GetComponentInChildren<TMP_Text>()).gameObject);
				((Object)Object.Instantiate<Transform>(((Component)button).transform.Find("Icon"), ((Component)newButton).transform)).name = "Icon";
			}
			else
			{
				string text = ((Component)button).GetComponentInChildren<Text>().text;
				((Component)newButton).GetComponentInChildren<TMP_Text>().text = text;
			}
			RectTransform val = (RectTransform)((Component)button).transform;
			RectTransform val2 = (RectTransform)((Component)newButton).transform;
			val2.anchorMin = val.anchorMin;
			val2.anchorMax = val.anchorMax;
			val2.pivot = val.pivot;
			val2.anchoredPosition = val.anchoredPosition;
			Rect rect = val.rect;
			val2.SetSizeWithCurrentAnchors((Axis)0, ((Rect)(ref rect)).width);
			if (keepListeners)
			{
				newButton.onClick = button.onClick;
				button.onClick = new ButtonClickedEvent();
			}
			UIGamePad component = ((Component)button).GetComponent<UIGamePad>();
			if ((Object)(object)component != (Object)null && (Object)(object)component.m_hint != (Object)null)
			{
				component.m_hint.transform.SetParent(((Component)newButton).transform);
				UIGamePad obj = ((Component)newButton).gameObject.AddComponent<UIGamePad>();
				obj.m_keyCode = component.m_keyCode;
				obj.m_zinputKey = component.m_zinputKey;
				obj.m_hint = component.m_hint;
				obj.m_blockingElements = component.m_blockingElements.ToList();
			}
			Object.DestroyImmediate((Object)(object)((Component)button).gameObject);
			return newButton;
		}

		public static void MakeSimpleTooltip(GameObject obj)
		{
			API.Tooltip_MakeSimpleTooltip(obj);
		}

		public static void ReplaceBackground(GameObject obj, bool withCornerDecoration)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: 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_003d: 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)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			Object.Destroy((Object)(object)obj.GetComponent<Image>());
			RectTransform val = (RectTransform)API.Panel_Create(obj.transform, Vector2.one, "AugaBackground", withCornerDecoration).transform;
			((Transform)val).SetSiblingIndex(0);
			val.anchorMin = Vector2.zero;
			val.anchorMax = Vector2.one;
			val.pivot = new Vector2(0.5f, 0.5f);
			val.sizeDelta = new Vector2(40f, 40f);
		}

		public static void FixItemBG(GameObject obj)
		{
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			Transform val = obj.transform.Find("MagicBG");
			if ((Object)(object)val != (Object)null)
			{
				Image component = ((Component)val).GetComponent<Image>();
				if ((Object)(object)component != (Object)null)
				{
					component.sprite = EpicLoot.GetMagicItemBgSprite();
				}
			}
			bool flag = false;
			Transform val2 = obj.transform.Find("ItemBG");
			Image val3 = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponent<Image>() : null);
			if ((Object)(object)val3 == (Object)null)
			{
				val3 = obj.GetComponent<Image>();
			}
			if ((Object)(object)val3 != (Object)null)
			{
				val3.sprite = API.GetItemBackgroundSprite();
				((Graphic)val3).color = new Color(0f, 0f, 0f, 0.5f);
				flag = true;
			}
			if (!flag)
			{
				Transform val4 = obj.transform.Find("Icon");
				if ((Object)(object)val4 != (Object)null)
				{
					Transform obj2 = Object.Instantiate<Transform>(val4, val4.parent);
					obj2.SetSiblingIndex(2);
					Image component2 = ((Component)obj2).GetComponent<Image>();
					component2.sprite = API.GetItemBackgroundSprite();
					((Graphic)component2).color = new Color(0f, 0f, 0f, 0.5f);
				}
			}
		}

		public static void FixListElementColors(GameObject obj)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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)
			Transform val = obj.transform.Find("Selected");
			if ((Object)(object)val != (Object)null)
			{
				Image component = ((Component)val).GetComponent<Image>();
				if ((Object)(object)component != (Object)null)
				{
					Color color = default(Color);
					ColorUtility.TryParseHtmlString(API.Blue, ref color);
					((Graphic)component).color = color;
				}
			}
			Transform val2 = obj.transform.Find("Background");
			if ((Object)(object)val2 != (Object)null)
			{
				Image component2 = ((Component)val2).GetComponent<Image>();
				if ((Object)(object)component2 != (Object)null)
				{
					((Graphic)component2).color = new Color(0f, 0f, 0f, 0.5f);
				}
			}
			Button component3 = obj.GetComponent<Button>();
			if ((Object)(object)component3 != (Object)null)
			{
				((Selectable)component3).colors = ColorBlock.defaultColorBlock;
			}
		}

		public static void FixFonts(GameObject obj)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			TMP_Text[] componentsInChildren = obj.GetComponentsInChildren<TMP_Text>(true);
			Color color = default(Color);
			Color color2 = default(Color);
			foreach (TMP_Text val in componentsInChildren)
			{
				if (((Object)val.font).name == "Norsebold")
				{
					ColorUtility.TryParseHtmlString(API.Brown1, ref color);
					((Graphic)val).color = color;
					val.text = Localization.instance.Localize(val.text).ToUpperInvariant();
				}
				if (((Object)val).name == "Count" || ((Object)val).name == "RewardLabel" || ((Object)val).name.EndsWith("Count"))
				{
					ColorUtility.TryParseHtmlString(API.BrightGold, ref color2);
					((Graphic)val).color = color2;
				}
				val.text = val.text.Replace("<color=yellow>", "<color=" + API.BrightGold + ">");
			}
		}

		public static Button ReplaceVerticalLargeTab(Button button)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = Object.Instantiate<GameObject>(EpicLoot.LoadAsset<GameObject>("EnchantingTabAuga"), ((Component)button).transform.parent);
			((Object)obj).name = ((Object)button).name;
			FixFonts(obj);
			int siblingIndex = ((Component)button).transform.GetSiblingIndex();
			RectTransform val = (RectTransform)((Component)button).transform;
			RectTransform val2 = (RectTransform)obj.transform;
			val2.anchorMin = val.anchorMin;
			val2.anchorMax = val.anchorMax;
			val2.pivot = val.pivot;
			val2.anchoredPosition = val.anchoredPosition;
			Rect rect = val.rect;
			val2.SetSizeWithCurrentAnchors((Axis)0, ((Rect)(ref rect)).width);
			((Component)obj.transform.Find("Text")).GetComponent<TMP_Text>().text = ((Component)((Component)button).transform.Find("Text")).GetComponent<TMP_Text>().text;
			((Component)obj.transform.Find("Image")).GetComponent<Image>().sprite = ((Component)((Component)button).transform.Find("Image")).GetComponent<Image>().sprite;
			FeatureStatus component = obj.GetComponent<FeatureStatus>();
			FeatureStatus component2 = ((Component)button).GetComponent<FeatureStatus>();
			if ((Object)(object)component2 == (Object)null && (Object)(object)component != (Object)null)
			{
				Object.DestroyImmediate((Object)(object)component);
			}
			if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null)
			{
				component.Feature = component2.Feature;
				component.Refresh();
			}
			Object.DestroyImmediate((Object)(object)((Component)button).gameObject);
			obj.transform.SetSiblingIndex(siblingIndex);
			return obj.GetComponent<Button>();
		}

		public static void FixupScrollbar(Scrollbar scrollbar)
		{
			//IL_000c: 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_003d: 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)
			Object.Destroy((Object)(object)((Component)scrollbar).GetComponent<Image>());
			((Selectable)scrollbar).colors = ColorBlock.defaultColorBlock;
			Image component = ((Component)scrollbar.handleRect).GetComponent<Image>();
			Color val = default(Color);
			if (ColorUtility.TryParseHtmlString("#8B7C6A", ref val))
			{
				((Graphic)component).color = new Color(val.r, val.g, val.b, 1f);
			}
		}
	}
	[HarmonyPatch]
	public static class Attack_Patch
	{
		public static Attack ActiveAttack;

		[HarmonyPriority(0)]
		[HarmonyPrefix]
		[HarmonyPatch(typeof(Attack), "DoMeleeAttack")]
		public static void Attack_DoMeleeAttack_Prefix(Attack __instance)
		{
			ActiveAttack = __instance;
		}

		[HarmonyPatch(typeof(Attack), "DoMeleeAttack")]
		[HarmonyPostfix]
		public static void Attack_DoMeleeAttack_Postfix()
		{
			ActiveAttack = null;
		}
	}
	public static class EpicLootDropsHelper
	{
		public static bool InstantDropsEnabled { get; set; }
	}
	[HarmonyPatch(typeof(CharacterDrop), "OnDeath")]
	public static class CharacterDrop_OnDeath_Patch
	{
		public static void Postfix(CharacterDrop __instance)
		{
			if (EpicLootDropsHelper.InstantDropsEnabled)
			{
				EpicLoot.OnCharacterDeath(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(Ragdoll), "Setup")]
	public static class Ragdoll_Setup_Patch
	{
		public static void Postfix(Ragdoll __instance, CharacterDrop characterDrop)
		{
			if (!((Object)(object)characterDrop == (Object)null) && !((Object)(object)characterDrop.m_character == (Object)null) && !characterDrop.m_character.IsPlayer() && EpicLoot.CanCharacterDropLoot(characterDrop.m_character))
			{
				EpicLootDropsHelper.InstantDropsEnabled = false;
				string characterCleanName = EpicLoot.GetCharacterCleanName(characterDrop.m_character);
				int level = characterDrop.m_character.GetLevel();
				__instance.m_nview.m_zdo.Set("characterName", characterCleanName);
				__instance.m_nview.m_zdo.Set("level", level);
			}
		}
	}
	[HarmonyPatch(typeof(Ragdoll), "SpawnLoot")]
	public static class Ragdoll_SpawnLoot_Patch
	{
		public static void Postfix(Ragdoll __instance, Vector3 center)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			string @string = __instance.m_nview.m_zdo.GetString("characterName", "");
			int @int = __instance.m_nview.m_zdo.GetInt("level", 0);
			if (!string.IsNullOrEmpty(@string))
			{
				EpicLoot.OnCharacterDeath(@string, @int, center + Vector3.up * 0.75f);
			}
		}
	}
	[HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")]
	public static class CharacterDrop_GenerateDropList_DropsEnabled
	{
		[HarmonyBefore(new string[] { "org.bepinex.plugins.creaturelevelcontrol" })]
		[HarmonyPriority(800)]
		public static void Postfix(CharacterDrop __instance)
		{
			EpicLootDropsHelper.InstantDropsEnabled = __instance.m_dropsEnabled;
		}
	}
	[HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")]
	public static class CharacterDrop_GenerateDropList_Patch
	{
		public static void Prefix(CharacterDrop __instance)
		{
			if (!((Object)(object)__instance.m_character != (Object)null) || !__instance.m_character.IsBoss() || EpicLoot.GetBossTrophyDropMode() == BossDropMode.Default)
			{
				return;
			}
			foreach (Drop drop in __instance.m_drops)
			{
				if (!((Object)(object)drop.m_prefab == (Object)null) && ((((Object)drop.m_prefab).name.Equals("Wishbone") && EpicLoot.GetBossWishboneDropMode() != 0) || (((Object)drop.m_prefab).name.Equals("CryptKey") && EpicLoot.GetBossCryptKeyDropMode() != 0)) && drop.m_onePerPlayer)
				{
					drop.m_onePerPlayer = false;
				}
			}
		}

		public static void Postfix(CharacterDrop __instance, ref List<KeyValuePair<GameObject, int>> __result)
		{
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Invalid comparison between Unknown and I4
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance.m_character != (Object)null) || !__instance.m_character.IsBoss() || EpicLoot.GetBossTrophyDropMode() == BossDropMode.Default)
			{
				return;
			}
			for (int i = 0; i < __result.Count; i++)
			{
				GameObject key = __result[i].Key;
				ItemDrop component = key.GetComponent<ItemDrop>();
				if (!((Object)(object)component == (Object)null) && component.m_itemData != null && ((int)component.m_itemData.m_shared.m_itemType == 13 || ((Object)key).name.Equals("Wishbone") || ((Object)key).name.Equals("CryptKey")))
				{
					List<PlayerInfo> playerList = ZNet.instance.GetPlayerList();
					int num = EpicLoot.GetBossTrophyDropMode() switch
					{
						BossDropMode.OnePerPlayerOnServer => playerList.Count, 
						BossDropMode.OnePerPlayerNearBoss => Math.Max(Player.GetPlayersInRangeXZ(((Component)__instance.m_character).transform.position, EpicLoot.GetBossTrophyDropPlayerRange()), playerList.Count((PlayerInfo x) => Vector3.Distance(x.m_position, ((Component)__instance.m_character).transform.position) <= EpicLoot.GetBossTrophyDropPlayerRange())), 
						_ => 1, 
					};
					EpicLoot.Log($"Dropping trophies: {num} (mode={EpicLoot.GetBossTrophyDropMode()})");
					__result[i] = new KeyValuePair<GameObject, int>(key, num);
				}
			}
		}
	}
	[HarmonyPatch(typeof(Container), "AddDefaultItems")]
	public static class Container_AddDefaultItems_Patch
	{
		public static void Postfix(Container __instance)
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_piece == (Object)null)
			{
				return;
			}
			string text = ((Object)__instance.m_piece).name.Replace("(Clone)", "").Trim();
			List<LootTable> lootTable = LootRoller.GetLootTable(text);
			if (lootTable == null || lootTable.Count <= 0)
			{
				return;
			}
			List<ItemData> list = LootRoller.RollLootTable(lootTable, 1, ((Object)__instance.m_piece).name, ((Component)__instance).transform.position);
			object arg = list.Count;
			Vector3 position = ((Component)__instance).transform.position;
			EpicLoot.Log(string.Format("Rolling on loot table: {0}, spawned {1} items at drop point({2}).", text, arg, ((Vector3)(ref position)).ToString("0")));
			foreach (ItemData item in list)
			{
				__instance.m_inventory.AddItem(item);
				EpicLoot.Log("  - " + item.m_shared.m_name + (item.IsMagic() ? (": " + string.Join(", ", item.GetMagicItem().Effects.Select((MagicItemEffect x) => x.EffectType.ToString()))) : ""));
			}
		}
	}
	[HarmonyPatch(typeof(GameCamera), "UpdateCamera")]
	public static class GameCamera_UpdateCamera_Patch
	{
		public static bool Prefix(GameCamera __instance)
		{
			if (__instance.m_freeFly)
			{
				__instance.UpdateFreeFly(1f / 30f);
				__instance.UpdateCameraShake(1f / 30f);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Humanoid))]
	public class Humanoid_Patch
	{
		[HarmonyPatch("SetupVisEquipment")]
		[HarmonyPrefix]
		public static bool SetupVisEquipment_Prefix(Humanoid __instance, VisEquipment visEq, bool isRagdoll)
		{
			if (!isRagdoll)
			{
				object obj;
				if (__instance.m_leftItem == null)
				{
					obj = "";
				}
				else
				{
					ItemData leftItem = __instance.m_leftItem;
					if (leftItem == null)
					{
						obj = null;
					}
					else
					{
						GameObject dropPrefab = leftItem.m_dropPrefab;
						obj = ((dropPrefab != null) ? ((Object)dropPrefab).name : null);
					}
				}
				visEq.SetLeftItem((string)obj, __instance.m_leftItem?.m_variant ?? 0);
				object rightItem;
				if (__instance.m_rightItem == null)
				{
					rightItem = "";
				}
				else
				{
					ItemData rightItem2 = __instance.m_rightItem;
					if (rightItem2 == null)
					{
						rightItem = null;
					}
					else
					{
						GameObject dropPrefab2 = rightItem2.m_dropPrefab;
						rightItem = ((dropPrefab2 != null) ? ((Object)dropPrefab2).name : null);
					}
				}
				visEq.SetRightItem((string)rightItem);
				if (((Character)__instance).IsPlayer())
				{
					object obj2;
					if (__instance.m_hiddenLeftItem == null)
					{
						obj2 = "";
					}
					else
					{
						GameObject dropPrefab3 = __instance.m_hiddenLeftItem.m_dropPrefab;
						obj2 = ((dropPrefab3 != null) ? ((Object)dropPrefab3).name : null);
					}
					visEq.SetLeftBackItem((string)obj2, __instance.m_hiddenLeftItem?.m_variant ?? 0);
					object rightBackItem;
					if (__instance.m_hiddenRightItem == null)
					{
						rightBackItem = "";
					}
					else
					{
						GameObject dropPrefab4 = __instance.m_hiddenRightItem.m_dropPrefab;
						rightBackItem = ((dropPrefab4 != null) ? ((Object)dropPrefab4).name : null);
					}
					visEq.SetRightBackItem((string)rightBackItem);
				}
			}
			object chestItem;
			if (__instance.m_chestItem == null)
			{
				chestItem = "";
			}
			else
			{
				ItemData chestItem2 = __instance.m_chestItem;
				if (chestItem2 == null)
				{
					chestItem = null;
				}
				else
				{
					GameObject dropPrefab5 = chestItem2.m_dropPrefab;
					chestItem = ((dropPrefab5 != null) ? ((Object)dropPrefab5).name : null);
				}
			}
			visEq.SetChestItem((string)chestItem);
			object legItem;
			if (__instance.m_legItem == null)
			{
				legItem = "";
			}
			else
			{
				ItemData legItem2 = __instance.m_legItem;
				if (legItem2 == null)
				{
					legItem = null;
				}
				else
				{
					GameObject dropPrefab6 = legItem2.m_dropPrefab;
					legItem = ((dropPrefab6 != null) ? ((Object)dropPrefab6).name : null);
				}
			}
			visEq.SetLegItem((string)legItem);
			object helmetItem;
			if (__instance.m_helmetItem == null)
			{
				helmetItem = "";
			}
			else
			{
				ItemData helmetItem2 = __instance.m_helmetItem;
				if (helmetItem2 == null)
				{
					helmetItem = null;
				}
				else
				{
					GameObject dropPrefab7 = helmetItem2.m_dropPrefab;
					helmetItem = ((dropPrefab7 != null) ? ((Object)dropPrefab7).name : null);
				}
			}
			visEq.SetHelmetItem((string)helmetItem);
			object obj3;
			if (__instance.m_shoulderItem == null)
			{
				obj3 = "";
			}
			else
			{
				ItemData shoulderItem = __instance.m_shoulderItem;
				if (shoulderItem == null)
				{
					obj3 = null;
				}
				else
				{
					GameObject dropPrefab8 = shoulderItem.m_dropPrefab;
					obj3 = ((dropPrefab8 != null) ? ((Object)dropPrefab8).name : null);
				}
			}
			visEq.SetShoulderItem((string)obj3, __instance.m_shoulderItem?.m_variant ?? 0);
			object utilityItem;
			if (__instance.m_utilityItem == null)
			{
				utilityItem = "";
			}
			else
			{
				ItemData utilityItem2 = __instance.m_utilityItem;
				if (utilityItem2 == null)
				{
					utilityItem = null;
				}
				else
				{
					GameObject dropPrefab9 = utilityItem2.m_dropPrefab;
					utilityItem = ((dropPrefab9 != null) ? ((Object)dropPrefab9).name : null);
				}
			}
			visEq.SetUtilityItem((string)utilityItem);
			if (!((Character)__instance).IsPlayer())
			{
				return false;
			}
			visEq.SetBeardItem(__instance.m_beardItem);
			visEq.SetHairItem(__instance.m_hairItem);
			return false;
		}
	}
	[HarmonyPatch(typeof(ItemDrop), "Awake")]
	public static class ItemDrop_Awake_Patch
	{
		public static void Postfix(ItemDrop __instance)
		{
			((Component)__instance).gameObject.AddComponent<LootBeam>();
			GameObject val = __instance.m_itemData.InitializeCustomData();
			if ((Object)(object)val != (Object)null)
			{
				__instance.m_itemData.m_dropPrefab = val;
				__instance.Save();
			}
		}
	}
	[HarmonyPatch(typeof(Inventory), "Load")]
	public static class Inventory_Load_Patch
	{
		public static void Postfix(Inventory __instance)
		{
			foreach (ItemData item in __instance.m_inventory)
			{
				GameObject val = item.InitializeCustomData();
				if ((Object)(object)val != (Object)null)
				{
					item.m_dropPrefab = val;
				}
			}
		}
	}
	[HarmonyPatch(typeof(InventoryGrid), "CreateItemTooltip", new Type[]
	{
		typeof(ItemData),
		typeof(UITooltip)
	})]
	public static class InventoryGrid_CreateItemTooltip_MagicItemComponent_Patch
	{
		[HarmonyAfter(new string[] { "kg.ValheimEnchantmentSystem" })]
		public static bool Prefix(ItemData item, UITooltip tooltip, out string __state)
		{
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			__state = null;
			string text;
			if (item.IsEquipable() && !item.m_equipped && (Object)(object)Player.m_localPlayer != (Object)null && Player.m_localPlayer.HasEquipmentOfType(item.m_shared.m_itemType) && ZInput.GetKey((KeyCode)306, true))
			{
				ItemData equipmentOfType = Player.m_localPlayer.GetEquipmentOfType(item.m_shared.m_itemType);
				text = item.GetTooltip(-1) + "<color=#AAA><i>$mod_epicloot_currentlyequipped:</i></color>\n<size=18>" + equipmentOfType.GetDecoratedName() + "</size>\n" + equipmentOfType.GetTooltip(-1);
			}
			else
			{
				text = item.GetTooltip(-1);
			}
			tooltip.Set(item.GetDecoratedName(), text, (RectTransform)null, default(Vector2));
			return false;
		}
	}
	[HarmonyPatch(typeof(ItemData), "GetTooltip", new Type[]
	{
		typeof(ItemData),
		typeof(int),
		typeof(bool),
		typeof(float),
		typeof(int)
	})]
	public static class MagicItemTooltip_ItemDrop_Patch
	{
		[UsedImplicitly]
		private static bool Prefix(ref string __result, ItemData item, int qualityLevel)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0368: 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_036f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0372: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Expected I4, but got Unknown
			//IL_0494: Unknown result type (might be due to invalid IL or missing references)
			//IL_049f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ac4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ac9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ad3: Unknown result type (might be due to invalid IL or missing references)
			if (item == null)
			{
				return true;
			}
			Player localPlayer = Player.m_localPlayer;
			StringBuilder stringBuilder = new StringBuilder(256);
			MagicItem magicItem = item.GetMagicItem();
			if (magicItem == null)
			{
				return true;
			}
			string colorString = magicItem.GetColorString();
			string itemTypeName = magicItem.GetItemTypeName(item.Extended());
			float skillLevel = ((Character)localPlayer).GetSkillLevel(item.m_shared.m_skillType);
			stringBuilder.Append("<color=" + colorString + ">" + magicItem.GetRarityDisplay() + " " + itemTypeName + "</color>\n");
			if (item.IsLegendarySetItem())
			{
				stringBuilder.Append("<color=" + EpicLoot.GetSetItemColor() + ">$mod_epicloot_legendarysetlabel</color>\n");
			}
			stringBuilder.Append(item.GetDescription());
			stringBuilder.Append("\n");
			if (item.m_shared.m_dlc.Length > 0)
			{
				stringBuilder.Append("\n<color=#00ffffff>$item_dlc</color>");
			}
			ItemData.AddHandedTip(item, stringBuilder);
			if (item.m_crafterID != 0L)
			{
				stringBuilder.AppendFormat("\n$item_crafter: <color=orange>{0}</color>", item.GetCrafterName());
			}
			if (!item.m_shared.m_teleportable)
			{
				stringBuilder.Append("\n<color=orange>$item_noteleport</color>");
			}
			if (item.m_shared.m_value > 0)
			{
				stringBuilder.AppendFormat("\n$item_value: <color=orange>{0} ({1})</color>", item.GetValue(), item.m_shared.m_value);
			}
			string arg = ((magicItem.HasEffect(MagicEffectType.ReduceWeight) || magicItem.HasEffect(MagicEffectType.Weightless)) ? colorString : "orange");
			stringBuilder.Append($"\n$item_weight: <color={arg}>{item.GetWeight(-1):0.0}</color>");
			if (item.m_shared.m_maxQuality > 1)
			{
				stringBuilder.AppendFormat("\n$item_quality: <color=orange>{0}</color>", qualityLevel);
			}
			bool flag = magicItem.HasEffect(MagicEffectType.Indestructible);
			if (!flag && item.m_shared.m_useDurability)
			{
				string text = (magicItem.HasEffect(MagicEffectType.ModifyDurability) ? colorString : "orange");
				string text2 = (magicItem.HasEffect(MagicEffectType.ModifyDurability) ? colorString : "yellow");
				float maxDurability = item.GetMaxDurability(qualityLevel);
				float durability = item.m_durability;
				string text3 = (item.GetDurabilityPercentage() * 100f).ToString("0");
				string text4 = durability.ToString("0");
				string text5 = maxDurability.ToString("0");
				stringBuilder.Append("\n$item_durability: <color=" + text + ">" + text3 + "%</color> <color=" + text2 + ">(" + text4 + "/" + text5 + ")</color>");
				if (item.m_shared.m_canBeReparied)
				{
					Recipe recipe = ObjectDB.instance.GetRecipe(item);
					if ((Object)(object)recipe != (Object)null)
					{
						int minStationLevel = recipe.m_minStationLevel;
						stringBuilder.AppendFormat("\n$item_repairlevel: <color=orange>{0}</color>", minStationLevel.ToString());
					}
				}
			}
			else if (flag)
			{
				stringBuilder.Append("\n$item_durability: <color=" + colorString + ">$mod_epicloot_me_indestructible_display</color>");
			}
			bool num = magicItem.HasEffect(MagicEffectType.ModifyBlockPower);
			string arg2 = (num ? colorString : "orange");
			string text6 = (num ? colorString : "yellow");
			bool flag2 = magicItem.HasEffect(MagicEffectType.ModifyParry);
			float totalEffectValue = magicItem.GetTotalEffectValue(MagicEffectType.ModifyParry, 0.01f);
			string arg3 = (flag2 ? colorString : "orange");
			ItemType itemType = item.m_shared.m_itemType;
			switch (itemType - 2)
			{
			case 0:
			{
				if ((double)item.m_shared.m_food > 0.0)
				{
					stringBuilder.AppendFormat("\n$item_food_health: <color=orange>{0}</color>", item.m_shared.m_food);
					stringBuilder.AppendFormat("\n$item_food_stamina: <color=orange>{0}</color>", item.m_shared.m_foodStamina);
					stringBuilder.AppendFormat("\n$item_food_duration: <color=orange>{0}s</color>", item.m_shared.m_foodBurnTime);
					stringBuilder.AppendFormat("\n$item_food_regen: <color=orange>{0} hp/tick</color>", item.m_shared.m_foodRegen);
				}
				string statusEffectTooltip2 = item.GetStatusEffectTooltip(qualityLevel, skillLevel);
				if (statusEffectTooltip2.Length > 0)
				{
					stringBuilder.Append("\n\n");
					stringBuilder.Append(statusEffectTooltip2);
				}
				break;
			}
			case 1:
			case 2:
			case 12:
			case 13:
			case 20:
			{
				stringBuilder.Append(GetDamageTooltipString(magicItem, item.GetDamage(qualityLevel, (float)Game.m_worldLevel), item.m_shared.m_skillType, colorString));
				string arg5 = ((magicItem.HasEffect(MagicEffectType.ModifyAttackStaminaUse) || magicItem.HasEffect(MagicEffectType.ModifyBlockStaminaUse)) ? colorString : "orange");
				float num3 = (1f - magicItem.GetTotalEffectValue(MagicEffectType.ModifyAttackStaminaUse, 0.01f)) * item.m_shared.m_attack.m_attackStamina;
				if ((double)item.m_shared.m_attack.m_attackStamina > 0.0 && !magicItem.HasEffect(MagicEffectType.Bloodlust))
				{
					stringBuilder.Append($"\n$item_staminause: <color={arg5}>{num3:#.#}</color>");
				}
				bool num4 = magicItem.HasEffect(MagicEffectType.ModifyAttackEitrUse) || magicItem.HasEffect(MagicEffectType.DoubleMagicShot);
				bool flag3 = magicItem.HasEffect(MagicEffectType.DoubleMagicShot);
				string arg6 = (num4 ? colorString : "orange");
				float num5 = 1f - magicItem.GetTotalEffectValue(MagicEffectType.ModifyAttackEitrUse, 0.01f);
				float num6 = (flag3 ? (num5 * (item.m_shared.m_attack.m_attackEitr * 2f)) : (num5 * item.m_shared.m_attack.m_attackEitr));
				if ((double)item.m_shared.m_attack.m_attackEitr > 0.0)
				{
					stringBuilder.Append($"\n$item_eitruse: <color={arg6}>{num6:#.#}</color>");
				}
				bool num7 = magicItem.HasEffect(MagicEffectType.Bloodlust);
				string arg7 = (num7 ? colorString : "orange");
				float attackStamina = item.m_shared.m_attack.m_attackStamina;
				if (num7)
				{
					stringBuilder.Append($"\n$item_healthuse: <color={arg7}>{attackStamina:#.#}</color>");
				}
				else if ((double)item.m_shared.m_attack.m_attackHealth > 0.0)
				{
					stringBuilder.Append("\n$item_healthuse: " + $"<color=orange>{item.m_shared.m_attack.m_attackHealth}</color>");
				}
				string arg8 = (magicItem.HasEffect(MagicEffectType.ModifyAttackHealthUse) ? colorString : "orange");
				float num8 = (1f - magicItem.GetTotalEffectValue(MagicEffectType.ModifyAttackHealthUse, 0.01f)) * item.m_shared.m_attack.m_attackHealthPercentage;
				if ((double)item.m_shared.m_attack.m_attackHealthPercentage > 0.0)
				{
					stringBuilder.Append($"\n$item_healthuse: <color={arg8}>{num8 / 100f:##.#%}</color>");
				}
				string arg9 = (magicItem.HasEffect(MagicEffectType.ModifyDrawStaminaUse) ? colorString : "orange");
				float num9 = (1f - magicItem.GetTotalEffectValue(MagicEffectType.ModifyDrawStaminaUse, 0.01f)) * item.m_shared.m_attack.m_drawStaminaDrain;
				if ((double)item.m_shared.m_attack.m_drawStaminaDrain > 0.0)
				{
					stringBuilder.Append("\n$item_staminahold: " + $"<color={arg9}>{num9:#.#}/s");
				}
				float baseBlockPower2 = item.GetBaseBlockPower(qualityLevel);
				string text8 = item.GetBlockPowerTooltip(qualityLevel).ToString("0");
				stringBuilder.Append($"\n$item_blockpower: <color={arg2}>{baseBlockPower2}</color> " + "<color=" + text6 + ">(" + text8 + ")</color>");
				if ((double)item.m_shared.m_timedBlockBonus > 1.0)
				{
					stringBuilder.Append("\n$item_deflection: " + $"<color={arg3}>{item.GetDeflectionForce(qualityLevel)}</color>");
					float num10 = item.m_shared.m_timedBlockBonus;
					if (flag2)
					{
						num10 *= 1f + totalEffectValue;
					}
					stringBuilder.Append($"\n$item_parrybonus: <color={arg3}>{num10:0.#}x</color>");
				}
				stringBuilder.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", item.m_shared.m_attackForce);
				bool num11 = magicItem.HasEffect(MagicEffectType.ModifyBackstab);
				float totalEffectValue2 = magicItem.GetTotalEffectValue(MagicEffectType.ModifyBackstab, 0.01f);
				string arg10 = (num11 ? colorString : "orange");
				float num12 = item.m_shared.m_backstabBonus * (1f + totalEffectValue2);
				stringBuilder.Append($"\n$item_backstab: <color={arg10}>{num12:0.#}x</color>");
				string projectileTooltip = item.GetProjectileTooltip(qualityLevel);
				if (projectileTooltip.Length > 0)
				{
					stringBuilder.Append("\n\n");
					stringBuilder.Append(projectileTooltip);
				}
				string statusEffectTooltip3 = item.GetStatusEffectTooltip(qualityLevel, skillLevel);
				if (statusEffectTooltip3.Length > 0)
				{
					stringBuilder.Append("\n\n");
					stringBuilder.Append(statusEffectTooltip3);
				}
				break;
			}
			case 3:
			{
				float baseBlockPower = item.GetBaseBlockPower(qualityLevel);
				string text7 = item.GetBlockPowerTooltip(qualityLevel).ToString("0");
				stringBuilder.Append($"\n$item_blockpower: <color={arg2}>{baseBlockPower}</color> " + "<color=" + text6 + ">(" + text7 + ")</color>");
				if ((double)item.m_shared.m_timedBlockBonus > 1.0)
				{
					stringBuilder.Append("\n$item_deflection: " + $"<color={arg3}>{item.GetDeflectionForce(qualityLevel)}</color>");
					float num2 = item.m_shared.m_timedBlockBonus;
					if (flag2)
					{
						num2 *= 1f + totalEffectValue;
					}
					stringBuilder.Append($"\n$item_parrybonus: <color={arg3}>{num2:0.#}x</color>");
				}
				break;
			}
			case 4:
			case 5:
			case 9:
			case 15:
			{
				string arg4 = (magicItem.HasEffect(MagicEffectType.ModifyArmor) ? colorString : "orange");
				stringBuilder.Append("\n$item_armor: " + $"<color={arg4}>{item.GetArmor(qualityLevel, (float)Game.m_worldLevel):0.#}</color>");
				string damageModifiersTooltipString = SE_Stats.GetDamageModifiersTooltipString(item.m_shared.m_damageModifiers);
				if (damageModifiersTooltipString.Length > 0)
				{
					stringBuilder.Append(damageModifiersTooltipString);
				}
				string statusEffectTooltip = item.GetStatusEffectTooltip(qualityLevel, skillLevel);
				if (statusEffectTooltip.Length > 0)
				{
					stringBuilder.Append("\n");
					stringBuilder.Append(statusEffectTooltip);
				}
				break;
			}
			case 7:
			{
				DamageTypes damage = item.GetDamage(qualityLevel, (float)Game.m_worldLevel);
				stringBuilder.Append(((DamageTypes)(ref damage)).GetTooltipString(item.m_shared.m_skillType));
				stringBuilder.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", item.m_shared.m_attackForce);
				break;
			}
			}
			bool flag4 = magicItem.HasEffect(MagicEffectType.ModifyEitrRegen);
			bool magicEitrRegen;
			if ((flag4 || item.m_shared.m_eitrRegenModifier != 0f) && (Object)(object)localPlayer != (Object)null)
			{
				string eitrRegenModifier = GetEitrRegenModifier(item, magicItem, out magicEitrRegen);
				float num13 = localPlayer.GetEquipmentEitrRegenModifier() * 100f;
				float totalActiveMagicEffectValue = localPlayer.GetTotalActiveMagicEffectValue(MagicEffectType.ModifyEitrRegen);
				float num14 = num13 + totalActiveMagicEffectValue;
				string text9 = (flag4 ? colorString : "orange");
				string arg11 = ((totalActiveMagicEffectValue > 0f) ? colorString : "yellow");
				stringBuilder.Append("\n$item_eitrregen_modifier: <color=" + text9 + ">" + eitrRegenModifier + "</color> " + $"($item_total: <color={arg11}>{num14:+0;-0}%</color>)");
			}
			bool flag5 = magicItem.HasEffect(MagicEffectType.ModifyMovementSpeed);
			if ((flag5 || item.m_shared.m_movementModifier != 0f) && (Object)(object)localPlayer != (Object)null)
			{
				bool removePenalty;
				string movementModifier = GetMovementModifier(item, magicItem, out magicEitrRegen, out removePenalty);
				float num15 = ((Character)localPlayer).GetEquipmentMovementModifier() * 100f;
				string text10 = ((removePenalty || flag5) ? colorString : "orange");
				stringBuilder.Append("\n$item_movement_modifier: <color=" + text10 + ">" + movementModifier + "</color> " + $"($item_total:<color=yellow>{num15:+0;-0}%</color>)");
			}
			stringBuilder.AppendLine(magicItem.GetTooltip());
			if (item.IsSetItem())
			{
				stringBuilder.Append(item.GetSetTooltip());
			}
			__result = stringBuilder.ToString();
			return false;
		}

		[UsedImplicitly]
		[HarmonyPriority(0)]
		public static void Postfix(ref string __result, ItemData item)
		{
			if (item == null)
			{
				return;
			}
			__result = EIDFLegacy.FormatCrafterName(__result);
			if (item.IsMagicCraftingMaterial() || item.IsRunestone())
			{
				string rarityDisplayName = EpicLoot.GetRarityDisplayName(item.GetCraftingMaterialRarity());
				__result = "<color=" + item.GetCraftingMaterialRarityColor() + ">" + rarityDisplayName + " $mod_epicloot_craftingmaterial\n</color>" + __result;
			}
			if (!item.IsMagic())
			{
				StringBuilder stringBuilder = new StringBuilder();
				if (item.IsSetItem())
				{
					int num = __result.IndexOf("\n\n$item_seteffect", StringComparison.InvariantCulture);
					if (num >= 0)
					{
						__result = __result.Remove(num);
					}
					stringBuilder.Append(item.GetSetTooltip());
				}
				__result += stringBuilder.ToString();
			}
			__result = __result.Replace("<color=orange>", "<color=#add8e6ff>");
			__result = __result.Replace("<color=yellow>", "<color=#add8e6ff>");
			__result = __result.Replace("\n\n\n", "\n\n");
		}

		public static string GetDamageTooltipString(MagicItem item, DamageTypes instance, SkillType skillType, string magicColor)
		{
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: 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)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: 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_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_029d: 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_02c1: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Player.m_localPlayer == (Object)null)
			{
				return "";
			}
			bool flag = item.HasEffect(MagicEffectType.ModifyDamage);
			bool flag2 = item.HasEffect(MagicEffectType.ModifyPhysicalDamage);
			bool flag3 = item.HasEffect(MagicEffectType.ModifyElementalDamage);
			bool flag4 = item.HasEffect(MagicEffectType.AddBluntDamage);
			bool flag5 = item.HasEffect(MagicEffectType.AddSlashingDamage);
			bool flag6 = item.HasEffect(MagicEffectType.AddPiercingDamage);
			bool flag7 = item.HasEffect(MagicEffectType.AddFireDamage);
			bool flag8 = item.HasEffect(MagicEffectType.AddFrostDamage);
			bool flag9 = item.HasEffect(MagicEffectType.AddLightningDamage);
			bool flag10 = item.HasEffect(MagicEffectType.AddPoisonDamage);
			bool flag11 = item.HasEffect(MagicEffectType.AddSpiritDamage);
			float coinHoarderDamageMultiplier;
			bool flag12 = CoinHoarder.HasCoinHoarder(out coinHoarderDamageMultiplier);
			float minFactor = default(float);
			float maxFactor = default(float);
			((Character)Player.m_localPlayer).GetSkills().GetRandomSkillRange(ref minFactor, ref maxFactor, skillType);
			string text = "";
			if ((double)instance.m_damage != 0.0)
			{
				text = text + "\n$inventory_damage: " + DamageRange(instance.m_damage, minFactor, maxFactor, flag, magicColor);
			}
			if ((double)instance.m_blunt != 0.0)
			{
				bool magic = flag || flag2 || flag4 || flag12;
				text = text + "\n$inventory_blunt: " + DamageRange(instance.m_blunt, minFactor, maxFactor, magic, magicColor);
			}
			if ((double)instance.m_slash != 0.0)
			{
				bool magic2 = flag || flag2 || flag5 || flag12;
				text = text + "\n$inventory_slash: " + DamageRange(instance.m_slash, minFactor, maxFactor, magic2, magicColor);
			}
			if ((double)instance.m_pierce != 0.0)
			{
				bool magic3 = flag || flag2 || flag6 || flag12;
				text = text + "\n$inventory_pierce: " + DamageRange(instance.m_pierce, minFactor, maxFactor, magic3, magicColor);
			}
			if ((double)instance.m_fire != 0.0)
			{
				bool magic4 = flag || flag3 || flag7 || flag12;
				text = text + "\n$inventory_fire: " + DamageRange(instance.m_fire, minFactor, maxFactor, magic4, magicColor);
			}
			if ((double)instance.m_frost != 0.0)
			{
				bool magic5 = flag || flag3 || flag8 || flag12;
				text = text + "\n$inventory_frost: " + DamageRange(instance.m_frost, minFactor, maxFactor, magic5, magicColor);
			}
			if ((double)instance.m_lightning != 0.0)
			{
				bool magic6 = flag || flag3 || flag9 || flag12;
				text = text + "\n$inventory_lightning: " + DamageRange(instance.m_lightning, minFactor, maxFactor, magic6, magicColor);
			}
			if ((double)instance.m_poison != 0.0)
			{
				bool magic7 = flag || flag3 || flag10 || flag12;
				text = text + "\n$inventory_poison: " + DamageRange(instance.m_poison, minFactor, maxFactor, magic7, magicColor);
			}
			if ((double)instance.m_spirit != 0.0)
			{
				bool magic8 = flag || flag3 || flag11 || flag12;
				text = text + "\n$inventory_spirit: " + DamageRange(instance.m_spirit, minFactor, maxFactor, magic8, magicColor);
			}
			return text;
		}

		public static string DamageRange(float damage, float minFactor, float maxFactor, bool magic = false, string magicColor = "")
		{
			int num = Mathf.RoundToInt(damage * minFactor);
			int num2 = Mathf.RoundToInt(damage * maxFactor);
			string arg = (magic ? magicColor : "orange");
			string arg2 = (magic ? magicColor : "yellow");
			return $"<color={arg}>{Mathf.RoundToInt(damage)}</color> " + $"<color={arg2}>({num}-{num2}) </color>";
		}

		public static string GetEitrRegenModifier(ItemData item, MagicItem magicItem, out bool magicEitrRegen)
		{
			magicEitrRegen = magicItem?.HasEffect(MagicEffectType.ModifyEitrRegen) ?? false;
			float num = item.m_shared.m_eitrRegenModifier * 100f;
			if (magicEitrRegen && magicItem != null)
			{
				num += magicItem.GetTotalEffectValue(MagicEffectType.ModifyEitrRegen);
			}
			if (num != 0f)
			{
				return $"{num:+0;-0}%";
			}
			return "0%";
		}

		public static string GetMovementModifier(ItemData item, MagicItem magicItem, out bool magicMovement, out bool removePenalty)
		{
			magicMovement = magicItem.HasEffect(MagicEffectType.ModifyMovementSpeed);
			removePenalty = magicItem.HasEffect(MagicEffectType.RemoveSpeedPenalty);
			float num = (removePenalty ? 0f : (item.m_shared.m_movementModifier * 100f));
			if (magicMovement)
			{
				num += magicItem.GetTotalEffectValue(MagicEffectType.ModifyMovementSpeed);
			}
			if (num != 0f)
			{
				return $"{num:+0;-0}%";
			}
			return "0%";
		}
	}
	public static class AugaTooltipPreprocessor
	{
		public static Tuple<string, string> PreprocessTooltipStat(ItemData item, string label, string value)
		{
			Player localPlayer = Player.m_localPlayer;
			bool magicEitrRegen;
			if (item.IsMagic(out var magicItem))
			{
				string colorString = magicItem.GetColorString();
				bool flag = magicItem.HasEffect(MagicEffectType.ModifyDamage);
				bool flag2 = magicItem.HasEffect(MagicEffectType.ModifyPhysicalDamage);
				bool flag3 = magicItem.HasEffect(MagicEffectType.ModifyElementalDamage);
				bool flag4 = magicItem.HasEffect(MagicEffectType.AddBluntDamage);
				bool flag5 = magicItem.HasEffect(MagicEffectType.AddSlashingDamage);
				bool flag6 = magicItem.HasEffect(MagicEffectType.AddPiercingDamage);
				bool flag7 = magicItem.HasEffect(MagicEffectType.AddFireDamage);
				bool flag8 = magicItem.HasEffect(MagicEffectType.AddFrostDamage);
				bool flag9 = magicItem.HasEffect(MagicEffectType.AddLightningDamage);
				bool flag10 = magicItem.HasEffect(MagicEffectType.AddPoisonDamage);
				bool flag11 = magicItem.HasEffect(MagicEffectType.AddSpiritDamage);
				switch (label)
				{
				case "$item_durability":
					if (magicItem.HasEffect(MagicEffectType.Indestructible))
					{
						value = "<color=" + colorString + ">Indestructible</color>";
					}
					else if (magicItem.HasEffect(MagicEffectType.ModifyDurability))
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$item_weight":
					if (magicItem.HasEffect(MagicEffectType.ReduceWeight) || magicItem.HasEffect(MagicEffectType.Weightless))
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_damage":
					if (flag)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_blunt":
					if (flag || flag2 || flag4)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_slash":
					if (flag || flag2 || flag5)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_pierce":
					if (flag || flag2 || flag6)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_fire":
					if (flag || flag3 || flag7)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_frost":
					if (flag || flag3 || flag8)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_lightning":
					if (flag || flag3 || flag9)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_poison":
					if (flag || flag3 || flag10)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$inventory_spirit":
					if (flag || flag3 || flag11)
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$item_backstab":
					if (magicItem.HasEffect(MagicEffectType.ModifyBackstab))
					{
						float totalEffectValue2 = magicItem.GetTotalEffectValue(MagicEffectType.ModifyBackstab, 0.01f);
						float num2 = item.m_shared.m_backstabBonus * (1f + totalEffectValue2);
						value = $"<color={colorString}>{num2:0.#}x</color>";
					}
					break;
				case "$item_blockpower":
					if (magicItem.HasEffect(MagicEffectType.ModifyBlockPower))
					{
						float baseBlockPower = item.GetBaseBlockPower(item.m_quality);
						string text = item.GetBlockPowerTooltip(item.m_quality).ToString("0");
						value = $"<color={colorString}>{baseBlockPower}</color> " + "<color=" + colorString + ">(" + text + ")</color>";
					}
					break;
				case "$item_deflection":
					if (magicItem.HasEffect(MagicEffectType.ModifyParry))
					{
						value = $"<color={colorString}>{item.GetDeflectionForce(item.m_quality)}</color>";
					}
					break;
				case "$item_parrybonus":
					if (magicItem.HasEffect(MagicEffectType.ModifyParry))
					{
						float totalEffectValue = magicItem.GetTotalEffectValue(MagicEffectType.ModifyParry, 0.01f);
						float num = item.m_shared.m_timedBlockBonus * (1f + totalEffectValue);
						value = $"<color={colorString}>{num:0.#}x</color>";
					}
					break;
				case "$item_armor":
					if (magicItem.HasEffect(MagicEffectType.ModifyArmor))
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$item_staminause":
					if (magicItem.HasEffect(MagicEffectType.ModifyAttackStaminaUse) || magicItem.HasEffect(MagicEffectType.ModifyBlockStaminaUse))
					{
						value = "<color=" + colorString + ">" + value + "</color>";
					}
					break;
				case "$item_crafter":
					value = EIDFLegacy.GetCrafterName(value);
					break;
				}
				if (label.StartsWith("$item_movement_modifier") && (magicItem.HasEffect(MagicEffectType.RemoveSpeedPenalty) || magicItem.HasEffect(MagicEffectType.ModifyMovementSpeed)))
				{
					int num3 = label.IndexOf("<color", StringComparison.Ordinal);
					if (num3 >= 0)
					{
						StringBuilder stringBuilder = new StringBuilder(label);
						stringBuilder.Remove(num3, "<color=#XXXXXX>".Length);
						stringBuilder.Insert(num3, "<color=" + colorString + ">");
						bool magicMovement;
						string movementModifier = MagicItemTooltip_ItemDrop_Patch.GetMovementModifier(item, magicItem, out magicMovement, out magicEitrRegen);
						int num4 = num3 + "<color=#XXXXXX>".Length;
						int num5 = label.IndexOf("%", num4, StringComparison.Ordinal);
						stringBuilder.Remove(num4, num5 - num4 + 1);
						stringBuilder.Insert(num4, movementModifier);
						label = stringBuilder.ToString();
					}
				}
			}
			bool flag12 = magicItem?.HasEffect(MagicEffectType.ModifyEitrRegen) ?? false;
			if (label.StartsWith("$item_eitrregen_modifier") && (flag12 || item.m_shared.m_eitrRegenModifier != 0f) && (Object)(object)localPlayer != (Object)null)
			{
				string text2 = MagicItemTooltip_ItemDrop_Patch.GetEitrRegenModifier(item, magicItem, out magicEitrRegen);
				float num6 = localPlayer.GetEquipmentEitrRegenModifier() * 100f;
				float totalActiveMagicEffectValue = localPlayer.GetTotalActiveMagicEffectValue(MagicEffectType.ModifyEitrRegen);
				float num7 = num6 + totalActiveMagicEffectValue;
				if (flag12 && magicItem != null)
				{
					text2 = "<color=" + magicItem.GetColorString() + ">" + text2 + "</color>";
				}
				label = "$item_eitrregen_modifier: " + text2 + " " + $"($item_total: <color={API.Brown3}>{num7:+0;-0}%</color>)";
			}
			if (label == "$item_crafter")
			{
				value = EIDFLegacy.GetCrafterName(value);
			}
			return new Tuple<string, string>(label, value);
		}
	}
	public class Multiplayer_Player_Patch
	{
		[HarmonyPatch]
		public static class Humanoid_Patch
		{
			[HarmonyPatch(typeof(Humanoid), "EquipItem")]
			public class AttachExtendedDataToZDO_Humanoid_EquipItem_Patch
			{
				[UsedImplicitly]
				private static void Postfix(ItemData item, bool __result, Humanoid __instance)
				{
					//IL_0014: Unknown result type (might be due to invalid IL or missing references)
					//IL_0020: Expected O, but got Unknown
					if (__result && (Object)(object)__instance == (Object)(object)Player.m_localPlayer && item != null)
					{
						UpdatePlayerZDOForEquipment((Player)__instance, item, equip: true);
					}
				}
			}

			[HarmonyPatch(typeof(Humanoid), "UnequipItem")]
			public class AttachExtendedDataToZDO_Humanoid_UnequipItem_Patch
			{
				[UsedImplicitly]
				private static void Prefix(Humanoid __instance, ItemData item)
				{
					//IL_001e: Unknown result type (might be due to invalid IL or missing references)
					//IL_002a: Expected O, but got Unknown
					if ((Object)(object)__instance == (Object)(object)Player.m_localPlayer && item != null && ((Humanoid)Player.m_localPlayer).IsItemEquiped(item))
					{
						UpdatePlayerZDOForEquipment((Player)__instance, item, equip: false);
					}
				}
			}
		}

		[HarmonyPatch(typeof(Player), "Update")]
		public static class WatchLegendaryEquipment_Player_Update_Patch
		{
			private static float _updateEventTime;

			[UsedImplicitly]
			public static void Postfix(Player __instance)
			{
				_updateEventTime -= Time.deltaTime;
				if ((double)_updateEventTime > 0.0)
				{
					return;
				}
				_updateEventTime = 10f;
				if ((Object)(object)__instance != (Object)null && (Object)(object)__instance != (Object)(object)Player.m_localPlayer && (Object)(object)((Character)__instance).m_nview != (Object)null)
				{
					ZDO zDO = ((Character)__instance).m_nview.GetZDO();
					if (zDO != null && (DoCheck(__instance, zDO, "LeftItem", "lf-ell", ref ((Humanoid)__instance).m_leftItem) || DoCheck(__instance, zDO, "RightItem", "ri-ell", ref ((Humanoid)__instance).m_rightItem) || DoCheck(__instance, zDO, "ChestItem", "ch-ell", ref ((Humanoid)__instance).m_chestItem) || DoCheck(__instance, zDO, "LegItem", "lg-ell", ref ((Humanoid)__instance).m_legItem) || DoCheck(__instance, zDO, "HelmetItem", "hl-ell", ref ((Humanoid)__instance).m_helmetItem) || DoCheck(__instance, zDO, "ShoulderItem", "sh-ell", ref ((Humanoid)__instance).m_shoulderItem) || DoCheck(__instance, zDO, "UtilityItem", "ut-ell", ref ((Humanoid)__instance).m_utilityItem)))
					{
						((Humanoid)__instance).SetupVisEquipment(((Humanoid)__instance).m_visEquipment, false);
					}
				}
			}

			private static bool DoCheck(Player player, ZDO zdo, string equipKey, string legendaryDataKey, ref ItemData itemData)
			{
				string @string = zdo.GetString(legendaryDataKey, "");
				if (string.IsNullOrEmpty(@string))
				{
					bool num = itemData != null;
					if (num)
					{
						ForceResetVisEquipment((Humanoid)(object)player, itemData);
					}
					itemData = null;
					return num;
				}
				if (itemData?.GetMagicItem()?.LegendaryID == @string)
				{
					return false;
				}
				int @int = zdo.GetInt(equipKey, 0);
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(@int);
				ItemData val = ((itemPrefab == null) ? null : itemPrefab.GetComponent<ItemDrop>()?.m_itemData);
				if (val != null)
				{
					itemData = val.Clone();
					itemData.m_durability = float.PositiveInfinity;
					MagicItemComponent orCreate = itemData.Data().GetOrCreate<MagicItemComponent>();
					MagicItem magicItem = new MagicItem
					{
						Rarity = ItemRarity.Legendary,
						LegendaryID = @string
					};
					orCreate.SetMagicItem(magicItem);
					ForceResetVisEquipment((Humanoid)(object)player, itemData);
				}
				return false;
			}

			public static void ForceResetVisEquipment(Humanoid humanoid, ItemData item)
			{
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_007f: Expected I4, but got Unknown
				//IL_0093: Unknown result type (might be due to invalid IL or missing references)
				//IL_009a: Invalid comparison between Unknown and I4
				if ((Object)(object)humanoid == (Object)null || (Object)(object)humanoid.m_visEquipment == (Object)null || item == null)
				{
					return;
				}
				ItemType itemType = item.m_shared.m_itemType;
				switch (itemType - 3)
				{
				case 0:
					if (humanoid.m_rightItem != null && (int)humanoid.m_rightItem.m_shared.m_itemType == 15 && humanoid.m_leftItem == null)
					{
						humanoid.m_visEquipment.m_currentLeftItemHash = -1;
					}
					humanoid.m_visEquipment.m_currentRightItemHash = -1;
					break;
				case 1:
				case 2:
					humanoid.m_visEquipment.m_currentLeftItemHash = -1;
					break;
				case 11:
				case 19:
					humanoid.m_visEquipment.m_currentRightItemHash = -1;
					humanoid.m_visEquipment.m_currentLeftItemHash = -1;
					break;
				case 4:
					humanoid.m_visEquipment.m_currentChestItemHash = -1;
					break;
				case 8:
					humanoid.m_visEquipment.m_currentLegItemHash = -1;
					break;
				case 3:
					humanoid.m_visEquipment.m_currentHelmetItemHash = -1;
					break;
				case 14:
					humanoid.m_visEquipment.m_currentShoulderItemHash = -1;
					break;
				case 15:
					humanoid.m_visEquipment.m_currentUtilityItemHash = -1;
					break;
				case 16:
					humanoid.m_visEquipment.m_currentRightItemHash = -1;
					break;
				case 5:
				case 6:
				case 7:
				case 9:
				case 10:
				case 12:
				case 13:
				case 17:
				case 18:
					break;
				}
			}
		}

		[HarmonyPatch]
		public static class WatchMultiplayerMagicEffects_Player_Patch
		{
			[HarmonyPatch(typeof(Humanoid), "EquipItem")]
			[HarmonyPostfix]
			public static void EquipItem_Postfix(Humanoid __instance)
			{
				Player val = (Player)(object)((__instance is Player) ? __instance : null);
				if (val != null)
				{
					UpdateRichesAndLuck(val);
				}
			}

			[HarmonyPatch(typeof(Humanoid), "UnequipItem")]
			[HarmonyPostfix]
			public static void UnequipItem_Postfix(Humanoid __instance)
			{
				Player val = (Player)(object)((__instance is Player) ? __instance : null);
				if (val != null)
				{
					UpdateRichesAndLuck(val);
				}
			}

			public static void UpdateRichesAndLuck(Player player)
			{
				if (!((Object)(object)player == (Object)(object)Player.m_localPlayer))
				{
					return;
				}
				ZNetView nview = ((Character)player).m_nview;
				ZDO val = ((nview != null) ? nview.GetZDO() : null);
				if (val != null)
				{
					int @int = val.GetInt("el-luk", 0);
					int int2 = val.GetInt("el-rch", 0);
					int num = (int)player.GetTotalActiveMagicEffectValue(MagicEffectType.Luck);
					int num2 = (int)player.GetTotalActiveMagicEffectValue(MagicEffectType.Riches);
					if (num != @int)
					{
						val.Set("el-luk", num);
					}
					if (num2 != int2)
					{
						val.Set("el-rch", num2);
					}
				}
			}
		}

		public static void UpdatePlayerZDOForEquipment(Player player, ItemData item, bool equip)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Expected I4, but got Unknown
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Invalid comparison between Unknown and I4
			object obj;
			if (player == null)
			{
				obj = null;
			}
			else
			{
				ZNetView nview = ((Character)player).m_nview;
				obj = ((nview != null) ? nview.GetZDO() : null);
			}
			ZDO val = (ZDO)obj;
			if (val == null)
			{
				return;
			}
			MagicItem magicItem = item.GetMagicItem();
			string text = ((!equip) ? "" : ((magicItem != null && magicItem.IsUniqueLegendary()) ? magicItem.LegendaryID : ""));
			ItemType itemType = item.m_shared.m_itemType;
			switch (itemType - 3)
			{
			default:
				if ((int)itemType != 22)
				{
					break;
				}
				goto case 0;
			case 0:
			case 1:
			case 2:
			case 11:
			{
				ItemData leftItem = ((Humanoid)player).m_leftItem;
				if (((leftItem != null) ? ((Object)leftItem.m_dropPrefab).name : null) == ((Object)item.m_dropPrefab).name)
				{
					val.Set("lf-ell", text);
				}
				ItemData rightItem = ((Humanoid)player).m_rightItem;
				if (((rightItem != null) ? ((Object)rightItem.m_dropPrefab).name : null) == ((Object)item.m_dropPrefab).name)
				{
					val.Set("ri-ell", text);
				}
				break;
			}
			case 4:
				val.Set("ch-ell", text);
				break;
			case 8:
				val.Set("lg-ell", text);
				break;
			case 3:
				val.Set("hl-ell", text);
				break;
			case 14:
				val.Set("sh-ell", text);
				break;
			case 15:
				val.Set("ut-ell", text);
				break;
			case 5:
			case 6:
			case 7:
			case 9:
			case 10:
			case 12:
			case 13:
				break;
			}
		}
	}
	[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
	public static class ObjectDB_CopyOtherDB_Patch
	{
		public static void Postfix()
		{
			EpicLoot.TryRegisterItems();
			EpicLoot.TryRegisterRecipes();
		}
	}
	[HarmonyPatch(typeof(ObjectDB), "Awake")]
	public static class ObjectDB_Awake_Patch
	{
		public static void Postfix()
		{
			EpicLoot.TryRegisterItems();
			EpicLoot.TryRegisterRecipes();
		}
	}
	[HarmonyPatch(typeof(Terminal), "InitTerminal")]
	public static class Terminal_Patch
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static ConsoleEvent <>9__1_0;

			public static ConsoleEvent <>9__1_1;

			public static ConsoleEvent <>9__1_2;

			public static ConsoleEvent <>9__1_3;

			public static ConsoleEvent <>9__1_4;

			public static ConsoleEvent <>9__1_5;

			public static ConsoleEvent <>9__1_6;

			public static ConsoleEvent <>9__1_7;

			public static ConsoleEvent <>9__1_8;

			public static ConsoleEvent <>9__1_9;

			public static ConsoleEvent <>9__1_10;

			public static ConsoleEvent <>9__1_11;

			public static ConsoleEvent <>9__1_12;

			public static ConsoleEvent <>9__1_13;

			public static ConsoleEvent <>9__1_14;

			public static ConsoleEvent <>9__1_15;

			public static ConsoleEvent <>9__1_16;

			public static ConsoleEvent <>9__1_17;

			public static ConsoleEvent <>9__1_18;

			public static ConsoleEvent <>9__1_19;

			public static ConsoleEvent <>9__1_20;

			public static ConsoleEvent <>9__1_21;

			public static ConsoleEvent <>9__1_22;

			public static ConsoleEvent <>9__1_23;

			public static ConsoleEvent <>9__1_24;

			public static ConsoleEvent <>9__1_25;

			public static ConsoleEvent <>9__1_26;

			public static ConsoleEvent <>9__1_27;

			public static ConsoleEvent <>9__1_28;

			public static ConsoleEvent <>9__1_29;

			public static ConsoleEvent <>9__1_30;

			public static ConsoleEvent <>9__1_31;

			public static ConsoleEvent <>9__1_32;

			public static Func<TreasureMapChestInfo, int> <>9__4_0;

			public static Func<GameObject, bool> <>9__8_0;

			public static Func<GameObject, bool> <>9__8_1;

			public static Func<GameObject, string> <>9__8_2;

			public static Func<string, float> <>9__8_3;

			internal void <Postfix>b__1_0(ConsoleEventArgs args)
			{
				MagicItem(args.Context, args.Args);
			}

			internal void <Postfix>b__1_1(ConsoleEventArgs args)
			{
				MagicItem(args.Context, args.Args);
			}

			internal void <Postfix>b__1_2(ConsoleEventArgs args)
			{
				SpawnMagicItemWithEffect(args.Context, args.Args);
			}

			internal void <Postfix>b__1_3(ConsoleEventArgs args)
			{
				SpawnMagicItemWithEffect(args.Context, args.Args);
			}

			internal void <Postfix>b__1_4(ConsoleEventArgs args)
			{
				SpawnLegendaryMagicItem(args.Context, args.Args);
			}

			internal void <Postfix>b__1_5(ConsoleEventArgs args)
			{
				SpawnLegendaryMagicItem(args.Context, args.Args);
			}

			internal void <Postfix>b__1_6(ConsoleEventArgs args)
			{
				SpawnLegendaryMagicItem(args.Context, args.Args, ItemRarity.Mythic);
			}

			internal void <Postfix>b__1_7(ConsoleEventArgs args)
			{
				SpawnLegendaryMagicItem(args.Context, args.Args, ItemRarity.Mythic);
			}

			internal void <Postfix>b__1_8(ConsoleEventArgs args)
			{
				SpawnMagicItemSet(args.Context, args.Args);
			}

			internal void <Postfix>b__1_9(ConsoleEventArgs args)
			{
				SpawnMagicItemSet(args.Context, args.Args);
			}

			internal void <Postfix>b__1_10(ConsoleEventArgs args)
			{
				CheckStackQuality(args.Context);
			}

			internal void <Postfix>b__1_11(ConsoleEventArgs args)
			{
				SpawnMagicCraftingMaterials();
			}

			internal void <Postfix>b__1_12(ConsoleEventArgs args)
			{
				ToggleAlwaysDrop(args.Context);
			}

			internal void <Postfix>b__1_13(ConsoleEventArgs args)
			{
				LootRoller.CheatDisableGating = !LootRoller.CheatDisableGating;
				args.Context.AddString($"> Disable gating for magic item drops: {LootRoller.CheatDisableGating}");
			}

			internal void <Postfix>b__1_14(ConsoleEventArgs args)
			{
				TestTreasureMap(args.Args);
			}

			internal void <Postfix>b__1_15(ConsoleEventArgs args)
			{
				TestTreasureMap(args.Args);
			}

			internal void <Postfix>b__1_16(ConsoleEventArgs args)
			{
				AdventureSaveData adventureSaveData = Player.m_localPlayer.GetAdventureSaveData();
				adventureSaveData.TreasureMaps.Clear();
				adventureSaveData.NumberOfTreasureMapsOrBountiesStarted = 0;
				ResetMinimap();
			}

			internal void <Postfix>b__1_17(ConsoleEventArgs args)
			{
				AdventureSaveData adventureSaveData = Player.m_localPlayer.GetAdventureSaveData();
				adventureSaveData.TreasureMaps.Clear();
				adventureSaveData.NumberOfTreasureMapsOrBountiesStarted = 0;
				ResetMinimap();
			}

			internal void <Postfix>b__1_18(ConsoleEventArgs args)
			{
				MinimapController.DebugMode = !MinimapController.DebugMode;
				args.Context.AddString($"> Treasure Map Debug Mode: {MinimapController.DebugMode}");
			}

			internal void <Postfix>b__1_19(ConsoleEventArgs args)
			{
				MinimapController.DebugMode = !MinimapController.DebugMode;
				args.Context.AddString($"> Treasure Map Debug Mode: {MinimapController.DebugMode}");
			}

			internal void <Postfix>b__1_20(ConsoleEventArgs args)
			{
				Player.m_localPlayer.GetAdventureSaveData().Bounties.Clear();
				ResetMinimap();
			}

			internal void <Postfix>b__1_21(ConsoleEventArgs args)
			{
				Random random = new Random();
				int num = ((args.Length >= 2) ? int.Parse(args[1]) : 10);
				for (int i = 0; i < num; i++)
				{
					string text = BountiesAdventureFeature.GenerateTargetName(random);
					args.Context.AddString(text);
				}
			}

			internal void <Postfix>b__1_22(ConsoleEventArgs args)
			{
				((Component)Player.m_localPlayer).GetComponent<AdventureComponent>().SaveData = new AdventureSaveDataList();
				ResetMinimap();
			}

			internal void <Postfix>b__1_23(ConsoleEventArgs args)
			{
				int num = ((args.Length >= 2) ? int.Parse(args[1]) : AdventureDataManager.Bounties.GetCurrentInterval());
				List<BountyInfo> availableBounties = AdventureDataManager.Bounties.GetAvailableBounties(num, removeAcceptedBounties: false);
				BountiesAdventureFeature.PrintBounties($"Bounties for Interval {num}:", availableBounties);
			}

			internal void <Postfix>b__1_24(ConsoleEventArgs args)
			{
				List<BountyInfo> bounties = Player.m_localPlayer.GetAdventureSaveData().Bounties;
				BountiesAdventureFeature.PrintBounties("Player Bounties:", bounties);
			}

			internal void <Postfix>b__1_25(ConsoleEventArgs args)
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: Unknown result type (might be due to invalid IL or missing references)
				//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_0051: 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_0061: Unknown result type (might be due to invalid IL or missing references)
				Player localPlayer = Player.m_localPlayer;
				LocationInstance val = default(LocationInstance);
				if (ZoneSystem.instance.FindClosestLocation("Vendor_BlackForest", ((Component)localPlayer).transform.position, ref val))
				{
					((Terminal)Console.instance).AddString(((object)(Vector3)(ref val.m_position)).ToString());
					((Character)localPlayer).TeleportTo(val.m_position + Vector3.right * 5f, ((Component)localPlayer).transform.rotation, true);
				}
			}

			internal void <Postfix>b__1_26(ConsoleEventArgs args)
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: Unknown result type (might be due to invalid IL or missing references)
				//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_0051: 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_0061: Unknown result type (might be due to invalid IL or missing references)
				Player localPlayer = Player.m_localPlayer;
				LocationInstance val = default(LocationInstance);
				if (ZoneSystem.instance.FindClosestLocation("Vendor_BlackForest", ((Component)localPlayer).transform.position, ref val))
				{
					((Terminal)Console.instance).AddString(((object)(Vector3)(ref val.m_position)).ToString());
					((Character)localPlayer).TeleportTo(val.m_position + Vector3.right * 5f, ((Component)localPlayer).transform.rotation, true);
				}
			}

			internal void <Postfix>b__1_27(ConsoleEventArgs args)
			{
				if (!((Object)(object)ZoneSystem.instance != (Object)null))
				{
					return;
				}
				args.Context.AddString("> Print Global Keys:");
				foreach (string globalKey in ZoneSystem.instance.GetGlobalKeys())
				{
					args.Context.AddString("> " + globalKey);
				}
			}

			internal void <Postfix>b__1_28(ConsoleEventArgs args)
			{
				FixResistances(Player.m_localPlayer);
			}

			internal void <Postfix>b__1_29(ConsoleEventArgs args)
			{
				string lootTableName = ((args.Length > 1) ? args[1] : "Greydwarf");
				float luckFactor = ((args.Length > 2) ? float.Parse(args[2]) : 0f);
				LootRoller.PrintLuckTest(lootTableName, luckFactor);
			}

			internal void <Postfix>b__1_30(ConsoleEventArgs args)
			{
				string lootTableName = ((args.Length > 1) ? args[1] : "Greydwarf");
				int level = ((args.Length <= 2) ? 1 : int.Parse(args[2]));
				int itemIndex = ((args.Length > 3) ? int.Parse(args[3]) : 0);
				LootRoller.PrintLootResolutionTest(lootTableName, level, itemIndex);
			}

			internal void <Postfix>b__1_31(ConsoleEventArgs args)
			{
				Player localPlayer = Player.m_localPlayer;
				if (!((Object)(object)localPlayer != (Object)null))
				{
					return;
				}
				AbilityController component = ((Component)localPlayer).GetComponent<AbilityController>();
				if (!((Object)(object)component != (Object)null))
				{
					return;
				}
				foreach (Ability currentAbility in component.CurrentAbilities)
				{
					currentAbility.ResetCooldown();
				}
			}

			internal void <Postfix>b__1_32(ConsoleEventArgs args)
			{
				LootRoller.DebugLuckFactor();
			}

			internal int <TestTreasureMapCoroutine>b__4_0(TreasureMapChestInfo x)
			{
				return x.Interval;
			}

			internal bool <MagicItem>b__8_0(GameObject x)
			{
				return EpicLoot.CanBeMagicItem(x.GetComponent<ItemDrop>().m_itemData);
			}

			internal bool <MagicItem>b__8_1(GameObject x)
			{
				if (((Object)x).name != "HelmetDverger" && ((Object)x).name != "BeltStrength")
				{
					return ((Object)x).name != "Wishbone";
				}
				return false;
			}

			internal string <MagicItem>b__8_2(GameObject x)
			{
				return ((Object)x).name;
			}

			internal float <MagicItem>b__8_3(string x)
			{
				return 1f;
			}
		}

		private static readonly Random _random = new Random();

		public static void Postfix()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_006a: 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: Expected O, but got Unknown
			//IL_00a2: 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_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown