Decompiled source of ThronefallMultiplayer v1.0.5

ThronefallMultiplayer_Mod\BepInEx\plugins\ThronefallMultiplayer\com.badwolf.thronefall_mp.dll

Decompiled 10 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using I2.Loc;
using JetBrains.Annotations;
using MPUIKIT;
using Microsoft.CodeAnalysis;
using MoreMountains.Feedbacks;
using On;
using Pathfinding;
using Pathfinding.RVO;
using Rewired;
using Shapes;
using Steamworks;
using TMPro;
using ThronefallMP.Components;
using ThronefallMP.Network;
using ThronefallMP.Network.Packets;
using ThronefallMP.Network.Packets.Administration;
using ThronefallMP.Network.Packets.Game;
using ThronefallMP.Network.Packets.PlayerCommand;
using ThronefallMP.Network.Packets.Sync;
using ThronefallMP.Network.Sync;
using ThronefallMP.Patches;
using ThronefallMP.UI;
using ThronefallMP.UI.Controls;
using ThronefallMP.UI.Dialogs;
using ThronefallMP.UI.Panels;
using ThronefallMP.Utils;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Experimental.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.TextCore.LowLevel;
using UnityEngine.UI;
using UnityEngine.UIElements.Experimental;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Rikhardur Bjarni Einarsson (BadWolf)")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("All rights reserved")]
[assembly: AssemblyDescription("Multiplayer mod for Thronefall")]
[assembly: AssemblyFileVersion("1.0.5.0")]
[assembly: AssemblyInformationalVersion("1.0.5")]
[assembly: AssemblyProduct("com.badwolf.thronefall_mp")]
[assembly: AssemblyTitle("com.badwolf.thronefall_mp")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.5.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsUnmanagedAttribute : Attribute
	{
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ThronefallMP
{
	public class CheatHandler
	{
		private delegate bool CheatMessageHandler(string user, string[] parts);

		private Dictionary<string, CheatMessageHandler> _handlers = new Dictionary<string, CheatMessageHandler>();

		private static bool CheatsEnabled
		{
			get
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				if (Plugin.Instance.Network.Online)
				{
					if (SteamManager.Initialized)
					{
						return SteamMatchmaking.GetLobbyData(Plugin.Instance.Network.Lobby, "cheats_enabled") == "yes";
					}
					return false;
				}
				return true;
			}
		}

		public CheatHandler()
		{
			_handlers.Add("add_coins", AddCoins);
			Plugin.Instance.Network.AddChatMessageHandler(100, OnMessageReceived);
		}

		private bool OnMessageReceived(string user, string message)
		{
			if (!CheatsEnabled || !Plugin.Instance.Network.Server || !message.StartsWith("/"))
			{
				return false;
			}
			message = message.Remove(0, 1);
			Plugin.Log.LogInfo((object)("Parsing cheat '" + message + "'"));
			string[] array = message.Split(' ');
			Plugin.Log.LogInfo((object)("Command '" + array[0] + "'"));
			if (_handlers.TryGetValue(array[0], out var value))
			{
				return value(user, array.Skip(1).ToArray());
			}
			Plugin.Log.LogInfo((object)"Not found");
			return false;
		}

		private bool AddCoins(string user, string[] parts)
		{
			if (parts.Length != 1)
			{
				Plugin.Log.LogInfo((object)"Too many arguments");
				return false;
			}
			if (!int.TryParse(parts[0], out var result))
			{
				Plugin.Log.LogInfo((object)"Failed to parse coins");
				return false;
			}
			GlobalData.Balance += result;
			Plugin.Instance.Network.SendServerMessage($"{user} Cheated in {result} coins.");
			return true;
		}
	}
	public enum Equipment
	{
		Invalid,
		PerkPoint,
		LongBow,
		LightSpear,
		HeavySword,
		LightningWand,
		RoyalMint,
		ArcaneTowers,
		HeavyArmor,
		CastleFortifications,
		RingOfResurrection,
		PumpkinFields,
		ArchitectsCouncil,
		GodsLotion,
		CastleBlueprints,
		GladiatorSchool,
		WarHorse,
		GlassCannon,
		BigHarbours,
		EliteWarriors,
		ArcherySkills,
		FasterResearch,
		TowerSupport,
		FortifiedHouses,
		CommanderMode,
		HealingSpirits,
		IceMagic,
		MeleeResistance,
		PowerTower,
		RangedResistance,
		TreasureHunter,
		IndestructibleMines,
		WarriorMode,
		MeleeDamage,
		FirewingHero,
		AntiAirTelescope,
		RangedDamage,
		StrongerHeroes,
		LizardRiderHero,
		AssassinsTraining,
		MagicArmor,
		GodlyCurse,
		CastleUp,
		MillScarecrow,
		MillWindSpirits,
		TowerHotOil,
		MeleeFlails,
		RangedHunters,
		MeleeBerserkers,
		RangedFireArchers,
		WarGods,
		Turtle,
		Tiger,
		Rat,
		Falcon,
		Destruction,
		Wasp,
		Death,
		Phoenix,
		NoWallsPact,
		NoTowersPact,
		NoUnitsPact
	}
	public static class Equip
	{
		public static readonly HashSet<Equipment> Weapons = new HashSet<Equipment>
		{
			Equipment.LongBow,
			Equipment.LightSpear,
			Equipment.HeavySword,
			Equipment.LightningWand
		};

		private static readonly Dictionary<string, Equipment> NameToEquip = new Dictionary<string, Equipment>
		{
			{
				"",
				Equipment.Invalid
			},
			{
				"Perk Point",
				Equipment.PerkPoint
			},
			{
				"Long Bow",
				Equipment.LongBow
			},
			{
				"Light Spear",
				Equipment.LightSpear
			},
			{
				"Heavy Sword",
				Equipment.HeavySword
			},
			{
				"Lightning Wand",
				Equipment.LightningWand
			},
			{
				"Universal Income",
				Equipment.RoyalMint
			},
			{
				"Arcane Towers",
				Equipment.ArcaneTowers
			},
			{
				"Heavy Armor",
				Equipment.HeavyArmor
			},
			{
				"Castle Fortifications",
				Equipment.CastleFortifications
			},
			{
				"Ring of Resurection",
				Equipment.RingOfResurrection
			},
			{
				"Pumpkin Fields",
				Equipment.PumpkinFields
			},
			{
				"Architect's Council",
				Equipment.ArchitectsCouncil
			},
			{
				"Gods Lotion",
				Equipment.GodsLotion
			},
			{
				"Castle Blueprints",
				Equipment.CastleBlueprints
			},
			{
				"Gladiator School",
				Equipment.GladiatorSchool
			},
			{
				"War Horse",
				Equipment.WarHorse
			},
			{
				"Glass Canon",
				Equipment.GlassCannon
			},
			{
				"Big Harbours",
				Equipment.BigHarbours
			},
			{
				"Ellite Warriors",
				Equipment.EliteWarriors
			},
			{
				"Archery Skills",
				Equipment.ArcherySkills
			},
			{
				"Faster Research",
				Equipment.FasterResearch
			},
			{
				"TowerSupport",
				Equipment.TowerSupport
			},
			{
				"Fortified Houses",
				Equipment.FortifiedHouses
			},
			{
				"Commander Mode",
				Equipment.CommanderMode
			},
			{
				"Healing Spirits",
				Equipment.HealingSpirits
			},
			{
				"Ice Magic",
				Equipment.IceMagic
			},
			{
				"Melee Resistence",
				Equipment.MeleeResistance
			},
			{
				"Power Tower",
				Equipment.PowerTower
			},
			{
				"Ranged Resistence",
				Equipment.RangedResistance
			},
			{
				"Treasure Hunter",
				Equipment.TreasureHunter
			},
			{
				"Indestructible Mines",
				Equipment.IndestructibleMines
			},
			{
				"Warrior Mode",
				Equipment.WarriorMode
			},
			{
				"Melee Damage",
				Equipment.MeleeDamage
			},
			{
				"Firewing Hero",
				Equipment.FirewingHero
			},
			{
				"Anti Air Telescope",
				Equipment.AntiAirTelescope
			},
			{
				"Ranged Damage",
				Equipment.RangedDamage
			},
			{
				"Stronger Heros",
				Equipment.StrongerHeroes
			},
			{
				"LizzardRider Hero",
				Equipment.LizardRiderHero
			},
			{
				"CCAssassinsTraining",
				Equipment.AssassinsTraining
			},
			{
				"CCMagicArmor",
				Equipment.MagicArmor
			},
			{
				"CCGodlyCurse",
				Equipment.GodlyCurse
			},
			{
				"CCCastleUp",
				Equipment.CastleUp
			},
			{
				"MillScarecrow",
				Equipment.MillScarecrow
			},
			{
				"MillWindSpirits",
				Equipment.MillWindSpirits
			},
			{
				"TowerHotOil",
				Equipment.TowerHotOil
			},
			{
				"MeleeFlails",
				Equipment.MeleeFlails
			},
			{
				"RangedHunters",
				Equipment.RangedHunters
			},
			{
				"MeleeBerserks",
				Equipment.MeleeBerserkers
			},
			{
				"RangedFireArchers",
				Equipment.RangedFireArchers
			},
			{
				"Pray to The God of Strength",
				Equipment.WarGods
			},
			{
				"Taunt The Turtle God",
				Equipment.Turtle
			},
			{
				"Taunt The Tiger God",
				Equipment.Tiger
			},
			{
				"Taunt The Rat God",
				Equipment.Rat
			},
			{
				"Taunt The Falcon God",
				Equipment.Falcon
			},
			{
				"Taunt God of Destruction",
				Equipment.Destruction
			},
			{
				"Taunt The Cheese God",
				Equipment.Wasp
			},
			{
				"Taunt The Disease God",
				Equipment.Death
			},
			{
				"Taunt The Phoenix God",
				Equipment.Phoenix
			},
			{
				"No Walls Pact",
				Equipment.NoWallsPact
			},
			{
				"No Towers Pact",
				Equipment.NoTowersPact
			},
			{
				"No Units Pact",
				Equipment.NoUnitsPact
			}
		};

		private static readonly Dictionary<Equipment, Equippable> EquipmentToEquippable = new Dictionary<Equipment, Equippable>();

		private static readonly Dictionary<Equippable, Equipment> EquippableToEquipment = new Dictionary<Equippable, Equipment>();

		private static bool _initialized;

		private static void InitializeDictionaries()
		{
			_initialized = true;
			Traverse<List<MetaLevel>> val = Traverse.Create((object)PerkManager.instance).Field<List<MetaLevel>>("metaLevels");
			Plugin.Log.LogInfoFiltered("Equipment", "Initializing converter dictionary");
			Plugin.Log.LogInfoFiltered("Equipment", "Meta levels");
			foreach (MetaLevel item in val.Value)
			{
				Equipment equipment = Convert(((Object)item.reward).name);
				Plugin.Log.LogInfoFiltered("Equipment", $"- {equipment} = {((Object)item.reward).name}");
				EquipmentToEquippable[equipment] = item.reward;
				EquippableToEquipment[item.reward] = equipment;
			}
			Plugin.Log.LogInfoFiltered("Equipment", "Currently Unlocked");
			foreach (Equippable unlockedEquippable in PerkManager.instance.UnlockedEquippables)
			{
				Equipment equipment2 = Convert(((Object)unlockedEquippable).name);
				Plugin.Log.LogInfoFiltered("Equipment", $"- {equipment2} = {((Object)unlockedEquippable).name}");
				EquipmentToEquippable[equipment2] = unlockedEquippable;
				EquippableToEquipment[unlockedEquippable] = equipment2;
			}
		}

		public static void ClearEquipments()
		{
			Plugin.Log.LogInfoFiltered("Equipment", "Clearing equipment");
			PerkManager.instance.CurrentlyEquipped.Clear();
		}

		public static void EquipEquipment(Equipment equipment)
		{
			if (!_initialized)
			{
				InitializeDictionaries();
			}
			Plugin.Log.LogInfoFiltered("Equipment", $"Equipping {equipment} -> {EquipmentToEquippable[equipment].displayName}");
			PerkManager.instance.CurrentlyEquipped.Add(EquipmentToEquippable[equipment]);
		}

		public static Equipment Convert(Equippable equip)
		{
			if (!_initialized)
			{
				InitializeDictionaries();
			}
			return GeneralExtensions.GetValueSafe<Equippable, Equipment>(EquippableToEquipment, equip);
		}

		public static Equippable Convert(Equipment equip)
		{
			if (!_initialized)
			{
				InitializeDictionaries();
			}
			return GeneralExtensions.GetValueSafe<Equipment, Equippable>(EquipmentToEquippable, equip);
		}

		public static Equipment Convert(string name)
		{
			return GeneralExtensions.GetValueSafe<string, Equipment>(NameToEquip, name);
		}
	}
	public struct InternalGlobalData
	{
		public int Balance;

		public int NetWorth;
	}
	public static class GlobalData
	{
		public static InternalGlobalData Internal;

		public static int LocalBalanceDelta;

		public static int Balance
		{
			get
			{
				if (!Plugin.Instance.Network.Server)
				{
					return Internal.Balance + LocalBalanceDelta;
				}
				return Internal.Balance;
			}
			set
			{
				if (Plugin.Instance.Network.Server)
				{
					Internal.Balance = value;
				}
				else
				{
					LocalBalanceDelta = value - Internal.Balance;
				}
			}
		}

		public static int NetWorth => Internal.NetWorth;
	}
	[BepInPlugin("com.badwolf.thronefall_mp", "Thronefall Multiplayer", "1.0.5")]
	[BepInProcess("Thronefall.exe")]
	public class Plugin : BaseUnityPlugin
	{
		public delegate void LoadCallback();

		public const string VersionString = "thronefall_mp_1.0.5";

		public static readonly Random Random = new Random();

		[UsedImplicitly]
		public PingPongSync PingPongSync = new PingPongSync();

		[UsedImplicitly]
		public LevelDataSync LevelDataSync = new LevelDataSync();

		[UsedImplicitly]
		public ResourceSync ResourceSync = new ResourceSync();

		[UsedImplicitly]
		public InputSync InputSync = new InputSync();

		[UsedImplicitly]
		public PositionSync PositionSync = new PositionSync();

		[UsedImplicitly]
		public HpSync HpSync = new HpSync();

		[UsedImplicitly]
		public AllyPathfinderSync AllyPathfinderSync = new AllyPathfinderSync();

		[UsedImplicitly]
		public EnemyPathfinderSync EnemyPathfinderSync = new EnemyPathfinderSync();

		private static Dictionary<string, List<(bool waitForTransition, LoadCallback callback)>> _loadCallbacks = new Dictionary<string, List<(bool, LoadCallback)>>();

		public static Plugin Instance { get; private set; }

		public static ManualLogSource Log { get; private set; }

		public ThronefallMP.Network.Network Network { get; private set; }

		public PlayerManager PlayerManager { get; private set; }

		public TextureRepository TextureRepository { get; private set; }

		[UsedImplicitly]
		public CheatHandler CheatHandler { get; private set; }

		private void Awake()
		{
			ConfigEntry<bool> val = ((BaseUnityPlugin)this).Config.Bind<bool>("Network", "EnableSimulation", false, "Enable simulation of a bad network for debugging");
			Instance = this;
			TextureRepository = new TextureRepository();
			Network = ((Component)Instance).gameObject.AddComponent<ThronefallMP.Network.Network>();
			PlayerManager = new PlayerManager();
			CheatHandler = new CheatHandler();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin com.badwolf.thronefall_mp is loaded!");
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogInfo((object)$"Little Endian: {BitConverter.IsLittleEndian}");
			if (SteamManager.Initialized)
			{
				SetSteamNetworkConfigValues();
				if (val.Value)
				{
					SetSteamNetworkSimulationValues();
				}
			}
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
			BuildingInteractorPatch.Apply();
			BuildSlotPatch.Apply();
			CameraRigPatch.Apply();
			CommandUnitsPatch.Apply();
			CostDisplayPatch.Apply();
			DayNightCyclePatch.Apply();
			EnemySpawnerPatch.Apply();
			GateOpenerPatch.Apply();
			HpPatch.Apply();
			InGameResignUIHelperPatch.Apply();
			LevelBorderPatch.Apply();
			LevelSelectManagerPatch.Apply();
			NightCallPatch.Apply();
			PathFinderMovementEnemyPatch.Apply();
			PathfindMovementPlayerunitPatch.Apply();
			PerkHpModifyerPatch.Apply();
			PerkWeaponModifyerPatch.Apply();
			PlayerAttackPatch.Apply();
			PlayerInteractionPatch.Apply();
			PlayerMovementPatch.Apply();
			PlayerSceptPatch.Apply();
			RevivePanelPatch.Apply();
			SceneTransitionManagerPatch.Apply();
			SteamManagerPatch.Apply();
			TreasuryUIPatch.Apply();
			UIFrameManagerPatch.Apply();
			UIFramePatch.Apply();
			UnitRespawnerForBuildingsPatch.Apply();
			UpgradeAssassinsTrainingPatch.Apply();
			WeaponEquipperPatch.Apply();
			Application.runInBackground = true;
			SceneManager.sceneLoaded += OnSceneChanged;
		}

		private void OnUIInitialized()
		{
			UIManager.Initialize();
			ConfigEntry<bool> val = ((BaseUnityPlugin)this).Config.Bind<bool>("Network", "EnableSimulation", false, "Enable simulation of a bad network for debugging");
			if (val.Value)
			{
				UIManager.CreateMessageDialog("Network Debug Simulation", "Simulation of a bad network is enabled");
			}
		}

		private void OnSceneChanged(Scene scene, LoadSceneMode mode)
		{
			if (((Scene)(ref scene)).name == "_UI")
			{
				OnUIInitialized();
			}
			if (!_loadCallbacks.TryGetValue(((Scene)(ref scene)).name, out List<(bool, LoadCallback)> value))
			{
				return;
			}
			foreach (var item in value)
			{
				if (item.Item1)
				{
					CallbackOnFinishTransition(item.Item2);
				}
				else
				{
					item.Item2();
				}
			}
			value.Clear();
		}

		public static void CallbackOnLoad(string scene, bool waitForTransition, LoadCallback callback)
		{
			if (!_loadCallbacks.TryGetValue(scene, out List<(bool, LoadCallback)> value))
			{
				value = new List<(bool, LoadCallback)>();
				_loadCallbacks[scene] = value;
			}
			value.Add((waitForTransition, callback));
		}

		private static void CallbackOnFinishTransition(LoadCallback callback)
		{
			((MonoBehaviour)Instance).StartCoroutine(WaitForTransition(callback));
		}

		private static IEnumerator WaitForTransition(LoadCallback callback)
		{
			while (SceneTransitionManager.instance.SceneTransitionIsRunning)
			{
				yield return null;
			}
			callback?.Invoke();
		}

		private void SetSteamNetworkConfigValues()
		{
			SetSteamNetworkValue((ESteamNetworkingConfigValue)24, (ESteamNetworkingConfigDataType)1, 1600);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)25, (ESteamNetworkingConfigDataType)1, 3200);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)9, (ESteamNetworkingConfigDataType)1, 4194304);
		}

		private void SetSteamNetworkSimulationValues()
		{
			SetSteamNetworkValue((ESteamNetworkingConfigValue)2, (ESteamNetworkingConfigDataType)3, ((BaseUnityPlugin)this).Config.Bind<float>("Network", "PacketLossSendPercentage", 0.3f, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)3, (ESteamNetworkingConfigDataType)3, ((BaseUnityPlugin)this).Config.Bind<float>("Network", "PacketLossReceivePercentage", 0.3f, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)4, (ESteamNetworkingConfigDataType)1, ((BaseUnityPlugin)this).Config.Bind<int>("Network", "PacketLagSendMs", 80, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)5, (ESteamNetworkingConfigDataType)1, ((BaseUnityPlugin)this).Config.Bind<int>("Network", "PacketLagReceiveMs", 80, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)6, (ESteamNetworkingConfigDataType)3, ((BaseUnityPlugin)this).Config.Bind<float>("Network", "PacketReorderPercentageSend", 0.1f, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)7, (ESteamNetworkingConfigDataType)3, ((BaseUnityPlugin)this).Config.Bind<float>("Network", "PacketReorderPercentageReceive", 0.1f, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)8, (ESteamNetworkingConfigDataType)1, ((BaseUnityPlugin)this).Config.Bind<int>("Network", "PacketReorderTime", 20, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)26, (ESteamNetworkingConfigDataType)3, ((BaseUnityPlugin)this).Config.Bind<float>("Network", "PacketDuplicatePercentSend", 0.1f, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)26, (ESteamNetworkingConfigDataType)3, ((BaseUnityPlugin)this).Config.Bind<float>("Network", "PacketDuplicatePercentReceive", 0.1f, (ConfigDescription)null).Value);
			SetSteamNetworkValue((ESteamNetworkingConfigValue)28, (ESteamNetworkingConfigDataType)1, ((BaseUnityPlugin)this).Config.Bind<int>("Network", "PacketDuplicateTimeMax", 60, (ConfigDescription)null).Value);
		}

		private static void SetSteamNetworkValue<T>(ESteamNetworkingConfigValue name, ESteamNetworkingConfigDataType type, T value) where T : unmanaged
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			GCHandle gCHandle = GCHandle.Alloc(value, GCHandleType.Pinned);
			SteamNetworkingUtils.SetConfigValue(name, (ESteamNetworkingConfigScope)1, IntPtr.Zero, type, gCHandle.AddrOfPinnedObject());
			gCHandle.Free();
		}
	}
	public class PrefabSpawner : MonoBehaviour
	{
		public enum EnemyType
		{
			Unknown,
			Archer,
			Catapult,
			Crossbow,
			Exploder,
			Flyer,
			Hunterling,
			Melee,
			MonsterRider,
			Ogre,
			ProjectileBow,
			Racer,
			Slime,
			StrongSlime,
			Weakling
		}

		private readonly Dictionary<string, EnemyType> _enemyNameToType = new Dictionary<string, EnemyType>();

		private readonly Dictionary<EnemyType, string> _enemyTypeToName = new Dictionary<EnemyType, string>();

		private readonly Dictionary<EnemyType, GameObject> _prefabs = new Dictionary<EnemyType, GameObject>();

		private void Awake()
		{
			AddEnemyEntries(EnemyType.Unknown, "");
			AddEnemyEntries(EnemyType.Archer, "E Archer");
			AddEnemyEntries(EnemyType.Catapult, "E Catapult");
			AddEnemyEntries(EnemyType.Crossbow, "E Crossbow");
			AddEnemyEntries(EnemyType.Exploder, "E Exploder");
			AddEnemyEntries(EnemyType.Flyer, "E Flyer");
			AddEnemyEntries(EnemyType.Hunterling, "E Hunterling");
			AddEnemyEntries(EnemyType.Melee, "E Melee");
			AddEnemyEntries(EnemyType.MonsterRider, "E MonsterRider");
			AddEnemyEntries(EnemyType.Ogre, "E Ogre");
			AddEnemyEntries(EnemyType.ProjectileBow, "E ProjectileBow");
			AddEnemyEntries(EnemyType.Racer, "E Racer");
			AddEnemyEntries(EnemyType.Slime, "E Slime");
			AddEnemyEntries(EnemyType.StrongSlime, "E StrongSlime");
			AddEnemyEntries(EnemyType.Weakling, "E Weakling");
		}

		private void AddEnemyEntries(EnemyType type, string enemy)
		{
			_enemyTypeToName.Add(type, enemy);
			_enemyNameToType.Add(enemy, type);
		}

		private GameObject GetPrefab(EnemyType type)
		{
			if (!_prefabs.TryGetValue(type, out var value) || (Object)(object)value == (Object)null)
			{
				value = GameObject.Find(_enemyTypeToName[type]);
				_prefabs.Add(type, value);
			}
			return value;
		}

		public EnemyType ToEnemy(string enemy)
		{
			if (!_enemyNameToType.TryGetValue(enemy, out var value))
			{
				return EnemyType.Unknown;
			}
			return value;
		}

		public GameObject Spawn(ushort id, EnemyType type)
		{
			GameObject prefab = GetPrefab(type);
			if ((Object)(object)prefab == (Object)null)
			{
				return null;
			}
			GameObject val = Helpers.InstantiateDisabled<GameObject>(prefab, (Transform)null, worldPositionStays: false);
			Identifier identifier = val.AddComponent<Identifier>();
			identifier.SetIdentity(IdentifierType.Enemy, id);
			return val;
		}
	}
	public class TextureRepository
	{
		public readonly Texture2D Crown = LoadTexture("crown.png");

		public readonly Texture2D Lock = LoadTexture("lock-icon.png");

		public readonly Texture2D Blank = LoadTexture("blank.png");

		private static Texture2D LoadTexture(string textureName)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(textureName));
			Stream manifestResourceStream = executingAssembly.GetManifestResourceStream(name);
			Texture2D val = new Texture2D(2, 2, (GraphicsFormat)8, 1, (TextureCreationFlags)0);
			using MemoryStream memoryStream = new MemoryStream();
			manifestResourceStream.CopyTo(memoryStream);
			ImageConversion.LoadImage(val, memoryStream.ToArray());
			return val;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "com.badwolf.thronefall_mp";

		public const string PLUGIN_NAME = "com.badwolf.thronefall_mp";

		public const string PLUGIN_VERSION = "1.0.5";
	}
}
namespace ThronefallMP.Utils
{
	public static class Ext
	{
		public static bool LogErrorFiltered(string section)
		{
			return ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowError" + section, true, (ConfigDescription)null).Value;
		}

