Decompiled source of ItemInfo v0.1.7

plugins/com.github.yueby.ItemInfo.dll

Decompiled 6 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using HarmonyLib;
using ItemInfo.Components;
using ItemInfo.Utils;
using Microsoft.CodeAnalysis;
using Peak.Afflictions;
using TMPro;
using UnityEngine;
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("com.github.yueby.ItemInfo")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.7.0")]
[assembly: AssemblyInformationalVersion("0.1.7")]
[assembly: AssemblyProduct("com.github.yueby.ItemInfo")]
[assembly: AssemblyTitle("ItemInfo")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.7.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace ItemInfo
{
	[BepInPlugin("com.github.yueby.ItemInfo", "ItemInfo", "0.1.7")]
	public class Plugin : BaseUnityPlugin
	{
		public const string Id = "com.github.yueby.ItemInfo";

		internal static ManualLogSource Log { get; private set; }

		public static string Name => "ItemInfo";

		public static string Version => "0.1.7";

		private void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			Harmony.CreateAndPatchAll(typeof(Plugin), (string)null);
			Log.LogInfo((object)("Plugin " + Name + " is loaded!"));
		}

		[HarmonyPatch(typeof(CharacterItems), "Equip")]
		[HarmonyPostfix]
		public static void OnItemEquippedPatch(CharacterItems __instance)
		{
			Character component = ((Component)__instance).GetComponent<Character>();
			if (!((Object)(object)component != (Object)(object)Character.observedCharacter))
			{
				Log.LogInfo((object)"Item equipped - updating item display");
				UpdateItemDisplay();
			}
		}

		[HarmonyPatch(typeof(ItemCooking), "FinishCooking")]
		[HarmonyPostfix]
		public static void OnFinishCookingPatch(ItemCooking __instance)
		{
			try
			{
				if ((Object)(object)Character.observedCharacter == (Object)(object)((ItemComponent)__instance).item.holderCharacter)
				{
					Log.LogInfo((object)"Item finished cooking, updating display");
					ItemInfoPanel instance = ItemInfoPanel.Instance;
					if (instance.IsVisible())
					{
						UpdateItemDisplay();
						Log.LogInfo((object)"Updated display for cooked item");
					}
				}
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Error in OnFinishCookingPatch: " + ex.Message + "\n" + ex.StackTrace));
			}
		}

		private static void UpdateItemDisplay()
		{
			ItemInfoPanel instance = ItemInfoPanel.Instance;
			Character observedCharacter = Character.observedCharacter;
			object obj;
			if (observedCharacter == null)
			{
				obj = null;
			}
			else
			{
				CharacterData data = observedCharacter.data;
				obj = ((data != null) ? data.currentItem : null);
			}
			Item val = (Item)obj;
			if ((Object)(object)val == (Object)null)
			{
				instance.Hide();
				Log.LogInfo((object)"No item currently held by observed character");
			}
			else
			{
				instance.Show();
				Log.LogInfo((object)("Showing panel for item: " + ((Object)val).name));
			}
		}
	}
}
namespace ItemInfo.Utils
{
	public class StatusIcon
	{
		private const string ICON_PATH_PREFIX = "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/";

		private static readonly string[] iconPaths = new string[12]
		{
			"GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Injury/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Hunger/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Cold/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Poison/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Crab/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Curse/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Sleepy/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Weight/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Heat/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/LayoutGroup/Thorns/Icon",
			"GAME/GUIManager/Canvas_HUD/BarGroup/ExtraStaminaBar/Icon", "GAME/GUIManager/Canvas_HUD/BarGroup/Bar/OutlineMask/Outline/Shield/ShieldIcon"
		};

		private static Dictionary<int, StatusIcon> statusIconMap = new Dictionary<int, StatusIcon>();

		public Color Color { get; private set; }

		public Sprite Icon { get; private set; }

		public StatusIcon(Color color, Sprite icon)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			Color = color;
			Icon = icon;
		}

		public static void Initialize()
		{
			//IL_0070: 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_003b: Unknown result type (might be due to invalid IL or missing references)
			statusIconMap.Clear();
			for (int i = 0; i < iconPaths.Length; i++)
			{
				GameObject val = GameObject.Find(iconPaths[i]);
				if ((Object)(object)val != (Object)null)
				{
					Image component = val.GetComponent<Image>();
					if ((Object)(object)component != (Object)null)
					{
						statusIconMap[i] = new StatusIcon(((Graphic)component).color, component.sprite);
					}
					else
					{
						statusIconMap[i] = new StatusIcon(Color.white, null);
					}
				}
				else
				{
					statusIconMap[i] = new StatusIcon(Color.white, null);
				}
			}
		}

		public static StatusIcon GetStatusIcon(STATUSTYPE statusType)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Expected I4, but got Unknown
			int index = (int)statusType;
			return GetStatusIcon(index);
		}

		public static StatusIcon GetStatusIcon(int index)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (statusIconMap.TryGetValue(index, out StatusIcon value))
			{
				return value;
			}
			return new StatusIcon(Color.white, null);
		}
	}
}
namespace ItemInfo.Components
{
	public class ItemInfo : MonoBehaviour
	{
		private TextMeshProUGUI _infoText;

		private Image _iconImage;

