Decompiled source of BloodyShop v1.0.2

BloodyShop.dll

Decompiled 6 months ago
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.Json;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Bloodstone.API;
using Bloodstone.Hooks;
using Bloody.Core;
using Bloody.Core.API.v1;
using Bloody.Core.GameData.v1;
using Bloody.Core.Helper.v1;
using Bloody.Core.Methods;
using Bloody.Core.Models.v1;
using Bloody.Core.Models.v1.Base;
using BloodyShop.AutoAnnouncer;
using BloodyShop.AutoAnnouncer.Timers;
using BloodyShop.Client;
using BloodyShop.Client.DB;
using BloodyShop.Client.Patch;
using BloodyShop.Client.UI;
using BloodyShop.Client.UI.Panels.Admin;
using BloodyShop.Client.UI.Panels.User;
using BloodyShop.Client.Utils;
using BloodyShop.DB;
using BloodyShop.DB.Models;
using BloodyShop.Properties;
using BloodyShop.Server;
using BloodyShop.Server.Commands;
using BloodyShop.Server.Core;
using BloodyShop.Server.DB;
using BloodyShop.Server.Systems;
using BloodyShop.Utils;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using NAudio.Wave;
using ProjectM;
using ProjectM.Network;
using Stunlock.Core;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Entities;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using VampireCommandFramework;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("BloodyShop")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Mod to create a store in VRising")]
[assembly: AssemblyFileVersion("1.0.2.0")]
[assembly: AssemblyInformationalVersion("1.0.2+2.Branch.master.Sha.2917e4bd2350f4f3c048624b2484c208fd589ea5")]
[assembly: AssemblyProduct("BloodyShop")]
[assembly: AssemblyTitle("BloodyShop")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
namespace BloodyShop
{
	public class BloodyShop
	{
		public static readonly string ConfigPath = Path.Combine(Paths.ConfigPath, "BloodyShop");

		public static void serverInitMod(Harmony _harmony)
		{
			ServerMod.CreateFilesConfig();
			CommandRegistry.RegisterCommandType(typeof(ShopCommands));
		}

		public static void clientInitMod(Harmony _harmony)
		{
			UIManager.Initialize();
			KeyBinds.Initialize();
			KeyBinds.OnKeyPressed += KeyBindPressed.OnKeyPressedOpenPanel;
		}

		public static void onServerGameInitialized()
		{
			ServerMod.SetConfigMod();
		}

		public static void onClientGameInitialized()
		{
		}

		public static void serverUnloadMod()
		{
		}

		public static void clientUnloadMod()
		{
			KeyBinds.OnKeyPressed -= KeyBindPressed.OnKeyPressedOpenPanel;
		}

		public static void onServerGameDataOnInitialize()
		{
			ServerMod.LoadConfigToDB();
			ServerMod.LoadCurrenciesToDB();
		}

		public static void onClientGameDataOnInitialize()
		{
			ClientMod.ClientEvents_OnGameDataInitialized();
		}
	}
	[BepInPlugin("BloodyShop", "BloodyShop", "1.0.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[Reloadable]
	public class Plugin : BasePlugin, IRunOnInitialized
	{
		internal static Plugin Instance;

		internal static string Name = "BloodyShop";

		internal static string Guid = "BloodyShop";

		internal static string Version = "1.0.2";

		public static Logger Logger;

		private Harmony _harmony;

		public static ConfigEntry<bool> ShopEnabled;

		public static ConfigEntry<bool> AnnounceAddRemovePublic;

		public static ConfigEntry<bool> AnnounceBuyPublic;

		public static ConfigEntry<string> StoreName;

		public static SystemsCore SystemsCore;

		public static ConfigEntry<bool> Sounds;

		private static World _serverWorld;

		private static World _clientWorld;

		public static World Server
		{
			get
			{
				if (_serverWorld != null)
				{
					return _serverWorld;
				}
				_serverWorld = GetWorld("Server") ?? throw new Exception("There is no Server world (yet). Did you install a server mod on the client?");
				return _serverWorld;
			}
		}

		public static World Client
		{
			get
			{
				if (_clientWorld != null)
				{
					return _clientWorld;
				}
				_clientWorld = GetWorld("Client") ?? throw new Exception("There is no Client world (yet). Did you install a client mod on the server?");
				return _clientWorld;
			}
		}

		public static bool IsServer => Application.productName == "VRisingServer";

		public static bool IsClient => Application.productName == "VRisingClient";

		private static World GetWorld(string name)
		{
			Enumerator<World> enumerator = World.s_AllWorlds.GetEnumerator();
			while (enumerator.MoveNext())
			{
				World current = enumerator.Current;
				if (current.Name == name)
				{
					return current;
				}
			}
			return null;
		}

		public override void Load()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			if (VWorld.IsServer)
			{
				Instance = this;
				Logger = new Logger(((BasePlugin)this).Log);
				_harmony = new Harmony("BloodyShop");
				EventsHandlerSystem.OnInitialize += new OnGameDataInitializedEventHandler(GameDataOnInitialize);
				EventsHandlerSystem.OnDestroy += new OnGameDataDestroyedEventHandler(GameDataOnDestroy);
				if (VWorld.IsServer)
				{
					InitConfigServer();
					BloodyShop.serverInitMod(_harmony);
				}
				else
				{
					InitConfigClient();
					BloodyShop.clientInitMod(_harmony);
				}
				ManualLogSource log = ((BasePlugin)this).Log;
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(21, 0, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("BloodyShop is loaded!");
				}
				log.LogInfo(val);
			}
		}

		public override bool Unload()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			if (VWorld.IsServer)
			{
				((BasePlugin)this).Config.Clear();
				BloodyShop.serverUnloadMod();
				CommandRegistry.UnregisterAssembly();
			}
			else
			{
				BloodyShop.clientUnloadMod();
			}
			_harmony.UnpatchSelf();
			EventsHandlerSystem.OnDestroy -= new OnGameDataDestroyedEventHandler(GameDataOnDestroy);
			EventsHandlerSystem.OnInitialize -= new OnGameDataInitializedEventHandler(GameDataOnInitialize);
			return true;
		}

		private static void GameDataOnInitialize(World world)
		{
			SystemsCore = Core.SystemsCore;
			if (VWorld.IsServer)
			{
				BloodyShop.onServerGameDataOnInitialize();
				return;
			}
			try
			{
				BloodyShop.onClientGameDataOnInitialize();
			}
			catch (Exception ex)
			{
				Logger.LogError("Error GameDataOnInitialize " + ex.Message);
			}
		}

		private static void GameDataOnDestroy()
		{
		}

		private void InitConfigClient()
		{
			Sounds = ((BasePlugin)this).Config.Bind<bool>("Client", "enabled", true, "Enable Sounds");
		}

		private void InitConfigServer()
		{
			ShopEnabled = ((BasePlugin)this).Config.Bind<bool>("ConfigShop", "enabled", true, "Enable Shop");
			StoreName = ((BasePlugin)this).Config.Bind<string>("ConfigShop", "name", "Bloody Shop", "Store's name");
			AnnounceAddRemovePublic = ((BasePlugin)this).Config.Bind<bool>("ConfigShop", "announceAddRemovePublic", true, "Public announcement when an item is added or removed from the store");
			AnnounceBuyPublic = ((BasePlugin)this).Config.Bind<bool>("ConfigShop", "announceBuyPublic", true, "Public announcement when someone buys an item from the store");
		}

		public void OnGameInitialized()
		{
			if (VWorld.IsServer)
			{
				BloodyShop.onServerGameInitialized();
			}
			else
			{
				BloodyShop.onClientGameInitialized();
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "BloodyShop";

		public const string PLUGIN_NAME = "BloodyShop";

		public const string PLUGIN_VERSION = "1.0.2";
	}
}
namespace BloodyShop.Utils
{
	internal class FontColorChat
	{
		public static string Color(string hexColor, string text)
		{
			return $"<color={hexColor}>{text}</color>";
		}

		public static string Red(string text)
		{
			return Color("#E90000", text);
		}

		public static string Blue(string text)
		{
			return Color("#0000ff", text);
		}

		public static string Green(string text)
		{
			return Color("#7FE030", text);
		}

		public static string Yellow(string text)
		{
			return Color("#FBC01E", text);
		}

		public static string White(string text)
		{
			return Color("#FFFFFF", text);
		}
	}
	public static class RectTransformExtensions
	{
		public static Vector2 GetSize(this RectTransform source)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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)
			Rect rect = source.rect;
			return ((Rect)(ref rect)).size;
		}

		public static float GetWidth(this RectTransform source)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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)
			Rect rect = source.rect;
			return ((Rect)(ref rect)).size.x;
		}

		public static float GetHeight(this RectTransform source)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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)
			Rect rect = source.rect;
			return ((Rect)(ref rect)).size.y;
		}

		public static void SetSize(this RectTransform source, RectTransform toCopy)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			source.SetSize(toCopy.GetSize());
		}

		public static void SetSize(this RectTransform source, Vector2 newSize)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			source.SetSize(newSize.x, newSize.y);
		}

		public static void SetSize(this RectTransform source, float width, float height)
		{
			source.SetSizeWithCurrentAnchors((Axis)0, width);
			source.SetSizeWithCurrentAnchors((Axis)1, height);
		}

		public static void SetWidth(this RectTransform source, float width)
		{
			source.SetSizeWithCurrentAnchors((Axis)0, width);
		}

		public static void SetHeight(this RectTransform source, float height)
		{
			source.SetSizeWithCurrentAnchors((Axis)1, height);
		}
	}
}
namespace BloodyShop.Server
{
	public class ServerMod
	{
		public static ConfigEntry<bool> ShopEnabled;

		public static ConfigEntry<int> CurrencyGUID;

		public static readonly string ConfigPath = Path.Combine(Paths.ConfigPath, "BloodyShop");

		public static readonly string DropSystemPath = Path.Combine(ConfigPath, "DropSystem");

		public static string ProductListFile = Path.Combine(ConfigPath, "products_list.json");

		public static string CurrencyListFile = Path.Combine(ConfigPath, "currency_list.json");

		public static string UserCurrenciesPerDayFile = Path.Combine(ConfigPath, "user_currencies_per_day.json");

		public static void CreateFilesConfig()
		{
			if (!Directory.Exists(ConfigPath))
			{
				Directory.CreateDirectory(ConfigPath);
			}
			if (!File.Exists(ProductListFile))
			{
				File.WriteAllText(ProductListFile, "[]");
			}
			if (!File.Exists(CurrencyListFile))
			{
				File.WriteAllText(CurrencyListFile, "[{\"id\":1,\"name\":\"Silver Coin\",\"guid\":-949672483}]");
			}
			if (!Directory.Exists(DropSystemPath))
			{
				Directory.CreateDirectory(DropSystemPath);
			}
			if (!File.Exists(UserCurrenciesPerDayFile))
			{
				File.WriteAllText(UserCurrenciesPerDayFile, "");
			}
		}

		public static void LoadConfigToDB()
		{
			if (!LoadDataFromFiles.loadProductList())
			{
				Plugin.Logger.LogError("Error loading ProductList");
			}
		}

		public static void LoadCurrenciesToDB()
		{
			if (!LoadDataFromFiles.loadCurrencies())
			{
				Plugin.Logger.LogError("Error loading CurrenciesList");
			}
		}

