Decompiled source of Wolvys Cross Beams v1.0.4

plugins/WolvysCrossBeams.dll

Decompiled 4 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using WolvyreenModHub;

[assembly: AssemblyTitle("Wolvy's Cross Beams")]
[assembly: AssemblyDescription("Lets two angled beams of the same type snap into an X: a piece crossing another of the same type at its centre is no longer refused as a duplicate.")]
[assembly: AssemblyCompany("Wolvyreen(With_ClaudeAI)")]
[assembly: AssemblyProduct("Wolvy's Cross Beams")]
[assembly: AssemblyCopyright("Wolvyreen(With_ClaudeAI)")]
[assembly: AssemblyFileVersion("1.0.4.0")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyVersion("1.0.4.0")]
namespace WolvysCrossBeams
{
	[BepInPlugin("wolvy.valheim.crossbeams", "Wolvy's Cross Beams", "1.0.4")]
	public class Plugin : BaseUnityPlugin
	{
		public const string Guid = "wolvy.valheim.crossbeams";

		public const string PluginName = "Wolvy's Cross Beams";

		public const string PluginVersion = "1.0.4";

		public const string PluginAuthor = "Wolvyreen(With_ClaudeAI)";

		internal const float SamePlace = 0.05f;

		internal const float RotatedAllowance = 10f;

		internal const string LogTag = "[WolvysCrossBeams] ";

		internal static ManualLogSource Log;

		internal static ConfigEntry<bool> Enabled;

		private static FieldInfo _ghostField;

		private static Type _pieceType;

		private static MethodInfo _getSnapPoints;

		private static bool _failedOnce;

		private Harmony _harmony;

		private void Awake()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_0231: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Lets an angled beam snap where it crosses another beam of the same kind. A real duplicate (a piece whose snap points land on the existing piece's snap points) is still refused, as in vanilla.");
			_harmony = new Harmony("wolvy.valheim.crossbeams." + System.Guid.NewGuid().ToString("N").Substring(0, 8));
			try
			{
				Hub.Register("wolvy.valheim.crossbeams", "Wolvy's Cross Beams", "1.0.4", ((BaseUnityPlugin)this).Config, ((BaseUnityPlugin)this).Logger, _harmony);
			}
			catch (Exception ex)
			{
				Log.LogWarning((object)("[WolvysCrossBeams] Mod hub: could not add Wolvy's Cross Beams: " + ex.Message));
			}
			Type type = AccessTools.TypeByName("Player");
			_pieceType = AccessTools.TypeByName("Piece");
			MethodInfo methodInfo = ((!(type == null)) ? AccessTools.Method(type, "IsOverlappingOtherPiece", (Type[])null, (Type[])null) : null);
			_ghostField = ((!(type == null)) ? AccessTools.Field(type, "m_placementGhost") : null);
			_getSnapPoints = ((!(_pieceType == null)) ? AccessTools.Method(_pieceType, "GetSnapPoints", new Type[1] { typeof(List<Transform>) }, (Type[])null) : null);
			ParameterInfo[] array = methodInfo?.GetParameters();
			if (methodInfo == null || array.Length != 5 || array[0].ParameterType != typeof(Vector3) || array[1].ParameterType != typeof(Quaternion) || array[2].ParameterType != typeof(string) || array[4].ParameterType != typeof(bool) || _ghostField == null || _getSnapPoints == null)
			{
				Log.LogError((object)"[WolvysCrossBeams] Wolvy's Cross Beams 1.0.4: Player.IsOverlappingOtherPiece / Piece.GetSnapPoints not found or changed in this game version; nothing patched (vanilla snapping).");
				return;
			}
			_harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(Plugin), "OverlapPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			Log.LogInfo((object)"[WolvysCrossBeams] Wolvy's Cross Beams 1.0.4 loaded: crossed pieces can snap, real duplicates are still refused.");
		}

		private void OnDestroy()
		{
			try
			{
				Hub.Unregister();
			}
			catch (Exception ex)
			{
				if (Log != null)
				{
					Log.LogWarning((object)("[WolvysCrossBeams] Mod hub: " + ex.Message));
				}
			}
			if (_harmony != null)
			{
				_harmony.UnpatchSelf();
			}
		}

		private static bool OverlapPrefix(object __instance, Vector3 p, Quaternion rotation, string pieceName, object pieces, bool allowRotatedOverlap, ref bool __result)
		{
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			if (Enabled == null || !Enabled.Value)
			{
				return true;
			}
			try
			{
				object? value = _ghostField.GetValue(__instance);
				GameObject val = (GameObject)((value is GameObject) ? value : null);
				Component val2 = ((!((Object)(object)val == (Object)null)) ? val.GetComponent(_pieceType) : null);
				if ((Object)(object)val2 == (Object)null || pieces == null)
				{
					return true;
				}
				List<Vector3> list = null;
				__result = false;
				foreach (object item in (IEnumerable)pieces)
				{
					Component val3 = (Component)((item is Component) ? item : null);
					if ((Object)(object)val3 == (Object)null || Vector3.Distance(p, val3.transform.position) >= 0.05f || (allowRotatedOverlap && Quaternion.Angle(val3.transform.rotation, rotation) > 10f) || !((Object)val3.gameObject).name.StartsWith(pieceName, StringComparison.Ordinal))
					{
						continue;
					}
					if (list == null)
					{
						Vector3 val4 = p - val.transform.position;
						list = new List<Vector3>();
						foreach (Transform item2 in SnapPoints(val2))
						{
							list.Add(item2.position + val4);
						}
					}
					List<Vector3> list2 = new List<Vector3>();
					foreach (Transform item3 in SnapPoints(val3))
					{
						list2.Add(item3.position);
					}
					if (!IsDuplicate(list, list2))
					{
						continue;
					}
					__result = true;
					break;
				}
				return false;
			}
			catch (Exception ex)
			{
				if (!_failedOnce)
				{
					_failedOnce = true;
					Log.LogWarning((object)("[WolvysCrossBeams] Overlap check failed, using vanilla's: " + ex));
				}
				return true;
			}
		}

		private static List<Transform> SnapPoints(Component piece)
		{
			List<Transform> list = new List<Transform>();
			_getSnapPoints.Invoke(piece, new object[1] { list });
			return list;
		}

		internal static bool IsDuplicate(List<Vector3> ghostSnapsAtSnap, List<Vector3> existingWorldSnaps)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			if (ghostSnapsAtSnap.Count == 0 || existingWorldSnaps.Count == 0)
			{
				return true;
			}
			foreach (Vector3 item in ghostSnapsAtSnap)
			{
				bool flag = false;
				foreach (Vector3 existingWorldSnap in existingWorldSnaps)
				{
					if (Vector3.Distance(item, existingWorldSnap) < 0.05f)
					{
						flag = true;
						break;
					}
				}
				if (!flag)
				{
					return false;
				}
			}
			return true;
		}
	}
}
namespace WolvyreenModHub
{
	internal static class Hub
	{
		internal const int HubVersion = 15;

		internal const string ListKey = "Wolvyreen.ModHub.1";

		internal const string OpenKey = "Wolvyreen.ModHub.Open";

		internal static ManualLogSource Log;

		internal static Action<bool> Host;

		private static Dictionary<string, object> _mine;

		internal static bool Hosting { get; private set; }

		internal static bool Open(string id, string section = null)
		{
			if (!(AppDomain.CurrentDomain.GetData("Wolvyreen.ModHub.Open") is Action<string, string> action))
			{
				return false;
			}
			action(id, section);
			return true;
		}

