Decompiled source of LinejaeserasRace v1.0.1

plugins/LinejaeserasRace.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using AzuExtendedPlayerInventory;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using ItemManager;
using JetBrains.Annotations;
using LinejaeserasRace.Systems;
using LocalizationManager;
using Microsoft.CodeAnalysis;
using ServerSync;
using StatusEffectManager;
using TMPro;
using UnityEngine;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.ObjectPool;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.BufferedDeserialization;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators;
using YamlDotNet.Serialization.Callbacks;
using YamlDotNet.Serialization.Converters;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;
using YamlDotNet.Serialization.NodeTypeResolvers;
using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphTraversalStrategies;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.Schemas;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
using YamlDotNet.Serialization.Utilities;
using YamlDotNet.Serialization.ValueDeserializers;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("LinejaeserasRace")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Azathoth")]
[assembly: AssemblyProduct("LinejaeserasRace")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")]
[assembly: AssemblyFileVersion("1.0.1")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace LocalizationManager
{
	[PublicAPI]
	public class Localizer
	{
		private static readonly Dictionary<string, Dictionary<string, Func<string>>> PlaceholderProcessors;

		private static readonly Dictionary<string, Dictionary<string, string>> loadedTexts;

		private static readonly ConditionalWeakTable<Localization, string> localizationLanguage;

		private static readonly List<WeakReference<Localization>> localizationObjects;

		private static BaseUnityPlugin? _plugin;

		private static readonly List<string> fileExtensions;

		private static BaseUnityPlugin plugin
		{
			get
			{
				//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b2: Expected O, but got Unknown
				if (_plugin == null)
				{
					IEnumerable<TypeInfo> source;
					try
					{
						source = Assembly.GetExecutingAssembly().DefinedTypes.ToList();
					}
					catch (ReflectionTypeLoadException ex)
					{
						source = from t in ex.Types
							where t != null
							select t.GetTypeInfo();
					}
					_plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t)));
				}
				return _plugin;
			}
		}

		private static void UpdatePlaceholderText(Localization localization, string key)
		{
			localizationLanguage.TryGetValue(localization, out string value);
			string text = loadedTexts[value][key];
			if (PlaceholderProcessors.TryGetValue(key, out Dictionary<string, Func<string>> value2))
			{
				text = value2.Aggregate(text, (string current, KeyValuePair<string, Func<string>> kv) => current.Replace("{" + kv.Key + "}", kv.Value()));
			}
			localization.AddWord(key, text);
		}

		public static void AddPlaceholder<T>(string key, string placeholder, ConfigEntry<T> config, Func<T, string>? convertConfigValue = null) where T : notnull
		{
			string key2 = key;
			string placeholder2 = placeholder;
			Func<T, string> convertConfigValue2 = convertConfigValue;
			ConfigEntry<T> config2 = config;
			if (convertConfigValue2 == null)
			{
				convertConfigValue2 = (T val) => val.ToString();
			}
			if (!PlaceholderProcessors.ContainsKey(key2))
			{
				PlaceholderProcessors[key2] = new Dictionary<string, Func<string>>();
			}
			config2.SettingChanged += delegate
			{
				UpdatePlaceholder();
			};
			if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage()))
			{
				UpdatePlaceholder();
			}
			void UpdatePlaceholder()
			{
				PlaceholderProcessors[key2][placeholder2] = () => convertConfigValue2(config2.Value);
				UpdatePlaceholderText(Localization.instance, key2);
			}
		}

		public static void AddText(string key, string text)
		{
			List<WeakReference<Localization>> list = new List<WeakReference<Localization>>();
			foreach (WeakReference<Localization> localizationObject in localizationObjects)
			{
				if (localizationObject.TryGetTarget(out var target))
				{
					Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)];
					if (!target.m_translations.ContainsKey(key))
					{
						dictionary[key] = text;
						target.AddWord(key, text);
					}
				}
				else
				{
					list.Add(localizationObject);
				}
			}
			foreach (WeakReference<Localization> item in list)
			{
				localizationObjects.Remove(item);
			}
		}

		public static void Load()
		{
			LoadLocalization(Localization.instance, Localization.instance.GetSelectedLanguage());
		}

		private static void LoadLocalization(Localization __instance, string language)
		{
			if (!localizationLanguage.Remove(__instance))
			{
				localizationObjects.Add(new WeakReference<Localization>(__instance));
			}
			localizationLanguage.Add(__instance, language);
			Dictionary<string, string> dictionary = new Dictionary<string, string>();
			foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories)
				where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0
				select f)
			{
				string text = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' })[1];
				if (dictionary.ContainsKey(text))
				{
					Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped."));
				}
				else
				{
					dictionary[text] = item;
				}
			}
			byte[] array = LoadTranslationFromAssembly("English");
			if (array == null)
			{
				throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json or translations/English.yml.");
			}
			Dictionary<string, string> dictionary2 = new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(Encoding.UTF8.GetString(array));
			if (dictionary2 == null)
			{
				throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty.");
			}
			string text2 = null;
			if (language != "English")
			{
				if (dictionary.ContainsKey(language))
				{
					text2 = File.ReadAllText(dictionary[language]);
				}
				else
				{
					byte[] array2 = LoadTranslationFromAssembly(language);
					if (array2 != null)
					{
						text2 = Encoding.UTF8.GetString(array2);
					}
				}
			}
			if (text2 == null && dictionary.ContainsKey("English"))
			{
				text2 = File.ReadAllText(dictionary["English"]);
			}
			if (text2 != null)
			{
				foreach (KeyValuePair<string, string> item2 in new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(text2) ?? new Dictionary<string, string>())
				{
					dictionary2[item2.Key] = item2.Value;
				}
			}
			loadedTexts[language] = dictionary2;
			foreach (KeyValuePair<string, string> item3 in dictionary2)
			{
				UpdatePlaceholderText(__instance, item3.Key);
			}
		}

		static Localizer()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>();
			loadedTexts = new Dictionary<string, Dictionary<string, string>>();
			localizationLanguage = new ConditionalWeakTable<Localization, string>();
			localizationObjects = new List<WeakReference<Localization>>();
			fileExtensions = new List<string> { ".json", ".yml" };
			Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager");
			val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		private static byte[]? LoadTranslationFromAssembly(string language)
		{
			foreach (string fileExtension in fileExtensions)
			{
				byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension);
				if (array != null)
				{
					return array;
				}
			}
			return null;
		}

		public static byte[]? ReadEmbeddedFileBytes(string resourceFileName, Assembly? containingAssembly = null)
		{
			string resourceFileName2 = resourceFileName;
			using MemoryStream memoryStream = new MemoryStream();
			if ((object)containingAssembly == null)
			{
				containingAssembly = Assembly.GetCallingAssembly();
			}
			string text = containingAssembly.GetManifestResourceNames().FirstOrDefault((string str) => str.EndsWith(resourceFileName2, StringComparison.Ordinal));
			if (text != null)
			{
				containingAssembly.GetManifestResourceStream(text)?.CopyTo(memoryStream);
			}
			return (memoryStream.Length == 0L) ? null : memoryStream.ToArray();
		}
	}
}
namespace LinejaeserasRace
{
	[BepInPlugin("Azathoth.LinejaeserasRace", "LinejaeserasRace", "1.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class LinejaeserasRacePlugin : BaseUnityPlugin
	{
		public enum Toggle
		{
			On = 1,
			Off = 0
		}

		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order;

			[UsedImplicitly]
			public bool? Browsable;

			[UsedImplicitly]
			public string? Category;

			[UsedImplicitly]
			public Action<ConfigEntryBase>? CustomDrawer;
		}

		internal const string ModName = "LinejaeserasRace";

		internal const string ModVersion = "1.0.1";

		internal const string Author = "Azathoth";

		private const string ModGUID = "Azathoth.LinejaeserasRace";

		private static string ConfigFileName = "Azathoth.LinejaeserasRace.cfg";

		private static string ConfigFileFullPath;

		internal static string ConnectionError;

		private readonly Harmony _harmony = new Harmony("Azathoth.LinejaeserasRace");

		public static readonly ManualLogSource LinejaeserasRaceLogger;

		private static readonly ConfigSync ConfigSync;

		private static ConfigEntry<Toggle> _serverConfigLocked;

		private static ConfigEntry<Toggle> _recipeIsActiveConfig;

		public void Awake()
		{
			Localizer.Load();
			_serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only.");
			ConfigSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked);
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			LNE_RacialSlot_AzuEPI.TryRegisterRacialSlot(LinejaeserasRaceLogger);
			LNE_RacialStatusEffects.Register();
			Item item = new Item("linejaeserasrace", "LNE_Orcovil");
			item.Name.English("Orcovil Potion");
			item.Description.English("Transform into an Orcovil.");
			ConfigEntry<Toggle> recipeIsActive = config("LNE_Orcovil", "IsRecipeEnabled", Toggle.On, "Enable recipe for Orcovil potion");
			item.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive;
			SharedData shared = item.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared.m_movementModifier = -0.15f;
			Item item2 = new Item("linejaeserasrace", "LNE_Orcovil1");
			item2.Name.English("Orcovil Potion v2");
			item2.Description.English("Transform into Orcovil version 2.");
			ConfigEntry<Toggle> recipeIsActive2 = config("LNE_Orcovil1", "IsRecipeEnabled", Toggle.On, "Enable recipe for Orcovil v2 potion");
			item2.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive2;
			SharedData shared2 = item2.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared2.m_movementModifier = -0.15f;
			Item item3 = new Item("linejaeserasrace", "LNE_Orcoverde");
			item3.Name.English("Green Orc Potion");
			item3.Description.English("Transform into a green orc.");
			ConfigEntry<Toggle> recipeIsActive3 = config("LNE_Orcoverde", "IsRecipeEnabled", Toggle.On, "Enable recipe for Green Orc potion");
			item3.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive3;
			SharedData shared3 = item3.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item4 = new Item("linejaeserasrace", "LNE_Orcoverdev2");
			item4.Name.English("Green Orc Potion v2");
			item4.Description.English("Transform into an enhanced green orc.");
			ConfigEntry<Toggle> recipeIsActive4 = config("LNE_Orcoverdev2", "IsRecipeEnabled", Toggle.On, "Enable recipe for Green Orc potion v2");
			item4.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive4;
			SharedData shared4 = item4.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item5 = new Item("linejaeserasrace", "LNE_OrcoUrukai");
			item5.Name.English("Urukai Potion");
			item5.Description.English("Transform into a Urukai warrior.");
			ConfigEntry<Toggle> recipeIsActive5 = config("LNE_OrcoUrukai", "IsRecipeEnabled", Toggle.On, "Enable recipe for Urukai potion");
			item5.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive5;
			SharedData shared5 = item5.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item6 = new Item("linejaeserasrace", "LNE_OrcoUrukaiv2");
			item6.Name.English("Urukai Potion v2");
			item6.Description.English("Transform into an elite Urukai.");
			ConfigEntry<Toggle> recipeIsActive6 = config("LNE_OrcoUrukaiv2", "IsRecipeEnabled", Toggle.On, "Enable recipe for Urukai v2 potion");
			item6.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive6;
			SharedData shared6 = item6.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item7 = new Item("linejaeserasrace", "LNE_Troll");
			item7.Name.English("Troll Potion");
			item7.Description.English("Transform into a troll.");
			ConfigEntry<Toggle> recipeIsActive7 = config("LNE_Troll", "IsRecipeEnabled", Toggle.On, "Enable recipe for Troll potion");
			item7.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive7;
			SharedData shared7 = item7.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item8 = new Item("linejaeserasrace", "LNE_potionelf");
			item8.Name.English("Elf Potion");
			item8.Description.English("Transform into an elf.");
			ConfigEntry<Toggle> recipeIsActive8 = config("LNE_potionelf", "IsRecipeEnabled", Toggle.On, "Enable recipe for Elf potion");
			item8.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive8;
			SharedData shared8 = item8.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared8.m_movementModifier = 0.08f;
			Item item9 = new Item("linejaeserasrace", "LNE_potionelf1");
			item9.Name.English("Elf Potion v2");
			item9.Description.English("Transform into an elf with unique traits.");
			ConfigEntry<Toggle> recipeIsActive9 = config("LNE_potionelf1", "IsRecipeEnabled", Toggle.On, "Enable recipe for Elf v2 potion");
			item9.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive9;
			SharedData shared9 = item9.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared9.m_movementModifier = 0.08f;
			Item item10 = new Item("linejaeserasrace", "LNE_potionelfv1");
			item10.Name.English("Elf Potion v1");
			item10.Description.English("Transform into an elf with classic elven traits.");
			ConfigEntry<Toggle> recipeIsActive10 = config("LNE_potionelfv1", "IsRecipeEnabled", Toggle.On, "Enable recipe for Elf potion v1");
			item10.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive10;
			SharedData shared10 = item10.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared10.m_movementModifier = 0.08f;
			Item item11 = new Item("linejaeserasrace", "LNE_potionelfv1f1");
			item11.Name.English("Elf Potion v1 (Variant)");
			item11.Description.English("Transform into an alternate elf variant.");
			ConfigEntry<Toggle> recipeIsActive11 = config("LNE_potionelfv1f1", "IsRecipeEnabled", Toggle.On, "Enable recipe for Elf potion v1 variant");
			item11.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive11;
			SharedData shared11 = item11.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared11.m_movementModifier = 0.08f;
			Item item12 = new Item("linejaeserasrace", "LNE_Enano");
			item12.Name.English("Dwarf Potion");
			item12.Description.English("Transform into a mighty dwarf.");
			ConfigEntry<Toggle> recipeIsActive12 = config("LNE_Enano", "IsRecipeEnabled", Toggle.On, "Enable recipe for Dwarf potion");
			item12.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive12;
			SharedData shared12 = item12.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item13 = new Item("linejaeserasrace", "LNE_Nomuerto");
			item13.Name.English("Undead Potion");
			item13.Description.English("Transform into an undead creature.");
			ConfigEntry<Toggle> recipeIsActive13 = config("LNE_Nomuerto", "IsRecipeEnabled", Toggle.On, "Enable recipe for Undead potion");
			item13.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive13;
			SharedData shared13 = item13.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item14 = new Item("linejaeserasrace", "LNE_potionelfodelbosqueoscuro");
			item14.Name.English("Nigth Elf Potion");
			item14.Description.English("Transform into a night elf.");
			ConfigEntry<Toggle> recipeIsActive14 = config("LNE_potionelfodelbosqueoscuro", "IsRecipeEnabled", Toggle.On, "Enable recipe for night Elf potion");
			item14.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive14;
			SharedData shared14 = item14.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared14.m_movementModifier = 0.1f;
			Item item15 = new Item("linejaeserasrace", "LNE_potionelfodelbosqueoscuro1");
			item15.Name.English("Nigth Elf Potion v1");
			item15.Description.English("Transform into a night elf variant.");
			ConfigEntry<Toggle> recipeIsActive15 = config("LNE_potionelfodelbosqueoscuro1", "IsRecipeEnabled", Toggle.On, "Enable recipe for night Elf potion v1");
			item15.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive15;
			SharedData shared15 = item15.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared15.m_movementModifier = 0.1f;
			Item item16 = new Item("linejaeserasrace", "LNE_potionelfodelbosqueoscurov1");
			item16.Name.English("Nigth Elf Potion V1");
			item16.Description.English("Transform into an alternate version of the night elf.");
			ConfigEntry<Toggle> recipeIsActive16 = config("LNE_potionelfodelbosqueoscurov1", "IsRecipeEnabled", Toggle.On, "Enable recipe for night Elf potion V1");
			item16.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive16;
			SharedData shared16 = item16.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared16.m_movementModifier = 0.1f;
			Item item17 = new Item("linejaeserasrace", "LNE_potionelfodelbosqueoscurov2");
			item17.Name.English("Nigth Elf Potion v2");
			item17.Description.English("Transform into a night elf.");
			ConfigEntry<Toggle> recipeIsActive17 = config("LNE_potionelfodelbosqueoscurov2", "IsRecipeEnabled", Toggle.On, "Enable recipe for night Elf potion v2");
			item17.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive17;
			SharedData shared17 = item17.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared17.m_movementModifier = 0.1f;
			Item item18 = new Item("linejaeserasrace", "LNE_potionelfnoche");
			item18.Name.English("Mystical Elf Potion");
			item18.Description.English("Transform into a mystical night elf.");
			ConfigEntry<Toggle> recipeIsActive18 = config("LNE_potionelfnoche", "IsRecipeEnabled", Toggle.On, "Enable recipe for Night Elf potion");
			item18.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive18;
			SharedData shared18 = item18.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item19 = new Item("linejaeserasrace", "LNE_potionelfdark");
			item19.Name.English("Dark Elf Potion");
			item19.Description.English("Transform into a dark elf.");
			ConfigEntry<Toggle> recipeIsActive19 = config("LNE_potionelfdark", "IsRecipeEnabled", Toggle.On, "Enable recipe for Dark Elf potion");
			item19.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive19;
			SharedData shared19 = item19.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared19.m_movementModifier = 0.12f;
			Item item20 = new Item("linejaeserasrace", "LNE_Tiefling");
			item20.Name.English("Tiefling Potion");
			item20.Description.English("Transform into a Tiefling, a being touched by infernal blood.");
			ConfigEntry<Toggle> recipeIsActive20 = config("LNE_Tiefling", "IsRecipeEnabled", Toggle.On, "Enable recipe for Tiefling transformation potion");
			item20.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive20;
			SharedData shared20 = item20.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item21 = new Item("linejaeserasrace", "LNE_Mirmidon");
			item21.Name.English("Myrmidon Potion");
			item21.Description.English("Transform into a Myrmidon warrior of ancient power.");
			ConfigEntry<Toggle> recipeIsActive21 = config("LNE_Mirmidon", "IsRecipeEnabled", Toggle.On, "Enable recipe for Myrmidon transformation potion");
			item21.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive21;
			SharedData shared21 = item21.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item22 = new Item("linejaeserasrace", "LNE_Muspelheim");
			item22.Name.English("Muspelheim Potion");
			item22.Description.English("Transform into a blazing warrior of Muspelheim.");
			ConfigEntry<Toggle> recipeIsActive22 = config("LNE_Muspelheim_Config", "IsRecipeEnabled", Toggle.On, "Enable recipe for Muspelheim transformation potion");
			item22.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive22;
			SharedData shared22 = item22.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared22.m_movementModifier = -0.2f;
			Item item23 = new Item("linejaeserasrace", "LNE_Niflborn");
			item23.Name.English("Niflborn Potion");
			item23.Description.English("Transform into a Niflborn, a being shaped by the frozen essence of Niflheim.");
			ConfigEntry<Toggle> recipeIsActive23 = config("LNE_Niflborn", "IsRecipeEnabled", Toggle.On, "Enable recipe for Niflborn transformation potion");
			item23.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive23;
			SharedData shared23 = item23.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared23.m_movementModifier = -0.2f;
			Item item24 = new Item("linejaeserasrace", "LNE_Jotun");
			item24.Name.English("Jotun Potion");
			item24.Description.English("Transform into a mighty Jotun of ancient frost and stone.");
			ConfigEntry<Toggle> recipeIsActive24 = config("LNE_Jotun", "IsRecipeEnabled", Toggle.On, "Enable recipe for Jotun transformation potion");
			item24.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive24;
			SharedData shared24 = item24.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared24.m_movementModifier = -0.25f;
			Item item25 = new Item("linejaeserasrace", "LNE_Draenei");
			item25.Name.English("Draenei Potion");
			item25.Description.English("Transform into a Draenei, infused with ancient arcane power.");
			ConfigEntry<Toggle> recipeIsActive25 = config("LNE_Draenei", "IsRecipeEnabled", Toggle.On, "Enable recipe for Draenei transformation potion");
			item25.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive25;
			SharedData shared25 = item25.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Item item26 = new Item("linejaeserasrace", "LNE_Goblin");
			item26.Name.English("Goblin Potion");
			item26.Description.English("Transform into a Goblin, fueled by cunning and feral speed.");
			ConfigEntry<Toggle> recipeIsActive26 = config("LNE_Goblin", "IsRecipeEnabled", Toggle.On, "Enable recipe for Goblin transformation potion");
			item26.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive26;
			SharedData shared26 = item26.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared19.m_movementModifier = 0.12f;
			Item item27 = new Item("linejaeserasrace", "LNE_Human");
			item27.Name.English("Human Potion");
			item27.Name.Spanish("Poción Humano");
			item27.Description.English("Transform into a Human, balanced in strength, discipline, and adaptability.");
			item27.Description.Spanish("Transfórmate en Humano, equilibrado en fuerza, disciplina y adaptabilidad.");
			ConfigEntry<Toggle> recipeIsActive27 = config("LNE_Human", "IsRecipeEnabled", Toggle.On, "Enable recipe for Human transformation potion");
			item27.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive27;
			SharedData shared27 = item27.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			_harmony.PatchAll(executingAssembly);
			SetupWatcher();
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Config.Save();
		}

		private void SetupWatcher()
		{
			FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
			fileSystemWatcher.Changed += ReadConfigValues;
			fileSystemWatcher.Created += ReadConfigValues;
			fileSystemWatcher.Renamed += ReadConfigValues;
			fileSystemWatcher.IncludeSubdirectories = true;
			fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher.EnableRaisingEvents = true;
		}

		private void ReadConfigValues(object sender, FileSystemEventArgs e)
		{
			if (!File.Exists(ConfigFileFullPath))
			{
				return;
			}
			try
			{
				LinejaeserasRaceLogger.LogDebug((object)"ReadConfigValues called");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				LinejaeserasRaceLogger.LogError((object)("There was an issue loading your " + ConfigFileName));
				LinejaeserasRaceLogger.LogError((object)"Please check your config entries for spelling and format!");
			}
		}

		private ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags);
			ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val);
			SyncedConfigEntry<T> syncedConfigEntry = ConfigSync.AddConfigEntry<T>(val2);
			syncedConfigEntry.SynchronizedConfig = synchronizedSetting;
			return val2;
		}

		private ConfigEntry<T> config<T>(string group, string name, T value, string description, bool synchronizedSetting = true)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting);
		}

		static LinejaeserasRacePlugin()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
			ConnectionError = "";
			LinejaeserasRaceLogger = Logger.CreateLogSource("LinejaeserasRace");
			ConfigSync = new ConfigSync("Azathoth.LinejaeserasRace")
			{
				DisplayName = "LinejaeserasRace",
				CurrentVersion = "1.0.1",
				MinimumRequiredVersion = "1.0.1"
			};
			_serverConfigLocked = null;
			_recipeIsActiveConfig = null;
		}
	}
	public static class KeyboardExtensions
	{
		public static bool IsKeyDown(this KeyboardShortcut shortcut)
		{
			//IL_0003: 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 (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey);
		}

		public static bool IsKeyHeld(this KeyboardShortcut shortcut)
		{
			//IL_0003: 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 (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey);
		}
	}
	[HarmonyPatch(typeof(ZNet), "OnNewConnection")]
	public static class RegisterAndCheckVersion
	{
		private static void Prefix(ZNetPeer peer, ref ZNet __instance)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogDebug((object)"Registering version RPC handler");
			peer.m_rpc.Register<ZPackage>("LinejaeserasRace_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_LinejaeserasRace_Version);
			LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogInfo((object)"Invoking version check");
			ZPackage val = new ZPackage();
			val.Write("1.0.1");
			peer.m_rpc.Invoke("LinejaeserasRace_VersionCheck", new object[1] { val });
		}
	}
	[HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")]
	public static class VerifyClient
	{
		private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance)
		{
			if (!__instance.IsServer() || RpcHandlers.ValidatedPeers.Contains(rpc))
			{
				return true;
			}
			LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") never sent version or couldn't due to previous disconnect, disconnecting"));
			rpc.Invoke("Error", new object[1] { 3 });
			return false;
		}

		private static void Postfix(ZNet __instance)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "LinejaeserasRaceRequestAdminSync", new object[1] { (object)new ZPackage() });
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "ShowConnectError")]
	public class ShowConnectionError
	{
		private static void Postfix(FejdStartup __instance)
		{
			if (__instance.m_connectionFailedPanel.activeSelf)
			{
				__instance.m_connectionFailedError.fontSizeMax = 25f;
				__instance.m_connectionFailedError.fontSizeMin = 15f;
				TMP_Text connectionFailedError = __instance.m_connectionFailedError;
				connectionFailedError.text = connectionFailedError.text + "\n" + LinejaeserasRacePlugin.ConnectionError;
			}
		}
	}
	[HarmonyPatch(typeof(ZNet), "Disconnect")]
	public static class RemoveDisconnectedPeerFromVerified
	{
		private static void Prefix(ZNetPeer peer, ref ZNet __instance)
		{
			if (__instance.IsServer())
			{
				LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogInfo((object)("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list"));
				RpcHandlers.ValidatedPeers.Remove(peer.m_rpc);
			}
		}
	}
	public static class RpcHandlers
	{
		public static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>();

		public static void RPC_LinejaeserasRace_Version(ZRpc rpc, ZPackage pkg)
		{
			string text = pkg.ReadString();
			LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogInfo((object)("Version check, local: 1.0.1,  remote: " + text));
			if (text != "1.0.1")
			{
				LinejaeserasRacePlugin.ConnectionError = "LinejaeserasRace Installed: 1.0.1\n Needed: " + text;
				if (ZNet.instance.IsServer())
				{
					LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting..."));
					rpc.Invoke("Error", new object[1] { 3 });
				}
			}
			else if (!ZNet.instance.IsServer())
			{
				LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogInfo((object)"Received same version from server!");
			}
			else
			{
				LinejaeserasRacePlugin.LinejaeserasRaceLogger.LogInfo((object)("Adding peer (" + rpc.m_socket.GetHostName() + ") to validated list"));
				ValidatedPeers.Add(rpc);
			}
		}

		public static string ComputeHashForMod()
		{
			using SHA256 sHA = SHA256.Create();
			byte[] array = sHA.ComputeHash(File.ReadAllBytes(Assembly.GetExecutingAssembly().Location));
			StringBuilder stringBuilder = new StringBuilder();
			byte[] array2 = array;
			foreach (byte b in array2)
			{
				stringBuilder.Append(b.ToString("X2"));
			}
			return stringBuilder.ToString();
		}
	}
}
namespace LinejaeserasRace.Systems
{
	public static class LinejaeserasRaceHandler
	{
		[HarmonyPatch(typeof(Humanoid), "EquipItem")]
		private static class EquipPatch
		{
			private static void Postfix(Humanoid __instance, ItemData item)
			{
				Player val = (Player)(object)((__instance is Player) ? __instance : null);
				if (val != null && item != null && item.m_equipped && LNE_RacialItems.IsRacial(item))
				{
					RecalculateAndWriteScale(val);
				}
			}
		}