		public static void SetConfigMod()
		{
			ConfigDB.ShopEnabled = Plugin.ShopEnabled.Value;
			ConfigDB.AnnounceAddRemovePublic = Plugin.AnnounceAddRemovePublic.Value;
			ConfigDB.AnnounceBuyPublic = Plugin.AnnounceBuyPublic.Value;
			string value = Plugin.StoreName.Value;
			if (value != string.Empty)
			{
				ConfigDB.StoreName = value;
			}
		}
	}
}
namespace BloodyShop.Server.Systems
{
	internal class UserUI
	{
		private static Dictionary<string, User> _users = new Dictionary<string, User>();

		public static void RegisterUserWithUI(User user)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			_users.TryAdd(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString(), user);
		}

		public static Dictionary<string, User> GetUsersWithUI()
		{
			return _users;
		}
	}
}
namespace BloodyShop.Server.DB
{
	public class ConfigDB
	{
		public static bool ShopEnabled { get; set; } = true;


		public static bool AnnounceAddRemovePublic { get; set; } = true;


		public static bool AnnounceBuyPublic { get; set; } = true;


		public static string StoreName { get; set; } = "Bloody Shop";

	}
	internal class LoadDataFromFiles
	{
		public static bool loadProductList()
		{
			try
			{
				return ItemsDB.setProductList(JsonSerializer.Deserialize<List<ItemShopModel>>(File.ReadAllText(ServerMod.ProductListFile)));
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}

		public static bool loadCurrencies()
		{
			try
			{
				return ShareDB.setCurrencyList(JsonSerializer.Deserialize<List<CurrencyModel>>(File.ReadAllText(ServerMod.CurrencyListFile)));
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}
	}
	internal class SaveDataToFiles
	{
		public static bool saveProductList()
		{
			try
			{
				string contents = JsonSerializer.Serialize(ItemsDB.getProductListForSaveJSON());
				File.WriteAllText(ServerMod.ProductListFile, contents);
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}

		public static bool saveCurrenciesList()
		{
			try
			{
				string contents = JsonSerializer.Serialize(ShareDB.getCurrencyList());
				File.WriteAllText(ServerMod.CurrencyListFile, contents);
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}
	}
}
namespace BloodyShop.Server.Core
{
	public class InventorySystem
	{
		public static bool searchPrefabsInInventory(string characterName, PrefabGUID prefabCurrencyGUID, out int total)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: 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_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			total = 0;
			try
			{
				Entity entity = GameData.Users.GetUserByCharacterName(characterName).Character.Entity;
				NativeArray<InventoryBuffer> val = default(NativeArray<InventoryBuffer>);
				InventoryUtilities.TryGetInventory(Plugin.Server.EntityManager, entity, ref val, 0);
				total = InventoryUtilities.GetItemAmount(Plugin.Server.EntityManager, entity, prefabCurrencyGUID, default(Nullable_Unboxed<int>));
				if (total >= 0)
				{
					return true;
				}
				return false;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}

		public static bool verifyHaveSuficientPrefabsInInventory(string characterName, PrefabGUID prefabCurrencyGUID, int quantity = 1)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (searchPrefabsInInventory(characterName, prefabCurrencyGUID, out var total))
				{
					if (total >= quantity)
					{
						return true;
					}
					return false;
				}
				return false;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}

		public static bool getPrefabFromInventory(string characterName, PrefabGUID prefabGUID, int quantity)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_0069: 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)
			//IL_010b: 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_00b9: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				int num = quantity;
				UserModel userByCharacterName = GameData.Users.GetUserByCharacterName(characterName);
				ItemModel prefabById = GameData.Items.GetPrefabById(prefabGUID);
				Entity entity = userByCharacterName.Character.Entity;
				int inventorySize = InventoryUtilities.GetInventorySize(Plugin.Server.EntityManager, entity);
				Plugin.Server.GetExistingSystemManaged<GameDataSystem>();
				InventoryBuffer val = default(InventoryBuffer);
				for (int i = 0; i < inventorySize; i++)
				{
					if (!InventoryUtilities.TryGetItemAtSlot(Plugin.Server.EntityManager, entity, i, ref val))
					{
						continue;
					}
					ItemModel prefabById2 = GameData.Items.GetPrefabById(val.ItemType);
					if (prefabById2 != null && prefabById2.PrefabName == prefabById.PrefabName)
					{
						if (val.Amount >= num)
						{
							InventoryUtilitiesServer.TryRemoveItemAtIndex(Plugin.Server.EntityManager, entity, val.ItemType, num, i, false);
							num = 0;
							break;
						}
						if (val.Amount < num)
						{
							InventoryUtilitiesServer.TryRemoveItemAtIndex(Plugin.Server.EntityManager, entity, val.ItemType, val.Amount, i, true);
							num -= val.Amount;
						}
						if (num == 0)
						{
							break;
						}
					}
				}
				if (num > 0)
				{
					AdditemToInventory(userByCharacterName.CharacterName, prefabGUID, quantity - num);
					return false;
				}
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error " + ex.Message);
				return false;
			}
		}

		public static bool AdditemToInventory(string characterName, PrefabGUID prefabGUID, int quantity)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				UserModel userByCharacterName = GameData.Users.GetUserByCharacterName(characterName);
				Entity val = default(Entity);
				for (int i = 0; i < quantity; i++)
				{
					if (!UserModelMethods.TryGiveItem(userByCharacterName, prefabGUID, 1, ref val))
					{
						UserModelMethods.DropItemNearby(userByCharacterName, prefabGUID, 1);
					}
				}
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error " + ex.Message);
				return false;
			}
		}
	}
}
namespace BloodyShop.Server.Commands
{
	[CommandGroup("shop", null)]
	internal class ShopCommands
	{
		public static CurrencyModel currency { get; private set; }

		public static List<CurrencyModel> currencies { get; private set; }

		[Command("currency add", null, "\"<Name>\" <PrefabGuid>", "Add a currency to the store. To know the PrefabGuid of an item you must look for the item in the following URL <#4acc45><u>https://gaming.tools/v-rising/items</u></color>", null, true)]
		public static void AddCurrency(ChatCommandContext ctx, string name, int item, bool drop)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			PrefabGUID val = default(PrefabGUID);
			((PrefabGUID)(ref val))..ctor(item);
			if (GameData.Items.GetPrefabById(val) == null)
			{
				throw ctx.Error("Invalid item type");
			}
			if (!ShareDB.addCurrencyList(name, item, drop))
			{
				throw ctx.Error("Invalid item type");
			}
			SaveDataToFiles.saveCurrenciesList();
			ctx.Reply(FontColorChat.Yellow("Added currency " + FontColorChat.White(name ?? "") + " to the store"));
			foreach (KeyValuePair<string, User> item2 in UserUI.GetUsersWithUI())
			{
				User value = item2.Value;
				if (value.IsConnected)
				{
					_ = value.IsAdmin;
				}
			}
		}

		[Command("currency list", null, "", "List of products available to buy in the store", null, true)]
		public static void ListCurrency(ChatCommandContext ctx)
		{
			if (!ConfigDB.ShopEnabled)
			{
				throw ctx.Error(FontColorChat.Yellow(FontColorChat.White(ConfigDB.StoreName ?? "") + " is closed"));
			}
			List<string> currencyListMessage = ShareDB.GetCurrencyListMessage();
			if (currencyListMessage.Count <= 0)
			{
				throw ctx.Error("No currency available in the store");
			}
			foreach (string item in currencyListMessage)
			{
				ctx.Reply(item);
			}
		}