		internal static List<Dictionary<string, object>> Entries()
		{
			List<Dictionary<string, object>> list = AppDomain.CurrentDomain.GetData("Wolvyreen.ModHub.1") as List<Dictionary<string, object>>;
			if (list == null)
			{
				list = new List<Dictionary<string, object>>();
				AppDomain.CurrentDomain.SetData("Wolvyreen.ModHub.1", list);
			}
			return list;
		}

		internal static void Register(string id, string name, string version, ConfigFile config, ManualLogSource log, Harmony harmony, Func<ConfigEntryBase, object, float> rows = null, Action<object> page = null, Func<string, object, bool> full = null)
		{
			Log = log;
			try
			{
				Type type = typeof(Hub).Assembly.GetType("WolvyreenModHub.HubWindow");
				bool flag = false;
				if (type != null && harmony != null)
				{
					MethodInfo method = type.GetMethod("Install", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
					flag = method != null && (bool)method.Invoke(null, new object[1] { harmony });
				}
				List<Dictionary<string, object>> list = Entries();
				List<Dictionary<string, object>> list2 = list.Where((Dictionary<string, object> e) => Get<string>(e, "id") == id).ToList();
				foreach (Dictionary<string, object> item in list2)
				{
					list.Remove(item);
				}
				Dictionary<string, object> dictionary = new Dictionary<string, object>();
				dictionary.Add("id", id);
				dictionary.Add("name", name);
				dictionary.Add("version", version);
				dictionary.Add("config", config);
				dictionary.Add("hubVersion", 15);
				dictionary.Add("canDraw", flag);
				dictionary.Add("changed", new Action(Check));
				dictionary.Add("rows", rows);
				dictionary.Add("page", page);
				dictionary.Add("full", full);
				_mine = dictionary;
				list.Add(_mine);
				Notify(list2);
				if (log != null)
				{
					log.LogInfo((object)string.Format("Mod hub: {0} added ({1} of Wolvyreen's mods in the hub; drawn by {2}).", name, list.Count, Get<string>(Leader(), "name") ?? "none"));
				}
			}
			catch (Exception ex)
			{
				if (log != null)
				{
					log.LogWarning((object)$"Mod hub: could not add {name}: {ex.Message}");
				}
			}
		}

		internal static void Unregister()
		{
			try
			{
				if (_mine != null)
				{
					Entries().Remove(_mine);
					_mine = null;
				}
				SetHosting(on: false);
				Notify(null);
			}
			catch (Exception ex)
			{
				if (Log != null)
				{
					Log.LogWarning((object)$"Mod hub: cleanup failed: {ex.Message}");
				}
			}
		}

		internal static Dictionary<string, object> Leader()
		{
			return (from e in Entries()
				where Get<bool>(e, "canDraw")
				orderby Get<int>(e, "hubVersion") descending
				select e).ThenBy<Dictionary<string, object>, string>((Dictionary<string, object> e) => Get<string>(e, "id"), StringComparer.Ordinal).FirstOrDefault();
		}

		internal static List<Dictionary<string, object>> Mods()
		{
			return Entries().OrderBy<Dictionary<string, object>, string>((Dictionary<string, object> e) => Get<string>(e, "name"), StringComparer.OrdinalIgnoreCase).ToList();
		}

		private static void Check()
		{
			SetHosting(_mine != null && object.ReferenceEquals(Leader(), _mine));
		}

		private static void SetHosting(bool on)
		{
			if (Hosting == on)
			{
				return;
			}
			Hosting = on;
			try
			{
				if (Host != null)
				{
					Host(on);
				}
			}
			catch (Exception ex)
			{
				if (Log != null)
				{
					Log.LogWarning((object)string.Format("Mod hub: switching the window {0} failed: {1}", (!on) ? "off" : "on", ex.Message));
				}
			}
		}

		private static void Notify(IEnumerable<Dictionary<string, object>> removed)
		{
			List<Dictionary<string, object>> list = Entries().ToList();
			if (removed != null)
			{
				list.AddRange(removed);
			}
			foreach (Dictionary<string, object> item in list)
			{
				try
				{
					Get<Action>(item, "changed")?.Invoke();
				}
				catch (Exception ex)
				{
					if (Log != null)
					{
						Log.LogWarning((object)string.Format("Mod hub: {0} could not check in: {1}", Get<string>(item, "name"), ex.Message));
					}
				}
			}
		}

		internal static T Get<T>(Dictionary<string, object> e, string key)
		{
			if (e != null && e.TryGetValue(key, out var value))
			{
				object obj = ((value is T) ? value : null);
				T result = default(T);
				if (obj != null)
				{
					result = (T)value;
				}
				if (obj != null)
				{
					return result;
				}
			}
			return default(T);
		}
	}
	internal static class Catalog
	{
		internal sealed class Mod
		{
			internal string Id;

			internal string Name;

			internal string About;

			internal string Thunderstore;

			internal string Nexus;

			internal string IconPng;
		}

		internal const string GitHub = "https://github.com/wolvyreen/Valheim";

		internal static readonly Mod[] Mods = new Mod[2]
		{
			new Mod
			{
				Id = "wolvy.valheim.crossbeams",
				Name = "Wolvy's Cross Beams",
				About = "Lets two of the same angled beam snap into an X. Vanilla refuses the second one; with this it clicks into place. Real duplicates are still blocked.",
				Thunderstore = "https://thunderstore.io/c/valheim/p/Wolvyreen/Wolvys_Cross_Beams/",
				Nexus = "https://www.nexusmods.com/valheim/mods/4876",
				IconPng = "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"
			},
			new Mod
			{
				Id = "wolvy.valheim.unreachablescrap",
				Name = "Wolvy's Unreachable Scrap",
				About = "Mine the muddy scrap stuck in Sunken Crypt walls and floors: point at it and swing. A little glint shows you where stuck scrap is, and loot that would fall out of the world lands at your feet.",
				Thunderstore = "https://thunderstore.io/c/valheim/p/Wolvyreen/Wolvys_Unreachable_Scrap/",
				Nexus = "https://www.nexusmods.com/valheim/mods/4931",
				IconPng = "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"
			}
		};
	}
	internal static class HubKit
	{
		internal static readonly Color Beige = HubWindow.Beige;

		internal static readonly Color Muted = HubWindow.Muted;

		internal static readonly Color Orange = HubWindow.Orange;

		internal static readonly Color Gold = new Color(1f, 0.85f, 0.36f, 1f);

		internal static readonly Color TileColour = new Color(0.08f, 0.07f, 0.06f, 0.95f);

		internal static readonly Color BoxColour = new Color(0f, 0f, 0f, 0.28f);

		private static bool _dropLogged;

		internal static readonly Color Highlight = new Color(1f, 0.67f, 0.24f, 0.13f);

		internal static readonly Color Line = new Color(1f, 1f, 1f, 0.06f);

		internal const float SettingWidth = 940f;

		internal const float ControlsWidth = 420f;

		internal const float ControlWidth = 260f;

		private static readonly Dictionary<string, Sprite> Shapes = new Dictionary<string, Sprite>();

		private static readonly Color[] Presets = (Color[])(object)new Color[7]
		{
			new Color(0f, 0f, 0f, 0.9f),
			new Color(0.94f, 0.88f, 0.75f, 1f),
			Color.white,
			new Color(1f, 0.78f, 0.25f, 1f),
			new Color(0.85f, 0.2f, 0.15f, 1f),
			new Color(0.35f, 0.75f, 0.35f, 1f),
			new Color(0.35f, 0.6f, 0.95f, 1f)
		};

