Decompiled source of BetterPlayerDistance v0.1.17

BetterPlayerDistance.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[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("BetterPlayerDistance")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("High Performance Distance Display")]
[assembly: AssemblyFileVersion("0.1.16.0")]
[assembly: AssemblyInformationalVersion("0.1.16+c785f022e43b3a8daf7dabdeecb08500b5364cde")]
[assembly: AssemblyProduct("BetterPlayerDistance")]
[assembly: AssemblyTitle("BetterPlayerDistance")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.16.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 BetterPlayerDistance
{
	public enum TriggerModeEnum
	{
		Toggle,
		Hold,
		AlwaysOn
	}
	public static class Configuration
	{
		public static ConfigEntry<bool> ShowName;

		public static ConfigEntry<bool> ShowDistance;

		public static ConfigEntry<KeyCode> ToggleKey;

		public static ConfigEntry<TriggerModeEnum> TriggerMode;

		public static ConfigEntry<float> ToggleDuration;

		public static ConfigEntry<float> HoldKeepDuration;

		public static ConfigEntry<float> MinDistance;

		public static ConfigEntry<float> MaxDistance;

		public static ConfigEntry<float> NameFontSize;

		public static ConfigEntry<float> DistFontSize;

		public static ConfigEntry<float> GlobalOpacity;

		public static ConfigEntry<bool> EnableDownedLabel;

		public static ConfigEntry<bool> UseDownedIcon;

		public static ConfigEntry<bool> EnableDownedEdgeIndicator;

		public static ConfigEntry<float> DownedFontSize;

		public static ConfigEntry<float> DownedIconSize;

		public static ConfigEntry<float> DownedEdgeIconSize;

		public const float FixedShadowSpread = 1.5f;

		public const float FixedShadowAlpha = 0.8f;

		public const float FixedDownedEdgeMargin = 60f;

		public const float FixedDownedBreathPeriod = 1.5f;

		public const float FixedDownedBreathMinAlpha = 0.6f;

		public const float FixedDownedDeadMarkerDuration = 5f;

		public const bool FixedHighQuality = false;

		public static readonly Color FixedShadowColor = new Color(0.267f, 0.275f, 0.216f, 1f);

		public static ConfigEntry<bool> DebugMode;

		public static ConfigEntry<KeyCode> DebugMenuKey;

		public static ConfigEntry<bool> DisableTMPWarnings;

		private const string CAT_BASIC = "1. 基础 (Basic)";

		private const string CAT_UI = "2. 界面 (UI)";

		private const string CAT_DEBUG = "3. 调试 (Debug)";

		public static void Initialize(ConfigFile config)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Expected O, but got Unknown
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Expected O, but got Unknown
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Expected O, but got Unknown
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Expected O, but got Unknown
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Expected O, but got Unknown
			ToggleKey = config.Bind<KeyCode>("1. 基础 (Basic)", "快捷键 (Hotkey)", (KeyCode)99, "显示/隐藏玩家标签的按键;Hold/Toggle/AlwaysOn 三种模式均可用。\nHotkey to show/hide player labels; works in all three modes (Hold/Toggle/AlwaysOn).");
			TriggerMode = config.Bind<TriggerModeEnum>("1. 基础 (Basic)", "显示模式 (Display Mode)", TriggerModeEnum.Hold, new ConfigDescription("Hold=按住显示;Toggle=切换开关;AlwaysOn=常显(默认全程显示,可按快捷键手动隐藏/恢复)。\nHold = press to show; Toggle = press to switch; AlwaysOn = always-on by default, hotkey toggles a user-hide flag.", (AcceptableValueBase)null, Array.Empty<object>()));
			ToggleDuration = config.Bind<float>("1. 基础 (Basic)", "切换显示时长 (Toggle Duration)", 10f, new ConfigDescription("Toggle 模式下按一次后保持显示的秒数。\nHow many seconds labels stay visible after a single press in Toggle mode.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 9999f), Array.Empty<object>()));
			HoldKeepDuration = config.Bind<float>("1. 基础 (Basic)", "松手保持时长 (Hold Release Linger)", 1f, new ConfigDescription("Hold 模式下松开按键后继续显示的秒数。\nHow many extra seconds labels linger after the key is released in Hold mode.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>()));
			ShowName = config.Bind<bool>("2. 界面 (UI)", "显示名称 (Show Name)", true, "是否显示玩家名字。\nWhether to display the player name.");
			ShowDistance = config.Bind<bool>("2. 界面 (UI)", "显示距离 (Show Distance)", true, "是否显示距离数值。\nWhether to display the distance number.");
			MinDistance = config.Bind<float>("2. 界面 (UI)", "最小显示距离 (Min Display Distance)", 15f, new ConfigDescription("小于此距离不显示(米)。\nPlayers closer than this distance are hidden (meters).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 50f), Array.Empty<object>()));
			MaxDistance = config.Bind<float>("2. 界面 (UI)", "最大显示距离 (Max Display Distance)", 1000f, new ConfigDescription("超过此距离不显示(米)。\nPlayers farther than this distance are hidden (meters).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(50f, 1500f), Array.Empty<object>()));
			NameFontSize = config.Bind<float>("2. 界面 (UI)", "名字字号 (Name Font Size)", 16f, new ConfigDescription("玩家名字字体大小。\nFont size for the player name.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(9f, 60f), Array.Empty<object>()));
			DistFontSize = config.Bind<float>("2. 界面 (UI)", "距离字号 (Distance Font Size)", 17f, new ConfigDescription("距离数值字体大小。\nFont size for the distance number.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(9f, 60f), Array.Empty<object>()));
			GlobalOpacity = config.Bind<float>("2. 界面 (UI)", "整体透明度 (Global Opacity)", 0.85f, new ConfigDescription("整体不透明度 (0-1)。\nOverall opacity (0-1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			DebugMode = config.Bind<bool>("3. 调试 (Debug)", "启用调试工具 (Enable Debug Tools)", true, "Insert 键呼出调试控制台。\nPress Insert to summon the debug console.");
			DebugMenuKey = config.Bind<KeyCode>("3. 调试 (Debug)", "调试菜单键 (Debug Menu Key)", (KeyCode)277, "打开调试控制台的按键。\nKey used to open the debug console.");
			DisableTMPWarnings = config.Bind<bool>("3. 调试 (Debug)", "禁用全局TMP缺字警告 (Disable TMP Missing-Glyph Warnings)", true, "开启后将禁止 TextMeshPro 向控制台输出缺字警告,可显著解决特殊字符导致的掉帧问题(开发者请关闭)。\nWhen on, suppresses TextMeshPro missing-glyph warnings to avoid console spam and frame drops (developers should disable this).");
		}
	}
	internal static class DownedConfiguration
	{
		private const string Category = "4. 昏迷指向 (Downed Pointer)";

		public static void Initialize(ConfigFile config)
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Expected O, but got Unknown
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			Configuration.EnableDownedLabel = config.Bind<bool>("4. 昏迷指向 (Downed Pointer)", "显示昏迷计时 (Show Downed Timer)", true, "总开关:在昏迷玩家头顶显示倒计时标签。\nMaster switch: show a countdown label above downed players.");
			Configuration.UseDownedIcon = config.Bind<bool>("4. 昏迷指向 (Downed Pointer)", "以图标形式显示昏迷 (Use Downed Icon)", true, "启用后以表情图标表示昏迷/死亡状态;关闭后用「昏迷/死亡」文字替代图标。\nWhen on, a face icon marks downed/dead players; when off, the text 昏迷/死亡 replaces the icon.");
			Configuration.EnableDownedEdgeIndicator = config.Bind<bool>("4. 昏迷指向 (Downed Pointer)", "显示屏幕边缘昏迷指示器 (Show Edge Indicator)", true, "屏幕外的昏迷/死亡玩家在屏幕边缘显示指示器。\nShow an indicator at the screen edge for off-screen downed/dead players.");
			Configuration.DownedFontSize = config.Bind<float>("4. 昏迷指向 (Downed Pointer)", "昏迷标签字号 (Downed Label Font Size)", 18f, new ConfigDescription("昏迷倒计时文字的字体大小;与玩家名称的间距会随字号自动调整避免重叠。\nFont size of the downed countdown text; spacing above the player label auto-adjusts to avoid overlap.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(9f, 60f), Array.Empty<object>()));
			Configuration.DownedIconSize = config.Bind<float>("4. 昏迷指向 (Downed Pointer)", "标签图标大小 (Label Icon Size)", 20f, new ConfigDescription("头顶昏迷标签中表情图标的像素大小。\nPixel size of the face icon in the overhead downed label.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(12f, 96f), Array.Empty<object>()));
			Configuration.DownedEdgeIconSize = config.Bind<float>("4. 昏迷指向 (Downed Pointer)", "指示器图标大小 (Edge Icon Size)", 30f, new ConfigDescription("屏幕边缘指示器中表情图标的像素大小。\nPixel size of the face icon in the screen-edge indicator.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(12f, 96f), Array.Empty<object>()));
		}
	}
	public sealed class DownedManager
	{
		private sealed class State
		{
			public Character Character;

			public GameObject LabelRoot;

			public GameObject EdgeRoot;

			public Image LabelRing;

			public Image LabelFace;

			public RectTransform LabelIcon;

			public RectTransform EdgeIcon;

			public CanvasGroup LabelGroup;

			public CanvasGroup EdgeGroup;

			public float Fade;

			public float BreathPhase;

			public Image EdgeRing;

			public Image EdgeFace;

			public TextMeshProUGUI LabelText;

			public TextMeshProUGUI EdgeName;

			public List<TextMeshProUGUI> LabelShadows = new List<TextMeshProUGUI>();

			public List<TextMeshProUGUI> EdgeShadows = new List<TextMeshProUGUI>();

			public float LastDeathTimer;

			public float Rate;

			public float LastUpdate;

			public float DeadUntil;

			public bool HasGrowth;

			public bool WasDead;

			public bool IsFake;

			public GameObject Owner;

			public Transform Target;

			public string DisplayName;

			public Color FakeColor;

			public float FakeRate;

			public float FakeTimer;

			public bool FakeDead;
		}

		private readonly Dictionary<Character, State> _states = new Dictionary<Character, State>();

		private readonly List<State> _fakeStates = new List<State>();

		private readonly HashSet<Character> _seen = new HashSet<Character>();

		private readonly List<Character> _stale = new List<Character>();

		private Canvas _canvas;

		private Texture2D _faceTexture;

		private Texture2D _deadTexture;

		private Texture2D _ringTexture;

		private Sprite _faceSprite;

		private Sprite _deadSprite;

		private Sprite _ringSprite;

		private Camera _camera;

		private const float FadeDuration = 0.6f;

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

		private const string FacePngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAP+0lEQVR42u1dCZSUxREe9tQFBOT0AMFgUBEURSAgihIlKhqJRkEFMbJBjSgiCIJENE9AVAx4xyuKBgzKISYxEMUjeIsg4BEVvECuiAks17qL3XnfknH4u7r6//s/Zqb7vXoeO9Nd1VXTXXenUm644YYbbrjhhhtuuOGGG264kZtje8XXNVAr7d9/AG7kBqPrCjhawAABNwn4k4C/C1gi4CsB6xWwTMALAmYKmCRgkIATBTR0wpHsX3U9Ab0FTBbwhoBKAbsswyoBTwgYLKC1E4j4mS6ZcK2AV0JiOAXVAj4UMEXA8QIKHVeiYfpBAkYIeEtAVcRMp2A1hKGzgALHLbuMlwrbKQKeTRjTVSBPhqsE1HHcC/6L74M7fVcWwjcCRgrYy3HTnPEnCFgUAlP+DUtA6g3zAItwpUj4l4AtlteUVsdAeZI57uqZf7CAORY2fYeAD2D+lQs4FqZhLeaVIz97lIBz8CueLeDzgDi9LaCT47J60y8XsNXn5laB4ZNgt5fZNtOA48EwA+cK2OzTerhLQG3H9f9v7OEC/uljMzfjtJAMaRm1XS7WKxVwsoAH4EQywf0jAT3y2peAu36wjztX3qmjBDRKEC1SGC6DJ9Hk1LpFQFE+Mr9YwP2GjP8crtnSBNNVIOBcAe8Z0CUV0mb5xPw68LdzN+hbKGKlWUSjFITzBawxEO4j8oH5jQ1/HX8V0CKL6a0v4D4B3zFo3SCgYy4zv5WAz5iMl5txXi4oSdB1usJK0dFdIRXLXGR+ZyhvHDNJ2u775eAe7C3gZvgodD6M8pyxEODV49j3W3LlV6/Zj24M3UD+EC7LBWLbwyeuY77ckKPzzOO5SrMnUm8YkO0K30oG8xfLDclDU7iRgHc0e7NN6g/ZSFwZ07v3ptSU89gZVlvAS4zTsVk2ESV95k8ymP83Fyrd7Rd5mRFIKs0GYiTcwGD+M9nk2Ilg3xriKqT27InEK8hwg1YzXJ+O+XvuXQv4P6i9uzrpmq1O41+Wz3c+Yw97aX5A22WeQlLv/YUa5m+U3kDHZu1ejtPso8xa2jtpSF/CsGmPd+xl7WUpIw/yliQh3ETAOg3CVznWGu3p4Zo8icpEXAXQ+h/TMH+mqfYKP4LMmBmGFKpMGI1U8Qa56joWdA3R7OvLsdMOJlRpnBgNmHPJGPppMHe4WULfwVsmU6x6xkD//tiD8QKeFrAcLt4aeBc1idNhHh8poMRAr1qkiRf8Mk7mF4JAikEXMU8RmTzxfsCs2yokhRZHcOr1gNJb7QPP/wjoz1yrrSaX4LPYnGmSCIa9X8CYp8RyLv6LAvYJieYGCFdXW8DzL5wYiPjMnZp5RsTB/BJNcoe0V9sZzHe35WKMpbaTRlFu/oVlPDejaIRat5mATZrkmX2iFoCrNYSN83GX2q7IWSHntUTvmchNDKvSeJZ0Bwcws2+N2k5dTSCz0s+9hNy59BPkI+gFH+Cfa30UjrwbtAgD6VzbIqgllKHh5oTesUgTNj4wKU6fvj7n7ShgIv5ZnHksYhOKBBwq4DfILOZUCz/uty4PMfsvmQzcCoGbBtN4JoR3p4EQvKeqKsa+ULrHpKhcvss0yR21IhLEmnv5RcbGXupz/pmM43sOrohSxTx1Yd4+gqRPHa4zVHsIU5MqfC0Le9M7aJA/KyZn1GhGVXBDw3mP0vziPhXQ3XDOxmhjo0sMPUXx/faaU69/2Jt9C7H4+3F2x8DVVGnriMQvkaK1cQBcO2uulhVeewlhf4743gthbnCBxgy6OOD88qjsAv/CdQKuB1O7co828bnfEvit415PSNCoIBo/tLawn/I0mE/geyHhfaViBC3CEoBOmlBvsY85i9Dda65G0/6vgHt0jhMI6VJinhOYeJ1DzDGYcSUdBEZJYe5JKHYlRBj9bS//APSwjwn8rghLAO4gFr3Pp3n1oaGpJIVkDPVLhmNF9f3xTNwmEIK+F/G9UxHKrfLAe7TiWFc5eqT+0VKxzhjKwxiWokUxq5fhfGcZmkeZcK/Ke4ZMW9XxvYiJ3yzF9x8g9mcUwyyd4dVSDted1+cHKtY7VNObqMS2ABxAEFdh4mwRnz0pQCcQlmkn/raAwLWYgeM7Jsc/jnku3hM8vl8fzq/Mzz5MCBx1DRxnWwAuJhabZTDP4RZdvl8StvftxPeaM/BUZej2Vnz+GQO8d3p57RRzvELg+AdijTG2BeBRYrFBzDnKYN5Qm7MJnjvp6bsISREzCfNukGKty4g12jFwnWfi5cyo9fsEuoC0aB5WzPM7jzmu9fjcFwSOF1CRWNv3/ydEDH4/5jwTNcyfpcoYhgWyyeCIHECs04OB6+9NlEjELfa4JqCxL/eY5zWPOXorFEGVV7CVpsJ4b1sCcBDhEVvJSUuSmjO8cVTlS4lmjuEe31voQwC6MfAdSOQ4eH3+xrTPTE+3FDKCXLszpZhmdjVhQqY0Jfcn2hKAk6lqFeYcPTXSeogHcR3TO2YgC2ePDiKK9X5NrHcoA98jiROvg+J6uxtRUunTqJv2tz96zLNWEezxWrMJgedsgs4rbQnAMGKRkcw5hhNzzPH4/OX425MaPG41PMIrORYLHFRfEcmYxUSwLP2/ixWh8+UGJ0AxgedIYl/vtCUAU4lFzmTOMdnEnEszwzZCGRyjaMz4E8XRuJgI4HDpvpHAebYu5wF4qOh+SuEb8TJbKafX6QSOz9kSAMpffQRzjntMIohoDsWpLvZaqyXhs7jLMBdgjSbxZSQSN9O/V4guIPMI3ancY70RXvkBGhxbaSqIrAjAR0QCRAFzjhEmdxVCsTs0iRMNFWvdTHzvZEPaf85MAJXet1eREKLLHtrgpdgp/ACPMU6ZHYRJXRCU+QWE4+YLg+OU0sofVXznBI/kkwoUhtRVfKcpYW2sM33ZAxt8veXUrys81mmguOIGMXCkuo/VCyoAJVQOm8E8bTS/nvqEUtUOFkBnFePTmDXDdspUWsKJjVTwWV53uvh/1ygUwNYM/J4n1msVVABaUnew4SZSNutUC1fVKIJJlUE3Q3y/X0A39pOKo7+xoi/AW0wfC+Wl7Rp0Uw+zpWVq7uaqAMmkhYyS6gmWFOJmsOsrDGMWlyt++cWELX8hE6f7bUVpvSbvQoU2DefaXxHxSheCYSbdsyGgr2kYsMR2eBTROxmn+LOiKcZqWAF9VX4HnIpTiCfqCpm4UGb6eWEKwDQf893IzOUfoFJg8IvvhNRr3XNx8pd6WCrEAT2lHjqktGSWwxVqIpYDDNYfF5o7WCMAT/uYby9GQWm6i/gdMHoyXK2vaGIKmSfKL1IJG7jz5xF4zzdJrdcE2boHRfYoqpO3zzkPRJVPmFU2VUGTVENgfEN4NKk6v/WmFT4aHSCwABxANSgIMG9HZgtZP7CF66K2ECaXZe3dsU+Z10IREmAuQU6DLgtK/v0kH3g8RMz546BEFmoKI4LM/SNmVY8JvO4VrQvx7p+bwcC1PmsYZc+A03zi8Swxb1MbhK4iSpsLLPyKLmA0Tua8I/SrqN/wBf6XBkxwXRHktRBYOSqhKrBB5MLQjpgfupxlk8l/GGzmdlTJ9Au9Jk6P/2k+npGTDBobBHcI4EbiZTIrxD1IEHFGCL+ouogDlMNsnISStEnYsHLcu7WT1CAKCrOuh8BOhKpH2miYqdHRnrdF2FBikdEpNzI9hT1xmpWD0cMQ6+9kW2jRWVTFm9ttLdKDSoxwbI9V4EaHVauZvkg9IsiyJs6KYCcApAXQ0eZCbxILtXasiIX5pVAkd5mmkvlZbAohAEMcO2IRgK6UO9n2Yr1CTz50w5QnVIXwWNuL1SZy3XYETj2K1nEjC136IJw7FNAXZlxhFgkA1TWsUxgLPmcjfBnTZjVB95CPGcmd07mNJGKmp5LoYVAUxqLl1BtACd2oNggn++nztwxV0UUJpOtqW4k6Jos2IDJ6dkbWqJCvIY8L6KNPzyjqliDaamkaa58d5uJUHfxtCdmgpig2tRllrETjqoIE0NdbE1IuC3Px/pra/voxb04LopDFBjwYVSNMQol9gcDvobARqIOOXSoEhsW4Oc2JPgY24YG4hEC2fiG8stWRXFWaLNR1VPFGiDiVEXHxMOCGmH79Cwic3ogkOoqCxK2xNi3eUyl6NkLm1+Qc9omYzp9pqpPOjhKZqZqY92ER4nJNxMxPP+32jYjGEk0N4FuRXkuyL5DmFJgfxXEEh8iWmASA3XjSAp0jNHickYrhTro16INRFnCYFCPza9K6GoZMY0tNutnrsWRGyeMPeexU/+DGIa5fRoRDo4QrQ6RRwlOa9wo6peIamn58u+CGDWvtMxPA/P+9Uhbi/p6ve1I+bq9UoSZruJpb5epj7bsSIgDfhfFql5jzGI1+8w3VQSxKIThEoxDK7JRjQlj3VZ8u3RVo1CDf47sJcC/eA1zqM3DUJQQle7Vpp5E4hUBX9SvfGGxm+W7klpZtRhn32Sjr5gSS+uB9nu3MNfpZ9rbqSt4XJyp3QbYlZfT+f0nV3NmnAOiY8ymqduoHWKM+ehzqHowcYJGuRxkFMe1SSRu4s7YylMKikAVgC5xDxRZpK0OOv8rqOMfSOqMZp83wVFIHEih0zZRm2AirejSDrMabffuHSF9z9PrJpPFgC3P3Yzw4MT1J1VAqQiYzpPiRoIRk6B1fS195hEGZM+AK3gVlNOicpzKSVxZb6wAe8gYVaVqX7e5lG+QkQCfPd6HVt46BTplceptMO7Pgz9AVlq4J3PIt4s2px3gcYhc07dKAv8ZUtg6Uxu9guJuPzkbiDtD02k3vwb9fKo8GQthjGXd+lU0TMw5COzCfXZe99NrnCfOLNO/9pCu1V2XzCVdDcHdmZy/pMbwil4tN0dfwDaZ7eWjWMz+N8DYGz7AvUD2YmMX0F6CVLcezuM1vv6Ckb0JrTT67lzOnJAfobm+Qpr7JtKV9tm1GA01a8x5Pq3i9CpIltNZB6hw3niBPyLb5oASV4G1Ak3DrNM6DjwmhT3ZDHazpju71HH2rVL4MmEHXMXr9ZgZB7oE+kUSayqC4fWZAUzVc47VT+TjQi3ipj5j+i2goXSdOYYBydxzeBvzWkI71aCaVyuuBK2Gsz0LObYj1n8uJ9VvE93jEPL70mUU0O+xk0mwUhGMVz6yaPMq8EBk+3WwVSaY9W1PT83dDABzX4xk8x3DCSzaE6H5pejosRqrXDfLxBFw57VBP0CgD2kAIT0ciyVRYLDaaWtfoL/s6LvMEoRH64G9OSOJnkITRGVFWSuWaIMjHFe5gRMySBlXwaHZ2x709QRiKGrjqBDNeviY6XjbRdowPRxBqAioTGWnTUUEF0sx/6rqmRq8wnoQmlksiZvoaeCfPzZYWeflwMjRDPv8d6KG3yRKzt8M8nQYXbwd3vGePu7kpjuaBSLmeCEZKBe1lwMI0eBzm3wg8HN0W5W9uQ91www033HDDDTfccMMNN9zIhfE991hrGLjEOqoAAAAASUVORK5CYII=";

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

		public DownedManager()
		{
			CreateCanvas();
			CreateTextures();
		}

		public void Dispose()
		{
			foreach (State value in _states.Values)
			{
				if ((Object)(object)value.LabelRoot != (Object)null)
				{
					Object.Destroy((Object)(object)value.LabelRoot);
				}
				if ((Object)(object)value.EdgeRoot != (Object)null)
				{
					Object.Destroy((Object)(object)value.EdgeRoot);
				}
			}
			_states.Clear();
			foreach (State fakeState in _fakeStates)
			{
				if ((Object)(object)fakeState.LabelRoot != (Object)null)
				{
					Object.Destroy((Object)(object)fakeState.LabelRoot);
				}
				if ((Object)(object)fakeState.EdgeRoot != (Object)null)
				{
					Object.Destroy((Object)(object)fakeState.EdgeRoot);
				}
			}
			_fakeStates.Clear();
			if ((Object)(object)_canvas != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)_canvas).gameObject);
			}
			if ((Object)(object)_faceSprite != (Object)null)
			{
				Object.Destroy((Object)(object)_faceSprite);
			}
			if ((Object)(object)_deadSprite != (Object)null)
			{
				Object.Destroy((Object)(object)_deadSprite);
			}
			if ((Object)(object)_ringSprite != (Object)null)
			{
				Object.Destroy((Object)(object)_ringSprite);
			}
			if ((Object)(object)_faceTexture != (Object)null)
			{
				Object.Destroy((Object)(object)_faceTexture);
			}
			if ((Object)(object)_deadTexture != (Object)null)
			{
				Object.Destroy((Object)(object)_deadTexture);
			}
			if ((Object)(object)_ringTexture != (Object)null)
			{
				Object.Destroy((Object)(object)_ringTexture);
			}
		}

		public void LateUpdate()
		{
			if (Configuration.EnableDownedLabel == null || Configuration.EnableDownedEdgeIndicator == null)
			{
				return;
			}
			if (!Configuration.EnableDownedLabel.Value && !Configuration.EnableDownedEdgeIndicator.Value)
			{
				HideAll();
				return;
			}
			if ((Object)(object)_canvas == (Object)null)
			{
				CreateCanvas();
			}
			_camera = Camera.main;
			if ((Object)(object)_camera == (Object)null || (Object)(object)_canvas == (Object)null)
			{
				return;
			}
			_seen.Clear();
			List<Character> allCharacters = Character.AllCharacters;
			for (int i = 0; i < allCharacters.Count; i++)
			{
				Character val = allCharacters[i];
				if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)Character.localCharacter) && ((Object)val).name.IndexOf("Bot", StringComparison.OrdinalIgnoreCase) < 0)
				{
					_seen.Add(val);
					UpdateState(GetState(val));
				}
			}
			_stale.Clear();
			foreach (KeyValuePair<Character, State> state2 in _states)
			{
				if (!_seen.Contains(state2.Key) || (Object)(object)state2.Key == (Object)null)
				{
					_stale.Add(state2.Key);
				}
			}
			foreach (Character item in _stale)
			{
				RemoveState(item);
			}
			for (int num = _fakeStates.Count - 1; num >= 0; num--)
			{
				State state = _fakeStates[num];
				if ((Object)(object)state.Owner == (Object)null)
				{
					RemoveFakeState(state);
				}
				else
				{
					UpdateFakeState(state);
				}
			}
		}

		public void RegisterFakeTarget(GameObject owner, Transform target, string displayName, Color color)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)owner == (Object)null) && !((Object)(object)target == (Object)null))
			{
				State state = new State
				{
					IsFake = true,
					Owner = owner,
					Target = target,
					DisplayName = displayName,
					FakeColor = color,
					FakeRate = 1f / 60f,
					LastUpdate = Time.unscaledTime
				};
				CreateViews(state);
				_fakeStates.Add(state);
			}
		}

		public void MarkAllFakeTargetsDead()
		{
			float unscaledTime = Time.unscaledTime;
			foreach (State fakeState in _fakeStates)
			{
				fakeState.FakeDead = true;
				fakeState.DeadUntil = unscaledTime + 5f;
			}
		}

		public void ClearFakeTargets()
		{
			foreach (State fakeState in _fakeStates)
			{
				if ((Object)(object)fakeState.LabelRoot != (Object)null)
				{
					Object.Destroy((Object)(object)fakeState.LabelRoot);
				}
				if ((Object)(object)fakeState.EdgeRoot != (Object)null)
				{
					Object.Destroy((Object)(object)fakeState.EdgeRoot);
				}
			}
			_fakeStates.Clear();
		}

		private State GetState(Character character)
		{
			if (_states.TryGetValue(character, out var value))
			{
				return value;
			}
			value = new State
			{
				Character = character,
				LastDeathTimer = character.data.deathTimer,
				LastUpdate = Time.unscaledTime
			};
			_states.Add(character, value);
			return value;
		}

		private void UpdateState(State state)
		{
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			Character character = state.Character;
			if ((Object)(object)character == (Object)null || (Object)(object)character.data == (Object)null)
			{
				Hide(state);
				return;
			}
			float unscaledTime = Time.unscaledTime;
			float num = Mathf.Clamp01(character.data.deathTimer);
			float num2 = num - state.LastDeathTimer;
			float num3 = Mathf.Max(0.001f, unscaledTime - state.LastUpdate);
			if (num2 > 1E-05f)
			{
				float num4 = num2 / num3;
				state.Rate = ((state.Rate <= 0f) ? num4 : Mathf.Lerp(state.Rate, num4, 0.2f));
				state.HasGrowth = true;
			}
			state.LastDeathTimer = num;
			state.LastUpdate = unscaledTime;
			bool dead = character.data.dead;
			if (dead && !state.WasDead)
			{
				state.DeadUntil = unscaledTime + 5f;
			}
			state.WasDead = dead;
			bool num5 = !dead && character.data.fullyPassedOut && state.HasGrowth;
			bool flag = dead && unscaledTime <= state.DeadUntil;
			if (!num5 && !flag)
			{
				Hide(state);
				if (!dead && !character.data.fullyPassedOut)
				{
					state.HasGrowth = false;
				}
				return;
			}
			Color playerColor = GetPlayerColor(character);
			float alpha = BreathAlpha(state, 1f - num);
			string text = (flag ? "DEAD" : BuildCountdown(num, state.Rate));
			EnsureViews(state);
			state.Fade = Mathf.MoveTowards(state.Fade, 1f, Time.unscaledDeltaTime / 0.6f);
			ApplyCurrentFont(state);
			UpdateLabel(state, GetTarget(character), Tracking.ExtractDisplayName(((Object)character).name), playerColor, flag, text, alpha);
			UpdateEdge(state, GetTarget(character), Tracking.ExtractDisplayName(((Object)character).name), playerColor, flag, alpha);
		}

		private void UpdateFakeState(State state)
		{
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)state.Target == (Object)null)
			{
				Hide(state);
				return;
			}
			float unscaledTime = Time.unscaledTime;
			float num = Mathf.Max(0.001f, unscaledTime - state.LastUpdate);
			if (!state.FakeDead)
			{
				state.FakeTimer = Mathf.Min(1f, state.FakeTimer + num * state.FakeRate);
				if (state.FakeTimer >= 1f)
				{
					state.FakeTimer = 1f;
					state.FakeDead = true;
					state.DeadUntil = unscaledTime + 5f;
				}
			}
			state.LastUpdate = unscaledTime;
			bool flag = state.FakeDead && unscaledTime <= state.DeadUntil;
			if (!flag && state.FakeDead)
			{
				Hide(state);
				return;
			}
			float alpha = BreathAlpha(state, 1f - state.FakeTimer);
			string text = (flag ? "DEAD" : BuildCountdown(state.FakeTimer, state.FakeRate));
			EnsureViews(state);
			state.Fade = Mathf.MoveTowards(state.Fade, 1f, Time.unscaledDeltaTime / 0.6f);
			ApplyCurrentFont(state);
			UpdateLabel(state, state.Target, state.DisplayName, state.FakeColor, flag, text, alpha);
			UpdateEdge(state, state.Target, state.DisplayName, state.FakeColor, flag, alpha);
		}

		private string BuildCountdown(float timer, float rate)
		{
			int num = Mathf.FloorToInt(Mathf.Clamp01(1f - timer) * 100f);
			if (rate > 1E-05f)
			{
				int num2 = Mathf.Max(0, Mathf.CeilToInt(Mathf.Max(0f, 1f - timer) / rate));
				return $"{num}% | {num2}s";
			}
			return $"{num}%";
		}

		private void UpdateLabel(State state, Transform target, string displayName, Color playerColor, bool dead, string text, float alpha)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: 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_0059: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: 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_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			if (!Configuration.EnableDownedLabel.Value)
			{
				state.LabelRoot.SetActive(false);
				return;
			}
			Vector3 val = _camera.WorldToScreenPoint(target.position + Vector3.up * 1.2f);
			bool flag = val.z > 0f && val.x >= 0f && val.x <= (float)Screen.width && val.y >= 0f && val.y <= (float)Screen.height;
			state.LabelRoot.SetActive(flag);
			if (!flag)
			{
				return;
			}
			state.LabelGroup.alpha = state.Fade;
			float value = Configuration.DownedFontSize.Value;
			float num = ((Configuration.NameFontSize != null) ? ((Configuration.NameFontSize.Value + Configuration.DistFontSize.Value) * 0.7f) : 24f);
			state.LabelRoot.transform.position = val + Vector3.up * (num + value * 0.5f);
			bool value2 = Configuration.UseDownedIcon.Value;
			((Component)state.LabelIcon).gameObject.SetActive(value2);
			string text2 = (value2 ? text : (dead ? "死亡" : ("昏迷 " + text)));
			((TMP_Text)state.LabelText).fontSize = value;
			((TMP_Text)state.LabelText).text = text2;
			float x = ((TMP_Text)state.LabelText).GetPreferredValues(text2).x;
			if (value2)
			{
				float value3 = Configuration.DownedIconSize.Value;
				state.LabelIcon.sizeDelta = new Vector2(value3, value3);
				state.LabelIcon.anchoredPosition = new Vector2(0f - (x * 0.5f + value3 * 0.5f + 5f), -1.5f);
				((Graphic)state.LabelRing).color = WithAlpha(playerColor, alpha);
				state.LabelFace.sprite = (dead ? _deadSprite : _faceSprite);
				((Graphic)state.LabelFace).color = WithAlpha(Color.white, alpha);
			}
			ApplyTextStyle(state.LabelText, state.LabelShadows, alpha);
			foreach (TextMeshProUGUI labelShadow in state.LabelShadows)
			{
				((TMP_Text)labelShadow).text = text2;
			}
		}

		private void UpdateEdge(State state, Transform target, string displayName, Color playerColor, bool dead, float alpha)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_0038: 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_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: 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_009c: 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_014a: 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_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			state.EdgeRoot.SetActive(false);
			if (!Configuration.EnableDownedEdgeIndicator.Value)
			{
				return;
			}
			Vector3 val = _camera.WorldToViewportPoint(target.position);
			if (val.z > 0f && val.x >= -0.02f && val.x <= 1.02f && val.y >= -0.02f && val.y <= 1.02f)
			{
				return;
			}
			if (val.z < 0f)
			{
				val.x = 1f - val.x;
				val.y = 1f - val.y;
			}
			Vector2 val2 = default(Vector2);
			((Vector2)(ref val2))..ctor((float)Screen.width * 0.5f, (float)Screen.height * 0.5f);
			Vector2 val3 = new Vector2(val.x * (float)Screen.width, val.y * (float)Screen.height) - val2;
			if (((Vector2)(ref val3)).sqrMagnitude < 0.01f)
			{
				val3 = Vector2.up;
			}
			float num = Mathf.Clamp(60f, 10f, (float)Mathf.Min(Screen.width, Screen.height) * 0.45f);
			float num2 = (float)Screen.width * 0.5f - num;
			float num3 = (float)Screen.height * 0.5f - num;
			float num4 = Mathf.Min(num2 / Mathf.Max(0.001f, Mathf.Abs(val3.x)), num3 / Mathf.Max(0.001f, Mathf.Abs(val3.y)));
			state.EdgeRoot.transform.position = Vector2.op_Implicit(val2 + val3 * num4);
			state.EdgeRoot.SetActive(true);
			state.EdgeGroup.alpha = state.Fade;
			bool value = Configuration.UseDownedIcon.Value;
			float value2 = Configuration.DownedFontSize.Value;
			float value3 = Configuration.DownedEdgeIconSize.Value;
			((Component)state.EdgeIcon).gameObject.SetActive(value);
			if (value)
			{
				state.EdgeIcon.sizeDelta = new Vector2(value3, value3);
				((Graphic)state.EdgeRing).color = WithAlpha(playerColor, alpha);
				state.EdgeFace.sprite = (dead ? _deadSprite : _faceSprite);
				((Graphic)state.EdgeFace).color = WithAlpha(Color.white, alpha);
			}
			string text = (value ? displayName : (displayName + "\n" + (dead ? "死亡" : "昏迷")));
			((TMP_Text)state.EdgeName).fontSize = value2;
			((TMP_Text)state.EdgeName).rectTransform.anchoredPosition = new Vector2(0f, (value ? (value3 * 0.5f) : 0f) + value2 * 0.8f + 4f);
			((TMP_Text)state.EdgeName).text = text;
			ApplyTextStyle(state.EdgeName, state.EdgeShadows, alpha);
			foreach (TextMeshProUGUI edgeShadow in state.EdgeShadows)
			{
				((TMP_Text)edgeShadow).text = text;
			}
		}

		private void ApplyTextStyle(TextMeshProUGUI main, List<TextMeshProUGUI> shadows, float alpha)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: 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_00af: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)main == (Object)null))
			{
				Color fixedShadowColor = Configuration.FixedShadowColor;
				fixedShadowColor.a = 0.8f;
				Color color = default(Color);
				((Color)(ref color))..ctor(0.875f, 0.855f, 0.761f, alpha);
				((Graphic)main).color = color;
				float num = 1.5f;
				Vector2[] array = (Vector2[])(object)new Vector2[8]
				{
					new Vector2(0f, 1f),
					new Vector2(0f, -1f),
					new Vector2(-1f, 0f),
					new Vector2(1f, 0f),
					new Vector2(-1f, 1f),
					new Vector2(1f, 1f),
					new Vector2(-1f, -1f),
					new Vector2(1f, -1f)
				};
				for (int i = 0; i < shadows.Count && i < array.Length; i++)
				{
					((TMP_Text)shadows[i]).font = ((TMP_Text)main).font;
					((TMP_Text)shadows[i]).fontSize = ((TMP_Text)main).fontSize;
					((TMP_Text)shadows[i]).alignment = ((TMP_Text)main).alignment;
					((TMP_Text)shadows[i]).overflowMode = ((TMP_Text)main).overflowMode;
					((TMP_Text)shadows[i]).rectTransform.sizeDelta = ((TMP_Text)main).rectTransform.sizeDelta;
					((Transform)((TMP_Text)shadows[i]).rectTransform).localScale = Vector3.one;
					((Graphic)shadows[i]).color = WithAlpha(fixedShadowColor, fixedShadowColor.a * alpha);
					((TMP_Text)shadows[i]).rectTransform.anchoredPosition = ((TMP_Text)main).rectTransform.anchoredPosition + array[i] * num;
				}
			}
		}

		private float BreathAlpha(State state, float remaining01)
		{
			float num = 1.5f;
			float num2 = 1f + 0.5f * Mathf.Clamp01(1f - remaining01);
			state.BreathPhase += Time.unscaledDeltaTime * num2;
			float num3 = (Mathf.Sin(state.BreathPhase * MathF.PI * 2f / num) + 1f) * 0.5f;
			return Mathf.Lerp(0.6f, 1f, num3);
		}

		private Transform GetTarget(Character character)
		{
			Transform val = ((Component)character).transform.Find("Scout/Misc/CharacterLight");
			if (!((Object)(object)val != (Object)null))
			{
				return ((Component)character).transform;
			}
			return val;
		}

		private Color GetPlayerColor(Character character)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: 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_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				return character.refs.customization.PlayerColor;
			}
			catch
			{
				return Color.white;
			}
		}

		private void CreateCanvas()
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_canvas != (Object)null))
			{
				GameObject val = GameObject.Find("GAME/GUIManager");
				if (!((Object)(object)val == (Object)null))
				{
					GameObject val2 = new GameObject("Canvas_DownedAwareness", new Type[3]
					{
						typeof(Canvas),
						typeof(CanvasScaler),
						typeof(GraphicRaycaster)
					});
					val2.transform.SetParent(val.transform, false);
					_canvas = val2.GetComponent<Canvas>();
					_canvas.renderMode = (RenderMode)0;
					_canvas.sortingOrder = 110;
					CanvasScaler component = val2.GetComponent<CanvasScaler>();
					component.uiScaleMode = (ScaleMode)1;
					component.referenceResolution = new Vector2(1920f, 1080f);
					component.screenMatchMode = (ScreenMatchMode)0;
				}
			}
		}

		private void CreateTextures()
		{
			//IL_004e: 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_008c: 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_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			_ringTexture = LoadIconTexture("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");
			_faceTexture = LoadIconTexture("iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAP+0lEQVR42u1dCZSUxREe9tQFBOT0AMFgUBEURSAgihIlKhqJRkEFMbJBjSgiCIJENE9AVAx4xyuKBgzKISYxEMUjeIsg4BEVvECuiAks17qL3XnfknH4u7r6//s/Zqb7vXoeO9Nd1VXTXXenUm644YYbbrjhhhtuuOGGG264kZtje8XXNVAr7d9/AG7kBqPrCjhawAABNwn4k4C/C1gi4CsB6xWwTMALAmYKmCRgkIATBTR0wpHsX3U9Ab0FTBbwhoBKAbsswyoBTwgYLKC1E4j4mS6ZcK2AV0JiOAXVAj4UMEXA8QIKHVeiYfpBAkYIeEtAVcRMp2A1hKGzgALHLbuMlwrbKQKeTRjTVSBPhqsE1HHcC/6L74M7fVcWwjcCRgrYy3HTnPEnCFgUAlP+DUtA6g3zAItwpUj4l4AtlteUVsdAeZI57uqZf7CAORY2fYeAD2D+lQs4FqZhLeaVIz97lIBz8CueLeDzgDi9LaCT47J60y8XsNXn5laB4ZNgt5fZNtOA48EwA+cK2OzTerhLQG3H9f9v7OEC/uljMzfjtJAMaRm1XS7WKxVwsoAH4EQywf0jAT3y2peAu36wjztX3qmjBDRKEC1SGC6DJ9Hk1LpFQFE+Mr9YwP2GjP8crtnSBNNVIOBcAe8Z0CUV0mb5xPw68LdzN+hbKGKlWUSjFITzBawxEO4j8oH5jQ1/HX8V0CKL6a0v4D4B3zFo3SCgYy4zv5WAz5iMl5txXi4oSdB1usJK0dFdIRXLXGR+ZyhvHDNJ2u775eAe7C3gZvgodD6M8pyxEODV49j3W3LlV6/Zj24M3UD+EC7LBWLbwyeuY77ckKPzzOO5SrMnUm8YkO0K30oG8xfLDclDU7iRgHc0e7NN6g/ZSFwZ07v3ptSU89gZVlvAS4zTsVk2ESV95k8ymP83Fyrd7Rd5mRFIKs0GYiTcwGD+M9nk2Ilg3xriKqT27InEK8hwg1YzXJ+O+XvuXQv4P6i9uzrpmq1O41+Wz3c+Yw97aX5A22WeQlLv/YUa5m+U3kDHZu1ejtPso8xa2jtpSF/CsGmPd+xl7WUpIw/yliQh3ETAOg3CVznWGu3p4Zo8icpEXAXQ+h/TMH+mqfYKP4LMmBmGFKpMGI1U8Qa56joWdA3R7OvLsdMOJlRpnBgNmHPJGPppMHe4WULfwVsmU6x6xkD//tiD8QKeFrAcLt4aeBc1idNhHh8poMRAr1qkiRf8Mk7mF4JAikEXMU8RmTzxfsCs2yokhRZHcOr1gNJb7QPP/wjoz1yrrSaX4LPYnGmSCIa9X8CYp8RyLv6LAvYJieYGCFdXW8DzL5wYiPjMnZp5RsTB/BJNcoe0V9sZzHe35WKMpbaTRlFu/oVlPDejaIRat5mATZrkmX2iFoCrNYSN83GX2q7IWSHntUTvmchNDKvSeJZ0Bwcws2+N2k5dTSCz0s+9hNy59BPkI+gFH+Cfa30UjrwbtAgD6VzbIqgllKHh5oTesUgTNj4wKU6fvj7n7ShgIv5ZnHksYhOKBBwq4DfILOZUCz/uty4PMfsvmQzcCoGbBtN4JoR3p4EQvKeqKsa+ULrHpKhcvss0yR21IhLEmnv5RcbGXupz/pmM43sOrohSxTx1Yd4+gqRPHa4zVHsIU5MqfC0Le9M7aJA/KyZn1GhGVXBDw3mP0vziPhXQ3XDOxmhjo0sMPUXx/faaU69/2Jt9C7H4+3F2x8DVVGnriMQvkaK1cQBcO2uulhVeewlhf4743gthbnCBxgy6OOD88qjsAv/CdQKuB1O7co828bnfEvit415PSNCoIBo/tLawn/I0mE/geyHhfaViBC3CEoBOmlBvsY85i9Dda65G0/6vgHt0jhMI6VJinhOYeJ1DzDGYcSUdBEZJYe5JKHYlRBj9bS//APSwjwn8rghLAO4gFr3Pp3n1oaGpJIVkDPVLhmNF9f3xTNwmEIK+F/G9UxHKrfLAe7TiWFc5eqT+0VKxzhjKwxiWokUxq5fhfGcZmkeZcK/Ke4ZMW9XxvYiJ3yzF9x8g9mcUwyyd4dVSDted1+cHKtY7VNObqMS2ABxAEFdh4mwRnz0pQCcQlmkn/raAwLWYgeM7Jsc/jnku3hM8vl8fzq/Mzz5MCBx1DRxnWwAuJhabZTDP4RZdvl8StvftxPeaM/BUZej2Vnz+GQO8d3p57RRzvELg+AdijTG2BeBRYrFBzDnKYN5Qm7MJnjvp6bsISREzCfNukGKty4g12jFwnWfi5cyo9fsEuoC0aB5WzPM7jzmu9fjcFwSOF1CRWNv3/ydEDH4/5jwTNcyfpcoYhgWyyeCIHECs04OB6+9NlEjELfa4JqCxL/eY5zWPOXorFEGVV7CVpsJ4b1sCcBDhEVvJSUuSmjO8cVTlS4lmjuEe31voQwC6MfAdSOQ4eH3+xrTPTE+3FDKCXLszpZhmdjVhQqY0Jfcn2hKAk6lqFeYcPTXSeogHcR3TO2YgC2ePDiKK9X5NrHcoA98jiROvg+J6uxtRUunTqJv2tz96zLNWEezxWrMJgedsgs4rbQnAMGKRkcw5hhNzzPH4/OX425MaPG41PMIrORYLHFRfEcmYxUSwLP2/ixWh8+UGJ0AxgedIYl/vtCUAU4lFzmTOMdnEnEszwzZCGRyjaMz4E8XRuJgI4HDpvpHAebYu5wF4qOh+SuEb8TJbKafX6QSOz9kSAMpffQRzjntMIohoDsWpLvZaqyXhs7jLMBdgjSbxZSQSN9O/V4guIPMI3ancY70RXvkBGhxbaSqIrAjAR0QCRAFzjhEmdxVCsTs0iRMNFWvdTHzvZEPaf85MAJXet1eREKLLHtrgpdgp/ACPMU6ZHYRJXRCU+QWE4+YLg+OU0sofVXznBI/kkwoUhtRVfKcpYW2sM33ZAxt8veXUrys81mmguOIGMXCkuo/VCyoAJVQOm8E8bTS/nvqEUtUOFkBnFePTmDXDdspUWsKJjVTwWV53uvh/1ygUwNYM/J4n1msVVABaUnew4SZSNutUC1fVKIJJlUE3Q3y/X0A39pOKo7+xoi/AW0wfC+Wl7Rp0Uw+zpWVq7uaqAMmkhYyS6gmWFOJmsOsrDGMWlyt++cWELX8hE6f7bUVpvSbvQoU2DefaXxHxSheCYSbdsyGgr2kYsMR2eBTROxmn+LOiKcZqWAF9VX4HnIpTiCfqCpm4UGb6eWEKwDQf893IzOUfoFJg8IvvhNRr3XNx8pd6WCrEAT2lHjqktGSWwxVqIpYDDNYfF5o7WCMAT/uYby9GQWm6i/gdMHoyXK2vaGIKmSfKL1IJG7jz5xF4zzdJrdcE2boHRfYoqpO3zzkPRJVPmFU2VUGTVENgfEN4NKk6v/WmFT4aHSCwABxANSgIMG9HZgtZP7CF66K2ECaXZe3dsU+Z10IREmAuQU6DLgtK/v0kH3g8RMz546BEFmoKI4LM/SNmVY8JvO4VrQvx7p+bwcC1PmsYZc+A03zi8Swxb1MbhK4iSpsLLPyKLmA0Tua8I/SrqN/wBf6XBkxwXRHktRBYOSqhKrBB5MLQjpgfupxlk8l/GGzmdlTJ9Au9Jk6P/2k+npGTDBobBHcI4EbiZTIrxD1IEHFGCL+ouogDlMNsnISStEnYsHLcu7WT1CAKCrOuh8BOhKpH2miYqdHRnrdF2FBikdEpNzI9hT1xmpWD0cMQ6+9kW2jRWVTFm9ttLdKDSoxwbI9V4EaHVauZvkg9IsiyJs6KYCcApAXQ0eZCbxILtXasiIX5pVAkd5mmkvlZbAohAEMcO2IRgK6UO9n2Yr1CTz50w5QnVIXwWNuL1SZy3XYETj2K1nEjC136IJw7FNAXZlxhFgkA1TWsUxgLPmcjfBnTZjVB95CPGcmd07mNJGKmp5LoYVAUxqLl1BtACd2oNggn++nztwxV0UUJpOtqW4k6Jos2IDJ6dkbWqJCvIY8L6KNPzyjqliDaamkaa58d5uJUHfxtCdmgpig2tRllrETjqoIE0NdbE1IuC3Px/pra/voxb04LopDFBjwYVSNMQol9gcDvobARqIOOXSoEhsW4Oc2JPgY24YG4hEC2fiG8stWRXFWaLNR1VPFGiDiVEXHxMOCGmH79Cwic3ogkOoqCxK2xNi3eUyl6NkLm1+Qc9omYzp9pqpPOjhKZqZqY92ER4nJNxMxPP+32jYjGEk0N4FuRXkuyL5DmFJgfxXEEh8iWmASA3XjSAp0jNHickYrhTro16INRFnCYFCPza9K6GoZMY0tNutnrsWRGyeMPeexU/+DGIa5fRoRDo4QrQ6RRwlOa9wo6peIamn58u+CGDWvtMxPA/P+9Uhbi/p6ve1I+bq9UoSZruJpb5epj7bsSIgDfhfFql5jzGI1+8w3VQSxKIThEoxDK7JRjQlj3VZ8u3RVo1CDf47sJcC/eA1zqM3DUJQQle7Vpp5E4hUBX9SvfGGxm+W7klpZtRhn32Sjr5gSS+uB9nu3MNfpZ9rbqSt4XJyp3QbYlZfT+f0nV3NmnAOiY8ymqduoHWKM+ehzqHowcYJGuRxkFMe1SSRu4s7YylMKikAVgC5xDxRZpK0OOv8rqOMfSOqMZp83wVFIHEih0zZRm2AirejSDrMabffuHSF9z9PrJpPFgC3P3Yzw4MT1J1VAqQiYzpPiRoIRk6B1fS195hEGZM+AK3gVlNOicpzKSVxZb6wAe8gYVaVqX7e5lG+QkQCfPd6HVt46BTplceptMO7Pgz9AVlq4J3PIt4s2px3gcYhc07dKAv8ZUtg6Uxu9guJuPzkbiDtD02k3vwb9fKo8GQthjGXd+lU0TMw5COzCfXZe99NrnCfOLNO/9pCu1V2XzCVdDcHdmZy/pMbwil4tN0dfwDaZ7eWjWMz+N8DYGz7AvUD2YmMX0F6CVLcezuM1vv6Ckb0JrTT67lzOnJAfobm+Qpr7JtKV9tm1GA01a8x5Pq3i9CpIltNZB6hw3niBPyLb5oASV4G1Ak3DrNM6DjwmhT3ZDHazpju71HH2rVL4MmEHXMXr9ZgZB7oE+kUSayqC4fWZAUzVc47VT+TjQi3ipj5j+i2goXSdOYYBydxzeBvzWkI71aCaVyuuBK2Gsz0LObYj1n8uJ9VvE93jEPL70mUU0O+xk0mwUhGMVz6yaPMq8EBk+3WwVSaY9W1PT83dDABzX4xk8x3DCSzaE6H5pejosRqrXDfLxBFw57VBP0CgD2kAIT0ciyVRYLDaaWtfoL/s6LvMEoRH64G9OSOJnkITRGVFWSuWaIMjHFe5gRMySBlXwaHZ2x709QRiKGrjqBDNeviY6XjbRdowPRxBqAioTGWnTUUEF0sx/6rqmRq8wnoQmlksiZvoaeCfPzZYWeflwMjRDPv8d6KG3yRKzt8M8nQYXbwd3vGePu7kpjuaBSLmeCEZKBe1lwMI0eBzm3wg8HN0W5W9uQ91www033HDDDTfccMMNN9zIhfE991hrGLjEOqoAAAAASUVORK5CYII=");
			_deadTexture = LoadIconTexture("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");
			_ringSprite = Sprite.Create(_ringTexture, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 128f);
			_faceSprite = Sprite.Create(_faceTexture, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 128f);
			_deadSprite = Sprite.Create(_deadTexture, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 128f);
		}

		private Texture2D LoadIconTexture(string base64)
		{
			//IL_0004: 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_0016: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
			ImageConversion.LoadImage(val, Convert.FromBase64String(base64), false);
			((Texture)val).filterMode = (FilterMode)1;
			return val;
		}

		private void EnsureViews(State state)
		{
			if ((Object)(object)state.LabelRoot == (Object)null)
			{
				CreateViews(state);
			}
		}

		private void CreateViews(State state)
		{
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			state.LabelRoot = CreateRoot("DownedLabel");
			state.LabelGroup = state.LabelRoot.GetComponent<CanvasGroup>();
			GameObject val = CreateIcon(state.LabelRoot.transform, Configuration.DownedIconSize.Value, out state.LabelRing, out state.LabelFace);
			state.LabelIcon = val.GetComponent<RectTransform>();
			state.LabelText = CreateText(state.LabelRoot.transform, "DownedText", Configuration.DownedFontSize.Value, out state.LabelShadows);
			((TMP_Text)state.LabelText).rectTransform.sizeDelta = new Vector2(150f, 32f);
			((TMP_Text)state.LabelText).rectTransform.anchoredPosition = Vector2.zero;
			state.EdgeRoot = CreateRoot("DownedEdge");
			state.EdgeGroup = state.EdgeRoot.GetComponent<CanvasGroup>();
			GameObject val2 = CreateIcon(state.EdgeRoot.transform, Configuration.DownedEdgeIconSize.Value, out state.EdgeRing, out state.EdgeFace);
			state.EdgeIcon = val2.GetComponent<RectTransform>();
			state.EdgeName = CreateText(state.EdgeRoot.transform, "Name", Configuration.DownedFontSize.Value, out state.EdgeShadows);
			((TMP_Text)state.EdgeName).rectTransform.sizeDelta = new Vector2(240f, 28f);
			((TMP_Text)state.EdgeName).rectTransform.anchoredPosition = new Vector2(0f, 42f);
			state.EdgeRoot.SetActive(false);
		}

		private void ApplyCurrentFont(State state)
		{
			TMP_FontAsset val = ((Plugin.Overlay != null) ? Plugin.Overlay.CurrentFont : null);
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			((TMP_Text)state.LabelText).font = val;
			((TMP_Text)state.EdgeName).font = val;
			foreach (TextMeshProUGUI labelShadow in state.LabelShadows)
			{
				((TMP_Text)labelShadow).font = val;
			}
			foreach (TextMeshProUGUI edgeShadow in state.EdgeShadows)
			{
				((TMP_Text)edgeShadow).font = val;
			}
		}

		private GameObject CreateRoot(string name)
		{
			//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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			GameObject val = new GameObject(name, new Type[2]
			{
				typeof(RectTransform),
				typeof(CanvasGroup)
			});
			val.transform.SetParent(((Component)_canvas).transform, false);
			CanvasGroup component = val.GetComponent<CanvasGroup>();
			component.blocksRaycasts = false;
			component.interactable = false;
			return val;
		}

		private GameObject CreateIcon(Transform parent, float size, out Image ring, out Image face)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Expected O, but got Unknown
			GameObject val = new GameObject("Icon", new Type[1] { typeof(RectTransform) });
			val.transform.SetParent(parent, false);
			val.GetComponent<RectTransform>().sizeDelta = new Vector2(size, size);
			GameObject val2 = new GameObject("Ring", new Type[3]
			{
				typeof(RectTransform),
				typeof(CanvasRenderer),
				typeof(Image)
			});
			val2.transform.SetParent(val.transform, false);
			ring = val2.GetComponent<Image>();
			SetFullRect(((Graphic)ring).rectTransform);
			ring.preserveAspect = true;
			ring.sprite = _ringSprite;
			GameObject val3 = new GameObject("Face", new Type[3]
			{
				typeof(RectTransform),
				typeof(CanvasRenderer),
				typeof(Image)
			});
			val3.transform.SetParent(val.transform, false);
			face = val3.GetComponent<Image>();
			SetFullRect(((Graphic)face).rectTransform);
			face.preserveAspect = true;
			face.sprite = _faceSprite;
			return val;
		}

		private static void SetFullRect(RectTransform rect)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			rect.anchorMin = Vector2.zero;
			rect.anchorMax = Vector2.one;
			rect.offsetMin = Vector2.zero;
			rect.offsetMax = Vector2.zero;
		}

		private TextMeshProUGUI CreateText(Transform parent, string name, float size, out List<TextMeshProUGUI> shadows)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			shadows = new List<TextMeshProUGUI>();
			GameObject val = new GameObject(name, new Type[3]
			{
				typeof(RectTransform),
				typeof(CanvasRenderer),
				typeof(TextMeshProUGUI)
			});
			val.transform.SetParent(parent, false);
			TextMeshProUGUI component = val.GetComponent<TextMeshProUGUI>();
			((TMP_Text)component).fontSize = size;
			((TMP_Text)component).alignment = (TextAlignmentOptions)514;
			((Graphic)component).raycastTarget = false;
			((TMP_Text)component).overflowMode = (TextOverflowModes)0;
			((TMP_Text)component).enableWordWrapping = false;
			((TMP_Text)component).richText = true;
			for (int i = 0; i < 8; i++)
			{
				GameObject val2 = new GameObject(name + "Shadow" + i, new Type[3]
				{
					typeof(RectTransform),
					typeof(CanvasRenderer),
					typeof(TextMeshProUGUI)
				});
				val2.transform.SetParent(parent, false);
				TextMeshProUGUI component2 = val2.GetComponent<TextMeshProUGUI>();
				((TMP_Text)component2).fontSize = size;
				((TMP_Text)component2).alignment = (TextAlignmentOptions)514;
				((Graphic)component2).raycastTarget = false;
				((TMP_Text)component2).overflowMode = (TextOverflowModes)0;
				((TMP_Text)component2).enableWordWrapping = false;
				((TMP_Text)component2).richText = false;
				((TMP_Text)component2).transform.SetAsFirstSibling();
				shadows.Add(component2);
			}
			return component;
		}

		private void Hide(State state)
		{
			if ((Object)(object)state.LabelRoot == (Object)null)
			{
				state.Fade = 0f;
				return;
			}
			if (state.Fade > 0f)
			{
				state.Fade = Mathf.MoveTowards(state.Fade, 0f, Time.unscaledDeltaTime / 0.6f);
				state.LabelGroup.alpha = state.Fade;
				state.EdgeGroup.alpha = state.Fade;
				if (state.Fade > 0f)
				{
					return;
				}
			}
			state.LabelRoot.SetActive(false);
			state.EdgeRoot.SetActive(false);
		}

		private void HideAll()
		{
			foreach (State value in _states.Values)
			{
				Hide(value);
			}
			foreach (State fakeState in _fakeStates)
			{
				Hide(fakeState);
			}
		}

		private void RemoveState(Character character)
		{
			if (_states.TryGetValue(character, out var value))
			{
				if ((Object)(object)value.LabelRoot != (Object)null)
				{
					Object.Destroy((Object)(object)value.LabelRoot);
				}
				if ((Object)(object)value.EdgeRoot != (Object)null)
				{
					Object.Destroy((Object)(object)value.EdgeRoot);
				}
				_states.Remove(character);
			}
		}

		private void RemoveFakeState(State state)
		{
			if ((Object)(object)state.LabelRoot != (Object)null)
			{
				Object.Destroy((Object)(object)state.LabelRoot);
			}
			if ((Object)(object)state.EdgeRoot != (Object)null)
			{
				Object.Destroy((Object)(object)state.EdgeRoot);
			}
			_fakeStates.Remove(state);
		}

		private static Color WithAlpha(Color color, float alpha)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			color.a = alpha;
			return color;
		}
	}
	public class OverlayManager
	{
		private Canvas _canvas;

		private GameObject _labelPrefab;

		private Transform _canvasTransform;

		private List<TMP_FontAsset> _availableFonts = new List<TMP_FontAsset>();

		private int _currentFontIndex;

		private TMP_FontAsset _currentFont;

		private readonly Dictionary<int, PlayerLabel> _activeLabels = new Dictionary<int, PlayerLabel>();

		private bool _shouldShowLabels;

		private float _hideTimeTimestamp;

		private bool _initialized;

		private float _lastGlobalOpacity = -1f;

		private bool _lastDisableWarnings = true;

		private TriggerModeEnum _lastTriggerMode;

		private bool _alwaysOnUserHidden;

		private float _nextFontCheckTime;

		private bool _isUsingFallbackFont;

		public int ActiveCount => _activeLabels.Count;

		public string CurrentFontName
		{
			get
			{
				if (!((Object)(object)_currentFont != (Object)null))
				{
					return "None";
				}
				return ((Object)_currentFont).name;
			}
		}

		public TMP_FontAsset CurrentFont => _currentFont;

		public OverlayManager()
		{
			SceneManager.sceneLoaded += OnSceneLoaded;
		}

		public void Dispose()
		{
			SceneManager.sceneLoaded -= OnSceneLoaded;
			ClearAllLabels();
			if ((Object)(object)_canvas != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)_canvas).gameObject);
			}
		}

		public void TryInitialize()
		{
			if (_initialized)
			{
				return;
			}
			try
			{
				CreateCanvasSystem();
				_initialized = true;
				Plugin.Log.LogInfo((object)"OverlayManager: Initialized.");
			}
			catch (Exception arg)
			{
				Plugin.Log.LogError((object)$"Init Failed: {arg}");
			}
		}

		private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			ClearAllLabels();
			_availableFonts.Clear();
			_initialized = false;
		}

		private void ClearAllLabels()
		{
			foreach (PlayerLabel value in _activeLabels.Values)
			{
				value.Destroy();
			}
			_activeLabels.Clear();
		}

		public void UpdateInput()
		{
			if (!_initialized || (Object)(object)_canvas == (Object)null)
			{
				TryInitialize();
			}
			else
			{
				HandleInput();
			}
		}

		public void LateUpdate()
		{
			if (Configuration.ShowName == null || Configuration.ShowDistance == null)
			{
				return;
			}
			if (!Configuration.ShowName.Value && !Configuration.ShowDistance.Value)
			{
				if (_activeLabels.Count > 0)
				{
					ClearAllLabels();
				}
			}
			else
			{
				if (!_initialized || (Object)(object)_canvas == (Object)null)
				{
					return;
				}
				if (Configuration.DisableTMPWarnings != null && _lastDisableWarnings != Configuration.DisableTMPWarnings.Value)
				{
					ApplyTMPSettings();
					_lastDisableWarnings = Configuration.DisableTMPWarnings.Value;
				}
				if (_isUsingFallbackFont && Time.time > _nextFontCheckTime)
				{
					_nextFontCheckTime = Time.time + 1f;
					TryFindBetterFont();
				}
				bool flag = Mathf.Abs(_lastGlobalOpacity - Configuration.GlobalOpacity.Value) > 0.01f;
				foreach (int item in _activeLabels.Keys.ToList())
				{
					PlayerLabel playerLabel = _activeLabels[item];
					if (!playerLabel.IsValid())
					{
						playerLabel.SetVisible(visible: false);
						continue;
					}
					if (flag)
					{
						playerLabel.RefreshStyle();
					}
					playerLabel.UpdateState(_shouldShowLabels);
				}
				if (flag)
				{
					_lastGlobalOpacity = Configuration.GlobalOpacity.Value;
				}
			}
		}

		public void RegisterCharacter(Character c)
		{
			if (!_initialized)
			{
				TryInitialize();
			}
			if (!((Object)(object)c == (Object)null) && !((Object)(object)c == (Object)(object)Character.localCharacter))
			{
				string text = Tracking.ExtractDisplayName(((Object)c).name);
				if (!(text == "Bot"))
				{
					Transform val = ((Component)c).transform.Find("Scout/Misc/CharacterLight");
					Transform trackTarget = (((Object)(object)val != (Object)null) ? val : ((Component)c).transform);
					RegisterGenericTarget(((Component)c).gameObject, trackTarget, text);
				}
			}
		}

		public void RegisterFakeTarget(GameObject root, string customName)
		{
			if (!_initialized)
			{
				TryInitialize();
			}
			if (!((Object)(object)root == (Object)null))
			{
				Transform val = root.transform.Find("Scout/Misc/CharacterLight");
				Transform trackTarget = (((Object)(object)val != (Object)null) ? val : root.transform);
				RegisterGenericTarget(root, trackTarget, customName);
			}
		}

		private void RegisterGenericTarget(GameObject owner, Transform trackTarget, string displayName)
		{
			int instanceID = ((Object)owner).GetInstanceID();
			if (!_activeLabels.ContainsKey(instanceID))
			{
				if ((Object)(object)_currentFont == (Object)null)
				{
					InitializeFonts();
				}
				GameObject val = Object.Instantiate<GameObject>(_labelPrefab, _canvasTransform);
				val.SetActive(true);
				SetLayerRecursively(val, 5);
				PlayerLabel value = new PlayerLabel(trackTarget, val, _currentFont, displayName);
				_activeLabels.Add(instanceID, value);
			}
		}

		public void UnregisterCharacter(GameObject owner)
		{
			if (!((Object)(object)owner == (Object)null))
			{
				int instanceID = ((Object)owner).GetInstanceID();
				if (_activeLabels.TryGetValue(instanceID, out var value))
				{
					value.Destroy();
					_activeLabels.Remove(instanceID);
				}
			}
		}

		public void UnregisterTarget(GameObject owner)
		{
			UnregisterCharacter(owner);
		}

		public void CycleFont(int direction)
		{
			if (_availableFonts.Count == 0)
			{
				InitializeFonts();
			}
			if (_availableFonts.Count == 0)
			{
				return;
			}
			_currentFontIndex += direction;
			if (_currentFontIndex >= _availableFonts.Count)
			{
				_currentFontIndex = 0;
			}
			if (_currentFontIndex < 0)
			{
				_currentFontIndex = _availableFonts.Count - 1;
			}
			_currentFont = _availableFonts[_currentFontIndex];
			_isUsingFallbackFont = false;
			foreach (PlayerLabel value in _activeLabels.Values)
			{
				value.SetFont(_currentFont);
			}
			Plugin.Log.LogInfo((object)("Switched Font to: " + ((Object)_currentFont).name));
		}

		private void HandleInput()
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			if (Configuration.TriggerMode == null)
			{
				return;
			}
			TriggerModeEnum value = Configuration.TriggerMode.Value;
			if (value != _lastTriggerMode)
			{
				_hideTimeTimestamp = 0f;
				_shouldShowLabels = false;
				_alwaysOnUserHidden = false;
				_lastTriggerMode = value;
				Plugin.Log.LogInfo((object)$"Mode changed to {value}, state reset.");
			}
			switch (value)
			{
			case TriggerModeEnum.AlwaysOn:
				if (Configuration.ToggleKey != null && Input.GetKeyDown(Configuration.ToggleKey.Value))
				{
					_alwaysOnUserHidden = !_alwaysOnUserHidden;
				}
				_shouldShowLabels = !_alwaysOnUserHidden;
				return;
			case TriggerModeEnum.Toggle:
				if (Configuration.ToggleKey != null && Input.GetKeyDown(Configuration.ToggleKey.Value))
				{
					float num = ((Configuration.ToggleDuration != null) ? Configuration.ToggleDuration.Value : 10f);
					if (Time.time < _hideTimeTimestamp)
					{
						_hideTimeTimestamp = Time.time;
					}
					else
					{
						_hideTimeTimestamp = Time.time + num;
					}
				}
				_shouldShowLabels = Time.time < _hideTimeTimestamp;
				return;
			}
			float num2 = ((Configuration.HoldKeepDuration != null) ? Configuration.HoldKeepDuration.Value : 1f);
			if (Configuration.ToggleKey != null)
			{
				if (Input.GetKey(Configuration.ToggleKey.Value))
				{
					_hideTimeTimestamp = Time.time + num2 + 0.1f;
				}
				else if (Input.GetKeyUp(Configuration.ToggleKey.Value))
				{
					_hideTimeTimestamp = Time.time + num2;
				}
			}
			_shouldShowLabels = Time.time < _hideTimeTimestamp;
		}

		private void CreateCanvasSystem()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_canvas != (Object)null))
			{
				ApplyTMPSettings();
				InitializeFonts();
				GameObject val = new GameObject("DistanceDisplayCanvas");
				Object.DontDestroyOnLoad((Object)(object)val);
				val.layer = 5;
				_canvas = val.AddComponent<Canvas>();
				_canvas.renderMode = (RenderMode)0;
				_canvas.sortingOrder = 999;
				CanvasScaler obj = val.AddComponent<CanvasScaler>();
				obj.uiScaleMode = (ScaleMode)1;
				obj.referenceResolution = new Vector2(1920f, 1080f);
				val.AddComponent<GraphicRaycaster>();
				_canvasTransform = val.transform;
				CreateLabelPrefab();
			}
		}

		private void ApplyTMPSettings()
		{
			if (Configuration.DisableTMPWarnings == null || !Configuration.DisableTMPWarnings.Value)
			{
				return;
			}
			try
			{
				TMP_Settings val = Resources.Load<TMP_Settings>("TMP Settings");
				if ((Object)(object)val == (Object)null)
				{
					val = Resources.FindObjectsOfTypeAll<TMP_Settings>().FirstOrDefault();
				}
				if (!((Object)(object)val != (Object)null))
				{
					return;
				}
				FieldInfo field = typeof(TMP_Settings).GetField("m_warningsDisabled", BindingFlags.Instance | BindingFlags.NonPublic);
				if (field != null)
				{
					field.SetValue(val, true);
					Plugin.Log.LogInfo((object)"TMP Warnings disabled (Reflection).");
					return;
				}
				PropertyInfo property = typeof(TMP_Settings).GetProperty("warningsDisabled", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
				if (property != null && property.CanWrite)
				{
					property.SetValue(val, true);
				}
			}
			catch (Exception)
			{
			}
		}

		private void InitializeFonts()
		{
			_availableFonts.Clear();
			try
			{
				TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>();
				if (array != null)
				{
					TMP_FontAsset[] array2 = array;
					foreach (TMP_FontAsset val in array2)
					{
						if ((Object)(object)val != (Object)null && !string.IsNullOrEmpty(((Object)val).name) && (Object)(object)val.atlasTexture != (Object)null)
						{
							_availableFonts.Add(val);
						}
					}
				}
				_availableFonts.Sort((TMP_FontAsset a, TMP_FontAsset b) => string.Compare(((Object)a).name, ((Object)b).name));
			}
			catch
			{
			}
			if (_availableFonts.Count > 0)
			{
				TMP_FontAsset val2 = ((IEnumerable<TMP_FontAsset>)_availableFonts).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset f) => ((Object)f).name.IndexOf("Daruma", StringComparison.OrdinalIgnoreCase) >= 0)) ?? ((IEnumerable<TMP_FontAsset>)_availableFonts).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset f) => ((Object)f).name.IndexOf("Noto", StringComparison.OrdinalIgnoreCase) >= 0)) ?? ((IEnumerable<TMP_FontAsset>)_availableFonts).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset f) => ((Object)f).name.IndexOf("Liberation", StringComparison.OrdinalIgnoreCase) >= 0));
				if ((Object)(object)val2 != (Object)null)
				{
					_currentFont = val2;
					_currentFontIndex = _availableFonts.IndexOf(val2);
				}
				else
				{
					_currentFont = _availableFonts[0];
					_currentFontIndex = 0;
				}
				if (((Object)_currentFont).name.IndexOf("Daruma", StringComparison.OrdinalIgnoreCase) >= 0)
				{
					_isUsingFallbackFont = false;
				}
				else
				{
					_isUsingFallbackFont = true;
				}
			}
		}

		private void TryFindBetterFont()
		{
			try
			{
				TMP_FontAsset val = ((IEnumerable<TMP_FontAsset>)Resources.FindObjectsOfTypeAll<TMP_FontAsset>()).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset f) => (Object)(object)f != (Object)null && ((Object)f).name.IndexOf("Daruma", StringComparison.OrdinalIgnoreCase) >= 0 && (Object)(object)f.atlasTexture != (Object)null));
				if (!((Object)(object)val != (Object)null))
				{
					return;
				}
				if (!_availableFonts.Contains(val))
				{
					_availableFonts.Add(val);
				}
				_availableFonts.Sort((TMP_FontAsset a, TMP_FontAsset b) => string.Compare(((Object)a).name, ((Object)b).name));
				_currentFont = val;
				_currentFontIndex = _availableFonts.IndexOf(val);
				_isUsingFallbackFont = false;
				foreach (PlayerLabel value in _activeLabels.Values)
				{
					value.SetFont(_currentFont);
				}
				Plugin.Log.LogInfo((object)("Auto-recovered Font to: " + ((Object)val).name));
			}
			catch
			{
			}
		}

		private void CreateLabelPrefab()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			_labelPrefab = new GameObject("LabelPrefab");
			_labelPrefab.transform.SetParent(_canvasTransform);
			_labelPrefab.layer = 5;
			_labelPrefab.SetActive(false);
			CanvasGroup obj = _labelPrefab.AddComponent<CanvasGroup>();
			obj.alpha = 0f;
			obj.blocksRaycasts = false;
			obj.interactable = false;
		}

		private void SetLayerRecursively(GameObject obj, int newLayer)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			if ((Object)(object)obj == (Object)null)
			{
				return;
			}
			obj.layer = newLayer;
			foreach (Transform item in obj.transform)
			{
				Transform val = item;
				if ((Object)(object)val != (Object)null)
				{
					SetLayerRecursively(((Component)val).gameObject, newLayer);
				}
			}
		}
	}
	public class PlayerLabel
	{
		private Transform _targetPoint;

		private GameObject _rootObj;

		private RectTransform _rootRect;

		private CanvasGroup _canvasGroup;

		private TextMeshProUGUI _mainText;

		private List<TextMeshProUGUI> _shadowTexts = new List<TextMeshProUGUI>();

		private string _displayName;

		private Camera _mainCam;

		private const float FADE_TIME = 0.4f;

		private static readonly Regex ColorTagRegex = new Regex("<color=.*?>|<\\/color>", RegexOptions.IgnoreCase);

		private readonly Vector2[] _offsets = (Vector2[])(object)new Vector2[8]
		{
			new Vector2(0f, 1f),
			new Vector2(0f, -1f),
			new Vector2(-1f, 0f),
			new Vector2(1f, 0f),
			new Vector2(-1f, 1f),
			new Vector2(1f, 1f),
			new Vector2(-1f, -1f),
			new Vector2(1f, -1f)
		};

		public PlayerLabel(Transform target, GameObject rootUiObj, TMP_FontAsset font, string name)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: 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_00a2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Expected O, but got Unknown
			_targetPoint = target;
			_rootObj = rootUiObj;
			_rootRect = _rootObj.GetComponent<RectTransform>();
			_canvasGroup = _rootObj.GetComponent<CanvasGroup>();
			_displayName = name;
			_mainCam = Camera.main;
			for (int i = 0; i < 8; i++)
			{
				GameObject val = new GameObject($"Shadow_{i}");
				val.transform.SetParent(_rootObj.transform);
				val.layer = 5;
				TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>();
				SetupTextCommon(val2, font);
				_shadowTexts.Add(val2);
			}
			GameObject val3 = new GameObject("MainText");
			val3.transform.SetParent(_rootObj.transform);
			val3.layer = 5;
			_mainText = val3.AddComponent<TextMeshProUGUI>();
			SetupTextCommon(_mainText, font);
			RefreshStyle();
		}

		private void SetupTextCommon(TextMeshProUGUI tmp, TMP_FontAsset font)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			((TMP_Text)tmp).alignment = (TextAlignmentOptions)514;
			((Graphic)tmp).raycastTarget = false;
			((TMP_Text)tmp).overflowMode = (TextOverflowModes)0;
			((TMP_Text)tmp).enableWordWrapping = false;
			((TMP_Text)tmp).richText = true;
			if ((Object)(object)font != (Object)null)
			{
				((TMP_Text)tmp).font = font;
			}
			((TMP_Text)tmp).rectTransform.anchoredPosition = Vector2.zero;
		}

		public bool IsValid()
		{
			if ((Object)(object)_targetPoint != (Object)null)
			{
				return ((Component)_targetPoint).gameObject.activeInHierarchy;
			}
			return false;
		}

		public void SetFont(TMP_FontAsset font)
		{
			if ((Object)(object)_mainText != (Object)null)
			{
				((TMP_Text)_mainText).font = font;
			}
			foreach (TextMeshProUGUI shadowText in _shadowTexts)
			{
				((TMP_Text)shadowText).font = font;
			}
		}

		public void RefreshStyle()
		{
			//IL_0000: 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_000b: 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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			_ = Configuration.FixedShadowColor;
			Color fixedShadowColor = Configuration.FixedShadowColor;
			fixedShadowColor.a = 0.8f;
			Color color = default(Color);
			((Color)(ref color))..ctor(0.875f, 0.855f, 0.761f, 1f);
			((Graphic)_mainText).color = color;
			float num = 1.5f;
			for (int i = 0; i < 8 && i < _shadowTexts.Count; i++)
			{
				TextMeshProUGUI obj = _shadowTexts[i];
				((Graphic)obj).color = fixedShadowColor;
				((TMP_Text)obj).rectTransform.anchoredPosition = _offsets[i] * num;
			}
		}

		public void UpdateState(bool globalShow)
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: 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_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_rootObj == (Object)null || (Object)(object)_canvasGroup == (Object)null)
			{
				return;
			}
			if ((Object)(object)_mainCam == (Object)null)
			{
				_mainCam = Camera.main;
			}
			if ((Object)(object)_mainCam == (Object)null || (Object)(object)_targetPoint == (Object)null)
			{
				_canvasGroup.alpha = 0f;
				SetVisible(visible: false);
				return;
			}
			Vector3 val = _targetPoint.position + Vector3.up * 1.2f;
			float num = Vector3.Distance(((Component)_mainCam).transform.position, _targetPoint.position);
			Vector3 val2 = _mainCam.WorldToViewportPoint(val);
			bool flag = globalShow;
			if (Configuration.MinDistance != null && num < Configuration.MinDistance.Value)
			{
				flag = false;
			}
			else if (Configuration.MaxDistance != null && num > Configuration.MaxDistance.Value)
			{
				flag = false;
			}
			if (val2.z <= 0f || val2.x < 0f || val2.x > 1f || val2.y < 0f || val2.y > 1f)
			{
				_canvasGroup.alpha = 0f;
				SetVisible(visible: false);
				return;
			}
			float num2 = 2.5f;
			float num3 = ((Configuration.GlobalOpacity != null && flag) ? Configuration.GlobalOpacity.Value : 0f);
			float num4 = Mathf.MoveTowards(_canvasGroup.alpha, num3, num2 * Time.deltaTime);
			bool flag2 = flag || num4 > 0.01f;
			SetVisible(flag2);
			_canvasGroup.alpha = num4;
			if (!flag2)
			{
				return;
			}
			Vector3 position = _mainCam.WorldToScreenPoint(val);
			_rootObj.transform.position = position;
			string text = "";
			if (Configuration.NameFontSize != null)
			{
				float value = Configuration.NameFontSize.Value;
				float value2 = Configuration.DistFontSize.Value;
				bool value3 = Configuration.ShowName.Value;
				bool value4 = Configuration.ShowDistance.Value;
				if (value3)
				{
					text += $"<size={value}>{_displayName}</size>";
				}
				if (value3 && value4)
				{
					text += "\n";
				}
				if (value4)
				{
					text += $"<size={value2}>{num:F0}m</size>";
				}
			}
			((TMP_Text)_mainText).text = text;
			string text2 = ColorTagRegex.Replace(text, string.Empty);
			foreach (TextMeshProUGUI shadowText in _shadowTexts)
			{
				((TMP_Text)shadowText).text = text2;
			}
		}

		public void SetVisible(bool visible)
		{
			if (!((Object)(object)_rootObj == (Object)null) && _rootObj.activeSelf != visible)
			{
				_rootObj.SetActive(visible);
			}
		}

		public void Destroy()
		{
			if ((Object)(object)_rootObj != (Object)null)
			{
				Object.Destroy((Object)(object)_rootObj);
			}
		}
	}
	[BepInPlugin("com.AiAe.betterplayerdistance", "Better Player Distance", "0.1.17")]
	public class Plugin : BaseUnityPlugin
	{
		public static Plugin Instance;

		public static ManualLogSource Log;

		public static OverlayManager Overlay;

		public static DownedManager Downed;

		private Harmony _harmony;

		private bool _showDebugMenu;

		private string _debugNameInput = "测试员01";

		private List<GameObject> _fakePlayers = new List<GameObject>();

		private Rect _debugWindowRect = new Rect(20f, 20f, 350f, 500f);

		private bool _hasLoggedError;

		private bool _isConfigLoaded;

		private void Awake()
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			try
			{
				Configuration.Initialize(((BaseUnityPlugin)this).Config);
				DownedConfiguration.Initialize(((BaseUnityPlugin)this).Config);
				_isConfigLoaded = true;
			}
			catch (Exception arg)
			{
				Log.LogError((object)$"Config Init Failed: {arg}");
				_isConfigLoaded = false;
			}
			try
			{
				_harmony = new Harmony("com.AiAe.betterplayerdistance");
				_harmony.PatchAll();
			}
			catch
			{
			}
			Overlay = new OverlayManager();
			Downed = new DownedManager();
			Log.LogInfo((object)"BetterPlayerDistance v0.1.17 (AIAE) Loaded.");
		}

		private void Start()
		{
			if (Overlay != null)
			{
				Overlay.TryInitialize();
			}
		}

		private void Update()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown(Configuration.DebugMenuKey.Value))
			{
				_showDebugMenu = !_showDebugMenu;
				if (_showDebugMenu)
				{
					Cursor.visible = true;
					Cursor.lockState = (CursorLockMode)0;
				}
			}
			if (Overlay == null)
			{
				return;
			}
			try
			{
				Overlay.UpdateInput();
			}
			catch (Exception arg)
			{
				if (!_hasLoggedError)
				{
					Log.LogError((object)$"Overlay Input Error: {arg}");
					_hasLoggedError = true;
				}
			}
		}

		private void LateUpdate()
		{
			if (Overlay != null)
			{
				try
				{
					Overlay.LateUpdate();
				}
				catch (Exception arg)
				{
					if (!_hasLoggedError)
					{
						Log.LogError((object)$"Overlay Render Error: {arg}");
						_hasLoggedError = true;
					}
				}
			}
			if (Downed == null)
			{
				return;
			}
			try
			{
				Downed.LateUpdate();
			}
			catch (Exception arg2)
			{
				if (!_hasLoggedError)
				{
					Log.LogError((object)$"Downed Render Error: {arg2}");
					_hasLoggedError = true;
				}
			}
		}

		private void OnDestroy()
		{
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Downed?.Dispose();
			Overlay?.Dispose();
		}

		private void OnGUI()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0064: 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)
			if (!_showDebugMenu || !Configuration.DebugMode.Value)
			{
				return;
			}
			if (_showDebugMenu)
			{
				Cursor.visible = true;
				Cursor.lockState = (CursorLockMode)0;
			}
			GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 0.95f);
			try
			{
				_debugWindowRect = GUI.Window(888, _debugWindowRect, new WindowFunction(DrawDebugWindow), "调试控制台 / Debug Console [Insert]");
			}
			catch
			{
			}
		}

		private void DrawDebugWindow(int windowID)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			GUI.DragWindow(new Rect(0f, 0f, 10000f, 20f));
			GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
			GUILayout.Label("BetterPlayerDistance (AIAE) <color=yellow>v0.1.17</color>", Array.Empty<GUILayoutOption>());
			if (!_isConfigLoaded)
			{
				GUILayout.Label("<color=red>严重错误 / Fatal: 配置文件加载失败!Config init failed.</color>", Array.Empty<GUILayoutOption>());
				GUILayout.Label("请删除 BepInEx/config 下的 .cfg 文件并重启。\nDelete the .cfg under BepInEx/config and restart.", Array.Empty<GUILayoutOption>());
			}
			else
			{
				string text = ((Configuration.TriggerMode != null) ? Configuration.TriggerMode.Value.ToString() : "Error");
				GUILayout.Label("当前模式 / Mode: <color=cyan>" + text + "</color>", Array.Empty<GUILayoutOption>());
			}
			GUILayout.Label(string.Format("状态 / State: {0} | 标签数 / Labels: {1}", (Overlay != null) ? "Active" : "Null", Overlay?.ActiveCount ?? 0), Array.Empty<GUILayoutOption>());
			GUILayout.Label("字体 / Font: " + (Overlay?.CurrentFontName ?? "Unknown"), Array.Empty<GUILayoutOption>());
			GUILayout.Space(5f);
			GUILayout.Label("--- 性能 / Performance ---", Array.Empty<GUILayoutOption>());
			if (Configuration.DisableTMPWarnings != null)
			{
				string text2 = (Configuration.DisableTMPWarnings.Value ? "开启 / On" : "关闭 / Off");
				if (GUILayout.Button("禁用TMP警告 / Disable TMP Warnings: [" + text2 + "]", Array.Empty<GUILayoutOption>()))
				{
					Configuration.DisableTMPWarnings.Value = !Configuration.DisableTMPWarnings.Value;
				}
			}
			else
			{
				GUILayout.Label("<color=red>Config Error: DisableTMPWarnings is NULL</color>", Array.Empty<GUILayoutOption>());
			}
			GUILayout.Space(5f);
			GUILayout.Label("--- 假人测试 / Fake Players ---", Array.Empty<GUILayoutOption>());
			_debugNameInput = GUILayout.TextField(_debugNameInput, 20, Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("生成-前方 / Spawn (Front)", Array.Empty<GUILayoutOption>()))
			{
				SpawnFakeSafe(_debugNameInput, isColorful: false);
			}
			if (GUILayout.Button("生成-彩名 / Spawn (Colored)", Array.Empty<GUILayoutOption>()))
			{
				SpawnFakeSafe(_debugNameInput, isColorful: true);
			}
			GUILayout.EndHorizontal();
			if (GUILayout.Button("清除所有假人 / Clear All Fakes", Array.Empty<GUILayoutOption>()))
			{
				ClearFakePlayers();
			}
			GUILayout.Space(5f);
			GUILayout.Label("--- 昏迷测试 / Downed Test ---", Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(