		[Command("currency remove", "crm", "<NumberItem>", "Delete a currency from the store", null, true)]
		public static void RemoveCurrency(ChatCommandContext ctx, int index)
		{
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (ShareDB.currenciesList.Count == 1)
				{
					throw ctx.Error(FontColorChat.Yellow("Do not remove all currency from the store."));
				}
				if (!ShareDB.SearchCurrencyByCommand(index, out var currencyModel))
				{
					throw ctx.Error(FontColorChat.Yellow("Currency removed error."));
				}
				if (!ShareDB.RemoveCurrencyyByCommand(index))
				{
					throw ctx.Error(FontColorChat.Yellow("Item " + FontColorChat.White(currencyModel.name ?? "") + " removed error."));
				}
				SaveDataToFiles.saveCurrenciesList();
				LoadDataFromFiles.loadCurrencies();
				ctx.Reply(FontColorChat.Yellow("Currency " + FontColorChat.White(currencyModel.name ?? "") + " removed successful."));
				foreach (KeyValuePair<string, User> item in UserUI.GetUsersWithUI())
				{
					User value = item.Value;
					if (value.IsConnected)
					{
						_ = value.IsAdmin;
					}
				}
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				throw ctx.Error("Error: " + ex.Message);
			}
		}

		[Command("add", null, "\"<Name>\" <PrefabGuid> <Currency> <Price> <Stock> <Stack> <Buff|true/false>", "Add a product to the store. To know the PrefabGuid of an item you must look for the item in the following URL <#4acc45><u>https://gaming.tools/v-rising/items</u></color>", null, true)]
		public static void AddItem(ChatCommandContext ctx, string name, int item, int currencyId, int price, int stock, int stack = 1, bool isBuff = false)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Plugin.Logger.LogInfo($"Estamos añadiendo un buff o no? {isBuff}");
				if (!isBuff)
				{
					PrefabGUID val = default(PrefabGUID);
					((PrefabGUID)(ref val))..ctor(item);
					if (GameData.Items.GetPrefabById(val) == null)
					{
						throw ctx.Error("Invalid item type");
					}
				}
				currencies = ShareDB.getCurrencyList();
				currency = currencies.FirstOrDefault((CurrencyModel currency) => currency.id == currencyId);
				if (currency == null)
				{
					throw ctx.Error("Error loading currency type");
				}
				if (stock <= 0)
				{
					stock = -1;
				}
				if (!ItemsDB.addProductList(item, price, stock, name, currency.guid, stack, isBuff))
				{
					throw ctx.Error("Invalid item type");
				}
				SaveDataToFiles.saveProductList();
				ctx.Reply(FontColorChat.Yellow("Added item " + FontColorChat.White($"{stack}x {name} ({stock})") + " to the store with a price of " + FontColorChat.White($"{price} {currency?.name.ToString()}")));
				if (!ConfigDB.ShopEnabled)
				{
					return;
				}
				if (ConfigDB.AnnounceAddRemovePublic)
				{
					ServerChatUtils.SendSystemMessageToAllClients(VWorld.Server.EntityManager, FontColorChat.Yellow(FontColorChat.White($"{stack}x {name} ({stock})") + " have been added to the Store for " + FontColorChat.White($"{price} {currency?.name.ToString()}")));
				}
				foreach (KeyValuePair<string, User> item2 in UserUI.GetUsersWithUI())
				{
					_ = item2.Value.IsConnected;
				}
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError(ex.Message);
				throw ctx.Error("Error saving the item in the store ");
			}
		}

		[Command("buy", null, "<NumberItem> <Quantity> ", "Buy an object from the shop", null, false)]
		public static void BuyItem(ChatCommandContext ctx, int indexPosition, int quantity)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0376: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Unknown result type (might be due to invalid IL or missing references)
			//IL_040b: Unknown result type (might be due to invalid IL or missing references)
			//IL_043e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0455: Unknown result type (might be due to invalid IL or missing references)
			//IL_045a: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Entity senderCharacterEntity = ctx.Event.SenderCharacterEntity;
				if (!ConfigDB.ShopEnabled)
				{
					throw ctx.Error(FontColorChat.Yellow(FontColorChat.White(ConfigDB.StoreName ?? "") + " is closed"));
				}
				if (quantity <= 0)
				{
					throw ctx.Error("The minimum purchase quantity of a product is 1");
				}
				if (!ItemsDB.SearchItemByCommand(indexPosition, out var itemShopModel))
				{
					throw ctx.Error("This item is not available in the store");
				}
				currency = ShareDB.getCurrency(itemShopModel.currency);
				if (currency == null)
				{
					throw ctx.Error("Error loading currency type");
				}
				int num = itemShopModel.PrefabPrice * quantity;
				if (!itemShopModel.CheckStockAvailability(quantity))
				{
					throw ctx.Error("There is not enough stock of this item");
				}
				ItemModel prefabById = GameData.Items.GetPrefabById(new PrefabGUID(currency.guid));
				User user = ctx.Event.User;
				if (!InventorySystem.verifyHaveSuficientPrefabsInInventory(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString(), ((EntityModel)prefabById).PrefabGUID, num))
				{
					throw ctx.Error("You need " + FontColorChat.White($"{num} {currency.name}") + " in your inventory for this purchase");
				}
				user = ctx.Event.User;
				if (!InventorySystem.getPrefabFromInventory(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString(), ((EntityModel)prefabById).PrefabGUID, num))
				{
					throw ctx.Error("You need " + FontColorChat.White($"{num} {currency.name}") + " in your inventory for this purchase");
				}
				int num2 = itemShopModel.PrefabStack * quantity;
				if (itemShopModel.isBuff)
				{
					BuffSystem.BuffPlayer(senderCharacterEntity, ctx.Event.SenderUserEntity, new PrefabGUID(itemShopModel.PrefabGUID), 0, true);
				}
				else
				{
					user = ctx.Event.User;
					if (!InventorySystem.AdditemToInventory(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString(), new PrefabGUID(itemShopModel.PrefabGUID), num2))
					{
						Logger logger = Plugin.Logger;
						DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(58, 4);
						defaultInterpolatedStringHandler.AppendLiteral("Error buying an item User: ");
						user = ctx.Event.User;
						defaultInterpolatedStringHandler.AppendFormatted(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString());
						defaultInterpolatedStringHandler.AppendLiteral(" Item: ");
						defaultInterpolatedStringHandler.AppendFormatted(itemShopModel.PrefabName);
						defaultInterpolatedStringHandler.AppendLiteral(" Quantity: ");
						defaultInterpolatedStringHandler.AppendFormatted(quantity);
						defaultInterpolatedStringHandler.AppendLiteral(" TotalPrice: ");
						defaultInterpolatedStringHandler.AppendFormatted(num);
						logger.LogError(defaultInterpolatedStringHandler.ToStringAndClear());
						throw ctx.Error("An error has occurred when delivering the items, please contact an administrator");
					}
				}
				ctx.Reply(FontColorChat.Yellow("Transaction successful. You have purchased " + FontColorChat.White($"{quantity}x {itemShopModel.PrefabName}") + " for a total of  " + FontColorChat.White($"{num} {currency.name}")));
				if (!ItemsDB.ModifyStockByCommand(indexPosition, quantity))
				{
					Logger logger2 = Plugin.Logger;
					DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(59, 4);
					defaultInterpolatedStringHandler.AppendLiteral("Error ModifyStockByCommand: ");
					user = ctx.Event.User;
					defaultInterpolatedStringHandler.AppendFormatted(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString());
					defaultInterpolatedStringHandler.AppendLiteral(" Item: ");
					defaultInterpolatedStringHandler.AppendFormatted(itemShopModel.PrefabName);
					defaultInterpolatedStringHandler.AppendLiteral(" Quantity: ");
					defaultInterpolatedStringHandler.AppendFormatted(quantity);
					defaultInterpolatedStringHandler.AppendLiteral(" TotalPrice: ");
					defaultInterpolatedStringHandler.AppendFormatted(num);
					logger2.LogError(defaultInterpolatedStringHandler.ToStringAndClear());
					return;
				}
				SaveDataToFiles.saveProductList();
				LoadDataFromFiles.loadProductList();
				foreach (KeyValuePair<string, User> item in UserUI.GetUsersWithUI())
				{
					_ = item.Value.IsConnected;
				}
				if (ConfigDB.AnnounceBuyPublic)
				{
					ServerChatUtils.SendSystemMessageToAllClients(VWorld.Server.EntityManager, FontColorChat.Yellow($"{ctx.Event.User.CharacterName} has purchased {FontColorChat.White($"{num2}x {itemShopModel.PrefabName}")} for a total of  {FontColorChat.White($"{num} {currency.name}")}"));
				}
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				throw ctx.Error("Error: " + ex.Message);
			}
		}

		[Command("remove", "rm", "<NumberItem>", "Delete a product from the store", null, true)]
		public static void removeItemFromShop(ChatCommandContext ctx, int index)
		{
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!ItemsDB.SearchItemByCommand(index, out var itemShopModel))
				{
					throw ctx.Error(FontColorChat.Yellow("Item removed error."));
				}
				if (!ItemsDB.RemoveItemByCommand(index))
				{
					throw ctx.Error(FontColorChat.Yellow("Item " + FontColorChat.White(itemShopModel.PrefabName ?? "") + " removed error."));
				}
				SaveDataToFiles.saveProductList();
				LoadDataFromFiles.loadProductList();
				ctx.Reply(FontColorChat.Yellow("Item " + FontColorChat.White(itemShopModel.PrefabName ?? "") + " removed successful."));
				foreach (KeyValuePair<string, User> item in UserUI.GetUsersWithUI())
				{
					_ = item.Value.IsConnected;
				}
				if (ConfigDB.AnnounceAddRemovePublic)
				{
					ServerChatUtils.SendSystemMessageToAllClients(VWorld.Server.EntityManager, FontColorChat.Yellow("Item " + FontColorChat.White(itemShopModel.PrefabName ?? "") + " removed successful."));
				}
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				throw ctx.Error("Error: " + ex.Message);
			}
		}

		[Command("list", null, "", "List of products available to buy in the store", null, false)]
		public static void list(ChatCommandContext ctx)
		{
			if (!ConfigDB.ShopEnabled)
			{
				throw ctx.Error(FontColorChat.Yellow(FontColorChat.White(ConfigDB.StoreName ?? "") + " is closed"));
			}
			List<string> productListMessage = ItemsDB.GetProductListMessage();
			if (productListMessage.Count <= 0)
			{
				throw ctx.Error("No products available in the store");
			}
			foreach (string item in productListMessage)
			{
				ctx.Reply(item);
			}
			ctx.Reply(FontColorChat.Yellow("To buy an object you must have in your inventory the number of currency indicated by each product."));
			ctx.Reply(FontColorChat.Yellow("Use the chat command \"" + FontColorChat.White("shop buy <NumberItem> <Quantity> ") + "\""));
		}

		[Command("open", null, "", "Open store", null, true)]
		public static void OpenShop(ChatCommandContext ctx)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			ConfigDB.ShopEnabled = true;
			ServerChatUtils.SendSystemMessageToAllClients(VWorld.Server.EntityManager, FontColorChat.Yellow(" " + FontColorChat.White(" " + ConfigDB.StoreName + " ") + " just opened"));
			UserUI.GetUsersWithUI();
		}

		[Command("close", null, "", "Close store", null, true)]
		public static void CloseShop(ChatCommandContext ctx)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			ConfigDB.ShopEnabled = false;
			ServerChatUtils.SendSystemMessageToAllClients(VWorld.Server.EntityManager, FontColorChat.Yellow(" " + FontColorChat.White(" " + ConfigDB.StoreName + " ") + " just closed"));
			UserUI.GetUsersWithUI();
		}

		[Command("reload", null, "", "Reload products and currencies files from server", null, true)]
		public static void ReloadShop(ChatCommandContext ctx)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			LoadDataFromFiles.loadProductList();
			LoadDataFromFiles.loadCurrencies();
			ctx.Reply(FontColorChat.Yellow(" " + FontColorChat.White(" " + ConfigDB.StoreName + " ") + " Configuration has been reloaded successfully"));
			foreach (KeyValuePair<string, User> item in UserUI.GetUsersWithUI())
			{
				_ = item.Value.IsConnected;
			}
		}
	}
}
namespace BloodyShop.Properties
{
	[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
	[DebuggerNonUserCode]
	[CompilerGenerated]
	internal class Resources
	{
		private static ResourceManager resourceMan;

		private static CultureInfo resourceCulture;

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static ResourceManager ResourceManager
		{
			get
			{
				if (resourceMan == null)
				{
					resourceMan = new ResourceManager("BloodyShop.Properties.Resources", typeof(Resources).Assembly);
				}
				return resourceMan;
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static CultureInfo Culture
		{
			get
			{
				return resourceCulture;
			}
			set
			{
				resourceCulture = value;
			}
		}

		internal static UnmanagedMemoryStream cash_register_x => ResourceManager.GetStream("cash_register_x", resourceCulture);

		internal static byte[] close => (byte[])ResourceManager.GetObject("close", resourceCulture);

		internal static UnmanagedMemoryStream coin => ResourceManager.GetStream("coin", resourceCulture);

		internal static byte[] config => (byte[])ResourceManager.GetObject("config", resourceCulture);

		internal static byte[] elixir => (byte[])ResourceManager.GetObject("elixir", resourceCulture);

		internal static UnmanagedMemoryStream floop2_x => ResourceManager.GetStream("floop2_x", resourceCulture);

		internal static byte[] open => (byte[])ResourceManager.GetObject("open", resourceCulture);

		internal static byte[] shop_close => (byte[])ResourceManager.GetObject("shop_close", resourceCulture);

		internal static byte[] shop_open => (byte[])ResourceManager.GetObject("shop_open", resourceCulture);

		internal Resources()
		{
		}
	}
}
namespace BloodyShop.DB
{
	public class ItemsDB
	{
		public static List<(string name, string type, PrefabModel model)> _normalizedItemNameCache = new List<(string, string, PrefabModel)>();

		public static List<(string name, int GUID, string type, PrefabModel model)> _normalizedItemShopNameCache = new List<(string, int, string, PrefabModel)>();

		private static string _lastQueryAdd;

		private static List<PrefabModel> _lastResultAdd;

		public static List<PrefabModel> ProductList { get; set; } = new List<PrefabModel>();


		public static void generateCacheItems()
		{
			//IL_000a: 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_0012: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			Enumerator<PrefabGUID, Entity> enumerator = Plugin.SystemsCore.PrefabCollectionSystem._PrefabGuidToEntityMap.GetEnumerator();
			while (enumerator.MoveNext())
			{
				KeyValue<PrefabGUID, Entity> current = enumerator.Current;
				ItemModel val = GameData.Items.FromEntity(current.Value);
				if (val == null || val == null || val.Name == null || !(((val != null) ? val.Name : null) != "") || val == null)
				{
					continue;
				}
				_ = val.ItemType;
				object obj;
				ItemType itemType;
				if (val == null)
				{
					obj = null;
				}
				else
				{
					itemType = val.ItemType;
					obj = ((object)(ItemType)(ref itemType)).ToString();
				}
				if (!((string?)obj != ""))
				{
					continue;
				}
				PrefabModel prefabModel = new PrefabModel();
				prefabModel.PrefabName = ((val != null) ? val.Name : null);
				object prefabType;
				if (val == null)
				{
					prefabType = null;
				}
				else
				{
					itemType = val.ItemType;
					prefabType = ((object)(ItemType)(ref itemType)).ToString();
				}
				prefabModel.PrefabType = (string)prefabType;
				int? obj2;
				if (val == null)
				{
					obj2 = null;
				}
				else
				{
					PrefabGUID? prefabGUID = ((EntityModel)val).Internals.PrefabGUID;
					if (!prefabGUID.HasValue)
					{
						obj2 = null;
					}
					else
					{
						PrefabGUID valueOrDefault = prefabGUID.GetValueOrDefault();
						obj2 = ((PrefabGUID)(ref valueOrDefault)).GuidHash;
					}
				}
				int? num = obj2;
				prefabModel.PrefabGUID = num.GetValueOrDefault();
				object prefabIcon;
				if (val == null)
				{
					prefabIcon = null;
				}
				else
				{
					ManagedItemData managedItemData = val.ManagedCore.ManagedItemData;
					prefabIcon = ((managedItemData != null) ? managedItemData.Icon : null);
				}
				prefabModel.PrefabIcon = (Sprite)prefabIcon;
				object prefabIcon2;
				if (val == null)
				{
					prefabIcon2 = null;
				}
				else
				{
					ManagedItemData managedItemData2 = val.ManagedCore.ManagedItemData;
					prefabIcon2 = ((managedItemData2 != null) ? managedItemData2.Icon : null);
				}
				prefabModel.PrefabIcon = (Sprite)prefabIcon2;
				_normalizedItemNameCache.Add((prefabModel.PrefabName.ToString().ToLower(), prefabModel.PrefabType.ToString().ToLower(), prefabModel));
			}
		}

		public static bool setProductList(List<ItemShopModel> list)
		{
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			ProductList = new List<PrefabModel>();
			_normalizedItemShopNameCache = new List<(string, int, string, PrefabModel)>();
			foreach (ItemShopModel item in list)
			{
				if (item.isBuff)
				{
					PrefabModel prefabModel = new PrefabModel();
					prefabModel.PrefabName = item?.name;
					prefabModel.PrefabType = "buff";
					prefabModel.PrefabGUID = item.id;
					Sprite prefabIcon = SpritesUtil.LoadPNGTOSprite(Resources.elixir);
					prefabModel.PrefabIcon = prefabIcon;
					prefabModel.PrefabPrice = item.price;
					prefabModel.PrefabStock = item.stock;
					prefabModel.PrefabStack = item.stack;
					prefabModel.currency = item.currency;
					prefabModel.isBuff = item.isBuff;
					ProductList.Add(prefabModel);
					_normalizedItemShopNameCache.Add((prefabModel.PrefabName.ToString().ToLower(), prefabModel.PrefabGUID, prefabModel.PrefabType.ToString().ToLower(), prefabModel));
					continue;
				}
				ItemModel prefabById = GameData.Items.GetPrefabById(new PrefabGUID(item.id));
				PrefabModel prefabModel2 = new PrefabModel();
				prefabModel2.PrefabName = item?.name;
				object prefabType;
				if (prefabById == null)
				{
					prefabType = null;
				}
				else
				{
					ItemType itemType = prefabById.ItemType;
					prefabType = ((object)(ItemType)(ref itemType)).ToString();
				}
				prefabModel2.PrefabType = (string)prefabType;
				int? obj;
				if (prefabById == null)
				{
					obj = null;
				}
				else
				{
					PrefabGUID? prefabGUID = ((EntityModel)prefabById).Internals.PrefabGUID;
					if (!prefabGUID.HasValue)
					{
						obj = null;
					}
					else
					{
						PrefabGUID valueOrDefault = prefabGUID.GetValueOrDefault();
						obj = ((PrefabGUID)(ref valueOrDefault)).GuidHash;
					}
				}
				int? num = obj;
				prefabModel2.PrefabGUID = num.GetValueOrDefault();
				object prefabIcon2;
				if (prefabById == null)
				{
					prefabIcon2 = null;
				}
				else
				{
					ManagedItemData managedItemData = prefabById.ManagedCore.ManagedItemData;
					prefabIcon2 = ((managedItemData != null) ? managedItemData.Icon : null);
				}
				prefabModel2.PrefabIcon = (Sprite)prefabIcon2;
				prefabModel2.PrefabPrice = item.price;
				prefabModel2.PrefabStock = item.stock;
				prefabModel2.PrefabStack = item.stack;
				prefabModel2.currency = item.currency;
				prefabModel2.isBuff = item.isBuff;
				ProductList.Add(prefabModel2);
				_normalizedItemShopNameCache.Add((prefabModel2.PrefabName.ToString().ToLower(), prefabModel2.PrefabGUID, prefabModel2.PrefabType.ToString().ToLower(), prefabModel2));
			}
			return true;
		}

		public static List<PrefabModel> searchItemByNameForAdd(string text)
		{
			if (text == "")
			{
				return new List<PrefabModel>();
			}
			if (string.Equals(text, _lastQueryAdd))
			{
				return _lastResultAdd;
			}
			_lastQueryAdd = text;
			List<PrefabModel> list = new List<PrefabModel>();
			foreach (var (text2, _, item) in _normalizedItemNameCache)
			{
				if (text2.Contains(text))
				{
					list.Add(item);
				}
			}
			_lastResultAdd = (from x in list
				orderby x.PrefabType, x.PrefabName
				select x).ToList();
			return _lastResultAdd;
		}

		public static List<PrefabModel> searchItemByNameForShop(string text)
		{
			List<PrefabModel> list = new List<PrefabModel>();
			foreach (var item in _normalizedItemShopNameCache)
			{
				if (item.name.Contains(text))
				{
					list.Add(item.model);
				}
			}
			return list;
		}

		public static int searchIndexForProduct(int GUID, int stack, CurrencyModel currency)
		{
			int num = 1;
			foreach (PrefabModel product in ProductList)
			{
				if (product.PrefabGUID == GUID && product.PrefabStack == stack && product.currency == currency.guid)
				{
					return num;
				}
				num++;
			}
			return -1;
		}

		public static List<ItemShopModel> getProductListForSaveJSON()
		{
			List<ItemShopModel> list = new List<ItemShopModel>();
			foreach (PrefabModel product in ProductList)
			{
				ItemShopModel itemShopModel = new ItemShopModel();
				itemShopModel.id = product.PrefabGUID;
				itemShopModel.name = product.PrefabName;
				itemShopModel.stock = product.PrefabStock;
				itemShopModel.stack = product.PrefabStack;
				itemShopModel.currency = product.currency;
				itemShopModel.price = product.PrefabPrice;
				itemShopModel.isBuff = product.isBuff;
				list.Add(itemShopModel);
			}
			return list;
		}

		public static bool addProductList(int item, int price, int stock, string name, int currency, int stack = 1, bool isBuff = false)
		{
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			if (isBuff)
			{
				PrefabModel prefabModel = new PrefabModel();
				prefabModel.PrefabName = name;
				prefabModel.PrefabType = "buff";
				prefabModel.PrefabGUID = item;
				Sprite prefabIcon = SpritesUtil.LoadPNGTOSprite(Resources.elixir);
				prefabModel.PrefabIcon = prefabIcon;
				prefabModel.PrefabPrice = price;
				prefabModel.PrefabStock = stock;
				prefabModel.PrefabStack = stack;
				prefabModel.currency = currency;
				prefabModel.isBuff = true;
				ProductList.Add(prefabModel);
				_normalizedItemShopNameCache.Add((prefabModel.PrefabName.ToString().ToLower(), prefabModel.PrefabGUID, prefabModel.PrefabType.ToString().ToLower(), prefabModel));
				return true;
			}
			ItemModel prefabById = GameData.Items.GetPrefabById(new PrefabGUID(item));
			if (prefabById == null)
			{
				return false;
			}
			PrefabModel prefabModel2 = new PrefabModel();
			prefabModel2.PrefabName = name;
			object prefabType;
			if (prefabById == null)
			{
				prefabType = null;
			}
			else
			{
				ItemType itemType = prefabById.ItemType;
				prefabType = ((object)(ItemType)(ref itemType)).ToString();
			}
			prefabModel2.PrefabType = (string)prefabType;
			int? obj;
			if (prefabById == null)
			{
				obj = null;
			}
			else
			{
				PrefabGUID? prefabGUID = ((EntityModel)prefabById).Internals.PrefabGUID;
				if (!prefabGUID.HasValue)
				{
					obj = null;
				}
				else
				{
					PrefabGUID valueOrDefault = prefabGUID.GetValueOrDefault();
					obj = ((PrefabGUID)(ref valueOrDefault)).GuidHash;
				}
			}
			int? num = obj;
			prefabModel2.PrefabGUID = num.GetValueOrDefault();
			object prefabIcon2;
			if (prefabById == null)
			{
				prefabIcon2 = null;
			}
			else
			{
				ManagedItemData managedItemData = prefabById.ManagedCore.ManagedItemData;
				prefabIcon2 = ((managedItemData != null) ? managedItemData.Icon : null);
			}
			prefabModel2.PrefabIcon = (Sprite)prefabIcon2;
			prefabModel2.PrefabPrice = price;
			prefabModel2.PrefabStock = stock;
			prefabModel2.PrefabStack = stack;
			prefabModel2.currency = currency;
			prefabModel2.isBuff = isBuff;
			ProductList.Add(prefabModel2);
			_normalizedItemShopNameCache.Add((prefabModel2.PrefabName.ToString().ToLower(), prefabModel2.PrefabGUID, prefabModel2.PrefabType.ToString().ToLower(), prefabModel2));
			return true;
		}

		public static bool RemoveItemByCommand(int index)
		{
			try
			{
				ProductList.RemoveAt(index - 1);
				_normalizedItemShopNameCache.RemoveAt(index - 1);
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}

		public static bool SearchItemByCommand(int index, out PrefabModel itemShopModel)
		{
			try
			{
				if (ProductList.Count >= index)
				{
					itemShopModel = ProductList[index - 1];
					return true;
				}
				itemShopModel = null;
				return false;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				itemShopModel = null;
				return false;
			}
		}

		public static bool SearchProductListAndRemoveItemByCommmand(int index, out PrefabModel itemShopModel)
		{
			try
			{
				if (ProductList.Count >= index)
				{
					itemShopModel = ProductList[index - 1];
					if (RemoveItemByCommand(index))
					{
						return true;
					}
					itemShopModel = null;
					return false;
				}
				itemShopModel = null;
				return false;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				itemShopModel = null;
				return false;
			}
		}

		public static bool ModifyStockByCommand(int index, int amount)
		{
			try
			{
				if (ProductList.Count < index)
				{
					return false;
				}
				PrefabModel prefabModel = ProductList[index - 1];
				int prefabStock = prefabModel.PrefabStock;
				if (prefabStock < 0)
				{
					return true;
				}
				prefabModel.PrefabStock = prefabStock - amount;
				if (prefabModel.PrefabStock == 0)
				{
					RemoveItemByCommand(index);
				}
				else
				{
					ProductList[index - 1] = prefabModel;
					_normalizedItemShopNameCache[index - 1] = (prefabModel.PrefabName.ToString().ToLower(), prefabModel.PrefabGUID, prefabModel.PrefabType.ToString().ToLower(), prefabModel);
				}
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message + " " + ex.Source);
				return false;
			}
		}

		public static bool SearchProductListAndRemoveItem(int itemGUID, out PrefabModel itemShopModel)
		{
			itemShopModel = null;
			int num = 0;
			foreach (var item in _normalizedItemShopNameCache)
			{
				if (item.GUID == itemGUID)
				{
					_normalizedItemShopNameCache.Remove(item);
					ProductList.Remove(item.model);
					itemShopModel = item.model;
					break;
				}
				num++;
			}
			if (itemShopModel == null)
			{
				return false;
			}
			return true;
		}

		public static bool SearchProductList(int itemGUID, out PrefabModel itemShopModel)
		{
			itemShopModel = null;
			int num = 0;
			foreach (var item in _normalizedItemShopNameCache)
			{
				if (item.GUID == itemGUID)
				{
					_normalizedItemShopNameCache.Remove(item);
					ProductList.Remove(item.model);
					itemShopModel = item.model;
					break;
				}
				num++;
			}
			if (itemShopModel == null)
			{
				return false;
			}
			return true;
		}

		public static bool SearchProductsWithCurrencyByCommand(CurrencyModel currencyModel, out int itemShopModel)
		{
			itemShopModel = 0;
			foreach (PrefabModel product in ProductList)
			{
				if (product.currency == currencyModel.guid)
				{
					itemShopModel++;
				}
			}
			if (itemShopModel == 0)
			{
				return false;
			}
			return true;
		}

		public static List<string> GetProductListMessage()
		{
			List<string> list = new List<string>();
			int num = 1;
			string text = "";
			foreach (PrefabModel product in ProductList)
			{
				CurrencyModel currency = ShareDB.getCurrency(product.currency);
				if (currency != null)
				{
					string text2 = "";
					if (product.PrefabStock <= 0)
					{
						text2 = "Infinite";
						text = "1x " + product.PrefabName;
					}
					else
					{
						text2 = product.PrefabStock.ToString();
						text = product.PrefabStack + "x " + product.PrefabName;
					}
					list.Add(FontColorChat.White("[") + FontColorChat.Yellow(num.ToString()) + FontColorChat.White("]") + " " + FontColorChat.Yellow(text) + " " + $"{FontColorChat.Red("Price:")} {FontColorChat.Yellow(product.PrefabPrice.ToString())} {FontColorChat.White(currency.name ?? "")} " + FontColorChat.Red("Stock:") + " " + FontColorChat.Yellow(text2) + " units");
					num++;
				}
			}
			return list;
		}
	}
	public class ShareDB
	{
		public static List<CurrencyModel> currenciesList = new List<CurrencyModel>();

		public static List<CurrencyModel> getCurrencyList()
		{
			return currenciesList;
		}

		public static CurrencyModel getCurrency(int guid)
		{
			return currenciesList.FirstOrDefault((CurrencyModel currency) => currency.guid == guid);
		}

		public static CurrencyModel getCurrencyByName(string name)
		{
			return currenciesList.FirstOrDefault((CurrencyModel currency) => currency.name == name);
		}

		public static bool setCurrencyList(List<CurrencyModel> currencies)
		{
			currenciesList = currencies;
			return true;
		}

		public static bool addCurrencyList(string name, int guid, bool drop)
		{
			CurrencyModel currencyModel = new CurrencyModel();
			int id = getCurrencyList().Last().id + 1;
			currencyModel.name = name;
			currencyModel.guid = guid;
			currencyModel.id = id;
			currencyModel.drop = drop;
			currenciesList.Add(currencyModel);
			return true;
		}

		public static List<string> GetCurrencyListMessage()
		{
			List<string> list = new List<string>();
			foreach (CurrencyModel currencies in currenciesList)
			{
				list.Add(FontColorChat.White("[") + FontColorChat.Yellow(currencies.id.ToString()) + FontColorChat.White("]") + " " + FontColorChat.Yellow(currencies.name) + " ");
			}
			return list;
		}

		public static bool SearchCurrencyByCommand(int index, out CurrencyModel currencyModel)
		{
			currencyModel = currenciesList.FirstOrDefault((CurrencyModel currency) => currency.id == index);
			if (currencyModel == null)
			{
				return false;
			}
			return true;
		}

		public static bool RemoveCurrencyyByCommand(int index)
		{
			try
			{
				currenciesList.RemoveAll((CurrencyModel currency) => currency.id == index);
				return true;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError("Error: " + ex.Message);
				return false;
			}
		}

		public static List<CurrencyModel> searchCurrencyByNameForShop(string text)
		{
			List<CurrencyModel> list = new List<CurrencyModel>();
			foreach (CurrencyModel currencies in currenciesList)
			{
				if (currencies.name.Contains(text))
				{
					list.Add(currencies);
				}
			}
			return list;
		}

		public static int searchIdForCurrency(int GUID)
		{
			foreach (CurrencyModel currencies in currenciesList)
			{
				if (currencies.guid == GUID)
				{
					return currencies.id;
				}
			}
			return -1;
		}
	}
}
namespace BloodyShop.DB.Models
{
	[Serializable]
	public class CurrencyModel
	{
		public int id { get; set; }

		public string name { get; set; }

		public int guid { get; set; }

		public bool drop { get; set; } = true;

	}
	public class ItemShopModel
	{
		public int id { get; set; }

		public string name { get; set; }

		public int price { get; set; }

		public int stock { get; set; }

		public int stack { get; set; }

		public int currency { get; set; }

		public bool isBuff { get; set; }
	}
	public class PrefabModel
	{
		public string PrefabName { get; set; }

		public int PrefabPrice { get; set; }

		public int PrefabStock { get; set; }

		public int PrefabStack { get; set; }

		public string PrefabType { get; set; }

		public int PrefabGUID { get; set; }

		public Sprite PrefabIcon { get; set; }

		public ItemModel itemModel { get; set; }

		public int currency { get; set; }

		public bool isBuff { get; set; }

		public bool CheckStockAvailability(int numberofItemsBuy)
		{
			if (PrefabStock < 0)
			{
				return true;
			}
			if (PrefabStock >= numberofItemsBuy)
			{
				return true;
			}
			return false;
		}
	}
}
namespace BloodyShop.AutoAnnouncer
{
	public class AutoUIFunction
	{
		public static void OnTimedAutoUI()
		{
		}
	}
}
namespace BloodyShop.AutoAnnouncer.Timers
{
	public class AutoLoadUiTimer
	{
		private bool _enabled;

		private bool _isRunning;

		private DateTime _lastRunTime;

		private TimeSpan _delay;

		private Action<World> _action;

		private Func<object, TimeSpan> _delayAction;

		public void Start(Action<World> action, TimeSpan delay)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			_delay = delay;
			_lastRunTime = DateTime.UtcNow - delay;
			_action = action;
			_enabled = true;
			GameFrame.OnUpdate += new GameFrameUpdateEventHandler(GameFrame_OnUpdate);
		}

		public void Start(Action<World> action, Func<object, TimeSpan> delayAction)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			_delayAction = delayAction;
			_delay = _delayAction(1);
			_lastRunTime = DateTime.UtcNow;
			_action = action;
			_enabled = true;
			GameFrame.OnUpdate += new GameFrameUpdateEventHandler(GameFrame_OnUpdate);
		}

		private void GameFrame_OnUpdate()
		{
			Update(World.DefaultGameObjectInjectionWorld);
		}

		private void Update(World world)
		{
			if (!_enabled || _isRunning || _lastRunTime + _delay >= DateTime.UtcNow)
			{
				return;
			}
			_isRunning = true;
			try
			{
				_action(world);
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError(ex);
			}
			finally
			{
				int num = 30;
				if (_delayAction != null)
				{
					_delay = _delayAction(num);
				}
				_lastRunTime = DateTime.UtcNow;
				_isRunning = false;
			}
		}

		public void Stop()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			GameFrame.OnUpdate -= new GameFrameUpdateEventHandler(GameFrame_OnUpdate);
			_enabled = false;
		}

		public void Dispose()
		{
			if (_enabled)
			{
				Stop();
			}
		}
	}
}
namespace BloodyShop.Client
{
	public class ClientMod
	{
		private static AutoLoadUiTimer _autoLoadUiTimer;