		public static void LogErrorFiltered(this ManualLogSource source, string section, object obj)
		{
			ConfigEntry<bool> val = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowError" + section, true, (ConfigDescription)null);
			if (val.Value)
			{
				source.LogError((object)(section + "> " + obj));
			}
		}

		public static bool LogWarningFiltered(string section)
		{
			return ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowWarning" + section, true, (ConfigDescription)null).Value;
		}

		public static void LogWarningFiltered(this ManualLogSource source, string section, object obj)
		{
			ConfigEntry<bool> val = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowWarning" + section, true, (ConfigDescription)null);
			if (val.Value)
			{
				source.LogWarning((object)(section + "> " + obj));
			}
		}

		public static bool LogInfoFiltered(string section)
		{
			return ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowInfo" + section, true, (ConfigDescription)null).Value;
		}

		public static void LogInfoFiltered(this ManualLogSource source, string section, object obj)
		{
			ConfigEntry<bool> val = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowInfo" + section, true, (ConfigDescription)null);
			if (val.Value)
			{
				source.LogInfo((object)(section + "> " + obj));
			}
		}

		public static bool LogDebugFiltered(string section)
		{
			return ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowDebug" + section, true, (ConfigDescription)null).Value;
		}

		public static void LogDebugFiltered(this ManualLogSource source, string section, object obj)
		{
			ConfigEntry<bool> val = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("Debug", "ShowDebug" + section, true, (ConfigDescription)null);
			if (val.Value)
			{
				source.LogDebug(obj);
			}
		}
	}
	[Serializable]
	public struct Half : IComparable, IFormattable, IConvertible, IComparable<Half>, IEquatable<Half>
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal ushort value;

