Decompiled source of BetterUI v3.0.4

plugins/BetterUI/BetterUI.dll

Decompiled 7 months ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
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.Cryptography;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BetterUI.Properties;
using BetterUnityPlugin;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using R2API.Utils;
using RoR2;
using RoR2.UI;
using RoR2.UI.MainMenu;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.ResourceManagement.AsyncOperations;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: ManualNetworkRegistration]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("BetterUI")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("3.0.4.0")]
[assembly: AssemblyInformationalVersion("3.0.4+Branch.tags-v3.0.4.Sha.f63af8828b32b84e3133b4f12d68bf20a9bfaea4")]
[assembly: AssemblyProduct("BetterUI")]
[assembly: AssemblyTitle("BetterUI")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("3.0.4.0")]
[module: UnverifiableCode]
namespace R2API.Utils
{
	[AttributeUsage(AttributeTargets.Assembly)]
	public class ManualNetworkRegistrationAttribute : Attribute
	{
	}
}
namespace BetterUI
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.xoxfaby.BetterUI", "BetterUI", "3.0.4")]
	public class BetterUIPlugin : BetterUnityPlugin<BetterUIPlugin>
	{
		internal delegate void HUDAwakeEvent(HUD self);

		public const string GUID = "com.xoxfaby.BetterUI";

		public const string Name = "BetterUI";

		public const string Version = "3.0.4";

		internal static BetterUIPlugin instance;

		internal static bool BetterAPIModIntegration = false;

		internal static HUD hud;

		internal static ObjectivePanelController objectivePanelController;

		public static StringBuilder sharedStringBuilder = new StringBuilder();

		public override BaseUnityPlugin typeReference
		{
			get
			{
				throw new NotImplementedException();
			}
		}

		internal static event HUDAwakeEvent onHUDAwake;

		protected override void Awake()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			base.Awake();
			instance = this;
			GameObject gameObject = ((Component)this).gameObject;
			((Object)gameObject).hideFlags = (HideFlags)(((Object)gameObject).hideFlags | 0x3D);
			((Component)this).gameObject.AddComponent<Language.UpdateChecker>();
			Language.LoadLanguages();
			BetterUIWindow.Init();
		}
	}
	internal static class BetterUIWindow
	{
		private class BetterUIDestroyer : MonoBehaviour
		{
			internal GameObject monitoredGameObject;

			private void OnDisable()
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)monitoredGameObject == (Object)null || Mathf.Abs(monitoredGameObject.transform.position.x) < 50f || Mathf.Abs(monitoredGameObject.transform.position.y) < 50f)
				{
					Object.Destroy((Object)(object)BetterUIPlugin.instance);
					Debug.LogError((object)"It appears the BetterUI Button has been destroyed or moved off the screen, this is not supported and BetterUI has been disabled.");
				}
			}
		}

		private static AssetBundle bundle;

		private static GameObject modPanelPrefab;

		private static GameObject modButtonPrefab;

		private static GameObject betterUIWindowPrefab;

		internal static Transform menuParent;

		static BetterUIWindow()
		{
			bundle = AssetBundle.LoadFromMemory(Resources.betteruiassets);
			modPanelPrefab = bundle.LoadAsset<GameObject>("Assets/ModPanel.prefab");
			modButtonPrefab = bundle.LoadAsset<GameObject>("Assets/ModButton.prefab");
			betterUIWindowPrefab = bundle.LoadAsset<GameObject>("Assets/BetterUIWindow.prefab");
		}

		internal static void Init()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			BetterUnityPlugin<BetterUIPlugin>.Hooks.Add<BaseMainMenuScreen>("Awake", (Action<Action<BaseMainMenuScreen>, BaseMainMenuScreen>)BaseMainMenuScreen_Awake, BindingFlags.Default);
			Node val = new Node("BetterUI", true, (Node)null);
			Node buttonNode = new Node("Donate", false, val);
			buttonNode.shouldShowUnviewed = (UserProfile userProfile) => !userProfile.HasViewedViewable(buttonNode.fullName);
			ViewablesCatalog.AddNodeToRoot(val);
		}

		private static void BaseMainMenuScreen_Awake(Action<BaseMainMenuScreen> orig, BaseMainMenuScreen self)
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			menuParent = ((Component)self).transform;
			Transform val = ((Component)self).transform.Find("SafeZone/GenericMenuButtonPanel");
			Transform val2 = ((Component)self).transform.Find("SafeZone/GenericMenuButtonPanel/JuicePanel/DescriptionPanel, Naked/ContentSizeFitter/DescriptionText");
			if ((Object)(object)val != (Object)null || (Object)(object)val2 != (Object)null)
			{
				LanguageTextMeshController component = ((Component)val2).GetComponent<LanguageTextMeshController>();
				GameObject obj = Object.Instantiate<GameObject>(modPanelPrefab, val);
				float num = 0.1f;
				Transform transform = obj.transform;
				transform.position += new Vector3(Mathf.SmoothStep(0f, 250f, num), 0f, 0f);
				HGButton[] componentsInChildren = obj.GetComponentsInChildren<HGButton>();
				foreach (HGButton val3 in componentsInChildren)
				{
					Transform transform2 = ((Component)val3).transform;
					transform2.localScale *= 1f + num;
					((Component)self).gameObject.AddComponent<BetterUIDestroyer>().monitoredGameObject = ((Component)val3).gameObject;
					val3.hoverLanguageTextMeshController = component;
				}
			}
			orig(self);
		}
	}
	public class BetterUIEventFunctions : MonoBehaviour
	{
		private static Dictionary<GameObject, GameObject> spawnedGameObjects = new Dictionary<GameObject, GameObject>();

		public void createWindow(GameObject prefab)
		{
			if ((Object)(object)BetterUIWindow.menuParent != (Object)null && (!spawnedGameObjects.TryGetValue(prefab, out var value) || (Object)(object)value == (Object)null))
			{
				spawnedGameObjects[prefab] = Object.Instantiate<GameObject>(prefab, BetterUIWindow.menuParent);
				Transform obj = spawnedGameObjects[prefab].transform.Find("Window/UpperLeftButtonPanel/DonateButton");
				Object.Destroy((Object)(object)((obj != null) ? ((Component)obj).gameObject : null));
				Transform obj2 = spawnedGameObjects[prefab].transform.Find("Window/UpperLeftButtonPanel/DiscordButton");
				Object.Destroy((Object)(object)((obj2 != null) ? ((Component)obj2).gameObject : null));
				Transform obj3 = spawnedGameObjects[prefab].transform.Find("Window/SocialPanel/TwitterButton");
				Object.Destroy((Object)(object)((obj3 != null) ? ((Component)obj3).gameObject : null));
			}
		}
	}
	[ExecuteAlways]
	internal class PrefabLoader : MonoBehaviour
	{
		public string prefabAddress;

		private string loadedPrefab;

		private bool loading;

		private GameObject instance;

		private void Start()
		{
			LoadPrefab();
		}

		private void OnValidate()
		{
			LoadPrefab();
		}

		private void LoadPrefab()
		{
			//IL_0022: 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)
			if (!string.IsNullOrEmpty(prefabAddress) && !loading)
			{
				loading = true;
				AsyncOperationHandle<GameObject> val = Addressables.LoadAssetAsync<GameObject>((object)prefabAddress);
				val.Completed += PrefabLoaded;
			}
		}

		private void PrefabLoaded(AsyncOperationHandle<GameObject> obj)
		{
			//IL_0002: 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)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Invalid comparison between Unknown and I4
			AsyncOperationStatus status = obj.Status;
			if ((int)status != 1)
			{
				if ((int)status == 2)
				{
					if ((Object)(object)instance != (Object)null)
					{
						Object.DestroyImmediate((Object)(object)instance);
					}
					Debug.LogError((object)"Prefab load failed.");
					loading = false;
				}
			}
			else if (!(loadedPrefab == prefabAddress))
			{
				if ((Object)(object)instance != (Object)null)
				{
					Object.DestroyImmediate((Object)(object)instance);
				}
				GameObject result = obj.Result;
				instance = Object.Instantiate<GameObject>(result);
				SetRecursiveFlags(instance.transform);
				instance.transform.SetParent(((Component)this).gameObject.transform, false);
				loadedPrefab = prefabAddress;
				loading = false;
			}
		}

		private static void SetRecursiveFlags(Transform transform)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			GameObject gameObject = ((Component)transform).gameObject;
			((Object)gameObject).hideFlags = (HideFlags)(((Object)gameObject).hideFlags | 0x34);
			foreach (Transform item in transform)
			{
				SetRecursiveFlags(item);
			}
		}
	}
	[ExecuteAlways]
	internal class AddressableAssetLoader : MonoBehaviour
	{
		public Component component;

		public string fieldName;

		public string assetAddress;

		private static readonly MethodInfo LoadAssetAsyncInfo = typeof(Addressables).GetMethod("LoadAssetAsync", new Type[1] { typeof(string) });

		private void LoadAsset(bool dontSave = false)
		{
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00b2: 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)
			Type type = ((object)component).GetType();
			FieldInfo field = type.GetField(fieldName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			PropertyInfo propertyInfo = null;
			if (field == null)
			{
				propertyInfo = type.GetProperty(fieldName, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				if (propertyInfo == null)
				{
					return;
				}
			}
			object obj = LoadAssetAsyncInfo.MakeGenericMethod(field?.FieldType ?? propertyInfo.PropertyType).Invoke(null, new object[1] { assetAddress });
			object obj2 = obj.GetType().GetMethod("WaitForCompletion", BindingFlags.Instance | BindingFlags.Public).Invoke(obj, null);
			Object val = (Object)obj2;
			if (val != (Object)null)
			{
				if (dontSave)
				{
					val.hideFlags = (HideFlags)(val.hideFlags | 0x34);
				}
				field?.SetValue(component, obj2);
				propertyInfo?.SetValue(component, obj2);
			}
		}

		private IEnumerator WaitAndLoadAsset()
		{
			yield return (object)new WaitUntil((Func<bool>)(() => Addressables.InternalIdTransformFunc != null));
			LoadAsset(dontSave: true);
		}

		private void Start()
		{
			LoadAsset();
		}

		private void OnValidate()
		{
			if (((Component)this).gameObject.activeInHierarchy)
			{
				((MonoBehaviour)this).StartCoroutine(WaitAndLoadAsset());
			}
		}
	}
	[Obsolete("This feature of BetterUI has been removed.")]
	public static class Buffs
	{
		[Obsolete("This feature of BetterUI has been removed.")]
		public struct BuffInfo
		{
			public string nameToken;

			public string descriptionToken;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterName(BuffDef buffDef, string nameToken)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterDescription(BuffDef buffDef, string descriptionToken)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterBuffInfo(BuffDef buffDef, string nameToken = null, string descriptionToken = null)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterBuffInfo(BuffDef buffDef, BuffInfo buffInfo)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static string GetName(BuffDef buffDef)
		{
			return "";
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static string GetDescription(BuffDef buffDef)
		{
			return "";
		}
	}
	[Obsolete("This feature of BetterUI has been removed.")]
	public static class ItemCounters
	{
		[Obsolete("This feature of BetterUI has been removed.")]
		public static float GetTierScore(ItemTierDef itemTierDef)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float GetTierScore(ItemTier tier)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float GetItemScore(ItemDef itemDef)
		{
			return 0f;
		}
	}
	public static class ItemStats
	{
		[Obsolete("This feature of BetterUI has been removed.")]
		public class StatFormatter
		{
			public delegate void Formatter(StringBuilder stringBuilder, float value, CharacterMaster master);

			public Formatter statFormatter;

			public string style;

			public string color;

			public string customFormatTag;

			public string customFormatClosingTag;

			public string prefix;

			public string suffix;

			public string pluralSuffix;

			public string format = "{0:0.##}";

			public bool bold;

			public bool italic;

			public bool underline;

			public bool strikethrough;

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter LuckChance = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Chance = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Gold = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Charges = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Percent = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter HP = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Seconds = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Armor = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Regen = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Range = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public static StatFormatter Damage = new StatFormatter();

			[Obsolete("This feature of BetterUI has been removed.")]
			public void FormatString(StringBuilder stringBuilder, float value, CharacterMaster master)
			{
			}
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public delegate float StackingFormula(float value, float extraStackValue, int stacks);

		[Obsolete("This feature of BetterUI has been removed.")]
		public delegate int CapFormula(float value, float extraStackValue, float procCoefficient);

		[Obsolete("This feature of BetterUI has been removed.")]
		public class ItemProcInfo
		{
			public float value;

			public float extraStackValue;

			public StatFormatter statFormatter;

			public StackingFormula stackingFormula;

			public CapFormula capFormula;

			[Obsolete("This feature of BetterUI has been removed.")]
			public void GetOutputString(StringBuilder stringBuilder, int stacks, CharacterMaster master, float procCoefficient)
			{
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public float GetValue(int stacks)
			{
				return 0f;
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public float GetCap(float procCoefficient)
			{
				return 0f;
			}
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public class ItemStat
		{
			public string nameToken;

			public StackingFormula stackingFormula;

			public float value;

			public float stackValue;

			public int stackLimit = int.MaxValue;

			public StatFormatter statFormatter;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public class ItemModifier
		{
			public delegate float ModificationFormula(float value, float modifier, float stacks, float stackModifier);

			public delegate float ModificationLocator(CharacterMaster master);

			public delegate bool ModificationChecker(CharacterMaster master, ItemModifier itemModifier);

			public delegate float ModificationCounter(CharacterMaster master, ItemModifier itemModifier);

			public static ModificationFormula ExponentialBonus = (float value, float modifier, float stackModifier, float stacks) => 1f - value - (1f - value) * (1f - modifier) * (float)Math.Pow(1f - stackModifier, stacks - 1f);

			public static ModificationFormula PositiveExponentialBonus = (float value, float modifier, float stackModifier, float stacks) => value * modifier * (float)Math.Pow(1f - stackModifier, stacks - 1f);

			public static ModificationFormula PercentBonus = (float value, float modifier, float stackModifier, float stacks) => value * ((modifier + stackModifier * (stacks - 1f)) / 100f);

			public static ModificationFormula LuckBonus = (float value, float modifier, float stackModifier, float stacks) => Math.Min(1f, Utils.LuckCalc(value, modifier)) - value;

			public static ModificationFormula AlliesBonus = (float value, float modifier, float stackModifier, float stacks) => value * modifier;

			public static ModificationFormula FlatBonus = (float value, float modifier, float stackModifier, float stacks) => value + modifier + stackModifier * stacks;

			public static ModificationLocator LuckLocator = (CharacterMaster master) => master.luck;

			public static ModificationLocator AlliesLocator = (CharacterMaster master) => Math.Max(TeamComponent.GetTeamMembers(master.GetBody().teamComponent.teamIndex).Count - 1, 0);

			public static ModificationChecker ItemChecker = (CharacterMaster master, ItemModifier itemModifier) => master.inventory.GetItemCount(itemModifier.itemDef) > 0;

			public static ModificationChecker TeamItemChecker = (CharacterMaster master, ItemModifier itemModifier) => Util.GetItemCountForTeam(master.GetBody().teamComponent.teamIndex, itemModifier.itemDef.itemIndex, true, true) > master.inventory.GetItemCount(itemModifier.itemDef);

			public static ModificationChecker LuckChecker = (CharacterMaster master, ItemModifier itemModifier) => master.luck != 0f;

			public static ModificationChecker AlliesChecker = (CharacterMaster master, ItemModifier itemModifier) => Math.Max(TeamComponent.GetTeamMembers(master.GetBody().teamComponent.teamIndex).Count - 1, 0) > 1;

			public static ModificationCounter ItemCounter = (CharacterMaster master, ItemModifier itemModifier) => master.inventory.GetItemCount(itemModifier.itemDef);

			public static ModificationCounter TeamItemCounter = (CharacterMaster master, ItemModifier itemModifier) => Util.GetItemCountForTeam(master.GetBody().teamComponent.teamIndex, itemModifier.itemDef.itemIndex, true, true) - master.inventory.GetItemCount(itemModifier.itemDef);

			public static ModificationCounter LuckCounter = (CharacterMaster master, ItemModifier itemModifier) => master.luck;

			public static ModificationCounter AlliesCounter = (CharacterMaster master, ItemModifier itemModifier) => Math.Max(TeamComponent.GetTeamMembers(master.GetBody().teamComponent.teamIndex).Count - 1, 0);

			public string nameToken;

			public string pluralNameToken;

			public ModificationFormula modificationFormula;

			public ItemDef itemDef;

			public ModificationLocator modificationLocator;

			public ModificationChecker modificationChecker;

			public ModificationCounter modificationCounter;

			public float modifier;

			public float stackModifier;

			[Obsolete("This feature of BetterUI has been removed.")]
			public bool GetModificationActive(CharacterMaster master)
			{
				return modificationChecker(master, this);
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public float GetModificationCount(CharacterMaster master)
			{
				return modificationCounter(master, this);
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public float GetModifiedValue(float value, CharacterMaster master, float count)
			{
				if (modificationLocator != null)
				{
					return modificationFormula(value, modificationLocator(master), stackModifier, count);
				}
				return modificationFormula(value, modifier, stackModifier, count);
			}
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public class ItemTag
		{
			public static ItemTag Damage;

			public static ItemTag Healing;

			public static ItemTag Luck;

			public static ItemTag LuckStat;

			public static ItemTag EquipmentCooldown;

			public static ItemTag SkillCooldown;

			public static ItemTag Allies;

			public static ItemTag MaxHealth;

			public static ItemTag TitanDamage;

			public static ItemTag TitanHealth;

			public static ItemTag MovementSpeed;

			static ItemTag()
			{
				Damage = new ItemTag();
				Healing = new ItemTag();
				Luck = new ItemTag();
				LuckStat = new ItemTag();
				EquipmentCooldown = new ItemTag();
				Allies = new ItemTag();
				MaxHealth = new ItemTag();
				TitanDamage = new ItemTag();
				TitanHealth = new ItemTag();
				SkillCooldown = new ItemTag();
				MovementSpeed = new ItemTag();
			}
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static class Styles
		{
			public const string Damage = "cIsDamage";

			public const string Healing = "cIsHealing";

			public const string Mono = "cMono";

			public const string Stack = "cStack";

			public const string Health = "cIsHealth";

			public const string Void = "cIsVoid";

			public const string Death = "cDeath";

			public const string UserSetting = "cUserSetting";

			public const string Artifact = "cArtifact";

			public const string Sub = "cSub";

			public const string Event = "cEvent";

			public const string WorldEvent = "cWorldEvent";

			public const string KeywordName = "cKeywordName";

			public const string Shrine = "cShrine";
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static readonly Dictionary<ItemDef, ItemProcInfo> itemProcInfos = new Dictionary<ItemDef, ItemProcInfo>();

		[Obsolete("This feature of BetterUI has been removed.")]
		public static List<ItemStat> GetItemStats(ItemDef itemDef)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static List<ItemTag> GetItemTags(ItemStat itemStat)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static List<ItemModifier> GetItemModifers(ItemTag itemTag)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemStat RegisterStat(ItemDef itemDef, string nameToken, float value, StackingFormula stackingFormula = null, StatFormatter statFormatter = null, ItemTag itemTag = null)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemStat RegisterStat(ItemDef itemDef, string nameToken, float value, float stackValue, StackingFormula stackingFormula = null, StatFormatter statFormatter = null, ItemTag itemTag = null)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemStat RegisterStat(ItemDef itemDef, string nameToken, float value, float stackValue, int stackLimit, StackingFormula stackingFormula = null, StatFormatter statFormatter = null, ItemTag itemTag = null)
		{
			return null;
		}

		public static ItemStat RegisterStat(ItemDef itemDef, ItemStat itemStat, ItemTag itemTag)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemModifier RegisterModifier(ItemTag itemTag, ItemDef itemDef, ItemModifier.ModificationFormula modificationFormula, float modifier, float? stackModifier = null, string nameToken = null, string pluralNameToken = null, ItemModifier.ModificationLocator modificationLocator = null, ItemModifier.ModificationChecker modificationChecker = null, ItemModifier.ModificationCounter modificationCounter = null)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemModifier RegisterModifier(ItemTag itemTag, string nameToken, ItemModifier.ModificationFormula modificationFormula, ItemModifier.ModificationLocator modificationLocator, ItemModifier.ModificationChecker modificationChecker, ItemModifier.ModificationCounter modificationCounter, string pluralNameToken = null)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemModifier RegisterModifier(ItemTag itemTag, ItemModifier itemModfier)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static ItemTag RegisterTag(ItemStat itemStat, ItemTag itemTag)
		{
			return null;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void GetItemStats(StringBuilder stringBuilder, ItemDef itemDef, int stacks, CharacterMaster master)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float LinearStacking(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float ExponentialStackingPlusOne(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float ExponentialStacking(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float NegativeExponentialStacking(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("Deprecated: Use DivideByStacksPlusOne instead.")]
		public static float DivideByBonusStacks(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float DivideByStacksPlusOne(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float DivideByStacks(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static float FocusedConvergenceStacking(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		public static float HyperbolicStacking(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		public static float NoStacking(float value, float extraStackValue, int stacks)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static int LinearCap(float value, float extraStackValue, float procCoefficient)
		{
			return 0;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterProc(ItemIndex itemIndex, ItemProcInfo itemProcInfo)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterProc(ItemIndex itemIndex, float value, float? extraStackValue = null, StatFormatter statFormatter = null, StackingFormula stackingFormula = null, CapFormula capFormula = null)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterProc(ItemDef itemDef, ItemProcInfo itemProcInfo)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void RegisterProc(ItemDef itemDef, float value, float? extraStackValue = null, StatFormatter statFormatter = null, StackingFormula stackingFormula = null, CapFormula capFormula = null)
		{
		}
	}
	public static class Language
	{
		internal class UpdateChecker : MonoBehaviour
		{
			private const string apiUrl = "https://weblate.faby.dev/api/components/ror2/betterui/translations/";

			private void Start()
			{
				((MonoBehaviour)this).StartCoroutine(CheckForUpdate());
			}

			private IEnumerator CheckForUpdate()
			{
				UnityWebRequest apiRequest = UnityWebRequest.Get("https://weblate.faby.dev/api/components/ror2/betterui/translations/");
				yield return apiRequest.SendWebRequest();
				if (apiRequest.isNetworkError)
				{
					Debug.LogError((object)("Error downloading language info - " + apiRequest.error));
				}
				else
				{
					List<(string, string, string)> list = new List<(string, string, string)>(((IEnumerable<JToken>)((JToken)JObject.Parse(apiRequest.downloadHandler.text)).SelectToken("$.results")).Select((JToken s) => ((string)s.SelectToken("$.filename"), (string)s.SelectToken("$.revision"), (string)s.SelectToken("$.file_url"))));
					foreach (var item in list)
					{
						bool flag = false;
						string languageName = Path.GetFileNameWithoutExtension(item.Item1);
						string lPath = Path.Combine(languagesPath, Path.GetFileName(item.Item1));
						string latestHash = item.Item2.Split(new char[1] { ',' })[0];
						try
						{
							if (latestHash != BlobHashFromPath(lPath))
							{
								flag = true;
							}
						}
						catch (FileNotFoundException)
						{
							flag = true;
						}
						if (!flag)
						{
							continue;
						}
						UnityWebRequest languageFileRequest = UnityWebRequest.Get(item.Item3);
						yield return languageFileRequest.SendWebRequest();
						if (languageFileRequest.isNetworkError)
						{
							Debug.LogError((object)apiRequest.error);
						}
						else if (BlobHashFromString(languageFileRequest.downloadHandler.text) == latestHash)
						{
							if (LoadLanguage(languageName, languageFileRequest.downloadHandler.text))
							{
								File.WriteAllText(lPath, languageFileRequest.downloadHandler.text);
							}
						}
						else
						{
							Debug.LogError((object)("Error downloading file for language: " + languageName + " - Blob hash mismatch"));
						}
					}
				}
				Object.Destroy((Object)(object)this);
			}
		}

		private static Dictionary<string, List<KeyValuePair<string, string>>> LanguageStrings;

		private static string dllPath;

		private static string languagesPath;

		private static List<string> languageFilePaths;

		static Language()
		{
			LanguageStrings = new Dictionary<string, List<KeyValuePair<string, string>>>(StringComparer.OrdinalIgnoreCase);
			Language.onCurrentLanguageChanged += Language_onCurrentLanguageChanged;
			dllPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			languagesPath = Path.Combine(dllPath, "Languages");
			if (!Directory.Exists(languagesPath))
			{
				languagesPath = dllPath;
			}
			languageFilePaths = new List<string>(Directory.GetFiles(languagesPath, "*.lang"));
		}

		public static string GetPluralToken(string token, float seconds)
		{
			switch (Language.currentLanguageName)
			{
			case "UA":
			case "RU":
				if (seconds % 1f != 0f)
				{
					return token + "_SPECIAL";
				}
				switch ((int)seconds % 10)
				{
				case 1:
					if (seconds != 11f)
					{
						return token;
					}
					break;
				case 2:
				case 3:
				case 4:
					if (seconds < 12f || seconds > 14f)
					{
						return token + "_SPECIAL";
					}
					break;
				}
				return token + "_PLURAL";
			case "zh-CN":
				return token;
			default:
				if (seconds != 1f)
				{
					return token + "_PLURAL";
				}
				return token;
			}
		}

		private static void Language_onCurrentLanguageChanged()
		{
			if (LanguageStrings.TryGetValue(Language.currentLanguageName, out var value))
			{
				Language.currentLanguage.SetStringsByTokens((IEnumerable<KeyValuePair<string, string>>)value);
			}
			if (!string.Equals(Language.currentLanguageName, "en", StringComparison.OrdinalIgnoreCase) && LanguageStrings.TryGetValue("en", out var value2))
			{
				Language obj = Language.FindLanguageByName("en");
				if (obj != null)
				{
					obj.SetStringsByTokens((IEnumerable<KeyValuePair<string, string>>)value2);
				}
			}
		}

		public static void RegisterLanguageToken(string token, string text, string language = "en")
		{
			if (!LanguageStrings.ContainsKey(language))
			{
				LanguageStrings[language] = new List<KeyValuePair<string, string>>();
			}
			LanguageStrings[language].Add(new KeyValuePair<string, string>(token, text));
			if (string.Equals(Language.currentLanguageName, language, StringComparison.OrdinalIgnoreCase) || string.Equals(language, "en", StringComparison.OrdinalIgnoreCase))
			{
				Language obj = Language.FindLanguageByName(language);
				if (obj != null)
				{
					obj.SetStringByToken(token, text);
				}
			}
		}

		public static void LoadLanguages()
		{
			foreach (string languageFilePath in languageFilePaths)
			{
				LoadLanguage(jsonText: File.ReadAllText(languageFilePath), languageName: Path.GetFileNameWithoutExtension(languageFilePath));
			}
		}

		public static bool LoadLanguage(string languageName, string jsonText)
		{
			//IL_0046: Expected O, but got Unknown
			try
			{
				foreach (KeyValuePair<string, string> item in JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonText))
				{
					RegisterLanguageToken(item.Key, item.Value, languageName);
				}
			}
			catch (JsonException val)
			{
				JsonException val2 = val;
				Debug.LogError((object)("Error deserializing JSON for language: " + languageName + " - " + ((Exception)(object)val2).Message));
				return false;
			}
			return true;
		}

		public static string CalculateBlobHash(Stream fileStream)
		{
			string s = $"blob {fileStream.Length}\0";
			byte[] bytes = Encoding.ASCII.GetBytes(s);
			using SHA1 sHA = SHA1.Create();
			sHA.TransformBlock(bytes, 0, bytes.Length, bytes, 0);
			byte[] array = new byte[8192];
			int inputCount;
			while ((inputCount = fileStream.Read(array, 0, array.Length)) > 0)
			{
				sHA.TransformBlock(array, 0, inputCount, array, 0);
			}
			sHA.TransformFinalBlock(array, 0, 0);
			return ByteArrayToHexString(sHA.Hash);
		}

		public static string BlobHashFromPath(string filePath)
		{
			using FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
			return CalculateBlobHash(fileStream);
		}

		public static string BlobHashFromString(string inputString)
		{
			MemoryStream memoryStream = new MemoryStream();
			StreamWriter streamWriter = new StreamWriter(memoryStream);
			streamWriter.Write(inputString);
			streamWriter.Flush();
			memoryStream.Position = 0L;
			return CalculateBlobHash(memoryStream);
		}

		private static string ByteArrayToHexString(byte[] bytes)
		{
			StringBuilder stringBuilder = new StringBuilder(bytes.Length * 2);
			foreach (byte b in bytes)
			{
				stringBuilder.Append(b.ToString("x2"));
			}
			return stringBuilder.ToString();
		}
	}
	public static class StatsDisplay
	{
		public delegate string DisplayCallback(CharacterBody characterBody);

		internal static void Hook()
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddStatsDisplay(string token, Func<CharacterBody, string> displayCallback)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddStatsDisplay(string token, DisplayCallback displayCallback)
		{
		}
	}
	public static class ProcCoefficientCatalog
	{
		[Obsolete("This feature of BetterUI has been removed.")]
		public struct ProcCoefficientInfo
		{
			public string name;

			public float procCoefficient;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddSkill(string skillDef, List<ProcCoefficientInfo> procCoefficientInfoList)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddSkill(string skillDef, ProcCoefficientInfo procCoefficientInfo)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddSkill(string skillDef, string name, float procCoefficient)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddToSkill(string skillDef, ProcCoefficientInfo procCoefficientInfo)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static void AddToSkill(string skillDef, string name, float procCoefficient)
		{
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static List<ProcCoefficientInfo> GetProcCoefficientInfo(string skillDef)
		{
			return null;
		}
	}
	[Obsolete]
	public static class ProcItemsCatalog
	{
		public delegate string EffectFormatter(float value, float procCoefficient, float luck, bool canCap, int cap);

		public class FormatterTranslater
		{
			private EffectFormatter effectFormatter;

			internal FormatterTranslater(EffectFormatter effectFormatter)
			{
				this.effectFormatter = effectFormatter;
			}

			public void Formatter(StringBuilder stringBuilder, float value, CharacterMaster master)
			{
				stringBuilder.Append(effectFormatter(value, 1f, 1f, canCap: false, 1));
			}
		}

		[Obsolete]
		public delegate float StackingFormula(float value, float extraStackValue, int stacks);

		[Obsolete]
		public delegate int CapFormula(float value, float extraStackValue, float procCoefficient);

		[Obsolete]
		public class EffectInfo
		{
			public float value;

			public float extraStackValue;

			public EffectFormatter effectFormatter;

			public StackingFormula stackingFormula;

			public CapFormula capFormula;

			public ItemStats.ItemProcInfo ToItemProcInfo()
			{
				return new ItemStats.ItemProcInfo
				{
					value = value,
					extraStackValue = extraStackValue,
					statFormatter = new ItemStats.StatFormatter
					{
						statFormatter = new FormatterTranslater(effectFormatter).Formatter
					},
					stackingFormula = stackingFormula.Invoke,
					capFormula = capFormula.Invoke
				};
			}
		}

		[Obsolete]
		private static StringBuilder formatterStringBuilder = new StringBuilder();

		[Obsolete]
		public static StackingFormula LinearStacking = ItemStats.LinearStacking;

		[Obsolete]
		public static StackingFormula ExponentialStacking = ItemStats.ExponentialStacking;

		[Obsolete]
		public static StackingFormula HyperbolicStacking = ItemStats.HyperbolicStacking;

		[Obsolete]
		public static StackingFormula NoStacking = ItemStats.NoStacking;

		[Obsolete]
		public static CapFormula LinearCap = ItemStats.LinearCap;

		public static string ChanceFormatter(float value, float procCoefficient, float luck, bool canCap, int cap)
		{
			formatterStringBuilder.Clear();
			formatterStringBuilder.Append("<style=cIsDamage>");
			formatterStringBuilder.Append(Math.Min(100f, 100f * Utils.LuckCalc(value * procCoefficient, luck)).ToString("0.##"));
			formatterStringBuilder.Append("%</style>");
			return formatterStringBuilder.ToString();
		}

		public static string HPFormatter(float value, float procCoefficient, float luck, bool canCap, int cap)
		{
			formatterStringBuilder.Clear();
			formatterStringBuilder.Append("<style=cIsHealing>");
			formatterStringBuilder.Append(value * procCoefficient);
			formatterStringBuilder.Append(" HP</style>");
			return formatterStringBuilder.ToString();
		}

		public static string RangeFormatter(float value, float procCoefficient, float luck, bool canCap, int cap)
		{
			formatterStringBuilder.Clear();
			formatterStringBuilder.Append("<style=cIsDamage>");
			formatterStringBuilder.Append(value * procCoefficient);
			formatterStringBuilder.Append("m </style>");
			return formatterStringBuilder.ToString();
		}

		[Obsolete("Removed, please use BetterUI.ItemStats.RegisterEffect", true)]
		public static void AddEffect(ItemIndex itemIndex, EffectInfo effectInfo)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if ((int)itemIndex <= -1)
			{
				Debug.LogError((object)"ERROR: AddEffect was passed ItemIndex.None or below, this likely means you tried to register your effect before the item catalog was ready. Please use ItemCatalog.availability.CallWhenAvailable or pass an ItemDef directly.");
			}
			else
			{
				AddEffect(ItemCatalog.GetItemDef(itemIndex), effectInfo);
			}
		}

		[Obsolete("Removed, please use BetterUI.ItemStats.RegisterEffect", true)]
		public static void AddEffect(ItemIndex itemIndex, float value, float? extraStackValue = null, EffectFormatter effectFormatter = null, StackingFormula stackingFormula = null, CapFormula capFormula = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if ((int)itemIndex <= -1)
			{
				Debug.LogError((object)"ERROR: AddEffect was passed ItemIndex.None or below, this likely means you tried to register your effect before the item catalog was ready. Please use ItemCatalog.availability.CallWhenAvailable or pass an ItemDef directly.");
			}
			else
			{
				AddEffect(ItemCatalog.GetItemDef(itemIndex), value, extraStackValue, effectFormatter, stackingFormula, capFormula);
			}
		}

		[Obsolete("Removed, please use BetterUI.ItemStats.RegisterEffect", true)]
		public static void AddEffect(ItemDef itemDef, EffectInfo effectInfo)
		{
			ItemStats.RegisterProc(itemDef, effectInfo.ToItemProcInfo());
		}

		[Obsolete("Removed, please use BetterUI.ItemStats.RegisterEffect", true)]
		public static void AddEffect(ItemDef itemDef, float value, float? extraStackValue = null, EffectFormatter effectFormatter = null, StackingFormula stackingFormula = null, CapFormula capFormula = null)
		{
			AddEffect(itemDef, new EffectInfo
			{
				value = value,
				extraStackValue = (extraStackValue ?? value),
				effectFormatter = (effectFormatter ?? new EffectFormatter(ChanceFormatter)),
				stackingFormula = (stackingFormula ?? LinearStacking),
				capFormula = capFormula
			});
		}
	}
	internal static class Utils
	{
		[Obsolete("This feature of BetterUI has been removed.")]
		public static float LuckCalc(float chance, float luck)
		{
			return 0f;
		}

		[Obsolete("This feature of BetterUI has been removed.")]
		public static int TheREALFindSkillIndexByName(string skillDefName)
		{
			return 0;
		}
	}
}
namespace BetterUI.ModCompatibility
{
	internal static class BetterAPICompatibility
	{
		internal static class Buffs
		{
			[Obsolete("This feature of BetterUI has been removed.")]
			public static void AddName(BuffDef buffDef, string nameToken)
			{
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public static void AddDescription(BuffDef buffDef, string descriptionToken)
			{
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public static void AddInfo(BuffDef buffDef, string nameToken = null, string descriptionToken = null)
			{
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public static void AddInfo(BuffDef buffDef, BetterUI.Buffs.BuffInfo buffInfo)
			{
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public static string GetName(BuffDef buffDef)
			{
				return "";
			}

			[Obsolete("This feature of BetterUI has been removed.")]
			public static string GetDescription(BuffDef buffDef)
			{
				return "";
			}
		}
	}
}
namespace BetterUI.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("BetterUI.Properties.Resources", typeof(Resources).Assembly);
				}
				return resourceMan;
			}
		}

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

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

		internal Resources()
		{
		}
	}
}

plugins/BetterUI/BetterUnityPlugin.dll

Decompiled 7 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using MonoMod.Cil;
using MonoMod.RuntimeDetour;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("BetterUnityPlugin")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.1.1.0")]
[assembly: AssemblyInformationalVersion("1.1.1+Branch.tags-v1.1.1.Sha.89bbfc2f44403bc6ceeff78b8a0a1d2401c458f0")]
[assembly: AssemblyProduct("BetterUnityPlugin")]
[assembly: AssemblyTitle("BetterUnityPlugin")]
[assembly: AssemblyVersion("1.1.1.0")]
namespace BetterUnityPlugin;

public abstract class BetterUnityPlugin<T> : BaseUnityPlugin
{
	public class HookManager
	{
		private List<(MethodInfo methodFrom, MethodInfo methodTo)> hookSignatures = new List<(MethodInfo, MethodInfo)>();

		private List<(MethodInfo methodFrom, Manipulator ILHookMethod)> ILHookMethods = new List<(MethodInfo, Manipulator)>();

		private List<Hook> hooks = new List<Hook>();

		private List<ILHook> ILHooks = new List<ILHook>();

		private bool enabled;

		public HookManager()
		{
			BetterUnityPlugin<T>.onEnable += BetterUnityPlugin_onEnable;
			BetterUnityPlugin<T>.onDisable += BetterUnityPlugin_onDisable;
		}

		private void BetterUnityPlugin_onEnable()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			enabled = true;
			foreach (var hookSignature in hookSignatures)
			{
				hooks.Add(new Hook((MethodBase)hookSignature.methodFrom, hookSignature.methodTo));
			}
			foreach (var iLHookMethod in ILHookMethods)
			{
				ILHooks.Add(new ILHook((MethodBase)iLHookMethod.methodFrom, iLHookMethod.ILHookMethod));
			}
		}

		private void BetterUnityPlugin_onDisable()
		{
			enabled = false;
			foreach (Hook hook in hooks)
			{
				hook.Dispose();
			}
			foreach (ILHook iLHook in ILHooks)
			{
				iLHook.Dispose();
			}
		}

		public static MethodInfo FindMethod(Type type, string methodName, Type[] types, BindingFlags bindings = BindingFlags.Default)
		{
			if (bindings != 0)
			{
				return type.GetMethod(methodName, bindings, null, types, null) ?? type.GetMethod(methodName, bindings);
			}
			return type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public, null, types, null) ?? type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic, null, types, null) ?? type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public, null, types, null) ?? type.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic, null, types, null) ?? type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public) ?? type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic) ?? type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public) ?? type.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic);
		}

		public static Type[] getParameterTypes(MethodInfo methodInfo)
		{
			List<Type> list = new List<Type>();
			ParameterInfo[] parameters = methodInfo.GetParameters();
			for (int i = 1; i < parameters.Length; i++)
			{
				list.Add(parameters[i].ParameterType);
			}
			return list.ToArray();
		}

		public void Add(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[0], ILHookMethod, bindings);
		}

		public void Add(Type type, string methodName, Delegate hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add(Type type, string methodName, Action<Action> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add<T1>(string methodName, Delegate hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, getParameterTypes(hookMethod.Method), hookMethod.Method, bindings);
		}

		public void Add<T1>(Type type, string methodName, Action<Action<T1>, T1> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[1] { typeof(T1) }, hookMethod.Method, bindings);
		}

		public void Add<T1>(Type type, string methodName, Func<Func<T1>, T1> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add<T1>(string methodName, Action<Action> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add<T1>(string methodName, Action<Action<T1>, T1> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add<T1>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[0], ILHookMethod, bindings);
		}

		public void Add<T1>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[1] { typeof(T1) }, ILHookMethod, bindings);
		}

		public void Add<T1, T2>(Type type, string methodName, Action<Action<T1, T2>, T1, T2> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[2]
			{
				typeof(T1),
				typeof(T2)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2>(Type type, string methodName, Func<Func<T1, T2>, T1, T2> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[1] { typeof(T1) }, hookMethod.Method, bindings);
		}

		public void Add<T1, T2>(string methodName, Action<Action<T2>, T2> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[1] { typeof(T2) }, hookMethod.Method, bindings);
		}

		public void Add<T1, T2>(string methodName, Func<Func<T2>, T2> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add<T1, T2>(string methodName, Action<Action<T1, T2>, T1, T2> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[1] { typeof(T2) }, hookMethod.Method, bindings);
		}

		public void Add<T1, T2>(string methodName, Func<Func<T1, T2>, T1, T2> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[0], hookMethod.Method, bindings);
		}

		public void Add<T1, T2>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[1] { typeof(T2) }, ILHookMethod, bindings);
		}

		public void Add<T1, T2>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[1] { typeof(T2) }, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3>(Type type, string methodName, Action<Action<T1, T2, T3>, T1, T2, T3> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[3]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3>(Type type, string methodName, Func<Func<T1, T2, T3>, T1, T2, T3> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[2]
			{
				typeof(T1),
				typeof(T2)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3>(string methodName, Action<Action<T2, T3>, T2, T3> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[2]
			{
				typeof(T2),
				typeof(T3)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3>(string methodName, Func<Func<T2, T3>, T2, T3> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[1] { typeof(T2) }, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3>(string methodName, Action<Action<T1, T2, T3>, T1, T2, T3> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[2]
			{
				typeof(T2),
				typeof(T3)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3>(string methodName, Func<Func<T1, T2, T3>, T1, T2, T3> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[1] { typeof(T2) }, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[2]
			{
				typeof(T2),
				typeof(T3)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[2]
			{
				typeof(T2),
				typeof(T3)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4>(Type type, string methodName, Action<Action<T1, T2, T3, T4>, T1, T2, T3, T4> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[4]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4>(Type type, string methodName, Func<Func<T1, T2, T3, T4>, T1, T2, T3, T4> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[3]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4>(string methodName, Action<Action<T2, T3, T4>, T2, T3, T4> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[3]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4>(string methodName, Func<Func<T2, T3, T4>, T2, T3, T4> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[2]
			{
				typeof(T2),
				typeof(T3)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4>(string methodName, Action<Action<T1, T2, T3, T4>, T1, T2, T3, T4> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[3]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4>(string methodName, Func<Func<T1, T2, T3, T4>, T1, T2, T3, T4> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[2]
			{
				typeof(T2),
				typeof(T3)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[3]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[3]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5>, T1, T2, T3, T4, T5> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[5]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5>, T1, T2, T3, T4, T5> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[4]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(string methodName, Action<Action<T2, T3, T4, T5>, T2, T3, T4, T5> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[4]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(string methodName, Func<Func<T2, T3, T4, T5>, T2, T3, T4, T5> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[3]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(string methodName, Action<Action<T1, T2, T3, T4, T5>, T1, T2, T3, T4, T5> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[4]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(string methodName, Func<Func<T1, T2, T3, T4, T5>, T1, T2, T3, T4, T5> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[3]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[4]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[4]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6>, T1, T2, T3, T4, T5, T6> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[6]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6>, T1, T2, T3, T4, T5, T6> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[5]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(string methodName, Action<Action<T2, T3, T4, T5, T6>, T2, T3, T4, T5, T6> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[5]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(string methodName, Func<Func<T2, T3, T4, T5, T6>, T2, T3, T4, T5, T6> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[4]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6>, T1, T2, T3, T4, T5, T6> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[5]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6>, T1, T2, T3, T4, T5, T6> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[4]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[5]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[5]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7>, T1, T2, T3, T4, T5, T6, T7> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[7]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7>, T1, T2, T3, T4, T5, T6, T7> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[6]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7>, T2, T3, T4, T5, T6, T7> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[6]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7>, T2, T3, T4, T5, T6, T7> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[5]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7>, T1, T2, T3, T4, T5, T6, T7> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[6]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7>, T1, T2, T3, T4, T5, T6, T7> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[5]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[6]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[6]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8>, T1, T2, T3, T4, T5, T6, T7, T8> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[8]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8>, T1, T2, T3, T4, T5, T6, T7, T8> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[7]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8>, T2, T3, T4, T5, T6, T7, T8> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[7]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8>, T2, T3, T4, T5, T6, T7, T8> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[6]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8>, T1, T2, T3, T4, T5, T6, T7, T8> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[7]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8>, T1, T2, T3, T4, T5, T6, T7, T8> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[6]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[7]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[7]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9>, T1, T2, T3, T4, T5, T6, T7, T8, T9> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[9]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9>, T1, T2, T3, T4, T5, T6, T7, T8, T9> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[8]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9>, T2, T3, T4, T5, T6, T7, T8, T9> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[8]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9>, T2, T3, T4, T5, T6, T7, T8, T9> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[7]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9>, T1, T2, T3, T4, T5, T6, T7, T8, T9> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[8]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9>, T1, T2, T3, T4, T5, T6, T7, T8, T9> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[7]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[8]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[8]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[10]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[9]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9, T10>, T2, T3, T4, T5, T6, T7, T8, T9, T10> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[9]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9, T10>, T2, T3, T4, T5, T6, T7, T8, T9, T10> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[8]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[9]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[8]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[9]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[9]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[11]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[10]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[10]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[9]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[10]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[9]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[10]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[10]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[12]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[11]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[11]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[10]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[11]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[10]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[11]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[11]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[13]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[12]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[12]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[11]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[12]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[11]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[12]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[12]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[14]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[13]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[13]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[12]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[13]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[12]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[13]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[13]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(Type type, string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[15]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14),
				typeof(T15)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(Type type, string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[14]
			{
				typeof(T1),
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(string methodName, Action<Action<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[14]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14),
				typeof(T15)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(string methodName, Func<Func<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[13]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(string methodName, Action<Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[14]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14),
				typeof(T15)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(string methodName, Func<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[13]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14)
			}, hookMethod.Method, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(typeof(T1), methodName, new Type[14]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14),
				typeof(T15)
			}, ILHookMethod, bindings);
		}

		public void Add<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(Type type, string methodName, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			Add(type, methodName, new Type[14]
			{
				typeof(T2),
				typeof(T3),
				typeof(T4),
				typeof(T5),
				typeof(T6),
				typeof(T7),
				typeof(T8),
				typeof(T9),
				typeof(T10),
				typeof(T11),
				typeof(T12),
				typeof(T13),
				typeof(T14),
				typeof(T15)
			}, ILHookMethod, bindings);
		}

		public void Add(Type type, string methodName, Type[] types, Manipulator ILHookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			MethodInfo methodInfo = FindMethod(type, methodName, types, bindings);
			if (methodInfo == null)
			{
				Debug.LogError((object)$"Could not hook method {methodName} of {type}, method not found.");
				return;
			}
			ILHookMethods.Add((methodInfo, ILHookMethod));
			if (enabled)
			{
				ILHooks.Add(new ILHook((MethodBase)methodInfo, ILHookMethod));
			}
		}

		public void Add(Type type, string methodName, Type[] types, MethodInfo hookMethod, BindingFlags bindings = BindingFlags.Default)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			MethodInfo methodInfo = FindMethod(type, methodName, types, bindings);
			if (methodInfo == null)
			{
				Debug.LogError((object)$"Could not hook method {methodName} of {type}, method not found.");
				return;
			}
			hookSignatures.Add((methodInfo, hookMethod));
			if (enabled)
			{
				hooks.Add(new Hook((MethodBase)methodInfo, hookMethod));
			}
		}
	}

	public static HookManager Hooks = new HookManager();

	public abstract BaseUnityPlugin typeReference { get; }

	public static event Action onAwake;

	public static event Action onStart;

	public static event Action onEnable;

	public static event Action onDisable;

	public static event Action onUpdate;

	public static event Action onReset;

	public static event Action onFixedUpdate;

	public static event Action onLateUpdate;

	public static event Action onDestroy;

	protected virtual void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		GameObject gameObject = ((Component)this).gameObject;
		((Object)gameObject).hideFlags = (HideFlags)(((Object)gameObject).hideFlags | 0x3D);
		if (BetterUnityPlugin<T>.onAwake != null)
		{
			BetterUnityPlugin<T>.onAwake();
		}
	}

	protected virtual void Start()
	{
		if (BetterUnityPlugin<T>.onStart != null)
		{
			BetterUnityPlugin<T>.onStart();
		}
	}

	protected virtual void OnEnable()
	{
		if (BetterUnityPlugin<T>.onEnable != null)
		{
			BetterUnityPlugin<T>.onEnable();
		}
	}

	protected virtual void OnDisable()
	{
		if (BetterUnityPlugin<T>.onDisable != null)
		{
			BetterUnityPlugin<T>.onDisable();
		}
	}

	protected virtual void Update()
	{
		if (BetterUnityPlugin<T>.onUpdate != null)
		{
			BetterUnityPlugin<T>.onUpdate();
		}
	}

	protected virtual void FixedUpdate()
	{
		if (BetterUnityPlugin<T>.onFixedUpdate != null)
		{
			BetterUnityPlugin<T>.onFixedUpdate();
		}
	}

	protected virtual void LateUpdate()
	{
		if (BetterUnityPlugin<T>.onLateUpdate != null)
		{
			BetterUnityPlugin<T>.onLateUpdate();
		}
	}

	protected virtual void OnDestroy()
	{
		if (BetterUnityPlugin<T>.onDestroy != null)
		{
			BetterUnityPlugin<T>.onDestroy();
		}
	}

	protected virtual void Reset()
	{
		if (BetterUnityPlugin<T>.onReset != null)
		{
			BetterUnityPlugin<T>.onReset();
		}
	}
}