		public static bool UIInit { get; set; }

		public static void ClientEvents_OnGameDataInitialized()
		{
			UIInit = false;
			_autoLoadUiTimer = new AutoLoadUiTimer();
			StartAutoUI();
		}

		public static void ClientEvents_OnClientUserConnected()
		{
		}

		public static void ClientEvents_OnClientUserDisconnected()
		{
			UIInit = false;
			UIManager.DestroyAllPanels();
		}

		private static void StartAutoUI()
		{
			_autoLoadUiTimer.Start(delegate
			{
				AutoUIFunction.OnTimedAutoUI();
			}, delegate(object input)
			{
				if (!(input is int))
				{
					Plugin.Logger.LogError("Starting UI timer delay function parameter is not a valid integer");
					return TimeSpan.MaxValue;
				}
				_ = (int)input;
				return TimeSpan.FromSeconds(30.0);
			});
		}

		public static void StopAutoUI()
		{
			_autoLoadUiTimer?.Stop();
		}
	}
	public class KeyBindPressed
	{
		public static bool UIActive = true;

		internal static void OnKeyPressedOpenPanel(KeyBindFunction keybindFunction)
		{
			if (keybindFunction == KeyBindFunction.ToggleShopUI)
			{
				if (ClientMod.UIInit)
				{
					if (UIActive)
					{
						UIActive = false;
						UIManager.HideAllPanels();
					}
					else
					{
						UIActive = true;
						UIManager.ShowMenuPanel();
					}
				}
				return;
			}
			throw new ArgumentOutOfRangeException("keybindFunction", keybindFunction, null);
		}
	}
}
namespace BloodyShop.Client.Utils
{
	internal class Sound
	{
		private static MemoryStream ms;