		public static readonly Half Epsilon = ToHalf(1);

		public static readonly Half MaxValue = ToHalf(31743);

		public static readonly Half MinValue = ToHalf(64511);

		public static readonly Half NaN = ToHalf(65024);

		public static readonly Half NegativeInfinity = ToHalf(64512);

		public static readonly Half PositiveInfinity = ToHalf(31744);

		public Half(float value)
		{
			this = HalfHelper.SingleToHalf(value);
		}

		public Half(int value)
			: this((float)value)
		{
		}

		public Half(long value)
			: this((float)value)
		{
		}

		public Half(double value)
			: this((float)value)
		{
		}

		public Half(decimal value)
			: this((float)value)
		{
		}

		public Half(uint value)
			: this((float)value)
		{
		}

		public Half(ulong value)
			: this((float)value)
		{
		}

		public static Half Negate(Half half)
		{
			return -half;
		}

		public static Half Add(Half half1, Half half2)
		{
			return half1 + half2;
		}

		public static Half Subtract(Half half1, Half half2)
		{
			return half1 - half2;
		}

		public static Half Multiply(Half half1, Half half2)
		{
			return half1 * half2;
		}

		public static Half Divide(Half half1, Half half2)
		{
			return half1 / half2;
		}

		public static Half operator +(Half half)
		{
			return half;
		}

		public static Half operator -(Half half)
		{
			return HalfHelper.Negate(half);
		}

		public static Half operator ++(Half half)
		{
			return (Half)((float)half + 1f);
		}

		public static Half operator --(Half half)
		{
			return (Half)((float)half - 1f);
		}

		public static Half operator +(Half half1, Half half2)
		{
			return (Half)((float)half1 + (float)half2);
		}

		public static Half operator -(Half half1, Half half2)
		{
			return (Half)((float)half1 - (float)half2);
		}

		public static Half operator *(Half half1, Half half2)
		{
			return (Half)((float)half1 * (float)half2);
		}

		public static Half operator /(Half half1, Half half2)
		{
			return (Half)((float)half1 / (float)half2);
		}

		public static bool operator ==(Half half1, Half half2)
		{
			if (!IsNaN(half1))
			{
				return half1.value == half2.value;
			}
			return false;
		}

		public static bool operator !=(Half half1, Half half2)
		{
			return half1.value != half2.value;
		}

		public static bool operator <(Half half1, Half half2)
		{
			return (float)half1 < (float)half2;
		}

		public static bool operator >(Half half1, Half half2)
		{
			return (float)half1 > (float)half2;
		}

		public static bool operator <=(Half half1, Half half2)
		{
			if (!(half1 == half2))
			{
				return half1 < half2;
			}
			return true;
		}

		public static bool operator >=(Half half1, Half half2)
		{
			if (!(half1 == half2))
			{
				return half1 > half2;
			}
			return true;
		}

		public static implicit operator Half(byte value)
		{
			return new Half((float)(int)value);
		}

		public static implicit operator Half(short value)
		{
			return new Half((float)value);
		}

		public static implicit operator Half(char value)
		{
			return new Half((float)(int)value);
		}

		public static implicit operator Half(int value)
		{
			return new Half((float)value);
		}

		public static implicit operator Half(long value)
		{
			return new Half((float)value);
		}

		public static explicit operator Half(float value)
		{
			return new Half(value);
		}

		public static explicit operator Half(double value)
		{
			return new Half((float)value);
		}

		public static explicit operator Half(decimal value)
		{
			return new Half((float)value);
		}

		public static explicit operator byte(Half value)
		{
			return (byte)(float)value;
		}

		public static explicit operator char(Half value)
		{
			return (char)(float)value;
		}

		public static explicit operator short(Half value)
		{
			return (short)(float)value;
		}

		public static explicit operator int(Half value)
		{
			return (int)(float)value;
		}

		public static explicit operator long(Half value)
		{
			return (long)(float)value;
		}

		public static implicit operator float(Half value)
		{
			return HalfHelper.HalfToSingle(value);
		}

		public static implicit operator double(Half value)
		{
			return (float)value;
		}

		public static explicit operator decimal(Half value)
		{
			return (decimal)(float)value;
		}

		public static implicit operator Half(sbyte value)
		{
			return new Half((float)value);
		}

		public static implicit operator Half(ushort value)
		{
			return new Half((float)(int)value);
		}

		public static implicit operator Half(uint value)
		{
			return new Half((float)value);
		}

		public static implicit operator Half(ulong value)
		{
			return new Half((float)value);
		}

		public static explicit operator sbyte(Half value)
		{
			return (sbyte)(float)value;
		}

		public static explicit operator ushort(Half value)
		{
			return (ushort)(float)value;
		}

		public static explicit operator uint(Half value)
		{
			return (uint)(float)value;
		}

		public static explicit operator ulong(Half value)
		{
			return (ulong)(float)value;
		}

		public int CompareTo(Half other)
		{
			int result = 0;
			if (this < other)
			{
				result = -1;
			}
			else if (this > other)
			{
				result = 1;
			}
			else if (this != other)
			{
				if (!IsNaN(this))
				{
					result = 1;
				}
				else if (!IsNaN(other))
				{
					result = -1;
				}
			}
			return result;
		}

		public int CompareTo(object obj)
		{
			int num = 0;
			if (obj == null)
			{
				return 1;
			}
			if (obj is Half)
			{
				return CompareTo((Half)obj);
			}
			throw new ArgumentException("Object must be of type Half.");
		}

		public bool Equals(Half other)
		{
			if (!(other == this))
			{
				if (IsNaN(other))
				{
					return IsNaN(this);
				}
				return false;
			}
			return true;
		}

		public override bool Equals(object obj)
		{
			bool result = false;
			if (obj is Half half && (half == this || (IsNaN(half) && IsNaN(this))))
			{
				result = true;
			}
			return result;
		}