		[HarmonyPatch(typeof(Humanoid), "UnequipItem")]
		private static class UnequipPatch
		{
			private static void Postfix(Humanoid __instance, ItemData item)
			{
				Player val = (Player)(object)((__instance is Player) ? __instance : null);
				if (val != null && item != null && LNE_RacialItems.IsRacial(item))
				{
					RecalculateAndWriteScale(val);
				}
			}
		}

		[HarmonyPatch(typeof(Player), "OnSpawned")]
		private static class PlayerOnSpawnedPatch
		{
			private static void Postfix(Player __instance)
			{
				if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer))
				{
					RecalculateAndWriteScale(__instance);
				}
			}
		}

		[HarmonyPatch(typeof(Player), "Update")]
		private static class PlayerUpdatePatch
		{
			private static void Postfix(Player __instance)
			{
				if (!((Object)(object)__instance == (Object)null))
				{
					ApplyScaleFromZdo(__instance);
				}
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		private static class LNE_PlayerScaleSupport
		{
			private static readonly int PlayerHash = StringExtensionMethods.GetStableHashCode("Player");

			[HarmonyPriority(0)]
			private static void Postfix(ZNetScene __instance)
			{
				if (!((Object)(object)__instance == (Object)null) && __instance.m_namedPrefabs.TryGetValue(PlayerHash, out var value))
				{
					ZNetView component = value.GetComponent<ZNetView>();
					if ((Object)(object)component != (Object)null)
					{
						component.m_syncInitialScale = true;
					}
				}
			}
		}

		private const string DwarfRacePrefab = "LNE_Enano";

		private const string OrcVilPrefab = "LNE_Orcovil";

		private const string OrcVil1Prefab = "LNE_Orcovil1";

		private const string OrcVerdePrefab = "LNE_Orcoverde";

		private const string OrcVerdeV2Prefab = "LNE_Orcoverdev2";

		private const string OrcUrukaiPrefab = "LNE_OrcoUrukai";

		private const string OrcUrukaiV2Prefab = "LNE_OrcoUrukaiv2";

		private const string MuspelheimPrefab = "LNE_Muspelheim";

		private const string JotunPrefab = "LNE_Jotun";

		private const string NiflbornPrefab = "LNE_Niflborn";

		private const string HighElf1 = "LNE_potionelf";

		private const string HighElf2 = "LNE_potionelf1";

		private const string HighElf3 = "LNE_potionelfv1";

		private const string HighElf4 = "LNE_potionelfv1f1";

		private const string TallElf1 = "LNE_potionelfodelbosqueoscuro";

		private const string TallElf2 = "LNE_potionelfodelbosqueoscurov1";

		private const string TallElf3 = "LNE_potionelfodelbosqueoscurov2";

		private const string TallElf4 = "LNE_potionelfnoche";

		private const string TallElf5 = "LNE_potionelfdark";

		private const string DraeneiPrefab = "LNE_Draenei";

		private const string TieflingPrefab = "LNE_Tiefling";

		private const string MirmidonPrefab = "LNE_Mirmidon";

		private const string TrollPrefab = "LNE_Troll";

		private const string NoMuertoPrefab = "LNE_Nomuerto";

		private const string GoblinPrefab = "LNE_Goblin";

		private const float DefaultScale = 1f;

		private const float DwarfScale = 0.8f;

		private const float HighElfScale = 1.02f;

		private const float TallElfScale = 1.04f;

		private const float OrcScale = 1.06f;

		private const float DraeneiScale = 1.07f;

		private const float TieflingScale = 1.07f;

		private const float MirmidonScale = 1.07f;

		private const float TrollScale = 1.09f;

		private const float NoMuertoScale = 1.01f;

		private const float GoblinScale = 0.75f;

		private const float MuspelheimScale = 1.37f;

		private const float JotunScale = 1.5f;

		private const float NiflbornScale = 1.37f;

		private static readonly int ZdoScaleHash = StringExtensionMethods.GetStableHashCode("LNE_RaceScaleAbs");

		private static void RecalculateAndWriteScale(Player player)
		{
			if (!((Object)(object)player == (Object)null) && !((Object)(object)((Character)player).m_nview == (Object)null) && ((Character)player).m_nview.IsValid() && !((Object)(object)Player.m_localPlayer != (Object)(object)player))
			{
				float num = ComputeScaleFromInventory(player);
				ZDO zDO = ((Character)player).m_nview.GetZDO();
				if (zDO != null)
				{
					zDO.Set(ZdoScaleHash, num);
					ApplyScale(player, num);
				}
			}
		}

		private static void ApplyScaleFromZdo(Player player)
		{
			if (!((Object)(object)player == (Object)null) && !((Object)(object)((Character)player).m_nview == (Object)null) && ((Character)player).m_nview.IsValid())
			{
				ZDO zDO = ((Character)player).m_nview.GetZDO();
				if (zDO != null)
				{
					float @float = zDO.GetFloat(ZdoScaleHash, 1f);
					ApplyScale(player, @float);
				}
			}
		}

		private static void ApplyScale(Player player, float scale)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(scale, scale, scale);
			if (!(((Component)player).transform.localScale == val))
			{
				((Component)player).transform.localScale = val;
			}
		}

		private static float ComputeScaleFromInventory(Player player)
		{
			Inventory inventory = ((Humanoid)player).GetInventory();
			if (inventory == null)
			{
				return 1f;
			}
			bool flag = false;
			bool flag2 = false;
			string text = null;
			bool flag3 = false;
			bool flag4 = false;
			bool flag5 = false;
			bool flag6 = false;
			bool flag7 = false;
			bool flag8 = false;
			bool flag9 = false;
			bool flag10 = false;
			bool flag11 = false;
			foreach (ItemData allItem in inventory.GetAllItems())
			{
				if (!allItem.m_equipped || !Object.op_Implicit((Object)(object)allItem.m_dropPrefab))
				{
					continue;
				}
				string name = ((Object)allItem.m_dropPrefab).name;
				if (name == "LNE_Enano")
				{
					flag = true;
					continue;
				}
				if (IsGiantRace(name))
				{
					flag2 = true;
					if (text == null)
					{
						text = name;
					}
					continue;
				}
				if (name == "LNE_Troll")
				{
					flag3 = true;
					continue;
				}
				if (IsOrcRace(name))
				{
					flag4 = true;
					continue;
				}
				switch (name)
				{
				case "LNE_Draenei":
					flag5 = true;
					continue;
				case "LNE_Tiefling":
					flag6 = true;
					continue;
				case "LNE_Mirmidon":
					flag7 = true;
					continue;
				}
				if (IsTallElfRace(name))
				{
					flag8 = true;
				}
				else if (IsHighElfRace(name))
				{
					flag9 = true;
				}
				else if (name == "LNE_Nomuerto")
				{
					flag10 = true;
				}
				else if (name == "LNE_Goblin")
				{
					flag11 = true;
				}
			}
			if (flag)
			{
				return 0.8f;
			}
			if (flag2)
			{
				return text switch
				{
					"LNE_Jotun" => 1.5f, 
					"LNE_Muspelheim" => 1.37f, 
					"LNE_Niflborn" => 1.37f, 
					_ => 1.37f, 
				};
			}
			if (flag3)
			{
				return 1.09f;
			}
			if (flag4)
			{
				return 1.06f;
			}
			if (flag5)
			{
				return 1.07f;
			}
			if (flag6)
			{
				return 1.07f;
			}
			if (flag7)
			{
				return 1.07f;
			}
			if (flag8)
			{
				return 1.04f;
			}
			if (flag9)
			{
				return 1.02f;
			}
			if (flag10)
			{
				return 1.01f;
			}
			if (flag11)
			{
				return 0.75f;
			}
			return 1f;
		}

		private static bool IsOrcRace(string race)
		{
			int result;
			switch (race)
			{
			default:
				result = ((race == "LNE_OrcoUrukaiv2") ? 1 : 0);
				break;
			case "LNE_Orcovil":
			case "LNE_Orcovil1":
			case "LNE_Orcoverde":
			case "LNE_Orcoverdev2":
			case "LNE_OrcoUrukai":
				result = 1;
				break;
			}
			return (byte)result != 0;
		}

		private static bool IsGiantRace(string race)
		{
			return race == "LNE_Muspelheim" || race == "LNE_Jotun" || race == "LNE_Niflborn";
		}

		private static bool IsHighElfRace(string race)
		{
			int result;
			switch (race)
			{
			default:
				result = ((race == "LNE_potionelfv1f1") ? 1 : 0);
				break;
			case "LNE_potionelf":
			case "LNE_potionelf1":
			case "LNE_potionelfv1":
				result = 1;
				break;
			}
			return (byte)result != 0;
		}

		private static bool IsTallElfRace(string race)
		{
			int result;
			switch (race)
			{
			default:
				result = ((race == "LNE_potionelfdark") ? 1 : 0);
				break;
			case "LNE_potionelfodelbosqueoscuro":
			case "LNE_potionelfodelbosqueoscurov1":
			case "LNE_potionelfodelbosqueoscurov2":
			case "LNE_potionelfnoche":
				result = 1;
				break;
			}
			return (byte)result != 0;
		}
	}
	[HarmonyPatch(typeof(Player), "QueueEquipAction")]
	public static class LNE_BlockMultipleRaces
	{
		private static bool Prefix(Player __instance, ItemData item)
		{
			ItemData item2 = item;
			if (item2 == null)
			{
				return true;
			}
			if (!LNE_RacialItems.IsRacial(item2))
			{
				return true;
			}
			if (((Humanoid)__instance).GetInventory().GetAllItems().Any((ItemData i) => i.m_equipped && i != item2 && LNE_RacialItems.IsRacial(i)))
			{
				((Character)__instance).Message((MessageType)2, "You can only equip one racial item at a time.", 0, (Sprite)null);
				return false;
			}
			return true;
		}
	}
	public static class LNE_RacialItems
	{
		public static readonly HashSet<string> RacialPrefabs = new HashSet<string>
		{
			"LNE_Orcovil", "LNE_Orcovil1", "LNE_Orcoverde", "LNE_Orcoverdev2", "LNE_OrcoUrukai", "LNE_OrcoUrukaiv2", "LNE_Troll", "LNE_potionelf", "LNE_potionelf1", "LNE_potionelfv1",
			"LNE_potionelfv1f1", "LNE_potionelfodelbosqueoscuro1", "LNE_potionelfodelbosqueoscurov2", "LNE_Enano", "LNE_potionelfodelbosqueoscuro", "LNE_potionelfodelbosqueoscurov1", "LNE_potionelfnoche", "LNE_potionelfdark", "LNE_Mirmidon", "LNE_Nomuerto",
			"LNE_Tiefling", "LNE_Muspelheim", "LNE_Niflborn", "LNE_Jotun", "LNE_Draenei", "LNE_Goblin", "LNE_Human"
		};

		public static bool IsRacial(ItemData? item)
		{
			return Object.op_Implicit((Object)(object)item?.m_dropPrefab) && RacialPrefabs.Contains(((Object)item.m_dropPrefab).name);
		}
	}
	[HarmonyPatch]
	internal static class LNE_RacialLifestealFromStatusEffects
	{
		[HarmonyPatch(typeof(Character), "ApplyDamage")]
		private static class Character_ApplyDamage_Lifesteal
		{
			private static void Postfix(Character __instance, HitData hit)
			{
				if (hit == null)
				{
					return;
				}
				Character attacker = hit.GetAttacker();
				Player val = (Player)(object)((attacker is Player) ? attacker : null);
				if ((Object)(object)val == (Object)null || (Object)(object)val != (Object)(object)Player.m_localPlayer)
				{
					return;
				}
				float totalDamage = hit.GetTotalDamage();
				if (totalDamage <= 0f)
				{
					return;
				}
				float num = 0f;
				float num2 = 0f;
				foreach (LNE_RacialStatusConfig.StatConfig item in LNE_RacialStatusConfig.GetConfigsFor(val))
				{
					if (!(item.LifeStealChancePercent <= 0f) && !(item.LifeStealPercentOfDamage <= 0f) && item.LifeStealChancePercent > num)
					{
						num = item.LifeStealChancePercent;
						num2 = item.LifeStealPercentOfDamage;
					}
				}
				if (num <= 0f || num2 <= 0f)
				{
					return;
				}
				float num3 = Random.Range(0f, 100f);
				if (!(num3 > num))
				{
					float num4 = totalDamage * (num2 / 100f);
					if (!(num4 <= 0f))
					{
						((Character)val).Heal(num4, true);
					}
				}
			}
		}
	}
	internal static class LNE_RacialSkillBonuses
	{
		internal class SkillBonus
		{
			public SkillType Skill;

			public float Bonus;
		}

		[CompilerGenerated]
		private sealed class <GetBonusesFor>d__2 : IEnumerable<SkillBonus>, IEnumerable, IEnumerator<SkillBonus>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private SkillBonus <>2__current;

			private int <>l__initialThreadId;

			private StatusEffect se;

			public StatusEffect <>3__se;

			private string <name>5__1;

			private List<SkillBonus> <list>5__2;

			private List<SkillBonus>.Enumerator <>s__3;

			private SkillBonus <bonus>5__4;

			SkillBonus IEnumerator<SkillBonus>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetBonusesFor>d__2(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<name>5__1 = null;
				<list>5__2 = null;
				<>s__3 = default(List<SkillBonus>.Enumerator);
				<bonus>5__4 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				try
				{
					int num = <>1__state;
					if (num != 0)
					{
						if (num != 1)
						{
							return false;
						}
						<>1__state = -3;
						goto IL_0134;
					}
					<>1__state = -1;
					if ((Object)(object)se == (Object)null)
					{
						return false;
					}
					<name>5__1 = ((Object)se).name;
					if (string.IsNullOrEmpty(<name>5__1))
					{
						return false;
					}
					if (<name>5__1.EndsWith("(Clone)", StringComparison.Ordinal))
					{
						<name>5__1 = <name>5__1.Substring(0, <name>5__1.Length - "(Clone)".Length);
					}
					if (!SkillConfig.TryGetValue(<name>5__1, out <list>5__2) || <list>5__2 == null)
					{
						return false;
					}
					<>s__3 = <list>5__2.GetEnumerator();
					<>1__state = -3;
					goto IL_013c;
					IL_013c:
					if (<>s__3.MoveNext())
					{
						<bonus>5__4 = <>s__3.Current;
						if (<bonus>5__4 != null)
						{
							<>2__current = <bonus>5__4;
							<>1__state = 1;
							return true;
						}
						goto IL_0134;
					}
					<>m__Finally1();
					<>s__3 = default(List<SkillBonus>.Enumerator);
					return false;
					IL_0134:
					<bonus>5__4 = null;
					goto IL_013c;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				((IDisposable)<>s__3).Dispose();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<SkillBonus> IEnumerable<SkillBonus>.GetEnumerator()
			{
				<GetBonusesFor>d__2 <GetBonusesFor>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetBonusesFor>d__ = this;
				}
				else
				{
					<GetBonusesFor>d__ = new <GetBonusesFor>d__2(0);
				}
				<GetBonusesFor>d__.se = <>3__se;
				return <GetBonusesFor>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<SkillBonus>)this).GetEnumerator();
			}
		}

		internal static readonly Dictionary<string, List<SkillBonus>> SkillConfig = new Dictionary<string, List<SkillBonus>>(StringComparer.OrdinalIgnoreCase)
		{
			["LNE_SE_OrcGreenPower"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)110,
					Bonus = 10f
				}
			},
			["LNE_SE_OrcGreenPower1"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)110,
					Bonus = 10f
				}
			},
			["LNE_SE_OrcBlackPower"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)13,
					Bonus = 15f
				}
			},
			["LNE_SE_OrcBlackPower1"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)13,
					Bonus = 15f
				}
			},
			["LNE_SE_Troll"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)105,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)5,
					Bonus = 10f
				}
			},
			["LNE_SE_Dwarf"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)107,
					Bonus = 15f
				}
			},
			["LNE_HighElf"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)9,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				}
			},
			["LNE_HighElf1"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)9,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				}
			},
			["LNE_HighElf2"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)9,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				}
			},
			["LNE_HighElf3"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)9,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				}
			},
			["LNE_SE_NightElf"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)101,
					Bonus = 20f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)100,
					Bonus = 10f
				}
			},
			["LNE_SE_NightElf1"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)101,
					Bonus = 20f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)100,
					Bonus = 10f
				}
			},
			["LNE_SE_NightElf2"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)101,
					Bonus = 20f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)100,
					Bonus = 10f
				}
			},
			["LNE_SE_NightElf3"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)101,
					Bonus = 20f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)100,
					Bonus = 10f
				}
			},
			["LNE_SE_DarkElf"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)10,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)101,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 10f
				}
			},
			["LNE_SE_Jotun"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)12,
					Bonus = 20f
				}
			},
			["LNE_SE_Myrmidon"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)103,
					Bonus = 50f
				},
				new SkillBonus
				{
					Skill = (SkillType)104,
					Bonus = 25f
				}
			},
			["LNE_SE_Goblin"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)14,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)104,
					Bonus = 25f
				},
				new SkillBonus
				{
					Skill = (SkillType)100,
					Bonus = 15f
				},
				new SkillBonus
				{
					Skill = (SkillType)108,
					Bonus = 20f
				}
			},
			["LNE_SE_Human"] = new List<SkillBonus>
			{
				new SkillBonus
				{
					Skill = (SkillType)5,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)6,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)14,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)105,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)106,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)107,
					Bonus = 10f
				},
				new SkillBonus
				{
					Skill = (SkillType)110,
					Bonus = 10f
				}
			}
		};

		[IteratorStateMachine(typeof(<GetBonusesFor>d__2))]
		internal static IEnumerable<SkillBonus> GetBonusesFor(StatusEffect se)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetBonusesFor>d__2(-2)
			{
				<>3__se = se
			};
		}
	}
	[HarmonyPatch]
	internal static class LNE_RacialSkillBonusesPatches
	{
		[HarmonyPatch(typeof(SEMan), "ModifySkillLevel")]
		private static class SEMan_ModifySkillLevel_Patch
		{
			private static void Postfix(SEMan __instance, SkillType skill, ref float level)
			{
				//IL_0099: Unknown result type (might be due to invalid IL or missing references)
				//IL_009e: Unknown result type (might be due to invalid IL or missing references)
				if (__instance == null)
				{
					return;
				}
				Character character = __instance.m_character;
				if ((Object)(object)character == (Object)null || !character.IsPlayer())
				{
					return;
				}
				Player val = (Player)(object)((character is Player) ? character : null);
				if ((Object)(object)val == (Object)null)
				{
					return;
				}
				foreach (StatusEffect statusEffect in __instance.GetStatusEffects())
				{
					if ((Object)(object)statusEffect == (Object)null)
					{
						continue;
					}
					foreach (LNE_RacialSkillBonuses.SkillBonus item in LNE_RacialSkillBonuses.GetBonusesFor(statusEffect))
					{
						if (item.Skill == skill)
						{
							level += item.Bonus;
						}
					}
				}
			}
		}
	}
	public static class LNE_RacialSlot_AzuEPI
	{
		private static bool _initialized;

		public static void TryRegisterRacialSlot(ManualLogSource log)
		{
			if (!_initialized)
			{
				_initialized = true;
				if (!API.IsLoaded())
				{
					log.LogInfo((object)"[LNE] AzuEPI no detectado → ítems raciales usan Utility vanilla");
				}
				else if (API.AddSlot("Racial", GetEquippedRacialItem, LNE_RacialItems.IsRacial))
				{
					log.LogInfo((object)"[LNE] Slot 'Racial' agregado correctamente (AzuEPI)");
				}
				else
				{
					log.LogWarning((object)"[LNE] No se pudo agregar slot 'Racial' (¿ya existe?)");
				}
			}
		}

		private static ItemData? GetEquippedRacialItem(Player player)
		{
			return ((IEnumerable<ItemData>)((Humanoid)player).GetInventory().GetEquippedItems()).FirstOrDefault((Func<ItemData, bool>)LNE_RacialItems.IsRacial);
		}
	}
	internal static class LNE_RacialStatusConfig
	{
		internal class StatConfig
		{
			public float BonusHealth;

			public float BonusStamina;

			public float BonusEitr;

			public float LifeStealChancePercent;

			public float LifeStealPercentOfDamage;

			public float PeriodicHealPercent;

			public float PeriodicHealInterval;

			public float PeriodicStaminaPercent;

			public float PeriodicStaminaInterval;

			public float BonusHealthRegen;

			public float BonusStaminaRegen;

			public float BonusEitrRegen;

			public float PeriodicEitrPercent;

			public float PeriodicEitrInterval;
		}

		[CompilerGenerated]
		private sealed class <GetConfigsFor>d__2 : IEnumerable<StatConfig>, IEnumerable, IEnumerator<StatConfig>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private StatConfig <>2__current;

			private int <>l__initialThreadId;

			private Player player;

			public Player <>3__player;

			private SEMan <seMan>5__1;

			private List<StatusEffect>.Enumerator <>s__2;

			private StatusEffect <se>5__3;

			private string <name>5__4;

			private StatConfig <config>5__5;

			StatConfig IEnumerator<StatConfig>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetConfigsFor>d__2(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<seMan>5__1 = null;
				<>s__2 = default(List<StatusEffect>.Enumerator);
				<se>5__3 = null;
				<name>5__4 = null;
				<config>5__5 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				try
				{
					int num = <>1__state;
					if (num != 0)
					{
						if (num != 1)
						{
							return false;
						}
						<>1__state = -3;
						goto IL_0154;
					}
					<>1__state = -1;
					if (!Object.op_Implicit((Object)(object)player))
					{
						return false;
					}
					<seMan>5__1 = ((Character)player).GetSEMan();
					if (<seMan>5__1 == null)
					{
						return false;
					}
					<>s__2 = <seMan>5__1.GetStatusEffects().GetEnumerator();
					<>1__state = -3;
					goto IL_016a;
					IL_0154:
					<name>5__4 = null;
					<config>5__5 = null;
					<se>5__3 = null;
					goto IL_016a;
					IL_016a:
					while (true)
					{
						if (<>s__2.MoveNext())
						{
							<se>5__3 = <>s__2.Current;
							if (!((Object)(object)<se>5__3 == (Object)null))
							{
								<name>5__4 = ((Object)<se>5__3).name;
								if (!string.IsNullOrEmpty(<name>5__4))
								{
									break;
								}
							}
							continue;
						}
						<>m__Finally1();
						<>s__2 = default(List<StatusEffect>.Enumerator);
						return false;
					}
					if (<name>5__4.EndsWith("(Clone)", StringComparison.Ordinal))
					{
						<name>5__4 = <name>5__4.Substring(0, <name>5__4.Length - "(Clone)".Length);
					}
					if (StatusConfigs.TryGetValue(<name>5__4, out <config>5__5))
					{
						<>2__current = <config>5__5;
						<>1__state = 1;
						return true;
					}
					goto IL_0154;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				((IDisposable)<>s__2).Dispose();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<StatConfig> IEnumerable<StatConfig>.GetEnumerator()
			{
				<GetConfigsFor>d__2 <GetConfigsFor>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetConfigsFor>d__ = this;
				}
				else
				{
					<GetConfigsFor>d__ = new <GetConfigsFor>d__2(0);
				}
				<GetConfigsFor>d__.player = <>3__player;
				return <GetConfigsFor>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<StatConfig>)this).GetEnumerator();
			}
		}

		internal static readonly Dictionary<string, StatConfig> StatusConfigs = new Dictionary<string, StatConfig>(StringComparer.OrdinalIgnoreCase)
		{
			["LNE_SE_OrcovilPower"] = new StatConfig
			{
				BonusHealth = 15f,
				BonusStamina = 0f,
				BonusEitr = 30f,
				LifeStealChancePercent = 50f,
				LifeStealPercentOfDamage = 20f,
				BonusEitrRegen = 2f
			},
			["LNE_SE_OrcovilPower1"] = new StatConfig
			{
				BonusHealth = 15f,
				BonusStamina = 0f,
				BonusEitr = 30f,
				LifeStealChancePercent = 50f,
				LifeStealPercentOfDamage = 20f,
				BonusEitrRegen = 2f
			},
			["LNE_SE_OrcGreenPower"] = new StatConfig
			{
				BonusHealth = 15f,
				BonusStamina = 20f
			},
			["LNE_SE_OrcGreenPower1"] = new StatConfig
			{
				BonusHealth = 15f,
				BonusStamina = 20f
			},
			["LNE_SE_OrcBlackPower"] = new StatConfig
			{
				BonusHealth = 35f
			},
			["LNE_SE_OrcBlackPower1"] = new StatConfig
			{
				BonusHealth = 35f
			},
			["LNE_SE_Troll"] = new StatConfig
			{
				BonusHealth = 10f,
				BonusStamina = 15f,
				BonusHealthRegen = 5f
			},
			["LNE_SE_Dwarf"] = new StatConfig
			{
				BonusHealth = 25f
			},
			["LNE_HighElf"] = new StatConfig
			{
				BonusHealth = -5f,
				BonusEitr = 30f,
				BonusEitrRegen = 2.5f
			},
			["LNE_HighElf1"] = new StatConfig
			{
				BonusHealth = -5f,
				BonusEitr = 30f,
				BonusEitrRegen = 2.5f
			},
			["LNE_HighElf2"] = new StatConfig
			{
				BonusHealth = -5f,
				BonusEitr = 30f,
				BonusEitrRegen = 2.5f
			},
			["LNE_HighElf3"] = new StatConfig
			{
				BonusHealth = -5f,
				BonusEitr = 30f,
				BonusEitrRegen = 2.5f
			},
			["LNE_SE_NightElf"] = new StatConfig
			{
				BonusStamina = 20f,
				BonusStaminaRegen = 2.5f
			},
			["LNE_SE_NightElf1"] = new StatConfig
			{
				BonusStamina = 20f,
				BonusStaminaRegen = 2.5f
			},
			["LNE_SE_NightElf2"] = new StatConfig
			{
				BonusStamina = 20f,
				BonusStaminaRegen = 2.5f
			},
			["LNE_SE_NightElf3"] = new StatConfig
			{
				BonusStamina = 20f,
				BonusStaminaRegen = 2.5f
			},
			["LNE_SE_DarkElf"] = new StatConfig
			{
				BonusEitr = 15f,
				BonusEitrRegen = 2.5f,
				LifeStealChancePercent = 30f,
				LifeStealPercentOfDamage = 10f
			},
			["LNE_SE_Jotun"] = new StatConfig
			{
				BonusHealth = 100f,
				BonusStamina = -20f,
				BonusHealthRegen = 5f
			},
			["LNE_SE_Niflborn"] = new StatConfig
			{
				BonusHealth = 70f,
				BonusHealthRegen = 3f
			},
			["LNE_SE_Muspelheim"] = new StatConfig
			{
				BonusHealth = 70f,
				BonusHealthRegen = 3f
			},
			["LNE_SE_Myrmidon"] = new StatConfig
			{
				BonusHealth = 30f,
				BonusStamina = 20f,
				BonusEitrRegen = 2f
			},
			["LNE_SE_Undead"] = new StatConfig
			{
				BonusHealth = 15f,
				BonusStamina = 40f,
				LifeStealChancePercent = 60f,
				LifeStealPercentOfDamage = 10f
			},
			["LNE_SE_Draenei"] = new StatConfig
			{
				BonusHealth = 40f,
				BonusEitr = 15f,
				BonusHealthRegen = 5f
			},
			["LNE_SE_Tiefling"] = new StatConfig
			{
				BonusHealth = 10f,
				BonusEitr = 20f,
				BonusEitrRegen = 2.5f
			},
			["LNE_SE_Goblin"] = new StatConfig
			{
				BonusStamina = 15f,
				BonusEitr = 30f,
				LifeStealChancePercent = 50f,
				LifeStealPercentOfDamage = 20f,
				BonusEitrRegen = 2f
			},
			["LNE_SE_Human"] = new StatConfig
			{
				BonusHealth = 10f,
				BonusStamina = 10f,
				BonusStaminaRegen = 5f
			}
		};

		[IteratorStateMachine(typeof(<GetConfigsFor>d__2))]
		internal static IEnumerable<StatConfig> GetConfigsFor(Player player)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetConfigsFor>d__2(-2)
			{
				<>3__player = player
			};
		}
	}
	[HarmonyPatch(typeof(Player), "Update")]
	internal static class LNE_RacialPeriodicRegen
	{
		private static readonly Dictionary<long, float> HpTimers = new Dictionary<long, float>();

		private static readonly Dictionary<long, float> StamTimers = new Dictionary<long, float>();

		private static readonly Dictionary<long, float> EitrTimers = new Dictionary<long, float>();

		private static void Postfix(Player __instance)
		{
			float deltaTime = Time.deltaTime;
			if ((Object)(object)__instance == (Object)null || (Object)(object)__instance != (Object)(object)Player.m_localPlayer || ((Character)__instance).IsDead() || (Object)(object)((Character)__instance).m_nview == (Object)null || !((Character)__instance).m_nview.IsValid())
			{
				return;
			}
			float num = 0f;
			float interval = 0f;
			float num2 = 0f;
			float interval2 = 0f;
			float num3 = 0f;
			float interval3 = 0f;
			foreach (LNE_RacialStatusConfig.StatConfig item in LNE_RacialStatusConfig.GetConfigsFor(__instance))
			{
				if (item.PeriodicHealPercent > num && item.PeriodicHealInterval > 0f)
				{
					num = item.PeriodicHealPercent;
					interval = item.PeriodicHealInterval;
				}
				if (item.PeriodicStaminaPercent > num2 && item.PeriodicStaminaInterval > 0f)
				{
					num2 = item.PeriodicStaminaPercent;
					interval2 = item.PeriodicStaminaInterval;
				}
				if (item.PeriodicEitrPercent > num3 && item.PeriodicEitrInterval > 0f)
				{
					num3 = item.PeriodicEitrPercent;
					interval3 = item.PeriodicEitrInterval;
				}
			}
			long playerID = __instance.GetPlayerID();
			TickHp(__instance, playerID, deltaTime, num, interval);
			TickStamina(__instance, playerID, deltaTime, num2, interval2);
			TickEitr(__instance, playerID, deltaTime, num3, interval3);
		}

		private static void TickHp(Player p, long pid, float dt, float percent, float interval)
		{
			if (!HpTimers.TryGetValue(pid, out var value))
			{
				value = 0f;
			}
			if (percent <= 0f || interval <= 0f)
			{
				HpTimers[pid] = 0f;
				return;
			}
			value += dt;
			if (value < interval)
			{
				HpTimers[pid] = value;
				return;
			}
			if (LNE_LastDamageTracker.LastDamageTime.TryGetValue(pid, out var value2) && Time.time - value2 < 12f)
			{
				HpTimers[pid] = value;
				return;
			}
			HpTimers[pid] = 0f;
			float maxHealth = ((Character)p).GetMaxHealth();
			if (!(maxHealth <= 0f) && !(((Character)p).GetHealth() >= maxHealth - 0.001f))
			{
				float num = maxHealth * (percent / 100f);
				((Character)p).Heal(num, true);
			}
		}

		private static void TickStamina(Player p, long pid, float dt, float percent, float interval)
		{
			if (!StamTimers.TryGetValue(pid, out var value))
			{
				value = 0f;
			}
			if (percent <= 0f || interval <= 0f)
			{
				StamTimers[pid] = 0f;
				return;
			}
			value += dt;
			if (value < interval)
			{
				StamTimers[pid] = value;
				return;
			}
			StamTimers[pid] = 0f;
			float maxStamina = ((Character)p).GetMaxStamina();
			if (!(maxStamina <= 0f) && !(p.GetStamina() >= maxStamina - 0.001f))
			{
				float num = maxStamina * (percent / 100f);
				((Character)p).AddStamina(num);
			}
		}

		private static void TickEitr(Player p, long pid, float dt, float percent, float interval)
		{
			if (!EitrTimers.TryGetValue(pid, out var value))
			{
				value = 0f;
			}
			if (percent <= 0f || interval <= 0f)
			{
				EitrTimers[pid] = 0f;
				return;
			}
			value += dt;
			if (value < interval)
			{
				EitrTimers[pid] = value;
				return;
			}
			EitrTimers[pid] = 0f;
			float maxEitr = ((Character)p).GetMaxEitr();
			if (!(maxEitr <= 0f) && !(p.GetEitr() >= maxEitr - 0.001f))
			{
				float num = maxEitr * (percent / 100f);
				((Character)p).AddEitr(num);
			}
		}
	}
	[HarmonyPatch(typeof(Character), "Damage")]
	internal static class LNE_LastDamageTracker
	{
		internal static readonly Dictionary<long, float> LastDamageTime = new Dictionary<long, float>();

		private static void Postfix(Character __instance)
		{
			if (__instance.IsPlayer())
			{
				Player val = (Player)(object)((__instance is Player) ? __instance : null);
				if (!((Object)(object)val == (Object)null) && !((Object)(object)val != (Object)(object)Player.m_localPlayer))
				{
					long playerID = val.GetPlayerID();
					LastDamageTime[playerID] = Time.time;
				}
			}
		}
	}
	[HarmonyPatch]
	internal static class LNE_RacialStatsFromStatusEffects
	{
		[HarmonyPatch(typeof(Player), "GetTotalFoodValue")]
		private static class Player_GetTotalFoodValue_RacialBonuses
		{
			private static void Postfix(Player __instance, ref float hp, ref float stamina, ref float eitr)
			{
				if ((Object)(object)__instance == (Object)null || (Object)(object)__instance != (Object)(object)Player.m_localPlayer)
				{
					return;
				}
				foreach (LNE_RacialStatusConfig.StatConfig item in LNE_RacialStatusConfig.GetConfigsFor(__instance))
				{
					if (item.BonusHealth != 0f)
					{
						hp += item.BonusHealth;
					}
					if (item.BonusStamina != 0f)
					{
						stamina += item.BonusStamina;
					}
					if (item.BonusEitr != 0f)
					{
						eitr += item.BonusEitr;
					}
				}
			}
		}
	}
	public static class LNE_RacialStatusEffects
	{
		private static bool _initialized;

		public static void Register()
		{
			if (!_initialized)
			{
				_initialized = true;
				CustomSE customSE = new CustomSE("LNE_SE_MysticElf");
				customSE.Type = EffectType.Equip;
				customSE.Name.English("Mystic Elf");
				customSE.Name.Spanish("Elfo Místico");
				customSE.Icon = "LNE_ElfMystic.png";
				customSE.Effect.m_tooltip = "<color=#66CCFF>La magia mística de los elfos nocturnos fluye a través de ti.</color>";
				customSE.AddSEToPrefab(customSE, "LNE_potionelfnoche");
			}
		}
	}
	public static class LNE_PrefabRegistrar
	{
		private static readonly string[] AllRacePrefabs = new string[27]
		{
			"LNE_Orcovil", "LNE_Orcovil1", "LNE_Orcoverde", "LNE_Orcoverdev2", "LNE_OrcoUrukai", "LNE_OrcoUrukaiv2", "LNE_Troll", "LNE_potionelf", "LNE_potionelf1", "LNE_potionelfv1",
			"LNE_potionelfv1f1", "LNE_potionelfodelbosqueoscuro", "LNE_potionelfodelbosqueoscuro1", "LNE_Enano", "LNE_potionelfodelbosqueoscurov1", "LNE_potionelfodelbosqueoscurov2", "LNE_potionelfnoche", "LNE_potionelfdark", "LNE_Mirmidon", "LNE_Nomuerto",
			"LNE_Tiefling", "LNE_Muspelheim", "LNE_Niflborn", "LNE_Jotun", "LNE_Draenei", "LNE_Goblin", "LNE_Human"
		};

		public static void ApplyHairColorToBeardAndEyebrows(VisEquipment vis)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)vis == (Object)null || !Object.op_Implicit((Object)(object)vis.m_visual))
			{
				return;
			}
			Player component = ((Component)vis).GetComponent<Player>();
			if (Object.op_Implicit((Object)(object)component))
			{
				Vector3 hairColor = component.GetHairColor();
				Color color = default(Color);
				((Color)(ref color))..ctor(hairColor.x, hairColor.y, hairColor.z);
				Transform val = FindDeepChild(vis.m_visual.transform, "Barba");
				if (Object.op_Implicit((Object)(object)val))
				{
					ApplyColorToAllRenderers(val, color);
				}
				Transform val2 = FindDeepChild(vis.m_visual.transform, "Cejas");
				if (Object.op_Implicit((Object)(object)val2))
				{
					ApplyColorToAllRenderers(val2, color);
				}
			}
		}

		public static void ApplyColorToAllRenderers(Transform root, Color color)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			Renderer[] componentsInChildren = ((Component)root).GetComponentsInChildren<Renderer>(true);
			Renderer[] array = componentsInChildren;
			foreach (Renderer val in array)
			{
				if (!Object.op_Implicit((Object)(object)val))
				{
					continue;
				}
				Material[] sharedMaterials = val.sharedMaterials;
				for (int j = 0; j < sharedMaterials.Length; j++)
				{
					Material val2 = sharedMaterials[j];
					if (Object.op_Implicit((Object)(object)val2))
					{
						MaterialPropertyBlock val3 = new MaterialPropertyBlock();
						val.GetPropertyBlock(val3, j);
						if (val2.HasProperty("_Color"))
						{
							val3.SetColor("_Color", color);
						}
						if (val2.HasProperty("_BaseColor"))
						{
							val3.SetColor("_BaseColor", color);
						}
						if (val2.HasProperty("_HairColor"))
						{
							val3.SetColor("_HairColor", color);
						}
						val.SetPropertyBlock(val3, j);
					}
				}
			}
		}

		public static Transform FindDeepChild(Transform parent, string name)
		{
			if (!Object.op_Implicit((Object)(object)parent))
			{
				return null;
			}
			for (int i = 0; i < parent.childCount; i++)
			{
				Transform child = parent.GetChild(i);
				if (((Object)child).name == name)
				{
					return child;
				}
				Transform val = FindDeepChild(child, name);
				if (Object.op_Implicit((Object)(object)val))
				{
					return val;
				}
			}
			return null;
		}

		public static void RegisterAll()
		{
			Debug.Log((object)"[LNE] Registrando TODOS los prefabs raciales para VisEquipmentPatch...");
			string[] allRacePrefabs = AllRacePrefabs;
			foreach (string text in allRacePrefabs)
			{
				try
				{
					text.Register();
					Debug.Log((object)("[LNE] Registrado en customArmors: " + text));
				}
				catch
				{
					Debug.LogWarning((object)("[LNE] No se pudo registrar prefab: " + text));
				}
			}
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "Awake")]
	public static class LNE_AutoRegisterPatch
	{
		private static void Postfix()
		{
			LNE_PrefabRegistrar.RegisterAll();
		}
	}
	public static class VisEquipmentPatches
	{
		[HarmonyPatch(typeof(VisEquipment), "AttachItem")]
		private static class VisEquipment_AttachItem_Patch
		{
			[UsedImplicitly]
			private static bool Prefix(VisEquipment __instance, int itemHash, int variant, Transform joint, bool enableEquipEffects, bool backAttach, ref GameObject __result)
			{
				//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
				//IL_030f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0192: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
				if (!customArmors.Contains(itemHash))
				{
					return true;
				}
				__result = null;
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemHash);
				if (!Object.op_Implicit((Object)(object)itemPrefab))
				{
					return false;
				}
				bool flag = __instance.GetModelIndex() != 0;
				Transform val = itemPrefab.transform.Find(flag ? "attach_female" : "attach_male");
				if (!Object.op_Implicit((Object)(object)val))
				{
					return false;
				}
				GameObject val2 = null;
				for (int i = 0; i < val.childCount; i++)
				{
					Transform child = val.GetChild(i);
					if (backAttach && ((Object)child).name == "attach_back")
					{
						val2 = ((Component)child).gameObject;
						break;
					}
					if (((Object)child).name == "attach" || (!backAttach && ((Object)child).name == "attach_skin"))
					{
						val2 = ((Component)child).gameObject;
						break;
					}
				}
				if (!Object.op_Implicit((Object)(object)val2))
				{
					return false;
				}
				GameObject val3 = Object.Instantiate<GameObject>(val2);
				val3.SetActive(true);
				VisEquipment.CleanupInstance(val3);
				if (enableEquipEffects)
				{
					VisEquipment.EnableEquippedEffects(val3);
				}
				if (((Object)val2).name == "attach_skin")
				{
					val3.transform.SetParent(((Component)__instance.m_bodyModel).transform.parent);
					val3.transform.localPosition = Vector3.zero;
					val3.transform.localRotation = Quaternion.identity;
					LNE_RaceBodyMarker lNE_RaceBodyMarker = val3.GetComponent<LNE_RaceBodyMarker>();
					if ((Object)(object)lNE_RaceBodyMarker == (Object)null)
					{
						lNE_RaceBodyMarker = val3.AddComponent<LNE_RaceBodyMarker>();
					}
					SkinnedMeshRenderer[] componentsInChildren = val3.GetComponentsInChildren<SkinnedMeshRenderer>();
					foreach (SkinnedMeshRenderer val4 in componentsInChildren)
					{
						val4.rootBone = __instance.m_bodyModel.rootBone;
						val4.bones = __instance.m_bodyModel.bones;
						string name = ((Object)val4).name;
						switch (name)
						{
						default:
							if (!(name == "cuerpotrollfemeninop"))
							{
								continue;
							}
							break;
						case "body":
						case "bodyfem":
						case "male":
						case "bodyfem.004":
						case "body.001":
						case "Body":
						case "bodyfem.001":
						case "EnanoMen":
							break;
						}
						if (!lNE_RaceBodyMarker.BodyRenderers.Contains(val4))
						{
							lNE_RaceBodyMarker.BodyRenderers.Add(val4);
						}
						ApplyPlayerShaderToRaceRenderer(__instance, val4);
					}
				}
				else
				{
					val3.transform.SetParent(joint);
					val3.transform.localPosition = Vector3.zero;
					val3.transform.localRotation = Quaternion.identity;
				}
				IEquipmentVisual componentInChildren = val3.GetComponentInChildren<IEquipmentVisual>();
				if (componentInChildren != null)
				{
					componentInChildren.Setup(variant);
				}
				__result = val3;
				return false;
			}
		}

		[HarmonyPatch(typeof(VisEquipment), "AttachArmor")]
		private static class VisEquipment_AttachArmor_Patch
		{
			[UsedImplicitly]
			private static bool Prefix(VisEquipment __instance, int itemHash, int variant, ref List<GameObject> __result)
			{
				if (!customArmors.Contains(itemHash))
				{
					return true;
				}
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemHash);
				if (!Object.op_Implicit((Object)(object)itemPrefab))
				{
					return false;
				}
				bool flag = __instance.GetModelIndex() != 0;
				Transform val = itemPrefab.transform.Find(flag ? "attach_female" : "attach_male");
				if (!Object.op_Implicit((Object)(object)val))
				{
					return false;
				}
				__result = new List<GameObject>();
				for (int i = 0; i < val.childCount; i++)
				{
					Transform child = val.GetChild(i);
					if (!Utils.CustomStartsWith(((Object)child).name, "attach_"))
					{
						continue;
					}
					string text = ((Object)child).name.Substring(7);
					if (text == "skin")
					{
						GameObject item = AttachArmorSkin(__instance, child, variant);
						__result.Add(item);
						continue;
					}
					Transform val2 = Utils.FindChild(__instance.m_visual.transform, text, (IterativeSearchType)0);
					if (Object.op_Implicit((Object)(object)val2))
					{
						GameObject item2 = AttachItem(child, val2, variant);
						__result.Add(item2);
					}
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(VisEquipment), "UpdateEquipmentVisuals")]
		public static class LNE_VisEquipment_UpdateEquipmentVisuals_Patch
		{
			[UsedImplicitly]
			private static void Postfix(VisEquipment __instance)
			{
				if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_bodyModel == (Object)null || !Object.op_Implicit((Object)(object)__instance.m_visual))
				{
					return;
				}
				LNE_RaceBodyMarker componentInChildren = __instance.m_visual.GetComponentInChildren<LNE_RaceBodyMarker>(true);
				if ((Object)(object)componentInChildren == (Object)null || componentInChildren.BodyRenderers == null)
				{
					return;
				}
				foreach (SkinnedMeshRenderer bodyRenderer in componentInChildren.BodyRenderers)
				{
					if (Object.op_Implicit((Object)(object)bodyRenderer))
					{
						ApplyPlayerShaderToRaceRenderer(__instance, bodyRenderer);
					}
				}
			}
		}

		public class LNE_RaceBodyMarker : MonoBehaviour
		{
			public List<SkinnedMeshRenderer> BodyRenderers = new List<SkinnedMeshRenderer>();
		}

		[HarmonyPatch(typeof(VisEquipment), "SetHairColor")]
		public static class LNE_BeardEyebrowsFollowHairColorPatch
		{
			private static void Postfix(VisEquipment __instance, Vector3 color)
			{
				//IL_0023: 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_002f: 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_0087: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)__instance == (Object)null) && Object.op_Implicit((Object)(object)__instance.m_visual))
				{
					Color color2 = default(Color);
					((Color)(ref color2))..ctor(color.x, color.y, color.z);
					Transform val = LNE_PrefabRegistrar.FindDeepChild(__instance.m_visual.transform, "Barba");
					if (Object.op_Implicit((Object)(object)val))
					{
						LNE_PrefabRegistrar.ApplyColorToAllRenderers(val, color2);
					}
					Transform val2 = LNE_PrefabRegistrar.FindDeepChild(__instance.m_visual.transform, "Cejas");
					if (Object.op_Implicit((Object)(object)val2))
					{
						LNE_PrefabRegistrar.ApplyColorToAllRenderers(val2, color2);
					}
				}
			}
		}

		public static readonly List<int> customArmors = new List<int>();

		public static void Register(this GameObject obj)
		{
			((Object)obj).name.Register();
		}

		public static void Register(this Item item)
		{
			item.Prefab.Register();
		}

		public static void Register(this string itemName)
		{
			Register(StringExtensionMethods.GetStableHashCode(itemName));
		}

		public static void Register(int hash)
		{
			customArmors.Add(hash);
		}

		private static void ApplyPlayerShaderToRaceRenderer(VisEquipment vis, SkinnedMeshRenderer renderer)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)vis == (Object)null || (Object)(object)vis.m_bodyModel == (Object)null || (Object)(object)renderer == (Object)null)
			{
				return;
			}
			Material sharedMaterial = ((Renderer)vis.m_bodyModel).sharedMaterial;
			Material val;
			if ((Object)(object)sharedMaterial != (Object)null)
			{
				val = new Material(sharedMaterial);
			}
			else
			{
				Material sharedMaterial2 = ((Renderer)renderer).sharedMaterial;
				Shader val2 = Shader.Find("Custom/Player");
				if ((Object)(object)sharedMaterial2 != (Object)null)
				{
					val = new Material(sharedMaterial2);
					if ((Object)(object)val2 != (Object)null)
					{
						val.shader = val2;
					}
				}
				else
				{
					val = (((Object)(object)val2 != (Object)null) ? new Material(val2) : new Material(Shader.Find("Standard")));
				}
			}
			Material sharedMaterial3 = ((Renderer)renderer).sharedMaterial;
			if ((Object)(object)sharedMaterial3 != (Object)null)
			{
				if (sharedMaterial3.HasProperty("_MainTex") && val.HasProperty("_MainTex"))
				{
					Texture texture = sharedMaterial3.GetTexture("_MainTex");
					if ((Object)(object)texture != (Object)null)
					{
						val.SetTexture("_MainTex", texture);
					}
				}
				if (sharedMaterial3.HasProperty("_BumpMap") && val.HasProperty("_BumpMap"))
				{
					Texture texture2 = sharedMaterial3.GetTexture("_BumpMap");
					if ((Object)(object)texture2 != (Object)null)
					{
						val.SetTexture("_BumpMap", texture2);
					}
				}
				if (sharedMaterial3.HasProperty("_EmissionMap") && val.HasProperty("_EmissionMap"))
				{
					Texture texture3 = sharedMaterial3.GetTexture("_EmissionMap");
					if ((Object)(object)texture3 != (Object)null)
					{
						val.SetTexture("_EmissionMap", texture3);
						if (val.HasProperty("_EmissionColor") && sharedMaterial3.HasProperty("_EmissionColor"))
						{
							val.SetColor("_EmissionColor", sharedMaterial3.GetColor("_EmissionColor"));
						}
					}
				}
			}
			if (val.HasProperty("_Color"))
			{
				val.SetColor("_Color", Color.white);
			}
			((Renderer)renderer).sharedMaterial = val;
		}

		private static GameObject AttachItem(Transform child, Transform joint, int variant)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(((Component)child).gameObject);
			val.SetActive(true);
			val.transform.SetParent(joint);
			val.transform.localPosition = Vector3.zero;
			val.transform.localRotation = Quaternion.identity;
			if (variant >= 0)
			{
				IEquipmentVisual componentInChildren = val.GetComponentInChildren<IEquipmentVisual>();
				if (componentInChildren != null)
				{
					componentInChildren.Setup(variant);
				}
			}
			VisEquipment.CleanupInstance(val);
			VisEquipment.EnableEquippedEffects(val);
			return val;
		}

		private static GameObject AttachArmorSkin(VisEquipment __instance, Transform child, int variant)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(((Component)child).gameObject, ((Component)__instance.m_bodyModel).transform.position, ((Component)__instance.m_bodyModel).transform.rotation, ((Component)__instance.m_bodyModel).transform.parent);
			val.SetActive(true);
			LNE_RaceBodyMarker lNE_RaceBodyMarker = val.GetComponent<LNE_RaceBodyMarker>();
			if ((Object)(object)lNE_RaceBodyMarker == (Object)null)
			{
				lNE_RaceBodyMarker = val.AddComponent<LNE_RaceBodyMarker>();
			}
			SkinnedMeshRenderer[] componentsInChildren = val.GetComponentsInChildren<SkinnedMeshRenderer>();
			foreach (SkinnedMeshRenderer val2 in componentsInChildren)
			{
				val2.rootBone = __instance.m_bodyModel.rootBone;
				val2.bones = __instance.m_bodyModel.bones;
				string name = ((Object)val2).name;
				switch (name)
				{
				default:
					if (!(name == "Cuerpotrollfemeninop"))
					{
						continue;
					}
					break;
				case "body":
				case "bodyfem":
				case "male":
				case "bodyfem.004":
				case "body.001":
				case "Body":
				case "bodyfem.001":
				case "EnanoMen":
					break;
				}
				if (!lNE_RaceBodyMarker.BodyRenderers.Contains(val2))
				{
					lNE_RaceBodyMarker.BodyRenderers.Add(val2);
				}
				ApplyPlayerShaderToRaceRenderer(__instance, val2);
			}
			IEquipmentVisual component = val.GetComponent<IEquipmentVisual>();
			if (component != null)
			{
				component.Setup(variant);
			}
			VisEquipment.CleanupInstance(val);
			VisEquipment.EnableEquippedEffects(val);
			return val;
		}
	}
}
namespace ItemManager
{
	[PublicAPI]
	public enum CraftingTable
	{
		Disabled,
		Inventory,
		[InternalName("piece_workbench")]
		Workbench,
		[InternalName("piece_cauldron")]
		Cauldron,
		[InternalName("piece_MeadCauldron")]
		MeadCauldron,
		[InternalName("forge")]
		Forge,
		[InternalName("piece_artisanstation")]
		ArtisanTable,
		[InternalName("piece_stonecutter")]
		StoneCutter,
		[InternalName("piece_magetable")]
		MageTable,
		[InternalName("piece_preptable")]
		PrepTable,
		[InternalName("blackforge")]
		BlackForge,
		Custom
	}
	[PublicAPI]
	public enum ConversionPiece
	{
		Disabled,
		[InternalName("smelter")]
		Smelter,
		[InternalName("charcoal_kiln")]
		CharcoalKiln,
		[InternalName("blastfurnace")]
		BlastFurnace,
		[InternalName("windmill")]
		Windmill,
		[InternalName("piece_spinningwheel")]
		SpinningWheel,
		[InternalName("eitrrefinery")]
		EitrRefinery,
		Custom
	}
	public class InternalName : Attribute
	{
		public readonly string internalName;