		private static WaveStream ws;

		public static void Play(UnmanagedMemoryStream sound)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: 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)
			if (Plugin.Sounds.Value)
			{
				ms = new MemoryStream(UseStreamDotReadMethod(sound));
				ws = (WaveStream)new WaveFileReader((Stream)ms);
				WaveOutEvent val = new WaveOutEvent
				{
					Volume = 0.2f
				};
				val.Init((IWaveProvider)(object)ws);
				val.Play();
			}
		}

		private static byte[] UseStreamDotReadMethod(Stream stream)
		{
			List<byte> list = new List<byte>();
			byte[] array = new byte[32];
			int count;
			while ((count = stream.Read(array, 0, array.Length)) > 0)
			{
				list.AddRange(array.Take(count));
			}
			return list.ToArray();
		}
	}
	internal class SpritesUtil
	{
		public static Sprite LoadPNGTOSprite(byte[] file)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			new Sprite();
			Texture2D val = LoadPNGToTexture(file);
			return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f), 100f);
		}

		private static Texture2D LoadPNGToTexture(byte[] file)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			Texture2D val = new Texture2D(2, 2);
			if (ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(file)))
			{
				return val;
			}
			return null;
		}
	}
}
namespace BloodyShop.Client.UI
{
	internal class UIManager
	{
		public static UIBase UiBase { get; private set; }