		public override int GetHashCode()
		{
			return value.GetHashCode();
		}

		public TypeCode GetTypeCode()
		{
			return (TypeCode)255;
		}

		public static byte[] GetBytes(Half value)
		{
			return BitConverter.GetBytes(value.value);
		}

		public static ushort GetBits(Half value)
		{
			return value.value;
		}

		public static Half ToHalf(byte[] value, int startIndex)
		{
			return ToHalf((ushort)BitConverter.ToInt16(value, startIndex));
		}

		public static Half ToHalf(ushort bits)
		{
			Half result = default(Half);
			result.value = bits;
			return result;
		}

		public static int Sign(Half value)
		{
			if (value < 0)
			{
				return -1;
			}
			if (value > 0)
			{
				return 1;
			}
			if (value != 0)
			{
				throw new ArithmeticException("Function does not accept floating point Not-a-Number values.");
			}
			return 0;
		}

		public static Half Abs(Half value)
		{
			return HalfHelper.Abs(value);
		}

		public static Half Max(Half value1, Half value2)
		{
			if (!(value1 < value2))
			{
				return value1;
			}
			return value2;
		}

		public static Half Min(Half value1, Half value2)
		{
			if (!(value1 < value2))
			{
				return value2;
			}
			return value1;
		}

		public static bool IsNaN(Half half)
		{
			return HalfHelper.IsNaN(half);
		}

		public static bool IsInfinity(Half half)
		{
			return HalfHelper.IsInfinity(half);
		}

		public static bool IsNegativeInfinity(Half half)
		{
			return HalfHelper.IsNegativeInfinity(half);
		}

		public static bool IsPositiveInfinity(Half half)
		{
			return HalfHelper.IsPositiveInfinity(half);
		}

		public static Half Parse(string value)
		{
			return (Half)float.Parse(value, CultureInfo.InvariantCulture);
		}

		public static Half Parse(string value, IFormatProvider provider)
		{
			return (Half)float.Parse(value, provider);
		}

		public static Half Parse(string value, NumberStyles style)
		{
			return (Half)float.Parse(value, style, CultureInfo.InvariantCulture);
		}

		public static Half Parse(string value, NumberStyles style, IFormatProvider provider)
		{
			return (Half)float.Parse(value, style, provider);
		}

		public static bool TryParse(string value, out Half result)
		{
			if (float.TryParse(value, out var result2))
			{
				result = (Half)result2;
				return true;
			}
			result = default(Half);
			return false;
		}

		public static bool TryParse(string value, NumberStyles style, IFormatProvider provider, out Half result)
		{
			bool result2 = false;
			if (float.TryParse(value, style, provider, out var result3))
			{
				result = (Half)result3;
				result2 = true;
			}
			else
			{
				result = default(Half);
			}
			return result2;
		}

		public override string ToString()
		{
			return ((float)this).ToString(CultureInfo.InvariantCulture);
		}

		public string ToString(IFormatProvider formatProvider)
		{
			return ((float)this).ToString(formatProvider);
		}

		public string ToString(string format)
		{
			return ((float)this).ToString(format, CultureInfo.InvariantCulture);
		}

		public string ToString(string format, IFormatProvider formatProvider)
		{
			return ((float)this).ToString(format, formatProvider);
		}

		float IConvertible.ToSingle(IFormatProvider provider)
		{
			return this;
		}

		TypeCode IConvertible.GetTypeCode()
		{
			return GetTypeCode();
		}

		bool IConvertible.ToBoolean(IFormatProvider provider)
		{
			return Convert.ToBoolean(this);
		}

		byte IConvertible.ToByte(IFormatProvider provider)
		{
			return Convert.ToByte(this);
		}

		char IConvertible.ToChar(IFormatProvider provider)
		{
			throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "Char"));
		}

		DateTime IConvertible.ToDateTime(IFormatProvider provider)
		{
			throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "DateTime"));
		}

		decimal IConvertible.ToDecimal(IFormatProvider provider)
		{
			return Convert.ToDecimal(this);
		}

		double IConvertible.ToDouble(IFormatProvider provider)
		{
			return Convert.ToDouble(this);
		}

		short IConvertible.ToInt16(IFormatProvider provider)
		{
			return Convert.ToInt16(this);
		}

		int IConvertible.ToInt32(IFormatProvider provider)
		{
			return Convert.ToInt32(this);
		}

		long IConvertible.ToInt64(IFormatProvider provider)
		{
			return Convert.ToInt64(this);
		}

		sbyte IConvertible.ToSByte(IFormatProvider provider)
		{
			return Convert.ToSByte(this);
		}

		string IConvertible.ToString(IFormatProvider provider)
		{
			return Convert.ToString(this, CultureInfo.InvariantCulture);
		}

		object IConvertible.ToType(Type conversionType, IFormatProvider provider)
		{
			return ((IConvertible)(float)this).ToType(conversionType, provider);
		}

		ushort IConvertible.ToUInt16(IFormatProvider provider)
		{
			return Convert.ToUInt16(this);
		}

		uint IConvertible.ToUInt32(IFormatProvider provider)
		{
			return Convert.ToUInt32(this);
		}

		ulong IConvertible.ToUInt64(IFormatProvider provider)
		{
			return Convert.ToUInt64(this);
		}
	}
	[ComVisible(false)]
	internal static class HalfHelper
	{
		private static readonly uint[] mantissaTable = GenerateMantissaTable();

		private static readonly uint[] exponentTable = GenerateExponentTable();

		private static readonly ushort[] offsetTable = GenerateOffsetTable();

		private static readonly ushort[] baseTable = GenerateBaseTable();

		private static readonly sbyte[] shiftTable = GenerateShiftTable();

		private static uint ConvertMantissa(int i)
		{
			uint num = (uint)(i << 13);
			uint num2 = 0u;
			while ((num & 0x800000) == 0)
			{
				num2 -= 8388608;
				num <<= 1;
			}
			num &= 0xFF7FFFFFu;
			num2 += 947912704;
			return num | num2;
		}

		private static uint[] GenerateMantissaTable()
		{
			uint[] array = new uint[2048];
			array[0] = 0u;
			for (int i = 1; i < 1024; i++)
			{
				array[i] = ConvertMantissa(i);
			}
			for (int j = 1024; j < 2048; j++)
			{
				array[j] = (uint)(939524096 + (j - 1024 << 13));
			}
			return array;
		}

		private static uint[] GenerateExponentTable()
		{
			uint[] array = new uint[64];
			array[0] = 0u;
			for (int i = 1; i < 31; i++)
			{
				array[i] = (uint)(i << 23);
			}
			array[31] = 1199570944u;
			array[32] = 2147483648u;
			for (int j = 33; j < 63; j++)
			{
				array[j] = (uint)(2147483648u + (j - 32 << 23));
			}
			array[63] = 3347054592u;
			return array;
		}

		private static ushort[] GenerateOffsetTable()
		{
			ushort[] array = new ushort[64];
			array[0] = 0;
			for (int i = 1; i < 32; i++)
			{
				array[i] = 1024;
			}
			array[32] = 0;
			for (int j = 33; j < 64; j++)
			{
				array[j] = 1024;
			}
			return array;
		}

		private static ushort[] GenerateBaseTable()
		{
			ushort[] array = new ushort[512];
			for (int i = 0; i < 256; i++)
			{
				sbyte b = (sbyte)(127 - i);
				if (b > 24)
				{
					array[i | 0] = 0;
					array[i | 0x100] = 32768;
				}
				else if (b > 14)
				{
					array[i | 0] = (ushort)(1024 >> 18 + b);
					array[i | 0x100] = (ushort)((uint)(1024 >> 18 + b) | 0x8000u);
				}
				else if (b >= -15)
				{
					array[i | 0] = (ushort)(15 - b << 10);
					array[i | 0x100] = (ushort)((uint)(15 - b << 10) | 0x8000u);
				}
				else if (b > sbyte.MinValue)
				{
					array[i | 0] = 31744;
					array[i | 0x100] = 64512;
				}
				else
				{
					array[i | 0] = 31744;
					array[i | 0x100] = 64512;
				}
			}
			return array;
		}

		private static sbyte[] GenerateShiftTable()
		{
			sbyte[] array = new sbyte[512];
			for (int i = 0; i < 256; i++)
			{
				sbyte b = (sbyte)(127 - i);
				if (b > 24)
				{
					array[i | 0] = 24;
					array[i | 0x100] = 24;
				}
				else if (b > 14)
				{
					array[i | 0] = (sbyte)(b - 1);
					array[i | 0x100] = (sbyte)(b - 1);
				}
				else if (b >= -15)
				{
					array[i | 0] = 13;
					array[i | 0x100] = 13;
				}
				else if (b > sbyte.MinValue)
				{
					array[i | 0] = 24;
					array[i | 0x100] = 24;
				}
				else
				{
					array[i | 0] = 13;
					array[i | 0x100] = 13;
				}
			}
			return array;
		}

		public unsafe static float HalfToSingle(Half half)
		{
			uint num = mantissaTable[offsetTable[half.value >> 10] + (half.value & 0x3FF)] + exponentTable[half.value >> 10];
			return *(float*)(&num);
		}

		public unsafe static Half SingleToHalf(float single)
		{
			uint num = *(uint*)(&single);
			ushort bits = (ushort)(baseTable[(num >> 23) & 0x1FF] + ((num & 0x7FFFFF) >> (int)shiftTable[num >> 23]));
			return Half.ToHalf(bits);
		}

		public static Half Negate(Half half)
		{
			return Half.ToHalf((ushort)(half.value ^ 0x8000u));
		}

		public static Half Abs(Half half)
		{
			return Half.ToHalf((ushort)(half.value & 0x7FFFu));
		}

		public static bool IsNaN(Half half)
		{
			return (half.value & 0x7FFF) > 31744;
		}

		public static bool IsInfinity(Half half)
		{
			return (half.value & 0x7FFF) == 31744;
		}

		public static bool IsPositiveInfinity(Half half)
		{
			return half.value == 31744;
		}

		public static bool IsNegativeInfinity(Half half)
		{
			return half.value == 64512;
		}
	}
	public static class Helpers
	{
		public const float Epsilon = 1.8E-43f;

		public const float EpsilonSqr = 9E-44f;

		private const float SpawnRadiusIncrement = 5f;

		private const int SpawnAngleIncrement = 60;

		private const int SpawnAngleEvenOffset = 30;

		public static Vector3 GetSpawnLocation(Vector3 position, int playerId)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			if (playerId == -1)
			{
				return position;
			}
			float num = 5f;
			int num2 = 0;
			bool flag = false;
			while (playerId > 0)
			{
				num2 += 60;
				if (num2 >= 360)
				{
					num2 = 0;
					num += 5f;
					flag = !flag;
				}
				playerId--;
			}
			Vector3 val = default(Vector3);
			val.x = num;
			Vector3 val2 = val;
			val2 = Quaternion.AngleAxis((float)(num2 + (flag ? 30 : 0)), Vector3.up) * val2;
			return position + val2;
		}

		public static string GetPath(Transform tr)
		{
			Transform parent = tr.parent;
			if (!((Object)(object)parent == (Object)null))
			{
				return GetPath(parent) + "/" + ((Object)tr).name;
			}
			return ((Object)tr).name;
		}

		public static bool UnityNullCheck(object a)
		{
			if (a != null)
			{
				Object val = (Object)((a is Object) ? a : null);
				if (val != null)
				{
					return val != (Object)null;
				}
				return true;
			}
			return false;
		}

		public static PlayerInteraction FindClosest(PlayerInteraction[] players, Vector3 pos)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			float num = float.MaxValue;
			PlayerInteraction result = null;
			foreach (PlayerInteraction val in players)
			{
				Vector3 val2 = ((Component)val).transform.position - pos;
				float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
				if (sqrMagnitude < num)
				{
					num = sqrMagnitude;
					result = val;
				}
			}
			return result;
		}

		public static T InstantiateDisabled<T>(T original, Transform parent = null, bool worldPositionStays = false) where T : Object
		{
			if (!GetActiveState(original))
			{
				return Object.Instantiate<T>(original, parent, worldPositionStays);
			}
			(GameObject coreObject, Transform coreObjectTransform) tuple = CreateDisabledCoreObject(parent);
			GameObject item = tuple.coreObject;
			Transform item2 = tuple.coreObjectTransform;
			T val = Object.Instantiate<T>(original, item2, worldPositionStays);
			SetActiveState(val, state: false);
			SetParent(val, parent, worldPositionStays);
			Object.Destroy((Object)(object)item);
			return val;
		}

		public static T InstantiateDisabled<T>(T original, Vector3 position, Quaternion rotation, Transform parent = null) where T : Object
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			if (!GetActiveState(original))
			{
				return Object.Instantiate<T>(original, position, rotation, parent);
			}
			(GameObject coreObject, Transform coreObjectTransform) tuple = CreateDisabledCoreObject(parent);
			GameObject item = tuple.coreObject;
			Transform item2 = tuple.coreObjectTransform;
			T val = Object.Instantiate<T>(original, position, rotation, item2);
			SetActiveState(val, state: false);
			SetParent(val, parent, worldPositionStays: false);
			Object.Destroy((Object)(object)item);
			return val;
		}

		private static (GameObject coreObject, Transform coreObjectTransform) CreateDisabledCoreObject(Transform parent = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			GameObject val = new GameObject(string.Empty);
			val.SetActive(false);
			Transform transform = val.transform;
			transform.SetParent(parent);
			return (val, transform);
		}

		private static bool GetActiveState<T>(T @object) where T : Object
		{
			object obj = @object;
			GameObject val = (GameObject)((obj is GameObject) ? obj : null);
			if (val != null)
			{
				return val.activeSelf;
			}
			object obj2 = @object;
			Component val2 = (Component)((obj2 is Component) ? obj2 : null);
			if (val2 != null)
			{
				return val2.gameObject.activeSelf;
			}
			return false;
		}

		private static void SetActiveState<T>(T @object, bool state) where T : Object
		{
			object obj = @object;
			GameObject val = (GameObject)((obj is GameObject) ? obj : null);
			if (val == null)
			{
				object obj2 = @object;
				Component val2 = (Component)((obj2 is Component) ? obj2 : null);
				if (val2 != null)
				{
					val2.gameObject.SetActive(state);
				}
			}
			else
			{
				val.SetActive(state);
			}
		}

		private static void SetParent<T>(T @object, Transform parent, bool worldPositionStays) where T : Object
		{
			object obj = @object;
			GameObject val = (GameObject)((obj is GameObject) ? obj : null);
			if (val == null)
			{
				object obj2 = @object;
				Component val2 = (Component)((obj2 is Component) ? obj2 : null);
				if (val2 != null)
				{
					val2.transform.SetParent(parent, worldPositionStays);
				}
			}
			else
			{
				val.transform.SetParent(parent, worldPositionStays);
			}
		}
	}
}
namespace ThronefallMP.UI
{
	public abstract class BaseUI : MonoBehaviour
	{
		public Canvas Canvas { get; set; }