		private static Texture2D _wheel;

		internal static bool Ready()
		{
			return HubWindow.Ready();
		}

		internal static RectTransform Column(Transform parent, float spacing = 4f, int pad = 0)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			RectTransform val = HubWindow.NewRect(parent, "Column");
			VerticalLayoutGroup val2 = ((Component)val).gameObject.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val2).childControlWidth = true;
			((HorizontalOrVerticalLayoutGroup)val2).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = true;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = false;
			((HorizontalOrVerticalLayoutGroup)val2).spacing = spacing;
			((LayoutGroup)val2).padding = new RectOffset(pad, pad, pad, pad);
			return val;
		}

		internal static RectTransform Row(Transform parent, float spacing = 8f, float height = 34f)
		{
			RectTransform val = HubWindow.NewRect(parent, "Row");
			HorizontalLayoutGroup val2 = ((Component)val).gameObject.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val2).childControlWidth = true;
			((HorizontalOrVerticalLayoutGroup)val2).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = false;
			((LayoutGroup)val2).childAlignment = (TextAnchor)3;
			((HorizontalOrVerticalLayoutGroup)val2).spacing = spacing;
			if (height > 0f)
			{
				HubWindow.Layout(((Component)val).gameObject, -1f, height);
			}
			return val;
		}

		internal static RectTransform Box(Transform parent, int indent = 20, bool fill = true)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = Column(parent, 0f);
			VerticalLayoutGroup val2 = (VerticalLayoutGroup)((Component)val).GetComponent<LayoutGroup>();
			((LayoutGroup)val2).padding = new RectOffset(indent, 0, 0, 0);
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = fill;
			RectTransform val3 = Column((Transform)(object)val, 6f, 10);
			((Graphic)((Component)val3).gameObject.AddComponent<Image>()).color = BoxColour;
			if (!fill)
			{
				((HorizontalOrVerticalLayoutGroup)(VerticalLayoutGroup)((Component)val3).GetComponent<LayoutGroup>()).childForceExpandWidth = false;
			}
			return val3;
		}

		internal static RectTransform Grid(Transform parent, float cellW, float cellH, float gap = 4f)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = HubWindow.NewRect(parent, "Grid");
			GridLayoutGroup val2 = ((Component)val).gameObject.AddComponent<GridLayoutGroup>();
			val2.cellSize = new Vector2(cellW, cellH);
			val2.spacing = new Vector2(gap, gap);
			val2.startCorner = (Corner)0;
			val2.startAxis = (Axis)0;
			((LayoutGroup)val2).childAlignment = (TextAnchor)0;
			val2.constraint = (Constraint)0;
			return val;
		}

		internal static void Space(Transform parent, float width)
		{
			HubWindow.Layout(((Component)HubWindow.NewRect(parent, "Space")).gameObject, width, 1f);
		}

		internal static void Clear(Transform t)
		{
			foreach (Transform item in ((IEnumerable)t).Cast<Transform>().ToList())
			{
				Object.DestroyImmediate((Object)(object)((Component)item).gameObject);
			}
			HubWindow.Fields.RemoveAll((TMP_InputField f) => (Object)(object)f == (Object)null);
		}

		internal static T Size<T>(T c, float width, float height = -1f, float flexible = 0f) where T : Component
		{
			LayoutElement val = HubWindow.Layout(((Component)c).gameObject, width, height);
			if (flexible > 0f)
			{
				val.flexibleWidth = flexible;
			}
			return c;
		}

		internal static TMP_Text Text(Transform parent, string text, int size = 17, Color? colour = null, bool heading = false, float width = -1f)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			TMP_Text val = HubWindow.Text(parent, text, size, (!colour.HasValue) ? Beige : colour.Value, (!heading) ? HubWindow._bodyFont : (HubWindow._headFont ?? HubWindow._bodyFont));
			if (width >= 0f)
			{
				HubWindow.Layout(((Component)val).gameObject, width, -1f);
			}
			return val;
		}

		internal static Button Button(Transform parent, string text, Action click, float width = 160f, float height = 30f, int size = 15)
		{
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Expected O, but got Unknown
			Button val = HubWindow.TextButton(parent, text, HubWindow._tabT, size);
			TMP_Text[] componentsInChildren = ((Component)val).GetComponentsInChildren<TMP_Text>(true);
			foreach (TMP_Text val2 in componentsInChildren)
			{
				val2.textWrappingMode = (TextWrappingModes)0;
				val2.overflowMode = (TextOverflowModes)1;
				val2.enableAutoSizing = true;
				val2.fontSizeMax = size;
				val2.fontSizeMin = Math.Min(size, 11);
				val2.margin = new Vector4(6f, 0f, 6f, 0f);
			}
			HubWindow.Layout(((Component)val).gameObject, width, height);
			if (click != null)
			{
				((UnityEvent)val.onClick).AddListener((UnityAction)delegate
				{
					HubWindow.Safe(click);
				});
			}
			return val;
		}

		internal static void SetText(Button b, string text)
		{
			TMP_Text val = ((!((Object)(object)b != (Object)null)) ? null : ((Component)b).GetComponentInChildren<TMP_Text>(true));
			if ((Object)(object)val != (Object)null)
			{
				val.text = text;
			}
		}

		internal static Toggle Toggle(Transform parent, bool on, Action<bool> changed)
		{
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Expected O, but got Unknown
			if ((Object)(object)HubWindow._toggleT == (Object)null)
			{
				Button b = null;
				b = Button(parent, (!on) ? "Off" : "On", delegate
				{
					on = !on;
					SetText(b, (!on) ? "Off" : "On");
					changed(on);
				}, 70f);
				return null;
			}
			Toggle val = HubWindow.Copy<Toggle>(HubWindow._toggleT, parent);
			TMP_Text[] componentsInChildren = ((Component)val).GetComponentsInChildren<TMP_Text>(true);
			foreach (TMP_Text val2 in componentsInChildren)
			{
				((Component)val2).gameObject.SetActive(false);
			}
			Graphic[] componentsInChildren2 = ((Component)val).GetComponentsInChildren<Graphic>(true);
			foreach (Graphic val3 in componentsInChildren2)
			{
				val3.raycastTarget = false;
			}
			Graphic val4 = ((Component)val).GetComponent<Graphic>();
			if ((Object)(object)val4 == (Object)null)
			{
				Image val5 = ((Component)val).gameObject.AddComponent<Image>();
				((Graphic)val5).color = new Color(0f, 0f, 0f, 0f);
				val4 = (Graphic)(object)val5;
			}
			val4.raycastTarget = true;
			foreach (RectTransform item in ((IEnumerable)((Component)val).transform).Cast<Transform>().OfType<RectTransform>())
			{
				if (item.anchorMin != item.anchorMax)
				{
					Vector2 anchorMin = (item.anchorMax = new Vector2(0.5f, 0.5f));
					item.anchorMin = anchorMin;
					item.anchoredPosition = Vector2.zero;
					Rect rect = item.rect;
					float num3 = Mathf.Min(((Rect)(ref rect)).width, 24f);
					Rect rect2 = item.rect;
					item.sizeDelta = new Vector2(num3, Mathf.Min(((Rect)(ref rect2)).height, 24f));
				}
			}
			val.onValueChanged = new ToggleEvent();
			val.group = null;
			val.isOn = on;
			((UnityEvent<bool>)(object)val.onValueChanged).AddListener((UnityAction<bool>)delegate(bool v)
			{
				HubWindow.Safe(delegate
				{
					changed(v);
				});
			});
			HubWindow.Layout(((Component)val).gameObject, 40f, 30f);
			return val;
		}

		internal static Slider Slider(Transform parent, float min, float max, bool whole, float value, Action<float> changed, float width = 220f, Func<float, string> show = null)
		{
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			show = show ?? ((Func<float, string>)((float v) => (!whole) ? v.ToString("0.##", CultureInfo.InvariantCulture) : Mathf.RoundToInt(v).ToString(CultureInfo.InvariantCulture)));
			if ((Object)(object)HubWindow._sliderT == (Object)null)
			{
				return null;
			}
			Slider val = HubWindow.Copy<Slider>(HubWindow._sliderT, parent);
			TMP_Text[] componentsInChildren = ((Component)val).GetComponentsInChildren<TMP_Text>(true);
			foreach (TMP_Text val2 in componentsInChildren)
			{
				val2.text = string.Empty;
			}
			OnlyBarTakesClicks(val);
			val.onValueChanged = new SliderEvent();
			val.minValue = min;
			val.maxValue = max;
			val.wholeNumbers = whole;
			val.value = value;
			HubWindow.Layout(((Component)val).gameObject, width, 24f);
			TMP_Text text = Text(parent, show(value), 16, Beige, heading: false, 60f);
			((UnityEvent<float>)(object)val.onValueChanged).AddListener((UnityAction<float>)delegate(float v)
			{
				text.text = show(v);
				HubWindow.Safe(delegate
				{
					changed(v);
				});
			});
			return val;
		}

		internal static void OnlyBarTakesClicks(Slider s)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			Graphic[] componentsInChildren = ((Component)s).GetComponentsInChildren<Graphic>(true);
			foreach (Graphic val in componentsInChildren)
			{
				val.raycastTarget = false;
			}
			Graphic val2 = ((Component)s).GetComponent<Graphic>();
			if ((Object)(object)val2 == (Object)null)
			{
				Image val3 = ((Component)s).gameObject.AddComponent<Image>();
				((Graphic)val3).color = new Color(0f, 0f, 0f, 0f);
				val2 = (Graphic)(object)val3;
			}
			val2.raycastTarget = true;
		}

		internal static TMP_Dropdown Dropdown(Transform parent, List<string> options, int index, Action<int> changed, float width = 260f)
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			if ((Object)(object)HubWindow._dropT == (Object)null)
			{
				Button b = null;
				b = Button(parent, options[Math.Max(0, index)], delegate
				{
					index = (index + 1) % options.Count;
					SetText(b, options[index]);
					changed(index);
				}, width);
				return null;
			}
			TMP_Dropdown val = CleanDropdown(HubWindow.Copy<TMP_Dropdown>(HubWindow._dropT, parent));
			val.onValueChanged = new DropdownEvent();
			val.ClearOptions();
			val.AddOptions(options);
			val.SetValueWithoutNotify(Math.Max(0, index));
			val.RefreshShownValue();
			((UnityEvent<int>)(object)val.onValueChanged).AddListener((UnityAction<int>)delegate(int i)
			{
				HubWindow.Safe(delegate
				{
					changed(i);
				});
			});
			HubWindow.Layout(((Component)val).gameObject, width, 30f);
			return val;
		}

		internal static TMP_Dropdown CleanDropdown(TMP_Dropdown d)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			TMP_Text[] componentsInChildren = ((Component)d).GetComponentsInChildren<TMP_Text>(true);
			foreach (TMP_Text val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)(object)d.captionText || (Object)(object)val == (Object)(object)d.itemText)
				{
					if (!_dropLogged)
					{
						_dropLogged = true;
						if (Hub.Log != null)
						{
							ManualLogSource log = Hub.Log;
							string name = ((Object)val).name;
							Rect rect = val.rectTransform.rect;
							string text = $"Mod hub drop-down text: '{name}' box {((Rect)(ref rect)).size}, autosize {val.enableAutoSizing} ";
							object[] obj = new object[4] { val.fontSizeMin, val.fontSizeMax, val.overflowMode, null };
							Transform parent = val.transform.parent;
							obj[3] = ((parent != null) ? ((Object)parent).name : null);
							log.LogInfo((object)(text + string.Format("({0}-{1}), overflow {2}, parent '{3}'.", obj)));
						}
					}
					val.enableAutoSizing = false;
					val.fontSize = 16f;
					val.textWrappingMode = (TextWrappingModes)0;
					val.overflowMode = (TextOverflowModes)0;
					val.alignment = (TextAlignmentOptions)((!((Object)(object)val == (Object)(object)d.captionText)) ? 513 : 514);
					if ((Object)(object)val == (Object)(object)d.captionText)
					{
						RectTransform rectTransform = val.rectTransform;
						((Transform)rectTransform).SetParent(((Component)d).transform, false);
						rectTransform.anchorMin = Vector2.zero;
						rectTransform.anchorMax = Vector2.one;
						rectTransform.offsetMin = new Vector2(10f, 0f);
						rectTransform.offsetMax = new Vector2(-10f, 0f);
					}
				}
				else if ((Object)(object)d.template == (Object)null || !val.transform.IsChildOf((Transform)(object)d.template))
				{
					((Component)val).gameObject.SetActive(false);
				}
			}
			return d;
		}

		internal static TMP_InputField Input(Transform parent, string text, Action<string> changed, Action<string> done = null, float width = 260f, string placeholder = "")
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			if ((Object)(object)HubWindow._inputT == (Object)null)
			{
				return null;
			}
			TMP_InputField val = HubWindow.Copy<TMP_InputField>(HubWindow._inputT, parent);
			val.onValueChanged = new OnChangeEvent();
			val.onEndEdit = new SubmitEvent();
			val.onSubmit = new SubmitEvent();
			val.onSelect = new SelectionEvent();
			val.onDeselect = new SelectionEvent();
			val.characterLimit = 0;
			val.contentType = (ContentType)0;
			val.lineType = (LineType)0;
			Graphic placeholder2 = val.placeholder;
			object obj = ((placeholder2 is TMP_Text) ? placeholder2 : null);
			TMP_Text val2 = default(TMP_Text);
			if (obj != null)
			{
				val2 = (TMP_Text)obj;
				obj = val2;
			}
			if (obj != null)
			{
				val2.text = placeholder;
			}
			val.SetTextWithoutNotify(text ?? string.Empty);
			if (changed != null)
			{
				((UnityEvent<string>)(object)val.onValueChanged).AddListener((UnityAction<string>)delegate(string v)
				{
					HubWindow.Safe(delegate
					{
						changed(v);
					});
				});
			}
			if (done != null)
			{
				((UnityEvent<string>)(object)val.onEndEdit).AddListener((UnityAction<string>)delegate(string v)
				{
					HubWindow.Safe(delegate
					{
						done(v);
					});
				});
			}
			HubWindow.Fields.Add(val);
			HubWindow.Layout(((Component)val).gameObject, width, 30f);
			return val;
		}

		internal static Button Tile(Transform parent, Sprite sprite, bool chosen, Action click, float size = 40f, string tip = null)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Expected O, but got Unknown
			RectTransform val = HubWindow.NewRect(parent, "Tile");
			HubWindow.Layout(((Component)val).gameObject, size, size);
			Image val2 = ((Component)val).gameObject.AddComponent<Image>();
			((Graphic)val2).color = ((!chosen) ? TileColour : Gold);
			Button val3 = ((Component)val).gameObject.AddComponent<Button>();
			((Selectable)val3).targetGraphic = (Graphic)(object)val2;
			RectTransform val4 = HubWindow.NewRect((Transform)(object)val, "Back");
			HubWindow.Stretch(val4, 2f, 2f, 2f, 2f);
			((Graphic)((Component)val4).gameObject.AddComponent<Image>()).color = TileColour;
			((Graphic)((Component)val4).GetComponent<Image>()).raycastTarget = false;
			if ((Object)(object)sprite != (Object)null)
			{
				RectTransform val5 = HubWindow.NewRect((Transform)(object)val, "Picture");
				HubWindow.Stretch(val5, 4f, 4f, 4f, 4f);
				Image val6 = ((Component)val5).gameObject.AddComponent<Image>();
				val6.sprite = sprite;
				val6.preserveAspect = true;
				((Graphic)val6).raycastTarget = false;
			}
			if (click != null)
			{
				((UnityEvent)val3.onClick).AddListener((UnityAction)delegate
				{
					HubWindow.Safe(click);
				});
			}
			if (!string.IsNullOrEmpty(tip))
			{
				HubWindow.SetTooltip(((Component)val).gameObject, tip, string.Empty);
			}
			return val3;
		}

		internal static Image Swatch(Transform parent, Color c, float w = 30f, float h = 24f)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = HubWindow.NewRect(parent, "Swatch");
			Image val2 = ((Component)val).gameObject.AddComponent<Image>();
			((Graphic)val2).color = new Color(c.r, c.g, c.b, 1f);
			HubWindow.Layout(((Component)val).gameObject, w, h);
			return val2;
		}

		internal static void Tooltip(GameObject go, string topic, string text)
		{
			HubWindow.SetTooltip(go, topic, text);
		}

		internal static GameObject Switch(Transform parent, bool on, Action<bool> changed)
		{
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Expected O, but got Unknown
			RectTransform val = HubWindow.NewRect(parent, "Switch");
			HubWindow.Layout(((Component)val).gameObject, 50f, 26f);
			Image back = ((Component)val).gameObject.AddComponent<Image>();
			back.sprite = Shape("pill", 50, 26, PillAlpha);
			RectTransform knob = HubWindow.NewRect((Transform)(object)val, "Knob");
			RectTransform obj = knob;
			Vector2 val2 = new Vector2(0f, 0.5f);
			knob.anchorMax = val2;
			obj.anchorMin = val2;
			knob.sizeDelta = new Vector2(20f, 20f);
			Image k = ((Component)knob).gameObject.AddComponent<Image>();
			k.sprite = Shape("dot", 20, 20, (float x, float y) => Disc(x, y, 0.5f, 0.5f, 0.48f));
			((Graphic)k).raycastTarget = false;
			Button val3 = ((Component)val).gameObject.AddComponent<Button>();
			((Selectable)val3).targetGraphic = (Graphic)(object)back;
			Action show = delegate
			{
				//IL_0043: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_0090: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				((Graphic)back).color = ((!on) ? new Color(0.24f, 0.2f, 0.17f, 1f) : new Color(0.62f, 0.38f, 0.1f, 1f));
				((Graphic)k).color = ((!on) ? new Color(0.6f, 0.54f, 0.44f, 1f) : new Color(1f, 0.81f, 0.5f, 1f));
				knob.anchoredPosition = new Vector2((!on) ? 12f : 38f, 0f);
			};
			show();
			((UnityEvent)val3.onClick).AddListener((UnityAction)delegate
			{
				on = !on;
				show();
				HubWindow.Safe(delegate
				{
					changed(on);
				});
			});
			return ((Component)val).gameObject;
		}

		internal static RectTransform Choices(Transform parent, List<string> options, int index, Action<int> changed, float width = 78f)
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			RectTransform val = Row(parent, 4f, 32f);
			List<Button> buttons = new List<Button>();
			for (int i = 0; i < options.Count; i++)
			{
				int at = i;
				Button val2 = Button((Transform)(object)val, options[i], null, width, 30f, 14);
				((UnityEvent)val2.onClick).AddListener((UnityAction)delegate
				{
					for (int j = 0; j < buttons.Count; j++)
					{
						((Selectable)buttons[j]).interactable = j != at;
					}
					HubWindow.Safe(delegate
					{
						changed(at);
					});
				});
				buttons.Add(val2);
			}
			for (int num = 0; num < buttons.Count; num++)
			{
				((Selectable)buttons[num]).interactable = num != index;
			}
			return val;
		}

		internal static Button SideItem(Transform parent, string text, bool chosen, Action click)
		{
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Expected O, but got Unknown
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Expected O, but got Unknown
			RectTransform val = HubWindow.NewRect(parent, "Section");
			HubWindow.Layout(((Component)val).gameObject, -1f, 40f);
			Image val2 = ((Component)val).gameObject.AddComponent<Image>();
			((Graphic)val2).color = (Color)((!chosen) ? new Color(0f, 0f, 0f, 0f) : Highlight);
			Button val3 = ((Component)val).gameObject.AddComponent<Button>();
			((Selectable)val3).targetGraphic = (Graphic)(object)val2;
			ColorBlock colors = ((Selectable)val3).colors;
			((ColorBlock)(ref colors)).highlightedColor = new Color(1.6f, 1.6f, 1.6f, 1f);
			((Selectable)val3).colors = colors;
			if (chosen)
			{
				RectTransform val4 = HubWindow.NewRect((Transform)(object)val, "Bar");
				val4.anchorMin = new Vector2(0f, 0f);
				val4.anchorMax = new Vector2(0f, 1f);
				val4.pivot = new Vector2(0f, 0.5f);
				val4.sizeDelta = new Vector2(3f, 0f);
				val4.anchoredPosition = Vector2.zero;
				Image val5 = ((Component)val4).gameObject.AddComponent<Image>();
				((Graphic)val5).color = Orange;
				((Graphic)val5).raycastTarget = false;
			}
			TMP_Text val6 = HubWindow.Text((Transform)(object)val, text, 17, (!chosen) ? new Color(0.8f, 0.73f, 0.6f, 1f) : new Color(1f, 0.81f, 0.5f, 1f), HubWindow._bodyFont);
			HubWindow.Stretch((RectTransform)val6.transform, 18f, 0f, 8f, 0f);
			val6.textWrappingMode = (TextWrappingModes)0;
			val6.overflowMode = (TextOverflowModes)1;
			Object.DestroyImmediate((Object)(object)((Component)val6).GetComponent<LayoutElement>());
			if (click != null)
			{
				((UnityEvent)val3.onClick).AddListener((UnityAction)delegate
				{
					HubWindow.Safe(click);
				});
			}
			return val3;
		}

		internal static RectTransform SettingRow(Transform parent, string name, string description)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = Row(parent, 12f, -1f);
			LayoutElement val2 = HubWindow.Layout(((Component)val).gameObject, 940f, 54f);
			val2.flexibleWidth = 1f;
			val2.preferredHeight = -1f;
			((LayoutGroup)((Component)val).GetComponent<HorizontalLayoutGroup>()).padding = new RectOffset(12, 8, 6, 9);
			RectTransform val3 = Column((Transform)(object)val, 2f);
			HubKit.Size<RectTransform>(val3, 300f, -1f, 1f);
			TMP_Text val4 = Text((Transform)(object)val3, name);
			val4.textWrappingMode = (TextWrappingModes)0;
			val4.overflowMode = (TextOverflowModes)1;
			string text = FirstSentence(description);
			if (!string.IsNullOrEmpty(text))
			{
				TMP_Text val5 = Text((Transform)(object)val3, text, 13, Muted);
				val5.textWrappingMode = (TextWrappingModes)1;
			}
			if (!string.IsNullOrEmpty(description))
			{
				((Graphic)val4).raycastTarget = true;
				Tooltip(((Component)val4).gameObject, name, description);
			}
			RectTransform val6 = Row((Transform)(object)val, 8f, -1f);
			((LayoutGroup)((Component)val6).GetComponent<HorizontalLayoutGroup>()).childAlignment = (TextAnchor)5;
			HubWindow.Layout(((Component)val6).gameObject, 420f, 40f);
			RectTransform val7 = HubWindow.NewRect(parent, "Line");
			HubWindow.Layout(((Component)val7).gameObject, 940f, 1f).flexibleWidth = 1f;
			((Graphic)((Component)val7).gameObject.AddComponent<Image>()).color = Line;
			return val6;
		}

		private static string FirstSentence(string text)
		{
			if (string.IsNullOrEmpty(text))
			{
				return text;
			}
			int num = text.IndexOf(". ", StringComparison.Ordinal);
			string text2 = ((num <= 0) ? text : text.Substring(0, num + 1));
			return (text2.Length <= 110) ? text2 : (text2.Substring(0, 107) + "...");
		}

		internal static Button IconButton(Transform parent, Sprite sprite, Action click, float size = 22f, Color? colour = null)
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Expected O, but got Unknown
			RectTransform val = HubWindow.NewRect(parent, "Icon");
			HubWindow.Layout(((Component)val).gameObject, size + 6f, size + 6f);
			Image val2 = ((Component)val).gameObject.AddComponent<Image>();
			((Graphic)val2).color = new Color(0f, 0f, 0f, 0f);
			RectTransform val3 = HubWindow.NewRect((Transform)(object)val, "Picture");
			HubWindow.Stretch(val3, 3f, 3f, 3f, 3f);
			Image val4 = ((Component)val3).gameObject.AddComponent<Image>();
			val4.sprite = sprite;
			((Graphic)val4).color = (Color)((!colour.HasValue) ? new Color(0.8f, 0.7f, 0.5f, 1f) : colour.Value);
			Button val5 = ((Component)val).gameObject.AddComponent<Button>();
			((Selectable)val5).targetGraphic = (Graphic)(object)val4;
			ColorBlock colors = ((Selectable)val5).colors;
			((ColorBlock)(ref colors)).highlightedColor = new Color(1.3f, 1.2f, 1f, 1f);
			((Selectable)val5).colors = colors;
			if (click != null)
			{
				((UnityEvent)val5.onClick).AddListener((UnityAction)delegate
				{
					HubWindow.Safe(click);
				});
			}
			return val5;
		}

		internal static Sprite Shape(string key, int w, int h, Func<float, float, float> alpha)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			if (Shapes.TryGetValue(key, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			int num = w * 2;
			int num2 = h * 2;
			Texture2D val = new Texture2D(num, num2, (TextureFormat)4, false);
			((Object)val).hideFlags = (HideFlags)61;
			((Texture)val).wrapMode = (TextureWrapMode)1;
			Texture2D val2 = val;
			Color[] array = (Color[])(object)new Color[num * num2];
			for (int i = 0; i < num2; i++)
			{
				for (int j = 0; j < num; j++)
				{
					float num3 = 0f;
					for (int k = 0; k < 2; k++)
					{
						for (int l = 0; l < 2; l++)
						{
							num3 += Mathf.Clamp01(alpha(((float)j + 0.25f + (float)l * 0.5f) / (float)num, ((float)i + 0.25f + (float)k * 0.5f) / (float)num2));
						}
					}
					ref Color reference = ref array[i * num + j];
					reference = new Color(1f, 1f, 1f, num3 / 4f);
				}
			}
			val2.SetPixels(array);
			val2.Apply();
			value = Sprite.Create(val2, new Rect(0f, 0f, (float)num, (float)num2), new Vector2(0.5f, 0.5f), 200f);
			Shapes[key] = value;
			return value;
		}

		internal static float Disc(float x, float y, float cx, float cy, float r)
		{
			return (!((x - cx) * (x - cx) + (y - cy) * (y - cy) <= r * r)) ? 0f : 1f;
		}

		private static float PillAlpha(float x, float y)
		{
			float num = x * 50f;
			float num2 = y * 26f;
			float num3 = 12.5f;
			float num4 = Mathf.Clamp(num, 13f, 37f);
			return (!((num - num4) * (num - num4) + (num2 - 13f) * (num2 - 13f) <= num3 * num3)) ? 0f : 1f;
		}

		internal static Sprite ResetIcon()
		{
			return Shape("reset", 24, 24, delegate(float x, float y)
			{
				float num = x - 0.5f;
				float num2 = y - 0.5f;
				float num3 = Mathf.Sqrt(num * num + num2 * num2);
				float num4 = Mathf.Atan2(num2, num) * 57.29578f;
				bool flag = num3 > 0.27f && num3 < 0.4f && (!(num4 > 45f) || !(num4 < 105f));
				float num5 = Mathf.Cos((float)Math.PI / 4f);
				float num6 = Mathf.Sin((float)Math.PI / 4f);
				float num7 = Mathf.Cos(1.3962634f);
				float num8 = Mathf.Sin(1.3962634f);
				bool flag2 = InTriangle(x, y, 0.5f + num5 * 0.19f, 0.5f + num6 * 0.19f, 0.5f + num5 * 0.48f, 0.5f + num6 * 0.48f, 0.5f + num7 * 0.335f, 0.5f + num8 * 0.335f);
				return (!flag && !flag2) ? 0f : 1f;
			});
		}

		private static bool InTriangle(float px, float py, float ax, float ay, float bx, float by, float cx, float cy)
		{
			float num = (px - bx) * (ay - by) - (ax - bx) * (py - by);
			float num2 = (px - cx) * (by - cy) - (bx - cx) * (py - cy);
			float num3 = (px - ax) * (cy - ay) - (cx - ax) * (py - ay);
			bool flag = num < 0f || num2 < 0f || num3 < 0f;
			bool flag2 = num > 0f || num2 > 0f || num3 > 0f;
			return !flag || !flag2;
		}

		internal static Sprite BellIcon()
		{
			return Shape("bell", 24, 24, delegate(float x, float y)
			{
				float num = 1f - y;
				float num2 = 0f;
				if (num > 0.16f && num < 0.74f)
				{
					num2 = 0.13f + 0.22f * ((num - 0.16f) / 0.58f) * ((num - 0.16f) / 0.58f) + 0.08f;
				}
				else if (num >= 0.74f && num < 0.82f)
				{
					num2 = 0.42f;
				}
				bool flag = Mathf.Abs(x - 0.5f) < num2;
				bool flag2 = Disc(x, y, 0.5f, 0.89f, 0.07f) > 0f;
				bool flag3 = Disc(x, y, 0.5f, 0.1f, 0.08f) > 0f;
				return (!flag && !flag2 && !flag3) ? 0f : 1f;
			});
		}

		internal static GameObject ColourControl(RectTransform row, Transform below, Color colour, Action<Color> changed)
		{
			//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_004a: Unknown result type (might be due to invalid IL or missing references)
			RectTransform box = null;
			Button sw = null;
			Action<Color> set = delegate(Color c)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				colour = c;
				((Selectable)sw).targetGraphic.color = new Color(c.r, c.g, c.b, 1f);
				changed(c);
			};
			sw = SwatchButton((Transform)(object)row, colour, delegate
			{
				//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)box != (Object)null)
				{
					Object.DestroyImmediate((Object)(object)((Component)((Transform)box).parent).gameObject);
					box = null;
				}
				else
				{
					box = Box(below, 40, fill: false);
					Transform val = (Transform)(object)row;
					while ((Object)(object)val.parent != (Object)null && (Object)(object)val.parent != (Object)(object)below)
					{
						val = val.parent;
					}
					int num = val.GetSiblingIndex() + 1;
					if (num < below.childCount && ((Object)below.GetChild(num)).name == "Line")
					{
						num++;
					}
					((Transform)box).parent.SetSiblingIndex(num);
					ColourPicker((Transform)(object)box, colour, set);
				}
			});
			Tooltip(((Component)sw).gameObject, "Colour", "Click to pick a colour.");
			return ((Component)sw).gameObject;
		}

		internal static Button SwatchButton(Transform parent, Color c, Action click, float w = 64f, float h = 26f)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			RectTransform val = HubWindow.NewRect(parent, "Swatch");
			HubWindow.Layout(((Component)val).gameObject, w, h);
			((Graphic)((Component)val).gameObject.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.85f);
			RectTransform val2 = HubWindow.NewRect((Transform)(object)val, "Colour");
			HubWindow.Stretch(val2, 2f, 2f, 2f, 2f);
			Image val3 = ((Component)val2).gameObject.AddComponent<Image>();
			((Graphic)val3).color = new Color(c.r, c.g, c.b, 1f);
			Button val4 = ((Component)val).gameObject.AddComponent<Button>();
			((Selectable)val4).targetGraphic = (Graphic)(object)val3;
			ColorBlock colors = ((Selectable)val4).colors;
			((ColorBlock)(ref colors)).highlightedColor = new Color(0.85f, 0.85f, 0.85f, 1f);
			((ColorBlock)(ref colors)).pressedColor = new Color(0.7f, 0.7f, 0.7f, 1f);
			((Selectable)val4).colors = colors;
			if (click != null)
			{
				((UnityEvent)val4.onClick).AddListener((UnityAction)delegate
				{
					HubWindow.Safe(click);
				});
			}
			return val4;
		}

		internal static void ColourPicker(Transform parent, Color colour, Action<Color> picked)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Expected O, but got Unknown
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0363: Unknown result type (might be due to invalid IL or missing references)
			//IL_0368: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03df: Unknown result type (might be due to invalid IL or missing references)
			//IL_0416: Unknown result type (might be due to invalid IL or missing references)
			//IL_0436: Unknown result type (might be due to invalid IL or missing references)
			float h = default(float);
			float s = default(float);
			float v = default(float);
			Color.RGBToHSV(colour, ref h, ref s, ref v);
			float a = colour.a;
			RectTransform parent2 = Row(parent, 16f, 150f);
			RectTransform wheelRt = HubWindow.NewRect((Transform)(object)parent2, "Wheel");
			HubWindow.Layout(((Component)wheelRt).gameObject, 140f, 140f);
			RawImage val = ((Component)wheelRt).gameObject.AddComponent<RawImage>();
			val.texture = (Texture)(object)Wheel();
			RectTransform marker = HubWindow.NewRect((Transform)(object)wheelRt, "Marker");
			marker.sizeDelta = new Vector2(10f, 10f);
			((Graphic)((Component)marker).gameObject.AddComponent<Image>()).color = Color.black;
			((Graphic)((Component)marker).GetComponent<Image>()).raycastTarget = false;
			RectTransform val2 = HubWindow.NewRect((Transform)(object)marker, "Dot");
			HubWindow.Stretch(val2, 2f, 2f, 2f, 2f);
			((Graphic)((Component)val2).gameObject.AddComponent<Image>()).raycastTarget = false;
			RectTransform val3 = Column((Transform)(object)parent2, 6f);
			((HorizontalOrVerticalLayoutGroup)(VerticalLayoutGroup)((Component)val3).GetComponent<LayoutGroup>()).childForceExpandWidth = false;
			HubWindow.Layout(((Component)val3).gameObject, 300f, -1f);
			Image preview = Swatch((Transform)(object)val3, colour, 90f);
			Slider bright = null;
			Slider opacity = null;
			Action place = delegate
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: Unknown result type (might be due to invalid IL or missing references)
				float num3 = h * 2f * (float)Math.PI;
				RectTransform obj = marker;
				Vector2 val9 = new Vector2(0.5f, 0.5f);
				marker.anchorMax = val9;
				obj.anchorMin = val9;
				marker.anchoredPosition = new Vector2(Mathf.Cos(num3), Mathf.Sin(num3)) * s * 70f;
			};
			Action send = delegate
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0075: Unknown result type (might be due to invalid IL or missing references)
				Color val9 = Color.HSVToRGB(h, s, v);
				Color obj = default(Color);
				((Color)(ref obj))..ctor(val9.r, val9.g, val9.b, a);
				((Graphic)preview).color = new Color(obj.r, obj.g, obj.b, 1f);
				place();
				picked(obj);
			};
			place();
			Action<BaseEventData> onWheel = delegate(BaseEventData ev)
			{
				//IL_0015: 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)
				//IL_0041: Unknown result type (might be due to invalid IL or missing references)
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0059: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				PointerEventData val9 = (PointerEventData)(object)((ev is PointerEventData) ? ev : null);
				Vector2 val10 = default(Vector2);
				if (val9 != null && RectTransformUtility.ScreenPointToLocalPointInRectangle(wheelRt, val9.position, val9.pressEventCamera ?? val9.enterEventCamera, ref val10))
				{
					Vector2 val11 = val10;
					Rect rect = wheelRt.rect;
					Vector2 val12 = val11 - ((Rect)(ref rect)).center;
					Rect rect2 = wheelRt.rect;
					Vector2 val13 = val12 / (((Rect)(ref rect2)).width / 2f);
					if (!(((Vector2)(ref val13)).magnitude > 1.05f))
					{
						h = Mathf.Repeat(Mathf.Atan2(val13.y, val13.x) / ((float)Math.PI * 2f), 1f);
						s = Mathf.Clamp01(((Vector2)(ref val13)).magnitude);
						if (v < 0.05f)
						{
							v = 1f;
							Slider obj = bright;
							if (obj != null)
							{
								obj.SetValueWithoutNotify(v);
							}
						}
						HubWindow.Safe(send);
					}
				}
			};
			EventTrigger val4 = ((Component)wheelRt).gameObject.AddComponent<EventTrigger>();
			EventTriggerType[] array = (EventTriggerType[])(object)new EventTriggerType[2]
			{
				(EventTriggerType)2,
				(EventTriggerType)5
			};
			foreach (EventTriggerType eventID in array)
			{
				Entry val5 = new Entry();
				val5.eventID = eventID;
				Entry val6 = val5;
				((UnityEvent<BaseEventData>)(object)val6.callback).AddListener((UnityAction<BaseEventData>)delegate(BaseEventData ev)
				{
					onWheel(ev);
				});
				val4.triggers.Add(val6);
			}
			RectTransform parent3 = Row((Transform)(object)val3, 8f, 26f);
			Text((Transform)(object)parent3, "Brightness", 15, Muted, heading: false, 90f);
			bright = Slider((Transform)(object)parent3, 0f, 1f, whole: false, v, delegate(float x)
			{
				v = x;
				send();
			}, 150f, (float x) => Mathf.RoundToInt(x * 100f) + "%");
			RectTransform parent4 = Row((Transform)(object)val3, 8f, 26f);
			Text((Transform)(object)parent4, "Opacity", 15, Muted, heading: false, 90f);
			opacity = Slider((Transform)(object)parent4, 0f, 1f, whole: false, a, delegate(float x)
			{
				a = x;
				send();
			}, 150f, (float x) => Mathf.RoundToInt(x * 100f) + "%");
			RectTransform parent5 = Row((Transform)(object)val3, 4f, 26f);
			Color[] presets = Presets;
			foreach (Color val7 in presets)
			{
				Color preset = val7;
				Button val8 = Tile((Transform)(object)parent5, null, chosen: false, delegate
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					Color.RGBToHSV(preset, ref h, ref s, ref v);
					a = preset.a;
					Slider obj = bright;
					if (obj != null)
					{
						obj.SetValueWithoutNotify(v);
					}
					Slider obj2 = opacity;
					if (obj2 != null)
					{
						obj2.SetValueWithoutNotify(a);
					}
					send();
				}, 24f);
				((Graphic)((Component)((Component)val8).transform.Find("Back")).GetComponent<Image>()).color = new Color(preset.r, preset.g, preset.b, 1f);
			}
			RectTransform parent6 = Row((Transform)(object)val3, 8f, 32f);
			Text((Transform)(object)parent6, "Code", 15, Muted, heading: false, 90f);
			TMP_InputField code = null;
			code = Input((Transform)(object)parent6, ColorUtility.ToHtmlStringRGBA(colour), null, delegate(string text)
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				Color val9 = default(Color);
				if (ColorUtility.TryParseHtmlString("#" + text.Trim().TrimStart('#'), ref val9))
				{
					Color.RGBToHSV(val9, ref h, ref s, ref v);
					a = val9.a;
					Slider obj = bright;
					if (obj != null)
					{
						obj.SetValueWithoutNotify(v);
					}
					Slider obj2 = opacity;
					if (obj2 != null)
					{
						obj2.SetValueWithoutNotify(a);
					}
					send();
				}
			}, 130f, string.Empty);
			Action baseSend = send;
			send = delegate
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				baseSend();
				Color val9 = Color.HSVToRGB(h, s, v);
				TMP_InputField obj = code;
				if (obj != null)
				{
					obj.SetTextWithoutNotify(ColorUtility.ToHtmlStringRGBA(new Color(val9.r, val9.g, val9.b, a)));
				}
			};
		}

		private static Texture2D Wheel()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_wheel != (Object)null)
			{
				return _wheel;
			}
			Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false);
			((Object)val).hideFlags = (HideFlags)61;
			((Texture)val).wrapMode = (TextureWrapMode)1;
			_wheel = val;
			Color[] array = (Color[])(object)new Color[16384];
			float num = 63.5f;
			for (int i = 0; i < 128; i++)
			{
				for (int j = 0; j < 128; j++)
				{
					float num2 = ((float)j - num) / num;
					float num3 = ((float)i - num) / num;
					float num4 = Mathf.Sqrt(num2 * num2 + num3 * num3);
					float num5 = Mathf.Repeat(Mathf.Atan2(num3, num2) / ((float)Math.PI * 2f), 1f);
					Color val2 = Color.HSVToRGB(num5, Mathf.Clamp01(num4), 1f);
					val2.a = Mathf.Clamp01((1f - num4) * num + 0.5f);
					array[i * 128 + j] = val2;
				}
			}
			_wheel.SetPixels(array);
			_wheel.Apply();
			return _wheel;
		}
	}
	internal static class HubWindow
	{
		private sealed class Mover : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IEventSystemHandler
		{
			public void OnBeginDrag(PointerEventData e)
			{
			}

			public void OnDrag(PointerEventData e)
			{
				Safe(delegate
				{
					MoveBy(e);
				});
			}

			public void OnEndDrag(PointerEventData e)
			{
				Safe(SavePlace);
			}
		}

		private sealed class Grip : MonoBehaviour, IInitializePotentialDragHandler, IDragHandler, IEndDragHandler, IEventSystemHandler
		{
			public void OnInitializePotentialDrag(PointerEventData e)
			{
				e.useDragThreshold = false;
			}

			public void OnDrag(PointerEventData e)
			{
				Safe(delegate
				{
					DragBy(e);
				});
			}

			public void OnEndDrag(PointerEventData e)
			{
				Safe(delegate
				{
					SaveSize();
					SavePlace();
				});
			}
		}

		private sealed class Shown
		{
			public ConfigEntryBase Entry;

			public int Index;

			public int Order;

			public bool Browsable = true;

			public bool ReadOnly;

			public bool HideDefault;

			public bool HideName;

			public bool Custom;

			public string Name;
		}

		private const string Title = "Wolvy's Mods";

		internal static readonly Color Beige = new Color(0.94f, 0.88f, 0.75f, 1f);

		internal static readonly Color Muted = new Color(0.72f, 0.67f, 0.58f, 1f);

		internal static readonly Color Orange = new Color(1f, 0.63f, 0.24f, 1f);

		private static bool _installed;

		private static FieldInfo _guiInstance;

		private static FieldInfo _trophiesPanel;

		private static FieldInfo _infoPanel;

		private static FieldInfo _tabCraft;

		private static FieldInfo _menuInstance;

		private static FieldInfo _settingsPrefab;

		private static Type _tooltipType;

		private static FieldInfo _tipPrefab;

		private static FieldInfo _tipTopic;

		private static FieldInfo _tipText;

		private static GameObject _button;

		private static GameObject _panel;

		private static GameObject _holder;

		private static RectTransform _content;

		private static RectTransform _tabs;

		private static RectTransform _side;

		private static readonly Dictionary<string, string> Sections = new Dictionary<string, string>();

		private static readonly Dictionary<ConfigEntryBase, GameObject> Resets = new Dictionary<ConfigEntryBase, GameObject>();

		private static readonly HashSet<ConfigFile> Watched = new HashSet<ConfigFile>();

		private static string _tab;

		private static readonly List<KeyValuePair<RectTransform, Vector2>> Moved = new List<KeyValuePair<RectTransform, Vector2>>();

		internal static readonly List<TMP_InputField> Fields = new List<TMP_InputField>();

		private static Sprite _icon;

		private static GameObject _legacy;

		private const string LegacyButton = "WolvysDropCountersButton";

		private static bool _failedOnce;

		private static bool _reported;

		private static RectTransform _frame;

		private static RectTransform _full;

		private static RectTransform _view;

		private static GameObject _scrollbar;

		private static TMP_Text _title;

		private static Vector2 _minSize;

		private const string SizeKey = "Wolvyreen.ModHub.WindowSize";

		private const string PlaceKey = "Wolvyreen.ModHub.WindowPlace";

		private static readonly HashSet<string> FullSections = new HashSet<string>();

		private static readonly Dictionary<string, string> LastNormal = new Dictionary<string, string>();

		internal static Toggle _toggleT;

		internal static Slider _sliderT;

		internal static TMP_Dropdown _dropT;

		internal static TMP_InputField _inputT;

		internal static Button _textButtonT;

		internal static Button _tabT;

		internal static TMP_FontAsset _bodyFont;

		internal static TMP_FontAsset _headFont;

		private static GameObject _tipPrefabObj;

		private static GameObject _kitHolder;

		private static bool _rowLogged;

		private const string IconPng = "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";

		private static MethodInfo _show;

		private static MethodInfo _isVisible;

		private static Action<string, string> _opener;

		private static Sprite _gripSprite;

		private static bool _about;

		private static readonly Dictionary<string, Sprite> AboutIcons = new Diction