		public static ShopPanel ShopPanel { get; private set; }

		public static PanelConfig panelCOnfig { get; private set; }

		public static MenuPanel MenuPanel { get; private set; }

		public static AdminMenuPanel AdminMenuPanel { get; private set; }

		public static int SizeOfProdutcs { get; set; }

		internal static void Initialize()
		{
			//IL_0002: 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_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			UniverseLibConfig val = default(UniverseLibConfig);
			val.Disable_EventSystem_Override = false;
			val.Force_Unlock_Mouse = false;
			val.Allow_UI_Selection_Outside_UIBase = true;
			val.Unhollowed_Modules_Folder = Path.Combine(Paths.BepInExRootPath, "interop");
			UniverseLibConfig val2 = val;
			Universe.Init(3f, (Action)OnInitialized, (Action<string, LogType>)LogHandler, val2);
		}

		private static void OnInitialized()
		{
			UiBase = UniversalUI.RegisterUI(((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds).ToString(), (Action)UiUpdate);
		}

		public static void CreateAllPanels()
		{
			CreateMenuPanel();
			CreateShopPanel();
			CreatePanelCOnfigPanel();
		}

		public static void showAllPanels()
		{
			ShowMenuPanel();
			ShowShopPanel();
			ShowPanelConfigPanel();
		}

		public static void HideAllPanels()
		{
			HideMenuPanel();
			HideShopPanel();
			HidePanelConfigPanel();
		}

		public static void DestroyAllPanels()
		{
			HideMenuPanel();
			HideShopPanel();
			HidePanelConfigPanel();
		}

		public static void CreateMenuPanel()
		{
			if (ClientDB.IsAdmin)
			{
				AdminMenuPanel = new AdminMenuPanel(UiBase);
				((UIModel)AdminMenuPanel).SetActive(true);
			}
			else
			{
				MenuPanel = new MenuPanel(UiBase);
				((UIModel)MenuPanel).SetActive(true);
			}
		}

		public static void ShowMenuPanel()
		{
			if (ClientDB.IsAdmin)
			{
				((UIModel)AdminMenuPanel).SetActive(true);
			}
			else
			{
				((UIModel)MenuPanel).SetActive(true);
			}
		}

		public static void HideMenuPanel()
		{
			if (ClientDB.IsAdmin)
			{
				((UIModel)AdminMenuPanel).SetActive(false);
			}
			else
			{
				((UIModel)MenuPanel).SetActive(false);
			}
		}

		public static void DestroyMenuPanel()
		{
			if (ClientDB.IsAdmin)
			{
				((UIModel)AdminMenuPanel).Destroy();
			}
			else
			{
				((UIModel)MenuPanel).Destroy();
			}
		}

		public static void CreateShopPanel()
		{
			ShopPanel = new ShopPanel(UiBase);
			((UIModel)ShopPanel).SetActive(false);
		}

		public static void ShowShopPanel()
		{
			if (ClientDB.shopOpen)
			{
				((UIModel)ShopPanel).SetActive(true);
			}
		}

		public static void HideShopPanel()
		{
			((UIModel)ShopPanel).SetActive(false);
		}

		public static void DestroyShopPanel()
		{
			((UIModel)ShopPanel).Destroy();
		}

		public static void CreatePanelCOnfigPanel()
		{
			if (ClientDB.IsAdmin)
			{
				panelCOnfig = new PanelConfig(UiBase);
				((UIModel)panelCOnfig).SetActive(false);
			}
		}

		public static void ShowPanelConfigPanel()
		{
			if (ClientDB.IsAdmin)
			{
				((UIModel)panelCOnfig).SetActive(true);
			}
		}

		public static void HidePanelConfigPanel()
		{
			if (ClientDB.IsAdmin)
			{
				((UIModel)panelCOnfig).SetActive(false);
			}
		}

		public static void DestroyPanelConfigPanel()
		{
			if (ClientDB.IsAdmin)
			{
				((UIModel)panelCOnfig).Destroy();
			}
		}

		public static void RefreshDataPanel()
		{
			ShopPanel.RefreshData();
			if (ClientDB.IsAdmin)
			{
				panelCOnfig.GetActivePanel().RefreshData();
				panelCOnfig.GetCurrencyPanel().RefreshData();
			}
		}

		public static void RefreshDataAddPanel()
		{
			panelCOnfig.GetActivePanel().RefreshData();
			panelCOnfig.GetCurrencyPanel().RefreshData();
		}

		private static void UiUpdate()
		{
		}

		private static void LogHandler(string message, LogType type)
		{
		}
	}
}
namespace BloodyShop.Client.UI.Panels.User
{
	public class MenuPanel : PanelBase
	{
		public enum VerticalAnchor
		{
			Top,
			Bottom
		}

		public static VerticalAnchor NavbarAnchor = VerticalAnchor.Top;

		private static readonly Vector2 NAVBAR_DIMENSIONS = new Vector2(1020f, 35f);

		private int iconWH = 45;

		public static MenuPanel Instance { get; private set; }

		public override string Name => "Bloody Shop Menu";

		public override int MinWidth => 70;

		public override int MinHeight => 50;

		public override Vector2 DefaultAnchorMin => new Vector2(0.5f, 1f);

		public override Vector2 DefaultAnchorMax => new Vector2(0.5f, 1f);

		public override Vector2 DefaultPosition => new Vector2((float)(-(((PanelBase)this).MinWidth / 2)), (float)Screen.height);

		public override bool CanDragAndResize => false;

		public static RectTransform NavBarRect { get; private set; }

		public GameObject NavbarTabButtonHolder { get; private set; }

		public ButtonRef closeBtn { get; private set; }

		public ButtonRef shopBtn { get; private set; }

		public ButtonRef adminBtn { get; private set; }

		public Text stateTXT { get; private set; }

		public bool active { get; private set; }

		public MenuPanel(UIBase owner)
			: base(owner)
		{
			Instance = this;
		}