		public GameObject PanelRoot { get; set; }

		public bool Enabled
		{
			get
			{
				return PanelRoot.activeSelf;
			}
			set
			{
				PanelRoot.SetActive(value);
			}
		}

		public abstract string Name { get; }

		public abstract void ConstructPanelContent();

		public static T Create<T>(GameObject canvas, GameObject container) where T : BaseUI
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Temp", new Type[1] { typeof(RectTransform) });
			val.transform.SetParent(container.transform, false);
			T val2 = val.AddComponent<T>();
			val2.Canvas = canvas.GetComponent<Canvas>();
			val2.PanelRoot = val;
			((Object)val2.PanelRoot).name = val2.Name;
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 1f);
			component.offsetMin = new Vector2(0f, 0f);
			component.offsetMax = new Vector2(0f, 0f);
			val2.ConstructPanelContent();
			val2.Enabled = false;
			return val2;
		}
	}
	public static class UIHelper
	{
		public static GameObject CreateBox(GameObject root, string name, Color color)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, root);
			bool? childControlWidth = true;
			bool? childControlHeight = true;
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)null, (bool?)null, childControlWidth, childControlHeight, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			Image val2 = val.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = color;
			return val;
		}

		public static TextMeshProUGUI CreateText(GameObject root, string name, string text, TMP_FontAsset font = null)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, root);
			TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val2).text = text;
			((Graphic)val2).color = UIManager.TextColor;
			((TMP_Text)val2).font = (Object.op_Implicit((Object)(object)font) ? font : UIManager.DefaultFont);
			((TMP_Text)val2).fontSize = 24f;
			((TMP_Text)val2).alignment = (TextAlignmentOptions)514;
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			return val2;
		}

		public static ButtonControl CreateButton(GameObject root, string name, string text)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Expected O, but got Unknown
			GameObject val = CreateUIObject(name, root, new Vector2(25f, 25f));
			GameObject val2 = CreateUIObject("text", val);
			Button button = val.AddComponent<Button>();
			Navigation navigation = ((Selectable)button).navigation;
			((Navigation)(ref navigation)).mode = (Mode)4;
			Navigation navigation2 = navigation;
			((Selectable)button).navigation = navigation2;
			TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val3).text = text;
			((TMP_Text)val3).font = UIManager.DefaultFont;
			((TMP_Text)val3).alignment = (TextAlignmentOptions)514;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			((UnityEvent)button.onClick).AddListener((UnityAction)delegate
			{
				((Selectable)button).OnDeselect((BaseEventData)null);
			});
			SetLayoutElement(val, 20, 20);
			val.AddComponent<EventTrigger>();
			return val.AddComponent<ButtonControl>();
		}

		public static GameObject CreateCheck(GameObject root, string name, bool startsOn = false)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: 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_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, root, new Vector2(25f, 25f));
			Toggle val2 = val.AddComponent<Toggle>();
			((Graphic)val.AddComponent<Image>()).color = Color.clear;
			val2.isOn = startsOn;
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)10, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)3);
			Navigation navigation = ((Selectable)val2).navigation;
			((Navigation)(ref navigation)).mode = (Mode)4;
			Navigation navigation2 = navigation;
			((Selectable)val2).navigation = navigation2;
			GameObject val3 = CreateUIObject("checkmark", val);
			int? flexibleWidth = 0;
			int? flexibleHeight = 0;
			SetLayoutElement(val3, null, null, flexibleWidth, flexibleHeight);
			RectTransform component = CreateUIObject("background", val3).GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0.1f, 0.1f);
			component.anchorMax = new Vector2(0.9f, 0.9f);
			RectTransform component2 = CreateUIObject("check", val3).GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0.3f, 0.3f);
			component2.anchorMax = new Vector2(0.7f, 0.7f);
			Image val4 = val3.gameObject.AddComponent<Image>();
			val4.type = (Type)1;
			val4 = ((Component)component).gameObject.AddComponent<Image>();
			val4.type = (Type)1;
			val4 = ((Component)component2).gameObject.AddComponent<Image>();
			val4.type = (Type)1;
			return val;
		}

		public static ToggleControl CreateLeftToggle(GameObject root, string name, string text, bool startsOn = false)
		{
			//IL_0011: 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)
			GameObject val = CreateCheck(root, name, startsOn);
			GameObject val2 = CreateUIObject("text", val);
			TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val3).text = text;
			((TMP_Text)val3).font = UIManager.DefaultFont;
			((TMP_Text)val3).alignment = (TextAlignmentOptions)513;
			ContentSizeFitter val4 = val2.AddComponent<ContentSizeFitter>();
			val4.horizontalFit = (FitMode)2;
			val4.verticalFit = (FitMode)2;
			SetLayoutElement(val, 20, 20);
			val.AddComponent<EventTrigger>();
			return val.AddComponent<ToggleControl>();
		}

		public static ToggleControl CreateRightToggle(GameObject root, string name, string text, bool startsOn = false)
		{
			//IL_0011: 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)
			GameObject val = CreateCheck(root, name, startsOn);
			GameObject val2 = CreateUIObject("text", val);
			TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val3).text = text;
			((TMP_Text)val3).font = UIManager.DefaultFont;
			((TMP_Text)val3).alignment = (TextAlignmentOptions)513;
			ContentSizeFitter val4 = val2.AddComponent<ContentSizeFitter>();
			val4.horizontalFit = (FitMode)2;
			val4.verticalFit = (FitMode)2;
			val2.transform.SetSiblingIndex(0);
			SetLayoutElement(val, 20, 20);
			val.AddComponent<EventTrigger>();
			return val.AddComponent<ToggleControl>();
		}

		public static ToggleControl CreateToggle(GameObject root, string name, bool startsOn = false)
		{
			GameObject val = CreateCheck(root, name, startsOn);
			SetLayoutElement(val, 20, 20);
			val.AddComponent<EventTrigger>();
			return val.AddComponent<ToggleControl>();
		}

		public static TMP_InputField CreateInputField(GameObject panel, string name, string label, string value, int? labelWidth = null, int limit = 32, TMP_FontAsset font = null)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Expected O, but got Unknown
			//IL_029d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_030b: Unknown result type (might be due to invalid IL or missing references)
			//IL_034c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0362: Unknown result type (might be due to invalid IL or missing references)
			//IL_0378: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name + "Group", panel);
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)false, (int?)20, (int?)5, (int?)5, (int?)5, (int?)5, (TextAnchor?)(TextAnchor)3);
			int? flexibleWidth = 1;
			SetLayoutElement(val, null, null, flexibleWidth);
			if (label != null)
			{
				GameObject val2 = CreateBox(val, name + "_label_bg", Color.clear);
				bool? childControlWidth = true;
				TextAnchor? childAlignment = (TextAnchor)3;
				UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)null, (bool?)null, childControlWidth, (bool?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, childAlignment);
				GameObject gameObject = val2.gameObject;
				flexibleWidth = 0;
				SetLayoutElement(gameObject, labelWidth, null, flexibleWidth);
				val2.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
				TextMeshProUGUI val3 = CreateText(val2, name + "_label", label + ": ", font);
				((TMP_Text)val3).alignment = (TextAlignmentOptions)513;
			}
			GameObject val4 = CreateBox(val, name + "_bg", new Color(0.2f, 0.2f, 0.2f));
			flexibleWidth = 1;
			SetLayoutElement(val4, null, null, flexibleWidth);
			val4.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			TMP_InputField val5 = val4.AddComponent<TMP_InputField>();
			val5.textViewport = ((Component)((Component)val5).transform.parent).GetComponent<RectTransform>();
			((Selectable)val5).targetGraphic = (Graphic)(object)val4.GetComponent<Image>();
			GameObject val6 = new GameObject("area", new Type[1] { typeof(RectTransform) });
			val5.textViewport = val6.GetComponent<RectTransform>();
			val6.transform.SetParent(val4.transform);
			((Transform)val5.textViewport).localPosition = Vector3.zero;
			val5.textViewport.anchorMin = new Vector2(0f, 0f);
			val5.textViewport.anchorMax = new Vector2(1f, 1f);
			val6.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			TextMeshProUGUI val7 = CreateText(val6, name ?? "", value ?? "", font);
			((Graphic)val7).color = UIManager.TextColor;
			((TMP_Text)val7).fontSize = 20f;
			val5.textComponent = (TMP_Text)(object)val7;
			val5.text = ((TMP_Text)val7).text;
			val5.characterLimit = limit;
			RectTransform component = ((Component)val7).GetComponent<RectTransform>();
			((Transform)component).localPosition = Vector3.zero;
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 1f);
			val5.onFocusSelectAll = false;
			return val5;
		}

		public static void AddEvent(GameObject button, EventTriggerType type, UnityAction<BaseEventData> action)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			EventTrigger component = button.GetComponent<EventTrigger>();
			TriggerEvent val = new TriggerEvent();
			((UnityEvent<BaseEventData>)(object)val).AddListener(action);
			component.triggers.Add(new Entry
			{
				eventID = type,
				callback = val
			});
		}

		public static T SetLayoutGroup<T>(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			T val = gameObject.GetComponent<T>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<T>();
			}
			return SetLayoutGroup(val, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment);
		}

		public static T SetLayoutGroup<T>(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			if (forceWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandWidth = forceWidth.Value;
			}
			if (forceHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandHeight = forceHeight.Value;
			}
			if (childControlWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlWidth(childControlWidth.Value);
			}
			if (childControlHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlHeight(childControlHeight.Value);
			}
			if (spacing.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).spacing = spacing.Value;
			}
			if (padTop.HasValue)
			{
				((LayoutGroup)(object)group).padding.top = padTop.Value;
			}
			if (padBottom.HasValue)
			{
				((LayoutGroup)(object)group).padding.bottom = padBottom.Value;
			}
			if (padLeft.HasValue)
			{
				((LayoutGroup)(object)group).padding.left = padLeft.Value;
			}
			if (padRight.HasValue)
			{
				((LayoutGroup)(object)group).padding.right = padRight.Value;
			}
			if (childAlignment.HasValue)
			{
				((LayoutGroup)(object)group).childAlignment = childAlignment.Value;
			}
			return group;
		}

		public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name)
			{
				layer = 5,
				hideFlags = (HideFlags)61
			};
			if (Object.op_Implicit((Object)(object)parent))
			{
				val.transform.SetParent(parent.transform, false);
			}
			val.AddComponent<RectTransform>().sizeDelta = sizeDelta;
			return val;
		}

		public static LayoutElement SetLayoutElement(GameObject gameObject, int? minWidth = null, int? minHeight = null, int? flexibleWidth = null, int? flexibleHeight = null, int? preferredWidth = null, int? preferredHeight = null, bool? ignoreLayout = null)
		{
			LayoutElement val = gameObject.GetComponent<LayoutElement>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<LayoutElement>();
			}
			if (minWidth.HasValue)
			{
				val.minWidth = minWidth.Value;
			}
			if (minHeight.HasValue)
			{
				val.minHeight = minHeight.Value;
			}
			if (flexibleWidth.HasValue)
			{
				val.flexibleWidth = flexibleWidth.Value;
			}
			if (flexibleHeight.HasValue)
			{
				val.flexibleHeight = flexibleHeight.Value;
			}
			if (preferredWidth.HasValue)
			{
				val.preferredWidth = preferredWidth.Value;
			}
			if (preferredHeight.HasValue)
			{
				val.preferredHeight = preferredHeight.Value;
			}
			if (ignoreLayout.HasValue)
			{
				val.ignoreLayout = ignoreLayout.Value;
			}
			return val;
		}

		public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
		{
			group.childControlHeight = value;
		}

		public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
		{
			group.childControlWidth = value;
		}
	}
	public static class UIManager
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static UnityAction <>9__34_0;

			internal void <Initialize>b__34_0()
			{
				LobbyListPanel.Open();
				TitleScreen.SetActive(false);
			}
		}

		public static bool ExitHandled = false;

		public static readonly Color DarkBackgroundColor = new Color(0.06f, 0.06f, 0.06f, 1f);

		public static readonly Color BackgroundColor = new Color(0.11f, 0.11f, 0.11f, 1f);

		public static readonly Color TransparentBackgroundColor = new Color(0f, 0f, 0f, 0.3f);

		public static readonly Color SelectedTransparentBackgroundColor = new Color(0.2f, 0.2f, 0.2f, 0.3f);

		public static readonly Color TextColor = new Color(0.78f, 0.65f, 0.46f, 1f);

		public static readonly Color ButtonTextColor = new Color(0.97f, 0.88f, 0.75f, 1f);

		public static readonly Color NoninteractiveButtonTextColor = new Color(0.3f, 0.3f, 0.4f, 1f);

		public static readonly Color ButtonHoverTextColor = new Color(0f, 0.41f, 0.11f);

		public static readonly Color ExitButtonColor = new Color(0.176f, 0.165f, 0.149f);

		public static TMP_FontAsset DefaultFont;

		private static bool _initialized;

		private static GameObject _canvas;

		private static GameObject _container;

		public static GameObject TitleScreen { get; private set; }

		public static LobbyListPanel LobbyListPanel { get; private set; }

		public static HostPanel HostPanel { get; private set; }

		public static ChatPanel ChatPanel { get; private set; }

		public static GameStatusPanel GameStatusPanel { get; private set; }

		public static void Initialize()
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Expected O, but got Unknown
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			if (_initialized)
			{
				return;
			}
			_canvas = GameObject.Find("UI Canvas");
			if ((Object)(object)_canvas.GetComponent<StandaloneInputModule>() == (Object)null)
			{
				_canvas.AddComponent<StandaloneInputModule>();
			}
			_container = new GameObject("Mod UI", new Type[1] { typeof(RectTransform) });
			RectTransform component = _container.GetComponent<RectTransform>();
			((Transform)component).SetParent(_canvas.transform, false);
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 1f);
			component.offsetMin = new Vector2(0f, 0f);
			component.offsetMax = new Vector2(0f, 0f);
			TitleScreen = GameObject.Find("UI Canvas/Title Frame").gameObject;
			ThronefallUIElement component2 = ((Component)TitleScreen.transform.Find("Menu Items/Play")).GetComponent<ThronefallUIElement>();
			ThronefallUIElement component3 = ((Component)TitleScreen.transform.Find("Menu Items/Settings")).GetComponent<ThronefallUIElement>();
			DefaultFont = ((TMP_Text)((Component)component3).GetComponent<TextMeshProUGUI>()).font;
			LobbyListPanel = BaseUI.Create<LobbyListPanel>(_canvas, _container);
			HostPanel = BaseUI.Create<HostPanel>(_canvas, _container);
			ChatPanel = BaseUI.Create<ChatPanel>(_canvas, _container);
			GameStatusPanel = BaseUI.Create<GameStatusPanel>(_canvas, _container);
			ChatPanel.Enabled = true;
			GameStatusPanel.Enabled = true;
			GameObject val = Helpers.InstantiateDisabled<GameObject>(((Component)component3).gameObject, ((Component)component3).transform.parent, worldPositionStays: false);
			((Object)val).name = "Multiplayer";
			val.transform.SetSiblingIndex(1);
			Object.DestroyImmediate((Object)(object)val.GetComponent<Localize>());
			TextMeshProUGUI component4 = val.GetComponent<TextMeshProUGUI>();
			((TMP_Text)component4).text = "Multiplayer";
			TFUITextButton component5 = val.GetComponent<TFUITextButton>();
			((UnityEventBase)((ThronefallUIElement)component5).onSelectionStateChange).m_PersistentCalls.m_Calls.Clear();
			((UnityEventBase)((ThronefallUIElement)component5).onApply).m_PersistentCalls.m_Calls.Clear();
			UnityEvent onApply = ((ThronefallUIElement)component5).onApply;
			object obj = <>c.<>9__34_0;
			if (obj == null)
			{
				UnityAction val2 = delegate
				{
					LobbyListPanel.Open();
					TitleScreen.SetActive(false);
				};
				<>c.<>9__34_0 = val2;
				obj = (object)val2;
			}
			onApply.AddListener((UnityAction)obj);
			((ThronefallUIElement)component5).rightNav = component3;
			if (SteamManager.Initialized)
			{
				component2.rightNav = (ThronefallUIElement)(object)component5;
				component3.leftNav = (ThronefallUIElement)(object)component5;
			}
			else
			{
				((ThronefallUIElement)component5).ignoreMouse = true;
				((ThronefallUIElement)component5).cannotBeSelected = true;
				((Graphic)component4).color = NoninteractiveButtonTextColor;
			}
			val.SetActive(true);
			_initialized = true;
		}

		public static void CloseAllPanels()
		{
			LobbyListPanel.Enabled = false;
			HostPanel.Enabled = false;
		}

		public static WeaponDialog CreateWeaponDialog()
		{
			WeaponDialog weaponDialog = BaseUI.Create<WeaponDialog>(_canvas, _container);
			weaponDialog.Enabled = true;
			return weaponDialog;
		}

		public static PasswordDialog CreatePasswordDialog(PasswordDialog.Confirm confirm, PasswordDialog.Cancel cancel)
		{
			PasswordDialog passwordDialog = BaseUI.Create<PasswordDialog>(_canvas, _container);
			passwordDialog.OnConfirm = (PasswordDialog.Confirm)Delegate.Combine(passwordDialog.OnConfirm, confirm);
			passwordDialog.OnCancel = (PasswordDialog.Cancel)Delegate.Combine(passwordDialog.OnCancel, cancel);
			passwordDialog.Enabled = true;
			return passwordDialog;
		}

		public static MessageDialog CreateMessageDialog(string title, string message, string button = null, Color? color = null, MessageDialog.ClickDelegate onClick = null)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			MessageDialog messageDialog = BaseUI.Create<MessageDialog>(_canvas, _container);
			messageDialog.Title = title;
			messageDialog.Message = message;
			if (color.HasValue)
			{
				messageDialog.Color = color.Value;
			}
			if (button != null)
			{
				messageDialog.ButtonText = button;
			}
			if (onClick != null)
			{
				messageDialog.OnClick = (MessageDialog.ClickDelegate)Delegate.Combine(messageDialog.OnClick, onClick);
			}
			messageDialog.Enabled = true;
			return messageDialog;
		}
	}
}
namespace ThronefallMP.UI.Panels
{
	public class ChatPanel : BaseUI
	{
		private class Message
		{
			public GameObject Line;

