Decompiled source of ValheimCuisine v2.1.9

ValheimCuisine.dll

Decompiled a week 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.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using CreatureManager;
using HarmonyLib;
using ItemManager;
using JetBrains.Annotations;
using LocalizationManager;
using Microsoft.CodeAnalysis;
using PieceManager;
using ServerSync;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.BufferedDeserialization;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators;
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("ValheimCuisine")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("ValheimCuisine")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("E0E2F92E-557C-4A05-9D89-AA92A0BD75C4")]
[assembly: AssemblyFileVersion("2.1.9")]
[assembly: AssemblyCompany("XutzBR")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.1.9.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[<6af8e642-bf72-4a2b-ad24-b42695e48710>Embedded]
	internal sealed class <6af8e642-bf72-4a2b-ad24-b42695e48710>EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	[<6af8e642-bf72-4a2b-ad24-b42695e48710>Embedded]
	[CompilerGenerated]
	internal sealed class <2a4a1169-5495-481c-80ef-84438e1fc47b>NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public <2a4a1169-5495-481c-80ef-84438e1fc47b>NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public <2a4a1169-5495-481c-80ef-84438e1fc47b>NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	[<6af8e642-bf72-4a2b-ad24-b42695e48710>Embedded]
	[CompilerGenerated]
	internal sealed class <9978fd04-0aae-4412-8ace-26389168e076>NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public <9978fd04-0aae-4412-8ace-26389168e076>NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace ValheimCuisine
{
	[BepInPlugin("XutzBR.ValheimCuisine", "ValheimCuisine", "2.1.9")]
	[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(1)]
	[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
	public class ValheimCuisinePlugin : BaseUnityPlugin
	{
		[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)]
		public enum Toggle
		{
			On = 1,
			Off = 0
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)]
		private static class TheFarmerZNetScene_AwakePost_Patch
		{
			[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(1)]
			private static void Postfix(ZNetScene __instance)
			{
				//IL_0097: Unknown result type (might be due to invalid IL or missing references)
				//IL_009c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: 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_00e6: Expected O, but got Unknown
				//IL_0121: Unknown result type (might be due to invalid IL or missing references)
				//IL_0126: Unknown result type (might be due to invalid IL or missing references)
				//IL_0131: Unknown result type (might be due to invalid IL or missing references)
				//IL_014e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0170: Expected O, but got Unknown
				//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_01fa: Expected O, but got Unknown
				//IL_0235: Unknown result type (might be due to invalid IL or missing references)
				//IL_023a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0245: Unknown result type (might be due to invalid IL or missing references)
				//IL_0262: Unknown result type (might be due to invalid IL or missing references)
				//IL_0284: Expected O, but got Unknown
				//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_030e: Expected O, but got Unknown
				//IL_0349: Unknown result type (might be due to invalid IL or missing references)
				//IL_034e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0359: Unknown result type (might be due to invalid IL or missing references)
				//IL_0376: Unknown result type (might be due to invalid IL or missing references)
				//IL_0398: Expected O, but got Unknown
				//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_03d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_03df: Unknown result type (might be due to invalid IL or missing references)
				//IL_03fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_041e: Expected O, but got Unknown
				if ((Object)(object)__instance == (Object)null)
				{
					return;
				}
				List<GameObject> prefabs = __instance.m_prefabs;
				if (prefabs == null || prefabs.Count <= 0)
				{
					return;
				}
				CookingStation component = __instance.GetPrefab("piece_cookingstation").GetComponent<CookingStation>();
				CookingStation component2 = __instance.GetPrefab("piece_cookingstation_iron").GetComponent<CookingStation>();
				CookingStation component3 = __instance.GetPrefab("piece_oven").GetComponent<CookingStation>();
				Fermenter component4 = __instance.GetPrefab("fermenter").GetComponent<Fermenter>();
				foreach (KeyValuePair<GameObject, GameObject> item in VC_Station_Normal)
				{
					component.m_conversion.Add(new ItemConversion
					{
						m_cookTime = 40f,
						m_from = __instance.GetPrefab(((Object)item.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item.Value).name).GetComponent<ItemDrop>()
					});
				}
				foreach (KeyValuePair<GameObject, GameObject> item2 in VC_Station_Iron_40)
				{
					component2.m_conversion.Add(new ItemConversion
					{
						m_cookTime = 40f,
						m_from = __instance.GetPrefab(((Object)item2.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item2.Value).name).GetComponent<ItemDrop>()
					});
				}
				foreach (KeyValuePair<GameObject, GameObject> item3 in VC_Station_Iron_60)
				{
					component2.m_conversion.Add(new ItemConversion
					{
						m_cookTime = 60f,
						m_from = __instance.GetPrefab(((Object)item3.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item3.Value).name).GetComponent<ItemDrop>()
					});
				}
				foreach (KeyValuePair<GameObject, GameObject> item4 in VC_Oven_50)
				{
					component3.m_conversion.Add(new ItemConversion
					{
						m_cookTime = 50f,
						m_from = __instance.GetPrefab(((Object)item4.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item4.Value).name).GetComponent<ItemDrop>()
					});
				}
				foreach (KeyValuePair<GameObject, GameObject> item5 in VC_Oven_60)
				{
					component3.m_conversion.Add(new ItemConversion
					{
						m_cookTime = 60f,
						m_from = __instance.GetPrefab(((Object)item5.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item5.Value).name).GetComponent<ItemDrop>()
					});
				}
				foreach (KeyValuePair<GameObject, GameObject> item6 in VC_Oven_80)
				{
					component3.m_conversion.Add(new ItemConversion
					{
						m_cookTime = 80f,
						m_from = __instance.GetPrefab(((Object)item6.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item6.Value).name).GetComponent<ItemDrop>()
					});
				}
				foreach (KeyValuePair<GameObject, GameObject> item7 in VC_Fermenter)
				{
					component4.m_conversion.Add(new ItemConversion
					{
						m_producedItems = 6,
						m_from = __instance.GetPrefab(((Object)item7.Key).name).GetComponent<ItemDrop>(),
						m_to = __instance.GetPrefab(((Object)item7.Value).name).GetComponent<ItemDrop>()
					});
				}
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		public static class GullDropsPatch
		{
			public static void Postfix(ZNetScene __instance)
			{
				GameObject prefab = __instance.GetPrefab("Seagal");
				if ((Object)(object)prefab == (Object)null)
				{
					Debug.LogWarning((object)"[BirdDroppings] Seagal prefab not found.");
					return;
				}
				DropOnDestroyed component = prefab.GetComponent<DropOnDestroyed>();
				if ((Object)(object)component == (Object)null)
				{
					Debug.LogWarning((object)"[BirdDroppings] Seagal has no DropOnDestroyed component.");
					return;
				}
				AddDrop(component, "VC_BirdMeat", 1, 1, 1f);
				component.m_dropWhenDestroyed.m_dropMin = component.m_dropWhenDestroyed.m_drops.Count;
				component.m_dropWhenDestroyed.m_dropMax = component.m_dropWhenDestroyed.m_drops.Count;
				component.m_dropWhenDestroyed.m_oneOfEach = true;
				Debug.Log((object)$"[BirdDroppings] Seagal will now drop {component.m_dropWhenDestroyed.m_drops.Count} items every time.");
			}

			private static void AddDrop(DropOnDestroyed seagalDrop, string itemName, int min, int max, float weight)
			{
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemName);
				if ((Object)(object)itemPrefab == (Object)null)
				{
					Debug.LogWarning((object)("[BirdDroppings] Item prefab '" + itemName + "' not found."));
					return;
				}
				DropData val = default(DropData);
				val.m_item = itemPrefab;
				val.m_stackMin = min;
				val.m_stackMax = max;
				val.m_weight = weight;
				DropData item = val;
				seagalDrop.m_dropWhenDestroyed.m_drops.Add(item);
				Debug.Log((object)$"[BirdDroppings] Added {itemName} x{min}-{max} to Seagal drops.");
			}
		}

		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		public static class CrowDropsPatch
		{
			public static void Postfix(ZNetScene __instance)
			{
				GameObject prefab = __instance.GetPrefab("Crow");
				if ((Object)(object)prefab == (Object)null)
				{
					Debug.LogWarning((object)"[BirdDroppings] Crow prefab not found.");
					return;
				}
				DropOnDestroyed component = prefab.GetComponent<DropOnDestroyed>();
				if ((Object)(object)component == (Object)null)
				{
					Debug.LogWarning((object)"[BirdDroppings] Crow has no DropOnDestroyed component.");
					return;
				}
				AddDrop(component, "VC_BirdMeat", 1, 1, 1f);
				component.m_dropWhenDestroyed.m_dropMin = component.m_dropWhenDestroyed.m_drops.Count;
				component.m_dropWhenDestroyed.m_dropMax = component.m_dropWhenDestroyed.m_drops.Count;
				component.m_dropWhenDestroyed.m_oneOfEach = true;
				Debug.Log((object)$"[BirdDroppings] Crow will now drop {component.m_dropWhenDestroyed.m_drops.Count} items every time.");
			}

			private static void AddDrop(DropOnDestroyed crowDrop, string itemName, int min, int max, float weight)
			{
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemName);
				if ((Object)(object)itemPrefab == (Object)null)
				{
					Debug.LogWarning((object)("[BirdDroppings] Item prefab '" + itemName + "' not found."));
					return;
				}
				DropData val = default(DropData);
				val.m_item = itemPrefab;
				val.m_stackMin = min;
				val.m_stackMax = max;
				val.m_weight = weight;
				DropData item = val;
				crowDrop.m_dropWhenDestroyed.m_drops.Add(item);
				Debug.Log((object)$"[BirdDroppings] Added {itemName} x{min}-{max} to Crow drops.");
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		public static class ashcrowDropsPatch
		{
			public static void Postfix(ZNetScene __instance)
			{
				GameObject prefab = __instance.GetPrefab("AshCrow");
				if ((Object)(object)prefab == (Object)null)
				{
					Debug.LogWarning((object)"[BirdDroppings] AshCrow prefab not found.");
					return;
				}
				DropOnDestroyed component = prefab.GetComponent<DropOnDestroyed>();
				if ((Object)(object)component == (Object)null)
				{
					Debug.LogWarning((object)"[BirdDroppings] AshCrow has no DropOnDestroyed component.");
					return;
				}
				AddDrop(component, "VC_BirdMeat", 1, 1, 1f);
				component.m_dropWhenDestroyed.m_dropMin = component.m_dropWhenDestroyed.m_drops.Count;
				component.m_dropWhenDestroyed.m_dropMax = component.m_dropWhenDestroyed.m_drops.Count;
				component.m_dropWhenDestroyed.m_oneOfEach = true;
				Debug.Log((object)$"[BirdDroppings] AshCrow will now drop {component.m_dropWhenDestroyed.m_drops.Count} items every time.");
			}

			private static void AddDrop(DropOnDestroyed ashcrowDrop, string itemName, int min, int max, float weight)
			{
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemName);
				if ((Object)(object)itemPrefab == (Object)null)
				{
					Debug.LogWarning((object)("[BirdDroppings] Item prefab '" + itemName + "' not found."));
					return;
				}
				DropData val = default(DropData);
				val.m_item = itemPrefab;
				val.m_stackMin = min;
				val.m_stackMax = max;
				val.m_weight = weight;
				DropData item = val;
				ashcrowDrop.m_dropWhenDestroyed.m_drops.Add(item);
				Debug.Log((object)$"[BirdDroppings] Added {itemName} x{min}-{max} to AshCrow drops.");
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)]
		public static class GrimpyPatch
		{
			[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(1)]
			private static void Postfix(ZNetScene __instance)
			{
				if ((Object)(object)__instance == (Object)null)
				{
					return;
				}
				List<GameObject> prefabs = __instance.m_prefabs;
				if (prefabs == null || prefabs.Count <= 0)
				{
					return;
				}
				GameObject prefab = __instance.GetPrefab("VC_VolvaCauldron_ext4");
				if ((Object)(object)prefab != (Object)null)
				{
					Piece componentInChildren = prefab.GetComponentInChildren<Piece>();
					GameObject val = (((Object)(object)componentInChildren != (Object)null) ? ((Component)componentInChildren).gameObject : prefab);
					if ((Object)(object)val.GetComponent<GrimpyInteraction>() == (Object)null)
					{
						val.AddComponent<GrimpyInteraction>();
						ValheimCuisineLogger.LogInfo((object)("GrimpyInteraction component added to " + ((Object)val).name));
					}
					if ((Object)(object)val.GetComponent<ZNetView>() == (Object)null)
					{
						val.AddComponent<ZNetView>();
						ValheimCuisineLogger.LogInfo((object)("ZNetView component added to " + ((Object)val).name));
					}
				}
				else
				{
					ValheimCuisineLogger.LogWarning((object)"Could not find VC_VolvaCauldron_ext4 prefab");
				}
			}
		}

		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		public class GrimpyInteraction : MonoBehaviour, Interactable, Hoverable
		{
			private ZNetView m_nview = null;

			private static ConfigEntry<float> _GrimpyInteractionCooldown = null;

			private static ConfigEntry<int> _GrimpyMinEctoplasm = null;

			private static ConfigEntry<int> _GrimpyMaxEctoplasm = null;

			[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(new byte[] { 1, 0, 1 })]
			private static readonly List<(string itemName, int minAmount, int maxAmount)> possibleDrops = new List<(string, int, int)> { ("Ectoplasm", 2, 5) };

			public static void InitializeConfig(ConfigFile config, ConfigSync configSync)
			{
				_GrimpyInteractionCooldown = config.Bind<float>("Grimpy", "Grimpy Cooldown Time", 1800f, "Cooldown time in seconds between Grimpy interactions.");
				_GrimpyMinEctoplasm = config.Bind<int>("Grimpy", "Min Ectoplasm Amount", 2, "Minimum amount of Ectoplasm that Grimpy can drop.");
				_GrimpyMaxEctoplasm = config.Bind<int>("Grimpy", "Max Ectoplasm Amount", 5, "Maximum amount of Ectoplasm that Grimpy can drop.");
				configSync.AddConfigEntry<float>(_GrimpyInteractionCooldown);
				configSync.AddConfigEntry<int>(_GrimpyMinEctoplasm);
				configSync.AddConfigEntry<int>(_GrimpyMaxEctoplasm);
			}

			private void Awake()
			{
				m_nview = ((Component)this).GetComponent<ZNetView>();
				if ((Object)(object)m_nview == (Object)null)
				{
					m_nview = ((Component)this).gameObject.AddComponent<ZNetView>();
				}
				ValheimCuisineLogger.LogInfo((object)("GrimpyInteraction Awake called on " + ((Object)((Component)this).gameObject).name));
			}

			private string GetPlayerCooldownKey(long playerID)
			{
				return $"playerCooldown_{playerID}";
			}

			private float GetPlayerLastInteraction(long playerID)
			{
				if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
				{
					return 0f;
				}
				string playerCooldownKey = GetPlayerCooldownKey(playerID);
				return m_nview.GetZDO().GetFloat(playerCooldownKey, 0f);
			}

			private void SetPlayerLastInteraction(long playerID, float time)
			{
				if (!((Object)(object)m_nview == (Object)null) && m_nview.IsValid())
				{
					string playerCooldownKey = GetPlayerCooldownKey(playerID);
					m_nview.GetZDO().Set(playerCooldownKey, time);
				}
			}

			public bool Interact(Humanoid user, bool hold, bool alt)
			{
				ValheimCuisineLogger.LogInfo((object)"Grimpy Interact called!");
				if (hold)
				{
					return false;
				}
				if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
				{
					ValheimCuisineLogger.LogWarning((object)"ZNetView is invalid");
					return false;
				}
				Player val = (Player)(object)((user is Player) ? user : null);
				if ((Object)(object)val == (Object)null)
				{
					ValheimCuisineLogger.LogWarning((object)"User is not a Player");
					return false;
				}
				long playerID = val.GetPlayerID();
				if (playerID == 0)
				{
					ValheimCuisineLogger.LogWarning((object)"Could not get player ID");
					return false;
				}
				float time = Time.time;
				float num = _GrimpyInteractionCooldown?.Value ?? 1800f;
				float playerLastInteraction = GetPlayerLastInteraction(playerID);
				if (time - playerLastInteraction < num)
				{
					float num2 = num - (time - playerLastInteraction);
					((Character)user).Message((MessageType)2, Localization.instance.Localize("$grimpy_brewing") + $" ({Mathf.CeilToInt(num2)}s)", 0, (Sprite)null);
					return false;
				}
				SpawnRandomItem(user);
				SetPlayerLastInteraction(playerID, time);
				return true;
			}

			private void SpawnRandomItem(Humanoid user)
			{
				//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0112: Unknown result type (might be due to invalid IL or missing references)
				string item = possibleDrops[Random.Range(0, possibleDrops.Count)].itemName;
				int num = _GrimpyMinEctoplasm?.Value ?? 2;
				int num2 = _GrimpyMaxEctoplasm?.Value ?? 5;
				int stack = Random.Range(num, num2 + 1);
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(item);
				if ((Object)(object)itemPrefab == (Object)null)
				{
					ValheimCuisineLogger.LogWarning((object)("Could not find prefab for " + item));
					((Character)user).Message((MessageType)2, Localization.instance.Localize("$grimpy_mysterious"), 0, (Sprite)null);
					return;
				}
				Vector3 val = ((Component)this).transform.position + Vector3.up * 1.5f;
				GameObject val2 = Object.Instantiate<GameObject>(itemPrefab, val, Quaternion.identity);
				ItemDrop component = val2.GetComponent<ItemDrop>();
				if ((Object)(object)component != (Object)null && component.m_itemData != null)
				{
					component.m_itemData.m_stack = stack;
					component.Save();
				}
				PlaySpawnEffects(val);
				((Character)user).Message((MessageType)2, Localization.instance.Localize("$grimpy_conjures"), 0, (Sprite)null);
			}

			private void PlaySpawnEffects(Vector3 position)
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				GameObject prefab = ZNetScene.instance.GetPrefab("sfx_build_hammer");
				if ((Object)(object)prefab != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab, position, Quaternion.identity);
				}
				GameObject prefab2 = ZNetScene.instance.GetPrefab("vfx_Place_wood_pole");
				if ((Object)(object)prefab2 != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab2, position, Quaternion.identity);
				}
			}

			public bool UseItem(Humanoid user, ItemData item)
			{
				return false;
			}

			public string GetHoverText()
			{
				string text = Localization.instance.Localize("$grimpy_name");
				if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
				{
					return text + "\n[<color=yellow><b>$KEY_Use</b></color>] " + Localization.instance.Localize("$grimpy_conjure");
				}
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer == (Object)null)
				{
					return text + "\n[<color=yellow><b>$KEY_Use</b></color>] " + Localization.instance.Localize("$grimpy_conjure");
				}
				long playerID = localPlayer.GetPlayerID();
				float time = Time.time;
				float num = _GrimpyInteractionCooldown?.Value ?? 1800f;
				float playerLastInteraction = GetPlayerLastInteraction(playerID);
				float num2 = time - playerLastInteraction;
				if (num2 < num)
				{
					float num3 = num - num2;
					return string.Format("{0}\n[<color=yellow><b>$KEY_Use</b></color>] {1} ({2}s)", text, Localization.instance.Localize("$grimpy_brewing_short"), Mathf.CeilToInt(num3));
				}
				return text + "\n[<color=yellow><b>$KEY_Use</b></color>] " + Localization.instance.Localize("$grimpy_conjure");
			}

			public string GetHoverName()
			{
				return Localization.instance.Localize("$grimpy_name");
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)]
		public static class RavenPatch
		{
			[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(1)]
			private static void Postfix(ZNetScene __instance)
			{
				if ((Object)(object)__instance == (Object)null)
				{
					return;
				}
				List<GameObject> prefabs = __instance.m_prefabs;
				if (prefabs == null || prefabs.Count <= 0)
				{
					return;
				}
				GameObject prefab = __instance.GetPrefab("VC_Freydis");
				if ((Object)(object)prefab != (Object)null)
				{
					Piece componentInChildren = prefab.GetComponentInChildren<Piece>();
					GameObject val = (((Object)(object)componentInChildren != (Object)null) ? ((Component)componentInChildren).gameObject : prefab);
					if ((Object)(object)val.GetComponent<RavenInteraction>() == (Object)null)
					{
						val.AddComponent<RavenInteraction>();
						ValheimCuisineLogger.LogInfo((object)("RavenInteraction component added to " + ((Object)val).name));
					}
					if ((Object)(object)val.GetComponent<ZNetView>() == (Object)null)
					{
						val.AddComponent<ZNetView>();
						ValheimCuisineLogger.LogInfo((object)("ZNetView component added to " + ((Object)val).name));
					}
				}
				else
				{
					ValheimCuisineLogger.LogWarning((object)"Could not find VC_Freydis prefab");
				}
			}
		}

		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		public class RavenInteraction : MonoBehaviour, Interactable, Hoverable
		{
			private ZNetView m_nview = null;

			[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(new byte[] { 1, 0, 1 })]
			private static List<(string itemName, int minAmount, int maxAmount, float dropChance)> possibleDrops = new List<(string, int, int, float)>();

			private static ConfigEntry<string> _RavenDropTable = null;

			private static ConfigEntry<float> _RavenInteractionCooldown = null;

			private static ConfigEntry<float> _RavenDoubleDropChance = null;

			private static ConfigEntry<float> _RavenTripleDropChance = null;

			public static void InitializeConfig(ConfigFile config, ConfigSync configSync)
			{
				string text = "Dandelion:3:6:100,Pukeberries:3:6:100,Thistle:3:6:80,GreydwarfEye:2:5:80,BoneFragments:2:5:80,MushroomBzerker:1:2:10,FragrantBundle:2:3:20,FreshSeaweed:2:3:20,CuredSquirrelHamstring:2:3:20,PowderedDragonEgg:2:3:15,PungentPebbles:2:3:20,Guck:2:5:60,Root:2:3:50,Bloodbag:2:5:80,Ooze:2:5:80,WolfFang:2:5:80,WolfClaw:2:5:50,FreezeGland:2:5:60,Tar:2:5:60,VC_LandvidiRoots:2:3:50,Sap:2:5:50,Bilebag:1:2:20,GiantBloodSack:2:5:50,Softtissue:2:3:20,CharcoalResin:2:5:20,SulfurStone:2:5:20,ProustitePowder:2:3:20,CharredBone:3:6:50,Charredskull:2:5:10,CelestialFeather:1:1:5";
				_RavenDropTable = config.Bind<string>("Raven", "DropTable", text, "Drop table for Raven. Format: ItemName:MinAmount:MaxAmount:DropChance (separate multiple items with commas). Example: Dandelion:3:6:100,Thistle:2:4:50");
				_RavenInteractionCooldown = config.Bind<float>("Raven", "Freydis Cooldown Time", 1800f, "Cooldown time in seconds between Freydis interactions.");
				_RavenDoubleDropChance = config.Bind<float>("Raven", "Double Drop Chance", 50f, "Chance (0-100%) to drop two different item types instead of one.");
				_RavenTripleDropChance = config.Bind<float>("Raven", "Triple Drop Chance", 25f, "Chance (0-100%) to drop three different item types instead of one.");
				configSync.AddConfigEntry<string>(_RavenDropTable);
				configSync.AddConfigEntry<float>(_RavenInteractionCooldown);
				configSync.AddConfigEntry<float>(_RavenDoubleDropChance);
				configSync.AddConfigEntry<float>(_RavenTripleDropChance);
				_RavenDropTable.SettingChanged += [<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)] (object _, EventArgs _) =>
				{
					ParseDropTable(_RavenDropTable.Value);
				};
				ParseDropTable(_RavenDropTable.Value);
			}

			private static void ParseDropTable(string dropTableString)
			{
				possibleDrops.Clear();
				if (string.IsNullOrWhiteSpace(dropTableString))
				{
					ValheimCuisineLogger.LogWarning((object)"Raven drop table is empty!");
					return;
				}
				string[] array = dropTableString.Split(new char[1] { ',' });
				string[] array2 = array;
				foreach (string text in array2)
				{
					string[] array3 = text.Trim().Split(new char[1] { ':' });
					if (array3.Length != 4)
					{
						ValheimCuisineLogger.LogWarning((object)("Invalid drop entry format: " + text + ". Expected format: ItemName:MinAmount:MaxAmount:DropChance"));
						continue;
					}
					string text2 = array3[0].Trim();
					int result2;
					float result3;
					if (!int.TryParse(array3[1], out var result))
					{
						ValheimCuisineLogger.LogWarning((object)("Invalid min amount for " + text2 + ": " + array3[1]));
					}
					else if (!int.TryParse(array3[2], out result2))
					{
						ValheimCuisineLogger.LogWarning((object)("Invalid max amount for " + text2 + ": " + array3[2]));
					}
					else if (!float.TryParse(array3[3], out result3))
					{
						ValheimCuisineLogger.LogWarning((object)("Invalid drop chance for " + text2 + ": " + array3[3]));
					}
					else
					{
						possibleDrops.Add((text2, result, result2, result3));
					}
				}
				ValheimCuisineLogger.LogInfo((object)$"Loaded {possibleDrops.Count} items into Raven drop table");
			}

			private void Awake()
			{
				m_nview = ((Component)this).GetComponent<ZNetView>();
				if ((Object)(object)m_nview == (Object)null)
				{
					m_nview = ((Component)this).gameObject.AddComponent<ZNetView>();
				}
				ValheimCuisineLogger.LogInfo((object)("RavenInteraction Awake called on " + ((Object)((Component)this).gameObject).name));
			}

			private string GetPlayerCooldownKey(long playerID)
			{
				return $"playerCooldown_{playerID}";
			}

			private float GetPlayerLastInteraction(long playerID)
			{
				if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
				{
					return 0f;
				}
				string playerCooldownKey = GetPlayerCooldownKey(playerID);
				return m_nview.GetZDO().GetFloat(playerCooldownKey, 0f);
			}

			private void SetPlayerLastInteraction(long playerID, float time)
			{
				if (!((Object)(object)m_nview == (Object)null) && m_nview.IsValid())
				{
					string playerCooldownKey = GetPlayerCooldownKey(playerID);
					m_nview.GetZDO().Set(playerCooldownKey, time);
				}
			}

			public bool Interact(Humanoid user, bool hold, bool alt)
			{
				ValheimCuisineLogger.LogInfo((object)"Raven Interact called!");
				if (hold)
				{
					return false;
				}
				if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
				{
					ValheimCuisineLogger.LogWarning((object)"ZNetView is invalid");
					return false;
				}
				Player val = (Player)(object)((user is Player) ? user : null);
				if ((Object)(object)val == (Object)null)
				{
					ValheimCuisineLogger.LogWarning((object)"User is not a Player");
					return false;
				}
				long playerID = val.GetPlayerID();
				if (playerID == 0)
				{
					ValheimCuisineLogger.LogWarning((object)"Could not get player ID");
					return false;
				}
				float time = Time.time;
				float num = _RavenInteractionCooldown?.Value ?? 1800f;
				float playerLastInteraction = GetPlayerLastInteraction(playerID);
				if (time - playerLastInteraction < num)
				{
					float num2 = num - (time - playerLastInteraction);
					((Character)user).Message((MessageType)2, Localization.instance.Localize("$raven_brewing") + $" ({Mathf.CeilToInt(num2)}s)", 0, (Sprite)null);
					return false;
				}
				SpawnRandomItems(user);
				SetPlayerLastInteraction(playerID, time);
				return true;
			}

			private void SpawnRandomItems(Humanoid user)
			{
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_02db: Unknown result type (might be due to invalid IL or missing references)
				//IL_0243: Unknown result type (might be due to invalid IL or missing references)
				//IL_0244: Unknown result type (might be due to invalid IL or missing references)
				//IL_0246: Unknown result type (might be due to invalid IL or missing references)
				//IL_024b: Unknown result type (might be due to invalid IL or missing references)
				//IL_024f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0251: Unknown result type (might be due to invalid IL or missing references)
				if (possibleDrops.Count == 0)
				{
					ValheimCuisineLogger.LogWarning((object)"No items in drop table!");
					((Character)user).Message((MessageType)2, "No items configured!", 0, (Sprite)null);
					return;
				}
				Vector3 val = ((Component)this).transform.position + Vector3.up * 1.5f;
				int num = 1;
				float num2 = Random.Range(0f, 100f);
				float num3 = _RavenTripleDropChance?.Value ?? 25f;
				float num4 = _RavenDoubleDropChance?.Value ?? 50f;
				if (num2 <= num3)
				{
					num = 3;
					ValheimCuisineLogger.LogInfo((object)$"Triple drop! (roll: {num2:F1}% <= {num3}%)");
				}
				else if (num2 <= num3 + num4)
				{
					num = 2;
					ValheimCuisineLogger.LogInfo((object)$"Double drop! (roll: {num2:F1}% <= {num3 + num4}%)");
				}
				else
				{
					ValheimCuisineLogger.LogInfo((object)$"Single drop (roll: {num2:F1}% > {num3 + num4}%)");
				}
				List<(int, float)> list = new List<(int, float)>();
				for (int i = 0; i < possibleDrops.Count; i++)
				{
					list.Add((i, possibleDrops[i].dropChance));
				}
				Vector3 val2 = default(Vector3);
				for (int j = 0; j < num; j++)
				{
					if (list.Count == 0)
					{
						break;
					}
					int index = SelectWeightedItem(list);
					(string, int, int, float) tuple = possibleDrops[list[index].Item1];
					list.RemoveAt(index);
					string item = tuple.Item1;
					int num5 = Random.Range(tuple.Item2, tuple.Item3 + 1);
					GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(item);
					if ((Object)(object)itemPrefab == (Object)null)
					{
						ValheimCuisineLogger.LogWarning((object)("Could not find prefab for " + item));
						continue;
					}
					((Vector3)(ref val2))..ctor(Random.Range(-0.3f, 0.3f), 0f, Random.Range(-0.3f, 0.3f));
					Vector3 val3 = val + val2;
					GameObject val4 = Object.Instantiate<GameObject>(itemPrefab, val3, Quaternion.identity);
					ItemDrop component = val4.GetComponent<ItemDrop>();
					if ((Object)(object)component != (Object)null && component.m_itemData != null)
					{
						component.m_itemData.m_stack = num5;
						component.Save();
					}
					ValheimCuisineLogger.LogInfo((object)$"Spawned {num5}x {item} (weight: {tuple.Item4}%)");
				}
				PlaySpawnEffects(val);
				((Character)user).Message((MessageType)2, Localization.instance.Localize("$raven_conjures"), 0, (Sprite)null);
			}

			private int SelectWeightedItem([<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(new byte[] { 1, 0 })] List<(int index, float weight)> weightedItems)
			{
				float num = 0f;
				foreach (var weightedItem in weightedItems)
				{
					num += weightedItem.weight;
				}
				float num2 = Random.Range(0f, num);
				float num3 = 0f;
				for (int i = 0; i < weightedItems.Count; i++)
				{
					num3 += weightedItems[i].weight;
					if (num2 <= num3)
					{
						return i;
					}
				}
				return weightedItems.Count - 1;
			}

			private void PlaySpawnEffects(Vector3 position)
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				GameObject prefab = ZNetScene.instance.GetPrefab("VC_sfx_RavenSpeak");
				if ((Object)(object)prefab != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab, position, Quaternion.identity);
				}
				GameObject prefab2 = ZNetScene.instance.GetPrefab("vfx_Place_wood_pole");
				if ((Object)(object)prefab2 != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab2, position, Quaternion.identity);
				}
			}

			public bool UseItem(Humanoid user, ItemData item)
			{
				return false;
			}

			public string GetHoverText()
			{
				string text = Localization.instance.Localize("$raven_name");
				if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
				{
					return text + "\n[<color=yellow><b>$KEY_Use</b></color>] " + Localization.instance.Localize("$raven_conjure");
				}
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer == (Object)null)
				{
					return text + "\n[<color=yellow><b>$KEY_Use</b></color>] " + Localization.instance.Localize("$raven_conjure");
				}
				long playerID = localPlayer.GetPlayerID();
				float time = Time.time;
				float num = _RavenInteractionCooldown?.Value ?? 1800f;
				float playerLastInteraction = GetPlayerLastInteraction(playerID);
				float num2 = time - playerLastInteraction;
				if (num2 < num)
				{
					float num3 = num - num2;
					return string.Format("{0}\n[<color=yellow><b>$KEY_Use</b></color>] {1} ({2}s)", text, Localization.instance.Localize("$raven_brewing_short"), Mathf.CeilToInt(num3));
				}
				return text + "\n[<color=yellow><b>$KEY_Use</b></color>] " + Localization.instance.Localize("$raven_conjure");
			}

			public string GetHoverName()
			{
				return Localization.instance.Localize("$raven_name");
			}
		}

		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		[HarmonyPatch(typeof(Player), "Update")]
		public static class LoxMilkingUpdatePatch
		{
			private const string BUCKET_PREFAB_NAME = "VC_MilkinBucket";

			private const string MILK_PREFAB_NAME = "VC_LoxMilk";

			private const string COOLDOWN_SE_NAME = "SE_LoxMilkedCooldown";

			private static float m_lastMilkAttempt;

			private static void Postfix(Player __instance)
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
				if (MilkingKey == null || !MilkingKey.Value.IsKeyDown() || Time.time - m_lastMilkAttempt < 0.5f)
				{
					return;
				}
				m_lastMilkAttempt = Time.time;
				if (!HasBucketEquipped(__instance))
				{
					return;
				}
				GameObject hoverObject = ((Humanoid)__instance).GetHoverObject();
				if ((Object)(object)hoverObject == (Object)null)
				{
					return;
				}
				Tameable componentInParent = hoverObject.GetComponentInParent<Tameable>();
				if ((Object)(object)componentInParent == (Object)null)
				{
					return;
				}
				Character character = componentInParent.m_character;
				if (!((Object)(object)character == (Object)null) && ((Object)character).name.StartsWith("Lox") && componentInParent.IsTamed() && !(Vector3.Distance(((Component)__instance).transform.position, ((Component)character).transform.position) > 3f))
				{
					if (RequireBreeding != null && RequireBreeding.Value && !HasLoxBred(componentInParent))
					{
						((Character)__instance).Message((MessageType)2, Localization.instance.Localize("$lox_milking_nobaby"), 0, (Sprite)null);
					}
					else if (HasMilkCooldown(character))
					{
						((Character)__instance).Message((MessageType)2, Localization.instance.Localize("$lox_milking_cooldown"), 0, (Sprite)null);
					}
					else
					{
						MilkLox(__instance, character, componentInParent);
					}
				}
			}

			private static bool HasBucketEquipped(Player player)
			{
				ItemData rightItem = ((Humanoid)player).GetRightItem();
				if (rightItem == null)
				{
					return false;
				}
				return (Object)(object)rightItem.m_dropPrefab != (Object)null && ((Object)rightItem.m_dropPrefab).name == "VC_MilkinBucket";
			}

			private static bool HasLoxBred(Tameable tameable)
			{
				Procreation component = ((Component)tameable).GetComponent<Procreation>();
				if ((Object)(object)component == (Object)null)
				{
					return false;
				}
				ZNetView nview = tameable.m_nview;
				if ((Object)(object)nview == (Object)null || !nview.IsValid())
				{
					return false;
				}
				ZDO zDO = nview.GetZDO();
				if (zDO == null)
				{
					return false;
				}
				int @int = zDO.GetInt("LoxBirthCount", 0);
				float @float = zDO.GetFloat("pregnant", 0f);
				return @int > 0 || @float > 0f;
			}

			private static bool HasMilkCooldown(Character character)
			{
				return character.GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_LoxMilkedCooldown"));
			}

			private static void MilkLox(Player player, Character lox, Tameable tameable)
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				ApplyCooldown(lox);
				GiveMilk(player);
				PlayMilkingEffects(((Component)lox).transform.position);
				((Character)player).Message((MessageType)2, Localization.instance.Localize("$lox_milking_success"), 0, (Sprite)null);
			}

			private static void ApplyCooldown(Character lox)
			{
				StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("SE_LoxMilkedCooldown"));
				float ttl = CooldownDuration?.Value ?? 1800f;
				if ((Object)(object)statusEffect != (Object)null)
				{
					statusEffect.m_ttl = ttl;
					lox.GetSEMan().AddStatusEffect(statusEffect, false, 0, 0f);
					return;
				}
				SE_Stats val = ScriptableObject.CreateInstance<SE_Stats>();
				((Object)val).name = "SE_LoxMilkedCooldown";
				((StatusEffect)val).m_name = "Recently Milked";
				((StatusEffect)val).m_ttl = ttl;
				((StatusEffect)val).m_tooltip = "This Lox was recently milked";
				lox.GetSEMan().AddStatusEffect((StatusEffect)(object)val, true, 0, 0f);
			}

			private static void GiveMilk(Player player)
			{
				//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("VC_LoxMilk");
				if ((Object)(object)itemPrefab == (Object)null)
				{
					Debug.LogError((object)"Could not find milk prefab: VC_LoxMilk");
					((Character)player).Message((MessageType)2, Localization.instance.Localize("$lox_milking_error"), 0, (Sprite)null);
					return;
				}
				int num = MilkAmount?.Value ?? 5;
				ItemDrop component = itemPrefab.GetComponent<ItemDrop>();
				if ((Object)(object)component == (Object)null || component.m_itemData == null)
				{
					Debug.LogError((object)"Milk prefab has no ItemDrop component");
					return;
				}
				ItemData val = component.m_itemData.Clone();
				val.m_stack = num;
				if (!((Humanoid)player).GetInventory().AddItem(val))
				{
					ItemDrop.DropItem(val, num, ((Component)player).transform.position + ((Component)player).transform.forward * 0.5f + Vector3.up * 0.5f, ((Component)player).transform.rotation);
					((Character)player).Message((MessageType)2, Localization.instance.Localize("$lox_milking_inventory_full"), 0, (Sprite)null);
				}
			}

			private static void PlayMilkingEffects(Vector3 position)
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				GameObject prefab = ZNetScene.instance.GetPrefab("VC_sfx_LoxMilking");
				if ((Object)(object)prefab != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab, position, Quaternion.identity);
				}
				GameObject prefab2 = ZNetScene.instance.GetPrefab("vfx_lootspawn");
				if ((Object)(object)prefab2 != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab2, position + Vector3.up * 1f, Quaternion.identity);
				}
			}
		}

		[HarmonyPatch(typeof(Tameable), "GetHoverText")]
		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		public static class LoxMilkingHoverTextPatch
		{
			private const string BUCKET_PREFAB_NAME = "VC_MilkinBucket";

			private const string COOLDOWN_SE_NAME = "SE_LoxMilkedCooldown";

			private static void Postfix(Tameable __instance, ref string __result)
			{
				//IL_009e: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				if (MilkingKey == null)
				{
					return;
				}
				Character character = __instance.m_character;
				if ((Object)(object)character == (Object)null || !((Object)character).name.StartsWith("Lox") || !__instance.IsTamed())
				{
					return;
				}
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer == (Object)null)
				{
					return;
				}
				ItemData rightItem = ((Humanoid)localPlayer).GetRightItem();
				if (rightItem == null)
				{
					return;
				}
				GameObject dropPrefab = rightItem.m_dropPrefab;
				if (((dropPrefab != null) ? ((Object)dropPrefab).name : null) != "VC_MilkinBucket")
				{
					return;
				}
				KeyboardShortcut value = MilkingKey.Value;
				KeyCode mainKey = ((KeyboardShortcut)(ref value)).MainKey;
				string text = ((object)(KeyCode)(ref mainKey)).ToString();
				if (RequireBreeding != null && RequireBreeding.Value)
				{
					Procreation component = ((Component)__instance).GetComponent<Procreation>();
					if ((Object)(object)component != (Object)null)
					{
						ZNetView nview = __instance.m_nview;
						if ((Object)(object)nview != (Object)null && nview.IsValid())
						{
							ZDO zDO = nview.GetZDO();
							if (zDO != null)
							{
								int @int = zDO.GetInt("LoxBirthCount", 0);
								float @float = zDO.GetFloat("pregnant", 0f);
								if (@int == 0 && @float == 0f)
								{
									__result = __result + "\n<color=orange>" + Localization.instance.Localize("$lox_milking_hover_nobaby") + "</color>";
									return;
								}
							}
						}
					}
				}
				if (character.GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_LoxMilkedCooldown")))
				{
					__result = __result + "\n<color=orange>" + Localization.instance.Localize("$lox_milking_hover_cooldown") + "</color>";
					return;
				}
				__result = __result + "\n[<color=yellow><b>" + text + "</b></color>] " + Localization.instance.Localize("$lox_milking_hover_action");
			}
		}

		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		public static class SeasonalItemGroupPatch
		{
			[CompilerGenerated]
			private sealed class <>c__DisplayClass4_0
			{
				[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
				public string r;

				[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)]
				internal bool <DelayedAddSeasonalRecipes>b__3(Recipe x)
				{
					return Object.op_Implicit((Object)(object)x) && (((Object)x).name.Equals(r, StringComparison.OrdinalIgnoreCase) || ((Object)x).name.Equals("Recipe_" + r, StringComparison.OrdinalIgnoreCase));
				}
			}

			[CompilerGenerated]
			private sealed class <DelayedAddSeasonalRecipes>d__4 : IEnumerator<object>, IDisposable, IEnumerator
			{
				private int <>1__state;

				[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
				private object <>2__current;

				private float <timer>5__1;

				private bool <allFound>5__2;

				[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
				private Exception <e>5__3;

				object IEnumerator<object>.Current
				{
					[DebuggerHidden]
					[return: <2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
					get
					{
						return <>2__current;
					}
				}

				object IEnumerator.Current
				{
					[DebuggerHidden]
					[return: <2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
					get
					{
						return <>2__current;
					}
				}

				[DebuggerHidden]
				public <DelayedAddSeasonalRecipes>d__4(int <>1__state)
				{
					this.<>1__state = <>1__state;
				}

				[DebuggerHidden]
				void IDisposable.Dispose()
				{
					<e>5__3 = null;
					<>1__state = -2;
				}

				private bool MoveNext()
				{
					//IL_0054: Unknown result type (might be due to invalid IL or missing references)
					//IL_005e: Expected O, but got Unknown
					//IL_008e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0098: Expected O, but got Unknown
					//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
					//IL_0101: Expected O, but got Unknown
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<>2__current = (object)new WaitUntil((Func<bool>)(() => Object.op_Implicit((Object)(object)ObjectDB.instance)));
						<>1__state = 1;
						return true;
					case 1:
						<>1__state = -1;
						<>2__current = (object)new WaitUntil((Func<bool>)(() => ObjectDB.instance.m_recipes.Count > 0));
						<>1__state = 2;
						return true;
					case 2:
						<>1__state = -1;
						<timer>5__1 = 0f;
						break;
					case 3:
						<>1__state = -1;
						<timer>5__1 += 1f;
						break;
					}
					if (<timer>5__1 < 10f)
					{
						<allFound>5__2 = HalloweenRecipes.All([<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)] (string r) =>
						{
							<>c__DisplayClass4_0 CS$<>8__locals0 = new <>c__DisplayClass4_0
							{
								r = r
							};
							return ObjectDB.instance.m_recipes.Any([<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)] (Recipe x) => Object.op_Implicit((Object)(object)x) && (((Object)x).name.Equals(CS$<>8__locals0.r, StringComparison.OrdinalIgnoreCase) || ((Object)x).name.Equals("Recipe_" + CS$<>8__locals0.r, StringComparison.OrdinalIgnoreCase)));
						});
						if (!<allFound>5__2)
						{
							<>2__current = (object)new WaitForSeconds(1f);
							<>1__state = 3;
							return true;
						}
					}
					ValheimCuisineLogger.LogInfo((object)$"[SeasonalItemGroupPatch] Recipes available in ObjectDB: {ObjectDB.instance.m_recipes.Count}");
					try
					{
						AddRecipesToGroup("Halloween", HalloweenRecipes);
						AddRecipesToGroup("Midsummer", MidsummerRecipes);
						AddRecipesToGroup("Yule", YuleRecipes);
					}
					catch (Exception ex)
					{
						<e>5__3 = ex;
						ValheimCuisineLogger.LogError((object)$"[SeasonalItemGroupPatch] Exception adding seasonal recipes: {<e>5__3}");
					}
					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();
				}
			}

			private static readonly List<string> HalloweenRecipes = new List<string> { "VC_UnbakedStuffedTurnips_Recipe_PrepTable" };

			private static readonly List<string> MidsummerRecipes = new List<string>();

			private static readonly List<string> YuleRecipes = new List<string>();

			private static void Postfix(ZNetScene __instance)
			{
				((MonoBehaviour)__instance).StartCoroutine(DelayedAddSeasonalRecipes());
			}

			[IteratorStateMachine(typeof(<DelayedAddSeasonalRecipes>d__4))]
			private static IEnumerator DelayedAddSeasonalRecipes()
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <DelayedAddSeasonalRecipes>d__4(0);
			}

			private static void AddRecipesToGroup(string groupName, List<string> recipeNames)
			{
				SeasonalItemGroup val = Resources.FindObjectsOfTypeAll<SeasonalItemGroup>()?.FirstOrDefault((Func<SeasonalItemGroup, bool>)([<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)] (SeasonalItemGroup x) => ((Object)x).name == groupName));
				if ((Object)(object)val == (Object)null)
				{
					ValheimCuisineLogger.LogWarning((object)("[SeasonalItemGroupPatch] Could not find SeasonalItemGroup: " + groupName));
					return;
				}
				foreach (string name in recipeNames)
				{
					Recipe val2 = ((IEnumerable<Recipe>)ObjectDB.instance.m_recipes).FirstOrDefault((Func<Recipe, bool>)([<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)] (Recipe r) => Object.op_Implicit((Object)(object)r) && (((Object)r).name.Equals(name, StringComparison.OrdinalIgnoreCase) || ((Object)r).name.Equals("Recipe_" + name, StringComparison.OrdinalIgnoreCase))));
					if ((Object)(object)val2 == (Object)null)
					{
						ValheimCuisineLogger.LogWarning((object)("[SeasonalItemGroupPatch] Could not find recipe '" + name + "' in ObjectDB."));
					}
					else if (!val.Recipes.Contains(val2))
					{
						val.Recipes.Add(val2);
						ValheimCuisineLogger.LogInfo((object)("[SeasonalItemGroupPatch] Added '" + ((Object)val2).name + "' to SeasonalItemGroup '" + groupName + "'."));
					}
				}
			}
		}

		[<9978fd04-0aae-4412-8ace-26389168e076>NullableContext(0)]
		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order = null;

			[UsedImplicitly]
			public bool? Browsable = null;

			[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(2)]
			[UsedImplicitly]
			public string Category = null;

			[UsedImplicitly]
			[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(new byte[] { 2, 1 })]
			public Action<ConfigEntryBase> CustomDrawer = null;
		}

		[<2a4a1169-5495-481c-80ef-84438e1fc47b>Nullable(0)]
		private class AcceptableShortcuts : AcceptableValueBase
		{
			public AcceptableShortcuts()
				: base(typeof(KeyboardShortcut))
			{
			}

			public override object Clamp(object value)
			{
				return value;
			}

			public override bool IsValid(object value)
			{
				return true;
			}

			public override string ToDescriptionString()
			{
				return "# Acceptable values: " + string.Join(", ", UnityInput.Current.SupportedKeyCodes);
			}
		}

		internal const string ModName = "ValheimCuisine";

		internal const string ModVersion = "2.1.9";

		internal const string Author = "XutzBR";

		private const string ModGUID = "XutzBR.ValheimCuisine";

		private static string ConfigFileName = "XutzBR.ValheimCuisine.cfg";

		private static string ConfigFileFullPath;

		internal static string ConnectionError;

		private readonly Harmony _harmony = new Harmony("XutzBR.ValheimCuisine");

		public static readonly ManualLogSource ValheimCuisineLogger;

		private static readonly ConfigSync ConfigSync;

		public static ConfigEntry<float> CooldownDuration;

		public static ConfigEntry<int> MilkAmount;

		public static ConfigEntry<bool> RequireBreeding;

		public static ConfigEntry<KeyboardShortcut> MilkingKey;

		private static Dictionary<GameObject, GameObject> VC_Station_Normal;

		private static Dictionary<GameObject, GameObject> VC_Station_Iron_40;

		private static Dictionary<GameObject, GameObject> VC_Station_Iron_60;

		private static Dictionary<GameObject, GameObject> VC_Oven_50;

		private static Dictionary<GameObject, GameObject> VC_Oven_60;

		private static Dictionary<GameObject, GameObject> VC_Oven_80;

		private static Dictionary<GameObject, GameObject> VC_Fermenter;

		public Texture2D tex = null;

		private static ConfigEntry<Toggle> _serverConfigLocked;

		public void Awake()
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Expected O, but got Unknown
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			Localizer.Load();
			bool saveOnConfigSet = ((BaseUnityPlugin)this).Config.SaveOnConfigSet;
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
			_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);
			CooldownDuration = config("Lox Milking", "CooldownDuration", 1800f, new ConfigDescription("Cooldown duration in seconds before a Lox can be milked again (default: 1800 = 30 minutes)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(60f, 7200f), Array.Empty<object>()));
			MilkAmount = config("Lox Milking", "MilkAmount", 5, new ConfigDescription("Amount of milk produced per milking", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 20), Array.Empty<object>()));
			RequireBreeding = config("Lox Milking", "RequireBreeding", value: true, "Only allow milking from Lox that have already had a baby");
			MilkingKey = config<KeyboardShortcut>("Lox Milking", "MilkingKey", new KeyboardShortcut((KeyCode)102, Array.Empty<KeyCode>()), new ConfigDescription("Key to milk the Lox (default: F)", (AcceptableValueBase)(object)new AcceptableShortcuts(), Array.Empty<object>()), synchronizedSetting: false);
			RavenInteraction.InitializeConfig(((BaseUnityPlugin)this).Config, ConfigSync);
			GrimpyInteraction.InitializeConfig(((BaseUnityPlugin)this).Config, ConfigSync);
			Creature creature = new Creature("valheimcuisine", "VC_FrostLeech")
			{
				Biome = (Biome)64,
				SpecificSpawnArea = SpawnArea.Everywhere,
				RequiredWeather = Weather.None,
				RequiredGlobalKey = GlobalKey.None,
				SpecificSpawnTime = SpawnTime.Always,
				GroupSize = new CreatureManager.Range(2f, 4f),
				SpawnChance = 80f,
				CheckSpawnInterval = 300,
				Maximum = 4,
				ForestSpawn = Forest.No,
				CanSpawn = true,
				CanBeTamed = false,
				AttackImmediately = true,
				ConfigurationEnabled = true,
				CanHaveStars = true,
				RequiredAltitude = new CreatureManager.Range(-1000f, 0f),
				RequiredOceanDepth = new CreatureManager.Range(0f, 0f)
			};
			creature.Drops["VC_FrostBloodbag"].Amount = new CreatureManager.Range(1f, 1f);
			creature.Drops["VC_FrostBloodbag"].DropChance = 100f;
			creature.Drops["VC_TrophyFrostLeech"].Amount = new CreatureManager.Range(1f, 1f);
			creature.Drops["VC_TrophyFrostLeech"].DropChance = 20f;
			GameObject val = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_Leech_BiteAttack");
			GameObject val2 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_fx_backstab");
			GameObject val3 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_fx_crit");
			GameObject val4 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_vfx_HitSparks_Leech");
			GameObject val5 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_vfx_leech_death");
			GameObject val6 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_vfx_leech_hit");
			GameObject val7 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_vfx_water_surface");
			GameObject val8 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_sfx_leech_alerted");
			GameObject val9 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_sfx_leech_attack");
			GameObject val10 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_sfx_leech_attack_hit");
			GameObject val11 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_sfx_leech_death");
			GameObject val12 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_sfx_leech_hit");
			GameObject val13 = ItemManager.PrefabManager.RegisterPrefab("valheimcuisine", "VC_sfx_leech_idle");
			Item item = new Item("valheimcuisine", "VC_Hammer");
			item.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
			item.RequiredItems.Add("FineWood", 4);
			item.RequiredItems.Add("Resin", 2);
			item.RequiredItems.Add("Tin", 2);
			item.RequiredItems.Add("BronzeNails", 8);
			item.RequiredUpgradeItems.Add("FineWood", 4);
			item.CraftAmount = 1;
			Item item2 = new Item("valheimcuisine", "VC_MilkinBucket");
			item2.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
			item2.RequiredItems.Add("Wood", 10);
			item2.RequiredItems.Add("Resin", 6);
			item2.RequiredItems.Add("BarrelRings", 1);
			item2.CraftAmount = 1;
			BuildPiece buildPiece = new BuildPiece("valheimcuisine", "VC_Eldhrimnir");
			buildPiece.Category.Set("Cuisine");
			buildPiece.Crafting.Set(PieceManager.CraftingTable.Forge);
			buildPiece.RequiredItems.Add("VC_NidavellirBronze", 12, recover: true);
			BuildPiece buildPiece2 = new BuildPiece("valheimcuisine", "VC_VolvaCauldron");
			buildPiece2.Category.Set("Cuisine");
			buildPiece2.Crafting.Set(PieceManager.CraftingTable.Forge);
			buildPiece2.RequiredItems.Add("Iron", 20, recover: true);
			BuildPiece buildPiece3 = new BuildPiece("valheimcuisine", "VC_FoodBarrel1");
			buildPiece3.Category.Set("Cuisine");
			buildPiece3.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece3.RequiredItems.Add("ElderBark", 10, recover: true);
			buildPiece3.RequiredItems.Add("Resin", 8, recover: true);
			buildPiece3.RequiredItems.Add("BarrelRings", 1, recover: true);
			BuildPiece buildPiece4 = new BuildPiece("valheimcuisine", "VC_Eldhrimnir_ext1");
			buildPiece4.Category.Set("Cuisine");
			buildPiece4.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece4.RequiredItems.Add("RoundLog", 4, recover: true);
			buildPiece4.RequiredItems.Add("FineWood", 4, recover: true);
			buildPiece4.RequiredItems.Add("IronNails", 2, recover: true);
			BuildPiece buildPiece5 = new BuildPiece("valheimcuisine", "VC_ChefTable");
			buildPiece5.Category.Set("Cuisine");
			buildPiece5.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece5.RequiredItems.Add("FineWood", 10, recover: true);
			buildPiece5.RequiredItems.Add("RoundLog", 6, recover: true);
			buildPiece5.RequiredItems.Add("Iron", 8, recover: true);
			buildPiece5.RequiredItems.Add("VC_CookingSupplies", 4, recover: true);
			BuildPiece buildPiece6 = new BuildPiece("valheimcuisine", "VC_VolvaCauldron_ext1");
			buildPiece6.Category.Set("Cuisine");
			buildPiece6.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece6.RequiredItems.Add("FineWood", 16, recover: true);
			buildPiece6.RequiredItems.Add("IronNails", 12, recover: true);
			buildPiece6.RequiredItems.Add("Silver", 6, recover: true);
			buildPiece6.RequiredItems.Add("VC_CookingSupplies", 4, recover: true);
			BuildPiece buildPiece7 = new BuildPiece("valheimcuisine", "VC_FulingCauldron");
			buildPiece7.Category.Set("Cuisine");
			buildPiece7.Crafting.Set(PieceManager.CraftingTable.StoneCutter);
			buildPiece7.RequiredItems.Add("Stone", 40, recover: true);
			buildPiece7.RequiredItems.Add("BoneFragments", 40, recover: true);
			buildPiece7.RequiredItems.Add("GoblinTotem", 1, recover: true);
			buildPiece7.RequiredItems.Add("VC_FulingCauldron_Mat", 1, recover: true);
			BuildPiece buildPiece8 = new BuildPiece("valheimcuisine", "VC_LegendFermenter");
			buildPiece8.Category.Set("Cuisine");
			buildPiece8.Crafting.Set(PieceManager.CraftingTable.ArtisanTable);
			buildPiece8.RequiredItems.Add("FineWood", 30, recover: true);
			buildPiece8.RequiredItems.Add("VC_NidavellirBronze", 20, recover: true);
			buildPiece8.RequiredItems.Add("IronNails", 20, recover: true);
			buildPiece8.RequiredItems.Add("Resin", 10, recover: true);
			BuildPiece buildPiece9 = new BuildPiece("valheimcuisine", "VC_ButterChurn");
			buildPiece9.Category.Set("Cuisine");
			buildPiece9.Crafting.Set(PieceManager.CraftingTable.ArtisanTable);
			buildPiece9.RequiredItems.Add("RoundLog", 20, recover: true);
			buildPiece9.RequiredItems.Add("IronNails", 10, recover: true);
			buildPiece9.RequiredItems.Add("BarrelRings", 1, recover: true);
			BuildPiece buildPiece10 = new BuildPiece("valheimcuisine", "VC_VolvaCauldron_ext2");
			buildPiece10.Category.Set("Cuisine");
			buildPiece10.Crafting.Set(PieceManager.CraftingTable.StoneCutter);
			buildPiece10.RequiredItems.Add("Stone", 100, recover: true);
			buildPiece10.RequiredItems.Add("CandleWick", 10, recover: true);
			buildPiece10.RequiredItems.Add("Tar", 4, recover: true);
			buildPiece10.RequiredItems.Add("Coal", 6, recover: true);
			BuildPiece buildPiece11 = new BuildPiece("valheimcuisine", "VC_Eldhrimnir_ext2");
			buildPiece11.Category.Set("Cuisine");
			buildPiece11.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece11.RequiredItems.Add("RoundLog", 20, recover: true);
			buildPiece11.RequiredItems.Add("FineWood", 50, recover: true);
			buildPiece11.RequiredItems.Add("BarrelRings", 9, recover: true);
			buildPiece11.RequiredItems.Add("VC_CookingSupplies", 8, recover: true);
			BuildPiece buildPiece12 = new BuildPiece("valheimcuisine", "VC_VolvaCauldron_ext3");
			buildPiece12.Category.Set("Cuisine");
			buildPiece12.Crafting.Set(PieceManager.CraftingTable.MageTable);
			buildPiece12.RequiredItems.Add("BlobVial", 1, recover: true);
			buildPiece12.RequiredItems.Add("MechanicalSpring", 1, recover: true);
			buildPiece12.RequiredItems.Add("VC_NidavellirBronze", 5, recover: true);
			buildPiece12.RequiredItems.Add("YggdrasilWood", 10, recover: true);
			BuildPiece buildPiece13 = new BuildPiece("valheimcuisine", "VC_DvergrCauldron");
			buildPiece13.Category.Set("Cuisine");
			buildPiece13.Crafting.Set(PieceManager.CraftingTable.BlackForge);
			buildPiece13.RequiredItems.Add("Iron", 20, recover: true);
			buildPiece13.RequiredItems.Add("VC_NidavellirBronze", 15, recover: true);
			buildPiece13.RequiredItems.Add("YggdrasilWood", 20, recover: true);
			buildPiece13.RequiredItems.Add("BlackCore", 5, recover: true);
			BuildPiece buildPiece14 = new BuildPiece("valheimcuisine", "VC_Eldhrimnir_ext3");
			buildPiece14.Category.Set("Cuisine");
			buildPiece14.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece14.RequiredItems.Add("Blackwood", 6, recover: true);
			buildPiece14.RequiredItems.Add("CharcoalResin", 2, recover: true);
			buildPiece14.RequiredItems.Add("IronNails", 4, recover: true);
			buildPiece14.RequiredItems.Add("VC_CookingSupplies", 4, recover: true);
			BuildPiece buildPiece15 = new BuildPiece("valheimcuisine", "VC_FoodBarrel2");
			buildPiece15.Category.Set("Cuisine");
			buildPiece15.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece15.RequiredItems.Add("Blackwood", 10, recover: true);
			buildPiece15.RequiredItems.Add("CharcoalResin", 2, recover: true);
			buildPiece15.RequiredItems.Add("FlametalNew", 2, recover: true);
			BuildPiece buildPiece16 = new BuildPiece("valheimcuisine", "VC_VolvaCauldron_ext4");
			buildPiece16.Category.Set("Cuisine");
			buildPiece16.Crafting.Set(PieceManager.CraftingTable.MageTable);
			buildPiece16.RequiredItems.Add("VC_TrappedVaettir", 1, recover: true);
			buildPiece16.RequiredItems.Add("FineWood", 20, recover: true);
			buildPiece16.RequiredItems.Add("FlametalNew", 2, recover: true);
			buildPiece16.RequiredItems.Add("QueensJam", 4, recover: true);
			BuildPiece buildPiece17 = new BuildPiece("valheimcuisine", "VC_Freydis");
			buildPiece17.Category.Set("Cuisine");
			buildPiece17.Crafting.Set(PieceManager.CraftingTable.MageTable);
			buildPiece17.RequiredItems.Add("VC_RavenTablet", 1, recover: true);
			buildPiece17.RequiredItems.Add("TrophySkeleton", 3, recover: true);
			buildPiece17.RequiredItems.Add("BoneFragments", 10, recover: true);
			buildPiece17.RequiredItems.Add("Grausten", 8, recover: true);
			BuildPiece buildPiece18 = new BuildPiece("valheimcuisine", "VC_Eldhrimnir_ext4");
			buildPiece18.Category.Set("Cuisine");
			buildPiece18.Crafting.Set(PieceManager.CraftingTable.Workbench);
			buildPiece18.RequiredItems.Add("Blackwood", 20, recover: true);
			buildPiece18.RequiredItems.Add("BarrelRings", 1, recover: true);
			buildPiece18.RequiredItems.Add("VC_FrostBloodbag", 4, recover: true);
			buildPiece18.RequiredItems.Add("VC_CookingSupplies", 4, recover: true);
			Item item3 = new Item("valheimcuisine", "VC_NidavellirBronze");
			item3.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
			item3.RequiredItems.Add("Copper", 2);
			item3.RequiredItems.Add("Tin", 1);
			item3.RequiredItems.Add("Coal", 3);
			item3.RequiredItems.Add("SurtlingCore", 1);
			item3.CraftAmount = 1;
			Item item4 = new Item("valheimcuisine", "VC_BoneMeal");
			item4.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
			item4.RequiredItems.Add("BoneFragments", 10);
			item4.CraftAmount = 10;
			new ItemManager.Conversion(item4)
			{
				Input = "BoneFragments",
				Piece = ConversionPiece.Windmill
			};
			Item item5 = new Item("valheimcuisine", "VC_DrakeHeart");
			item5.DropsFrom.Add("Hatchling", 0.8f);
			Item outputItem = new Item("valheimcuisine", "VC_AncientBarkFlour");
			new ItemManager.Conversion(outputItem)
			{
				Input = "ElderBark",
				Piece = ConversionPiece.Windmill
			};
			Item item6 = new Item("valheimcuisine", "VC_LandvidiRoots");
			item6.DropsFrom.Add("GoblinShaman", 0.2f, 1, 3);
			item6.DropsFrom.Add("GoblinShaman_Hildir", 1f, 4, 8);
			Item item7 = new Item("valheimcuisine", "VC_FulingTablet");
			item7.DropsFrom.Add("GoblinShaman_Hildir", 1f);
			Item item8 = new Item("valheimcuisine", "VC_FulingCauldron_Mat");
			item8.Crafting.Add(ItemManager.CraftingTable.Forge, 5);
			item8.RequiredItems.Add("Iron", 14);
			item8.RequiredItems.Add("Stone", 20);
			item8.RequiredItems.Add("VC_FulingTablet", 1);
			item8.CraftAmount = 1;
			Item item9 = new Item("valheimcuisine", "VC_GoKParts");
			item9.Crafting.Add(ItemManager.CraftingTable.BlackForge, 4);
			item9.RequiredItems.Add("FlametalNew", 6);
			item9.RequiredItems.Add("VC_NidavellirBronze", 2);
			item9.CraftAmount = 1;
			Item item10 = new Item("valheimcuisine", "VC_GoK");
			item10.Crafting.Add(ItemManager.CraftingTable.ArtisanTable, 1);
			item10.RequiredItems.Add("VC_GoKParts", 1);
			item10.RequiredItems.Add("GemstoneRed", 4);
			item10.RequiredItems.Add("GemstoneGreen", 2);
			item10.RequiredItems.Add("TrophySkeleton", 1);
			item10.CraftAmount = 1;
			Item item11 = new Item("valheimcuisine", "VC_RavenTablet");
			item11.Crafting.Add(ItemManager.CraftingTable.MageTable, 4);
			item11.RequiredItems.Add("BlackMarble", 2);
			item11.RequiredItems.Add("Ectoplasm", 10);
			item11.RequiredItems.Add("CelestialFeather", 5);
			item11.RequiredItems.Add("TrophyFallenValkyrie", 1);
			item11.CraftAmount = 1;
			Item item12 = new Item("valheimcuisine", "VC_TrappedVaettir");
			item12.DropsFrom.Add("Charred_Melee_Dyrnwyn", 1f);
			Item item13 = new Item("valheimcuisine", "VC_FrostBloodbag");
			Item item14 = new Item("valheimcuisine", "VC_TrophyFrostLeech");
			Item item15 = new Item("valheimcuisine", "VC_DandelionSoup");
			item15.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item15.RequiredItems.Add("Dandelion", 3);
			item15.CraftAmount = 1;
			Item item16 = new Item("valheimcuisine", "VC_GlazedCarrots");
			item16.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item16.RequiredItems.Add("Carrot", 2);
			item16.RequiredItems.Add("Honey", 1);
			item16.CraftAmount = 1;
			Item item17 = new Item("valheimcuisine", "VC_SauteMushrooms");
			item17.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item17.RequiredItems.Add("Mushroom", 2);
			item17.RequiredItems.Add("MushroomYellow", 1);
			item17.CraftAmount = 1;
			Item item18 = new Item("valheimcuisine", "VC_FowlerRagout");
			item18.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item18.RequiredItems.Add("VC_BirdMeat", 2);
			item18.RequiredItems.Add("Carrot", 1);
			item18.RequiredItems.Add("Thistle", 2);
			item18.CraftAmount = 1;
			Item item19 = new Item("valheimcuisine", "VC_NeckSoup");
			item19.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item19.RequiredItems.Add("NeckTail", 1);
			item19.RequiredItems.Add("Mushroom", 1);
			item19.CraftAmount = 1;
			Item item20 = new Item("valheimcuisine", "VC_ForestSkewer");
			item20.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item20.RequiredItems.Add("DeerMeat", 2);
			item20.RequiredItems.Add("Mushroom", 1);
			item20.RequiredItems.Add("MushroomYellow", 1);
			item20.CraftAmount = 4;
			Item item21 = new Item("valheimcuisine", "VC_BoarSvid");
			item21.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item21.RequiredItems.Add("TrophyBoar", 1);
			item21.RequiredItems.Add("Dandelion", 2);
			item21.CraftAmount = 1;
			Item item22 = new Item("valheimcuisine", "VC_DeerSvid");
			item22.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item22.RequiredItems.Add("TrophyDeer", 1);
			item22.RequiredItems.Add("Carrot", 1);
			item22.RequiredItems.Add("Thistle", 1);
			item22.CraftAmount = 1;
			Item item23 = new Item("valheimcuisine", "VC_MyrkvidrSkause");
			item23.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item23.RequiredItems.Add("DeerMeat", 1);
			item23.RequiredItems.Add("Carrot", 1);
			item23.RequiredItems.Add("Mushroom", 1);
			item23.CraftAmount = 1;
			Item item24 = new Item("valheimcuisine", "VC_FishSoup");
			item24.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item24.RequiredItems.Add("FishRaw", 1);
			item24.RequiredItems.Add("MushroomYellow", 2);
			item24.RequiredItems.Add("Dandelion", 1);
			item24.CraftAmount = 1;
			Item item25 = new Item("valheimcuisine", "VC_PikeFillets");
			item25.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item25.RequiredItems.Add("Fish2", 1);
			item25.RequiredItems.Add("Thistle", 2);
			item25.CraftAmount = 1;
			Item item26 = new Item("valheimcuisine", "VC_PerchSteak");
			item26.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item26.RequiredItems.Add("Fish1", 1);
			item26.RequiredItems.Add("Thistle", 2);
			item26.CraftAmount = 1;
			Item item27 = new Item("valheimcuisine", "VC_VikingStew");
			item27.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item27.RequiredItems.Add("Fish5", 1);
			item27.RequiredItems.Add("MushroomYellow", 1);
			item27.RequiredItems.Add("Dandelion", 2);
			item27.CraftAmount = 1;
			Item item28 = new Item("valheimcuisine", "VC_TrollSvid");
			item28.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item28.RequiredItems.Add("TrophyFrostTroll", 1);
			item28.RequiredItems.Add("Carrot", 1);
			item28.RequiredItems.Add("Thistle", 2);
			item28.CraftAmount = 1;
			Item item29 = new Item("valheimcuisine", "VC_TrollStew");
			item29.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item29.RequiredItems.Add("VC_TrollMeat", 1);
			item29.RequiredItems.Add("Carrot", 1);
			item29.RequiredItems.Add("MushroomYellow", 2);
			item29.RequiredItems.Add("Dandelion", 2);
			item29.CraftAmount = 1;
			Item item30 = new Item("valheimcuisine", "VC_CuredPork");
			item30.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item30.RequiredItems.Add("RawMeat", 3);
			item30.RequiredItems.Add("Dandelion", 2);
			item30.RequiredItems.Add("Thistle", 2);
			item30.RequiredItems.Add("Ooze", 1);
			item30.CraftAmount = 6;
			Item item31 = new Item("valheimcuisine", "VC_GlazedTurnips");
			item31.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item31.RequiredItems.Add("Turnip", 2);
			item31.RequiredItems.Add("Honey", 1);
			item31.CraftAmount = 1;
			Item item32 = new Item("valheimcuisine", "VC_MushroomSoup");
			item32.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item32.RequiredItems.Add("VC_SauteMushrooms", 1);
			item32.RequiredItems.Add("Dandelion", 1);
			item32.CraftAmount = 1;
			Item item33 = new Item("valheimcuisine", "VC_CarrionCrowBroth");
			item33.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item33.RequiredItems.Add("VC_BirdMeat", 2);
			item33.RequiredItems.Add("Entrails", 3);
			item33.RequiredItems.Add("VC_BoneMeal", 3);
			item33.RequiredItems.Add("Turnip", 1);
			item33.CraftAmount = 1;
			Item item34 = new Item("valheimcuisine", "VC_RootSoup");
			item34.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item34.RequiredItems.Add("Root", 2);
			item34.RequiredItems.Add("Dandelion", 4);
			item34.CraftAmount = 1;
			Item item35 = new Item("valheimcuisine", "VC_BoneBroth");
			item35.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item35.RequiredItems.Add("BoneFragments", 4);
			item35.RequiredItems.Add("Carrot", 2);
			item35.RequiredItems.Add("Thistle", 1);
			item35.CraftAmount = 1;
			Item item36 = new Item("valheimcuisine", "VC_VegetableSoup");
			item36.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item36.RequiredItems.Add("Carrot", 1);
			item36.RequiredItems.Add("Turnip", 1);
			item36.RequiredItems.Add("MushroomYellow", 1);
			item36.CraftAmount = 1;
			Item item37 = new Item("valheimcuisine", "VC_BoarHam");
			item37.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item37.RequiredItems.Add("RawMeat", 2);
			item37.RequiredItems.Add("Dandelion", 1);
			item37.RequiredItems.Add("Thistle", 1);
			item37.RequiredItems.Add("Ooze", 1);
			item37.CraftAmount = 2;
			Item item38 = new Item("valheimcuisine", "VC_FishStew");
			item38.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item38.RequiredItems.Add("FishCooked", 1);
			item38.RequiredItems.Add("Turnip", 1);
			item38.RequiredItems.Add("Thistle", 2);
			item38.CraftAmount = 1;
			Item item39 = new Item("valheimcuisine", "VC_NeckStew");
			item39.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item39.RequiredItems.Add("TrophyNeck", 1);
			item39.RequiredItems.Add("NeckTail", 1);
			item39.RequiredItems.Add("Turnip", 1);
			item39.CraftAmount = 1;
			Item item40 = new Item("valheimcuisine", "VC_SmokedHerring");
			item40.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item40.RequiredItems.Add("Fish6", 2);
			item40.RequiredItems.Add("RoundLog", 1);
			item40.RequiredItems.Add("Coal", 1);
			item40.CraftAmount = 1;
			Item item41 = new Item("valheimcuisine", "VC_FensalirSkause");
			item41.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item41.RequiredItems.Add("DeerMeat", 1);
			item41.RequiredItems.Add("Carrot", 1);
			item41.RequiredItems.Add("Turnip", 1);
			item41.RequiredItems.Add("Honey", 2);
			item41.CraftAmount = 1;
			Item item42 = new Item("valheimcuisine", "VC_Blodpolse");
			item42.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item42.RequiredItems.Add("TrophyLeech", 1);
			item42.RequiredItems.Add("VC_TrollMeat", 2);
			item42.RequiredItems.Add("Bloodbag", 1);
			item42.RequiredItems.Add("Thistle", 3);
			item42.CraftAmount = 6;
			Item item43 = new Item("valheimcuisine", "VC_BloodyBroth");
			item43.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item43.RequiredItems.Add("Bloodbag", 2);
			item43.RequiredItems.Add("Entrails", 1);
			item43.RequiredItems.Add("Turnip", 1);
			item43.RequiredItems.Add("Thistle", 2);
			item43.CraftAmount = 1;
			Item item44 = new Item("valheimcuisine", "VC_AmmaStew");
			item44.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item44.RequiredItems.Add("CookedDeerMeat", 1);
			item44.RequiredItems.Add("VC_CuredPork", 1);
			item44.RequiredItems.Add("VC_GlazedTurnips", 1);
			item44.RequiredItems.Add("Thistle", 1);
			item44.CraftAmount = 1;
			Item item45 = new Item("valheimcuisine", "VC_ColdCuredNeck");
			item45.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item45.RequiredItems.Add("NeckTail", 2);
			item45.RequiredItems.Add("Honey", 2);
			item45.RequiredItems.Add("FreezeGland", 1);
			item45.CraftAmount = 4;
			Item item46 = new Item("valheimcuisine", "VC_TrollJerky");
			item46.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item46.RequiredItems.Add("VC_TrollMeat", 1);
			item46.RequiredItems.Add("Honey", 2);
			item46.CraftAmount = 4;
			Item item47 = new Item("valheimcuisine", "VC_BloodmoonStew");
			item47.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item47.RequiredItems.Add("Fish4_cave", 2);
			item47.RequiredItems.Add("Bloodbag", 1);
			item47.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item47.RequiredItems.Add("Thistle", 1);
			item47.CraftAmount = 1;
			item47.DropsFrom.Add("Fenring_Cultist", 0.01f);
			Item item48 = new Item("valheimcuisine", "VC_Pottage");
			item48.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item48.RequiredItems.Add("VC_ChoppedVeggies", 2);
			item48.CraftAmount = 1;
			Item item49 = new Item("valheimcuisine", "VC_MarinatedBerries");
			item49.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item49.RequiredItems.Add("Raspberry", 8);
			item49.RequiredItems.Add("Blueberries", 8);
			item49.RequiredItems.Add("FreezeGland", 2);
			item49.RequiredItems.Add("MeadTasty", 1);
			item49.CraftAmount = 2;
			Item item50 = new Item("valheimcuisine", "VC_VegetableStew");
			item50.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item50.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item50.RequiredItems.Add("MushroomYellow", 1);
			item50.RequiredItems.Add("Root", 1);
			item50.RequiredItems.Add("Thistle", 1);
			item50.CraftAmount = 1;
			Item item51 = new Item("valheimcuisine", "VC_WolfSalami");
			item51.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item51.RequiredItems.Add("Entrails", 6);
			item51.RequiredItems.Add("WolfMeat", 2);
			item51.RequiredItems.Add("Thistle", 2);
			item51.RequiredItems.Add("FreezeGland", 1);
			item51.CraftAmount = 6;
			Item item52 = new Item("valheimcuisine", "VC_MountainHotpot");
			item52.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item52.RequiredItems.Add("WolfMeat", 1);
			item52.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item52.RequiredItems.Add("WolfHairBundle", 1);
			item52.RequiredItems.Add("VC_BoneMeal", 2);
			item52.CraftAmount = 1;
			Item item53 = new Item("valheimcuisine", "VC_YdalirSkause");
			item53.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item53.RequiredItems.Add("WolfMeat", 1);
			item53.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item53.RequiredItems.Add("Thistle", 1);
			item53.CraftAmount = 1;
			Item item54 = new Item("valheimcuisine", "VC_FlambeWolfStrips");
			item54.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item54.RequiredItems.Add("WolfMeat", 2);
			item54.RequiredItems.Add("MeadTasty", 1);
			item54.RequiredItems.Add("Blueberries", 4);
			item54.CraftAmount = 2;
			Item item55 = new Item("valheimcuisine", "VC_Aebleflaesk");
			item55.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item55.RequiredItems.Add("Pukeberries", 10);
			item55.RequiredItems.Add("VC_CuredPork", 1);
			item55.RequiredItems.Add("Onion", 1);
			item55.RequiredItems.Add("Honey", 1);
			item55.CraftAmount = 1;
			Item item56 = new Item("valheimcuisine", "VC_HatchlingSoup");
			item56.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item56.RequiredItems.Add("TrophyHatchling", 1);
			item56.RequiredItems.Add("VC_DrakeHeart", 1);
			item56.RequiredItems.Add("Onion", 1);
			item56.CraftAmount = 1;
			Item item57 = new Item("valheimcuisine", "VC_WolfSvid");
			item57.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item57.RequiredItems.Add("TrophyWolf", 1);
			item57.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item57.RequiredItems.Add("Thistle", 1);
			item57.CraftAmount = 1;
			Item item58 = new Item("valheimcuisine", "VC_UlvTailStew");
			item58.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item58.RequiredItems.Add("TrophyUlv", 1);
			item58.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item58.RequiredItems.Add("Raspberry", 3);
			item58.CraftAmount = 1;
			Item item59 = new Item("valheimcuisine", "VC_HunterStew");
			item59.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item59.RequiredItems.Add("DeerMeat", 1);
			item59.RequiredItems.Add("WolfMeat", 1);
			item59.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item59.RequiredItems.Add("MeadStaminaMinor", 1);
			item59.CraftAmount = 1;
			Item item60 = new Item("valheimcuisine", "VC_LoxJerky");
			item60.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item60.RequiredItems.Add("LoxMeat", 1);
			item60.RequiredItems.Add("Honey", 2);
			item60.CraftAmount = 2;
			Item item61 = new Item("valheimcuisine", "VC_Gruel");
			item61.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item61.RequiredItems.Add("Barley", 3);
			item61.CraftAmount = 1;
			Item item62 = new Item("valheimcuisine", "VC_PerryPorridge");
			item62.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item62.RequiredItems.Add("Pukeberries", 6);
			item62.RequiredItems.Add("Barley", 6);
			item62.CraftAmount = 1;
			Item item63 = new Item("valheimcuisine", "VC_Lefse");
			item63.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item63.RequiredItems.Add("VC_AncientBarkFlour", 4);
			item63.RequiredItems.Add("VC_Skyr", 1);
			item63.RequiredItems.Add("Honey", 1);
			item63.RequiredItems.Add("VC_Butter", 1);
			item63.CraftAmount = 4;
			Item item64 = new Item("valheimcuisine", "VC_GrouperPottage");
			item64.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item64.RequiredItems.Add("Fish7", 2);
			item64.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item64.RequiredItems.Add("Thistle", 3);
			item64.CraftAmount = 1;
			Item item65 = new Item("valheimcuisine", "VC_Multekrem");
			item65.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item65.RequiredItems.Add("VC_LoxMilk", 1);
			item65.RequiredItems.Add("Honey", 2);
			item65.RequiredItems.Add("Cloudberry", 6);
			item65.CraftAmount = 1;
			Item item66 = new Item("valheimcuisine", "VC_IdunnConfiture");
			item66.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item66.RequiredItems.Add("Raspberry", 2);
			item66.RequiredItems.Add("Blueberries", 2);
			item66.RequiredItems.Add("Cloudberry", 4);
			item66.CraftAmount = 1;
			Item item67 = new Item("valheimcuisine", "VC_Aebleskiver");
			item67.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item67.RequiredItems.Add("BarleyFlour", 4);
			item67.RequiredItems.Add("VC_Butter", 2);
			item67.RequiredItems.Add("Honey", 2);
			item67.RequiredItems.Add("Pukeberries", 12);
			item67.CraftAmount = 4;
			Item item68 = new Item("valheimcuisine", "VC_SweetPorridge");
			item68.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item68.RequiredItems.Add("Blueberries", 2);
			item68.RequiredItems.Add("Honey", 1);
			item68.RequiredItems.Add("VC_Skyr", 1);
			item68.RequiredItems.Add("Barley", 6);
			item68.CraftAmount = 1;
			Item item69 = new Item("valheimcuisine", "VC_TravellerPorridge");
			item69.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item69.RequiredItems.Add("TurnipStew", 1);
			item69.RequiredItems.Add("MushroomYellow", 2);
			item69.RequiredItems.Add("Barley", 6);
			item69.RequiredItems.Add("VC_Butter", 1);
			item69.CraftAmount = 1;
			Item item70 = new Item("valheimcuisine", "VC_WinghunterPorridge");
			item70.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
			item70.RequiredItems.Add("VC_CookedBirdMeat", 3);
			item70.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item70.RequiredItems.Add("Barley", 6);
			item70.RequiredItems.Add("VC_Blaand", 1);
			item70.CraftAmount = 1;
			Item item71 = new Item("valheimcuisine", "VC_LoxHam");
			item71.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item71.RequiredItems.Add("LoxMeat", 2);
			item71.RequiredItems.Add("Thistle", 2);
			item71.RequiredItems.Add("Ooze", 1);
			item71.CraftAmount = 2;
			Item item72 = new Item("valheimcuisine", "VC_FishChowder");
			item72.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item72.RequiredItems.Add("FishRaw", 2);
			item72.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item72.RequiredItems.Add("VC_LoxMilk", 1);
			item72.CraftAmount = 1;
			Item item73 = new Item("valheimcuisine", "VC_NeckBarleyStew");
			item73.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item73.RequiredItems.Add("NeckTail", 2);
			item73.RequiredItems.Add("Barley", 2);
			item73.RequiredItems.Add("Onion", 1);
			item73.RequiredItems.Add("VC_Butter", 1);
			item73.CraftAmount = 1;
			Item item74 = new Item("valheimcuisine", "VC_JarlSearedMeat");
			item74.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item74.RequiredItems.Add("LoxMeat", 1);
			item74.RequiredItems.Add("Cloudberry", 8);
			item74.RequiredItems.Add("Thistle", 2);
			item74.RequiredItems.Add("MeadTasty", 1);
			item74.CraftAmount = 2;
			Item item75 = new Item("valheimcuisine", "VC_LoxSvid");
			item75.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item75.RequiredItems.Add("TrophyLox", 1);
			item75.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item75.RequiredItems.Add("Thistle", 2);
			item75.RequiredItems.Add("VC_Butter", 2);
			item75.CraftAmount = 1;
			Item item76 = new Item("valheimcuisine", "VC_AlfablotStew");
			item76.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item76.RequiredItems.Add("VC_ChoppedMeat", 1);
			item76.RequiredItems.Add("VC_VegetableSoup", 1);
			item76.RequiredItems.Add("VC_Butter", 1);
			item76.RequiredItems.Add("VC_Blaand", 1);
			item76.CraftAmount = 1;
			Item item77 = new Item("valheimcuisine", "VC_JarnvidrSkause");
			item77.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item77.RequiredItems.Add("VC_TrollMeat", 1);
			item77.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item77.RequiredItems.Add("Thistle", 1);
			item77.RequiredItems.Add("TrophyGoblin", 1);
			item77.CraftAmount = 1;
			Item item78 = new Item("valheimcuisine", "VC_WarriorPottage");
			item78.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item78.RequiredItems.Add("VC_ChoppedMeat", 1);
			item78.RequiredItems.Add("VC_CuredPork", 1);
			item78.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item78.RequiredItems.Add("MeadTasty", 1);
			item78.CraftAmount = 1;
			Item item79 = new Item("valheimcuisine", "VC_Surkal");
			item79.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
			item79.RequiredItems.Add("Dandelion", 16);
			item79.RequiredItems.Add("MushroomMagecap", 2);
			item79.CraftAmount = 2;
			Item item80 = new Item("valheimcuisine", "VC_HareJerky");
			item80.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item80.RequiredItems.Add("HareMeat", 2);
			item80.RequiredItems.Add("Honey", 2);
			item80.RequiredItems.Add("Thistle", 1);
			item80.CraftAmount = 4;
			Item item81 = new Item("valheimcuisine", "VC_SpicedFishJerky");
			item81.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item81.RequiredItems.Add("FishRaw", 1);
			item81.RequiredItems.Add("Honey", 1);
			item81.RequiredItems.Add("Sap", 1);
			item81.RequiredItems.Add("Thistle", 2);
			item81.CraftAmount = 2;
			Item item82 = new Item("valheimcuisine", "VC_MushroomStew");
			item82.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item82.RequiredItems.Add("VC_ChoppedShrooms", 2);
			item82.RequiredItems.Add("Thistle", 1);
			item82.CraftAmount = 1;
			Item item83 = new Item("valheimcuisine", "VC_CrunchySkewer");
			item83.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item83.RequiredItems.Add("BugMeat", 1);
			item83.RequiredItems.Add("VC_ChoppedVeggies", 2);
			item83.CraftAmount = 2;
			Item item84 = new Item("valheimcuisine", "VC_ChickenDumpling");
			item84.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item84.RequiredItems.Add("ChickenMeat", 2);
			item84.RequiredItems.Add("ChickenEgg", 1);
			item84.RequiredItems.Add("BarleyFlour", 2);
			item84.CraftAmount = 2;
			Item item85 = new Item("valheimcuisine", "VC_MistyFondue");
			item85.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item85.RequiredItems.Add("VC_LoxCheese", 1);
			item85.RequiredItems.Add("MushroomJotunPuffs", 2);
			item85.RequiredItems.Add("VC_CloudberryAle", 1);
			item85.CraftAmount = 1;
			Item item86 = new Item("valheimcuisine", "VC_CreamBastarde");
			item86.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item86.RequiredItems.Add("VC_LoxMilk", 1);
			item86.RequiredItems.Add("ChickenEgg", 1);
			item86.RequiredItems.Add("Honey", 1);
			item86.RequiredItems.Add("Raspberry", 4);
			item86.CraftAmount = 1;
			Item item87 = new Item("valheimcuisine", "VC_AdventurerPorridge");
			item87.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item87.RequiredItems.Add("VC_VegetableSoup", 1);
			item87.RequiredItems.Add("MushroomJotunPuffs", 2);
			item87.RequiredItems.Add("Barley", 6);
			item87.RequiredItems.Add("Thistle", 2);
			item87.CraftAmount = 1;
			Item item88 = new Item("valheimcuisine", "VC_CharredHareMeat");
			item88.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item88.RequiredItems.Add("HareMeat", 1);
			item88.RequiredItems.Add("Thistle", 1);
			item88.CraftAmount = 1;
			Item item89 = new Item("valheimcuisine", "VC_CrispyPuffers");
			item89.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item89.RequiredItems.Add("Fish12", 2);
			item89.RequiredItems.Add("ChickenEgg", 2);
			item89.RequiredItems.Add("BarleyFlour", 2);
			item89.RequiredItems.Add("VC_BogButter", 1);
			item89.CraftAmount = 2;
			Item item90 = new Item("valheimcuisine", "VC_ChickenStew");
			item90.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item90.RequiredItems.Add("ChickenMeat", 2);
			item90.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item90.CraftAmount = 1;
			Item item91 = new Item("valheimcuisine", "VC_MimameidrSkause");
			item91.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item91.RequiredItems.Add("ChickenMeat", 2);
			item91.RequiredItems.Add("VC_ChoppedShrooms", 1);
			item91.RequiredItems.Add("Flax", 1);
			item91.RequiredItems.Add("Thistle", 1);
			item91.CraftAmount = 1;
			Item item92 = new Item("valheimcuisine", "VC_BoozedMeat");
			item92.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item92.RequiredItems.Add("VC_ChoppedExoticMeat", 2);
			item92.RequiredItems.Add("MushroomJotunPuffs", 4);
			item92.RequiredItems.Add("Sap", 2);
			item92.RequiredItems.Add("VC_Booze", 1);
			item92.CraftAmount = 1;
			Item item93 = new Item("valheimcuisine", "VC_HaldorTrollStew");
			item93.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item93.RequiredItems.Add("VC_CookedTrollMeat", 1);
			item93.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item93.RequiredItems.Add("VC_Booze", 1);
			item93.RequiredItems.Add("VC_Butter", 1);
			item93.CraftAmount = 1;
			Item item94 = new Item("valheimcuisine", "VC_HareStew");
			item94.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item94.RequiredItems.Add("HareMeat", 1);
			item94.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item94.RequiredItems.Add("TrophyHare", 1);
			item94.CraftAmount = 1;
			Item item95 = new Item("valheimcuisine", "VC_Blodplattar");
			item95.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item95.RequiredItems.Add("GiantBloodSack", 2);
			item95.RequiredItems.Add("BarleyFlour", 4);
			item95.RequiredItems.Add("Honey", 2);
			item95.RequiredItems.Add("Blueberries", 6);
			item95.CraftAmount = 2;
			Item item96 = new Item("valheimcuisine", "VC_MeatbugRagout");
			item96.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item96.RequiredItems.Add("GiantBloodSack", 3);
			item96.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item96.RequiredItems.Add("VC_ChoppedShrooms", 1);
			item96.CraftAmount = 1;
			Item item97 = new Item("valheimcuisine", "VC_DvergrMageBroth");
			item97.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item97.RequiredItems.Add("CookedBugMeat", 1);
			item97.RequiredItems.Add("VC_ChoppedVeggies", 1);
			item97.RequiredItems.Add("Sap", 1);
			item97.RequiredItems.Add("VC_DvergrTonic", 1);
			item97.CraftAmount = 1;
			Item item98 = new Item("valheimcuisine", "VC_TrollAspic");
			item98.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item98.RequiredItems.Add("VC_TrollMeat", 1);
			item98.RequiredItems.Add("MushroomMagecap", 2);
			item98.RequiredItems.Add("RoyalJelly", 2);
			item98.CraftAmount = 1;
			Item item99 = new Item("valheimcuisine", "VC_MyrkalfarStew");
			item99.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item99.RequiredItems.Add("Fish9", 2);
			item99.RequiredItems.Add("VC_Surkal", 1);
			item99.RequiredItems.Add("AncientSeed", 1);
			item99.RequiredItems.Add("VC_CloudberryAle", 1);
			item99.CraftAmount = 1;
			Item item100 = new Item("valheimcuisine", "VC_Aeblekage");
			item100.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item100.RequiredItems.Add("Pukeberries", 12);
			item100.RequiredItems.Add("VC_LoxMilk", 1);
			item100.RequiredItems.Add("VC_Paltbrod", 1);
			item100.RequiredItems.Add("FreezeGland", 1);
			item100.CraftAmount = 1;
			Item item101 = new Item("valheimcuisine", "VC_MorgenJerky");
			item101.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item101.RequiredItems.Add("MorgenSinew", 2);
			item101.RequiredItems.Add("Honey", 2);
			item101.CraftAmount = 4;
			Item item102 = new Item("valheimcuisine", "VC_MagmafishStew");
			item102.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item102.RequiredItems.Add("Fish11", 1);
			item102.RequiredItems.Add("Onion", 1);
			item102.RequiredItems.Add("MushroomSmokePuff", 1);
			item102.CraftAmount = 1;
			Item item103 = new Item("valheimcuisine", "VC_ShroomDumplings");
			item103.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item103.RequiredItems.Add("MushroomMagecap", 2);
			item103.RequiredItems.Add("MushroomSmokePuff", 2);
			item103.RequiredItems.Add("VoltureEgg", 1);
			item103.RequiredItems.Add("BarleyFlour", 4);
			item103.CraftAmount = 2;
			Item item104 = new Item("valheimcuisine", "VC_PickleSoup");
			item104.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item104.RequiredItems.Add("VC_PickledVeggies", 1);
			item104.RequiredItems.Add("Fiddleheadfern", 1);
			item104.RequiredItems.Add("Thistle", 1);
			item104.CraftAmount = 1;
			Item item105 = new Item("valheimcuisine", "VC_Meadnog");
			item105.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item105.RequiredItems.Add("VoltureEgg", 2);
			item105.RequiredItems.Add("Honey", 2);
			item105.RequiredItems.Add("VC_LoxMilk", 1);
			item105.RequiredItems.Add("MeadTasty", 1);
			item105.CraftAmount = 2;
			Item item106 = new Item("valheimcuisine", "VC_KingsOmelette");
			item106.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4);
			item106.RequiredItems.Add("VoltureEgg", 3);
			item106.RequiredItems.Add("VC_BogButter", 1);
			item106.RequiredItems.Add("VC_ChoppedShrooms", 1);
			item106.CraftAmount = 1;
			Item item107 = new Item("valheimcuisine", "VC_MagmafishSkewer");
			item107.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3);
			item107.RequiredItems.Add("Fish11", 1);
			item107.RequiredItems.Add("Fiddleheadfern", 1);
			item107.RequiredItems.Add("MushroomYellow", 1);
			item107.CraftAmount = 2;
			Item item108 = new Item("valheimcuisine", "VC_Krumkakes");
			item108.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6);
			item108.RequiredItems.Add("BarleyFlour", 4);
			item108.RequiredItems.Add("VC_Butter", 1);
			item108.RequiredItems.Add("AsksvinEgg", 2);
			item108.RequiredItems.Add("VC_IdunnConfiture", 1);
			item108.CraftAmount = 4;
			Item item109 = new Item("valheimcuisine", "VC_ChickenBucket");
			item109.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item109.RequiredItems.Add("VC_BirdMeat", 4);
			item109.RequiredItems.Add("AsksvinEgg", 2);
			item109.RequiredItems.Add("BarleyFlour", 3);
			item109.RequiredItems.Add("Vineberry", 4);
			item109.CraftAmount = 1;
			Item item110 = new Item("valheimcuisine", "VC_Rommegrot");
			item110.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5);
			item110.RequiredItems.Add("VC_AncientBarkFlour", 4);
			item110.RequiredIte