		protected override void ConstructPanelContent()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: 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)
			active = true;
			((Graphic)((PanelBase)this).TitleBar.GetComponent<Image>()).color = new Color(1f, 1f, 1f, 0f);
			((Graphic)((UIModel)this).UIRoot.GetComponent<Image>()).color = new Color(233f, 237f, 240f, 0.2f);
			GameObject val = UIFactory.CreateUIObject("MainNavbar", ((UIModel)this).UIRoot, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)4, (int?)4, (int?)4, (int?)4, (TextAnchor?)(TextAnchor)4);
			NavBarRect = val.GetComponent<RectTransform>();
			NavBarRect.pivot = new Vector2(0.5f, 1f);
			SetNavBarAnchor();
			shopBtn = UIFactory.CreateButton(val, "ShopButton", "", (Color?)new Color(1f, 1f, 1f, 1f));
			GameObject gameObject = ((Component)shopBtn.Component).gameObject;
			int? num = iconWH;
			int? num2 = iconWH;
			int? num3 = iconWH;
			int? num4 = iconWH;
			UIFactory.SetLayoutElement(gameObject, num, num2, (int?)0, (int?)0, num3, num4, (bool?)null);
			configShopButtonPanel();
		}

		public static void SetNavBarAnchor()
		{
			//IL_001d: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			switch (NavbarAnchor)
			{
			case VerticalAnchor.Top:
				NavBarRect.anchorMin = new Vector2(0.5f, 1f);
				NavBarRect.anchorMax = new Vector2(0.5f, 1f);
				NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0f);
				NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
				break;
			case VerticalAnchor.Bottom:
				NavBarRect.anchorMin = new Vector2(0.5f, 0f);
				NavBarRect.anchorMax = new Vector2(0.5f, 0f);
				NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35f);
				NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
				break;
			}
		}

		public void closeShop()
		{
			configShopButtonPanel();
		}

		public void openShop()
		{
			configShopButtonPanel();
		}

		private static void OpenShopPanel()
		{
			UIManager.ShowShopPanel();
		}

		private void configShopButtonPanel()
		{
			//IL_00a5: 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)
			if (!ClientDB.shopOpen)
			{
				Sprite sprite = SpritesUtil.LoadPNGTOSprite(Resources.shop_close);
				Image component = shopBtn.GameObject.GetComponent<Image>();
				component.sprite = sprite;
				((Graphic)component).color = new Color(1f, 1f, 1f, 1f);
				ButtonRef obj = shopBtn;
				obj.OnClick = (Action)Delegate.Remove(obj.OnClick, new Action(OpenShopPanel));
			}
			else
			{
				Sprite sprite2 = SpritesUtil.LoadPNGTOSprite(Resources.shop_open);
				Image component2 = shopBtn.GameObject.GetComponent<Image>();
				component2.sprite = sprite2;
				((Graphic)component2).color = new Color(1f, 1f, 1f, 1f);
				ButtonRef obj2 = shopBtn;
				obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, new Action(OpenShopPanel));
			}
		}
	}
	public class ShopPanel : PanelBase
	{
		public GameObject NavbarHead;

		public GameObject NavbarFoot;

		public Dropdown MouseInspectDropdown;

		public GameObject ContentHolder;

		public GameObject ContentProduct;

		public GameObject ContentPagination;

		public RectTransform ContentRect;

		public Text alertTXT;

		public GameObject contentScroll;

		public InputFieldRef searchInputTXT;

		public List<GameObject> productsListLayers = new List<GameObject>();

		public int CurrentDisplayedIndex;

		public List<PrefabModel> items;

		public static List<(int index, InputFieldRef input)> _quantityArrayCache = new List<(int, InputFieldRef)>();

		public static List<(int index, int input)> _stackArrayCache = new List<(int, int)>();

		private static int limit = 10;

		private static int page = 0;

		private static int total = 0;

		private static int skip = 0;

		public static string textSearch = "";

		private List<(int index, CurrencyModel currency)> _currenciesArrayCache = new List<(int, CurrencyModel)>();

		public static ShopPanel Instance { get; private set; }

		public override string Name => ClientDB.shopName;

		public override bool CanDragAndResize => true;

		public override int MinWidth => 680;

		public override int MinHeight => 535;

		public override Vector2 DefaultAnchorMin => new Vector2(0.5f, 1f);

		public override Vector2 DefaultAnchorMax => new Vector2(0.5f, 1f);

		public override Vector2 DefaultPosition => new Vector2((float)(-(((PanelBase)this).MinWidth / 2)), (float)(((PanelBase)this).MinWidth / 2));

		public static float CurrentPanelWidth
		{
			get
			{
				//IL_000a: 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)
				Rect rect = ((PanelBase)Instance).Rect.rect;
				return ((Rect)(ref rect)).width;
			}
		}

		public static float CurrentPanelHeight
		{
			get
			{
				//IL_000a: 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)
				Rect rect = ((PanelBase)Instance).Rect.rect;
				return ((Rect)(ref rect)).height;
			}
		}

		public static RectTransform ImageIconRect { get; private set; }

		public CurrencyModel currency { get; private set; }

		public ShopPanel(UIBase owner)
			: base(owner)
		{
			Instance = this;
		}

		public override void Update()
		{
		}

		public override void OnFinishResize()
		{
			((PanelBase)this).OnFinishResize();
		}

		protected override void ConstructPanelContent()
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: 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_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Unknown result type (might be due to invalid IL or missing references)
			//IL_0374: Unknown result type (might be due to invalid IL or missing references)
			//IL_037a: Unknown result type (might be due to invalid IL or missing references)
			//IL_038b: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0411: Unknown result type (might be due to invalid IL or missing references)
			//IL_0417: Unknown result type (might be due to invalid IL or missing references)
			//IL_046e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0474: Unknown result type (might be due to invalid IL or missing references)
			//IL_04cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0532: Unknown result type (might be due to invalid IL or missing references)
			//IL_0538: Unknown result type (might be due to invalid IL or missing references)
			//IL_058f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0595: Unknown result type (might be due to invalid IL or missing references)
			//IL_062c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0636: Expected O, but got Unknown
			//IL_0650: Unknown result type (might be due to invalid IL or missing references)
			//IL_0656: Unknown result type (might be due to invalid IL or missing references)
			//IL_0673: Unknown result type (might be due to invalid IL or missing references)
			//IL_068c: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a5: Unknown result type (might be due to invalid IL or missing references)
			textSearch = "";
			page = 0;
			ButtonRef val = UIFactory.CreateButton(((Component)((PanelBase)this).TitleBar.transform.Find("CloseHolder")).gameObject.gameObject, "RefreshBtn", "Refresh", (Color?)null);
			RuntimeHelper.SetColorBlock((Selectable)(object)val.Component, (Color?)new Color(0.12156863f, 0.38039216f, 47f / 85f), (Color?)new Color(12f / 85f, 0.44313726f, 0.6392157f), (Color?)new Color(0.16078432f, 0.5019608f, 37f / 51f), (Color?)null);
			GameObject gameObject = ((Component)val.Component).gameObject;
			int? num = 25;
			int? num2 = ((PanelBase)this).MinWidth / 2;
			int? num3 = num;
			int? num4 = ((PanelBase)this).MinWidth / 2;
			int? num5 = 25;
			UIFactory.SetLayoutElement(gameObject, num2, num3, (int?)null, (int?)null, num4, num5, (bool?)null);
			((Component)val.Component).transform.SetSiblingIndex(((Component)val.Component).transform.GetSiblingIndex() - 1);
			val.OnClick = (Action)Delegate.Combine(val.OnClick, new Action(RefreshAction));
			GameObject val2 = UIFactory.CreateHorizontalGroup(((PanelBase)this).ContentRoot.gameObject, "HeaderItem", true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			num5 = 0;
			num4 = 60;
			num = 60;
			int? num6 = 0;
			UIFactory.SetLayoutElement(val2, (int?)null, num4, num6, num5, (int?)null, num, (bool?)null);
			searchInputTXT = UIFactory.CreateInputField(val2, "SearchInput", "Search Text");
			GameObject gameObject2 = searchInputTXT.GameObject;
			int? num7 = ((PanelBase)this).MinWidth - 100;
			int? num8 = 60;
			num6 = 0;
			num = 60;
			UIFactory.SetLayoutElement(gameObject2, num7, num8, (int?)9999, num6, (int?)(((PanelBase)this).MinWidth - 100), num, (bool?)null);
			searchInputTXT.OnValueChanged += SearchActionText;
			ButtonRef obj = UIFactory.CreateButton(val2, "saveBtn-", "Search", (Color?)new Color(0.20392157f, 0.28627452f, 0.36862746f));
			GameObject gameObject3 = ((Component)obj.Component).gameObject;
			int? num9 = 80;
			int? num10 = 60;
			num = 0;
			num6 = 60;
			UIFactory.SetLayoutElement(gameObject3, num9, num10, (int?)0, num, (int?)80, num6, (bool?)null);
			obj.OnClick = (Action)Delegate.Combine(obj.OnClick, new Action(SearchAction));
			GameObject contentRoot = ((PanelBase)this).ContentRoot;
			bool? flag = true;
			bool? flag2 = true;
			bool? flag3 = true;
			bool? flag4 = true;
			int? num11 = 4;
			num6 = 5;
			num = 5;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentRoot, flag, flag2, flag3, flag4, num11, (int?)null, (int?)null, num6, num, (TextAnchor?)null);
			GameObject val3 = UIFactory.CreateHorizontalGroup(((PanelBase)this).ContentRoot.gameObject, "HeaderItem", true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			GameObject gameObject4 = ((Component)UIFactory.CreateLabel(val3, "itemAvalTxt", "Stock", (TextAnchor)3, default(Color), true, 14)).gameObject;
			int? num12 = 50;
			int? num13 = 60;
			num = 0;
			num6 = 60;
			UIFactory.SetLayoutElement(gameObject4, num12, num13, (int?)0, num, (int?)50, num6, (bool?)null);
			GameObject gameObject5 = ((Component)UIFactory.CreateLabel(val3, "itemNameTxt", "Name", (TextAnchor)3, default(Color), true, 14)).gameObject;
			int? num14 = 60;
			int? num15 = 60;
			num6 = 0;
			num = 60;
			UIFactory.SetLayoutElement(gameObject5, num14, num15, (int?)0, num6, (int?)60, num, (bool?)null);
			GameObject obj2 = UIFactory.CreateUIObject("IconItem", val3, default(Vector2));
			int? num16 = 210;
			int? num17 = 60;
			num = 0;
			num6 = 60;
			UIFactory.SetLayoutElement(obj2, num16, num17, (int?)0, num, (int?)210, num6, (bool?)null);
			GameObject gameObject6 = ((Component)UIFactory.CreateLabel(val3, "itemPriceTxt", "Price", (TextAnchor)3, default(Color), true, 14)).gameObject;
			int? num18 = 100;
			int? num19 = 60;
			num6 = 0;
			num = 60;
			UIFactory.SetLayoutElement(gameObject6, num18, num19, (int?)0, num6, (int?)100, num, (bool?)null);
			GameObject gameObject7 = ((Component)UIFactory.CreateLabel(val3, "itemAvalTxt", "Quantity", (TextAnchor)3, default(Color), true, 14)).gameObject;
			int? num20 = 50;
			int? num21 = 60;
			num = 0;
			num6 = 60;
			UIFactory.SetLayoutElement(gameObject7, num20, num21, (int?)0, num, (int?)50, num6, (bool?)null);
			GameObject obj3 = UIFactory.CreateUIObject("BuyItem", val3, default(Vector2));
			int? num22 = 110;
			int? num23 = 60;
			num6 = 0;
			num = 60;
			UIFactory.SetLayoutElement(obj3, num22, num23, (int?)0, num6, (int?)110, num, (bool?)null);
			num = 0;
			num6 = 60;
			num4 = 60;
			num5 = 0;
			UIFactory.SetLayoutElement(val3, (int?)null, num6, num5, num, (int?)null, num4, (bool?)null);
			contentScroll = new GameObject();
			AutoSliderScrollbar val4 = default(AutoSliderScrollbar);
			UIFactory.CreateScrollView(((PanelBase)this).ContentRoot.gameObject, "scrollView", ref contentScroll, ref val4, default(Color));
			RuntimeHelper.SetColorBlock((Selectable)(object)val4.Slider, (Color?)new Color(0.83137256f, 0.6745098f, 0.050980393f), (Color?)new Color(0.95686275f, 0.8156863f, 21f / 85f), (Color?)new Color(0.96862745f, 44f / 51f, 37f / 85f), (Color?)null);
			CreateListProductsLayout();
			((UIModel)this).SetActive(true);
		}

		public void CreateListProductsLayout()
		{
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: 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_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_028e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Unknown result type (might be due to invalid IL or missing references)
			//IL_0339: Unknown result type (might be due to invalid IL or missing references)
			//IL_033f: Unknown result type (might be due to invalid IL or missing references)
			//IL_047f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0573: Unknown result type (might be due to invalid IL or missing references)
			//IL_0579: Unknown result type (might be due to invalid IL or missing references)
			//IL_058a: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c1: Unknown result type (might be due to invalid IL or missing references)
			items = ItemsDB.searchItemByNameForShop(textSearch);
			total = items.Count;
			productsListLayers = new List<GameObject>();
			skip = page * limit;
			if (total > 0 && skip >= total)
			{
				page--;
				if (page < 0)
				{
					page = 0;
				}
				skip = page * limit;
			}
			int num = skip + 1;
			_quantityArrayCache = new List<(int, InputFieldRef)>();
			_stackArrayCache = new List<(int, int)>();
			_currenciesArrayCache = new List<(int, CurrencyModel)>();
			foreach (PrefabModel item in items.Skip(skip).Take(limit))
			{
				currency = ShareDB.getCurrency(item.currency);
				if (currency != null)
				{
					GameObject val = UIFactory.CreateHorizontalGroup(contentScroll, "ContentItem-" + num, true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
					string text = "";
					text = ((item.PrefabStock > 0) ? item.PrefabStock.ToString() : "-");
					GameObject gameObject = ((Component)UIFactory.CreateLabel(val, "itemAvalTxt-" + num, text ?? "", (TextAnchor)4, default(Color), true, 14)).gameObject;
					int? num2 = 50;
					int? num3 = 60;
					int? num4 = 0;
					int? num5 = 60;
					UIFactory.SetLayoutElement(gameObject, num2, num3, (int?)0, num4, (int?)50, num5, (bool?)null);
					GameObject obj = UIFactory.CreateUIObject("IconItem-" + num, val, default(Vector2));
					obj.AddComponent<Image>().sprite = item.PrefabIcon;
					int? num6 = 60;
					int? num7 = 60;
					num5 = 0;
					num4 = 60;
					UIFactory.SetLayoutElement(obj, num6, num7, (int?)0, num5, (int?)60, num4, (bool?)null);
					GameObject gameObject2 = ((Component)UIFactory.CreateLabel(val, "itemNameTxt-" + num, $"{item.PrefabStack}x {item.PrefabName}", (TextAnchor)3, default(Color), true, 14)).gameObject;
					int? num8 = 230;
					int? num9 = 60;
					num4 = 0;
					num5 = 60;
					UIFactory.SetLayoutElement(gameObject2, num8, num9, (int?)0, num4, (int?)230, num5, (bool?)null);
					GameObject gameObject3 = ((Component)UIFactory.CreateLabel(val, "itemPriceTxt-" + num, $"{item.PrefabPrice}x {currency.name}", (TextAnchor)3, default(Color), true, 14)).gameObject;
					int? num10 = 100;
					int? num11 = 60;
					num5 = 0;
					num4 = 60;
					UIFactory.SetLayoutElement(gameObject3, num10, num11, (int?)0, num5, (int?)100, num4, (bool?)null);
					_currenciesArrayCache.Add((num, currency));
					InputFieldRef val2 = UIFactory.CreateInputField(val, "quantityNew|" + num, "Quantity");
					GameObject gameObject4 = val2.GameObject;
					int? num12 = 40;
					int? num13 = 60;
					num4 = 0;
					num5 = 60;
					UIFactory.SetLayoutElement(gameObject4, num12, num13, (int?)0, num4, (int?)40, num5, (bool?)null);
					val2.Component.contentType = (ContentType)2;
					val2.Text = "1";
					val2.Text.PadLeft(2);
					_quantityArrayCache.Add((num, val2));
					_stackArrayCache.Add((num, item.PrefabStack));
					ButtonRef obj2 = UIFactory.CreateButton(val, "buyItemBtn-" + num, "BUY", (Color?)new Color(0.83137256f, 0.6745098f, 0.050980393f));
					GameObject gameObject5 = ((Component)obj2.Component).gameObject;
					int? num14 = 100;
					int? num15 = 60;
					num5 = 0;
					num4 = 60;
					UIFactory.SetLayoutElement(gameObject5, num14, num15, (int?)0, num5, (int?)100, num4, (bool?)null);
					obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, new Action(BuyAction));
					num4 = 0;
					num5 = 60;
					int? num16 = 60;
					int? num17 = 0;
					UIFactory.SetLayoutElement(val, (int?)null, num5, num17, num4, (int?)null, num16, (bool?)null);
					productsListLayers.Add(val);
					GameObject val3 = UIFactory.CreateHorizontalGroup(contentScroll, "Separator-" + num, true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
					GameObject gameObject6 = ((Component)UIFactory.CreateLabel(val3, "FakeTextt-" + num, "", (TextAnchor)4, default(Color), true, 14)).gameObject;
					int? num18 = ((PanelBase)this).MinWidth;
					int? num19 = 2;
					num17 = 0;
					num16 = 2;
					UIFactory.SetLayoutElement(gameObject6, num18, num19, (int?)9999, num17, (int?)((PanelBase)this).MinWidth, num16, (bool?)null);
					productsListLayers.Add(val3);
					num++;
				}
			}
			createPagination();
		}

		private void createPagination()
		{
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: 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)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
			decimal num = Math.Ceiling((decimal)(total / limit));
			GameObject contentRoot = ((PanelBase)this).ContentRoot;
			bool? flag = true;
			bool? flag2 = true;
			bool? flag3 = true;
			bool? flag4 = true;
			int? num2 = 4;
			int? num3 = 5;
			int? num4 = 5;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentRoot, flag, flag2, flag3, flag4, num2, (int?)null, (int?)null, num3, num4, (TextAnchor?)null);
			ContentPagination = new GameObject();
			ContentPagination = UIFactory.CreateHorizontalGroup(((PanelBase)this).ContentRoot.gameObject, "PaginationGroup", true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			GameObject gameObject = ((Component)UIFactory.CreateLabel(ContentPagination, "footerText", $"Products: {total} Pages: {num + 1m}", (TextAnchor)3, default(Color), true, 14)).gameObject;
			int? num5 = 50;
			int? num6 = 30;
			num4 = 0;
			num3 = 30;
			UIFactory.SetLayoutElement(gameObject, num5, num6, (int?)0, num4, (int?)50, num3, (bool?)null);
			if (items.Count > limit)
			{
				int num7 = page + 1;
				if (page - 1 >= 0)
				{
					ButtonRef obj = UIFactory.CreateButton(ContentPagination, "previousBtn", $"<- Page {num7 - 1}", (Color?)null);
					RuntimeHelper.SetColorBlockAuto((Selectable)(object)obj.Component, new Color(0.09019608f, 0.64705884f, 0.5372549f));
					GameObject gameObject2 = ((Component)obj.Component).gameObject;
					int? num8 = 150;
					int? num9 = 30;
					num3 = 0;
					num4 = 30;
					UIFactory.SetLayoutElement(gameObject2, num8, num9, (int?)0, num3, (int?)150, num4, (bool?)null);
					obj.OnClick = (Action)Delegate.Combine(obj.OnClick, new Action(changePage));
				}
				if ((decimal)(page + 1) <= num)
				{
					ButtonRef obj2 = UIFactory.CreateButton(ContentPagination, "nextBtn", $"Page {num7 + 1} ->", (Color?)null);
					RuntimeHelper.SetColorBlockAuto((Selectable)(object)obj2.Component, new Color(0.09019608f, 0.64705884f, 0.5372549f));
					GameObject gameObject3 = ((Component)obj2.Component).gameObject;
					int? num10 = 150;
					int? num11 = 30;
					num4 = 0;
					num3 = 30;
					UIFactory.SetLayoutElement(gameObject3, num10, num11, (int?)0, num4, (int?)150, num3, (bool?)null);
					obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, new Action(changePage));
				}
			}
		}

		private void SearchActionText(string str)
		{
			textSearch = str.ToLower();
			page = 0;
			RefreshData();
			CreateListProductsLayout();
		}

		private void SearchAction()
		{
			textSearch = searchInputTXT.Text.ToLower();
			page = 0;
			RefreshData();
			CreateListProductsLayout();
		}

		private void RefreshAction()
		{
			UIManager.RefreshDataPanel();
		}

		public void RefreshData()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			foreach (GameObject productsListLayer in productsListLayers)
			{
				Object.Destroy((Object)(object)productsListLayer, 0f);
			}
			productsListLayers = new List<GameObject>();
			UIFactory.CreateHorizontalGroup(contentScroll, "ContentItem", true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			Object.Destroy((Object)(object)ContentPagination, 0f);
		}

		private void BuyAction()
		{
			Sound.Play(Resources.cash_register_x);
			string s = ((Object)EventSystem.current.currentSelectedGameObject).name.Replace("buyItemBtn-", "");
			PrefabModel prefabModel = items[int.Parse(s) - 1];
			serachQuantityInput(int.Parse(s));
			s = ItemsDB.searchIndexForProduct(stack: serachStackInput(int.Parse(s)), currency: serachCurrencyInput(int.Parse(s)), GUID: prefabModel.PrefabGUID).ToString();
			if (s != "-1")
			{
				RefreshAction();
			}
		}

		private string serachQuantityInput(int indexSearch)
		{
			foreach (var (num, val) in _quantityArrayCache)
			{
				if (num == indexSearch)
				{
					if (val.Text == "")
					{
						return "0";
					}
					return val.Text;
				}
			}
			return "0";
		}

		private int serachStackInput(int indexSearch)
		{
			foreach (var (num, num2) in _stackArrayCache)
			{
				if (num == indexSearch)
				{
					if (num2 == 0)
					{
						return 1;
					}
					return num2;
				}
			}
			return 1;
		}

		private CurrencyModel serachCurrencyInput(int indexSearch)
		{
			foreach (var (num, result) in _currenciesArrayCache)
			{
				if (num == indexSearch)
				{
					return result;
				}
			}
			return null;
		}

		private void changePage()
		{
			if (((Object)EventSystem.current.currentSelectedGameObject).name == "nextBtn")
			{
				page++;
			}
			else
			{
				page--;
			}
			RefreshData();
			CreateListProductsLayout();
		}
	}
}
namespace BloodyShop.Client.UI.Panels.Admin
{
	public class AddCurrencyPanel : UIModel
	{
		public GameObject NavbarHolder;