			public TMP_Text Text;

			public float Time;

			public bool Faded;
		}

		private const int MaxLines = 8;

		private const float MessageTimeout = 3f;

		private const float MessageFadeTime = 0.5f;

		private static readonly Color BackgroundColor = new Color(0.07f, 0.07f, 0.07f, 1f);

		private static readonly Color InputColor = new Color(0.9f, 0.9f, 0.9f, 1f);

		private static readonly Color ChatColor = new Color(0.9f, 0.9f, 0.9f, 1f);

		private static readonly Color32 ChatBorderColor = new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue);

		private GameObject _container;

		private GameObject _chatBoxContainer;

		private TMP_InputField _chatBox;

		private readonly List<Message> _lines = new List<Message>();

		private TMP_FontAsset _chatBoxFont;

		private TMP_FontAsset _chatFont;

		private bool _justClosed;

		public override string Name => "Chat Panel";

		private Font CreateFont()
		{
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Expected O, but got Unknown
			Dictionary<string, int> dictionary = new Dictionary<string, int>
			{
				{ "arial", 0 },
				{ "times", 1 },
				{ "verdana", 2 },
				{ "cour", 3 }
			};
			int num = int.MaxValue;
			string text = Font.GetPathsToOSFonts()[0];
			string[] pathsToOSFonts = Font.GetPathsToOSFonts();
			foreach (string text2 in pathsToOSFonts)
			{
				string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text2);
				if (dictionary.TryGetValue(fileNameWithoutExtension, out var value) && value < num)
				{
					text = text2;
					num = value;
					if (num == 0)
					{
						break;
					}
				}
			}
			Plugin.Log.LogInfo((object)("Loaded font '" + text + "' for chat messages."));
			return new Font(text);
		}

		public override void ConstructPanelContent()
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			Font val = CreateFont();
			_chatBoxFont = TMP_FontAsset.CreateFontAsset(val, 90, 9, (GlyphRenderMode)4165, 1024, 1024, (AtlasPopulationMode)1, true);
			_chatFont = TMP_FontAsset.CreateFontAsset(val, 90, 9, (GlyphRenderMode)4165, 1024, 1024, (AtlasPopulationMode)1, true);
			ShaderUtilities.GetShaderPropertyIDs();
			((TMP_Asset)_chatFont).material.EnableKeyword(ShaderUtilities.Keyword_Outline);
			((TMP_Asset)_chatFont).material.SetFloat(ShaderUtilities.ID_FaceDilate, 0.3f);
			_container = UIHelper.CreateUIObject("container", base.PanelRoot);
			RectTransform component = _container.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.5f);
			component.anchorMax = new Vector2(0.35f, 0.8f);
			UIHelper.SetLayoutGroup<VerticalLayoutGroup>(_container, (bool?)true, (bool?)false, (bool?)true, (bool?)true, (int?)0, (int?)10, (int?)10, (int?)10, (int?)10, (TextAnchor?)(TextAnchor)6);
			GameObject val2 = UIHelper.CreateUIObject("chat_box_container", base.PanelRoot);
			RectTransform component2 = val2.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0.4f, 0.4f);
			component2.anchorMax = new Vector2(0.6f, 0.5f);
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)true, (bool?)false, (bool?)true, (bool?)true, (int?)0, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)4);
			TMP_FontAsset chatBoxFont = _chatBoxFont;
			_chatBox = UIHelper.CreateInputField(val2, "chat_box", null, "", null, 32, chatBoxFont);
			((Component)_chatBox).gameObject.AddComponent<Mask>();
			((Graphic)_chatBox.textComponent).color = InputColor;
			_chatBox.textComponent.alignment = (TextAlignmentOptions)513;
			_chatBox.characterLimit = 0;
			_chatBox.lineLimit = 1;
			((UnityEvent<string>)(object)_chatBox.onSubmit).AddListener((UnityAction<string>)OnSendMessage);
			_chatBoxContainer = ((Component)((Component)_chatBox).transform.parent).gameObject;
			Image val3 = _chatBoxContainer.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = BackgroundColor;
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(_chatBoxContainer, (bool?)true, (bool?)false, (bool?)true, (bool?)false, (int?)0, (int?)3, (int?)3, (int?)3, (int?)3, (TextAnchor?)(TextAnchor)4);
			RectTransform component3 = _chatBoxContainer.GetComponent<RectTransform>();
			LayoutRebuilder.ForceRebuildLayoutImmediate(component3);
			_chatBoxContainer.SetActive(false);
			Plugin.Instance.Network.AddChatMessageHandler(0, OnMessageReceived);
		}

		public void Update()
		{
			if (!Plugin.Instance.Network.Online)
			{
				foreach (Message line in _lines)
				{
					Object.Destroy((Object)(object)line.Line);
				}
				_lines.Clear();
				return;
			}
			foreach (Message line2 in _lines)
			{
				if (line2.Faded && _chatBoxContainer.activeSelf)
				{
					line2.Time = Time.unscaledTime;
					((Graphic)line2.Text).CrossFadeAlpha(1f, 0f, true);
					line2.Faded = false;
				}
				else if (!line2.Faded && line2.Time + 3f < Time.unscaledTime)
				{
					((Graphic)line2.Text).CrossFadeAlpha(0f, 0.5f, true);
					line2.Faded = true;
				}
			}
			if (!_chatBoxContainer.activeSelf)
			{
				if (_justClosed)
				{
					_justClosed = Input.GetKeyDown((KeyCode)13);
				}
				else if (Input.GetKeyDown((KeyCode)13))
				{
					_chatBoxContainer.SetActive(true);
					LocalGamestate.Instance.SetPlayerFreezeState(true);
				}
			}
			else if (!_chatBox.isFocused)
			{
				((Selectable)_chatBox).Select();
				_chatBox.ActivateInputField();
			}
		}

		private void OnSendMessage(string text)
		{
			if (!string.IsNullOrEmpty(text))
			{
				Plugin.Instance.Network.SendChatMessage(text);
			}
			_chatBox.text = "";
			_chatBoxContainer.SetActive(false);
			LocalGamestate.Instance.SetPlayerFreezeState(false);
			_justClosed = true;
		}

		private bool OnMessageReceived(string user, string message)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			while (_lines.Count >= 8)
			{
				Message message2 = _lines[0];
				_lines.RemoveAt(0);
				Object.Destroy((Object)(object)message2.Line);
			}
			TextMeshProUGUI val = UIHelper.CreateText(_container, "message", user + ": " + message, _chatFont);
			((TMP_Text)val).alignment = (TextAlignmentOptions)513;
			((Graphic)val).color = ChatColor;
			((TMP_Text)val).fontSize = 20f;
			((TMP_Text)val).outlineColor = ChatBorderColor;
			((TMP_Text)val).outlineWidth = 0.3f;
			_lines.Add(new Message
			{
				Line = ((Component)val).gameObject,
				Text = (TMP_Text)(object)val,
				Time = Time.unscaledTime
			});
			return true;
		}
	}
	public class GameStatusPanel : BaseUI
	{
		private static readonly Color BackgroundColor = new Color(0.11f, 0.11f, 0.11f, 0.95f);

		private static readonly Color EntryColor = new Color(0.2f, 0.2f, 0.2f, 1f);

		private GameObject _playerList;

		public override string Name => "Game Status Panel";

		public override void ConstructPanelContent()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: 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_0162: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIHelper.CreateUIObject("container", base.PanelRoot);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.5f);
			component.anchorMax = new Vector2(0.25f, 1f);
			UIHelper.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)true, (bool?)false, (bool?)true, (bool?)true, (int?)0, (int?)10, (int?)10, (int?)10, (int?)10, (TextAnchor?)(TextAnchor)0);
			_playerList = UIHelper.CreateUIObject("background", val);
			_playerList.AddComponent<Mask>();
			Image val2 = _playerList.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = BackgroundColor;
			RectTransform component2 = _playerList.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			UIHelper.SetLayoutGroup<VerticalLayoutGroup>(_playerList, (bool?)true, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)10, (int?)10, (int?)10, (int?)10, (TextAnchor?)(TextAnchor)0);
			GameObject val3 = UIHelper.CreateUIObject("player_header", _playerList);
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val3, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)0, (int?)0, (int?)0, (int?)15, (int?)15, (TextAnchor?)(TextAnchor)1);
			TextMeshProUGUI val4 = UIHelper.CreateText(val3, "name", "Name", UIManager.DefaultFont);
			((TMP_Text)val4).alignment = (TextAlignmentOptions)513;
			((Component)val4).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			GameObject gameObject = ((Component)val4).gameObject;
			int? flexibleWidth = 1;
			UIHelper.SetLayoutElement(gameObject, null, null, flexibleWidth);
			TextMeshProUGUI val5 = UIHelper.CreateText(val3, "ping", "Ping", UIManager.DefaultFont);
			((TMP_Text)val5).alignment = (TextAlignmentOptions)514;
			((Component)val5).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			UIHelper.SetLayoutElement(((Component)val5).gameObject, 40);
			LayoutRebuilder.ForceRebuildLayoutImmediate(_playerList.GetComponent<RectTransform>());
			foreach (PlayerManager.Player allPlayer in Plugin.Instance.PlayerManager.GetAllPlayers())
			{
				CreatePlayerLine(allPlayer);
			}
			Plugin.Instance.PlayerManager.OnPlayerAdded += CreatePlayerLine;
			LayoutRebuilder.ForceRebuildLayoutImmediate(_playerList.GetComponent<RectTransform>());
			_playerList.SetActive(false);
		}

		private void Update()
		{
			if (Plugin.Instance.Network.Online && Input.GetKeyDown((KeyCode)96))
			{
				_playerList.SetActive(!_playerList.activeSelf);
				Plugin.Log.LogInfo((object)$"List toggled {_playerList.activeSelf}");
			}
		}

		public void CreatePlayerLine(PlayerManager.Player player)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIHelper.CreateBox(_playerList, $"player_{player.Id}", EntryColor);
			val.SetActive(false);
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)5, (int?)5, (int?)15, (int?)15, (TextAnchor?)(TextAnchor)4);
			GameObject val2 = UIHelper.CreateUIObject("is_host", val);
			Image val3 = val2.AddComponent<Image>();
			val3.type = (Type)3;
			Texture2D crown = Plugin.Instance.TextureRepository.Crown;
			val3.sprite = Sprite.Create(crown, new Rect(0f, 0f, (float)((Texture)crown).width, (float)((Texture)crown).height), new Vector2(0.5f, 0.5f));
			UIHelper.SetLayoutElement(val2, 24);
			TextMeshProUGUI val4 = UIHelper.CreateText(val, "name", "", UIManager.DefaultFont);
			((TMP_Text)val4).alignment = (TextAlignmentOptions)513;
			((Component)val4).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			GameObject gameObject = ((Component)val4).gameObject;
			int? flexibleWidth = 1;
			UIHelper.SetLayoutElement(gameObject, null, null, flexibleWidth);
			TextMeshProUGUI val5 = UIHelper.CreateText(val, "ping", "", UIManager.DefaultFont);
			((TMP_Text)val5).alignment = (TextAlignmentOptions)514;
			((Component)val5).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			UIHelper.SetLayoutElement(((Component)val5).gameObject, 40);
			PlayerInfoControl playerInfoControl = val.AddComponent<PlayerInfoControl>();
			playerInfoControl.playerId = player.Id;
			playerInfoControl.hostIdentifier = val2;
			playerInfoControl.container = val;
			playerInfoControl.playerName = (TMP_Text)(object)val4;
			playerInfoControl.ping = (TMP_Text)(object)val5;
			val.SetActive(true);
			LayoutRebuilder.ForceRebuildLayoutImmediate(_playerList.GetComponent<RectTransform>());
		}
	}
	public class HostPanel : BaseUI
	{
		private struct LobbyCreationRequest
		{
			public string Name;

			public string Password;

			public int MaxPlayers;

			public bool CheatsEnabled;

			public ELobbyType Type;
		}

		private const int LabelWidth = 140;

		private readonly CallResult<LobbyCreated_t> _onLobbyCreatedCallResult;

		private LobbyCreationRequest? _currentRequest;

		private GameObject _window;

		public override string Name => "Host Panel";

		public ButtonControl Host { get; private set; }

		public HostPanel()
		{
			if (SteamManager.Initialized)
			{
				_onLobbyCreatedCallResult = CallResult<LobbyCreated_t>.Create((APIDispatchDelegate<LobbyCreated_t>)OnLobbyCreated);
			}
		}

		public override void ConstructPanelContent()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: 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_0393: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_04da: Unknown result type (might be due to invalid IL or missing references)
			//IL_04df: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_050e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0513: Unknown result type (might be due to invalid IL or missing references)
			//IL_0534: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIHelper.CreateUIObject("background", base.PanelRoot);
			Image val2 = val.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = UIManager.TransparentBackgroundColor;
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 1f);
			_window = UIHelper.CreateUIObject("panel", val);
			Image val3 = _window.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = UIManager.DarkBackgroundColor;
			UIHelper.SetLayoutGroup<VerticalLayoutGroup>(_window, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)5, (int?)5, (int?)5, (int?)5, (TextAnchor?)(TextAnchor)3);
			RectTransform component2 = _window.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0.35f, 0.3f);
			component2.anchorMax = new Vector2(0.65f, 0.7f);
			GameObject val4 = UIHelper.CreateUIObject("panel", _window);
			Image val5 = val4.AddComponent<Image>();
			val5.type = (Type)1;
			((Graphic)val5).color = UIManager.BackgroundColor;
			UIHelper.SetLayoutGroup<VerticalLayoutGroup>(val4, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)20, (int?)80, (int?)60, (int?)60, (TextAnchor?)(TextAnchor)3);
			RectTransform component3 = val4.GetComponent<RectTransform>();
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			string text = (SteamManager.Initialized ? SteamFriends.GetPersonaName() : "Unavailable");
			TMP_InputField nameField = UIHelper.CreateInputField(val4, "name", "Name", text + "'s Game", 140, 24);
			TMP_InputField passwordField = UIHelper.CreateInputField(val4, "password", "Password", "", 140, 24);
			passwordField.contentType = (ContentType)7;
			TMP_InputField maxPlayersField = UIHelper.CreateInputField(val4, "max_players", "Players", "8", 140, 2);
			maxPlayersField.contentType = (ContentType)3;
			ToggleControl friendsOnlyToggle = CreateToggle(val4, "friends_only", "Friends Only", value: false);
			ToggleControl enableCheatsToggle = CreateToggle(val4, "cheats_enabled", "Enable Cheats", value: false);
			GameObject val6 = UIHelper.CreateUIObject("buttons", val4);
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val6, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)20, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)4);
			bool? ignoreLayout = true;
			UIHelper.SetLayoutElement(val6, null, null, null, null, null, null, ignoreLayout);
			RectTransform component4 = val6.GetComponent<RectTransform>();
			component4.anchorMin = new Vector2(0f, 0.1f);
			component4.anchorMax = new Vector2(1f, 0.3f);
			Host = UIHelper.CreateButton(val6, "host", "Host");
			UIHelper.SetLayoutElement(((Component)Host).gameObject, 100);
			Host.OnClick += delegate
			{
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				Plugin.Log.LogInfo((object)("Creating " + (friendsOnlyToggle.Toggle.isOn ? "friends only" : "public") + " lobby"));
				CreateLobby(new LobbyCreationRequest
				{
					Name = nameField.text,
					MaxPlayers = int.Parse(maxPlayersField.text),
					Password = passwordField.text,
					CheatsEnabled = enableCheatsToggle.Toggle.isOn,
					Type = (ELobbyType)(friendsOnlyToggle.Toggle.isOn ? 1 : 2)
				});
				ThronefallAudioManager.Oneshot((AudioOneShot)11);
			};
			ButtonControl buttonControl = UIHelper.CreateButton(val6, "back", "Back");
			UIHelper.SetLayoutElement(((Component)buttonControl).gameObject, 100);
			buttonControl.OnClick += delegate
			{
				base.Enabled = false;
				((Selectable)UIManager.LobbyListPanel.Host.Button).Select();
				ThronefallAudioManager.Oneshot((AudioOneShot)11);
			};
			TMP_InputField obj = nameField;
			Navigation navigation = ((Selectable)nameField).navigation;
			((Navigation)(ref navigation)).selectOnDown = (Selectable)(object)passwordField;
			((Navigation)(ref navigation)).selectOnUp = (Selectable)(object)Host.Button;
			((Selectable)obj).navigation = navigation;
			TMP_InputField obj2 = passwordField;
			navigation = ((Selectable)passwordField).navigation;
			((Navigation)(ref navigation)).selectOnDown = (Selectable)(object)maxPlayersField;
			((Navigation)(ref navigation)).selectOnUp = (Selectable)(object)nameField;
			((Selectable)obj2).navigation = navigation;
			TMP_InputField obj3 = maxPlayersField;
			navigation = ((Selectable)maxPlayersField).navigation;
			((Navigation)(ref navigation)).selectOnDown = (Selectable)(object)friendsOnlyToggle.Toggle;
			((Navigation)(ref navigation)).selectOnUp = (Selectable)(object)passwordField;
			((Selectable)obj3).navigation = navigation;
			friendsOnlyToggle.NavUp = (Selectable)(object)maxPlayersField;
			friendsOnlyToggle.NavDown = (Selectable)(object)Host.Button;
			Host.NavUp = (Selectable)(object)friendsOnlyToggle.Toggle;
			Host.NavDown = (Selectable)(object)nameField;
			Host.NavLeft = (Selectable)(object)buttonControl.Button;
			Host.NavRight = (Selectable)(object)buttonControl.Button;
			buttonControl.NavUp = (Selectable)(object)friendsOnlyToggle.Toggle;
			buttonControl.NavDown = (Selectable)(object)nameField;
			buttonControl.NavLeft = (Selectable)(object)Host.Button;
			buttonControl.NavRight = (Selectable)(object)Host.Button;
			LayoutRebuilder.ForceRebuildLayoutImmediate(_window.GetComponent<RectTransform>());
		}

		private static ToggleControl CreateToggle(GameObject panel, string name, string label, bool value)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIHelper.CreateUIObject(name + "Group", panel);
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)false, (int?)20, (int?)5, (int?)5, (int?)5, (int?)5, (TextAnchor?)(TextAnchor)3);
			int? flexibleWidth = 1;
			UIHelper.SetLayoutElement(val, null, null, flexibleWidth);
			GameObject val2 = UIHelper.CreateBox(val, name + "_label_bg", Color.clear);
			GameObject gameObject = val2;
			bool? childControlWidth = true;
			TextAnchor? childAlignment = (TextAnchor)3;
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(gameObject, (bool?)null, (bool?)null, childControlWidth, (bool?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, childAlignment);
			GameObject gameObject2 = val2.gameObject;
			int? minWidth = 140;
			flexibleWidth = 0;
			UIHelper.SetLayoutElement(gameObject2, minWidth, null, flexibleWidth);
			val2.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			TextMeshProUGUI val3 = UIHelper.CreateText(val2, name + "_label", label + ": ");
			((TMP_Text)val3).alignment = (TextAlignmentOptions)513;
			val2 = UIHelper.CreateBox(val, name + "_bg", Color.clear);
			GameObject gameObject3 = val2;
			childControlWidth = true;
			childAlignment = (TextAnchor)4;
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(gameObject3, (bool?)null, (bool?)null, childControlWidth, (bool?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, childAlignment);
			GameObject gameObject4 = val2.gameObject;
			flexibleWidth = 1;
			UIHelper.SetLayoutElement(gameObject4, null, null, flexibleWidth);
			val2.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			ToggleControl toggleControl = UIHelper.CreateToggle(val2, name ?? "", value);
			GameObject gameObject5 = ((Component)toggleControl).gameObject;
			childAlignment = (TextAnchor)4;
			UIHelper.SetLayoutGroup<HorizontalLayoutGroup>(gameObject5, (bool?)null, (bool?)null, (bool?)null, (bool?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, childAlignment);
			return toggleControl;
		}

		public void Update()
		{
			if (!UIManager.ExitHandled && Input.GetKeyDown((KeyCode)27))
			{
				base.Enabled = false;
				UIManager.ExitHandled = true;
				ThronefallAudioManager.Oneshot((AudioOneShot)11);
			}
		}

		private bool CreateLobby(LobbyCreationRequest request)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			if (_currentRequest.HasValue)
			{
				return false;
			}
			_window.SetActive(false);
			_currentRequest = request;
			if (request.Password == string.Empty)
			{
				request.Password = null;
			}
			_onLobbyCreatedCallResult.Set(SteamMatchmaking.CreateLobby(request.Type, request.MaxPlayers), (APIDispatchDelegate<LobbyCreated_t>)null);
			return true;
		}

		private void OnLobbyCreated(LobbyCreated_t created, bool ioFailure)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Invalid comparison between Unknown and I4
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: 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_00d8: 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_0126: Unknown result type (might be due to invalid IL or missing references)
			_window.SetActive(true);
			if (ioFailure)
			{
				UIManager.CreateMessageDialog("Error creating lobby", "Lobby creation failed with io error'");
				return;
			}
			if ((int)created.m_eResult != 1)
			{
				UIManager.CreateMessageDialog("Error creating lobby", $"Lobby creation failed with error '{created.m_eResult}'");
				return;
			}
			CSteamID id = new CSteamID(created.m_ulSteamIDLobby);
			string password = _currentRequest.Value.Password;
			string text = (string.IsNullOrEmpty(password) ? "no" : "yes");
			SteamMatchmaking.SetLobbyData(id, "name", _currentRequest.Value.Name);
			SteamMatchmaking.SetLobbyData(id, "password", text);
			SteamMatchmaking.SetLobbyData(id, "version", "thronefall_mp_1.0.5");
			SteamMatchmaking.SetLobbyData(id, "cheats_enabled", _curr