		public InternalName(string internalName)
		{
			this.internalName = internalName;
		}
	}
	[PublicAPI]
	public class RequiredResourceList
	{
		public readonly List<Requirement> Requirements = new List<Requirement>();

		public bool Free = false;

		public void Add(string itemName, int amount, int quality = 0)
		{
			Requirements.Add(new Requirement
			{
				itemName = itemName,
				amount = amount,
				quality = quality
			});
		}

		public void Add(string itemName, ConfigEntry<int> amountConfig, int quality = 0)
		{
			Requirements.Add(new Requirement
			{
				itemName = itemName,
				amountConfig = amountConfig,
				quality = quality
			});
		}
	}
	[PublicAPI]
	public class CraftingStationList
	{
		public readonly List<CraftingStationConfig> Stations = new List<CraftingStationConfig>();

		public void Add(CraftingTable table, int level)
		{
			Stations.Add(new CraftingStationConfig
			{
				Table = table,
				level = level
			});
		}

		public void Add(string customTable, int level)
		{
			Stations.Add(new CraftingStationConfig
			{
				Table = CraftingTable.Custom,
				level = level,
				custom = customTable
			});
		}
	}
	[PublicAPI]
	public class ItemRecipe
	{
		public readonly RequiredResourceList RequiredItems = new RequiredResourceList();

