Decompiled source of Enhanced Item Spawner v1.0.0

plugins/RepoItemSpawner.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Photon.Pun;
using REPOLib.Modules;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RepoItemSpawner")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RepoItemSpawner")]
[assembly: AssemblyTitle("RepoItemSpawner")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace ItemSpawner
{
	[BepInPlugin("com.spoopylocal.itemspawner", "ItemSpawner", "2.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private sealed class <WaitForStatsManager>d__9 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Plugin <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if ((Object)(object)StatsManager.instance == (Object)null)
				{
					Debug.LogWarning((object)"[ItemSpawner] Waiting for StatsManager to initialize...");
					<>2__current = (object)new WaitForSeconds(0.5f);
					<>1__state = 1;
					return true;
				}
				Logger.LogInfo((object)"[ItemSpawner] StatsManager is now available!");
				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();
			}
		}

		internal static Plugin Instance { get; private set; }

		internal static ManualLogSource Logger { get; private set; }

		private void Awake()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			Instance = this;
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"ItemSpawner Enhanced has awoken!");
			Harmony val = new Harmony("com.spoopylocal.itemspawner");
			val.PatchAll();
			Logger.LogInfo((object)"ItemSpawner Enhanced loaded and patches applied.");
			((MonoBehaviour)this).StartCoroutine(WaitForStatsManager());
		}

		[IteratorStateMachine(typeof(<WaitForStatsManager>d__9))]
		private IEnumerator WaitForStatsManager()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForStatsManager>d__9(0)
			{
				<>4__this = this
			};
		}
	}
	[Serializable]
	public class SpawnableItem
	{
		public string name;

		public string displayName;

		public string category;

		public string path;

		public bool isItem;

		public bool isFavorite;

		public SpawnableItem(string name, string displayName, string category, string path, bool isItem)
		{
			this.name = name;
			this.displayName = displayName;
			this.category = category;
			this.path = path;
			this.isItem = isItem;
			isFavorite = false;
		}
	}
	public class EnhancedSpawnGUI : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <InitializeItemsWhenReady>d__23 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public EnhancedSpawnGUI <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				//IL_0064: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					goto IL_004f;
				case 1:
					<>1__state = -1;
					goto IL_004f;
				case 2:
					{
						<>1__state = -1;
						<>4__this.InitializeItems();
						<>4__this.LoadFavorites();
						return false;
					}
					IL_004f:
					if ((Object)(object)StatsManager.instance == (Object)null)
					{
						<>2__current = (object)new WaitForSeconds(0.1f);
						<>1__state = 1;
						return true;
					}
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 2;
					return true;
				}
			}

			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 bool showSpawnGUI = false;

		private string searchText = "";

		private Vector2 scrollPosition = Vector2.zero;

		private Vector2 favoritesScrollPosition = Vector2.zero;

		private List<SpawnableItem> allItems = new List<SpawnableItem>();

		private List<SpawnableItem> filteredItems = new List<SpawnableItem>();

		private List<SpawnableItem> favoriteItems = new List<SpawnableItem>();

		private bool showFavorites = true;

		private bool showSearch = true;

		private string favoritesFilePath;

		private int selectedIndex = -1;

		private bool isInFavorites = false;

		private List<SpawnableItem> currentDisplayList = new List<SpawnableItem>();

		private bool f1KeyPressed = false;

		private bool f1KeyWasPressed = false;

		private bool upKeyPressed = false;

		private bool upKeyWasPressed = false;

		private bool downKeyPressed = false;

		private bool downKeyWasPressed = false;

		private bool enterKeyPressed = false;

		private bool enterKeyWasPressed = false;

		private bool isSearchFieldFocused = false;

		private void Start()
		{
			favoritesFilePath = Path.Combine(Application.persistentDataPath, "ItemSpawner_Favorites.json");
			((MonoBehaviour)this).StartCoroutine(InitializeItemsWhenReady());
		}

		[IteratorStateMachine(typeof(<InitializeItemsWhenReady>d__23))]
		private IEnumerator InitializeItemsWhenReady()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <InitializeItemsWhenReady>d__23(0)
			{
				<>4__this = this
			};
		}

		private void InitializeItems()
		{
			allItems.Clear();
			try
			{
				IReadOnlyList<Item> registeredItems = Items.RegisteredItems;
				if (registeredItems != null)
				{
					foreach (Item item in registeredItems)
					{
						if ((Object)(object)item != (Object)null && !string.IsNullOrEmpty(((Object)item).name))
						{
							string displayName = ((Object)item).name.Replace("(Clone)", "").Trim();
							allItems.Add(new SpawnableItem(((Object)item).name, displayName, "Items", "Items/" + ((Object)item).name, isItem: true));
						}
					}
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Error loading registered items: " + ex.Message));
			}
			try
			{
				IReadOnlyList<GameObject> registeredValuables = Valuables.RegisteredValuables;
				if (registeredValuables != null)
				{
					foreach (GameObject item2 in registeredValuables)
					{
						if ((Object)(object)item2 != (Object)null && !string.IsNullOrEmpty(((Object)item2).name))
						{
							string displayName2 = ((Object)item2).name.Replace("(Clone)", "").Trim();
							string text = "";
							try
							{
								text = ResourcesHelper.GetValuablePrefabPath(item2);
							}
							catch
							{
								text = "Valuables/" + ((Object)item2).name;
							}
							allItems.Add(new SpawnableItem(((Object)item2).name, displayName2, "Valuables", text, isItem: false));
						}
					}
				}
			}
			catch (Exception ex2)
			{
				Debug.LogError((object)("Error loading registered valuables: " + ex2.Message));
			}
			ScanResourcesFolder();
			filteredItems = new List<SpawnableItem>(allItems);
			Debug.Log((object)$"ItemSpawner: Loaded {allItems.Count} items total");
		}

		private void ScanResourcesFolder()
		{
			string[] array = new string[7] { "01 Tiny", "02 Small", "03 Medium", "04 Big", "05 Wide", "06 Tall", "07 Very Tall" };
			string[] array2 = array;
			foreach (string text in array2)
			{
				try
				{
					GameObject[] array3 = Resources.LoadAll<GameObject>("Valuables/" + text);
					GameObject[] array4 = array3;
					foreach (GameObject valuable in array4)
					{
						if ((Object)(object)valuable != (Object)null && !allItems.Any((SpawnableItem item) => item.name == ((Object)valuable).name))
						{
							string displayName = ((Object)valuable).name.Replace("(Clone)", "").Trim();
							allItems.Add(new SpawnableItem(((Object)valuable).name, displayName, text, "Valuables/" + text + "/" + ((Object)valuable).name, isItem: false));
						}
					}
				}
				catch (Exception ex)
				{
					Debug.LogWarning((object)("Could not load valuables from category " + text + ": " + ex.Message));
				}
			}
			try
			{
				GameObject[] array5 = Resources.LoadAll<GameObject>("Items");
				GameObject[] array6 = array5;
				foreach (GameObject item3 in array6)
				{
					if ((Object)(object)item3 != (Object)null && !allItems.Any((SpawnableItem existingItem) => existingItem.name == ((Object)item3).name))
					{
						string displayName2 = ((Object)item3).name.Replace("(Clone)", "").Trim();
						allItems.Add(new SpawnableItem(((Object)item3).name, displayName2, "Items", "Items/" + ((Object)item3).name, isItem: true));
					}
				}
			}
			catch (Exception ex2)
			{
				Debug.LogWarning((object)("Could not load items: " + ex2.Message));
			}
			try
			{
				GameObject[] array7 = Resources.LoadAll<GameObject>("Items/Removed Items");
				GameObject[] array8 = array7;
				foreach (GameObject item2 in array8)
				{
					if ((Object)(object)item2 != (Object)null && !allItems.Any((SpawnableItem existingItem) => existingItem.name == ((Object)item2).name))
					{
						string displayName3 = ((Object)item2).name.Replace("(Clone)", "").Trim();
						allItems.Add(new SpawnableItem(((Object)item2).name, displayName3, "Removed Items", "Items/Removed Items/" + ((Object)item2).name, isItem: true));
					}
				}
			}
			catch (Exception ex3)
			{
				Debug.LogWarning((object)("Could not load removed items: " + ex3.Message));
			}
		}

		private void Update()
		{
			f1KeyWasPressed = f1KeyPressed;
			f1KeyPressed = Input.GetKey((KeyCode)282);
			if (f1KeyPressed && !f1KeyWasPressed)
			{
				showSpawnGUI = !showSpawnGUI;
				if (showSpawnGUI)
				{
					selectedIndex = -1;
					isInFavorites = false;
					GUI.FocusControl((string)null);
				}
				Debug.Log((object)("Enhanced Spawn GUI toggled: " + (showSpawnGUI ? "Shown" : "Hidden")));
			}
			if (!showSpawnGUI)
			{
				return;
			}
			upKeyWasPressed = upKeyPressed;
			upKeyPressed = Input.GetKey((KeyCode)273);
			downKeyWasPressed = downKeyPressed;
			downKeyPressed = Input.GetKey((KeyCode)274);
			enterKeyWasPressed = enterKeyPressed;
			enterKeyPressed = Input.GetKey((KeyCode)13) || Input.GetKey((KeyCode)271);
			if (upKeyPressed && !upKeyWasPressed)
			{
				if (isSearchFieldFocused)
				{
					GUI.FocusControl((string)null);
					isSearchFieldFocused = false;
				}
				NavigateUp();
			}
			else if (downKeyPressed && !downKeyWasPressed)
			{
				if (isSearchFieldFocused)
				{
					GUI.FocusControl((string)null);
					isSearchFieldFocused = false;
				}
				NavigateDown();
			}
			else if (enterKeyPressed && !enterKeyWasPressed)
			{
				if (isSearchFieldFocused)
				{
					GUI.FocusControl((string)null);
					isSearchFieldFocused = false;
				}
				SpawnSelectedItem();
			}
		}

		private void NavigateUp()
		{
			UpdateCurrentDisplayList();
			if (currentDisplayList.Count == 0)
			{
				return;
			}
			if (selectedIndex <= 0)
			{
				if (isInFavorites && showSearch && filteredItems.Count > 0)
				{
					isInFavorites = false;
					selectedIndex = filteredItems.Count - 1;
					scrollPosition.y = float.MaxValue;
				}
				else if (!isInFavorites && showFavorites && favoriteItems.Count > 0)
				{
					isInFavorites = true;
					selectedIndex = favoriteItems.Count - 1;
					favoritesScrollPosition.y = float.MaxValue;
				}
				else
				{
					selectedIndex = currentDisplayList.Count - 1;
				}
			}
			else
			{
				selectedIndex--;
			}
			ScrollToSelectedItem();
		}

		private void NavigateDown()
		{
			UpdateCurrentDisplayList();
			if (currentDisplayList.Count == 0)
			{
				return;
			}
			if (selectedIndex >= currentDisplayList.Count - 1)
			{
				if (!isInFavorites && showFavorites && favoriteItems.Count > 0)
				{
					isInFavorites = true;
					selectedIndex = 0;
					favoritesScrollPosition.y = 0f;
				}
				else if (isInFavorites && showSearch && filteredItems.Count > 0)
				{
					isInFavorites = false;
					selectedIndex = 0;
					scrollPosition.y = 0f;
				}
				else
				{
					selectedIndex = 0;
				}
			}
			else
			{
				selectedIndex++;
			}
			ScrollToSelectedItem();
		}

		private void UpdateCurrentDisplayList()
		{
			if (showSearch && filteredItems.Count > 0 && !isInFavorites)
			{
				currentDisplayList = filteredItems;
			}
			else if (showFavorites && favoriteItems.Count > 0 && isInFavorites)
			{
				currentDisplayList = favoriteItems;
			}
			else if (showSearch && filteredItems.Count > 0)
			{
				isInFavorites = false;
				currentDisplayList = filteredItems;
			}
			else if (showFavorites && favoriteItems.Count > 0)
			{
				isInFavorites = true;
				currentDisplayList = favoriteItems;
			}
			else
			{
				currentDisplayList = new List<SpawnableItem>();
				selectedIndex = -1;
			}
			if (selectedIndex >= currentDisplayList.Count)
			{
				selectedIndex = ((currentDisplayList.Count > 0) ? (currentDisplayList.Count - 1) : (-1));
			}
			if (selectedIndex == -1 && currentDisplayList.Count > 0)
			{
				selectedIndex = 0;
			}
		}

		private void ScrollToSelectedItem()
		{
			if (selectedIndex == -1 || currentDisplayList.Count == 0)
			{
				return;
			}
			float num = 25f;
			float num2 = 150f;
			if (!isInFavorites)
			{
				float num3 = (float)selectedIndex * num;
				if (num3 < scrollPosition.y)
				{
					scrollPosition.y = num3;
				}
				else if (num3 + num > scrollPosition.y + num2)
				{
					scrollPosition.y = num3 - num2 + num;
				}
			}
			else
			{
				float num4 = (float)selectedIndex * num;
				if (num4 < favoritesScrollPosition.y)
				{
					favoritesScrollPosition.y = num4;
				}
				else if (num4 + num > favoritesScrollPosition.y + num2)
				{
					favoritesScrollPosition.y = num4 - num2 + num;
				}
			}
		}

		private void SpawnSelectedItem()
		{
			UpdateCurrentDisplayList();
			if (selectedIndex >= 0 && selectedIndex < currentDisplayList.Count)
			{
				SpawnItem(currentDisplayList[selectedIndex]);
			}
		}

		private void OnGUI()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_038d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			//IL_0487: Unknown result type (might be due to invalid IL or missing references)
			//IL_0319: Unknown result type (might be due to invalid IL or missing references)
			if (!showSpawnGUI)
			{
				return;
			}
			GUILayout.BeginArea(new Rect(10f, 10f, 600f, 500f), "Enhanced Item Spawner", GUI.skin.window);
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button(showSearch ? "Hide Search" : "Show Search", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) }))
			{
				showSearch = !showSearch;
				selectedIndex = -1;
				isInFavorites = false;
			}
			if (GUILayout.Button(showFavorites ? "Hide Favorites" : "Show Favorites", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) }))
			{
				showFavorites = !showFavorites;
				selectedIndex = -1;
				isInFavorites = false;
			}
			GUILayout.EndHorizontal();
			if (showSearch)
			{
				GUILayout.Space(10f);
				GUILayout.Label("Search Items:", Array.Empty<GUILayoutOption>());
				GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
				GUI.SetNextControlName("SearchField");
				string text = GUILayout.TextField(searchText, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) });
				if (text != searchText)
				{
					searchText = text;
					FilterItems();
					selectedIndex = -1;
					isInFavorites = false;
				}
				if (GUILayout.Button("Clear", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) }))
				{
					searchText = "";
					FilterItems();
					selectedIndex = -1;
					isInFavorites = false;
					GUI.FocusControl((string)null);
				}
				GUILayout.EndHorizontal();
				isSearchFieldFocused = GUI.GetNameOfFocusedControl() == "SearchField";
				GUILayout.Label($"Search Results ({filteredItems.Count} items):", Array.Empty<GUILayoutOption>());
				scrollPosition = GUILayout.BeginScrollView(scrollPosition, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(150f) });
				for (int i = 0; i < filteredItems.Count; i++)
				{
					SpawnableItem spawnableItem = filteredItems[i];
					bool flag = !isInFavorites && selectedIndex == i;
					if (flag)
					{
						GUI.backgroundColor = new Color(1f, 0.65f, 0f, 1f);
					}
					GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
					string text2 = (spawnableItem.isFavorite ? "★" : "☆");
					if (GUILayout.Button(text2, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(25f) }))
					{
						ToggleFavorite(spawnableItem);
					}
					if (GUILayout.Button(spawnableItem.displayName + " (" + spawnableItem.category + ")", Array.Empty<GUILayoutOption>()))
					{
						SpawnItem(spawnableItem);
					}
					GUILayout.EndHorizontal();
					if (flag)
					{
						GUI.backgroundColor = Color.white;
					}
				}
				GUILayout.EndScrollView();
			}
			if (showFavorites)
			{
				GUILayout.Space(10f);
				GUILayout.Label($"Favorite Items ({favoriteItems.Count} items):", Array.Empty<GUILayoutOption>());
				favoritesScrollPosition = GUILayout.BeginScrollView(favoritesScrollPosition, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(150f) });
				for (int j = 0; j < favoriteItems.Count; j++)
				{
					SpawnableItem spawnableItem2 = favoriteItems[j];
					bool flag2 = isInFavorites && selectedIndex == j;
					if (flag2)
					{
						GUI.backgroundColor = new Color(1f, 0.65f, 0f, 1f);
					}
					GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
					if (GUILayout.Button("✖", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(25f) }))
					{
						ToggleFavorite(spawnableItem2);
					}
					if (GUILayout.Button(spawnableItem2.displayName + " (" + spawnableItem2.category + ")", Array.Empty<GUILayoutOption>()))
					{
						SpawnItem(spawnableItem2);
					}
					GUILayout.EndHorizontal();
					if (flag2)
					{
						GUI.backgroundColor = Color.white;
					}
				}
				GUILayout.EndScrollView();
			}
			GUILayout.Space(10f);
			GUILayout.Label("Controls: F1=Toggle | ↑↓=Navigate | Enter=Spawn | ★/☆=Favorite | ✖=Remove", Array.Empty<GUILayoutOption>());
			GUILayout.EndArea();
		}

		private void FilterItems()
		{
			if (string.IsNullOrEmpty(searchText))
			{
				filteredItems = new List<SpawnableItem>(allItems);
				return;
			}
			filteredItems = allItems.Where((SpawnableItem item) => item.displayName.ToLower().Contains(searchText.ToLower()) || item.category.ToLower().Contains(searchText.ToLower())).ToList();
		}

		private void ToggleFavorite(SpawnableItem item)
		{
			item.isFavorite = !item.isFavorite;
			if (item.isFavorite)
			{
				if (!favoriteItems.Contains(item))
				{
					favoriteItems.Add(item);
				}
			}
			else
			{
				favoriteItems.Remove(item);
			}
			SaveFavorites();
		}

		private void SaveFavorites()
		{
			try
			{
				List<string> list = favoriteItems.Select((SpawnableItem item) => item.name).ToList();
				string contents = JsonConvert.SerializeObject((object)list, (Formatting)1);
				File.WriteAllText(favoritesFilePath, contents);
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Failed to save favorites: " + ex.Message));
			}
		}

		private void LoadFavorites()
		{
			try
			{
				if (!File.Exists(favoritesFilePath))
				{
					return;
				}
				string text = File.ReadAllText(favoritesFilePath);
				List<string> list = JsonConvert.DeserializeObject<List<string>>(text);
				if (list == null)
				{
					return;
				}
				foreach (string favoriteName in list)
				{
					SpawnableItem spawnableItem = allItems.FirstOrDefault((SpawnableItem i) => i.name == favoriteName);
					if (spawnableItem != null)
					{
						spawnableItem.isFavorite = true;
						favoriteItems.Add(spawnableItem);
					}
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Failed to load favorites: " + ex.Message));
			}
		}

		private void SpawnItem(SpawnableItem spawnableItem)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: 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_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: 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_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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)
			SpawnableItem spawnableItem2 = spawnableItem;
			if ((Object)(object)Camera.main == (Object)null)
			{
				Debug.LogError((object)"No main camera found!");
				return;
			}
			Transform transform = ((Component)Camera.main).transform;
			Vector3 val = transform.position + transform.forward * 2f;
			Quaternion identity = Quaternion.identity;
			try
			{
				if (spawnableItem2.isItem)
				{
					Item val2 = Items.RegisteredItems?.FirstOrDefault((Func<Item, bool>)((Item i) => ((Object)i).name == spawnableItem2.name));
					if ((Object)(object)val2 != (Object)null && (Object)(object)val2.prefab != (Object)null)
					{
						if (SemiFunc.IsMultiplayer())
						{
							PhotonNetwork.InstantiateRoomObject(spawnableItem2.path, val, identity, (byte)0, (object[])null);
						}
						else
						{
							Object.Instantiate<GameObject>(val2.prefab, val, identity);
						}
						Debug.Log((object)("Spawned item: " + spawnableItem2.displayName));
						return;
					}
				}
				else
				{
					GameObject val3 = Valuables.RegisteredValuables?.FirstOrDefault((Func<GameObject, bool>)((GameObject v) => ((Object)v).name == spawnableItem2.name));
					if ((Object)(object)val3 != (Object)null)
					{
						if (SemiFunc.IsMultiplayer())
						{
							PhotonNetwork.InstantiateRoomObject(spawnableItem2.path, val, identity, (byte)0, (object[])null);
						}
						else
						{
							Object.Instantiate<GameObject>(val3, val, identity);
						}
						Debug.Log((object)("Spawned valuable: " + spawnableItem2.displayName));
						return;
					}
				}
				GameObject val4 = Resources.Load<GameObject>(spawnableItem2.path);
				if ((Object)(object)val4 != (Object)null)
				{
					if (SemiFunc.IsMultiplayer())
					{
						PhotonNetwork.InstantiateRoomObject(spawnableItem2.path, val, identity, (byte)0, (object[])null);
					}
					else
					{
						Object.Instantiate<GameObject>(val4, val, identity);
					}
					Debug.Log((object)("Spawned from Resources: " + spawnableItem2.displayName));
				}
				else
				{
					Debug.LogWarning((object)("Failed to spawn item: " + spawnableItem2.displayName + " - prefab not found at path: " + spawnableItem2.path));
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Error spawning " + spawnableItem2.displayName + ": " + ex.Message));
			}
		}
	}
	[HarmonyPatch(typeof(ShopManager), "Awake")]
	public static class ShopManager_Awake_Patch
	{
		private static void Postfix(ShopManager __instance)
		{
			if ((Object)(object)((Component)__instance).gameObject.GetComponent<EnhancedSpawnGUI>() == (Object)null)
			{
				((Component)__instance).gameObject.AddComponent<EnhancedSpawnGUI>();
				Debug.Log((object)"EnhancedSpawnGUI added via Harmony patch.");
			}
		}
	}
}