Decompiled source of Ravenwood Potions v1.0.0

plugins/RavenwoodPotions/RavenwoodPotions.dll

Decompiled 4 hours 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 BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using ItemManager;
using JetBrains.Annotations;
using LocalizationManager;
using Microsoft.CodeAnalysis;
using ServerSync;
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("RavenWoodPotions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("JamesJonesTV")]
[assembly: AssemblyProduct("RavenWoodPotions")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class ExtensionMarkerAttribute : Attribute
	{
		private readonly string <Name>k__BackingField;

		public string Name => <Name>k__BackingField;

		public ExtensionMarkerAttribute(string name)
		{
			<Name>k__BackingField = name;
		}
	}
}
namespace RavenWoodPotions
{
	[BepInPlugin("JamesJonesTV.RavenWoodPotions", "RavenWoodPotions", "1.0.0")]
	public class RavenWoodPotionsPlugin : 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 = "RavenWoodPotions";

		internal const string ModVersion = "1.0.0";

		internal const string Author = "JamesJonesTV";

		private const string ModGUID = "JamesJonesTV.RavenWoodPotions";

		private static string ConfigFileName = "JamesJonesTV.RavenWoodPotions.cfg";

		private static string ConfigFileFullPath;

		internal static string ConnectionError;

		private readonly Harmony _harmony = new Harmony("JamesJonesTV.RavenWoodPotions");

		public static readonly ManualLogSource RavenwoodPotionsLogger;

		private static readonly ConfigSync ConfigSync;

		private static ConfigEntry<Toggle> _serverConfigLocked;

		private static ConfigEntry<Toggle> _recipeIsActiveConfig;

		public void Awake()
		{
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_061e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0842: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a6a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c8e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0eb2: Unknown result type (might be due to invalid IL or missing references)
			//IL_10d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_12fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_1522: Unknown result type (might be due to invalid IL or missing references)
			//IL_1746: Unknown result type (might be due to invalid IL or missing references)
			//IL_196a: Unknown result type (might be due to invalid IL or missing references)
			//IL_1b92: Unknown result type (might be due to invalid IL or missing references)
			//IL_1db6: Unknown result type (might be due to invalid IL or missing references)
			//IL_1fda: Unknown result type (might be due to invalid IL or missing references)
			//IL_21fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Expected O, but got Unknown
			//IL_00f6: 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_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02de: Expected O, but got Unknown
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f6: Expected O, but got Unknown
			//IL_0521: Unknown result type (might be due to invalid IL or missing references)
			//IL_0530: Unknown result type (might be due to invalid IL or missing references)
			//IL_0713: Unknown result type (might be due to invalid IL or missing references)
			//IL_071a: Expected O, but got Unknown
			//IL_0745: Unknown result type (might be due to invalid IL or missing references)
			//IL_0754: Unknown result type (might be due to invalid IL or missing references)
			//IL_093b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0942: Expected O, but got Unknown
			//IL_096d: Unknown result type (might be due to invalid IL or missing references)
			//IL_097c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b5f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b66: Expected O, but got Unknown
			//IL_0b91: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ba0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d83: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d8a: Expected O, but got Unknown
			//IL_0db5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dc4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fa7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fae: Expected O, but got Unknown
			//IL_0fd9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fe8: Unknown result type (might be due to invalid IL or missing references)
			//IL_11cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_11d6: Expected O, but got Unknown
			//IL_1201: Unknown result type (might be due to invalid IL or missing references)
			//IL_1210: Unknown result type (might be due to invalid IL or missing references)
			//IL_13f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_13fa: Expected O, but got Unknown
			//IL_1425: Unknown result type (might be due to invalid IL or missing references)
			//IL_1434: Unknown result type (might be due to invalid IL or missing references)
			//IL_1617: Unknown result type (might be due to invalid IL or missing references)
			//IL_161e: Expected O, but got Unknown
			//IL_1649: Unknown result type (might be due to invalid IL or missing references)
			//IL_1658: Unknown result type (might be due to invalid IL or missing references)
			//IL_183b: Unknown result type (might be due to invalid IL or missing references)
			//IL_1842: Expected O, but got Unknown
			//IL_186d: Unknown result type (might be due to invalid IL or missing references)
			//IL_187c: Unknown result type (might be due to invalid IL or missing references)
			//IL_1a63: Unknown result type (might be due to invalid IL or missing references)
			//IL_1a6a: Expected O, but got Unknown
			//IL_1a95: Unknown result type (might be due to invalid IL or missing references)
			//IL_1aa4: Unknown result type (might be due to invalid IL or missing references)
			//IL_1c87: Unknown result type (might be due to invalid IL or missing references)
			//IL_1c8e: Expected O, but got Unknown
			//IL_1cb9: Unknown result type (might be due to invalid IL or missing references)
			//IL_1cc8: Unknown result type (might be due to invalid IL or missing references)
			//IL_1eab: Unknown result type (might be due to invalid IL or missing references)
			//IL_1eb2: Expected O, but got Unknown
			//IL_1edd: Unknown result type (might be due to invalid IL or missing references)
			//IL_1eec: Unknown result type (might be due to invalid IL or missing references)
			//IL_20cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_20d6: Expected O, but got Unknown
			//IL_2101: Unknown result type (might be due to invalid IL or missing references)
			//IL_2110: Unknown result type (might be due to invalid IL or missing references)
			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);
			RavenPotionEffectRegister.minorDefenseEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.minorDefenseEffect).name = "SE_MinorDefense";
			((StatusEffect)RavenPotionEffectRegister.minorDefenseEffect).m_name = "$se_minordefense_name";
			((StatusEffect)RavenPotionEffectRegister.minorDefenseEffect).m_tooltip = "$se_minordefense_tooltip";
			RavenPotionEffectRegister.minorDefenseEffect.potionCategory = PotionCategory.Armor;
			RavenPotionEffectRegister.minorDefenseEffect.armorExtra = 5f;
			((StatusEffect)RavenPotionEffectRegister.minorDefenseEffect).m_ttl = 600f;
			try
			{
				string text = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MinorDefenseIcon.png");
				if (File.Exists(text))
				{
					byte[] array = File.ReadAllBytes(text);
					Texture2D val = new Texture2D(2, 2);
					ImageConversion.LoadImage(val, array);
					((StatusEffect)RavenPotionEffectRegister.minorDefenseEffect).m_icon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Minor Defense en: " + text));
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Error al cargar el ícono de Minor Defense: " + ex.Message));
			}
			Item item = new Item("ravenwoodpotions", "RP_PotionMinorDefense");
			item.Name.English("Minor Defense Potion");
			item.Name.Spanish("Poción de Defensa Menor");
			item.Description.English("Grants a minor boost to your armor for 10 minutes.");
			item.Description.Spanish("Otorga +5 de armadura durante 10 minutos.");
			ConfigEntry<Toggle> recipeIsActive = config("RP_PotionMinorDefense", "IsRecipeEnabled", Toggle.On, "Enable recipe for Minor Defense potion");
			item.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive;
			SharedData shared = item.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.minorDefenseEffect;
			shared.m_itemType = (ItemType)2;
			item.Crafting.Add(CraftingTable.Cauldron, 1);
			item.RequiredItems.Add("Essence_Frost", 3);
			item.RequiredItems.Add("Mushroom", 3);
			item.RequiredItems.Add("Raspberry", 3);
			item.RequiredItems.Add("Coal", 3);
			RavenPotionEffectRegister.mediumDefenseEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mediumDefenseEffect).name = "SE_MediumDefense";
			((StatusEffect)RavenPotionEffectRegister.mediumDefenseEffect).m_name = "$se_mediumdefense_name";
			((StatusEffect)RavenPotionEffectRegister.mediumDefenseEffect).m_tooltip = "$se_mediumdefense_tooltip";
			RavenPotionEffectRegister.mediumDefenseEffect.potionCategory = PotionCategory.Armor;
			RavenPotionEffectRegister.mediumDefenseEffect.armorExtra = 10f;
			((StatusEffect)RavenPotionEffectRegister.mediumDefenseEffect).m_ttl = 1200f;
			try
			{
				string text2 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MediumDefenseIcon.png");
				if (File.Exists(text2))
				{
					byte[] array2 = File.ReadAllBytes(text2);
					Texture2D val2 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val2, array2);
					((StatusEffect)RavenPotionEffectRegister.mediumDefenseEffect).m_icon = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Medium Defense en: " + text2));
				}
			}
			catch (Exception ex2)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex2.Message));
			}
			Item item2 = new Item("ravenwoodpotions", "RP_PotionMediumDefense");
			item2.Name.English("Medium Defense Potion");
			item2.Name.Spanish("Poción de Defensa Media");
			item2.Description.English("Grants a medium boost to your armor for 20 minutes.");
			item2.Description.Spanish("Otorga +10 de armadura durante 20 minutos.");
			ConfigEntry<Toggle> recipeIsActive2 = config("RP_PotionMediumDefense", "IsRecipeEnabled", Toggle.On, "Enable recipe for Medium Defense potion");
			item2.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive2;
			SharedData shared2 = item2.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared2.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mediumDefenseEffect;
			shared2.m_itemType = (ItemType)2;
			item2.Crafting.Add(CraftingTable.Cauldron, 2);
			item2.RequiredItems.Add("Essence_Frost", 5);
			item2.RequiredItems.Add("MushroomYellow", 5);
			item2.RequiredItems.Add("Blueberries", 5);
			item2.RequiredItems.Add("Guck", 5);
			RavenPotionEffectRegister.majorDefenseEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.majorDefenseEffect).name = "SE_MajorDefense";
			((StatusEffect)RavenPotionEffectRegister.majorDefenseEffect).m_name = "$se_majordefense_name";
			((StatusEffect)RavenPotionEffectRegister.majorDefenseEffect).m_tooltip = "$se_majordefense_tooltip";
			RavenPotionEffectRegister.majorDefenseEffect.potionCategory = PotionCategory.Armor;
			RavenPotionEffectRegister.majorDefenseEffect.armorExtra = 15f;
			((StatusEffect)RavenPotionEffectRegister.majorDefenseEffect).m_ttl = 1800f;
			try
			{
				string text3 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MajorDefenseIcon.png");
				if (File.Exists(text3))
				{
					byte[] array3 = File.ReadAllBytes(text3);
					Texture2D val3 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val3, array3);
					((StatusEffect)RavenPotionEffectRegister.majorDefenseEffect).m_icon = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Major Defense en: " + text3));
				}
			}
			catch (Exception ex3)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex3.Message));
			}
			Item item3 = new Item("ravenwoodpotions", "RP_PotionMajorDefense");
			item3.Name.English("Major Defense Potion");
			item3.Name.Spanish("Poción de Defensa Mayor");
			item3.Description.English("Grants a major boost to your armor for 30 minutes.");
			item3.Description.Spanish("Otorga +15 de armadura durante 30 minutos.");
			ConfigEntry<Toggle> recipeIsActive3 = config("RP_PotionMajorDefense", "IsRecipeEnabled", Toggle.On, "Enable recipe for Major Defense potion");
			item3.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive3;
			SharedData shared3 = item3.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared3.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.majorDefenseEffect;
			shared3.m_itemType = (ItemType)2;
			item3.Crafting.Add(CraftingTable.Cauldron, 3);
			item3.RequiredItems.Add("Essence_Frost", 8);
			item3.RequiredItems.Add("MushroomBlue", 8);
			item3.RequiredItems.Add("Cloudberry", 8);
			item3.RequiredItems.Add("Tar", 8);
			RavenPotionEffectRegister.mythicDefenseEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mythicDefenseEffect).name = "SE_MythicDefense";
			((StatusEffect)RavenPotionEffectRegister.mythicDefenseEffect).m_name = "$se_mythicdefense_name";
			((StatusEffect)RavenPotionEffectRegister.mythicDefenseEffect).m_tooltip = "$se_mythicdefense_tooltip";
			RavenPotionEffectRegister.mythicDefenseEffect.potionCategory = PotionCategory.Armor;
			RavenPotionEffectRegister.mythicDefenseEffect.armorExtra = 20f;
			((StatusEffect)RavenPotionEffectRegister.mythicDefenseEffect).m_ttl = 3600f;
			try
			{
				string text4 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MythicDefenseIcon.png");
				if (File.Exists(text4))
				{
					byte[] array4 = File.ReadAllBytes(text4);
					Texture2D val4 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val4, array4);
					((StatusEffect)RavenPotionEffectRegister.mythicDefenseEffect).m_icon = Sprite.Create(val4, new Rect(0f, 0f, (float)((Texture)val4).width, (float)((Texture)val4).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Mythic Defense en: " + text4));
				}
			}
			catch (Exception ex4)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex4.Message));
			}
			Item item4 = new Item("ravenwoodpotions", "RP_PotionMythicDefense");
			item4.Name.English("Mythic Defense Potion");
			item4.Name.Spanish("Poción de Defensa Mítica");
			item4.Description.English("Grants a mythic boost to your armor for 1 hour.");
			item4.Description.Spanish("Otorga +20 de armadura durante 1 hora.");
			ConfigEntry<Toggle> recipeIsActive4 = config("RP_PotionMythicDefense", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mythic Defense potion");
			item4.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive4;
			SharedData shared4 = item4.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared4.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mythicDefenseEffect;
			shared4.m_itemType = (ItemType)2;
			item4.Crafting.Add(CraftingTable.Cauldron, 4);
			item4.RequiredItems.Add("Essence_Frost", 10);
			item4.RequiredItems.Add("MushroomSmokePuff", 10);
			item4.RequiredItems.Add("Vineberry", 10);
			item4.RequiredItems.Add("Sap", 10);
			RavenPotionEffectRegister.minorFortitudeEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.minorFortitudeEffect).name = "SE_MinorFortitude";
			((StatusEffect)RavenPotionEffectRegister.minorFortitudeEffect).m_name = "$se_minorfortitude_name";
			((StatusEffect)RavenPotionEffectRegister.minorFortitudeEffect).m_tooltip = "$se_minorfortitude_tooltip";
			RavenPotionEffectRegister.minorFortitudeEffect.potionCategory = PotionCategory.Heal;
			RavenPotionEffectRegister.minorFortitudeEffect.healthExtra = 10f;
			((StatusEffect)RavenPotionEffectRegister.minorFortitudeEffect).m_ttl = 600f;
			try
			{
				string text5 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MinorFortitudeIcon.png");
				if (File.Exists(text5))
				{
					byte[] array5 = File.ReadAllBytes(text5);
					Texture2D val5 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val5, array5);
					((StatusEffect)RavenPotionEffectRegister.minorFortitudeEffect).m_icon = Sprite.Create(val5, new Rect(0f, 0f, (float)((Texture)val5).width, (float)((Texture)val5).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Minor Fortitude en: " + text5));
				}
			}
			catch (Exception ex5)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex5.Message));
			}
			Item item5 = new Item("ravenwoodpotions", "RP_PotionMinorFortitude");
			item5.Name.English("Minor Fortitude Potion");
			item5.Name.Spanish("Poción de Fortaleza Menor");
			item5.Description.English("Grants a minor boost to your maximum health for 10 minutes.");
			item5.Description.Spanish("Otorga +10 de vida máxima durante 10 minutos.");
			ConfigEntry<Toggle> recipeIsActive5 = config("RP_PotionMinorFortitude", "IsRecipeEnabled", Toggle.On, "Enable recipe for Minor Fortitude potion");
			item5.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive5;
			SharedData shared5 = item5.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared5.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.minorFortitudeEffect;
			shared5.m_itemType = (ItemType)2;
			item5.Crafting.Add(CraftingTable.Cauldron, 1);
			item5.RequiredItems.Add("Essence_Poison", 3);
			item5.RequiredItems.Add("Mushroom", 3);
			item5.RequiredItems.Add("Raspberry", 3);
			item5.RequiredItems.Add("Dandelion", 3);
			RavenPotionEffectRegister.mediumFortitudeEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mediumFortitudeEffect).name = "SE_MediumFortitude";
			((StatusEffect)RavenPotionEffectRegister.mediumFortitudeEffect).m_name = "$se_mediumfortitude_name";
			((StatusEffect)RavenPotionEffectRegister.mediumFortitudeEffect).m_tooltip = "$se_mediumfortitude_tooltip";
			RavenPotionEffectRegister.mediumFortitudeEffect.potionCategory = PotionCategory.Heal;
			RavenPotionEffectRegister.mediumFortitudeEffect.healthExtra = 20f;
			((StatusEffect)RavenPotionEffectRegister.mediumFortitudeEffect).m_ttl = 1200f;
			try
			{
				string text6 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MediumFortitudeIcon.png");
				if (File.Exists(text6))
				{
					byte[] array6 = File.ReadAllBytes(text6);
					Texture2D val6 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val6, array6);
					((StatusEffect)RavenPotionEffectRegister.mediumFortitudeEffect).m_icon = Sprite.Create(val6, new Rect(0f, 0f, (float)((Texture)val6).width, (float)((Texture)val6).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Medium Fortitude en: " + text6));
				}
			}
			catch (Exception ex6)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex6.Message));
			}
			Item item6 = new Item("ravenwoodpotions", "RP_PotionMediumFortitude");
			item6.Name.English("Medium Fortitude Potion");
			item6.Name.Spanish("Poción de Fortaleza Media");
			item6.Description.English("Grants a medium boost to your maximum health for 20 minutes.");
			item6.Description.Spanish("Otorga +20 de vida máxima durante 20 minutos.");
			ConfigEntry<Toggle> recipeIsActive6 = config("RP_PotionMediumFortitude", "IsRecipeEnabled", Toggle.On, "Enable recipe for Medium Fortitude potion");
			item6.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive6;
			SharedData shared6 = item6.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared6.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mediumFortitudeEffect;
			shared6.m_itemType = (ItemType)2;
			item6.Crafting.Add(CraftingTable.Cauldron, 2);
			item6.RequiredItems.Add("Essence_Poison", 5);
			item6.RequiredItems.Add("MushroomYellow", 5);
			item6.RequiredItems.Add("Blueberries", 5);
			item6.RequiredItems.Add("Thistle", 5);
			RavenPotionEffectRegister.majorFortitudeEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.majorFortitudeEffect).name = "SE_MajorFortitude";
			((StatusEffect)RavenPotionEffectRegister.majorFortitudeEffect).m_name = "$se_majorfortitude_name";
			((StatusEffect)RavenPotionEffectRegister.majorFortitudeEffect).m_tooltip = "$se_majorfortitude_tooltip";
			RavenPotionEffectRegister.majorFortitudeEffect.potionCategory = PotionCategory.Heal;
			RavenPotionEffectRegister.majorFortitudeEffect.healthExtra = 30f;
			((StatusEffect)RavenPotionEffectRegister.majorFortitudeEffect).m_ttl = 1800f;
			try
			{
				string text7 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MajorFortitudeIcon.png");
				if (File.Exists(text7))
				{
					byte[] array7 = File.ReadAllBytes(text7);
					Texture2D val7 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val7, array7);
					((StatusEffect)RavenPotionEffectRegister.majorFortitudeEffect).m_icon = Sprite.Create(val7, new Rect(0f, 0f, (float)((Texture)val7).width, (float)((Texture)val7).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Major Fortitude en: " + text7));
				}
			}
			catch (Exception ex7)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex7.Message));
			}
			Item item7 = new Item("ravenwoodpotions", "RP_PotionMajorFortitude");
			item7.Name.English("Major Fortitude Potion");
			item7.Name.Spanish("Poción de Fortaleza Mayor");
			item7.Description.English("Grants a major boost to your maximum health for 30 minutes.");
			item7.Description.Spanish("Otorga +30 de vida máxima durante 30 minutos.");
			ConfigEntry<Toggle> recipeIsActive7 = config("RP_PotionMajorFortitude", "IsRecipeEnabled", Toggle.On, "Enable recipe for Major Fortitude potion");
			item7.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive7;
			SharedData shared7 = item7.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared7.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.majorFortitudeEffect;
			shared7.m_itemType = (ItemType)2;
			item7.Crafting.Add(CraftingTable.Cauldron, 3);
			item7.RequiredItems.Add("Essence_Poison", 8);
			item7.RequiredItems.Add("MushroomBlue", 8);
			item7.RequiredItems.Add("Cloudberry", 8);
			item7.RequiredItems.Add("MushroomJotunPuffs", 8);
			RavenPotionEffectRegister.mythicFortitudeEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mythicFortitudeEffect).name = "SE_MythicFortitude";
			((StatusEffect)RavenPotionEffectRegister.mythicFortitudeEffect).m_name = "$se_mythicfortitude_name";
			((StatusEffect)RavenPotionEffectRegister.mythicFortitudeEffect).m_tooltip = "$se_mythicfortitude_tooltip";
			RavenPotionEffectRegister.mythicFortitudeEffect.potionCategory = PotionCategory.Heal;
			RavenPotionEffectRegister.mythicFortitudeEffect.healthExtra = 40f;
			((StatusEffect)RavenPotionEffectRegister.mythicFortitudeEffect).m_ttl = 3600f;
			try
			{
				string text8 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MythicFortitudeIcon.png");
				if (File.Exists(text8))
				{
					byte[] array8 = File.ReadAllBytes(text8);
					Texture2D val8 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val8, array8);
					((StatusEffect)RavenPotionEffectRegister.mythicFortitudeEffect).m_icon = Sprite.Create(val8, new Rect(0f, 0f, (float)((Texture)val8).width, (float)((Texture)val8).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Mythic Fortitude en: " + text8));
				}
			}
			catch (Exception ex8)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex8.Message));
			}
			Item item8 = new Item("ravenwoodpotions", "RP_PotionMythicFortitude");
			item8.Name.English("Mythic Fortitude Potion");
			item8.Name.Spanish("Poción de Fortaleza Mítica");
			item8.Description.English("Grants a mythic boost to your maximum health for 1 hour.");
			item8.Description.Spanish("Otorga +40 de vida máxima durante 1 hora.");
			ConfigEntry<Toggle> recipeIsActive8 = config("RP_PotionMythicFortitude", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mythic Fortitude potion");
			item8.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive8;
			SharedData shared8 = item8.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared8.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mythicFortitudeEffect;
			shared8.m_itemType = (ItemType)2;
			item8.Crafting.Add(CraftingTable.Cauldron, 4);
			item8.RequiredItems.Add("Essence_Poison", 10);
			item8.RequiredItems.Add("MushroomSmokePuff", 10);
			item8.RequiredItems.Add("Vineberry", 10);
			item8.RequiredItems.Add("Fiddleheadfern", 10);
			RavenPotionEffectRegister.minorIntellectEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.minorIntellectEffect).name = "SE_MinorIntellect";
			((StatusEffect)RavenPotionEffectRegister.minorIntellectEffect).m_name = "$se_minorintellect_name";
			((StatusEffect)RavenPotionEffectRegister.minorIntellectEffect).m_tooltip = "$se_minorintellect_tooltip";
			RavenPotionEffectRegister.minorIntellectEffect.potionCategory = PotionCategory.Eitr;
			RavenPotionEffectRegister.minorIntellectEffect.eitrExtra = 10f;
			((StatusEffect)RavenPotionEffectRegister.minorIntellectEffect).m_ttl = 600f;
			try
			{
				string text9 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MinorIntellectIcon.png");
				if (File.Exists(text9))
				{
					byte[] array9 = File.ReadAllBytes(text9);
					Texture2D val9 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val9, array9);
					((StatusEffect)RavenPotionEffectRegister.minorIntellectEffect).m_icon = Sprite.Create(val9, new Rect(0f, 0f, (float)((Texture)val9).width, (float)((Texture)val9).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Minor Intellect en: " + text9));
				}
			}
			catch (Exception ex9)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex9.Message));
			}
			Item item9 = new Item("ravenwoodpotions", "RP_PotionMinorIntellect");
			item9.Name.English("Minor Intellect Potion");
			item9.Name.Spanish("Poción de Intelecto Menor");
			item9.Description.English("Grants a minor boost to your maximum Eitr for 10 minutes.");
			item9.Description.Spanish("Otorga +10 de Eitr máximo durante 10 minutos.");
			ConfigEntry<Toggle> recipeIsActive9 = config("RP_PotionMinorIntellect", "IsRecipeEnabled", Toggle.On, "Enable recipe for Minor Intellect potion");
			item9.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive9;
			SharedData shared9 = item9.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared9.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.minorIntellectEffect;
			shared9.m_itemType = (ItemType)2;
			item9.Crafting.Add(CraftingTable.Cauldron, 1);
			item9.RequiredItems.Add("Essence_Fire", 3);
			item9.RequiredItems.Add("Mushroom", 3);
			item9.RequiredItems.Add("Raspberry", 3);
			item9.RequiredItems.Add("NeckTail", 3);
			RavenPotionEffectRegister.mediumIntellectEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mediumIntellectEffect).name = "SE_MediumIntellect";
			((StatusEffect)RavenPotionEffectRegister.mediumIntellectEffect).m_name = "$se_mediumintellect_name";
			((StatusEffect)RavenPotionEffectRegister.mediumIntellectEffect).m_tooltip = "$se_mediumintellect_tooltip";
			RavenPotionEffectRegister.mediumIntellectEffect.potionCategory = PotionCategory.Eitr;
			RavenPotionEffectRegister.mediumIntellectEffect.eitrExtra = 20f;
			((StatusEffect)RavenPotionEffectRegister.mediumIntellectEffect).m_ttl = 1200f;
			try
			{
				string text10 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MediumIntellectIcon.png");
				if (File.Exists(text10))
				{
					byte[] array10 = File.ReadAllBytes(text10);
					Texture2D val10 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val10, array10);
					((StatusEffect)RavenPotionEffectRegister.mediumIntellectEffect).m_icon = Sprite.Create(val10, new Rect(0f, 0f, (float)((Texture)val10).width, (float)((Texture)val10).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Medium Intellect en: " + text10));
				}
			}
			catch (Exception ex10)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex10.Message));
			}
			Item item10 = new Item("ravenwoodpotions", "RP_PotionMediumIntellect");
			item10.Name.English("Medium Intellect Potion");
			item10.Name.Spanish("Poción de Intelecto Media");
			item10.Description.English("Grants a medium boost to your maximum Eitr for 20 minutes.");
			item10.Description.Spanish("Otorga +20 de Eitr máximo durante 20 minutos.");
			ConfigEntry<Toggle> recipeIsActive10 = config("RP_PotionMediumIntellect", "IsRecipeEnabled", Toggle.On, "Enable recipe for Medium Intellect potion");
			item10.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive10;
			SharedData shared10 = item10.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared10.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mediumIntellectEffect;
			shared10.m_itemType = (ItemType)2;
			item10.Crafting.Add(CraftingTable.Cauldron, 2);
			item10.RequiredItems.Add("Essence_Fire", 5);
			item10.RequiredItems.Add("MushroomYellow", 5);
			item10.RequiredItems.Add("Blueberries", 5);
			item10.RequiredItems.Add("GreydwarfEye", 5);
			RavenPotionEffectRegister.majorIntellectEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.majorIntellectEffect).name = "SE_MajorIntellect";
			((StatusEffect)RavenPotionEffectRegister.majorIntellectEffect).m_name = "$se_majorintellect_name";
			((StatusEffect)RavenPotionEffectRegister.majorIntellectEffect).m_tooltip = "$se_majorintellect_tooltip";
			RavenPotionEffectRegister.majorIntellectEffect.potionCategory = PotionCategory.Eitr;
			RavenPotionEffectRegister.majorIntellectEffect.eitrExtra = 30f;
			((StatusEffect)RavenPotionEffectRegister.majorIntellectEffect).m_ttl = 1800f;
			try
			{
				string text11 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MajorIntellectIcon.png");
				if (File.Exists(text11))
				{
					byte[] array11 = File.ReadAllBytes(text11);
					Texture2D val11 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val11, array11);
					((StatusEffect)RavenPotionEffectRegister.majorIntellectEffect).m_icon = Sprite.Create(val11, new Rect(0f, 0f, (float)((Texture)val11).width, (float)((Texture)val11).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Major Intellect en: " + text11));
				}
			}
			catch (Exception ex11)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex11.Message));
			}
			Item item11 = new Item("ravenwoodpotions", "RP_PotionMajorIntellect");
			item11.Name.English("Major Intellect Potion");
			item11.Name.Spanish("Poción de Intelecto Mayor");
			item11.Description.English("Grants a major boost to your maximum Eitr for 30 minutes.");
			item11.Description.Spanish("Otorga +30 de Eitr máximo durante 30 minutos.");
			ConfigEntry<Toggle> recipeIsActive11 = config("RP_PotionMajorIntellect", "IsRecipeEnabled", Toggle.On, "Enable recipe for Major Intellect potion");
			item11.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive11;
			SharedData shared11 = item11.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared11.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.majorIntellectEffect;
			shared11.m_itemType = (ItemType)2;
			item11.Crafting.Add(CraftingTable.Cauldron, 3);
			item11.RequiredItems.Add("Essence_Fire", 8);
			item11.RequiredItems.Add("MushroomBlue", 8);
			item11.RequiredItems.Add("Cloudberry", 8);
			item11.RequiredItems.Add("FreezeGland", 8);
			RavenPotionEffectRegister.mythicIntellectEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mythicIntellectEffect).name = "SE_MythicIntellect";
			((StatusEffect)RavenPotionEffectRegister.mythicIntellectEffect).m_name = "$se_mythicintellect_name";
			((StatusEffect)RavenPotionEffectRegister.mythicIntellectEffect).m_tooltip = "$se_mythicintellect_tooltip";
			RavenPotionEffectRegister.mythicIntellectEffect.potionCategory = PotionCategory.Eitr;
			RavenPotionEffectRegister.mythicIntellectEffect.eitrExtra = 40f;
			((StatusEffect)RavenPotionEffectRegister.mythicIntellectEffect).m_ttl = 3600f;
			try
			{
				string text12 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MythicIntellectIcon.png");
				if (File.Exists(text12))
				{
					byte[] array12 = File.ReadAllBytes(text12);
					Texture2D val12 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val12, array12);
					((StatusEffect)RavenPotionEffectRegister.mythicIntellectEffect).m_icon = Sprite.Create(val12, new Rect(0f, 0f, (float)((Texture)val12).width, (float)((Texture)val12).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Mythic Intellect en: " + text12));
				}
			}
			catch (Exception ex12)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex12.Message));
			}
			Item item12 = new Item("ravenwoodpotions", "RP_PotionMythicIntellect");
			item12.Name.English("Mythic Intellect Potion");
			item12.Name.Spanish("Poción de Intelecto Mítica");
			item12.Description.English("Grants a mythic boost to your maximum Eitr for 1 hour.");
			item12.Description.Spanish("Otorga +40 de Eitr máximo durante 1 hora.");
			ConfigEntry<Toggle> recipeIsActive12 = config("RP_PotionMythicIntellect", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mythic Intellect potion");
			item12.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive12;
			SharedData shared12 = item12.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared12.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mythicIntellectEffect;
			shared12.m_itemType = (ItemType)2;
			item12.Crafting.Add(CraftingTable.Cauldron, 4);
			item12.RequiredItems.Add("Essence_Fire", 10);
			item12.RequiredItems.Add("MushroomSmokePuff", 10);
			item12.RequiredItems.Add("Vineberry", 10);
			item12.RequiredItems.Add("MushroomMagecap", 10);
			RavenPotionEffectRegister.minorAgilityEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.minorAgilityEffect).name = "SE_MinorAgility";
			((StatusEffect)RavenPotionEffectRegister.minorAgilityEffect).m_name = "$se_minoragility_name";
			((StatusEffect)RavenPotionEffectRegister.minorAgilityEffect).m_tooltip = "$se_minoragility_tooltip";
			RavenPotionEffectRegister.minorAgilityEffect.potionCategory = PotionCategory.Stamina;
			RavenPotionEffectRegister.minorAgilityEffect.staminaExtra = 10f;
			((StatusEffect)RavenPotionEffectRegister.minorAgilityEffect).m_ttl = 600f;
			try
			{
				string text13 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MinorAgilityIcon.png");
				if (File.Exists(text13))
				{
					byte[] array13 = File.ReadAllBytes(text13);
					Texture2D val13 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val13, array13);
					((StatusEffect)RavenPotionEffectRegister.minorAgilityEffect).m_icon = Sprite.Create(val13, new Rect(0f, 0f, (float)((Texture)val13).width, (float)((Texture)val13).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Minor Agility en: " + text13));
				}
			}
			catch (Exception ex13)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex13.Message));
			}
			Item item13 = new Item("ravenwoodpotions", "RP_PotionMinorAgility");
			item13.Name.English("Minor Agility Potion");
			item13.Name.Spanish("Poción de Agilidad Menor");
			item13.Description.English("Grants a minor boost to your maximum Stamina for 10 minutes.");
			item13.Description.Spanish("Otorga +10 de Aguante máximo durante 10 minutos.");
			ConfigEntry<Toggle> recipeIsActive13 = config("RP_PotionMinorAgility", "IsRecipeEnabled", Toggle.On, "Enable recipe for Minor Agility potion");
			item13.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive13;
			SharedData shared13 = item13.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared13.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.minorAgilityEffect;
			shared13.m_itemType = (ItemType)2;
			item13.Crafting.Add(CraftingTable.Cauldron, 1);
			item13.RequiredItems.Add("Essence_Lightning", 3);
			item13.RequiredItems.Add("Mushroom", 3);
			item13.RequiredItems.Add("Raspberry", 3);
			item13.RequiredItems.Add("Honey", 3);
			RavenPotionEffectRegister.mediumAgilityEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mediumAgilityEffect).name = "SE_MediumAgility";
			((StatusEffect)RavenPotionEffectRegister.mediumAgilityEffect).m_name = "$se_mediumagility_name";
			((StatusEffect)RavenPotionEffectRegister.mediumAgilityEffect).m_tooltip = "$se_mediumagility_tooltip";
			RavenPotionEffectRegister.mediumAgilityEffect.potionCategory = PotionCategory.Stamina;
			RavenPotionEffectRegister.mediumAgilityEffect.staminaExtra = 20f;
			((StatusEffect)RavenPotionEffectRegister.mediumAgilityEffect).m_ttl = 1200f;
			try
			{
				string text14 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MediumAgilityIcon.png");
				if (File.Exists(text14))
				{
					byte[] array14 = File.ReadAllBytes(text14);
					Texture2D val14 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val14, array14);
					((StatusEffect)RavenPotionEffectRegister.mediumAgilityEffect).m_icon = Sprite.Create(val14, new Rect(0f, 0f, (float)((Texture)val14).width, (float)((Texture)val14).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Medium Agility en: " + text14));
				}
			}
			catch (Exception ex14)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex14.Message));
			}
			Item item14 = new Item("ravenwoodpotions", "RP_PotionMediumAgility");
			item14.Name.English("Medium Agility Potion");
			item14.Name.Spanish("Poción de Agilidad Media");
			item14.Description.English("Grants a medium boost to your maximum Stamina for 20 minutes.");
			item14.Description.Spanish("Otorga +20 de Aguante máximo durante 20 minutos.");
			ConfigEntry<Toggle> recipeIsActive14 = config("RP_PotionMediumAgility", "IsRecipeEnabled", Toggle.On, "Enable recipe for Medium Agility potion");
			item14.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive14;
			SharedData shared14 = item14.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared14.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mediumAgilityEffect;
			shared14.m_itemType = (ItemType)2;
			item14.Crafting.Add(CraftingTable.Cauldron, 2);
			item14.RequiredItems.Add("Essence_Lightning", 5);
			item14.RequiredItems.Add("MushroomYellow", 5);
			item14.RequiredItems.Add("Blueberries", 5);
			item14.RequiredItems.Add("Carrot", 5);
			RavenPotionEffectRegister.majorAgilityEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.majorAgilityEffect).name = "SE_MajorAgility";
			((StatusEffect)RavenPotionEffectRegister.majorAgilityEffect).m_name = "$se_majoragility_name";
			((StatusEffect)RavenPotionEffectRegister.majorAgilityEffect).m_tooltip = "$se_majoragility_tooltip";
			RavenPotionEffectRegister.majorAgilityEffect.potionCategory = PotionCategory.Stamina;
			RavenPotionEffectRegister.majorAgilityEffect.staminaExtra = 30f;
			((StatusEffect)RavenPotionEffectRegister.majorAgilityEffect).m_ttl = 1800f;
			try
			{
				string text15 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MajorAgilityIcon.png");
				if (File.Exists(text15))
				{
					byte[] array15 = File.ReadAllBytes(text15);
					Texture2D val15 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val15, array15);
					((StatusEffect)RavenPotionEffectRegister.majorAgilityEffect).m_icon = Sprite.Create(val15, new Rect(0f, 0f, (float)((Texture)val15).width, (float)((Texture)val15).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Major Agility en: " + text15));
				}
			}
			catch (Exception ex15)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex15.Message));
			}
			Item item15 = new Item("ravenwoodpotions", "RP_PotionMajorAgility");
			item15.Name.English("Major Agility Potion");
			item15.Name.Spanish("Poción de Agilidad Mayor");
			item15.Description.English("Grants a major boost to your maximum Stamina for 30 minutes.");
			item15.Description.Spanish("Otorga +30 de Aguante máximo durante 30 minutos.");
			ConfigEntry<Toggle> recipeIsActive15 = config("RP_PotionMajorAgility", "IsRecipeEnabled", Toggle.On, "Enable recipe for Major Agility potion");
			item15.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive15;
			SharedData shared15 = item15.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared15.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.majorAgilityEffect;
			shared15.m_itemType = (ItemType)2;
			item15.Crafting.Add(CraftingTable.Cauldron, 3);
			item15.RequiredItems.Add("Essence_Lightning", 8);
			item15.RequiredItems.Add("MushroomBlue", 8);
			item15.RequiredItems.Add("Cloudberry", 8);
			item15.RequiredItems.Add("Onion", 8);
			RavenPotionEffectRegister.mythicAgilityEffect = ScriptableObject.CreateInstance<RavenPotionSe_Stats>();
			((Object)RavenPotionEffectRegister.mythicAgilityEffect).name = "SE_MythicAgility";
			((StatusEffect)RavenPotionEffectRegister.mythicAgilityEffect).m_name = "$se_mythicagility_name";
			((StatusEffect)RavenPotionEffectRegister.mythicAgilityEffect).m_tooltip = "$se_mythicagility_tooltip";
			RavenPotionEffectRegister.mythicAgilityEffect.potionCategory = PotionCategory.Stamina;
			RavenPotionEffectRegister.mythicAgilityEffect.staminaExtra = 40f;
			((StatusEffect)RavenPotionEffectRegister.mythicAgilityEffect).m_ttl = 3600f;
			try
			{
				string text16 = Path.Combine(Paths.PluginPath, "RavenwoodPotionsIcons", "MythicAgilityIcon.png");
				if (File.Exists(text16))
				{
					byte[] array16 = File.ReadAllBytes(text16);
					Texture2D val16 = new Texture2D(2, 2);
					ImageConversion.LoadImage(val16, array16);
					((StatusEffect)RavenPotionEffectRegister.mythicAgilityEffect).m_icon = Sprite.Create(val16, new Rect(0f, 0f, (float)((Texture)val16).width, (float)((Texture)val16).height), new Vector2(0.5f, 0.5f));
				}
				else
				{
					Debug.LogWarning((object)("No se encontró el ícono de Mythic Agility en: " + text16));
				}
			}
			catch (Exception ex16)
			{
				Debug.LogError((object)("Error al cargar el ícono: " + ex16.Message));
			}
			Item item16 = new Item("ravenwoodpotions", "RP_PotionMythicAgility");
			item16.Name.English("Mythic Agility Potion");
			item16.Name.Spanish("Poción de Agilidad Mítica");
			item16.Description.English("Grants a mythic boost to your maximum Stamina for 1 hour.");
			item16.Description.Spanish("Otorga +40 de Aguante máximo durante 1 hora.");
			ConfigEntry<Toggle> recipeIsActive16 = config("RP_PotionMythicAgility", "IsRecipeEnabled", Toggle.On, "Enable recipe for Mythic Agility potion");
			item16.RecipeIsActive = (ConfigEntryBase?)(object)recipeIsActive16;
			SharedData shared16 = item16.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
			shared16.m_consumeStatusEffect = (StatusEffect)(object)RavenPotionEffectRegister.mythicAgilityEffect;
			shared16.m_itemType = (ItemType)2;
			item16.Crafting.Add(CraftingTable.Cauldron, 4);
			item16.RequiredItems.Add("Essence_Lightning", 10);
			item16.RequiredItems.Add("MushroomSmokePuff", 10);
			item16.RequiredItems.Add("Vineberry", 10);
			item16.RequiredItems.Add("RoyalJelly", 10);
			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
			{
				RavenwoodPotionsLogger.LogDebug((object)"ReadConfigValues called");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				RavenwoodPotionsLogger.LogError((object)("There was an issue loading your " + ConfigFileName));
				RavenwoodPotionsLogger.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 RavenWoodPotionsPlugin()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
			ConnectionError = "";
			RavenwoodPotionsLogger = Logger.CreateLogSource("RavenWoodPotions");
			ConfigSync = new ConfigSync("JamesJonesTV.RavenWoodPotions")
			{
				DisplayName = "RavenWoodPotions",
				CurrentVersion = "1.0.0",
				MinimumRequiredVersion = "1.0.0"
			};
			_serverConfigLocked = null;
			_recipeIsActiveConfig = null;
		}
	}
	public static class KeyboardExtensions
	{
		[SpecialName]
		public sealed class <G>$8D1D3E80A18AA9715780B6CB7003B2F1
		{
			[SpecialName]
			public static class <M>$895AB635D4D087636CF1C26BA650BA11
			{
			}

			[ExtensionMarker("<M>$895AB635D4D087636CF1C26BA650BA11")]
			public bool IsKeyDown()
			{
				throw new NotSupportedException();
			}

			[ExtensionMarker("<M>$895AB635D4D087636CF1C26BA650BA11")]
			public bool IsKeyHeld()
			{
				throw new NotSupportedException();
			}
		}

		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(ObjectDB), "Awake")]
	internal static class ObjectDBAwakePatch
	{
		private static void Postfix(ObjectDB __instance)
		{
			RavenPotionEffectRegister.RegisterCustomEffects(__instance);
		}
	}
	[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
	internal static class ObjectDBCopyOtherDBPatch
	{
		private static void Postfix(ObjectDB __instance)
		{
			RavenPotionEffectRegister.RegisterCustomEffects(__instance);
		}
	}
	internal static class RavenPotionEffectRegister
	{
		public static RavenPotionSe_Stats minorDefenseEffect;

		public static RavenPotionSe_Stats mediumDefenseEffect;

		public static RavenPotionSe_Stats majorDefenseEffect;

		public static RavenPotionSe_Stats mythicDefenseEffect;

		public static RavenPotionSe_Stats minorFortitudeEffect;

		public static RavenPotionSe_Stats mediumFortitudeEffect;

		public static RavenPotionSe_Stats majorFortitudeEffect;

		public static RavenPotionSe_Stats mythicFortitudeEffect;

		public static RavenPotionSe_Stats minorIntellectEffect;

		public static RavenPotionSe_Stats mediumIntellectEffect;

		public static RavenPotionSe_Stats majorIntellectEffect;

		public static RavenPotionSe_Stats mythicIntellectEffect;

		public static RavenPotionSe_Stats minorAgilityEffect;

		public static RavenPotionSe_Stats mediumAgilityEffect;

		public static RavenPotionSe_Stats majorAgilityEffect;

		public static RavenPotionSe_Stats mythicAgilityEffect;

		public static void RegisterCustomEffects(ObjectDB db)
		{
			ObjectDB db2 = db;
			if ((Object)(object)db2 == (Object)null || db2.m_StatusEffects == null)
			{
				return;
			}
			StatusEffect val = db2.m_StatusEffects.Find((StatusEffect se) => ((Object)se).name == "Potion_frostresist");
			StatusEffect val2 = db2.m_StatusEffects.Find((StatusEffect se) => ((Object)se).name == "Potion_poisonresist");
			StatusEffect val3 = db2.m_StatusEffects.Find((StatusEffect se) => ((Object)se).name == "Potion_health_lingering");
			StatusEffect val4 = db2.m_StatusEffects.Find((StatusEffect se) => ((Object)se).name == "Potion_stamina_medium");
			if ((Object)(object)val != (Object)null)
			{
				if ((Object)(object)minorDefenseEffect != (Object)null)
				{
					((StatusEffect)minorDefenseEffect).m_startEffects = val.m_startEffects;
				}
				if ((Object)(object)mediumDefenseEffect != (Object)null)
				{
					((StatusEffect)mediumDefenseEffect).m_startEffects = val.m_startEffects;
				}
				if ((Object)(object)majorDefenseEffect != (Object)null)
				{
					((StatusEffect)majorDefenseEffect).m_startEffects = val.m_startEffects;
				}
				if ((Object)(object)mythicDefenseEffect != (Object)null)
				{
					((StatusEffect)mythicDefenseEffect).m_startEffects = val.m_startEffects;
				}
			}
			if ((Object)(object)val2 != (Object)null)
			{
				if ((Object)(object)minorFortitudeEffect != (Object)null)
				{
					((StatusEffect)minorFortitudeEffect).m_startEffects = val2.m_startEffects;
				}
				if ((Object)(object)mediumFortitudeEffect != (Object)null)
				{
					((StatusEffect)mediumFortitudeEffect).m_startEffects = val2.m_startEffects;
				}
			}
			if ((Object)(object)val3 != (Object)null)
			{
				if ((Object)(object)minorIntellectEffect != (Object)null)
				{
					((StatusEffect)minorIntellectEffect).m_startEffects = val3.m_startEffects;
				}
				if ((Object)(object)mediumIntellectEffect != (Object)null)
				{
					((StatusEffect)mediumIntellectEffect).m_startEffects = val3.m_startEffects;
				}
				if ((Object)(object)majorIntellectEffect != (Object)null)
				{
					((StatusEffect)majorIntellectEffect).m_startEffects = val3.m_startEffects;
				}
				if ((Object)(object)mythicIntellectEffect != (Object)null)
				{
					((StatusEffect)mythicIntellectEffect).m_startEffects = val3.m_startEffects;
				}
			}
			if ((Object)(object)val4 != (Object)null)
			{
				if ((Object)(object)minorAgilityEffect != (Object)null)
				{
					((StatusEffect)minorAgilityEffect).m_startEffects = val4.m_startEffects;
				}
				if ((Object)(object)mediumAgilityEffect != (Object)null)
				{
					((StatusEffect)mediumAgilityEffect).m_startEffects = val4.m_startEffects;
				}
				if ((Object)(object)majorAgilityEffect != (Object)null)
				{
					((StatusEffect)majorAgilityEffect).m_startEffects = val4.m_startEffects;
				}
				if ((Object)(object)mythicAgilityEffect != (Object)null)
				{
					((StatusEffect)mythicAgilityEffect).m_startEffects = val4.m_startEffects;
				}
			}
			RegistrarEfectoSeguro((StatusEffect)(object)minorDefenseEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mediumDefenseEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)majorDefenseEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mythicDefenseEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)minorFortitudeEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mediumFortitudeEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)majorFortitudeEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mythicFortitudeEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)minorIntellectEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mediumIntellectEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)majorIntellectEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mythicIntellectEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)minorAgilityEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mediumAgilityEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)majorAgilityEffect);
			RegistrarEfectoSeguro((StatusEffect)(object)mythicAgilityEffect);
			void RegistrarEfectoSeguro(StatusEffect efecto)
			{
				if (!((Object)(object)efecto == (Object)null) && !string.IsNullOrEmpty(((Object)efecto).name) && !db2.m_StatusEffects.Contains(efecto))
				{
					db2.m_StatusEffects.Add(efecto);
				}
			}
		}
	}
	public enum PotionCategory
	{
		None,
		Heal,
		Armor,
		Stamina,
		Eitr
	}
	public class RavenPotionSe_Stats : SE_Stats
	{
		[Header("Configuración de la Poción")]
		public PotionCategory potionCategory = PotionCategory.None;

		[Header("Stats Otorgados (Añade a los base)")]
		public float healthExtra = 0f;

		public float staminaExtra = 0f;

		public float eitrExtra = 0f;

		public float armorExtra = 0f;

		public override string GetTooltipString()
		{
			string text = ((SE_Stats)this).GetTooltipString() ?? string.Empty;
			text = text.Replace("\n\n", "\n").TrimEnd('\n', '\r');
			StringBuilder stringBuilder = new StringBuilder(text);
			if (healthExtra > 0f)
			{
				stringBuilder.Append(string.Format("\n{0}: <color=red>+{1}</color>", Localization.instance.Localize("$se_health"), healthExtra));
			}
			if (staminaExtra > 0f)
			{
				stringBuilder.Append(string.Format("\n{0}: <color=yellow>+{1}</color>", Localization.instance.Localize("$se_stamina"), staminaExtra));
			}
			if (eitrExtra > 0f)
			{
				stringBuilder.Append(string.Format("\n{0}: <color=#8A8AFF>+{1}</color>", Localization.instance.Localize("$se_eitr"), eitrExtra));
			}
			if (armorExtra > 0f)
			{
				stringBuilder.Append(string.Format("\n{0}: <color=orange>+{1}</color>", Localization.instance.Localize("$se_armor"), armorExtra));
			}
			return stringBuilder.ToString();
		}
	}
	[HarmonyPatch(typeof(Player), "GetTotalFoodValue")]
	internal static class PlayerGetTotalFoodValuePatch
	{
		private static void Postfix(Player __instance, ref float hp, ref float stamina, ref float eitr)
		{
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
			foreach (StatusEffect statusEffect in ((Character)__instance).GetSEMan().GetStatusEffects())
			{
				if (statusEffect is RavenPotionSe_Stats ravenPotionSe_Stats)
				{
					if (ravenPotionSe_Stats.healthExtra > 0f)
					{
						hp += ravenPotionSe_Stats.healthExtra;
					}
					if (ravenPotionSe_Stats.staminaExtra > 0f)
					{
						stamina += ravenPotionSe_Stats.staminaExtra;
					}
					if (ravenPotionSe_Stats.eitrExtra > 0f)
					{
						eitr += ravenPotionSe_Stats.eitrExtra;
					}
				}
			}
		}
	}
	[HarmonyPatch(typeof(Player), "GetBodyArmor")]
	internal static class PlayerGetBodyArmorPatch
	{
		private static void Postfix(Player __instance, ref float __result)
		{
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
			foreach (StatusEffect statusEffect in ((Character)__instance).GetSEMan().GetStatusEffects())
			{
				if (statusEffect is RavenPotionSe_Stats ravenPotionSe_Stats && ravenPotionSe_Stats.armorExtra > 0f)
				{
					__result += ravenPotionSe_Stats.armorExtra;
				}
			}
		}
	}
	[HarmonyPatch(typeof(Player), "ConsumeItem")]
	internal static class PlayerConsumeItemPatch
	{
		private static bool Prefix(Player __instance, Inventory inventory, ItemData item, ref bool __result)
		{
			if (item != null && item.m_shared != null && (Object)(object)item.m_shared.m_consumeStatusEffect != (Object)null && item.m_shared.m_consumeStatusEffect is RavenPotionSe_Stats ravenPotionSe_Stats)
			{
				foreach (StatusEffect statusEffect in ((Character)__instance).GetSEMan().GetStatusEffects())
				{
					if (statusEffect is RavenPotionSe_Stats ravenPotionSe_Stats2 && ravenPotionSe_Stats2.potionCategory != 0 && ravenPotionSe_Stats2.potionCategory == ravenPotionSe_Stats.potionCategory)
					{
						string arg = Localization.instance.Localize("$msg_potion_active_error");
						((Character)__instance).Message((MessageType)2, $"{arg} ({ravenPotionSe_Stats.potionCategory})", 0, (Sprite)null);
						__result = false;
						return false;
					}
				}
			}
			return true;
		}
	}
	[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
			RavenWoodPotionsPlugin.RavenwoodPotionsLogger.LogDebug((object)"Registering version RPC handler");
			peer.m_rpc.Register<ZPackage>("RavenWoodPotions_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_RavenWoodPotions_Version);
			RavenWoodPotionsPlugin.RavenwoodPotionsLogger.LogInfo((object)"Invoking version check");
			ZPackage val = new ZPackage();
			val.Write("1.0.0");
			peer.m_rpc.Invoke("RavenWoodPotions_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;
			}
			RavenWoodPotionsPlugin.RavenwoodPotionsLogger.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(), "RavenWoodPotionsRequestAdminSync", 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" + RavenWoodPotionsPlugin.ConnectionError;
			}
		}
	}
	[HarmonyPatch(typeof(ZNet), "Disconnect")]
	public static class RemoveDisconnectedPeerFromVerified
	{
		private static void Prefix(ZNetPeer peer, ref ZNet __instance)
		{
			if (__instance.IsServer())
			{
				RavenWoodPotionsPlugin.RavenwoodPotionsLogger.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_RavenWoodPotions_Version(ZRpc rpc, ZPackage pkg)
		{
			string text = pkg.ReadString();
			RavenWoodPotionsPlugin.RavenwoodPotionsLogger.LogInfo((object)("Version check, local: 1.0.0,  remote: " + text));
			if (text != "1.0.0")
			{
				RavenWoodPotionsPlugin.ConnectionError = "RavenWoodPotions Installed: 1.0.0\n Needed: " + text;
				if (ZNet.instance.IsServer())
				{
					RavenWoodPotionsPlugin.RavenwoodPotionsLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting..."));
					rpc.Invoke("Error", new object[1] { 3 });
				}
			}
			else if (!ZNet.instance.IsServer())
			{
				RavenWoodPotionsPlugin.RavenwoodPotionsLogger.LogInfo((object)"Received same version from server!");
			}
			else
			{
				RavenWoodPotionsPlugin.RavenwoodPotionsLogger.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 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;
			}
		}

		public static event Action? OnLocalizationComplete;

		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()
		{
			_ = plugin;
		}

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

		public static void SafeCallLocalizeComplete()
		{
			Localizer.OnLocalizationComplete?.Invoke();
		}

		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[] array = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' });
				if (array.Length >= 2)
				{
					string text = array[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[] array2 = LoadTranslationFromAssembly("English");
			if (array2 == 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(array2));
			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.TryGetValue(language, out var value))
				{
					text2 = File.ReadAllText(value);
				}
				else
				{
					byte[] array3 = LoadTranslationFromAssembly(language);
					if (array3 != null)
					{
						text2 = Encoding.UTF8.GetString(array3);
					}
				}
			}
			if (text2 == null && dictionary.TryGetValue("English", out var value2))
			{
				text2 = File.ReadAllText(value2);
			}
			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_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: 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>(2) { ".json", ".yml" };
			Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager");
			val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "SetupGui", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalizationLater", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "SafeCallLocalizeComplete", (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();
		}
	}
	public static class LocalizationManagerVersion
	{
		public const string Version = "1.4.1";
	}
}
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 <amountField>5__2;

			private int <i>5__3;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<instrs>5__1 = null;
				<amountField>5__2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0179: Unknown result type (might be due to invalid IL or missing references)
				//IL_0183: Expected O, but got Unknown
				//IL_01af: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b9: Expected O, but got Unknown
				//IL_0143: Unknown result type (might be due to invalid IL or missing references)
				//IL_014d: Expected O, but got Unknown
				int num;
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<instrs>5__1 = instructions.ToList();
					<amountField>5__2 = AccessTools.DeclaredField(typeof(Recipe), "m_amount");
					<i>5__3 = 0;
					break;
				case 1:
					<>1__state = -1;
					if (<i>5__3 > 1 && <instrs>5__1[<i>5__3 - 2].opcode == OpCodes.Ldfld && CodeInstructionExtensions.OperandIs(<instrs>5__1[<i>5__3 - 2], (MemberInfo)<amountField>5__2) && <instrs>5__1[<i>5__3 - 1].opcode == OpCodes.Ldc_I4_1 && <instrs>5__1[<i>5__3].operand is Label)
					{
						<>2__current = new CodeInstruction(OpCodes.Ldarg_0, (object)null);
						<>1__state = 2;
						return true;
					}
					goto IL_01ca;
				case 2:
					<>1__state = -1;
					<>2__current = new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(Item), "CheckItemIsUpgrade", (Type[])null, (Type[])null));
					<>1__state = 3;
					return true;
				case 3:
					<>1__state = -1;
					<>2__current = new CodeInstruction(OpCodes.Brtrue, <instrs>5__1[<i>5__3].operand);
					<>1__state = 4;
					return true;
				case 4:
					{
						<>1__state = -1;
						goto IL_01ca;
					}
					IL_01ca:
					num = <i>5__3 + 1;
					<i>5__3 = num;
					break;
				}
				if (<i>5__3 < <instrs>5__1.Count)
				{
					<>2__current = <instrs>5__1[<i>5__3];
					<>1__state = 1;
					return true;
				}
				return false;
			}

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

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

			[DebuggerHidden]
			IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
			{
				<Transpile_InventoryGui>d__85 <Transpile_InventoryGui>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<Transpile_InventoryGui>d__ = this;
				}
				else
				{
					<Transpile_InventoryGui>d__ = new <Transpile_InventoryGui>d__85(0);
				}
				<Transpile_InventoryGui>d__.instructions = <>3__instructions;
				return <Transpile_InventoryGui>d__;
			}

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

		private static readonly List<Item> registeredItems = new List<Item>();

		private static readonly Dictionary<ItemDrop, Item> itemDropMap = new Dictionary<ItemDrop, Item>();

		private static Dictionary<Item, Dictionary<string, List<Recipe>>> activeRecipes = new Dictionary<Item, Dictionary<string, List<Recipe>>>();

		private static Dictionary<Recipe, ConfigEntryBase?> hiddenCraftRecipes = new Dictionary<Recipe, ConfigEntryBase>();

		private static Dictionary<Recipe, ConfigEntryBase?> hiddenUpgradeRecipes = new Dictionary<Recipe, ConfigEntryBase>();

		private static Dictionary<Item, Dictionary<string, ItemConfig>> itemCraftConfigs = new Dictionary<Item, Dictionary<string, ItemConfig>>();

		private static Dictionary<Item, ConfigEntry<string>> itemDropConfigs = new Dictionary<Item, ConfigEntry<string>>();

		private Dictionary<CharacterDrop, Drop> characterDrops = new Dictionary<CharacterDrop, Drop>();

		private readonly Dictionary<ConfigEntryBase, Action> statsConfigs = new Dictionary<ConfigEntryBase, Action>();

		private static readonly ConditionalWeakTable<Requirement, RequirementQuality> requirementQuality = new ConditionalWeakTable<Requirement, RequirementQuality>();

		public static Configurability DefaultConfigurability = Configurability.Full;

		public Configurability? Configurable = null;

		private Configurability configurationVisible = Configurability.Full;

		private TraderConfig? traderConfig;

		public readonly GameObject Prefab;

		[Description("Specifies the maximum required crafting station level to upgrade and repair the item.\nDefault is calculated from crafting station level and maximum quality.")]
		public int MaximumRequiredStationLevel = int.MaxValue;

		[Description("Assigns the item as a drop item to a creature.\nUses a creature name, a drop chance and a minimum and maximum amount.")]
		public readonly DropTargets DropsFrom = new DropTargets();

		[Description("Configures whether the item can be bought at the trader.\nDon't forget to set cost to something above 0 or the item will be sold for free.")]
		public readonly Trade Trade = new Trade();

		internal List<Conversion> Conversions = new List<Conversion>();

		internal List<ItemConversion> conversions = new List<ItemConversion>();

		public Dictionary<string, ItemRecipe> Recipes = new Dictionary<string, ItemRecipe>();

		private LocalizeKey? _name;

		private LocalizeKey? _description;

		private static object? configManager;

		private static Localization? _english;

		private static BaseUnityPlugin? _plugin;

		private static bool hasConfigSync = true;

		private static object? _configSync;

		private Configurability configurability => Configurable ?? DefaultConfigurability;

		[Description("Specifies the resources needed to craft the item.\nUse .Add to add resources with their internal ID and an amount.\nUse one .Add for each resource type the item should need.")]
		public RequiredResourceList RequiredItems => this[""].RequiredItems;

		[Description("Specifies the resources needed to upgrade the item.\nUse .Add to add resources with their internal ID and an amount. This amount will be multipled by the item quality level.\nUse one .Add for each resource type the upgrade should need.")]
		public RequiredResourceList RequiredUpgradeItems => this[""].RequiredUpgradeItems;

		[Description("Specifies the crafting station needed to craft the item.\nUse .Add to add a crafting station, using the CraftingTable enum and a minimum level for the crafting station.\nUse one .Add for each crafting station.")]
		public CraftingStationList Crafting => this[""].Crafting;

		[Description("Specifies a config entry which toggles whether a recipe is active.")]
		public ConfigEntryBase? RecipeIsActive
		{
			get
			{
				return this[""].RecipeIsActive;
			}
			set
			{
				this[""].RecipeIsActive = value;
			}
		}

		[Description("Specifies the number of items that should be given to the player with a single craft of the item.\nDefaults to 1.")]
		public int CraftAmount
		{
			get
			{
				return this[""].CraftAmount;
			}
			set
			{
				this[""].CraftAmount = value;
			}
		}

		public bool RequireOnlyOneIngredient
		{
			get
			{
				return this[""].RequireOnlyOneIngredient;
			}
			set
			{
				this[""].RequireOnlyOneIngredient = value;
			}
		}

		public float QualityResultAmountMultiplier
		{
			get
			{
				return this[""].QualityResultAmountMultiplier;
			}
			set
			{
				this[""].QualityResultAmountMultiplier = value;
			}
		}

		public ItemRecipe this[string name]
		{
			get
			{
				if (Recipes.TryGetValue(name, out ItemRecipe value))
				{
					return value;
				}
				return Recipes[name] = new ItemRecipe();
			}
		}

		public LocalizeKey Name
		{
			get
			{
				LocalizeKey name = _name;
				if (name != null)
				{
					return name;
				}
				SharedData shared = Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
				if (shared.m_name.StartsWith("$"))
				{
					_name = new LocalizeKey(shared.m_name);
				}
				else
				{
					string text = "$item_" + ((Object)Prefab).name.Replace(" ", "_");
					_name = new LocalizeKey(text).English(shared.m_name);
					shared.m_name = text;
				}
				return _name;
			}
		}

		public LocalizeKey Description
		{
			get
			{
				LocalizeKey description = _description;
				if (description != null)
				{
					return description;
				}
				SharedData shared = Prefab.GetComponent<ItemDrop>().m_itemData.m_shared;
				if (shared.m_description.StartsWith("$"))
				{
					_description = new LocalizeKey(shared.m_description);
				}
				else
				{
					string text = "$itemdesc_" + ((Object)Prefab).name.Replace(" ", "_");
					_description = new LocalizeKey(text).English(shared.m_description);
					shared.m_description = text;
				}
				return _description;
			}
		}

		private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English"));

		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 object? configSync
		{
			get
			{
				if (_configSync == null && hasConfigSync)
				{
					Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync");
					if ((object)type != null)
					{
						_configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " ItemManager");
						type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString());
						type.GetProperty("IsLocked").SetValue(_configSync, true);
					}
					else
					{
						hasConfigSync = false;
					}
				}
				return _configSync;
			}
		}

		public Item(string assetBundleFileName, string prefabName, string folderName = "assets")
			: this(PrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName)
		{
		}

		public Item(AssetBundle bundle, string prefabName)
			: this(PrefabManager.RegisterPrefab(bundle, prefabName, addToObjectDb: true), skipRegistering: true)
		{
		}

		public Item(GameObject prefab, bool skipRegistering = false)
		{
			if (!skipRegistering)
			{
				PrefabManager.RegisterPrefab(prefab, addToObjectDb: true);
			}
			Prefab = prefab;
			registeredItems.Add(this);
			itemDropMap[Prefab.GetComponent<ItemDrop>()] = this;
			Prefab.GetComponent<ItemDrop>().m_itemData.m_dropPrefab = Prefab;
		}

		public void ToggleConfigurationVisibility(Configurability visible)
		{
			configurat