		public readonly RequiredResourceList RequiredUpgradeItems = new RequiredResourceList();

		public readonly CraftingStationList Crafting = new CraftingStationList();

		public int CraftAmount = 1;

		public bool RequireOnlyOneIngredient = false;

		public float QualityResultAmountMultiplier = 1f;

		public ConfigEntryBase? RecipeIsActive = null;
	}
	[PublicAPI]
	public class Trade
	{
		public Trader Trader = Trader.None;

		public uint Price = 0u;

		public uint Stack = 1u;

		public string? RequiredGlobalKey = null;
	}
	[PublicAPI]
	[Flags]
	public enum Trader
	{
		None = 0,
		Haldor = 1,
		Hildir = 2
	}
	public struct Requirement
	{
		public string itemName;

		public int amount;

		public ConfigEntry<int>? amountConfig;

		[Description("Set to a non-zero value to apply the requirement only for a specific quality")]
		public int quality;
	}
	public struct CraftingStationConfig
	{
		public CraftingTable Table;

		public int level;

		public string? custom;
	}
	[Flags]
	public enum Configurability
	{
		Disabled = 0,
		Recipe = 1,
		Stats = 2,
		Drop = 4,
		Trader = 8,
		Full = 0xF
	}
	[PublicAPI]
	public class DropTargets
	{
		public readonly List<DropTarget> Drops = new List<DropTarget>();