		public GameObject ContentHolder;

		public GameObject ContentProduct;

		public RectTransform ContentRect;

		public Text alertTXT;

		public GameObject contentScroll;

		public Dropdown dropdownCurrency;

		public Dropdown dropdownitem;

		public ButtonRef OpenCloseStoreBtn;

		public List<GameObject> currencyListLayers = new List<GameObject>();

		public List<PrefabModel> currencyModel = new List<PrefabModel>();

		public int CurrentDisplayedIndex;

		public static bool active = false;

		private InputFieldRef searchInputTXT;

		private static int limit = 10;

		private static GameObject uiRoot;

		private List<Dropdown> currencyDropArray = new List<Dropdown>();

		public PanelConfig Parent { get; }

		public static AddCurrencyPanel Instance { get; private set; }

		public static int MinWidth => 680;

		public override GameObject UIRoot => uiRoot;

		public AddCurrencyPanel(PanelConfig parent)
		{
			Parent = parent;
		}

		public override void ConstructUI(GameObject content)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: 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)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0268: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0332: Unknown result type (might be due to invalid IL or missing references)
			//IL_038a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0390: Unknown result type (might be due to invalid IL or missing references)
			//IL_0426: Unknown result type (might be due to invalid IL or missing references)
			//IL_0430: Expected O, but got Unknown
			//IL_0449: Unknown result type (might be due to invalid IL or missing references)
			//IL_044f: Unknown result type (might be due to invalid IL or missing references)
			active = true;
			uiRoot = UIFactory.CreateUIObject("ConfigPanel", content, default(Vector2));
			GameObject val = UIFactory.CreateHorizontalGroup(uiRoot, "HeaderItem", true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			int? num = 0;
			int? num2 = 60;
			int? num3 = 60;
			int? num4 = 0;
			UIFactory.SetLayoutElement(val, (int?)null, num2, num4, num, (int?)null, num3, (bool?)null);
			searchInputTXT = UIFactory.CreateInputField(val, "SearchInput", "Search Text");
			GameObject gameObject = searchInputTXT.GameObject;
			int? num5 = MinWidth - 100;
			int? num6 = 60;
			num4 = 0;
			num3 = 60;
			UIFactory.SetLayoutElement(gameObject, num5, num6, (int?)9999, num4, (int?)(MinWidth - 100), num3, (bool?)null);
			searchInputTXT.OnValueChanged += SearchActionText;
			ButtonRef obj = UIFactory.CreateButton(val, "saveBtn-", "Search", (Color?)new Color(0.20392157f, 0.28627452f, 0.36862746f));
			GameObject gameObject2 = ((Component)obj.Component).gameObject;
			int? num7 = 80;
			int? num8 = 60;
			num3 = 0;
			num4 = 60;
			UIFactory.SetLayoutElement(gameObject2, num7, num8, (int?)0, num3, (int?)80, num4, (bool?)null);
			obj.OnClick = (Action)Delegate.Combine(obj.OnClick, new Action(SearchAction));
			GameObject obj2 = uiRoot;
			bool? flag = true;
			bool? flag2 = true;
			bool? flag3 = true;
			bool? flag4 = true;
			int? num9 = 4;
			num4 = 5;
			num3 = 5;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(obj2, flag, flag2, flag3, flag4, num9, (int?)null, (int?)null, num4, num3, (TextAnchor?)null);
			GameObject val2 = UIFactory.CreateHorizontalGroup(uiRoot, "HeaderItem", true, true, true, true, 4, default(Vector4), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			GameObject obj3 = UIFactory.CreateUIObject("IconItem", val2, default(Vector2));
			int? num10 = 60;
			int? num11 = 60;
			num3 = 0;
			num4 = 60;
			UIFactory.SetLayoutElement(obj3, num10, num11, (int?)0, num3, (int?)60, num4, (bool?)null);
			Text obj4 = UIFactory.CreateLabel(val2, "itemNameTxt", "Name", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject3 = ((Component)obj4).gameObject;
			int? num12 = 310;
			int? num13 = 60;
			num4 =