Decompiled source of Food Unlock v0.3.1

plugins/FoodUnlock/FoodUnlock.dll

Decompiled 11 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Jotunn.Managers;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("FoodUnlock")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.3.1.0")]
[assembly: AssemblyInformationalVersion("0.3.1")]
[assembly: AssemblyProduct("FoodUnlock")]
[assembly: AssemblyTitle("FoodUnlock")]
[assembly: AssemblyVersion("0.3.1.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace FoodUnlock
{
	[BepInPlugin("local.foodunlock", "Food Unlock", "0.3.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public sealed class Plugin : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(Player), "EatFood", new Type[] { typeof(ItemData) })]
		private static class LearnFood
		{
			private static void Postfix(Player __instance, ItemData item, bool __result)
			{
				if (!__result || (Object)(object)__instance != (Object)(object)Player.m_localPlayer || !IsFood(item))
				{
					return;
				}
				HashSet<string> hashSet = ReadUnlocks(__instance);
				if (hashSet.Add(((Object)item.m_dropPrefab).name))
				{
					__instance.m_customData["local.foodunlock.foods.v1"] = string.Join("\n", hashSet.OrderBy<string, string>((string x) => x, StringComparer.Ordinal));
					((Character)__instance).Message((MessageType)1, "Food unlocked: " + Localization.instance.Localize(item.m_shared.m_name), 0, (Sprite)null);
					((BaseUnityPlugin)instance).Logger.LogInfo((object)("Unlocked food: " + ((Object)item.m_dropPrefab).name));
					if (instance.visible)
					{
						instance.RefreshFoods();
						instance.RebuildRows();
					}
				}
			}
		}

		[HarmonyPatch(typeof(ZInput), "GetButton", new Type[] { typeof(string) })]
		private static class AvoidAutoRun
		{
			private static void Postfix(string __0, ref bool __result)
			{
				if (__result && !(__0 != "AutoRun") && !((Object)(object)instance == (Object)null) && !instance.visible)
				{
					Player localPlayer = Player.m_localPlayer;
					if ((Object)(object)localPlayer != (Object)null && !((Character)localPlayer).IsDead() && instance.PressedSlot(localPlayer, held: true) >= 0)
					{
						__result = false;
					}
				}
			}
		}

		private GameObject panel;

		private RectTransform listContent;

		private ScrollRect foodScroll;

		private Text statusText;

		private readonly Text[] slotLabels = (Text[])(object)new Text[3];

		private readonly Image[] slotIcons = (Image[])(object)new Image[3];

		private readonly UITooltip[] slotTips = (UITooltip[])(object)new UITooltip[3];

		private readonly List<Button> eatButtons = new List<Button>();

		private readonly List<Text[]> assignmentLabels = new List<Text[]>();

		private readonly List<Button> sortButtons = new List<Button>();

		private GameObject tooltipPrefab;

		private int sortMode;

		private float nextBookUpdate;

		private static readonly Color Gold = new Color(1f, 0.73f, 0.3f);

		private static readonly Vector2 TopLeft = new Vector2(0f, 1f);

		private const string Id = "local.foodunlock";

		private const string SaveKey = "local.foodunlock.foods.v1";

		private const string SlotKey = "local.foodunlock.slot.v1.";

		private static Plugin instance;

		private Harmony harmony;

		private static readonly MethodInfo TakeInput = AccessTools.Method(typeof(Player), "TakeInput", (Type[])null, (Type[])null);

		private ConfigEntry<KeyboardShortcut> toggle;

		private readonly ConfigEntry<KeyCode>[] slotKeys = new ConfigEntry<KeyCode>[3];

		private Player bookPlayer;

		private bool visible;

		private readonly List<ItemData> foods = new List<ItemData>();

		private string status = "";

		private static void Place(RectTransform rect, float x, float y, float width, float height)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = (rect.pivot = TopLeft);
			Vector2 anchorMin = (rect.anchorMax = val);
			rect.anchorMin = anchorMin;
			rect.anchoredPosition = new Vector2(x, 0f - y);
			rect.sizeDelta = new Vector2(width, height);
		}

		private Text Label(Transform parent, string text, float x, float y, float width, float height, int size = 18, bool heading = false)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = GUIManager.Instance.CreateText(text, parent, TopLeft, TopLeft, Vector2.zero, heading ? GUIManager.Instance.NorseBold : GUIManager.Instance.AveriaSerif, size, heading ? Gold : Color.white, true, Color.black, width, height, false);
			Place(obj.GetComponent<RectTransform>(), x, y, width, height);
			Text component = obj.GetComponent<Text>();
			component.alignment = (TextAnchor)3;
			((Graphic)component).raycastTarget = false;
			return component;
		}

		private Button ButtonAt(Transform parent, string text, float x, float y, float width, float height, Action action)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = GUIManager.Instance.CreateButton(text, parent, TopLeft, TopLeft, Vector2.zero, width, height);
			Place(obj.GetComponent<RectTransform>(), x, y, width, height);
			Button component = obj.GetComponent<Button>();
			((UnityEvent)component.onClick).AddListener((UnityAction)delegate
			{
				action();
			});
			Navigation navigation = default(Navigation);
			((Navigation)(ref navigation)).mode = (Mode)0;
			((Selectable)component).navigation = navigation;
			return component;
		}

		private static Image ImageAt(Transform parent, float x, float y, float width, float height, Color color)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Food image", new Type[2]
			{
				typeof(RectTransform),
				typeof(Image)
			});
			val.transform.SetParent(parent, false);
			Place(val.GetComponent<RectTransform>(), x, y, width, height);
			Image component = val.GetComponent<Image>();
			((Graphic)component).color = color;
			return component;
		}

		private UITooltip Tooltip(GameObject target, ItemData food)
		{
			UITooltip obj = target.AddComponent<UITooltip>();
			obj.m_tooltipPrefab = tooltipPrefab;
			SetTooltip(obj, food);
			return obj;
		}

		private static void SetTooltip(UITooltip tip, ItemData food)
		{
			tip.m_topic = ((food != null) ? DisplayName(food) : "Unassigned");
			tip.m_text = ((food != null) ? Localization.instance.Localize(food.GetTooltip(-1)) : "Choose a food below and click Assign.");
		}

		private bool CreateBook()
		{
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_031e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0397: Unknown result type (might be due to invalid IL or missing references)
			//IL_039e: Expected O, but got Unknown
			if ((Object)(object)GUIManager.CustomGUIFront == (Object)null || (Object)(object)InventoryGui.instance == (Object)null)
			{
				return false;
			}
			try
			{
				UITooltip componentInChildren = InventoryGui.instance.m_playerGrid.m_elementPrefab.GetComponentInChildren<UITooltip>(true);
				if ((Object)(object)componentInChildren == (Object)null || (Object)(object)componentInChildren.m_tooltipPrefab == (Object)null)
				{
					throw new InvalidOperationException("Valheim's inventory tooltip prefab is unavailable.");
				}
				tooltipPrefab = componentInChildren.m_tooltipPrefab;
				panel = GUIManager.Instance.CreateWoodpanel(GUIManager.CustomGUIFront.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, 800f, 760f, false);
				RectTransform component = panel.GetComponent<RectTransform>();
				component.pivot = new Vector2(0.5f, 0.5f);
				((Object)panel).name = "FoodUnlockBook";
				Label((Transform)(object)component, "FOOD BOOK", 28f, 18f, 560f, 46f, 34, heading: true);
				Label((Transform)(object)component, "Eat once to unlock. Hover a food for details.", 28f, 65f, 740f, 28f);
				for (int i = 0; i < 3; i++)
				{
					int slot = i;
					int num = 28 + i * 250;
					Image val = ImageAt((Transform)(object)component, num, 106f, 240f, 104f, new Color(0f, 0f, 0f, 0.28f));
					slotIcons[i] = ImageAt(((Component)val).transform, 10f, 12f, 48f, 48f, Color.white);
					slotIcons[i].preserveAspect = true;
					slotTips[i] = Tooltip(((Component)val).gameObject, null);
					slotLabels[i] = Label(((Component)val).transform, "", 66f, 8f, 166f, 58f, 17);
					ButtonAt(((Component)val).transform, "Clear", 66f, 68f, 100f, 28f, delegate
					{
						bookPlayer.m_customData.Remove("local.foodunlock.slot.v1." + slot);
						RefreshAssignments();
					});
				}
				Label((Transform)(object)component, "Sort by", 28f, 224f, 84f, 32f);
				string[] array = new string[3] { "Name", "Health", "Stamina" };
				for (int num2 = 0; num2 < array.Length; num2++)
				{
					int mode = num2;
					sortButtons.Add(ButtonAt((Transform)(object)component, array[num2], 116 + num2 * 142, 224f, 130f, 34f, delegate
					{
						sortMode = mode;
						SortFoods();
						RebuildRows();
					}));
				}
				Image val2 = ImageAt((Transform)(object)component, 28f, 274f, 744f, 366f, new Color(0f, 0f, 0f, 0.22f));
				((Component)val2).gameObject.AddComponent<RectMask2D>();
				foodScroll = ((Component)val2).gameObject.AddComponent<ScrollRect>();
				foodScroll.viewport = ((Graphic)val2).rectTransform;
				foodScroll.horizontal = false;
				foodScroll.movementType = (MovementType)2;
				foodScroll.scrollSensitivity = 320f;
				GameObject val3 = new GameObject("Foods", new Type[1] { typeof(RectTransform) });
				val3.transform.SetParent(((Component)val2).transform, false);
				listContent = val3.GetComponent<RectTransform>();
				foodScroll.content = listContent;
				statusText = Label((Transform)(object)component, "", 28f, 650f, 744f, 42f, 17);
				Label((Transform)(object)component, "Scroll for more  •  World is not paused", 28f, 705f, 540f, 30f, 16);
				ButtonAt((Transform)(object)component, "Close", 630f, 701f, 140f, 36f, Close);
				RebuildRows();
				UpdateBookScale();
				return true;
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Could not create food book: " + ex));
				DestroyBook();
				((Character)bookPlayer).Message((MessageType)1, "Food book could not open. Check the mod log.", 0, (Sprite)null);
				return false;
			}
		}

		private void SortFoods()
		{
			foods.Sort(delegate(ItemData a, ItemData b)
			{
				int num = ((sortMode == 1) ? b.m_shared.m_food.CompareTo(a.m_shared.m_food) : ((sortMode == 2) ? b.m_shared.m_foodStamina.CompareTo(a.m_shared.m_foodStamina) : 0));
				return (num == 0) ? string.Compare(DisplayName(a), DisplayName(b), StringComparison.CurrentCulture) : num;
			});
		}

		private void RebuildRows()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			foreach (Transform item in (Transform)listContent)
			{
				((Component)item).gameObject.SetActive(false);
				Object.Destroy((Object)(object)((Component)item).gameObject);
			}
			eatButtons.Clear();
			assignmentLabels.Clear();
			Place(listContent, 0f, 0f, 744f, Mathf.Max(366, foods.Count * 116));
			for (int i = 0; i < foods.Count; i++)
			{
				ItemData food = foods[i];
				Image val2 = ImageAt((Transform)(object)listContent, 4f, i * 116 + 4, 736f, 108f, new Color(0f, 0f, 0f, (i % 2 == 0) ? 0.23f : 0.1f));
				Image obj = ImageAt(((Component)val2).transform, 12f, 18f, 64f, 64f, Color.white);
				obj.sprite = food.GetIcon();
				obj.preserveAspect = true;
				Tooltip(((Component)val2).gameObject, food);
				Label(((Component)val2).transform, DisplayName(food), 92f, 4f, 474f, 31f, 22, heading: true);
				SharedData shared = food.m_shared;
				Label(((Component)val2).transform, $"Health {shared.m_food:0}   Stamina {shared.m_foodStamina:0}   Eitr {shared.m_foodEitr:0}", 92f, 35f, 510f, 27f);
				eatButtons.Add(ButtonAt(((Component)val2).transform, "Eat", 616f, 16f, 102f, 38f, delegate
				{
					Eat(bookPlayer, food);
				}));
				Text[] array = (Text[])(object)new Text[3];
				for (int num = 0; num < 3; num++)
				{
					int slot = num;
					Button val3 = ButtonAt(((Component)val2).transform, "", 92 + num * 164, 68f, 152f, 30f, delegate
					{
						//IL_007b: Unknown result type (might be due to invalid IL or missing references)
						//IL_0080: Unknown result type (might be due to invalid IL or missing references)
						bookPlayer.m_customData["local.foodunlock.slot.v1." + slot] = ((Object)food.m_dropPrefab).name;
						status = DisplayName(food) + " assigned to " + ((object)slotKeys[slot].Value/*cast due to .constrained prefix*/).ToString() + ".";
						RefreshAssignments();
					});
					array[num] = ((Component)val3).GetComponentInChildren<Text>();
				}
				assignmentLabels.Add(array);
			}
			if (foods.Count == 0)
			{
				Label((Transform)(object)listContent, "No foods unlocked yet. Eat a food to begin.", 24f, 26f, 680f, 60f, 22);
			}
			foodScroll.verticalNormalizedPosition = 1f;
			for (int num2 = 0; num2 < sortButtons.Count; num2++)
			{
				((Selectable)sortButtons[num2]).interactable = num2 != sortMode;
			}
			RefreshAssignments();
			nextBookUpdate = 0f;
		}

		private void RefreshAssignments()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < 3; i++)
			{
				string name = AssignedFood(bookPlayer, i);
				ItemData val = foods.Find((ItemData f) => ((Object)f.m_dropPrefab).name == name);
				slotLabels[i].text = ((object)slotKeys[i].Value/*cast due to .constrained prefix*/).ToString() + "\n" + ((val != null) ? DisplayName(val) : ((name.Length == 0) ? "Unassigned" : "Unavailable"));
				slotIcons[i].sprite = ((val != null) ? val.GetIcon() : null);
				((Behaviour)slotIcons[i]).enabled = val != null;
				SetTooltip(slotTips[i], val);
				for (int num = 0; num < foods.Count; num++)
				{
					if ((Object)(object)assignmentLabels[num][i] != (Object)null)
					{
						assignmentLabels[num][i].text = ((((Object)foods[num].m_dropPrefab).name == name) ? "Assigned " : "Assign ") + ((object)slotKeys[i].Value/*cast due to .constrained prefix*/).ToString();
					}
				}
			}
		}

		private void UpdateBookScale()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)panel == (Object)null))
			{
				Transform parent = panel.transform.parent;
				RectTransform val = (RectTransform)(object)((parent is RectTransform) ? parent : null);
				if (!((Object)(object)val == (Object)null))
				{
					float[] obj = new float[3] { 1f, 0f, 0f };
					Rect rect = val.rect;
					obj[1] = (((Rect)(ref rect)).width - 32f) / 800f;
					rect = val.rect;
					obj[2] = (((Rect)(ref rect)).height - 32f) / 760f;
					float num = Mathf.Min(obj);
					panel.transform.localScale = Vector3.one * Mathf.Max(0.1f, num);
				}
			}
		}

		private void UpdateBook()
		{
			if ((Object)(object)panel == (Object)null)
			{
				Close();
			}
			else if (!(Time.unscaledTime < nextBookUpdate))
			{
				nextBookUpdate = Time.unscaledTime + 0.2f;
				UpdateBookScale();
				for (int i = 0; i < eatButtons.Count; i++)
				{
					((Selectable)eatButtons[i]).interactable = bookPlayer.CanEat(foods[i], false);
				}
				statusText.text = (string.IsNullOrEmpty(status) ? "Assign three foods above, then use their keys during play." : status);
			}
		}

		private void DestroyBook()
		{
			if ((Object)(object)panel != (Object)null)
			{
				panel.SetActive(false);
				Object.Destroy((Object)(object)panel);
			}
			panel = null;
			eatButtons.Clear();
			assignmentLabels.Clear();
			sortButtons.Clear();
		}

		private void Awake()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			instance = this;
			toggle = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Controls", "Food book", new KeyboardShortcut((KeyCode)288, Array.Empty<KeyCode>()), "Open or close the food book. Eat a real food once to unlock it.");
			KeyCode[] array = new KeyCode[3];
			RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			KeyCode[] array2 = (KeyCode[])(object)array;
			for (int i = 0; i < slotKeys.Length; i++)
			{
				slotKeys[i] = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "Food slot " + (i + 1), array2[i], "Eat the food assigned in the book. Works outside menus, without Alt/Ctrl/Shift.");
			}
			harmony = new Harmony("local.foodunlock");
			harmony.PatchAll(typeof(Plugin).Assembly);
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Food Unlock 0.3.1 loaded. Food book shortcut: " + ((object)toggle.Value/*cast due to .constrained prefix*/).ToString()));
		}

		private static bool IsFood(ItemData item)
		{
			if (item?.m_shared != null && (Object)(object)item.m_dropPrefab != (Object)null && item.m_shared.m_food > 0f && item.m_shared.m_foodBurnTime > 0f)
			{
				return (Object)(object)item.m_shared.m_consumeStatusEffect == (Object)null;
			}
			return false;
		}

		private static HashSet<string> ReadUnlocks(Player player)
		{
			string value;
			return new HashSet<string>(player.m_customData.TryGetValue("local.foodunlock.foods.v1", out value) ? ((IEnumerable<string>)value.Split(new char[1] { '\n' }, StringSplitOptions.RemoveEmptyEntries)) : ((IEnumerable<string>)Array.Empty<string>()), StringComparer.Ordinal);
		}

		private void Update()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			Player localPlayer = Player.m_localPlayer;
			if (visible && ((Object)(object)localPlayer == (Object)null || (Object)(object)localPlayer != (Object)(object)bookPlayer || ((Character)localPlayer).IsDead()))
			{
				Close();
			}
			KeyboardShortcut value;
			if (visible)
			{
				value = toggle.Value;
				if (((KeyboardShortcut)(ref value)).IsDown() || Input.GetKeyDown((KeyCode)27))
				{
					Close();
				}
				else
				{
					UpdateBook();
				}
			}
			else
			{
				if ((Object)(object)localPlayer == (Object)null || ((Character)localPlayer).IsDead())
				{
					return;
				}
				value = toggle.Value;
				bool flag = ((KeyboardShortcut)(ref value)).IsDown();
				int num = PressedSlot(localPlayer);
				if ((!flag && num < 0) || !(bool)TakeInput.Invoke(localPlayer, null))
				{
					return;
				}
				if (!flag)
				{
					string text = AssignedFood(localPlayer, num);
					ItemData val = ResolveFood(text);
					if (val != null && ReadUnlocks(localPlayer).Contains(text))
					{
						Eat(localPlayer, val);
					}
					else
					{
						((Character)localPlayer).Message((MessageType)1, "Assigned food unavailable. Choose another in the food book.", 0, (Sprite)null);
					}
					return;
				}
				bookPlayer = localPlayer;
				status = "";
				RefreshFoods();
				if (!CreateBook())
				{
					bookPlayer = null;
					return;
				}
				visible = true;
				GUIManager.BlockInput(true);
			}
		}

		private static string AssignedFood(Player player, int slot)
		{
			if (!player.m_customData.TryGetValue("local.foodunlock.slot.v1." + slot, out var value))
			{
				return "";
			}
			return value;
		}

		private int PressedSlot(Player player, bool held = false)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKey((KeyCode)308) || Input.GetKey((KeyCode)307) || Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305) || Input.GetKey((KeyCode)304) || Input.GetKey((KeyCode)303))
			{
				return -1;
			}
			for (int i = 0; i < slotKeys.Length; i++)
			{
				if ((int)slotKeys[i].Value != 0 && (held ? Input.GetKey(slotKeys[i].Value) : Input.GetKeyDown(slotKeys[i].Value)) && AssignedFood(player, i).Length > 0)
				{
					return i;
				}
			}
			return -1;
		}

		private static ItemData ResolveFood(string name)
		{
			if (string.IsNullOrEmpty(name) || (Object)(object)ObjectDB.instance == (Object)null)
			{
				return null;
			}
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(name);
			ItemData val = ((!((Object)(object)itemPrefab != (Object)null)) ? null : itemPrefab.GetComponent<ItemDrop>()?.m_itemData);
			if (val == null)
			{
				return null;
			}
			ItemData val2 = val.Clone();
			val2.m_dropPrefab = itemPrefab;
			if (!IsFood(val2))
			{
				return null;
			}
			return val2;
		}

		private void Eat(Player player, ItemData food)
		{
			ItemData val = food.Clone();
			val.m_dropPrefab = food.m_dropPrefab;
			if (((Humanoid)player).CanConsumeItem(val, true) && player.EatFood(val))
			{
				status = "Ate " + DisplayName(val) + ". No item consumed.";
				((Character)player).Message((MessageType)1, status, 0, (Sprite)null);
			}
			else
			{
				status = "You cannot eat that right now.";
			}
		}

		private void RefreshFoods()
		{
			foods.Clear();
			if ((Object)(object)bookPlayer == (Object)null || (Object)(object)ObjectDB.instance == (Object)null)
			{
				return;
			}
			foreach (string item in ReadUnlocks(bookPlayer))
			{
				ItemData val = ResolveFood(item);
				if (val != null)
				{
					foods.Add(val);
				}
			}
			SortFoods();
		}

		private static string DisplayName(ItemData food)
		{
			return Localization.instance.Localize(food.m_shared.m_name);
		}

		private void Close()
		{
			if (visible)
			{
				visible = false;
				GUIManager.BlockInput(false);
				DestroyBook();
				bookPlayer = null;
				foods.Clear();
			}
		}

		private void OnDestroy()
		{
			Close();
			Harmony obj = harmony;
			if (obj != null)
			{
				obj.UnpatchSelf();
			}
			if ((Object)(object)instance == (Object)(object)this)
			{
				instance = null;
			}
		}
	}
}