		public void Add(string creatureName, float chance, int min = 1, int? max = null, bool levelMultiplier = true)
		{
			Drops.Add(new DropTarget
			{
				creature = creatureName,
				chance = chance,
				min = min,
				max = max.GetValueOrDefault(min),
				levelMultiplier = levelMultiplier
			});
		}
	}
	public struct DropTarget
	{
		public string creature;

		public int min;

		public int max;

		public float chance;

		public bool levelMultiplier;
	}
	public enum Toggle
	{
		On = 1,
		Off = 0
	}
	[PublicAPI]
	public class Item
	{
		private class ItemConfig
		{
			public ConfigEntry<string>? craft;

			public ConfigEntry<string>? upgrade;

			public ConfigEntry<CraftingTable> table = null;

			public ConfigEntry<int> tableLevel = null;

			public ConfigEntry<string> customTable = null;

			public ConfigEntry<int>? maximumTableLevel;

			public ConfigEntry<Toggle> requireOneIngredient = null;

			public ConfigEntry<float> qualityResultAmountMultiplier = null;
		}

		private class TraderConfig
		{
			public ConfigEntry<Trader> trader = null;

			public ConfigEntry<uint> price = null;

			public ConfigEntry<uint> stack = null;

			public ConfigEntry<string> requiredGlobalKey = null;
		}

