Decompiled source of LDBTool v3.0.1

LDBTool.dll

Decompiled a year ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.UI;
using xiaoye97.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("xiaoye97, CommonAPI")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Library that allows mods to add and edit Proto data. Also allows you to see Proto data, config ID\\u0027s of mod Protos and change localized strings")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LDBTool")]
[assembly: AssemblyTitle("LDBTool")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace xiaoye97
{
	public static class LDBTool
	{
		public static Action PreAddDataAction;

		public static Action PostAddDataAction;

		public static Action<Proto> EditDataAction;

		internal static bool Finshed;

		internal static List<List<Proto>> PreToAdd = new List<List<Proto>>();

		internal static List<List<Proto>> PostToAdd = new List<List<Proto>>();

		internal static List<List<Proto>> TotalDict = new List<List<Proto>>();

		private static List<Dictionary<string, ConfigEntry<int>>> IDDict = new List<Dictionary<string, ConfigEntry<int>>>();

		private static List<Dictionary<string, ConfigEntry<int>>> GridIndexDict = new List<Dictionary<string, ConfigEntry<int>>>();

		private static Dictionary<string, ConfigEntry<string>> ZHCNDict = new Dictionary<string, ConfigEntry<string>>();

		private static Dictionary<string, ConfigEntry<string>> ENUSDict = new Dictionary<string, ConfigEntry<string>>();

		private static Dictionary<string, ConfigEntry<string>> FRFRDict = new Dictionary<string, ConfigEntry<string>>();

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

		private static ConfigFile CustomID = new ConfigFile(Paths.ConfigPath + "/LDBTool/LDBTool.CustomID.cfg", true);

		private static ConfigFile CustomGridIndex = new ConfigFile(Paths.ConfigPath + "/LDBTool/LDBTool.CustomGridIndex.cfg", true);

		private static ConfigFile CustomStringZHCN = new ConfigFile(Paths.ConfigPath + "/LDBTool/LDBTool.CustomLocalization.ZHCN.cfg", true);

		private static ConfigFile CustomStringENUS = new ConfigFile(Paths.ConfigPath + "/LDBTool/LDBTool.CustomLocalization.ENUS.cfg", true);

		private static ConfigFile CustomStringFRFR = new ConfigFile(Paths.ConfigPath + "/LDBTool/LDBTool.CustomLocalization.FRFR.cfg", true);

		public static void SetBuildBar(int category, int index, int itemId)
		{
			if (category < 1 || category > 12)
			{
				LDBToolPlugin.logger.LogWarning((object)"SetBuildBar Fail. category must be between 1 and 12.");
			}
			else if (index < 1 || index > 12)
			{
				LDBToolPlugin.logger.LogWarning((object)"SetBuildBar Fail. index must be between 1 and 12.");
			}
			else if (UIBuildMenu.staticLoaded && Finshed)
			{
				ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(itemId);
				if (val != null)
				{
					UIBuildMenu.protos[category, index] = val;
					LDBToolPlugin.logger.LogInfo((object)$"Set build bar at {category},{index} ID:{((Proto)val).ID} name:{Localization.Translate(((Proto)val).Name)}");
				}
				else
				{
					LDBToolPlugin.logger.LogWarning((object)$"SetBuildBar Fail. ItemProto with ID {itemId} not found.");
				}
			}
			else
			{
				if (!BuildBarDict.ContainsKey(category))
				{
					BuildBarDict.Add(category, new Dictionary<int, int>());
				}
				BuildBarDict[category][index] = itemId;
			}
		}

		public static void PreAddProto(Proto proto)
		{
			int index = ProtoIndex.GetIndex(((object)proto).GetType());
			if (!PreToAdd[index].Contains(proto))
			{
				Bind(proto);
				PreToAdd[index].Add(proto);
				TotalDict[index].Add(proto);
			}
		}

		[Obsolete("Please use PreAddProto(Proto proto)")]
		public static void PreAddProto(ProtoType protoType, Proto proto)
		{
			PreAddProto(proto);
		}

		public static void PostAddProto(Proto proto)
		{
			int index = ProtoIndex.GetIndex(((object)proto).GetType());
			if (!PostToAdd[index].Contains(proto))
			{
				Bind(proto);
				PostToAdd[index].Add(proto);
				TotalDict[index].Add(proto);
			}
		}

		[Obsolete("Please use PostAddProto(Proto proto)")]
		public static void PostAddProto(ProtoType protoType, Proto proto)
		{
			PostAddProto(proto);
		}

		internal static void Init()
		{
			for (int i = 0; i <= ProtoIndex.GetProtosCount(); i++)
			{
				PreToAdd.Add(new List<Proto>());
				PostToAdd.Add(new List<Proto>());
				TotalDict.Add(new List<Proto>());
				IDDict.Add(new Dictionary<string, ConfigEntry<int>>());
				GridIndexDict.Add(new Dictionary<string, ConfigEntry<int>>());
			}
		}

		internal static void SetBuildBar()
		{
			foreach (KeyValuePair<int, Dictionary<int, int>> item in BuildBarDict)
			{
				foreach (KeyValuePair<int, int> item2 in item.Value)
				{
					ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(item2.Value);
					if (val != null)
					{
						UIBuildMenu.protos[item.Key, item2.Key] = val;
						LDBToolPlugin.logger.LogInfo((object)$" Set build bar at {item.Key},{item2.Key} ID:{((Proto)val).ID} name:{Localization.Translate(((Proto)val).Name)}");
					}
					else
					{
						LDBToolPlugin.logger.LogWarning((object)$"SetBuildBar Fail. ItemProto with ID {item2.Value} not found.");
					}
				}
			}
		}

		private static void Bind(Proto proto)
		{
			IdBind(proto);
			GridIndexBind(proto);
		}

		private static void IdBind(Proto proto)
		{
			int index = ProtoIndex.GetIndex(proto);
			ConfigEntry<int> val = CustomID.Bind<int>(ProtoIndex.GetProtoName(proto), proto.Name, proto.ID, (ConfigDescription)null);
			proto.ID = val.Value;
			if (IDDict[index].ContainsKey(proto.Name))
			{
				LDBToolPlugin.logger.LogError((object)$"[CustomID] ID:{proto.ID} Name:{proto.Name} There is a conflict, please check.");
			}
			else
			{
				IDDict[index].Add(proto.Name, val);
			}
		}

		private static void GridIndexBind(Proto proto)
		{
			ConfigEntry<int> val = null;
			ItemProto val2 = (ItemProto)(object)((proto is ItemProto) ? proto : null);
			if (val2 != null)
			{
				val = CustomGridIndex.Bind<int>(ProtoIndex.GetProtoName(proto), ((Proto)val2).ID.ToString(), 0, $"Default Grid Index = {val2.GridIndex}\nItem Name = {((Proto)val2).Name}");
				if (val.Value != 0)
				{
					val2.GridIndex = val.Value;
				}
			}
			else
			{
				RecipeProto val3 = (RecipeProto)(object)((proto is RecipeProto) ? proto : null);
				if (val3 != null)
				{
					val = CustomGridIndex.Bind<int>(ProtoIndex.GetProtoName(proto), ((Proto)val3).ID.ToString(), 0, $"Default Grid Index = {val3.GridIndex}\nRecipe Name = {((Proto)val3).Name}");
					if (val.Value != 0)
					{
						val3.GridIndex = val.Value;
					}
				}
			}
			if (val != null)
			{
				int index = ProtoIndex.GetIndex(proto);
				if (GridIndexDict[index].ContainsKey(proto.Name))
				{
					LDBToolPlugin.logger.LogError((object)$"[CustomGridIndex] ID:{proto.ID} Name:{proto.Name} There is a conflict, please check.");
				}
				else
				{
					GridIndexDict[index].Add(proto.Name, val);
				}
			}
		}

		internal static void AddProtos(List<List<Proto>> datas)
		{
			Type[] allProtoTypes = ProtoIndex.GetAllProtoTypes();
			for (int i = 0; i < allProtoTypes.Length; i++)
			{
				Type protoType = allProtoTypes[i];
				PropertyInfo propertyInfo = typeof(LDB).GetProperties().First(delegate(PropertyInfo property)
				{
					Type type = typeof(ProtoSet<>).MakeGenericType(protoType);
					return type.IsAssignableFrom(property.PropertyType);
				});
				MethodInfo method = typeof(LDBTool).GetMethod("AddProtosToSet", AccessTools.all);
				MethodInfo methodInfo = method.MakeGenericMethod(protoType);
				object value = propertyInfo.GetValue(null);
				methodInfo.Invoke(null, new object[2]
				{
					value,
					datas[i]
				});
			}
		}

		private static void AddProtosToSet<T>(ProtoSet<T> protoSet, List<Proto> protos) where T : Proto
		{
			T[] dataArray = protoSet.dataArray;
			((ProtoTable)protoSet).Init(dataArray.Length + protos.Count);
			for (int i = 0; i < dataArray.Length; i++)
			{
				protoSet.dataArray[i] = dataArray[i];
			}
			for (int j = 0; j < protos.Count; j++)
			{
				ref T reference = ref protoSet.dataArray[dataArray.Length + j];
				Proto obj = protos[j];
				reference = (T)(object)((obj is T) ? obj : null);
				Proto obj2 = protos[j];
				ItemProto val = (ItemProto)(object)((obj2 is ItemProto) ? obj2 : null);
				if (val != null)
				{
					val.index = dataArray.Length + j;
				}
				if (protos[j] is RecipeProto)
				{
					Proto obj3 = protos[j];
					RecipeProto val2 = (RecipeProto)(object)((obj3 is RecipeProto) ? obj3 : null);
					if (val2.preTech != null)
					{
						ArrayAddItem(ref val2.preTech.UnlockRecipes, ((Proto)val2).ID);
						ArrayAddItem(ref val2.preTech.unlockRecipeArray, val2);
					}
				}
				LDBToolPlugin.logger.LogInfo((object)$"Add {protos[j].ID} {Localization.Translate(protos[j].Name)} to {((object)protoSet).GetType().Name}.");
			}
			Dictionary<int, int> dictionary = new Dictionary<int, int>();
			for (int k = 0; k < protoSet.dataArray.Length; k++)
			{
				((Proto)protoSet.dataArray[k]).sid = ((Proto)protoSet.dataArray[k]).SID;
				dictionary[((Proto)protoSet.dataArray[k]).ID] = k;
			}
			protoSet.dataIndices = dictionary;
		}

		private static void ArrayAddItem<T>(ref T[] array, T item)
		{
			List<T> list = array.ToList();
			list.Add(item);
			array = list.ToArray();
		}
	}
	[BepInPlugin("me.xiaoye97.plugin.Dyson.LDBTool", "LDBTool", "3.0.1")]
	public class LDBToolPlugin : BaseUnityPlugin
	{
		public const string MODNAME = "LDBTool";

		public const string MODGUID = "me.xiaoye97.plugin.Dyson.LDBTool";

		public const string VERSION = "3.0.1";

		internal static ManualLogSource logger;

		internal static ConfigEntry<bool> ShowProto;

		internal static ConfigEntry<KeyCode> ShowProtoHotKey;

		internal static ConfigEntry<KeyCode> ShowItemProtoHotKey;

		internal static ConfigEntry<KeyCode> ShowRecipeProtoHotKey;

		internal static UIItemTip lastTip;

		private void Awake()
		{
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Expected O, but got Unknown
			logger = ((BaseUnityPlugin)this).Logger;
			ProtoIndex.InitIndex();
			LDBTool.Init();
			ShowProto = ((BaseUnityPlugin)this).Config.Bind<bool>("config", "ShowProto", false, "是否开启数据显示");
			ShowProtoHotKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("config", "ShowProtoHotKey", (KeyCode)286, "呼出界面的快捷键");
			ShowItemProtoHotKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("config", "ShowItemProtoHotKey", (KeyCode)105, "显示物品的Proto");
			ShowRecipeProtoHotKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("config", "ShowRecipeProtoHotKey", (KeyCode)114, "显示配方的Proto");
			Harmony val = new Harmony("me.xiaoye97.plugin.Dyson.LDBTool");
			val.PatchAll(Assembly.GetExecutingAssembly());
			logger.LogInfo((object)"LDBTool is loaded successfully!");
		}

		private void Update()
		{
			//IL_0011: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			if (!ShowProto.Value)
			{
				return;
			}
			if (Input.GetKeyDown(ShowProtoHotKey.Value))
			{
				ProtoDataUI.Show = !ProtoDataUI.Show;
			}
			if (SupportsHelper.UnityExplorerInstalled)
			{
				if (Input.GetKeyDown(ShowItemProtoHotKey.Value))
				{
					TryShowItemProto();
				}
				if (Input.GetKeyDown(ShowRecipeProtoHotKey.Value))
				{
					TryShowRecipeProto();
				}
			}
		}

		private void OnGUI()
		{
			if (ShowProto.Value && ProtoDataUI.Show)
			{
				ProtoDataUI.OnGUI();
			}
		}

		internal static void TryShowItemProto()
		{
			if (!ShowProto.Value || !((Object)(object)lastTip != (Object)null) || lastTip.showingItemId == 0)
			{
				return;
			}
			ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(lastTip.showingItemId);
			if (val != null)
			{
				RUEHelper.ShowProto((Proto)(object)val);
				return;
			}
			RecipeProto val2 = ((ProtoSet<RecipeProto>)(object)LDB.recipes).Select(-lastTip.showingItemId);
			if (val2 != null)
			{
				int[] results = val2.Results;
				foreach (int num in results)
				{
					ItemProto proto = ((ProtoSet<ItemProto>)(object)LDB.items).Select(num);
					RUEHelper.ShowProto((Proto)(object)proto);
				}
			}
		}

		internal static void TryShowRecipeProto()
		{
			if (!ShowProto.Value || !((Object)(object)lastTip != (Object)null) || lastTip.showingItemId == 0)
			{
				return;
			}
			ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(lastTip.showingItemId);
			if (val != null)
			{
				foreach (RecipeProto recipe in val.recipes)
				{
					RUEHelper.ShowProto((Proto)(object)recipe);
				}
				return;
			}
			RecipeProto proto = ((ProtoSet<RecipeProto>)(object)LDB.recipes).Select(-lastTip.showingItemId);
			RUEHelper.ShowProto((Proto)(object)proto);
		}
	}
	public static class MethedEx
	{
		[Obsolete("Please don't use this method. Instead use CommonAPI.")]
		public static T Copy<T>(this T obj) where T : class
		{
			Type type = obj.GetType();
			object obj2 = Activator.CreateInstance(type);
			FieldInfo[] fields = type.GetFields();
			foreach (FieldInfo fieldInfo in fields)
			{
				if (!fieldInfo.IsLiteral && !fieldInfo.IsStatic)
				{
					Traverse.Create(obj2).Field(fieldInfo.Name).SetValue(Traverse.Create((object)obj).Field(fieldInfo.Name).GetValue());
				}
			}
			PropertyInfo[] properties = type.GetProperties();
			foreach (PropertyInfo propertyInfo in properties)
			{
				if (propertyInfo.CanWrite && propertyInfo.CanRead)
				{
					Traverse.Create(obj2).Property(propertyInfo.Name, (object[])null).SetValue(Traverse.Create((object)obj).Property(propertyInfo.Name, (object[])null).GetValue());
				}
			}
			return obj2 as T;
		}
	}
	public static class ProtoIndex
	{
		private static Dictionary<Type, int> index = new Dictionary<Type, int>();

		private static Type[] protoTypes;

		internal static void InitIndex()
		{
			LDBToolPlugin.logger.LogDebug((object)"Generating Proto type list:");
			protoTypes = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
				from assemblyType in GetTypesSafe(domainAssembly)
				where assemblyType != null && typeof(Proto).IsAssignableFrom(assemblyType) && assemblyType != typeof(Proto)
				select assemblyType).ToArray();
			for (int i = 0; i < protoTypes.Length; i++)
			{
				index.Add(protoTypes[i], i);
				LDBToolPlugin.logger.LogDebug((object)("Found Proto type: " + protoTypes[i].FullName));
			}
		}

		private static Type[] GetTypesSafe(Assembly assembly)
		{
			try
			{
				return assembly.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types;
			}
		}

		public static int GetProtosCount()
		{
			return index.Count;
		}

		public static int GetIndex(Proto proto)
		{
			return GetIndex(((object)proto).GetType());
		}

		public static int GetIndex(Type type)
		{
			if (!typeof(Proto).IsAssignableFrom(type))
			{
				throw new ArgumentException("Can't get index because type " + type.FullName + " does not extend Proto type.");
			}
			if (index.ContainsKey(type))
			{
				return index[type];
			}
			throw new ArgumentException("Unknown Proto type: " + type.FullName);
		}

		public static Type GetProtoTypeAt(int num)
		{
			return protoTypes[num];
		}

		public static string GetProtoName(Proto proto)
		{
			return ((object)proto).GetType().Name.Replace("Proto", "");
		}

		public static string[] GetProtoNames()
		{
			return protoTypes.Select((Type type) => type.Name.Replace("Proto", "")).ToArray();
		}

		internal static Type[] GetAllProtoTypes()
		{
			return protoTypes;
		}
	}
	[Obsolete("Use methods that don't have this type as parameter")]
	public enum ProtoType
	{
		AdvisorTip,
		Audio,
		EffectEmitter,
		Item,
		Model,
		Player,
		Recipe,
		String,
		Tech,
		Theme,
		Tutorial,
		Vege,
		Vein
	}
}
namespace xiaoye97.UI
{
	public static class ProtoDataUI
	{
		public static bool Show;