		public void SetInfo(string text, Color color)
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_infoText))
			{
				_infoText = ((Component)this).GetComponentInChildren<TextMeshProUGUI>();
				TextMeshProUGUI interactNameText = GUIManager.instance.interactNameText;
				((TMP_Text)_infoText).font = ((TMP_Text)interactNameText).font;
				((TMP_Text)_infoText).fontSharedMaterial = ((TMP_Text)interactNameText).fontSharedMaterial;
			}
			((TMP_Text)_infoText).text = text;
			((Graphic)_infoText).color = color;
		}

		public void SetIcon(Sprite? sprite, Color color)
		{
			//IL_008c: 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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_iconImage))
			{
				_iconImage = ((Component)this).GetComponentInChildren<Image>();
			}
			((Component)_iconImage).gameObject.SetActive((Object)(object)sprite != (Object)null);
			if ((Object)(object)sprite == (Object)null)
			{
				Vector2 sizeDelta = ((TMP_Text)_infoText).rectTransform.sizeDelta;
				((TMP_Text)_infoText).rectTransform.sizeDelta = new Vector2(sizeDelta.x, ((Graphic)_iconImage).rectTransform.sizeDelta.y);
			}
			_iconImage.sprite = sprite;
			((Graphic)_iconImage).color = color;
		}

		public void SetIconColor(Color color)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_iconImage))
			{
				_iconImage = ((Component)this).GetComponentInChildren<Image>();
			}
			((Graphic)_iconImage).color = color;
		}

		public void SetTextColor(Color color)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_infoText))
			{
				_infoText = ((Component)this).GetComponentInChildren<TextMeshProUGUI>();
			}
			((Graphic)_infoText).color = color;
		}
	}
	public static class ItemInfoFactory
	{
		private const string PANEL_PARENT_PATH = "GAME/GUIManager/Canvas_HUD/Inventory/Layout";

		private const float PANEL_X_POSITION = 73f;

		private const float PANEL_Y_POSITION = 140f;

		private const float ITEM_INFO_WIDTH = 77.45f;

		private const float ITEM_INFO_HEIGHT = 26.82f;

		private const float ITEM_INFO_SPACING = 5f;

		private const float INFO_TEXT_WIDTH = 47.45f;

		private const float INFO_TEXT_X_OFFSET = 23.725f;

		private const float INFO_TEXT_Y_OFFSET = -13.41f;

		private const float INFO_TEXT_FONT_SIZE = 18f;

		private const float ICON_SIZE = 20f;

		public static ItemInfoPanel CreatePanel()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("GAME/GUIManager/Canvas_HUD/Inventory/Layout");
			if ((Object)(object)val == (Object)null)
			{
				Plugin.Log.LogError((object)"Parent object not found at path: GAME/GUIManager/Canvas_HUD/Inventory/Layout");
				return null;
			}
			GameObject val2 = new GameObject("ItemInfoPanel");
			RectTransform val3 = InitializePanelRectTransform(val2);
			val2.AddComponent<LayoutElement>().ignoreLayout = true;
			InitializeVerticalLayoutGroup(val2);
			InitializeContentSizeFitter(val2);
			ItemInfoPanel itemInfoPanel = val2.AddComponent<ItemInfoPanel>();
			val2.transform.SetParent(val.transform);
			val3.anchoredPosition = new Vector2(73f, 140f);
			((Component)itemInfoPanel).gameObject.SetActive(false);
			RefreshLayout(val3);
			return itemInfoPanel;
		}

		public static ItemInfo CreateItemInfo()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("ItemInfo");
			InitializeItemInfoRectTransform(val);
			InitializeHorizontalLayoutGroup(val);
			InitializeItemInfoContentSizeFitter(val);
			CreateInfoTextComponent(val);
			CreateIconComponent(val);
			ItemInfo itemInfo = val.AddComponent<ItemInfo>();
			itemInfo.SetInfo("", Color.white);
			itemInfo.SetIcon(null, Color.white);
			return itemInfo;
		}

		private static RectTransform InitializePanelRectTransform(GameObject panelObject)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = panelObject.AddComponent<RectTransform>();
			val.anchorMax = new Vector2(0.5f, 0f);
			val.anchorMin = new Vector2(0.5f, 0f);
			val.pivot = new Vector2(0.5f, 0f);
			return val;
		}

		private static VerticalLayoutGroup InitializeVerticalLayoutGroup(GameObject panelObject)
		{
			VerticalLayoutGroup val = panelObject.AddComponent<VerticalLayoutGroup>();
			((LayoutGroup)val).childAlignment = (TextAnchor)7;
			((HorizontalOrVerticalLayoutGroup)val).childControlWidth = true;
			((HorizontalOrVerticalLayoutGroup)val).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val).spacing = 0f;
			return val;
		}

		private static ContentSizeFitter InitializeContentSizeFitter(GameObject panelObject)
		{
			ContentSizeFitter val = panelObject.AddComponent<ContentSizeFitter>();
			val.horizontalFit = (FitMode)2;
			val.verticalFit = (FitMode)2;
			return val;
		}

		private static RectTransform InitializeItemInfoRectTransform(GameObject itemInfoGameObject)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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)
			RectTransform val = itemInfoGameObject.AddComponent<RectTransform>();
			val.anchorMax = new Vector2(0f, 1f);
			val.anchorMin = new Vector2(0f, 1f);
			val.sizeDelta = new Vector2(77.45f, 26.82f);
			val.pivot = new Vector2(0.5f, 0.5f);
			return val;
		}

		private static HorizontalLayoutGroup InitializeHorizontalLayoutGroup(GameObject itemInfoGameObject)
		{
			HorizontalLayoutGroup val = itemInfoGameObject.AddComponent<HorizontalLayoutGroup>();
			((LayoutGroup)val).childAlignment = (TextAnchor)4;
			((HorizontalOrVerticalLayoutGroup)val).childControlWidth = false;
			((HorizontalOrVerticalLayoutGroup)val).childControlHeight = false;
			((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
			((HorizontalOrVerticalLayoutGroup)val).childScaleWidth = false;
			((HorizontalOrVerticalLayoutGroup)val).spacing = 5f;
			return val;
		}

		private static ContentSizeFitter InitializeItemInfoContentSizeFitter(GameObject itemInfoGameObject)
		{
			ContentSizeFitter val = itemInfoGameObject.AddComponent<ContentSizeFitter>();
			val.horizontalFit = (FitMode)2;
			val.verticalFit = (FitMode)0;
			return val;
		}

		private static GameObject CreateInfoTextComponent(GameObject parent)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_002e: 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)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Info");
			val.transform.SetParent(parent.transform);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(47.45f, 0f);
			val2.anchoredPosition = new Vector2(23.725f, -13.41f);
			TextMeshProUGUI val3 = val.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val3).text = "";
			((TMP_Text)val3).fontSize = 18f;
			((Graphic)val3).color = Color.white;
			((TMP_Text)val3).alignment = (TextAlignmentOptions)514;
			ContentSizeFitter val4 = val.AddComponent<ContentSizeFitter>();
			val4.horizontalFit = (FitMode)2;
			val4.verticalFit = (FitMode)0;
			return val;
		}

		private static GameObject CreateIconComponent(GameObject parent)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Icon");
			val.transform.SetParent(parent.transform);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(20f, 20f);
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = Color.white;
			val3.preserveAspect = true;
			return val;
		}

		private static void RefreshLayout(RectTransform rectTransform)
		{
			LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);
		}
	}
	public class ItemInfoPanel : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <DelayedRefresh>d__46 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

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

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

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

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

			private bool MoveNext()
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(0.02f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					Refresh();
					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 ItemInfoPanel _instance;

		private const float WEIGHT_MULTIPLIER = 2.5f;

		private const float BASIC_ACTION_MULTIPLIER = 100f;

		private readonly Queue<ItemInfo> itemInfoPool = new Queue<ItemInfo>();

		private readonly List<ItemInfo> activeItemInfos = new List<ItemInfo>();

		private bool isVisible;

		private Item? currentItem;

		public static ItemInfoPanel Instance
		{
			get
			{
				if ((Object)(object)_instance == (Object)null)
				{
					_instance = Object.FindFirstObjectByType<ItemInfoPanel>();
					if ((Object)(object)_instance == (Object)null)
					{
						_instance = CreatePanel();
						StatusIcon.Initialize();
						Plugin.Log.LogInfo((object)"ItemInfoPanel created");
					}
				}
				return _instance;
			}
		}

		private void Awake()
		{
			Hide();
		}

		private void OnDestroy()
		{
			_instance = null;
		}

		public void Show()
		{
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			Item val = GetCurrentItem();
			if ((Object)(object)val == (Object)null)
			{
				Plugin.Log.LogWarning((object)"No current item found");
				return;
			}
			currentItem = val;
			((Component)this).gameObject.SetActive(true);
			isVisible = true;
			RecycleAllItemInfos();
			Refresh();
			Component[] components = ((Component)val).GetComponents<Component>();
			IEnumerable<string> values = components.Select((Component c) => ((object)c).GetType().Name);
			string text = string.Join(", ", values);
			Plugin.Log.LogInfo((object)("Item " + val.GetName() + " components: " + text));
			if (val is Backpack)
			{
				List<Item> backpackItems = GetBackpackItems(val);
				if (backpackItems != null && backpackItems.Count > 0)
				{
					foreach (Item item in backpackItems.Where((Item i) => (Object)(object)i != (Object)null))
					{
						DisplayBackpackItem(item);
					}
				}
			}
			else
			{
				ItemAction[] components2 = ((Component)val).GetComponents<ItemAction>();
				string text2 = components2.Aggregate("", (string current, ItemAction itemAction) => current + ((object)itemAction).GetType().Name + " ");
				DisplayDie(components2);
				DisplayLantern(val);
				DisplayClearAllStatus(components2);
				DisplayAddOrRemoveThorns(components2);
				DisplayRaycastDart(components2);
				DisplayMoraleBoost(components2);
				DisplayBingBongShield(val);
				DisplayShelfShroom(val);
				DisplayModifyStatus(components2);
				DisplayApplyAffliction(components2);
				DisplayInflictPoison(components2);
				DisplayExtraStamina(components2);
				DisplayRestoreHunger(components2);
				Plugin.Log.LogInfo((object)("Show " + val.GetName() + " infos: Actions: " + text2));
			}
			float weight = ((val is Backpack) ? ((((float?)GetBackpackItems(val)?.Sum((Item item) => item.CarryWeight)) ?? 0f) * 2.5f) : ((float)val.CarryWeight * 2.5f));
			DisplayWeight(weight);
			Refresh();
			((Component)this).transform.localScale = Vector3.zero;
			TweenSettingsExtensions.SetEase<TweenerCore<Vector3, Vector3, VectorOptions>>(ShortcutExtensions.DOScale(((Component)this).transform, Vector3.one, 0.2f), (Ease)30);
			if (val is Backpack)
			{
				Plugin.Log.LogInfo((object)$"Show backpack infos: {GetBackpackItems(val)?.Count ?? 0} items");
			}
		}

		private void DisplayBackpackItem(Item item)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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 (item?.UIData != null)
			{
				Texture2D val = item.UIData.icon ?? item.UIData.altIcon;
				if (!((Object)(object)val == (Object)null))
				{
					Sprite icon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
					AddItemInfoToPanel(new StatusIcon(Color.white, icon), item.GetName());
				}
			}
		}

		private float CalculateStatusAmount(float rawAmount, float multiplier, STATUSTYPE statusType)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			if (rawAmount == -1f && ((int)statusType == 3 || (int)statusType == 0))
			{
				return -100f;
			}
			return rawAmount * multiplier;
		}

		private void ProcessStatusAdjustment(STATUSTYPE statusType, float amount, string source)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			StatusIcon statusIcon = StatusIcon.GetStatusIcon(statusType);
			AddItemInfoToPanel(statusIcon, amount);
			Plugin.Log.LogInfo((object)$"Added status info from {source}: {statusType} = {amount}");
		}

		private void DisplayModifyStatus(ItemAction[] actions)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Invalid comparison between Unknown and I4
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			Action_ModifyStatus[] array = actions.Where((ItemAction action) => action is Action_ModifyStatus).Cast<Action_ModifyStatus>().ToArray();
			if (array.Length != 0)
			{
				LogActionFound("modify status", array.Length);
				Action_ModifyStatus[] array2 = array;
				foreach (Action_ModifyStatus val in array2)
				{
					if ((int)val.statusType == 7)
					{
						Plugin.Log.LogInfo((object)"Skipping Weight status type in modify status");
						continue;
					}
					float amount = CalculateStatusAmount(val.changeAmount, 100f, val.statusType);
					ProcessStatusAdjustment(val.statusType, amount, "Action");
				}
			}
			else
			{
				Plugin.Log.LogInfo((object)"No modify status actions found");
			}
		}

		private void DisplayExtraStamina(ItemAction[] actions)
		{
			if (!(((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_GiveExtraStamina)) is Action_GiveExtraStamina))
			{
				return;
			}
			Item val = GetCurrentItem();
			bool flag = (Object)(object)((val != null) ? ((Component)val).GetComponent<Action_Consume>() : null) != (Object)null;
			bool flag2 = (Object)(object)((val != null) ? ((Component)val).GetComponent<Action_ReduceUses>() : null) != (Object)null;
			bool flag3 = val != null && (((Component)val).GetComponent<Action_ReduceUses>()?.consumeOnFullyUsed).GetValueOrDefault();
			if (!flag && !(flag2 && flag3))
			{
				Plugin.Log.LogInfo((object)("Skipped extra stamina display for non-consumable item: " + ((val != null) ? ((Object)val).name : null)));
				return;
			}
			Action_GiveExtraStamina val2 = ((val != null) ? ((Component)val).GetComponent<Action_GiveExtraStamina>() : null);
			if (val2 != null)
			{
				float num = val2.amount * 100f;
				if (num != 0f)
				{
					AddItemInfoToPanel(StatusIcon.GetStatusIcon(10), num);
					Plugin.Log.LogInfo((object)$"Added extra stamina info: {val2.amount} -> {num}");
				}
			}
		}

		private void DisplayRestoreHunger(ItemAction[] actions)
		{
			ItemAction? obj = ((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_RestoreHunger));
			Action_RestoreHunger val = (Action_RestoreHunger)(object)((obj is Action_RestoreHunger) ? obj : null);
			if ((Object)(object)val != (Object)null)
			{
				Plugin.Log.LogInfo((object)"Found restore hunger action");
				StatusIcon statusIcon = StatusIcon.GetStatusIcon((STATUSTYPE)1);
				Item? obj2 = GetCurrentItem();
				Action_RestoreHunger val2 = ((obj2 != null) ? ((Component)obj2).GetComponent<Action_RestoreHunger>() : null);
				if ((Object)(object)val2 != (Object)null)
				{
					float value = val2.restorationAmount * 100f * -1f;
					AddItemInfoToPanel(statusIcon, value);
				}
			}
		}

		private void DisplayInflictPoison(ItemAction[] actions)
		{
			ItemAction? obj = ((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_InflictPoison));
			Action_InflictPoison val = (Action_InflictPoison)(object)((obj is Action_InflictPoison) ? obj : null);
			if (val != null)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon((STATUSTYPE)3);
				float value = val.poisonPerSecond * 100f;
				string suffix = ((val.inflictionTime > 0f) ? $"/s {val.inflictionTime:F1}s" : "");
				AddItemInfoToPanel(statusIcon, value, suffix);
			}
		}

		private void DisplayApplyAffliction(ItemAction[] actions)
		{
			IEnumerable<Action_ApplyAffliction> enumerable = actions.OfType<Action_ApplyAffliction>();
			if (!enumerable.Any())
			{
				return;
			}
			foreach (Action_ApplyAffliction item in enumerable)
			{
				Action_ApplyMassAffliction val = (Action_ApplyMassAffliction)(object)((item is Action_ApplyMassAffliction) ? item : null);
				if (val != null)
				{
					DisplayMassAffliction(val);
				}
				else
				{
					if (item.affliction == null)
					{
						continue;
					}
					ProcessAffliction(item.affliction);
					Affliction[] extraAfflictions = item.extraAfflictions;
					if (extraAfflictions == null || extraAfflictions.Length == 0)
					{
						continue;
					}
					foreach (Affliction item2 in item.extraAfflictions.Where((Affliction e) => e != null))
					{
						ProcessAffliction(item2);
					}
				}
			}
		}

		private void ProcessAffliction(Affliction affliction)
		{
			//IL_000b: 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_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Expected I4, but got Unknown
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			Plugin.Log.LogInfo((object)$"Processing Affliction: Type={affliction.GetAfflictionType()}, TotalTime={affliction.totalTime}, TimeElapsed={affliction.timeElapsed}");
			AfflictionType afflictionType = affliction.GetAfflictionType();
			switch (afflictionType - 1)
			{
			case 0:
				ProcessInfiniteStaminaAffliction(affliction);
				break;
			case 1:
				ProcessFasterBoiAffliction(affliction);
				break;
			case 6:
				ProcessAdjustStatusAffliction(affliction);
				break;
			case 9:
				ProcessAddBonusStaminaAffliction(affliction);
				break;
			case 10:
				ProcessAdjustDrowsyOverTimeAffliction(affliction);
				break;
			case 12:
				ProcessSunscreenAffliction(affliction);
				break;
			case 4:
				ProcessAdjustColdOverTimeAffliction(affliction);
				break;
			case 5:
				ProcessChaosAffliction(affliction);
				break;
			case 7:
				ProcessClearAllStatusAffliction(affliction);
				break;
			default:
				Plugin.Log.LogInfo((object)$"Unhandled affliction type: {afflictionType}");
				break;
			}
		}

		private void ProcessInfiniteStaminaAffliction(Affliction affliction)
		{
			Affliction_InfiniteStamina val = (Affliction_InfiniteStamina)(object)((affliction is Affliction_InfiniteStamina) ? affliction : null);
			if (val != null)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon(10);
				if (val.climbDelay > 0f)
				{
					AddItemInfoToPanel(statusIcon, ((Affliction)val).totalTime + val.climbDelay, "s (run) ∞");
					AddItemInfoToPanel(statusIcon, ((Affliction)val).totalTime, "s (climb) ∞");
				}
				else
				{
					AddItemInfoToPanel(statusIcon, ((Affliction)val).totalTime, "s ∞");
				}
				if (val.drowsyAffliction != null)
				{
					ProcessAffliction(val.drowsyAffliction);
				}
			}
		}

		private void ProcessFasterBoiAffliction(Affliction affliction)
		{
			Affliction_FasterBoi val = (Affliction_FasterBoi)(object)((affliction is Affliction_FasterBoi) ? affliction : null);
			if (val != null)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon(10);
				AddItemInfoToPanel(statusIcon, ((Affliction)val).totalTime + val.climbDelay, "s (run)");
				AddItemInfoToPanel(statusIcon, ((Affliction)val).totalTime, "s (climb)");
				StatusIcon statusIcon2 = StatusIcon.GetStatusIcon((STATUSTYPE)6);
				AddItemInfoToPanel(statusIcon2, val.drowsyOnEnd * 100f);
			}
		}

		private void ProcessAdjustStatusAffliction(Affliction affliction)
		{
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			Affliction_AdjustStatus adjustStatusAffliction = (Affliction_AdjustStatus)(object)((affliction is Affliction_AdjustStatus) ? affliction : null);
			if (adjustStatusAffliction != null)
			{
				Item val = GetCurrentItem();
				Action_ModifyStatus val2 = ((val != null) ? ((IEnumerable<Action_ModifyStatus>)((Component)val).GetComponents<Action_ModifyStatus>()).FirstOrDefault((Func<Action_ModifyStatus, bool>)((Action_ModifyStatus a) => a.statusType == adjustStatusAffliction.statusType)) : null);
				if ((Object)(object)val2 != (Object)null)
				{
					float amount = CalculateStatusAmount(val2.changeAmount, 100f, val2.statusType);
					ProcessStatusAdjustment(val2.statusType, amount, "Action");
				}
				else
				{
					float amount2 = CalculateStatusAmount(adjustStatusAffliction.statusAmount, 100f, adjustStatusAffliction.statusType);
					ProcessStatusAdjustment(adjustStatusAffliction.statusType, amount2, "Affliction");
				}
			}
		}

		private void ProcessAddBonusStaminaAffliction(Affliction affliction)
		{
			Affliction_AddBonusStamina val = (Affliction_AddBonusStamina)(object)((affliction is Affliction_AddBonusStamina) ? affliction : null);
			if (val != null)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon(10);
				float value = val.staminaAmount * 100f;
				AddItemInfoToPanel(statusIcon, value);
			}
		}

		private void ProcessAdjustDrowsyOverTimeAffliction(Affliction affliction)
		{
			Affliction_AdjustDrowsyOverTime val = (Affliction_AdjustDrowsyOverTime)(object)((affliction is Affliction_AdjustDrowsyOverTime) ? affliction : null);
			if (val != null)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon((STATUSTYPE)6);
				float value = Mathf.Round(Mathf.Abs(val.statusPerSecond) * ((Affliction)val).totalTime * 100f * 0.4f) / 0.4f;
				AddItemInfoToPanel(statusIcon, value);
			}
		}

		private void ProcessSunscreenAffliction(Affliction affliction)
		{
			Affliction_Sunscreen val = (Affliction_Sunscreen)(object)((affliction is Affliction_Sunscreen) ? affliction : null);
			if (val != null)
			{
				AddItemInfoToPanel(StatusIcon.GetStatusIcon((STATUSTYPE)8), ((Affliction)val).totalTime, "s");
			}
		}

		private void ProcessAdjustColdOverTimeAffliction(Affliction affliction)
		{
			Affliction_AdjustColdOverTime val = (Affliction_AdjustColdOverTime)(object)((affliction is Affliction_AdjustColdOverTime) ? affliction : null);
			if (val != null)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon((STATUSTYPE)2);
				float num = Mathf.Round(Mathf.Abs(val.statusPerSecond) * ((Affliction)val).totalTime * 100f);
				AddItemInfoToPanel(statusIcon, $"{num} {((Affliction)val).totalTime:F1}s");
			}
		}

		private void ProcessChaosAffliction(Affliction affliction)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			AddItemInfoToPanel(StatusIcon.GetStatusIcon(10), "RANDOM");
			STATUSTYPE[] array = new STATUSTYPE[6];
			RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			STATUSTYPE[] array2 = (STATUSTYPE[])(object)array;
			STATUSTYPE[] array3 = array2;
			foreach (STATUSTYPE statusType in array3)
			{
				AddItemInfoToPanel(StatusIcon.GetStatusIcon(statusType), "RANDOM");
			}
		}

		private void ProcessClearAllStatusAffliction(Affliction affliction)
		{
			Affliction_ClearAllStatus val = (Affliction_ClearAllStatus)(object)((affliction is Affliction_ClearAllStatus) ? affliction : null);
			if (val != null)
			{
				ClearAllStatus(val.excludeCurse, GetFilteredStatusTypesForCurrentItem());
			}
		}

		private void CollectAdjustStatusTypes(Item item, HashSet<STATUSTYPE> filteredTypes)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			Affliction_AdjustStatus[] components = ((Component)item).GetComponents<Affliction_AdjustStatus>();
			foreach (Affliction_AdjustStatus val in components)
			{
				filteredTypes.Add(val.statusType);
			}
			Action_ApplyAffliction[] components2 = ((Component)item).GetComponents<Action_ApplyAffliction>();
			foreach (Action_ApplyAffliction val2 in components2)
			{
				if (val2.affliction != null)
				{
					CollectAdjustStatusTypesFromAffliction(val2.affliction, filteredTypes);
				}
				if (val2.extraAfflictions == null)
				{
					continue;
				}
				foreach (Affliction item2 in val2.extraAfflictions.Where((Affliction a) => a != null))
				{
					CollectAdjustStatusTypesFromAffliction(item2, filteredTypes);
				}
			}
		}

		private void CollectAdjustStatusTypesFromAffliction(Affliction affliction, HashSet<STATUSTYPE> filteredTypes)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Affliction_AdjustStatus val = (Affliction_AdjustStatus)(object)((affliction is Affliction_AdjustStatus) ? affliction : null);
			if (val != null)
			{
				filteredTypes.Add(val.statusType);
			}
			Affliction_InfiniteStamina val2 = (Affliction_InfiniteStamina)(object)((affliction is Affliction_InfiniteStamina) ? affliction : null);
			if (val2 != null && val2.drowsyAffliction != null)
			{
				CollectAdjustStatusTypesFromAffliction(val2.drowsyAffliction, filteredTypes);
			}
		}

		private void DisplayAddOrRemoveThorns(ItemAction[] actions)
		{
			ItemAction? obj = ((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_AddOrRemoveThorns));
			Action_AddOrRemoveThorns val = (Action_AddOrRemoveThorns)(object)((obj is Action_AddOrRemoveThorns) ? obj : null);
			if (val != null)
			{
				AddItemInfoToPanel(StatusIcon.GetStatusIcon((STATUSTYPE)9), (float)val.thornCount * 0.05f * 100f);
			}
		}

		private void DisplayClearAllStatus(ItemAction[] actions)
		{
			ItemAction? obj = ((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_ClearAllStatus));
			Action_ClearAllStatus val = (Action_ClearAllStatus)(object)((obj is Action_ClearAllStatus) ? obj : null);
			if (val != null)
			{
				IEnumerable<Action_ModifyStatus> source = actions.OfType<Action_ModifyStatus>();
				ClearAllStatus(val.excludeCurse, CreateFilteredStatusTypesSet(source.ToArray()));
			}
		}

		private HashSet<STATUSTYPE> CreateFilteredStatusTypesSet(Action_ModifyStatus[] modifyStatusActions)
		{
			return new HashSet<STATUSTYPE>(modifyStatusActions.Select((Action_ModifyStatus a) => a.statusType));
		}

		private HashSet<STATUSTYPE> GetFilteredStatusTypesForCurrentItem()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			HashSet<STATUSTYPE> hashSet = new HashSet<STATUSTYPE>();
			Item val = GetCurrentItem();
			if ((Object)(object)val != (Object)null)
			{
				Action_ModifyStatus[] components = ((Component)val).GetComponents<Action_ModifyStatus>();
				foreach (Action_ModifyStatus val2 in components)
				{
					hashSet.Add(val2.statusType);
				}
				CollectAdjustStatusTypes(val, hashSet);
			}
			return hashSet;
		}

		private void LogActionFound(string actionType, int count = 1)
		{
			if (count > 1)
			{
				Plugin.Log.LogInfo((object)$"Found {count} {actionType} actions");
			}
			else
			{
				Plugin.Log.LogInfo((object)("Found " + actionType + " action"));
			}
		}

		private void ClearAllStatus(bool excludeCurse, HashSet<STATUSTYPE> filteredStatusTypes)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Invalid comparison between Unknown and I4
			//IL_0040: 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_002c: Invalid comparison between Unknown and I4
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			foreach (STATUSTYPE value in Enum.GetValues(typeof(STATUSTYPE)))
			{
				if ((int)value != 7)
				{
					if (excludeCurse && (int)value == 5)
					{
						Plugin.Log.LogInfo((object)"Skipping Curse status type due to excludeCurse = true");
					}
					else if (!filteredStatusTypes.Contains(value))
					{
						StatusIcon statusIcon = StatusIcon.GetStatusIcon(value);
						AddItemInfoToPanel(statusIcon, -100f);
						Plugin.Log.LogInfo((object)$"Added clear effect for {(object)value}: -100f");
					}
				}
			}
		}

		private void DisplayRaycastDart(ItemAction[] actions)
		{
			ItemAction? obj = ((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_RaycastDart));
			Action_RaycastDart val = (Action_RaycastDart)(object)((obj is Action_RaycastDart) ? obj : null);
			if (val == null)
			{
				return;
			}
			AddItemInfoToPanel(null, "Hit players will receive:");
			Affliction[] afflictionsOnHit = val.afflictionsOnHit;
			if (afflictionsOnHit == null || afflictionsOnHit.Length == 0)
			{
				return;
			}
			foreach (Affliction item in val.afflictionsOnHit.Where((Affliction a) => a != null))
			{
				ProcessAffliction(item);
			}
		}

		private void DisplayMoraleBoost(ItemAction[] actions)
		{
			ItemAction? obj = ((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_MoraleBoost));
			Action_MoraleBoost val = (Action_MoraleBoost)(object)((obj is Action_MoraleBoost) ? obj : null);
			if (val != null)
			{
				AddItemInfoToPanel(StatusIcon.GetStatusIcon(10), val.baselineStaminaBoost * 100f);
			}
		}

		private void DisplayDie(ItemAction[] actions)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			if (((IEnumerable<ItemAction>)actions).FirstOrDefault((Func<ItemAction, bool>)((ItemAction action) => action is Action_Die)) is Action_Die)
			{
				StatusIcon statusIcon = StatusIcon.GetStatusIcon((STATUSTYPE)3);
				StatusIcon statusIcon2 = StatusIcon.GetStatusIcon((STATUSTYPE)5);
				ItemInfo itemInfo = AddItemInfoToPanel(statusIcon, "DEATH");
				itemInfo.SetIconColor(statusIcon2.Color);
				itemInfo.SetTextColor(statusIcon2.Color);
			}
		}

		private void DisplayWeight(float weight)
		{
			StatusIcon statusIcon = StatusIcon.GetStatusIcon((STATUSTYPE)7);
			AddItemInfoToPanel(statusIcon, weight);
		}

		private string GetValueSymbol(float value)
		{
			if (value != 0f)
			{
				if (value > 0f)
				{
					return "▲ ";
				}
				return "▼ ";
			}
			return "";
		}

		private ItemInfo AddItemInfoToPanel(StatusIcon statusIcon, float value, string suffix = "", string prefix = "")
		{
			string text = ((value == 0f) ? "0" : $"{Mathf.Abs(value):F1}");
			string valueSymbol = GetValueSymbol(value);
			string text2 = valueSymbol + text;
			if (!string.IsNullOrEmpty(prefix) && prefix.Trim() != "")
			{
				text2 = prefix + text2;
			}
			if (!string.IsNullOrEmpty(suffix))
			{
				text2 += suffix;
			}
			return AddItemInfoToPanelInternal(statusIcon, text2);
		}

		private ItemInfo AddItemInfoToPanel(StatusIcon statusIcon, string text, string suffix = "", string prefix = "")
		{
			string text2 = text;
			if (!string.IsNullOrEmpty(prefix) && prefix.Trim() != "")
			{
				text2 = prefix + text2;
			}
			if (!string.IsNullOrEmpty(suffix))
			{
				text2 += suffix;
			}
			return AddItemInfoToPanelInternal(statusIcon, text2);
		}

		private ItemInfo AddItemInfoToPanelInternal(StatusIcon statusIcon, string displayText)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			ItemInfo itemInfoFromPool = GetItemInfoFromPool();
			Color color = statusIcon?.Color ?? Color.white;
			itemInfoFromPool.SetInfo(displayText, color);
			itemInfoFromPool.SetIcon(statusIcon?.Icon, color);
			((Component)itemInfoFromPool).transform.SetParent(((Component)this).transform);
			((Component)itemInfoFromPool).transform.localScale = Vector3.one;
			RectTransform component = ((Component)itemInfoFromPool).GetComponent<RectTransform>();
			if (component != null)
			{
				component.anchoredPosition = Vector2.zero;
			}
			((Component)itemInfoFromPool).gameObject.SetActive(true);
			activeItemInfos.Add(itemInfoFromPool);
			((MonoBehaviour)this).StartCoroutine(DelayedRefresh());
			return itemInfoFromPool;
		}

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

		private ItemInfo GetItemInfoFromPool()
		{
			if (itemInfoPool.Count > 0)
			{
				ItemInfo itemInfo = itemInfoPool.Dequeue();
				((Component)itemInfo).gameObject.SetActive(true);
				return itemInfo;
			}
			return CreateItemInfo();
		}

		private void RecycleAllItemInfos()
		{
			foreach (ItemInfo activeItemInfo in activeItemInfos)
			{
				if ((Object)(object)activeItemInfo != (Object)null)
				{
					((Component)activeItemInfo).gameObject.SetActive(false);
					((Component)activeItemInfo).transform.SetParent((Transform)null);
					itemInfoPool.Enqueue(activeItemInfo);
				}
			}
			activeItemInfos.Clear();
		}

		public void Hide()
		{
			if (isVisible)
			{
				((Component)this).gameObject.SetActive(false);
				isVisible = false;
				currentItem = null;
				ManualLogSource log = Plugin.Log;
				Item? obj = currentItem;
				log.LogInfo((object)("Hide " + ((obj != null) ? ((Object)obj).name : null) + " infos"));
			}
		}

		public bool IsVisible()
		{
			return isVisible;
		}

		public InventoryItemUI? GetCurrentInventoryItemUI()
		{
			return null;
		}

		private Item? GetCurrentItem()
		{
			Character observedCharacter = Character.observedCharacter;
			object obj;
			if (observedCharacter == null)
			{
				obj = null;
			}
			else
			{
				CharacterData data = observedCharacter.data;
				obj = ((data != null) ? data.currentItem : null);
			}
			if ((Object)obj != (Object)null)
			{
				return Character.observedCharacter.data.currentItem;
			}
			return currentItem;
		}

		private static ItemInfoPanel CreatePanel()
		{
			return ItemInfoFactory.CreatePanel();
		}

		private ItemInfo CreateItemInfo()
		{
			return ItemInfoFactory.CreateItemInfo();
		}

		private List<Item>? GetBackpackItems(Item backpack)
		{
			Backpack val = (Backpack)(object)((backpack is Backpack) ? backpack : null);
			if (val == null)
			{
				Plugin.Log.LogWarning((object)("Item " + ((Object)backpack).name + " is not a Backpack type"));
				return null;
			}
			BackpackData data = ((Item)val).GetData<BackpackData>((DataEntryKey)7);
			if (data == null)
			{
				Plugin.Log.LogWarning((object)("BackpackData not found for backpack: " + ((Object)backpack).name));
				return null;
			}
			List<ItemSlot> list = data.itemSlots.Where((ItemSlot slot) => !slot.IsEmpty()).ToList();
			List<Item> list2 = new List<Item>();
			List<string> list3 = new List<string>();
			foreach (ItemSlot item in list)
			{
				if ((Object)(object)item.prefab != (Object)null)
				{
					list2.Add(item.prefab);
					list3.Add(((Object)item.prefab).name);
				}
			}
			Plugin.Log.LogInfo((object)string.Format("Found {0} filled slots in backpack: {1} - Items: {2}", list.Count, ((Object)backpack).name, string.Join(", ", list3)));
			return list2;
		}

		private void DisplayMassAffliction(Action_ApplyMassAffliction massAfflictionAction)
		{
			if ((Object)(object)massAfflictionAction == (Object)null)
			{
				return;
			}
			AddItemInfoToPanel(null, massAfflictionAction.radius.ToString(), "m radius player receive (when use):");
			if (((Action_ApplyAffliction)massAfflictionAction).affliction != null)
			{
				ProcessAffliction(((Action_ApplyAffliction)massAfflictionAction).affliction);
			}
			Affliction[] extraAfflictions = ((Action_ApplyAffliction)massAfflictionAction).extraAfflictions;
			if (extraAfflictions == null || extraAfflictions.Length == 0)
			{
				return;
			}
			foreach (Affliction item in ((Action_ApplyAffliction)massAfflictionAction).extraAfflictions.Where((Affliction a) => a != null))
			{
				ProcessAffliction(item);
			}
		}

		private void DisplayBingBongShield(Item item)
		{
			if ((Object)(object)((item != null) ? ((Component)item).GetComponent<BingBongShieldWhileHolding>() : null) != (Object)null)
			{
				AddItemInfoToPanel(StatusIcon.GetStatusIcon(11), "Invincible");
			}
		}

		private void DisplayLantern(Item item)
		{
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			Lantern val = ((item != null) ? ((Component)item).GetComponent<Lantern>() : null);
			if (val == null)
			{
				return;
			}
			if (((Object)((Component)item).gameObject).name.Contains("Torch"))
			{
				Plugin.Log.LogInfo((object)("Skipped lantern display for torch item: " + ((Object)item).name));
				return;
			}
			AddItemInfoToPanel(null, "Nearby players receive (when lit):");
			if (((Object)((Component)item).gameObject).name.Contains("Faerie"))
			{
				Transform obj = ((Component)item).transform.Find("FaerieLantern/Light/Heat");
				StatusField val2 = ((obj != null) ? ((Component)obj).GetComponent<StatusField>() : null);
				if (!((Object)(object)val2 != (Object)null))
				{
					return;
				}
				StatusIcon statusIcon = StatusIcon.GetStatusIcon(val2.statusType);
				float num = Mathf.Round(Mathf.Abs(val2.statusAmountPerSecond) * val.startingFuel * 100f);
				AddItemInfoToPanel(statusIcon, 0f - num);
				if (val2.additionalStatuses == null)
				{
					return;
				}
				{
					foreach (StatusFieldStatus additionalStatus in val2.additionalStatuses)
					{
						StatusIcon statusIcon2 = StatusIcon.GetStatusIcon(additionalStatus.statusType);
						float num2 = Mathf.Round(Mathf.Abs(additionalStatus.statusAmountPerSecond) * val.startingFuel * 100f);
						AddItemInfoToPanel(statusIcon2, 0f - num2);
					}
					return;
				}
			}
			Transform obj2 = ((Component)item).transform.Find("GasLantern/Light/Heat");
			StatusField val3 = ((obj2 != null) ? ((Component)obj2).GetComponent<StatusField>() : null);
			if ((Object)(object)val3 != (Object)null)
			{
				StatusIcon statusIcon3 = StatusIcon.GetStatusIcon(val3.statusType);
				float num3 = Mathf.Round(Mathf.Abs(val3.statusAmountPerSecond) * val.startingFuel * 100f);
				AddItemInfoToPanel(statusIcon3, 0f - num3);
			}
		}

		public static void Refresh(RectTransform? rectTransform = null)
		{
			if ((Object)(object)_instance != (Object)null)
			{
				LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)(((object)rectTransform) ?? ((object)/*isinst with value type is only supported in some contexts*/)));
			}
		}

		private void DisplayShelfShroom(Item item)
		{
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			ShelfShroom val = ((item != null) ? ((Component)item).GetComponent<ShelfShroom>() : null);
			if (val == null)
			{
				return;
			}
			GameObject instantiateOnBreak = val.instantiateOnBreak;
			if (instantiateOnBreak != null && ((Object)instantiateOnBreak).name.Equals("HealingPuffShroomSpawn"))
			{
				GameObject gameObject = ((Component)val.instantiateOnBreak.transform.Find("VFX_SporeHealingExplo")).gameObject;
				AOE component = gameObject.GetComponent<AOE>();
				GameObject gameObject2 = ((Component)gameObject.transform.Find("VFX_SporePoisonExplo")).gameObject;
				AOE component2 = gameObject2.GetComponent<AOE>();
				AOE[] components = gameObject2.GetComponents<AOE>();
				TimeEvent component3 = gameObject2.GetComponent<TimeEvent>();
				RemoveAfterSeconds component4 = gameObject2.GetComponent<RemoveAfterSeconds>();
				float num = Mathf.Round(component.statusAmount * 0.9f * 40f) / 40f * 100f;
				StatusIcon statusIcon = StatusIcon.GetStatusIcon(component.statusType);
				Plugin.Log.LogInfo((object)$"healingAOE statusAmount:{component.statusAmount} -> {num}");
				AddItemInfoToPanel(statusIcon, num);
				if ((Object)(object)component2 != (Object)null && (Object)(object)component3 != (Object)null && (Object)(object)component4 != (Object)null)
				{
					float num2 = Mathf.Round(component2.statusAmount * (1f / component3.rate) * 40f) / 40f * 100f;
					StatusIcon statusIcon2 = StatusIcon.GetStatusIcon(component2.statusType);
					Plugin.Log.LogInfo((object)$"poisonAOE statusAmount:{component2.statusAmount} -> {num2}");
					AddItemInfoToPanel(statusIcon2, num2, $"/s {component4.seconds:F1}s");
				}
				if (components.Length > 1)
				{
					float num3 = Mathf.Round(components[1].statusAmount * (1f / component3.rate) * 40f) / 40f * 100f;
					StatusIcon statusIcon3 = StatusIcon.GetStatusIcon(components[1].statusType);
					Plugin.Log.LogInfo((object)$"allPoisonAOEs[1] statusAmount:{components[1].statusAmount} -> {num3}");
					AddItemInfoToPanel(statusIcon3, num3, $"/s {component4.seconds + 1f:F1}s");
				}
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}