		private class RequirementQuality
		{
			public int quality;
		}

		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order;

			[UsedImplicitly]
			public bool? Browsable;

			[UsedImplicitly]
			public string? Category;

			[UsedImplicitly]
			public Action<ConfigEntryBase>? CustomDrawer;

			public Func<bool>? browsability;
		}

		[PublicAPI]
		public enum DamageModifier
		{
			Normal,
			Resistant,
			Weak,
			Immune,
			Ignore,
			VeryResistant,
			VeryWeak,
			None
		}

		private delegate void setDmgFunc(ref DamageTypes dmg, float value);

		private class SerializedRequirements
		{
			public readonly List<Requirement> Reqs;

			public SerializedRequirements(List<Requirement> reqs)
			{
				Reqs = reqs;
			}

			public SerializedRequirements(string reqs)
				: this(reqs.Split(new char[1] { ',' }).Select(delegate(string r)
				{
					string[] array = r.Split(new char[1] { ':' });
					Requirement result = default(Requirement);
					result.itemName = array[0];
					result.amount = ((array.Length <= 1 || !int.TryParse(array[1], out var result2)) ? 1 : result2);
					result.quality = ((array.Length > 2 && int.TryParse(array[2], out var result3)) ? result3 : 0);
					return result;
				}).ToList())
			{
			}