		private static Rect winRect = new Rect(0f, 0f, 500f, 800f);

		private static int selectIndex;

		private static string[] protoTypeNames = ProtoIndex.GetProtoNames();

		public static ISkin Skin;

		private static int SelectIndex
		{
			get
			{
				return selectIndex;
			}
			set
			{
				if (selectIndex != value)
				{
					selectIndex = value;
					ProtoSetEx.needSearch = true;
				}
			}
		}

		public static void OnGUI()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			if (Skin != null)
			{
				GUI.skin = Skin.GetSkin();
			}
			winRect = GUILayout.Window(3562532, winRect, new WindowFunction(WindowFunc), "ProtoData", Array.Empty<GUILayoutOption>());
		}

		public static void WindowFunc(int id)
		{
			if (Skin != null)
			{
				GUI.skin = Skin.GetSkin();
			}
			GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(GUI.skin.box, Array.Empty<GUILayoutOption>());
			SelectIndex = GUILayout.SelectionGrid(SelectIndex, protoTypeNames, 10, Array.Empty<GUILayoutOption>());
			GUILayout.Space(20f);
			if (GUILayout.Button("Close", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) }))
			{
				Show = false;
			}
			GUILayout.EndHorizontal();
			Type selectedType = ProtoIndex.GetProtoTypeAt(selectIndex);
			PropertyInfo propertyInfo = typeof(LDB).GetProperties().First(delegate(PropertyInfo property)
			{
				Type type = typeof(ProtoSet<>).MakeGenericType(selectedType);
				return type.IsAssignableFrom(property.PropertyType);
			});
			object value = propertyInfo.GetValue(null);
			MethodInfo methodInfo = typeof(ProtoSetEx).GetMethod("ShowSet", AccessTools.all).MakeGenericMethod(selectedType);
			methodInfo.Invoke(null, new object[1] { value });
			GUILayout.EndVertical();
			GUI.DragWindow();
		}
	}
	public static class ProtoSetEx
	{
		private static Vector2 sv;

		private static Dictionary<Type, int> selectPages;

		private static string search;

		public static bool needSearch;

		private static List<Proto> searchResultList;

		private static string Search
		{
			get
			{
				return search;
			}
			set
			{
				if (search != value)
				{
					search = value;
					needSearch = true;
				}
			}
		}

		static ProtoSetEx()
		{
			selectPages = new Dictionary<Type, int>();
			search = "";
			needSearch = true;
			searchResultList = new List<Proto>();
			PropertyInfo[] properties = typeof(LDB).GetProperties();
			foreach (PropertyInfo propertyInfo in properties)
			{
				Type type = propertyInfo.PropertyType;
				if (!type.IsConstructedGenericType)
				{
					type = type.BaseType;
				}
				Type key = type.GetGenericArguments()[0];
				selectPages.Add(key, 0);
			}
		}

		private static void SearchLDB<T>(ProtoSet<T> protoSet) where T : Proto
		{
			searchResultList.Clear();
			if ((Object)(object)protoSet != (Object)null)
			{
				T[] dataArray = protoSet.dataArray;
				foreach (T val in dataArray)
				{
					if (Search == "" || ((Proto)val).ID.ToString().Contains(Search) || ((Proto)val).Name.Contains(Search) || Localization.Translate(((Proto)val).Name).Contains(Search))
					{
						searchResultList.Add((Proto)(object)val);
					}
				}
			}
			needSearch = false;
		}

		public static void ShowSet<T>(ProtoSet<T> protoSet) where T : Proto
		{
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			if (ProtoDataUI.Skin != null)
			{
				GUI.skin = ProtoDataUI.Skin.GetSkin();
			}
			GUILayout.BeginHorizontal(GUI.skin.box, Array.Empty<GUILayoutOption>());
			Search = GUILayout.TextField(Search, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(200f) });
			if (needSearch)
			{
				SearchLDB<T>(protoSet);
			}
			GUILayout.Label($"Page {selectPages[typeof(T)] + 1} / {searchResultList.Count / 100 + 1}", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) });
			if (GUILayout.Button("-", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(20f) }))
			{
				selectPages[typeof(T)]--;
			}
			if (GUILayout.Button("+", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(20f) }))
			{
				selectPages[typeof(T)]++;
			}
			if (selectPages[typeof(T)] < 0)
			{
				selectPages[typeof(T)] = searchResultList.Count / 100;
			}
			else if (selectPages[typeof(T)] > searchResultList.Count / 100)
			{
				selectPages[typeof(T)] = 0;
			}
			GUILayout.EndHorizontal();
			GUILayout.BeginVertical(GUI.skin.box, Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label("index", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(40f) });
			GUILayout.Label("ID", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(40f) });
			GUILayout.Label("Name", Array.Empty<GUILayoutOption>());
			GUILayout.Label("TranslateName", Array.Empty<GUILayoutOption>());
			if (SupportsHelper.UnityExplorerInstalled)
			{
				GUILayout.Label("Show Data", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) });
			}
			GUILayout.EndHorizontal();
			sv = GUILayout.BeginScrollView(sv, Array.Empty<GUILayoutOption>());
			for (int i = selectPages[typeof(T)] * 100; i < Mathf.Min(selectPages[typeof(T)] * 100 + 100, searchResultList.Count); i++)
			{
				GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
				GUILayout.Label($"{i}", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(40f) });
				if (searchResultList[i] != null)
				{
					GUILayout.Label($"{searchResultList[i].ID}", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(40f) });
					GUILayout.Label(searchResultList[i].Name ?? "", Array.Empty<GUILayoutOption>());
					GUILayout.Label(Localization.Translate(searchResultList[i].name) ?? "", Array.Empty<GUILayoutOption>());
					if (SupportsHelper.UnityExplorerInstalled && GUILayout.Button("Show Data", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) }))
					{
						ShowItem showItem = new ShowItem(searchResultList[i]);
						showItem.Show();
					}
				}
				else
				{
					GUILayout.Label("null", Array.Empty<GUILayoutOption>());
				}
				GUILayout.EndHorizontal();
			}
			GUILayout.EndScrollView();
			GUILayout.EndVertical();
		}
	}
	public static class RUEHelper
	{
		public static void ShowProto(Proto proto)
		{
			if (proto != null)
			{
				ShowItem showItem = new ShowItem(proto);
				showItem.Show();
			}
		}
	}
	public class ShowItem
	{
		private object proto;

		public ShowItem(object proto)
		{
			this.proto = proto;
		}

		public void Show()
		{
			if (SupportsHelper.UnityExplorerInstalled)
			{
				SupportsHelper.inspectMethod.Invoke(null, new object[2] { proto, null });
			}
		}
	}
	public static class SupportsHelper
	{
		internal static readonly Type unityExplorerType;

		internal static readonly MethodInfo inspectMethod;

		public static bool UnityExplorerInstalled
		{
			get
			{
				if (unityExplorerType != null)
				{
					return inspectMethod != null;
				}
				return false;
			}
		}

		static SupportsHelper()
		{
			unityExplorerType = AccessTools.TypeByName("UnityExplorer.InspectorManager");
			if (unityExplorerType != null)
			{
				inspectMethod = unityExplorerType.GetMethods().First((MethodInfo info) => info.Name == "Inspect" && info.GetParameters().Length == 2);
			}
		}
	}
	public interface ISkin
	{
		GUISkin GetSkin();
	}
}
namespace xiaoye97.Patches
{
	[HarmonyPatch]
	public static class GameHistoryData_Patch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameHistoryData), "Import")]
		private static void HistoryPatch(GameHistoryData __instance)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			foreach (Proto item in LDBTool.TotalDict[ProtoIndex.GetIndex(typeof(RecipeProto))])
			{
				RecipeProto val = (RecipeProto)(object)((item is RecipeProto) ? item : null);
				if (val.preTech != null && __instance.TechState(((Proto)val.preTech).ID).unlocked && !__instance.RecipeUnlocked(((Proto)val).ID))
				{
					__instance.UnlockRecipe(((Proto)val).ID);
				}
			}
		}
	}
	[HarmonyPatch]
	public static class UITip_Patch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(UIItemTip), "SetTip")]
		private static void ItemTipPatch(UIItemTip __instance, int itemId)
		{
			if (LDBToolPlugin.ShowProto.Value)
			{
				Text nameText = __instance.nameText;
				nameText.text += $" {itemId}";
				LDBToolPlugin.lastTip = __instance;
			}
		}
	}
	[HarmonyPatch]
	public static class VFPreload_Patch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")]
		private static void VFPreloadPrePatch()
		{
			if (!LDBTool.Finshed)
			{
				LDBToolPlugin.logger.LogInfo((object)"Pre Loading...");
				if (LDBTool.PreAddDataAction != null)
				{
					LDBTool.PreAddDataAction();
					LDBTool.PreAddDataAction = null;
				}
				LDBTool.AddProtos(LDBTool.PreToAdd);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")]
		private static void VFPreloadPostPatch()
		{
			if (LDBTool.Finshed)
			{
				return;
			}
			LDBToolPlugin.logger.LogInfo((object)"Post Loading...");
			if (LDBTool.PostAddDataAction != null)
			{
				LDBTool.PostAddDataAction();
				LDBTool.PostAddDataAction = null;
			}
			LDBTool.AddProtos(LDBTool.PostToAdd);
			if (LDBTool.EditDataAction != null)
			{
				PropertyInfo[] properties = typeof(LDB).GetProperties();
				foreach (PropertyInfo propertyInfo in properties)
				{
					Type type = propertyInfo.PropertyType;
					if (!type.IsConstructedGenericType)
					{
						type = type.BaseType;
					}
					Type type2 = type.GetGenericArguments()[0];
					object value = propertyInfo.GetValue(null);
					MethodInfo methodInfo = typeof(VFPreload_Patch).GetMethod("EditAllProtos", AccessTools.all).MakeGenericMethod(type2);
					methodInfo.Invoke(null, new object[1] { value });
				}
			}
			GameMain.iconSet.loaded = false;
			GameMain.iconSet.Create();
			LDBTool.SetBuildBar();
			LDBTool.Finshed = true;
			LDBToolPlugin.logger.LogInfo((object)"Done.");
		}

		private static void EditAllProtos<T>(ProtoSet<T> protoSet) where T : Proto
		{
			T[] dataArray = protoSet.dataArray;
			foreach (T val in dataArray)
			{
				if (val != null)
				{
					try
					{
						LDBTool.EditDataAction((Proto)(object)val);
					}
					catch (Exception ex)
					{
						LDBToolPlugin.logger.LogWarning((object)$"Edit Error: ID:{((Proto)val).ID} Type:{((object)val).GetType().Name} {ex.Message}");
					}
				}
			}
		}
	}
}