			public override string ToString()
			{
				return string.Join(",", Reqs.Select((Requirement r) => $"{r.itemName}:{r.amount}" + ((r.quality > 0) ? $":{r.quality}" : "")));
			}

			public static ItemDrop? fetchByName(ObjectDB objectDB, string name)
			{
				GameObject itemPrefab = objectDB.GetItemPrefab(name);
				ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null);
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)("The required item '" + name + "' does not exist."));
				}
				return val;
			}

			public static Requirement[] toPieceReqs(ObjectDB objectDB, SerializedRequirements craft, SerializedRequirements upgrade)
			{
				//IL_0100: Unknown result type (might be due to invalid IL or missing references)
				//IL_0105: Unknown result type (might be due to invalid IL or missing references)
				//IL_010d: 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_01a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_01af: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b2: Expected O, but got Unknown
				//IL_01b7: Expected O, but got Unknown
				//IL_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0135: Expected O, but got Unknown
				ObjectDB objectDB2 = objectDB;
				Dictionary<string, Requirement> dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func<Requirement, string>)((Requirement r) => r.itemName), (Func<Requirement, Requirement>)delegate(Requirement r)
				{
					//IL_000e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0013: Unknown result type (might be due to invalid IL or missing references)
					//IL_0030: 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)
					ItemDrop val6 = ResItem(r);
					return (val6 == null) ? ((Requirement)null) : new Requirement
					{
						m_amount = (r.amountConfig?.Value ?? r.amount),
						m_resItem = val6,
						m_amountPerLevel = 0
					};
				});
				List<Requirement> list = dictionary.Values.Where((Requirement v) => v != null).ToList();
				foreach (Requirement item in upgrade.Reqs.Where((Requirement r) => r.itemName != ""))
				{
					if (item.quality > 0)
					{
						ItemDrop val = ResItem(item);
						if (val != null)
						{
							Requirement val2 = new Requirement
							{
								m_resItem = val,
								m_amountPerLevel = (item.amountConfig?.Value ?? item.amount),
								m_amount = 0
							};
							list.Add(val2);
							requirementQuality.Add(val2, new RequirementQuality
							{
								quality = item.quality
							});
						}
						continue;
					}
					if (!dictionary.TryGetValue(item.itemName, out var value) || value == null)
					{
						ItemDrop val3 = ResItem(item);
						if (val3 != null)
						{
							string itemName = item.itemName;
							Requirement val4 = new Requirement
							{
								m_resItem = val3,
								m_amount = 0
							};
							Requirement val5 = val4;
							dictionary[itemName] = val4;
							value = val5;
							list.Add(value);
						}
					}
					if (value != null)
					{
						value.m_amountPerLevel = item.amountConfig?.Value ?? item.amount;
					}
				}
				return list.ToArray();
				ItemDrop? ResItem(Requirement r)
				{
					return fetchByName(objectDB2, r.itemName);
				}
			}
		}

		private class SerializedDrop
		{
			public readonly List<DropTarget> Drops;

			public SerializedDrop(List<DropTarget> drops)
			{
				Drops = drops;
			}

			public SerializedDrop(string drops)
			{
				Drops = ((drops == "") ? ((IEnumerable<string>)Array.Empty<string>()) : ((IEnumerable<string>)drops.Split(new char[1] { ',' }))).Select(delegate(string r)
				{
					string[] array = r.Split(new char[1] { ':' });
					if (array.Length <= 2 || !int.TryParse(array[2], out var result))
					{
						result = 1;
					}
					if (array.Length <= 3 || !int.TryParse(array[3], out var result2))
					{
						result2 = result;
					}
					bool levelMultiplier = array.Length <= 4 || array[4] != "0";
					DropTarget result3 = default(DropTarget);
					result3.creature = array[0];
					result3.chance = ((array.Length > 1 && float.TryParse(array[1], out var result4)) ? result4 : 1f);
					result3.min = result;
					result3.max = result2;
					result3.levelMultiplier = levelMultiplier;
					return result3;
				}).ToList();
			}

			public override string ToString()
			{
				return string.Join(",", Drops.Select((DropTarget r) => $"{r.creature}:{r.chance.ToString(CultureInfo.InvariantCulture)}:{r.min}:" + ((r.min == r.max) ? "" : $"{r.max}") + (r.levelMultiplier ? "" : ":0")));
			}

			private static Character? fetchByName(ZNetScene netScene, string name)
			{
				GameObject prefab = netScene.GetPrefab(name);
				Character val = ((prefab != null) ? prefab.GetComponent<Character>() : null);
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)("The drop target character '" + name + "' does not exist."));
				}
				return val;
			}

			public Dictionary<Character, Drop> toCharacterDrops(ZNetScene netScene, GameObject item)
			{
				//IL_0039: 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_0045: 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_005d: 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_007a: Expected O, but got Unknown
				Dictionary<Character, Drop> dictionary = new Dictionary<Character, Drop>();
				foreach (DropTarget drop in Drops)
				{
					Character val = fetchByName(netScene, drop.creature);
					if (val != null)
					{
						dictionary[val] = new Drop
						{
							m_prefab = item,
							m_amountMin = drop.min,
							m_amountMax = drop.max,
							m_chance = drop.chance,
							m_levelMultiplier = drop.levelMultiplier
						};
					}
				}
				return dictionary;
			}
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass83_0
		{
			public Quaternion? cameraRotation;

			public float lightIntensity;

			public ItemDrop item;

			public Quaternion? itemRotation;
		}

		[CompilerGenerated]
		private sealed class <Transpile_InventoryGui>d__85 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private CodeInstruction <>2__current;

			private int <>l__initialThreadId;

			private IEnumerable<CodeInstruction> instructions;

			public IEnumerable<CodeInstruction> <>3__instructions;

			private List<CodeInstruction> <instrs>5__1;

			private FieldInfo <amount