Decompiled source of DebugMod v0.1.34

InUCS.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx.Logging;
using Collider2DViewer;
using InUCS;
using InUCS.Addons.Collider2DViewer;
using InUCS.Components;
using InUCS.Logging;
using InUCS.Logging.Loggers;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[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("InUCS")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+5381bb6a6b8a97dce978d58770de099b21b43190")]
[assembly: AssemblyProduct("InUCS")]
[assembly: AssemblyTitle("InUCS")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace InUCS
{
	public static class Helpers
	{
		public static uint BoolToInt(bool val)
		{
			return Convert.ToUInt32(val);
		}
	}
	public static class ReflectionHelper
	{
		private static bool HasMethodDefinition(LocalComponent comp, string method, BindingFlags flags, out MethodInfo methodInfo)
		{
			methodInfo = comp.GetType().GetMethod(method, flags);
			if (methodInfo != null && methodInfo.DeclaringType == methodInfo.ReflectedType)
			{
				return !methodInfo.IsAbstract;
			}
			return false;
		}

		public static bool HasOwnPrivateDefinition(this LocalComponent comp, string method, out MethodInfo methodInfo)
		{
			return HasMethodDefinition(comp, method, BindingFlags.Instance | BindingFlags.NonPublic, out methodInfo);
		}

		public static bool HasOwnPublicDefinition(this LocalComponent comp, string method, out MethodInfo methodInfo)
		{
			return HasMethodDefinition(comp, method, BindingFlags.Instance | BindingFlags.Public, out methodInfo);
		}

		public static bool HasOwnAnyDefinition(this LocalComponent comp, string method, out MethodInfo methodInfo)
		{
			return HasMethodDefinition(comp, method, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, out methodInfo);
		}

		public static Type[]? GetAllTypesOfBase<T>() where T : class
		{
			return AppDomain.CurrentDomain.GetAssemblies()?.Where((Assembly a) => !a.IsDynamic)?.SelectMany((Assembly a) => a.GetTypes())?.Where((Type t) => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(T)))?.ToArray();
		}

		public static ConstructorInfo? FindFirstSuitableCtorWithParamMatch(Type target, object[] parameters, out string? reason)
		{
			object[] parameters2 = parameters;
			reason = null;
			ConstructorInfo[] array = target.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.Where((ConstructorInfo x) => x.GetParameters()?.Length == parameters2.Length)?.ToArray();
			if (array == null || array.Length == 0)
			{
				reason = "no suitable ctors found for [" + target.FullName + ": " + string.Join(',', parameters2) + "]";
				return null;
			}
			ConstructorInfo constructorInfo = null;
			ConstructorInfo[] array2 = array;
			foreach (ConstructorInfo constructorInfo2 in array2)
			{
				ParameterInfo[] parameters3 = constructorInfo2.GetParameters();
				int j;
				for (j = 0; j < parameters3.Length && parameters2[j].GetType() == parameters3[j].ParameterType; j++)
				{
				}
				if (j == parameters3.Length)
				{
					constructorInfo = constructorInfo2;
					break;
				}
			}
			if (constructorInfo == null)
			{
				reason = "no matching param types found for [" + target.FullName + ": " + string.Join(',', parameters2) + "]";
				return null;
			}
			return constructorInfo;
		}

		public static FieldInfo[]? FetchFieldsWithAttribute<T>(Type t, BindingFlags flags) where T : Attribute
		{
			List<FieldInfo> list = null;
			FieldInfo[] fields = t.GetFields(flags);
			if (fields == null || fields.Length == 0)
			{
				return null;
			}
			list = new List<FieldInfo>();
			FieldInfo[] array = fields;
			foreach (FieldInfo fieldInfo in array)
			{
				if (fieldInfo.CustomAttributes == null)
				{
					continue;
				}
				foreach (CustomAttributeData customAttribute in fieldInfo.CustomAttributes)
				{
					if (customAttribute.AttributeType == typeof(T))
					{
						list.Add(fieldInfo);
					}
				}
			}
			return list?.ToArray();
		}

		public static Type? FindTypeInAssembly(string assemblyName, string fullTypeName)
		{
			string assemblyName2 = assemblyName;
			string fullTypeName2 = fullTypeName;
			return AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly x) => x.GetName().Name.Equals(assemblyName2, StringComparison.OrdinalIgnoreCase))?.GetTypes().FirstOrDefault((Type x) => x.FullName.Equals(fullTypeName2, StringComparison.Ordinal));
		}

		public static string GetAssemblyDir()
		{
			return Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));
		}
	}
	public static class ScreenHelper
	{
		private const float BASE_WIDTH = 1920f;

		private const float BASE_HEIGHT = 1080f;

		private static float LAST_WIDTH = Screen.width;

		private static float LAST_HEIGHT = Screen.height;

		public static float WFac { get; private set; } = 1f;


		public static float HFac { get; private set; } = 1f;


		public static float HEIGHT => LAST_HEIGHT;

		public static float WIDTH => LAST_WIDTH;

		public static Matrix4x4 GUIMatrix { get; private set; }

		public static void UpdateScreenFactor()
		{
			//IL_0050: 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_0077: 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)
			if (LAST_WIDTH != (float)Screen.width || LAST_HEIGHT != (float)Screen.height)
			{
				LAST_WIDTH = Screen.width;
				LAST_HEIGHT = Screen.height;
				WFac = 1920f / LAST_WIDTH;
				HFac = 1080f / LAST_HEIGHT;
				GUIMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3((float)Screen.width / 1920f, (float)Screen.height / 1080f, 1f));
			}
		}

		public static bool PointWithinScreenSpace(Vector3 screenPos)
		{
			//IL_0000: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			if (screenPos.x > 0f && screenPos.x < (float)Screen.width && screenPos.y > 0f)
			{
				return screenPos.y < (float)Screen.height;
			}
			return false;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static Matrix4x4 CalculateMatrix(float X, float Y)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			return Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(X / 1920f, Y / 1080f, 1f));
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static Matrix4x4 CalculateMatrixInLine(ref Matrix4x4 matrix, float X, float Y)
		{
			//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_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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			return matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(X / 1920f, Y / 1080f, 1f));
		}
	}
	public static class UnityExtensions
	{
	}
	public static class GLog
	{
		private static ILogRouter _logger = new SystemNetLogger("Global");

		public static ILogRouter DefaultLogger
		{
			get
			{
				return _logger;
			}
			set
			{
				_logger = value ?? _logger;
			}
		}

		public static void Info(object msg)
		{
			_logger.Info(msg);
		}

		public static void Debug(object msg)
		{
			_logger.Debug(msg);
		}

		public static void Message(object msg)
		{
			_logger.Message(msg);
		}

		public static void Error(object msg)
		{
			_logger.Error(msg);
		}

		public static void Warn(object msg)
		{
			_logger.Warn(msg);
		}
	}
	public abstract class ComponentManager : MonoBehaviour
	{
		private Type[]? DiscoveredComponents = ReflectionHelper.GetAllTypesOfBase<LocalComponent>();

		private readonly Dictionary<Type, LocalComponent> AllComponents = new Dictionary<Type, LocalComponent>();

		private readonly List<LocalComponent> EnabledComponents = new List<LocalComponent>();

		private readonly List<LocalComponent> StackOnGUI = new List<LocalComponent>();

		private readonly List<LocalComponent> StackUpdate = new List<LocalComponent>();

		private readonly List<LocalComponent> StackLateUpdate = new List<LocalComponent>();

		private readonly List<LocalComponent> StackFixedUpdate = new List<LocalComponent>();

		public ILogRouter Logger { get; protected set; } = new UnityLogger("ComponentManager");


		protected string MyLogName => "[" + ((object)this).GetType().Name + "]";

		protected void Awake()
		{
			Logger.Message(((object)this).GetType().Name + ": base Awake");
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				EnabledComponents[i].Awake();
			}
		}

		protected void Start()
		{
			Logger.Message(((object)this).GetType().Name + ": base Start");
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				EnabledComponents[i].Start();
			}
		}

		protected void OnEnable()
		{
			Logger.Message(((object)this).GetType().Name + ": base OnEnable");
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				EnabledComponents[i].OnEnable();
			}
		}

		protected void OnDisable()
		{
			Logger.Message(((object)this).GetType().Name + ": base OnDisable");
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				EnabledComponents[i].OnDisable();
			}
		}

		protected void OnDestroy()
		{
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				EnabledComponents[i].OnDestroy();
			}
			OnDestroy_Self();
		}

		protected void Update()
		{
			for (int i = 0; i < StackUpdate.Count; i++)
			{
				StackUpdate[i].Update();
			}
		}

		protected void OnGUI()
		{
			for (int i = 0; i < StackOnGUI.Count; i++)
			{
				StackOnGUI[i].OnGUI();
			}
		}

		protected void FixedUpdate()
		{
			for (int i = 0; i < StackFixedUpdate.Count; i++)
			{
				StackFixedUpdate[i].FixedUpdate();
			}
		}

		protected void LateUpdate()
		{
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				EnabledComponents[i].LateUpdate();
			}
		}

		protected virtual void SpawnComponents()
		{
			AppendAutoDiscoveredWithDefaults();
			PrintEnabledComponents();
		}

		protected virtual void AddComponent(LocalComponent comp)
		{
			Type type = comp.GetType();
			if (AllComponents.ContainsKey(type))
			{
				Logger.Error($"[{((object)this).GetType().Name}]: An attempt to add a duplicate component {type}");
				comp.OnComponentDisable();
				comp.OnDestroy();
				return;
			}
			Logger.Message($"{MyLogName}: adding component {comp.GetType().Name} [{comp.EnabledByDefault}, {comp.Priority}]");
			AllComponents[type] = comp;
			if (comp.EnabledByDefault)
			{
				EnableComponent(comp);
			}
			SortByPriority();
		}

		protected virtual void EnableComponent<T>() where T : LocalComponent
		{
			if (AllComponents.TryGetValue(typeof(T), out LocalComponent value))
			{
				EnableComponent(value);
			}
			else
			{
				Logger.Warn($"{((object)this).GetType().Name}: Failed to enable component {typeof(T)} - not found!");
			}
		}

		protected virtual void DisableComponent<T>() where T : LocalComponent
		{
			LocalComponent comp = EnabledComponents.FirstOrDefault((LocalComponent x) => x.GetType() == typeof(T));
			DisableComponent(comp);
		}

		protected virtual void RemoveComponent<T>() where T : LocalComponent
		{
			if (AllComponents.TryGetValue(typeof(T), out LocalComponent value))
			{
				RemoveComponent(value);
			}
			else
			{
				Logger.Warn($"{((object)this).GetType().Name}: Failed to remove component {typeof(T)} - not found!");
			}
		}

		protected virtual T? GetLocalComponent<T>() where T : LocalComponent
		{
			if (AllComponents.TryGetValue(typeof(T), out LocalComponent value))
			{
				return value as T;
			}
			return null;
		}

		protected virtual T? GetEnabledLocalComponent<T>() where T : LocalComponent
		{
			return EnabledComponents.FirstOrDefault((LocalComponent x) => x.GetType() == typeof(T)) as T;
		}

		public virtual bool ValidateComponentStore()
		{
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				if (!AllComponents.ContainsKey(EnabledComponents[i].GetType()))
				{
					return false;
				}
			}
			return true;
		}

		protected virtual int ResyncEnabledComponents()
		{
			int count = AllComponents.Count;
			for (int i = 0; i < EnabledComponents.Count; i++)
			{
				if (!AllComponents.ContainsKey(EnabledComponents[i].GetType()))
				{
					AllComponents[EnabledComponents[i].GetType()] = EnabledComponents[i];
				}
			}
			return AllComponents.Count - count;
		}

		protected virtual void SortByPriority()
		{
			EnabledComponents.Sort((LocalComponent i1, LocalComponent i2) => i2.Priority.CompareTo(i1.Priority));
			StackOnGUI.Sort((LocalComponent i1, LocalComponent i2) => i2.Priority.CompareTo(i1.Priority));
			StackUpdate.Sort((LocalComponent i1, LocalComponent i2) => i2.Priority.CompareTo(i1.Priority));
			StackLateUpdate.Sort((LocalComponent i1, LocalComponent i2) => i2.Priority.CompareTo(i1.Priority));
			StackFixedUpdate.Sort((LocalComponent i1, LocalComponent i2) => i2.Priority.CompareTo(i1.Priority));
		}

		private void OnDestroy_Self()
		{
			Logger.Warn(MyLogName + ": Self-destruction!");
			AllComponents.Clear();
			EnabledComponents.Clear();
			StackFixedUpdate.Clear();
			StackOnGUI.Clear();
			StackUpdate.Clear();
			StackLateUpdate.Clear();
		}

		private void AddComponentSpecialized(LocalComponent comp, string methodName, List<LocalComponent> specializedStack)
		{
			if (comp.HasOwnPublicDefinition(methodName, out MethodInfo _))
			{
				Logger.Message(comp.GetType().Name + " has " + methodName);
				specializedStack.Add(comp);
			}
		}

		private void EnableComponent(LocalComponent? comp)
		{
			if (comp != null)
			{
				Logger.Message($"{MyLogName}: enabling component {comp.GetType().Name} [{comp.EnabledByDefault}, {comp.Priority}]");
				comp.OnComponentEnable();
				EnabledComponents.Add(comp);
				AddComponentSpecialized(comp, "Update", StackUpdate);
				AddComponentSpecialized(comp, "OnGUI", StackOnGUI);
				AddComponentSpecialized(comp, "FixedUpdate", StackFixedUpdate);
				AddComponentSpecialized(comp, "LateUpdate", StackLateUpdate);
			}
		}

		private void RemoveComponent(LocalComponent? comp)
		{
			if (comp != null)
			{
				DisableComponent(comp);
				AllComponents.Remove(comp.GetType());
			}
		}

		private void DisableComponent(LocalComponent? comp)
		{
			if (comp != null)
			{
				comp.OnComponentDisable();
				EnabledComponents.Remove(comp);
				StackUpdate.Remove(comp);
				StackOnGUI.Remove(comp);
				StackFixedUpdate.Remove(comp);
				StackLateUpdate.Remove(comp);
			}
		}

		public virtual void PrintEnabledComponents()
		{
			Logger.Message($"{MyLogName}: total enabled components: {EnabledComponents.Count}");
			foreach (LocalComponent enabledComponent in EnabledComponents)
			{
				Logger.Message(string.Format("-| {0}: (autoenable: {1}, priority: {2}): {3}", enabledComponent.GetType().Name, enabledComponent.EnabledByDefault, enabledComponent.Priority, enabledComponent.isEnabled ? "enabled" : "disabled"));
			}
		}

		public virtual void PrintAllComponents()
		{
			Logger.Message($"{((object)this).GetType().Name}: total components: {AllComponents.Count}");
			foreach (KeyValuePair<Type, LocalComponent> allComponent in AllComponents)
			{
				Logger.Message(string.Format("{0}: ({1} | {2}): {3}", allComponent.Key.GetType().Name, allComponent.Value.EnabledByDefault, allComponent.Value.Priority, allComponent.Value.isEnabled ? "enabled" : "disabled"));
			}
		}

		protected virtual void AddComponentByFullNameWithParams(string fullName, params object[] prms)
		{
			string fullName2 = fullName;
			try
			{
				Type[]? discoveredComponents = DiscoveredComponents;
				DiscoveredComponents = ((discoveredComponents == null || discoveredComponents.Length == 0) ? ReflectionHelper.GetAllTypesOfBase<LocalComponent>() : DiscoveredComponents);
				Type[]? discoveredComponents2 = DiscoveredComponents;
				if (discoveredComponents2 == null || discoveredComponents2.Length == 0 || prms == null || prms.Length == 0)
				{
					Logger.Error(MyLogName + ": Unable to create component - no LocalComponent types found at all or invalid parameters supplied");
					return;
				}
				Type type = DiscoveredComponents?.Where((Type x) => x.FullName.Equals(fullName2))?.FirstOrDefault();
				if (type == null)
				{
					Logger.Error(MyLogName + ": Unable to find component with full name " + fullName2);
				}
				else
				{
					AddComponentByTypeWithParams(type, prms);
				}
			}
			catch (Exception ex)
			{
				Logger.Error(string.Format("{0}: ({1}) for {2} failed: {3}", MyLogName, "AddComponentByFullNameWithParams", fullName2, ex));
			}
		}

		private void AddComponentByTypeWithParams(Type lcType, params object[] prms)
		{
			LocalComponent localComponent = ConstructComponent(lcType, prms);
			if (localComponent != null)
			{
				AddComponent(localComponent);
			}
			else
			{
				Logger.Error($"{MyLogName}: Unable to add component {lcType} - it is NULL");
			}
		}

		private LocalComponent? ConstructComponent(Type lcType, params object[] prms)
		{
			LocalComponent localComponent = null;
			object[] parameters = new object[1] { this }.Concat(prms).ToArray();
			string reason;
			ConstructorInfo constructorInfo = ReflectionHelper.FindFirstSuitableCtorWithParamMatch(lcType, parameters, out reason);
			try
			{
				localComponent = constructorInfo?.Invoke(parameters) as LocalComponent;
			}
			catch (Exception ex)
			{
				reason = ex.ToString();
			}
			reason = (string.IsNullOrEmpty(reason) ? "ctor failed!" : reason);
			if (localComponent == null)
			{
				Logger.Error(MyLogName + ": Unable to construct component - " + reason);
			}
			return localComponent;
		}

		public virtual void AppendAutoDiscoveredWithDefaults()
		{
			try
			{
				Type[]? discoveredComponents = DiscoveredComponents;
				DiscoveredComponents = ((discoveredComponents == null || discoveredComponents.Length == 0) ? ReflectionHelper.GetAllTypesOfBase<LocalComponent>() : DiscoveredComponents);
				Type[]? discoveredComponents2 = DiscoveredComponents;
				if (discoveredComponents2 == null || discoveredComponents2.Length == 0)
				{
					Logger.Error(MyLogName + ": Unable to continue with auto-spawn - no LocalComponent types found at all");
					return;
				}
				Type[] array = DiscoveredComponents.Where((Type x) => !AllComponents.ContainsKey(x)).ToArray();
				if (array == null || array.Length == 0)
				{
					Logger.Warn(MyLogName + ": Auto-spawning cancelled as no suitable types found/left to spawn");
					return;
				}
				Logger.Message($"{MyLogName}: auto-spawning {array.Length} components");
				Type[] array2 = array;
				foreach (Type type in array2)
				{
					FieldInfo[] array3 = ReflectionHelper.FetchFieldsWithAttribute<DefaultComponentValueAttribute>(type, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (array3 == null || array3.Length == 0)
					{
						Logger.Warn(string.Format("{0}: Auto-spawn for {1} skipped: no fields with {2} found", MyLogName, type, "DefaultComponentValueAttribute"));
						break;
					}
					object[] prms = (from x in array3
						orderby x.GetCustomAttribute<DefaultComponentValueAttribute>().Order
						select x.GetCustomAttribute<DefaultComponentValueAttribute>().Value).ToArray();
					AddComponentByTypeWithParams(type, prms);
				}
			}
			catch (Exception arg)
			{
				Logger.Error(string.Format("{0}: ({1}) failed: {2}", MyLogName, "AppendAutoDiscoveredWithDefaults", arg));
			}
		}
	}
}
namespace InUCS.Manager
{
	public class BaseSharedConfig
	{
	}
	public sealed class EventDispatcher
	{
	}
}
namespace InUCS.Logging
{
	public interface ILogRouter
	{
		void Info(object msg);

		void Debug(object msg);

		void Message(object msg);

		void Error(object msg);

		void Warn(object msg);
	}
	public abstract class LoggerBase
	{
		protected string sourceName;

		protected LoggerBase(string sourceName)
		{
			this.sourceName = sourceName ?? "Global";
		}
	}
	public sealed class BepinExLogger : LoggerBase, ILogRouter
	{
		private readonly ManualLogSource logger;

		public BepinExLogger(string sourceName)
			: base(sourceName)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			logger = new ManualLogSource(sourceName);
			Logger.Sources.Add((ILogSource)(object)logger);
		}

		public void Debug(object msg)
		{
			logger.LogDebug(msg);
		}

		public void Error(object msg)
		{
			logger.LogError(msg);
		}

		public void Info(object msg)
		{
			logger.LogInfo(msg);
		}

		public void Message(object msg)
		{
			logger.LogMessage(msg);
		}

		public void Warn(object msg)
		{
			logger.LogWarning(msg);
		}
	}
	public sealed class UnityLogger : LoggerBase, ILogRouter
	{
		public UnityLogger(string sourceName)
			: base(sourceName)
		{
			Debug.unityLogger.logEnabled = true;
		}

		public void Debug(object msg)
		{
			ILogger unityLogger = Debug.unityLogger;
			if (unityLogger != null)
			{
				unityLogger.Log((LogType)4, "[" + sourceName + "]", msg);
			}
		}

		public void Error(object msg)
		{
			ILogger unityLogger = Debug.unityLogger;
			if (unityLogger != null)
			{
				unityLogger.Log((LogType)0, "[" + sourceName + "]", msg);
			}
		}

		public void Warn(object msg)
		{
			ILogger unityLogger = Debug.unityLogger;
			if (unityLogger != null)
			{
				unityLogger.Log((LogType)2, "[" + sourceName + "]", msg);
			}
		}

		public void Info(object msg)
		{
			ILogger unityLogger = Debug.unityLogger;
			if (unityLogger != null)
			{
				unityLogger.Log((LogType)3, "[" + sourceName + "]", msg);
			}
		}

		public void Message(object msg)
		{
			ILogger unityLogger = Debug.unityLogger;
			if (unityLogger != null)
			{
				unityLogger.Log((LogType)3, "[" + sourceName + "]", msg);
			}
		}
	}
}
namespace InUCS.Logging.Loggers
{
	public sealed class SystemNetLogger : LoggerBase, ILogRouter
	{
		public SystemNetLogger(string sourceName)
			: base(sourceName)
		{
		}

		public void Debug(object msg)
		{
			Console.WriteLine("[{0}]: {1}", sourceName, msg);
		}

		public void Error(object msg)
		{
			Console.WriteLine("[{0}]: {1}", sourceName, msg);
		}

		public void Info(object msg)
		{
			Console.WriteLine("[{0}]: {1}", sourceName, msg);
		}

		public void Message(object msg)
		{
			Console.WriteLine("[{0}]: {1}", sourceName, msg);
		}

		public void Warn(object msg)
		{
			Console.WriteLine("[{0}]: {1}", sourceName, msg);
		}
	}
}
namespace InUCS.Extensions
{
	public static class LegacyInputHelper
	{
		public static bool NoLeftModifiers
		{
			get
			{
				if (!Input.GetKey((KeyCode)306) && !Input.GetKey((KeyCode)308))
				{
					return !Input.GetKey((KeyCode)304);
				}
				return false;
			}
		}

		public static bool NoRightModifiers
		{
			get
			{
				if (!Input.GetKey((KeyCode)305) && !Input.GetKey((KeyCode)307))
				{
					return !Input.GetKey((KeyCode)303);
				}
				return false;
			}
		}

		public static bool NoAnyModifiers
		{
			get
			{
				if (NoLeftModifiers)
				{
					return NoRightModifiers;
				}
				return false;
			}
		}
	}
	public static class NewInputHelper
	{
		public static bool NoLeftModifiers
		{
			get
			{
				if (!((ButtonControl)Keyboard.current.leftShiftKey).isPressed && !((ButtonControl)Keyboard.current.leftAltKey).isPressed)
				{
					return !((ButtonControl)Keyboard.current.leftCtrlKey).isPressed;
				}
				return false;
			}
		}

		public static bool NoRightModifiers
		{
			get
			{
				if (!((ButtonControl)Keyboard.current.rightShiftKey).isPressed && !((ButtonControl)Keyboard.current.rightAltKey).isPressed)
				{
					return !((ButtonControl)Keyboard.current.rightCtrlKey).isPressed;
				}
				return false;
			}
		}

		public static bool NoAnyModifiers
		{
			get
			{
				if (NoLeftModifiers)
				{
					return NoRightModifiers;
				}
				return false;
			}
		}
	}
}
namespace InUCS.Components
{
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
	public sealed class DefaultComponentValueAttribute : Attribute
	{
		public object Value { get; set; }

		public byte Order { get; set; }

		public DefaultComponentValueAttribute(object v, byte order)
		{
			Value = v;
			Order = order;
		}
	}
	[AttributeUsage(AttributeTargets.Class)]
	public sealed class DisableAutoSpawnAttribute : Attribute
	{
	}
	public abstract class LocalComponent : IEquatable<LocalComponent>
	{
		public readonly bool EnabledByDefault = true;

		public readonly int Priority;

		public bool isEnabled { get; private set; }

		private ComponentManager Manager { get; set; }

		protected ILogRouter Logger => Manager.Logger;

		protected LocalComponent(ComponentManager manager, bool startEnabled = true, int priority = 0)
		{
			Manager = manager;
			EnabledByDefault = startEnabled;
			Priority = priority;
		}

		public virtual void OnComponentEnable()
		{
			isEnabled = true;
		}

		public virtual void OnComponentDisable()
		{
			isEnabled = false;
		}

		public virtual void Awake()
		{
		}

		public virtual void Start()
		{
		}

		public virtual void OnEnable()
		{
		}

		public virtual void OnDisable()
		{
		}

		public virtual void OnDestroy()
		{
		}

		public virtual void Update()
		{
		}

		public virtual void OnGUI()
		{
		}

		public virtual void FixedUpdate()
		{
		}

		public virtual void LateUpdate()
		{
		}

		public void UpdateManager(ComponentManager newManager)
		{
			Manager = newManager;
		}

		public bool Equals(LocalComponent? other)
		{
			if (other != null)
			{
				if (this != other)
				{
					return GetType() == other.GetType();
				}
				return true;
			}
			return false;
		}

		public override bool Equals(object? obj)
		{
			if (obj is LocalComponent other)
			{
				return Equals(other);
			}
			return false;
		}

		public override int GetHashCode()
		{
			return GetHashCode();
		}
	}
	[DisableAutoSpawn]
	public sealed class ScreenComponent : LocalComponent
	{
		private const float BASE_WIDTH = 1920f;

		private const float BASE_HEIGHT = 1080f;

		private float LAST_WIDTH = Screen.width;

		private float LAST_HEIGHT = Screen.height;

		public Matrix4x4 GuiMatrix { get; private set; }

		public float WFac { get; private set; } = 1f;


		public float HFac { get; private set; } = 1f;


		public bool IsNoOP { get; set; }

		public ScreenComponent(ComponentManager manager)
			: base(manager)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			GuiMatrix = CalculateMatrix(Screen.width, Screen.height);
			RecalibrateFactor();
		}

		public override void Update()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			if (Time.frameCount % 300 == 0 && (LAST_WIDTH != (float)Screen.width || LAST_HEIGHT != (float)Screen.height))
			{
				RecalibrateFactor();
				GuiMatrix = CalculateMatrix(Screen.width, Screen.height);
			}
		}

		public void Set1x1()
		{
			IsNoOP = true;
			float wFac = (HFac = 1f);
			WFac = wFac;
		}

		public void RecalibrateFactor()
		{
			if (!IsNoOP)
			{
				WFac = 1920f / (float)Screen.width;
				HFac = 1080f / (float)Screen.height;
			}
			LAST_WIDTH = Screen.width;
			LAST_HEIGHT = Screen.height;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public Matrix4x4 CalculateMatrix(float X, float Y)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			return Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(X / 1920f, Y / 1080f, 1f));
		}
	}
}
namespace InUCS.API
{
	public static class UnityAPI
	{
		public static void SpawnBoxCollider2D(Vector3 pos, float height, float width, LayerMask layer, bool halfHeightPosition, string objName = "PlayerBlocker")
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: 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)
			//IL_005f: 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_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			if (!(height < 2f) && !(width < 2f))
			{
				GameObject val = new GameObject(objName, new Type[1] { typeof(BoxCollider2D) });
				BoxCollider2D component = val.GetComponent<BoxCollider2D>();
				float num = (halfHeightPosition ? (pos.y + height / 2f) : pos.y);
				val.transform.position = new Vector3(pos.x, num, 0f);
				val.layer = LayerMask.op_Implicit(layer);
				component.size = new Vector2(width, height);
				((Collider2D)component).isTrigger = false;
				val.SetActive(true);
			}
		}

		public static void DisableGOByName(string objName, bool newState = false)
		{
			GameObject obj = GameObject.Find(objName);
			if (obj != null)
			{
				obj.SetActive(false);
			}
		}

		public static T? FetchResourceByName<T>(string objName) where T : Object
		{
			T[] array = Resources.FindObjectsOfTypeAll<T>();
			foreach (T val in array)
			{
				object obj = val;
				if (string.Equals((obj != null) ? ((Object)obj).name : null, objName, StringComparison.OrdinalIgnoreCase))
				{
					return val;
				}
			}
			return default(T);
		}

		public static GameObject? FetchGameObjectByPath(string namePath)
		{
			if (string.IsNullOrEmpty(namePath))
			{
				GLog.Warn("Invalid GO name supplied to fetch: " + namePath);
				return null;
			}
			int num = namePath.IndexOf('/');
			bool num2 = num > 0;
			string text = (num2 ? namePath.Substring(0, num) : namePath);
			string text2 = (num2 ? namePath.Substring(num + 1, namePath.Length - (num + 1)) : string.Empty);
			GameObject val = GameObject.Find(text);
			if (!num2)
			{
				return val;
			}
			if (val == null)
			{
				return null;
			}
			Transform transform = val.transform;
			if (transform == null)
			{
				return null;
			}
			Transform obj = transform.Find(text2);
			if (obj == null)
			{
				return null;
			}
			return ((Component)obj).gameObject;
		}

		public static bool ObjectWithinScreenSpace(Camera cam, GameObject obj)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			bool result = false;
			if ((Object)(object)obj != (Object)null)
			{
				result = ScreenHelper.PointWithinScreenSpace(cam.WorldToScreenPoint(obj.transform.position));
			}
			return result;
		}

		public static bool ObjectWithinViewport(GameObject obj)
		{
			return false;
		}
	}
}
namespace InUCS.Addons
{
	public sealed class MovingAverage
	{
		private readonly int _windowSize;

		private readonly Queue<long> _samples;

		private long _sampleAccumulator;

		public long GetAverage => _sampleAccumulator / _samples.Count;

		public float GetAverageFloat => _sampleAccumulator / _samples.Count;

		public MovingAverage(int windowSize = 30)
		{
			_windowSize = windowSize;
			_samples = new Queue<long>(_windowSize + 1);
		}

		public void Clear()
		{
			_sampleAccumulator = 0L;
			_samples.Clear();
		}

		public void Sample(long newSample)
		{
			_sampleAccumulator += newSample;
			_samples.Enqueue(newSample);
			if (_samples.Count > _windowSize)
			{
				_sampleAccumulator -= _samples.Dequeue();
			}
		}
	}
	public sealed class MutableString
	{
		public enum BaseValue
		{
			Binary = 2,
			Decimal = 10,
			Hex = 16
		}

		public const float EPSILON = float.Epsilon;

		private const BaseValue DEFAULT_BASE = BaseValue.Decimal;

		private readonly char[] DIGITS_LUT = new char[16]
		{
			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
			'A', 'B', 'C', 'D', 'E', 'F'
		};

		private readonly uint MAX_DECIMALS = 2u;

		private readonly string zeroFloat = "0.0000000000000000";

		private readonly float almostZero = 0.0001f;

		private readonly bool dontThrow;

		private char m_defaultPadChar = ' ';

		private int m_Pos;

		private string m_valueStr;

		public char DefaultPadChar
		{
			get
			{
				return m_defaultPadChar;
			}
			set
			{
				m_defaultPadChar = value;
			}
		}

		public int Capacity => m_valueStr.Length;

		public int Length
		{
			get
			{
				return m_Pos;
			}
			set
			{
				m_Pos = value;
			}
		}

		public string CurrentRaw => m_valueStr;

		public MutableString(int size)
			: this(size, '\0', ignoreOverflow: false, 2u)
		{
		}

		public MutableString(int size, bool ignoreOverflow)
			: this(size, '\0', ignoreOverflow, 2u)
		{
		}

		public MutableString(int size, char fillChar)
			: this(size, fillChar, ignoreOverflow: false, 2u)
		{
		}

		public MutableString(int size, char fillChar, bool ignoreOverflow, uint def_max_decimals)
		{
			if (size < 2)
			{
				throw new ArgumentException("Size cannot be 1 or less");
			}
			m_valueStr = new string(fillChar, size);
			dontThrow = ignoreOverflow;
			MAX_DECIMALS = def_max_decimals;
			zeroFloat = ((MAX_DECIMALS != 0) ? ("0." + new string('0', (int)MAX_DECIMALS)) : "0");
			almostZero = (float)(1.0 / Math.Pow(10.0, MAX_DECIMALS + 2));
		}

		public string Finalize()
		{
			if (m_Pos == 0)
			{
				return string.Empty;
			}
			int num = m_valueStr.Length - m_Pos;
			if (num > 0)
			{
				repeatChar('\0', num);
			}
			m_Pos = 0;
			return m_valueStr;
		}

		public MutableString Append(bool value)
		{
			Append(value.ToString());
			return this;
		}

		public MutableString Append(byte value)
		{
			Append((uint)value);
			return this;
		}

		public MutableString Append(sbyte value)
		{
			Append((int)value);
			return this;
		}

		public MutableString Append(short value)
		{
			Append((int)value);
			return this;
		}

		public MutableString Append(ushort value)
		{
			Append((int)value);
			return this;
		}

		public MutableString Append(char[] value, int indx, int count)
		{
			if (value == null)
			{
				return this;
			}
			int num = value.Length;
			if (count < 1 || indx < 0 || num < count + indx)
			{
				return this;
			}
			if (num > 1)
			{
				AppendInternal(value, indx, count);
			}
			else
			{
				Append(value[0]);
			}
			return this;
		}

		public MutableString Append(char[] value)
		{
			if (value == null)
			{
				return this;
			}
			int num = value.Length;
			if (num > 1)
			{
				AppendInternal(value, 0, num);
			}
			else
			{
				Append(value[0]);
			}
			return this;
		}

		public MutableString Append(char value)
		{
			if (m_Pos >= m_valueStr.Length)
			{
				if (dontThrow)
				{
					return this;
				}
				throw new ArgumentException("Not enough free space to accomodate element!");
			}
			singleChar(value);
			m_Pos++;
			return this;
		}

		private void AppendInternal(char[] value, int indx, int count)
		{
			int num = m_valueStr.Length - m_Pos;
			if (count > num)
			{
				if (!dontThrow)
				{
					throw new ArgumentException($"Not enough free space to accomodate {count} elements!");
				}
			}
			else
			{
				charCopy(value, indx, count);
				m_Pos += count;
			}
		}

		private void AppendInternal(string value, int indx, int count)
		{
			int num = m_valueStr.Length - m_Pos;
			if (count > num)
			{
				if (!dontThrow)
				{
					throw new ArgumentOutOfRangeException($"Not enough free space to accomodate {count} elements!");
				}
			}
			else
			{
				stringCopy(value, indx, count);
				m_Pos += count;
			}
		}

		public MutableString Append(string value, int indx, int count)
		{
			if (value == null)
			{
				return this;
			}
			int length = value.Length;
			if (count < 1 || indx < 0 || length < count + indx)
			{
				return this;
			}
			if (length > 1)
			{
				AppendInternal(value, indx, count);
			}
			else
			{
				Append(value[0]);
			}
			return this;
		}

		public MutableString Append(string? value)
		{
			if (value == null || value.Length == 0)
			{
				return this;
			}
			int length = value.Length;
			if (length > 1)
			{
				AppendInternal(value, 0, length);
			}
			else
			{
				Append(value[0]);
			}
			return this;
		}

		private unsafe void AppendUINT32(uint uint_val, uint pad_base, char pad_char, bool negative)
		{
			int num = CountDigits(uint_val);
			int num2 = (int)((pad_base > num) ? (pad_base - num) : 0);
			int num3 = Convert.ToInt32(negative) + num2 + num;
			int num4 = m_Pos + num3;
			if (num4 > m_valueStr.Length)
			{
				if (!dontThrow)
				{
					throw new ArgumentOutOfRangeException($"Not enough free space to accomodate {num3} elements!");
				}
				return;
			}
			fixed (char* ptr = m_valueStr)
			{
				char* ptr2 = ptr + num4;
				do
				{
					uint num5 = uint_val / 10;
					*(--ptr2) = (char)(48 + uint_val - num5 * 10);
					uint_val = num5;
				}
				while (uint_val != 0);
				while (num2 > 0)
				{
					*(--ptr2) = pad_char;
					num2--;
				}
				if (negative)
				{
					*(--ptr2) = '-';
				}
			}
			m_Pos = num4;
		}

		public MutableString Append(uint uint_val)
		{
			AppendUINT32(uint_val, 0u, m_defaultPadChar, negative: false);
			return this;
		}

		public MutableString Append(uint uint_val, uint pad_amount)
		{
			AppendUINT32(uint_val, pad_amount, m_defaultPadChar, negative: false);
			return this;
		}

		public MutableString Append(uint uint_val, uint pad_amount, char pad_char)
		{
			AppendUINT32(uint_val, pad_amount, pad_char, negative: false);
			return this;
		}

		public MutableString Append(int int_val)
		{
			Append(int_val, 0u, m_defaultPadChar);
			return this;
		}

		public MutableString Append(int int_val, uint pad_amount)
		{
			Append(int_val, pad_amount, m_defaultPadChar);
			return this;
		}

		public MutableString Append(int int_val, uint pad_base, char pad_char)
		{
			bool isNegative;
			uint positiveEqv = GetPositiveEqv(int_val, out isNegative);
			AppendUINT32(positiveEqv, pad_base, pad_char, isNegative);
			return this;
		}

		private unsafe void AppendULONG(ulong ulong_val, uint pad_base, char pad_char, bool negative)
		{
			int num = CountDigits(ulong_val);
			int num2 = (int)((pad_base > num) ? (pad_base - num) : 0);
			int num3 = Convert.ToInt32(negative) + num + num2;
			int num4 = m_Pos + num3;
			if (num4 > m_valueStr.Length)
			{
				if (!dontThrow)
				{
					throw new ArgumentOutOfRangeException($"Not enough free space to accomodate {num3} elements!");
				}
				return;
			}
			fixed (char* ptr = m_valueStr)
			{
				char* ptr2 = ptr + num4;
				do
				{
					ulong num5 = ulong_val / 10;
					*(--ptr2) = (char)(48 + ulong_val - num5 * 10);
					ulong_val = num5;
				}
				while (ulong_val != 0L);
				while (num2 > 0)
				{
					*(--ptr2) = pad_char;
					num2--;
				}
				if (negative)
				{
					*(--ptr2) = '-';
				}
			}
			m_Pos = num4;
		}

		public MutableString Append(ulong ulong_val)
		{
			AppendULONG(ulong_val, 0u, m_defaultPadChar, negative: false);
			return this;
		}

		public MutableString Append(ulong ulong_val, uint pad_amount)
		{
			AppendULONG(ulong_val, pad_amount, m_defaultPadChar, negative: false);
			return this;
		}

		public MutableString Append(ulong ulong_val, uint pad_amount, char pad_char)
		{
			AppendULONG(ulong_val, pad_amount, pad_char, negative: false);
			return this;
		}

		public MutableString Append(long long_val)
		{
			Append(long_val, 0u, m_defaultPadChar);
			return this;
		}

		public MutableString Append(long long_val, uint pad_base)
		{
			Append(long_val, pad_base, m_defaultPadChar);
			return this;
		}

		public MutableString Append(long long_val, uint pad_base, char pad_char)
		{
			bool flag = long_val < 0;
			ulong ulong_val = (ulong)(flag ? (-1 - long_val + 1) : long_val);
			AppendULONG(ulong_val, pad_base, pad_char, flag);
			return this;
		}

		public unsafe MutableString Append(float float_val, uint decimal_places, uint pad_base, char pad_char)
		{
			decimal_places = ((decimal_places > MAX_DECIMALS) ? MAX_DECIMALS : decimal_places);
			bool flag = float_val < 0f;
			float num = 5f / (float)Math.Pow(10.0, 1 + decimal_places);
			float num2 = (flag ? (float_val + (0f - num)) : (float_val + num));
			if (float_val == 0f || Approximately(float_val, 0f))
			{
				int num3 = (int)(Convert.ToInt32(decimal_places != 0) * (decimal_places + 1));
				AppendInternal(zeroFloat, 0, 1 + num3);
				return this;
			}
			if (!IsFinite(float_val))
			{
				if (float_val != float_val)
				{
					AppendInternal("NaN", 0, 3);
				}
				else
				{
					AppendInternal(flag ? "-∞" : "+∞", 0, 2);
				}
				return this;
			}
			bool isNegative;
			uint positiveEqv = GetPositiveEqv((int)num2, out isNegative);
			if (decimal_places == 0)
			{
				AppendUINT32(positiveEqv, pad_base, pad_char, flag);
				return this;
			}
			int num4 = CountDigits(positiveEqv);
			int num5 = num4 + 1 + (int)decimal_places;
			int num6 = (int)((pad_base > num4) ? (pad_base - num4) : 0);
			int num7 = Convert.ToInt32(flag) + num6 + num5;
			int num8 = m_Pos + num7;
			if (num8 > m_valueStr.Length)
			{
				if (dontThrow)
				{
					return this;
				}
				throw new ArgumentOutOfRangeException($"Not enough free space to accomodate {num7} elements!");
			}
			fixed (char* ptr = m_valueStr)
			{
				char* ptr2 = ptr + num8;
				uint num9 = (uint)(Math.Abs(num2) * (float)Math.Pow(10.0, decimal_places));
				do
				{
					uint num10 = num9 / 10;
					*(--ptr2) = (char)(48 + num9 - num10 * 10);
					num9 = num10;
					decimal_places--;
				}
				while (decimal_places != 0);
				*(--ptr2) = '.';
				do
				{
					uint num11 = num9 / 10;
					*(--ptr2) = (char)(48 + num9 - num11 * 10);
					num9 = num11;
					num4--;
				}
				while (num4 != 0);
				while (num6 > 0)
				{
					*(--ptr2) = pad_char;
					num6--;
				}
				if (flag)
				{
					*(--ptr2) = '-';
				}
			}
			m_Pos = num8;
			return this;
		}

		public MutableString Append(float float_val)
		{
			return Append(float_val, MAX_DECIMALS, 0u, m_defaultPadChar);
		}

		public MutableString Append(float float_val, uint decimal_places)
		{
			return Append(float_val, decimal_places, 0u, m_defaultPadChar);
		}

		public MutableString Append(float float_val, uint decimal_places, uint pad_amount)
		{
			return Append(float_val, decimal_places, pad_amount, m_defaultPadChar);
		}

		public static bool Approximately(float a, float b)
		{
			return Math.Abs(b - a) < Math.Max(1E-06f * Math.Max(Math.Abs(a), Math.Abs(b)), 1.1E-44f);
		}

		private static uint GetPositiveEqv(int val, out bool isNegative)
		{
			isNegative = val < 0;
			if (!isNegative)
			{
				return (uint)val;
			}
			return (uint)(-1 - val + 1);
		}

		private static int CountDigits(ulong value)
		{
			int num = 1;
			uint num2;
			if (value >= 10000000)
			{
				if (value >= 100000000000000L)
				{
					num2 = (uint)(value / 100000000000000L);
					num += 14;
				}
				else
				{
					num2 = (uint)(value / 10000000);
					num += 7;
				}
			}
			else
			{
				num2 = (uint)value;
			}
			if (num2 >= 10)
			{
				num = ((num2 < 100) ? (num + 1) : ((num2 < 1000) ? (num + 2) : ((num2 < 10000) ? (num + 3) : ((num2 < 100000) ? (num + 4) : ((num2 >= 1000000) ? (num + 6) : (num + 5))))));
			}
			return num;
		}

		private static int CountDigits(uint value)
		{
			int num = 1;
			if (value >= 100000)
			{
				value /= 100000;
				num += 5;
			}
			if (value >= 10)
			{
				num = ((value < 100) ? (num + 1) : ((value < 1000) ? (num + 2) : ((value >= 10000) ? (num + 4) : (num + 3))));
			}
			return num;
		}

		private static int CountDecimalTrailingZeros(uint value, out uint valueWithoutTrailingZeros)
		{
			int num = 0;
			if (value != 0)
			{
				while (true)
				{
					uint num2 = value / 10;
					if (value != num2 * 10)
					{
						break;
					}
					value = num2;
					num++;
				}
			}
			valueWithoutTrailingZeros = value;
			return num;
		}

		private static uint Low32(ulong value)
		{
			return (uint)value;
		}

		private static uint High32(ulong value)
		{
			return (uint)((value & 0xFFFFFFFF00000000uL) >> 32);
		}

		private unsafe static int SingleToInt32Bits(float value)
		{
			return *(int*)(&value);
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private static bool IsFinite(float f)
		{
			return (SingleToInt32Bits(f) & 0x7FFFFFFF) < 2139095040;
		}

		private unsafe void stringCopy(string value, int indx, int charCount)
		{
			fixed (char* ptr = m_valueStr)
			{
				fixed (char* ptr2 = value)
				{
					wstrCpy(ptr + m_Pos, ptr2 + indx, charCount);
				}
			}
		}

		private unsafe void charCopy(char[] value, int indx, int charCount)
		{
			fixed (char* ptr = m_valueStr)
			{
				fixed (char* ptr2 = value)
				{
					wstrCpy(ptr + m_Pos, ptr2 + indx, charCount);
				}
			}
		}

		private unsafe void singleChar(char value)
		{
			fixed (char* ptr = m_valueStr)
			{
				ptr[m_Pos] = value;
			}
		}

		private unsafe void repeatChar(char value, int count)
		{
			int num = m_Pos + count;
			fixed (char* ptr = m_valueStr)
			{
				for (int i = m_Pos; i < num; i++)
				{
					ptr[i] = value;
				}
			}
			m_Pos = num;
		}

		private unsafe void rawCopy(char* dest, char* src, int charCount)
		{
			for (int i = 0; i < charCount; i++)
			{
				dest[i] = src[i];
			}
		}

		private unsafe static void wstrCpy(char* dmem, char* smem, int charCount)
		{
			if (((uint)(int)dmem & 2u) != 0)
			{
				*dmem = *smem;
				dmem++;
				smem++;
				charCount--;
			}
			while (charCount >= 8)
			{
				*(int*)dmem = *(int*)smem;
				*(int*)(dmem + 2) = *(int*)(smem + 2);
				*(int*)(dmem + 4) = *(int*)(smem + 4);
				*(int*)(dmem + 6) = *(int*)(smem + 6);
				dmem += 8;
				smem += 8;
				charCount -= 8;
			}
			if (((uint)charCount & 4u) != 0)
			{
				*(int*)dmem = *(int*)smem;
				*(int*)(dmem + 2) = *(int*)(smem + 2);
				dmem += 4;
				smem += 4;
			}
			if (((uint)charCount & 2u) != 0)
			{
				*(int*)dmem = *(int*)smem;
				dmem += 2;
				smem += 2;
			}
			if (((uint)charCount & (true ? 1u : 0u)) != 0)
			{
				*dmem = *smem;
			}
		}
	}
}
namespace InUCS.Addons.Collider2DViewer
{
	public class CachedPolyShapeCollider : CachedColliderBase
	{
		protected List<PolyShape> worldShapes = new List<PolyShape>();

		protected static List<Vector2> localVec2Cache = new List<Vector2>();

		public override bool IsEmpty
		{
			get
			{
				if (worldShapes != null)
				{
					return worldShapes.Count == 0;
				}
				return true;
			}
		}

		public CachedPolyShapeCollider(Collider2D collider, Color color)
			: base(collider, color)
		{
		}//IL_000d: Unknown result type (might be due to invalid IL or missing references)


		public override void RecalculateGeometry()
		{
		}

		public override void GL_Draw_Filled(Camera cam)
		{
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: 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_00fd: 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_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: 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_0137: 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_014f: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			base.GL_Draw_Filled(cam);
			for (int i = 0; i < worldShapes.Count; i++)
			{
				PolyShape polyShape = worldShapes[i];
				List<Vector3> list = polyShape.worldPoints;
				if (polyShape.isConcave)
				{
					List<int>? concaveTris = polyShape.concaveTris;
					if (concaveTris != null && concaveTris.Count > 0)
					{
						for (int j = 0; j < polyShape.concaveTris.Count; j++)
						{
							Vector3 val = cam.WorldToScreenPoint(list[polyShape.concaveTris[j]]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
							GL.Vertex3(val.x, val.y, 0f);
						}
					}
					else
					{
						Draw_Mitered_Impl(cam, polyShape.worldPoints);
					}
					continue;
				}
				Vector3 val2 = cam.WorldToScreenPoint(list[0]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
				for (int k = 1; k + 1 < list.Count; k++)
				{
					Vector3 val3 = cam.WorldToScreenPoint(list[k]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
					Vector3 val4 = cam.WorldToScreenPoint(list[k + 1]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
					GL.Vertex3(val3.x, val3.y, 0f);
					GL.Vertex3(val4.x, val4.y, 0f);
					GL.Vertex3(val2.x, val2.y, 0f);
				}
			}
		}

		public override void GL_Draw_Lined(Camera cam)
		{
			//IL_0033: 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_0047: 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)
			base.GL_Draw_Lined(cam);
			for (int i = 0; i < worldShapes.Count; i++)
			{
				List<Vector3> list = worldShapes[i].worldPoints;
				CachedColliderBase.globalVec2Cache.Clear();
				for (int j = 0; j < list.Count; j++)
				{
					CachedColliderBase.globalVec2Cache.Add(Vector2.op_Implicit(cam.WorldToScreenPoint(list[j]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac)));
				}
				CachedColliderBase.Draw_Lines_Closed(CachedColliderBase.globalVec2Cache);
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		protected void Draw_Mitered_Impl(Camera cam, List<Vector3> worldPoints)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			CachedColliderBase.globalVec2Cache.Clear();
			for (int i = 0; i < worldPoints.Count; i++)
			{
				CachedColliderBase.globalVec2Cache.Add(Vector2.op_Implicit(cam.WorldToScreenPoint(worldPoints[i]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac)));
			}
			CachedColliderBase.Draw_ClosedPolygon_Mitered(cam, CachedColliderBase.globalVec2Cache);
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		protected void Draw_Mitered_Impl2(Camera cam, List<Vector3> worldPoints)
		{
			CachedColliderBase.Draw_ClosedPolygon_Mitered2(cam, worldPoints);
		}
	}
}
namespace Collider2DViewer
{
	public static class GLMODE
	{
		public const int LINES = 1;

		public const int LINE_STRIP = 2;

		public const int TRIANGLES = 4;

		public const int TRIANGLE_STRIP = 5;

		public const int QUADS = 7;
	}
	public enum DrawMode : byte
	{
		Filled,
		Mitered,
		Lined
	}
	public readonly struct PolyShape
	{
		public readonly bool isConcave;

		public readonly List<Vector3> worldPoints;

		public readonly List<int>? concaveTris;

		public PolyShape(bool isConcave, List<Vector3> worldPoints, List<int>? concaveTris)
		{
			this.isConcave = isConcave;
			this.worldPoints = worldPoints;
			this.concaveTris = concaveTris;
		}
	}
	public abstract class CachedColliderBase
	{
		protected static float miterWidth = 2f;

		protected static float hScreenFac = 1f;

		protected static float wScreenFac = 1f;

		protected static int invertY = 0;

		protected static int lastGLMode = 4;

		protected static Matrix4x4 matrix;

		protected static List<Vector2> globalVec2Cache = new List<Vector2>(10);

		protected static List<Vector3> globalVec3Cache = new List<Vector3>(10);

		protected Vector3 cPosition;

		protected Quaternion cRotation;

		protected Vector3 cScale;

		protected Bounds cBounds;

		protected List<Vector3> worldPoints = new List<Vector3>();

		protected readonly Color ownColor = new Color(1f, 1f, 1f, 0.65f);

		public Transform? cTransform { get; private set; }

		public Collider2D? cCollider { get; private set; }

		public bool IsValid
		{
			get
			{
				if ((Object)(object)cTransform != (Object)null)
				{
					return (Object)(object)cCollider != (Object)null;
				}
				return false;
			}
		}

		public bool IsActive
		{
			get
			{
				if (((Component)cTransform).gameObject.activeSelf && ((Component)cTransform).gameObject.activeInHierarchy)
				{
					return ((Behaviour)cCollider).enabled;
				}
				return false;
			}
		}

		public bool IsActiveNoHierarchy
		{
			get
			{
				if (((Component)cTransform).gameObject.activeSelf)
				{
					return ((Behaviour)cCollider).enabled;
				}
				return false;
			}
		}

		public virtual bool IsEmpty
		{
			get
			{
				if (worldPoints != null)
				{
					return worldPoints.Count == 0;
				}
				return true;
			}
		}

		public static float MiterWidth
		{
			get
			{
				return miterWidth;
			}
			set
			{
				miterWidth = ((value == 0f) ? ((float)((!(miterWidth > 0f)) ? 1 : (-1))) : value);
			}
		}

		public static bool InvertY
		{
			get
			{
				return Convert.ToBoolean(invertY);
			}
			set
			{
				invertY = Convert.ToInt32(value);
			}
		}

		public static Matrix4x4 Matrix
		{
			get
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				return matrix;
			}
			set
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				matrix = value;
			}
		}

		protected CachedColliderBase(Collider2D collider, Color color)
		{
			//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_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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: 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_0084: Unknown result type (might be due to invalid IL or missing references)
			cTransform = ((Component)collider).transform;
			cCollider = collider;
			cBounds = collider.bounds;
			cPosition = cTransform.position;
			cRotation = cTransform.rotation;
			cScale = cTransform.lossyScale;
			ownColor = color;
		}

		public bool CacheIsDirty()
		{
			//IL_0006: 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_001e: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: 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)
			if (!(cTransform.position != cPosition) && !(cTransform.rotation != cRotation) && !(cScale != cTransform.lossyScale))
			{
				return cBounds != cCollider.bounds;
			}
			return true;
		}

		public abstract void RecalculateGeometry();

		public virtual void GL_Draw_Filled(Camera cam)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			GL.Color(ownColor);
		}

		public virtual void GL_Draw_Mitered(Camera cam)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			GL.Color(new Color(ownColor.r, ownColor.g, ownColor.b, 1f));
		}

		public virtual void GL_Draw_Lined(Camera cam)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			GL.Color(new Color(ownColor.r, ownColor.g, ownColor.b, 1f));
		}

		public virtual void Cleanup()
		{
			cTransform = null;
			cCollider = null;
			worldPoints.Clear();
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static void UpscaleForGLScreen(ref Vector3 orig)
		{
			orig.x *= wScreenFac;
			orig.y *= hScreenFac;
		}

		public static void UpdateScreenFactor(float w, float h)
		{
			wScreenFac = w;
			hScreenFac = h;
		}

		public static void UpdateGlobalMiterWidth(float width)
		{
			miterWidth = width;
		}

		public static void GL_Begin(int mode)
		{
			GL.Begin(mode);
			lastGLMode = mode;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static void AppendByType(List<CachedColliderBase> output, Collider2D c2d, Color color)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			BoxCollider2D val = (BoxCollider2D)(object)((c2d is BoxCollider2D) ? c2d : null);
			if (val == null)
			{
				PolygonCollider2D val2 = (PolygonCollider2D)(object)((c2d is PolygonCollider2D) ? c2d : null);
				if (val2 == null)
				{
					CircleCollider2D val3 = (CircleCollider2D)(object)((c2d is CircleCollider2D) ? c2d : null);
					if (val3 == null)
					{
						CapsuleCollider2D val4 = (CapsuleCollider2D)(object)((c2d is CapsuleCollider2D) ? c2d : null);
						if (val4 == null)
						{
							EdgeCollider2D val5 = (EdgeCollider2D)(object)((c2d is EdgeCollider2D) ? c2d : null);
							if (val5 == null)
							{
								CompositeCollider2D val6 = (CompositeCollider2D)(object)((c2d is CompositeCollider2D) ? c2d : null);
								if (val6 != null)
								{
									output.Add(new CachedComposite2D(val6, color));
								}
							}
							else
							{
								output.Add(new CachedEdge2D(val5, color));
							}
						}
						else
						{
							output.Add(new CachedCapsule2D(val4, color));
						}
					}
					else
					{
						output.Add(new CachedCircle2D(val3, color));
					}
				}
				else
				{
					output.Add(new CachedPolygon2D(val2, color));
				}
			}
			else
			{
				output.Add(new CachedBox2D(val, color));
			}
		}

		public static void Draw(DrawMode mode, Material mat, Camera cam, List<CachedColliderBase> closedColliders, bool hierarchyCheck)
		{
			ScreenHelper.UpdateScreenFactor();
			switch (mode)
			{
			case DrawMode.Filled:
				DrawColliders_Filled(mat, cam, closedColliders, hierarchyCheck);
				break;
			case DrawMode.Mitered:
				DrawColliders_Mitered(mat, cam, closedColliders, hierarchyCheck);
				break;
			case DrawMode.Lined:
				DrawColliders_Lined(mat, cam, closedColliders, hierarchyCheck);
				break;
			}
		}

		public static void DrawColliders_Filled(Material mat, Camera cam, List<CachedColliderBase> closedColliders, bool hierarchyCheck)
		{
			GL.PushMatrix();
			mat.SetPass(0);
			GL.LoadPixelMatrix();
			GL_Begin(4);
			for (int num = closedColliders.Count - 1; num >= 0; num--)
			{
				CachedColliderBase cachedColliderBase = closedColliders[num];
				if (cachedColliderBase == null || !cachedColliderBase.IsValid)
				{
					closedColliders.RemoveAt(num);
				}
				else if ((hierarchyCheck ? cachedColliderBase.IsActiveNoHierarchy : cachedColliderBase.IsActive) && !cachedColliderBase.IsEmpty)
				{
					if (cachedColliderBase.CacheIsDirty())
					{
						cachedColliderBase.RecalculateGeometry();
					}
					cachedColliderBase.GL_Draw_Filled(cam);
				}
			}
			GL.End();
			GL.PopMatrix();
		}

		public static void DrawColliders_Mitered(Material mat, Camera cam, List<CachedColliderBase> closedColliders, bool hierarchyCheck)
		{
			GL.PushMatrix();
			mat.SetPass(0);
			GL.LoadPixelMatrix();
			GL_Begin(4);
			for (int num = closedColliders.Count - 1; num >= 0; num--)
			{
				CachedColliderBase cachedColliderBase = closedColliders[num];
				if (cachedColliderBase == null || !cachedColliderBase.IsValid)
				{
					closedColliders.RemoveAt(num);
				}
				else if ((hierarchyCheck ? cachedColliderBase.IsActiveNoHierarchy : cachedColliderBase.IsActive) && !cachedColliderBase.IsEmpty)
				{
					if (cachedColliderBase.CacheIsDirty())
					{
						cachedColliderBase.RecalculateGeometry();
					}
					cachedColliderBase.GL_Draw_Mitered(cam);
				}
			}
			GL.End();
			GL.PopMatrix();
		}

		public static void DrawColliders_Lined(Material mat, Camera cam, List<CachedColliderBase> closedColliders, bool hierarchyCheck)
		{
			GL.PushMatrix();
			mat.SetPass(0);
			GL.LoadPixelMatrix();
			GL_Begin(1);
			for (int num = closedColliders.Count - 1; num >= 0; num--)
			{
				CachedColliderBase cachedColliderBase = closedColliders[num];
				if (cachedColliderBase == null || !cachedColliderBase.IsValid)
				{
					closedColliders.RemoveAt(num);
				}
				else if ((hierarchyCheck ? cachedColliderBase.IsActiveNoHierarchy : cachedColliderBase.IsActive) && !cachedColliderBase.IsEmpty)
				{
					if (cachedColliderBase.CacheIsDirty())
					{
						cachedColliderBase.RecalculateGeometry();
					}
					cachedColliderBase.GL_Draw_Lined(cam);
				}
			}
			GL.End();
			GL.PopMatrix();
		}

		public static void Draw_ClosedPolygon_Mitered(Camera cam, IReadOnlyList<Vector2> points)
		{
			//IL_0019: 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)
			//IL_003c: 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_005b: 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_007a: 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)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: 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_008c: 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_0092: 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_009b: 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_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: 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_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: 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_00e5: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: 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_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: 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_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: 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_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: 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_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: 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_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: 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_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: 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_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: 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_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			if (points.Count >= 3)
			{
				float num = miterWidth;
				Vector2 val6 = default(Vector2);
				Vector2 val7 = default(Vector2);
				for (int i = 0; i < points.Count; i++)
				{
					Vector2 val = points[i];
					Vector2 val2 = points[((i + 1) % points.Count + points.Count) % points.Count];
					Vector2 val3 = points[((i + 2) % points.Count + points.Count) % points.Count];
					Vector2 val4 = points[((i + 3) % points.Count + points.Count) % points.Count];
					Vector2 val5 = val - val2;
					Vector2 normalized = ((Vector2)(ref val5)).normalized;
					val5 = val2 - val3;
					val5 = normalized + ((Vector2)(ref val5)).normalized;
					Vector2 normalized2 = ((Vector2)(ref val5)).normalized;
					((Vector2)(ref val6))..ctor(normalized2.y, 0f - normalized2.x);
					val5 = new Vector2(0f - (val2.y - val3.y), val2.x - val3.x);
					Vector2 normalized3 = ((Vector2)(ref val5)).normalized;
					float num2 = num / Vector2.Dot(val6, normalized3) * -1f;
					val5 = val2 - val3;
					Vector2 normalized4 = ((Vector2)(ref val5)).normalized;
					val5 = val3 - val4;
					val5 = normalized4 + ((Vector2)(ref val5)).normalized;
					Vector2 normalized5 = ((Vector2)(ref val5)).normalized;
					((Vector2)(ref val7))..ctor(normalized5.y, 0f - normalized5.x);
					val5 = new Vector2(0f - (val3.y - val4.y), val3.x - val4.x);
					Vector2 normalized6 = ((Vector2)(ref val5)).normalized;
					float num3 = num / Vector2.Dot(val7, normalized6) * -1f;
					Vector2 val8 = val3 + val7 * num3;
					Vector2 val9 = val2 + val6 * num2;
					GL.Vertex3(val2.x, val2.y, 0f);
					GL.Vertex3(val3.x, val3.y, 0f);
					GL.Vertex3(val8.x, val8.y, 0f);
					GL.Vertex3(val8.x, val8.y, 0f);
					GL.Vertex3(val9.x, val9.y, 0f);
					GL.Vertex3(val2.x, val2.y, 0f);
				}
			}
		}

		public static void Draw_ClosedPolygon_Mitered2(Camera cam, IReadOnlyList<Vector3> points)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_006a: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_009a: 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_00a0: 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_00a6: 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_00b4: 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_00c1: 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_00d5: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: 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_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_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: 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_0126: 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_012f: 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_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: 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_0146: 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_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: 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)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: 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)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: 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_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: 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_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: 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_0213: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: 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_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_028e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0306: Unknown result type (might be due to invalid IL or missing references)
			//IL_030d: Unknown result type (might be due to invalid IL or missing references)
			if (points.Count >= 3)
			{
				float num = miterWidth;
				Vector2 val6 = default(Vector2);
				Vector2 val7 = default(Vector2);
				for (int i = 0; i < points.Count; i++)
				{
					Vector2 val = Vector2.op_Implicit(points[i]);
					Vector2 val2 = Vector2.op_Implicit(points[((i + 1) % points.Count + points.Count) % points.Count]);
					Vector2 val3 = Vector2.op_Implicit(points[((i + 2) % points.Count + points.Count) % points.Count]);
					Vector2 val4 = Vector2.op_Implicit(points[((i + 3) % points.Count + points.Count) % points.Count]);
					Vector2 val5 = val - val2;
					Vector2 normalized = ((Vector2)(ref val5)).normalized;
					val5 = val2 - val3;
					val5 = normalized + ((Vector2)(ref val5)).normalized;
					Vector2 normalized2 = ((Vector2)(ref val5)).normalized;
					((Vector2)(ref val6))..ctor(normalized2.y, 0f - normalized2.x);
					val5 = new Vector2(0f - (val2.y - val3.y), val2.x - val3.x);
					Vector2 normalized3 = ((Vector2)(ref val5)).normalized;
					float num2 = num / Vector2.Dot(val6, normalized3) * -1f;
					val5 = val2 - val3;
					Vector2 normalized4 = ((Vector2)(ref val5)).normalized;
					val5 = val3 - val4;
					val5 = normalized4 + ((Vector2)(ref val5)).normalized;
					Vector2 normalized5 = ((Vector2)(ref val5)).normalized;
					((Vector2)(ref val7))..ctor(normalized5.y, 0f - normalized5.x);
					val5 = new Vector2(0f - (val3.y - val4.y), val3.x - val4.x);
					Vector2 normalized6 = ((Vector2)(ref val5)).normalized;
					float num3 = num / Vector2.Dot(val7, normalized6) * -1f;
					Vector3 val8 = cam.WorldToScreenPoint(Vector2.op_Implicit(new Vector2(val2.x, val2.y))).UpscaleForGLScreen(wScreenFac, hScreenFac);
					Vector3 val9 = cam.WorldToScreenPoint(Vector2.op_Implicit(new Vector2(val3.x, val3.y))).UpscaleForGLScreen(wScreenFac, hScreenFac);
					Vector3 val10 = cam.WorldToScreenPoint(Vector2.op_Implicit(new Vector2((val3 + val7 * num3).x, (val3 + val7 * num3).y))).UpscaleForGLScreen(wScreenFac, hScreenFac);
					Vector3 val11 = val10;
					Vector3 val12 = cam.WorldToScreenPoint(Vector2.op_Implicit(new Vector2((val2 + val6 * num2).x, (val2 + val6 * num2).y))).UpscaleForGLScreen(wScreenFac, hScreenFac);
					Vector3 val13 = val8;
					GL.Vertex3(val8.x, val8.y, 0f);
					GL.Vertex3(val9.x, val9.y, 0f);
					GL.Vertex3(val10.x, val10.y, 0f);
					GL.Vertex3(val11.x, val11.y, 0f);
					GL.Vertex3(val12.x, val12.y, 0f);
					GL.Vertex3(val13.x, val13.y, 0f);
				}
			}
		}

		private static void Draw_OpenPolygon_Mitered(List<Vector2> points)
		{
			throw new NotImplementedException("Drawing open polygons not implemented");
		}

		public static void Draw_Lines_Open(List<Vector2> points)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_0019: Unknown result type (might be due to invalid IL or missing references)
			int count = points.Count;
			for (int i = 0; i < count; i++)
			{
				Vector2 val = points[i];
				GL.Vertex3(val.x, val.y, 0f);
			}
		}

		public static void Draw_Lines_Closed(List<Vector2> points)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_001e: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			int count = points.Count;
			for (int i = 0; i < count; i++)
			{
				Vector2 val = points[i];
				Vector2 val2 = points[(i + 1) % count];
				GL.Vertex3(val.x, val.y, 0f);
				GL.Vertex3(val2.x, val2.y, 0f);
			}
		}
	}
	public sealed class CachedBox2D : CachedColliderBase
	{
		public new BoxCollider2D cCollider { get; private set; }

		public CachedBox2D(BoxCollider2D collider, Color color)
			: base((Collider2D)(object)collider, color)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			cCollider = collider;
			RecalculateGeometry();
		}

		public override void RecalculateGeometry()
		{
			CalculateBoxWorldPoints(worldPoints, cCollider);
		}

		private static void CalculateBoxWorldPoints(List<Vector3> source, BoxCollider2D box2D)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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_0050: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: 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_009b: 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_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			source.Clear();
			if ((Object)(object)box2D != (Object)null)
			{
				Vector2 val = box2D.size * 0.5f;
				Bounds bounds = ((Collider2D)box2D).bounds;
				Matrix4x4 val2 = Matrix4x4.TRS(((Bounds)(ref bounds)).center, ((Component)box2D).transform.rotation, ((Component)box2D).transform.lossyScale);
				source.Add(((Matrix4x4)(ref val2)).MultiplyPoint3x4(new Vector3(0f - val.x, 0f - val.y)));
				source.Add(((Matrix4x4)(ref val2)).MultiplyPoint3x4(new Vector3(val.x, 0f - val.y)));
				source.Add(((Matrix4x4)(ref val2)).MultiplyPoint3x4(new Vector3(val.x, val.y)));
				source.Add(((Matrix4x4)(ref val2)).MultiplyPoint3x4(new Vector3(0f - val.x, val.y)));
			}
		}

		public sealed override void GL_Draw_Filled(Camera cam)
		{
			//IL_000f: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0053: 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_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_0077: 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)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: 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_009b: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: 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_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			base.GL_Draw_Filled(cam);
			Vector3 val = cam.WorldToScreenPoint(worldPoints[0]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
			Vector3 val2 = cam.WorldToScreenPoint(worldPoints[1]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
			Vector3 val3 = cam.WorldToScreenPoint(worldPoints[2]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
			Vector3 val4 = val3;
			Vector3 val5 = cam.WorldToScreenPoint(worldPoints[3]).UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac);
			Vector3 val6 = val;
			GL.Vertex3(val.x, val.y, 0f);
			GL.Vertex3(val2.x, val2.y, 0f);
			GL.Vertex3(val3.x, val3.y, 0f);
			GL.Vertex3(val4.x, val4.y, 0f);
			GL.Vertex3(val5.x, val5.y, 0f);
			GL.Vertex3(val6.x, val6.y, 0f);
		}

		public sealed override void GL_Draw_Mitered(Camera cam)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			base.GL_Draw_Mitered(cam);
			CachedColliderBase.globalVec2Cache.Clear();
			for (int i = 0; i < worldPoints.Count; i++)
			{
				CachedColliderBase.globalVec2Cache.Add(Vector2.op_Implicit(cam.WorldToScreenPoint(worldPoints[i].UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac))));
			}
			CachedColliderBase.Draw_ClosedPolygon_Mitered(cam, CachedColliderBase.globalVec2Cache);
		}

		public sealed override void GL_Draw_Lined(Camera cam)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			base.GL_Draw_Lined(cam);
			CachedColliderBase.globalVec2Cache.Clear();
			for (int i = 0; i < worldPoints.Count; i++)
			{
				CachedColliderBase.globalVec2Cache.Add(Vector2.op_Implicit(cam.WorldToScreenPoint(worldPoints[i].UpscaleForGLScreen(CachedColliderBase.wScreenFac, CachedColliderBase.hScreenFac))));
			}
			CachedColliderBase.Draw_Lines_Closed(CachedColliderBase.globalVec2Cache);
		}
	}
	public sealed class CachedCapsule2D : CachedColliderBase
	{
		private int resolution;

		private float hRadius;

		private float hHeight;

		private Vector3 center;

		public new CapsuleCollider2D cCollider { get; private set; }

		public CachedCapsule2D(CapsuleCollider2D collider, Color color, int resolution = 80)
			: base((Collider2D)(object)collider, color)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			cCollider = collider;
			this.resolution = resolution;
			RecalculateGeometry();
		}

		public override void RecalculateGeometry()
		{
			//IL_0007: 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_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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)
			hRadius = cCollider.size.x * 0.5f;
			hHeight = cCollider.size.y * 0.5f;
			Bounds bounds = ((Collider2D)cCollider).bounds;
			center = ((Bounds)(ref bounds)).center;
			CalculateColliderWorldPoints(worldPoints, cCollider, hRadius, hHeight, resolution);
		}

		private static void CalculateColliderWorldPoints(List<Vector3> source, CapsuleCollider2D cap2D, float hRadius, float hHeight, int res = 80)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: 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_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_006a: 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_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_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_0096: 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_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: 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_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			source.Clear();
			if ((Object)(object)cap2D != (Object)null)
			{
				List<Vector3> list = new List<Vector3>();
				float num = 360f / (float)res;
				float num2 = Mathf.Clamp(hHeight - hRadius, 0f, 999f);
				float num3 = num2 * -1f;
				Bounds bounds = ((Collider2D)cap2D).bounds;
				Matrix4x4 val = Matrix4x4.TRS(((Bounds)(ref bounds)).center, ((Component)cap2D).transform.rotation, ((Component)cap2D).transform.lossyScale);
				Vector3 item = ((Matrix4x4)(ref val)).MultiplyPoint3x4(new Vector3(hRadius, num2, 0f));
				Vector3 item2 = ((Matrix4x4)(ref val)).MultiplyPoint3x4(new Vector3(0f - hRadius, num3, 0f));
				source.Add(item);
				Vector3 val2 = default(Vector3);
				for (int i = 0; i < res / 2; i++)
				{
					float num4 = Mathf.Cos(MathF.PI / 180f * num * (float)(i + 1)) * hRadius;
					float num5 = Mathf.Sin(MathF.PI / 180f * num * (float)(i + 1)) * hRadius;
					((Vector3)(ref val2))..ctor(num4, num5);
					source.Add(((Matrix4x4)(ref val)).MultiplyPoint3x4(val2 + new Vector3(0f, num2, 0f)));
					list.Add(((Matrix4x4)(ref val)).MultiplyPoint3x4(new Vector3(0f, num3, 0f) - val2));
				}
				source.Add(item

SSDebug.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using Collider2DViewer;
using GlobalEnums;
using HarmonyLib;
using InUCS;
using InUCS.Addons;
using InUCS.Components;
using InUCS.Extensions;
using InUCS.Logging;
using InUCS.Manager;
using Microsoft.CodeAnalysis;
using SSDebug.Components;
using SSDebug.Game;
using SSDebug.Model;
using TeamCherry.SharedUtils;
using UnityEngine;
using UnityEngine.SceneManagement;

[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("SSDebug")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SSDebug")]
[assembly: AssemblyTitle("SSDebug")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace SSDebug
{
	public delegate void ActiveSceneChanged(Scene from, Scene to);
	public delegate void OnTakeDamage(HealthManager hm, HitInstance hit);
	public delegate void OnFinishedEnteringScene();
	public delegate void OnHealthManagerEnable(HealthManager hm);
	public delegate void OnHeroFinishedEnteringScene();
	public delegate bool Context();
	public sealed class SSDebugManager : ComponentManager
	{
		[CompilerGenerated]
		private sealed class <CoRoutineAdvanceFrame>d__47 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public SSDebugManager <>4__this;

			object? IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object? IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <CoRoutineAdvanceFrame>d__47(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				SSDebugManager sSDebugManager = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					sSDebugManager.SharedCache.advanceFrameBusy = true;
					Time.timeScale = 1f;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					Time.timeScale = 0f;
					sSDebugManager.SharedCache.advanceFrameBusy = false;
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private Context IsContextValid;

		public static SSDebugManager? instance { get; private set; }

		public GlobalConfig SharedConfig { get; private set; }

		public SharedCache SharedCache { get; private set; }

		public ConfigFile? BepinConf => SSDebugPlugin.PersistentConfig;

		public bool ShowGUI { get; private set; } = true;


		public Context ContextValid
		{
			get
			{
				return IsContextValid;
			}
			set
			{
				IsContextValid = value ?? new Context(MainContextValid);
			}
		}

		public event ActiveSceneChanged? ActiveSceneChanged;

		public event OnTakeDamage? OnHMTakeDamage;

		public event OnFinishedEnteringScene? OnFinishedEnteringScene;

		public event OnHealthManagerEnable? OnHealthManagerEnable;

		public event OnHeroFinishedEnteringScene? OnHeroFinishedEnteringScene;

		private void Awake()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			EnsureSingleton();
			Constructor();
			((ComponentManager)this).SpawnComponents();
			((ComponentManager)this).Awake();
			Cursor.SetCursor((Texture2D)null, Vector2.zero, (CursorMode)1);
		}

		private void Update()
		{
			if (Input.GetKeyDown((KeyCode)282))
			{
				if (LegacyInputHelper.NoAnyModifiers)
				{
					ShowGUI = !ShowGUI;
				}
				else if (Input.GetKey((KeyCode)306))
				{
					SharedConfig.ShowCursor = !SharedConfig.ShowCursor;
				}
			}
			if (MainContextValid())
			{
				((ComponentManager)this).Update();
			}
		}

		private void OnGUI()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (ShowGUI && MainContextValid())
			{
				if (SharedConfig.ShowCursor)
				{
					Cursor.lockState = (CursorLockMode)2;
					Cursor.visible = true;
				}
				Matrix4x4 matrix = GUI.matrix;
				GUI.matrix = SharedCache.rootMatrix;
				((ComponentManager)this).OnGUI();
				GUI.matrix = matrix;
			}
		}

		private void OnEnable()
		{
			((ComponentManager)this).Logger.Info((object)"Manager enabled");
			SceneManager.activeSceneChanged += OnActiveSceneChanged;
			((ComponentManager)this).OnEnable();
		}

		private void OnDisable()
		{
			((ComponentManager)this).Logger.Info((object)"Manager disabled");
			SceneManager.activeSceneChanged -= OnActiveSceneChanged;
			((ComponentManager)this).OnDisable();
		}

		private void OnDestroy()
		{
			((ComponentManager)this).Logger.Info((object)"Manager destroyed");
			((ComponentManager)this).OnDestroy();
			instance = null;
		}

		protected sealed override void SpawnComponents()
		{
			((ComponentManager)this).AddComponent((LocalComponent)(object)new HPViewer(this, startEnabled: true));
			((ComponentManager)this).AddComponent((LocalComponent)(object)new SaveStates(this, startEnabled: true, 1));
			((ComponentManager)this).AddComponent((LocalComponent)(object)new FreeCam(this, startEnabled: true, 1));
			((ComponentManager)this).AddComponent((LocalComponent)(object)new ColliderView(this, startEnabled: true, 2));
			((ComponentManager)this).AddComponent((LocalComponent)(object)new DebugInfo(this, startEnabled: true, 3));
			((ComponentManager)this).AddComponent((LocalComponent)(object)new SceneSelector(this, startEnabled: true, 3));
			((ComponentManager)this).AddComponent((LocalComponent)(object)new SpeedrunTools(this, startEnabled: true, 4));
			((ComponentManager)this).SpawnComponents();
		}

		private void EnsureSingleton()
		{
			if ((Object)(object)instance == (Object)null)
			{
				instance = this;
				((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
				Object.DontDestroyOnLoad((Object)(object)this);
			}
			if ((Object)(object)instance != (Object)(object)this)
			{
				((ComponentManager)this).Logger.Error((object)("[" + ((object)this).GetType().Name + "] Duplicate singleton detected!"));
				Object.DestroyImmediate((Object)(object)this);
			}
		}

		private void Constructor()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			SharedConfig = new GlobalConfig();
			SharedCache = new SharedCache();
			((ComponentManager)this).Logger = (ILogRouter)new BepinExLogger("SSDebugPlugin");
			ContextValid = MainContextValid;
			ScreenHelper.CalculateMatrixInLine(ref SharedCache.rootMatrix, (float)Screen.width, (float)Screen.height);
			if (BepinConf != null)
			{
				SharedConfig.SpeedupFactor = BepinConf.Bind<float>("Config", "SpeedupFactor", 2f, "Speedup factor when holding LShit/DownPad");
				SharedConfig.ShowCanJump = BepinConf.Bind<bool>("Config", "ShowCanJump", false, "Display CanJump hero state in debug info pane? Perf.hit.");
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void DrawCursor()
		{
			//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_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			int fontSize = GUI.skin.label.fontSize;
			FontStyle fontStyle = GUI.skin.label.fontStyle;
			Color contentColor = GUI.contentColor;
			GUI.skin.label.fontSize = 20;
			GUI.skin.label.fontStyle = (FontStyle)1;
			GUI.contentColor = Color.white;
			GUI.Label(new Rect(Input.mousePosition.x, (float)Screen.height - Input.mousePosition.y, 32f, 32f), "+");
			GUI.skin.label.fontSize = fontSize;
			GUI.skin.label.fontStyle = fontStyle;
			GUI.contentColor = contentColor;
		}

		[IteratorStateMachine(typeof(<CoRoutineAdvanceFrame>d__47))]
		internal IEnumerator CoRoutineAdvanceFrame()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <CoRoutineAdvanceFrame>d__47(0)
			{
				<>4__this = this
			};
		}

		private void OnActiveSceneChanged(Scene from, Scene to)
		{
			//IL_0051: 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)
			((ComponentManager)this).Logger.Message((object)("Scene change: " + ((Scene)(ref from)).name + " -> " + ((Scene)(ref to)).name));
			SharedCache.activeScene = ((Scene)(ref to)).name ?? "";
			if (this.ActiveSceneChanged != null)
			{
				this.ActiveSceneChanged(from, to);
			}
		}

		internal void HealthManagerTakeDamage(HealthManager hm, HitInstance hit)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (this.OnHMTakeDamage != null)
			{
				this.OnHMTakeDamage(hm, hit);
			}
		}

		internal void FinishedEnteringScene()
		{
			if (this.OnFinishedEnteringScene != null)
			{
				this.OnFinishedEnteringScene();
			}
		}

		internal void HeroFinishedEnteringScene()
		{
			if (this.OnHeroFinishedEnteringScene != null)
			{
				this.OnHeroFinishedEnteringScene();
			}
		}

		internal void HealthManagerEnable(HealthManager hm)
		{
			if (this.OnHealthManagerEnable != null)
			{
				this.OnHealthManagerEnable(hm);
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public bool MainContextValid()
		{
			if (Application.isPlaying && SharedCache.activeScene != string.Empty && SharedCache.activeScene != "Pre_Menu_Loader" && SharedCache.activeScene != "Pre_Menu_Intro" && SharedCache.activeScene != "Menu_Title" && SharedCache.activeScene != "Quit_To_Menu" && (Object)(object)GameAPI.GameManager != (Object)null)
			{
				return (Object)(object)GameAPI.HeroCtrl != (Object)null;
			}
			return false;
		}
	}
	internal static class PluginMeta
	{
		public const string NAME = "SSDebugPlugin";

		public const string VERSION = "0.1.35";

		public const string GUID = "com.bepin.SSDebugkz";
	}
	[BepInPlugin("com.bepin.SSDebugkz", "SSDebugPlugin", "0.1.35")]
	public class SSDebugPlugin : BaseUnityPlugin
	{
		private static GameObject? CurrentObject { get; set; }

		private static Harmony? HarmonyPatcher { get; set; }

		public static ConfigFile? PersistentConfig { get; private set; }

		private void Awake()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			PersistentConfig = ((BaseUnityPlugin)this).Config;
			if ((Object)(object)CurrentObject == (Object)null)
			{
				CurrentObject = new GameObject("SSDebugPlugin", new Type[1] { typeof(SSDebugManager) })
				{
					hideFlags = (HideFlags)61
				};
				Object.DontDestroyOnLoad((Object)(object)CurrentObject);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Successfully created SSDebugManager");
			}
			ApplyPatches();
		}

		private void ApplyPatches()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			try
			{
				Harmony? harmonyPatcher = HarmonyPatcher;
				if (harmonyPatcher != null)
				{
					harmonyPatcher.UnpatchSelf();
				}
				HarmonyPatcher = new Harmony("com.bepin.SSDebugkz");
				HarmonyPatcher.PatchAll(Assembly.GetExecutingAssembly());
			}
			catch (Exception arg)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to patch: {arg}");
			}
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)"BepinEx object destroyed (!)");
		}
	}
}
namespace SSDebug.Patches
{
	public static class HarmonyPatches
	{
		[HarmonyPatch(typeof(HealthManager), "TakeDamage")]
		public static class HealthManagerDmg
		{
			private static void Postfix(HealthManager __instance, HitInstance hitInstance)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				SSDebugManager.instance.HealthManagerTakeDamage(__instance, hitInstance);
			}
		}

		[HarmonyPatch(typeof(HealthManager), "OnEnable")]
		public static class HealthManagerEnable
		{
			private static void Postfix(HealthManager __instance)
			{
				SSDebugManager.instance.HealthManagerEnable(__instance);
			}
		}

		[HarmonyPatch(typeof(GameManager), "FinishedEnteringScene")]
		public static class GameManagerEnterScene
		{
			private static void Postfix()
			{
				SSDebugManager.instance.HeroFinishedEnteringScene();
			}
		}

		[HarmonyPatch(typeof(InputHandler), "SetCursorEnabled")]
		public static class InputHandlerCursor
		{
			private static bool Prefix(InputHandler __instance)
			{
				return !SSDebugManager.instance.SharedConfig.ShowCursor;
			}
		}

		[HarmonyPatch(typeof(HeroController), "FinishedEnteringScene")]
		public static class HeroControllerFinishedEnteringScene
		{
			private static void Postfix()
			{
				SSDebugManager.instance.HeroFinishedEnteringScene();
			}
		}
	}
}
namespace SSDebug.Model
{
	public sealed class GlobalConfig : BaseSharedConfig
	{
		public enum UIState
		{
			Off = 0,
			On = 1,
			DebugInfo = 2,
			SceneList = 4,
			Colliders = 8,
			Flags = 0x10,
			HP = 0x20
		}

		public ConfigEntry<float> SpeedupFactor;

		public ConfigEntry<bool> ShowCanJump;

		public UIState uiState { get; set; } = (UIState)3;


		public bool uiShowScenes => (uiState & UIState.SceneList) == UIState.SceneList;

		public bool uiShowFlag => (uiState & UIState.Flags) == UIState.Flags;

		public bool uiShowHp => (uiState & UIState.HP) == UIState.HP;

		public bool PlayerAutoHeal { get; set; }

		public bool PlayerAutoSilk { get; set; }

		public bool PlayerInvulnerability { get; set; }

		public bool ShowCursor { get; set; } = true;


		public bool BlockPlayerInput { get; set; }
	}
	public class MapEntry
	{
		public string ZoneName { get; set; }

		public List<string> Scenes { get; set; }

		public string[] Gates { get; set; }

		public string[] Respawns { get; set; }
	}
	public sealed class SharedCache
	{
		public Matrix4x4 rootMatrix;

		public string activeScene = string.Empty;

		public readonly Texture2D boxBG = new Texture2D(1, 1, (TextureFormat)20, false);

		public Camera? gameCam;

		public bool advanceFrameBusy;

		public Dictionary<string, MapEntry> mapData = new Dictionary<string, MapEntry>(10);

		public string[]? zoneNames;

		public bool queuedLoadState;
	}
	[Serializable]
	public sealed class SState
	{
		public int ver;

		public Vector3 pos;

		public string scene;

		public int silk;

		public int health;

		public bool facingRight;

		public bool isMaggoted;

		public string data;
	}
}
namespace SSDebug.Game
{
	public static class GameAPI
	{
		public static GameManager? GameManager => GameManager.SilentInstance;

		public static CameraController? CamCtrl => GameManager.SilentInstance.cameraCtrl;

		public static Camera? GameCamera => GameCameras.SilentInstance.mainCamera;

		public static HeroController? HeroCtrl => GameManager.SilentInstance.hero_ctrl;

		public static void ChangeSceneAsTransition(string scene_name, string entryGate = "")
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)GameManager == (Object)null))
			{
				SceneLoadInfo val = new SceneLoadInfo();
				val.SceneName = scene_name;
				val.EntryGateName = entryGate;
				val.PreventCameraFadeOut = true;
				val.WaitForSceneTransitionCameraFade = false;
				val.Visualization = (SceneLoadVisualizations)0;
				val.AlwaysUnloadUnusedAssets = true;
				val.IsFirstLevelForPlayer = false;
				GameManager.BeginSceneTransition(val);
			}
		}

		public static void ReEnableHeroInput()
		{
			HeroCtrl.acceptingInput = true;
			HeroCtrl.move_input = 0f;
			HeroCtrl.vertical_input = 0f;
		}

		public static void FinishEnteringStateSlow()
		{
			AccessTools.Method(typeof(HeroController), "FinishedEnteringScene", (Type[])null, (Type[])null).Invoke(HeroCtrl, new object[2] { false, false });
		}

		public static int GetCurrentScaleLevel(ref HitInstance hitInstance)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			if (hitInstance.IsUsingNeedleDamageMult)
			{
				return PlayerData.instance.nailUpgrades;
			}
			if (Object.op_Implicit((Object)(object)hitInstance.RepresentingTool) && (int)hitInstance.RepresentingTool.Type != 3)
			{
				return PlayerData.instance.ToolKitUpgrades;
			}
			return hitInstance.DamageScalingLevel - 1;
		}

		public static void ForceEquipCrest(string crestName, PlayerData pd)
		{
			List<string> list = new List<string>();
			foreach (ToolItem item in ToolItemManager.GetEquippedToolsForCrest(crestName))
			{
				list.Add(item.name);
			}
			pd.CurrentCrestID = string.Empty;
			ToolItemManager.SetEquippedCrest(crestName);
			if (list.Count > 0)
			{
				ToolItemManager.SetEquippedTools(crestName, list);
			}
			ToolItemManager.SendEquippedChangedEvent(false);
		}

		public static bool HeroCanJump(HeroController hc)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Invalid comparison between Unknown and I4
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Invalid comparison between Unknown and I4
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			if (hc.IsInputBlocked())
			{
				return false;
			}
			if ((int)hc.hero_state == 7 || (int)hc.hero_state == 5 || (int)hc.hero_state == 6 || hc.cState.wallSliding || hc.cState.dashing || hc.cState.isSprinting || hc.cState.backDashing || hc.cState.jumping || hc.cState.bouncing || hc.cState.shroomBouncing || hc.cState.downSpikeRecovery)
			{
				return false;
			}
			if (hc.cState.onGround)
			{
				return true;
			}
			if (hc.ledgeBufferSteps > 0 && !hc.cState.dead && !hc.cState.hazardDeath && !hc.controlReqlinquished && hc.headBumpSteps <= 0 && !hc.CheckNearRoof())
			{
				return true;
			}
			return false;
		}
	}
	public enum Layers
	{
		Default,
		TransparentFX,
		Ignore_Raycast,
		UNUSED1,
		Water,
		UI,
		UNUSED2,
		Currency_Self_Collide,
		Terrain,
		Player,
		Self_Collide,
		Enemies,
		Projectiles,
		Hero_Detector,
		Terrain_Detector,
		Enemy_Detector,
		Tinker,
		Attack,
		Particle,
		Interactive_Object,
		Hero_Box,
		Grass,
		Enemy_Attack,
		Water_Surface,
		Bouncer,
		Soft_Terrain,
		Corpse,
		Physical_Pusher,
		Hero_Only,
		ActiveRegion,
		Physical_Push_React,
		Attack_Detector
	}
}
namespace SSDebug.Components
{
	internal sealed class ColliderView : PluginComponent
	{
		private bool uiShowCollLayers;

		private bool collViewOn;

		private bool collViewReqHierarchy;

		private Config Cfg = new Config();

		private Vector2 layerScroll;

		private Material? matIntColored;

		private List<CachedColliderBase> colliderCache = new List<CachedColliderBase>();

		public ColliderView(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			((LocalComponent)this).OnComponentEnable();
			Camera.onPostRender = (CameraCallback)Delegate.Combine((Delegate?)(object)Camera.onPostRender, (Delegate?)new CameraCallback(OnPostRenderCallback));
			SceneManager.activeSceneChanged += OnActiveSceneChanged;
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
			((LocalComponent)this).OnDisable();
		}

		public override void OnDisable()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			SceneManager.activeSceneChanged -= OnActiveSceneChanged;
			Camera.onPostRender = (CameraCallback)Delegate.Remove((Delegate?)(object)Camera.onPostRender, (Delegate?)new CameraCallback(OnPostRenderCallback));
			ClearColliderCache();
		}

		public sealed override void Update()
		{
			//IL_005e: 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_0066: 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 (Input.GetKeyDown((KeyCode)292))
			{
				if (Input.GetKey((KeyCode)304))
				{
					uiShowCollLayers = !uiShowCollLayers;
				}
				else if (Input.GetKey((KeyCode)306))
				{
					collViewReqHierarchy = !collViewReqHierarchy;
				}
				else if (Input.GetKey((KeyCode)303))
				{
					Cfg.mode = (DrawMode)(byte)((Cfg.mode + 1) % 3);
				}
				else if (collViewOn = !collViewOn)
				{
					FullSweep(null);
				}
			}
			if (collViewOn)
			{
				if (Input.GetKeyDown((KeyCode)280))
				{
					CachedColliderBase.MiterWidth += 1f;
				}
				if (Input.GetKeyDown((KeyCode)281))
				{
					CachedColliderBase.MiterWidth -= 1f;
				}
			}
		}

		public sealed override void OnGUI()
		{
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: 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_0222: Unknown result type (might be due to invalid IL or missing references)
			if (!uiShowCollLayers)
			{
				return;
			}
			GUI.skin.button.fontSize = 18;
			GUI.skin.button.fontStyle = (FontStyle)1;
			GUI.skin.button.alignment = (TextAnchor)4;
			GUI.skin.button.wordWrap = false;
			GUI.skin.label.fontSize = 18;
			GUI.skin.label.fontStyle = (FontStyle)1;
			GUI.skin.label.wordWrap = false;
			GUI.skin.label.alignment = (TextAnchor)3;
			int num = Cfg.collPreset.Length;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(10f, 466f, 300f, 600f);
			GUI.DrawTexture(val, (Texture)(object)base.GCache.boxBG, (ScaleMode)0, false, 1f, new Color(0f, 0f, 0f, 0.7f), 0f, 0f);
			layerScroll = GUI.BeginScrollView(new Rect(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width + 2f, ((Rect)(ref val)).height - 2f), layerScroll, new Rect(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width, 30f * (float)(num + 1)), GUIStyle.none, GUI.skin.verticalScrollbar);
			for (int i = 0; i < Cfg.collPreset.Length; i++)
			{
				Color color = GUI.color;
				CollLayer collLayer = Cfg.collPreset[i];
				Rect val2 = new Rect(((Rect)(ref val)).x + 4f, ((Rect)(ref val)).y + 31f * (float)i, 220f, 30f);
				GUI.color = new Color(collLayer.color.r, collLayer.color.g, collLayer.color.b, 1f);
				GUI.Label(val2, collLayer.name);
				GUI.color = color;
				float num2 = 12f;
				float num3 = 40f;
				if (GUI.Button(new Rect(((Rect)(ref val)).x + ((Rect)(ref val)).width - (num3 + num2), ((Rect)(ref val)).y + 31f * (float)i, num3, 30f), collLayer.isEnabled ? "✘" : ""))
				{
					collLayer.isEnabled = !collLayer.isEnabled;
					FullSweep(null);
				}
			}
			GUI.EndScrollView();
		}

		private void OnPostRenderCallback(Camera cam)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			if (collViewOn && !((Object)(object)matIntColored == (Object)null) && HasAnyColliders() && base.Manager.MainContextValid() && !((Object)(object)cam != (Object)(object)GameAPI.GameCamera))
			{
				CachedColliderBase.Draw(Cfg.mode, matIntColored, cam, colliderCache, collViewReqHierarchy);
			}
		}

		private void OnActiveSceneChanged(Scene from, Scene to)
		{
			ClearColliderCache();
			FullSweep(null);
		}

		private void FetchMaterial()
		{
			//IL_0046: 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_0058: Expected O, but got Unknown
			if (!((Object)(object)matIntColored != (Object)null))
			{
				Shader val = Shader.Find("Hidden/Internal-Colored");
				if ((Object)(object)val == (Object)null)
				{
					((ComponentManager)base.Manager).Logger.Error((object)$"[{((object)this).GetType()}] Failed to fetch required shader");
					return;
				}
				matIntColored = new Material(val)
				{
					hideFlags = (HideFlags)61
				};
				matIntColored.SetInt("_SrcBlend", 5);
				matIntColored.SetInt("_DstBlend", 10);
				matIntColored.SetInt("_Cull", 0);
			}
		}

		private void FullSweep(Transform? trans)
		{
			//IL_004d: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: 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)
			ClearColliderCache();
			FetchMaterial();
			Collider2D[] array;
			if ((Object)(object)trans != (Object)null)
			{
				int num = 0;
				for (int i = 0; i < Cfg.collPreset.Length; i++)
				{
					if (Cfg.collPreset[i].isEnabled)
					{
						num |= 1 << i;
					}
				}
				array = Physics2D.OverlapBoxAll(Vector2.op_Implicit(trans.position), new Vector2(300f, 300f), 0f, num);
			}
			else
			{
				array = Object.FindObjectsByType<Collider2D>((FindObjectsInactive)1, (FindObjectsSortMode)0);
			}
			for (int j = 0; j < array.Length; j++)
			{
				if (!((Object)(object)array[j] == (Object)null) && Cfg.collPreset[((Component)array[j]).gameObject.layer].isEnabled)
				{
					Color color = Cfg.collPreset[((Component)array[j]).gameObject.layer].color;
					CachedColliderBase.AppendByType(colliderCache, array[j], color);
				}
			}
			CachedColliderBase.UpdateScreenFactor(ScreenHelper.WFac, ScreenHelper.HFac);
		}

		private void ClearColliderCache()
		{
			colliderCache.Clear();
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public bool HasAnyColliders()
		{
			return colliderCache.Count > 0;
		}
	}
	internal sealed class Config
	{
		public DrawMode mode = (DrawMode)2;

		public static readonly Color defColor = new Color(1f, 1f, 1f, 0.5f);

		public CollLayer[] collPreset = new CollLayer[32]
		{
			new CollLayer(0, isEnabled: false, new Color(1f, 0.92f, 0.0156f, 0.3f), "Default"),
			new CollLayer(1, isEnabled: false, defColor, "TransparentFX"),
			new CollLayer(2, isEnabled: false, defColor, "Ignore_Raycast"),
			new CollLayer(3, isEnabled: false, new Color(0f, 0f, 0f, 0f), "UNUSED1"),
			new CollLayer(4, isEnabled: false, defColor, "Water"),
			new CollLayer(5, isEnabled: false, defColor, "UI"),
			new CollLayer(6, isEnabled: false, defColor, "UNUSED2"),
			new CollLayer(7, isEnabled: false, new Color(0f, 1f, 1f, 0.5f), "Currency_Self_Collide"),
			new CollLayer(8, isEnabled: true, new Color(0f, 1f, 0f, 0.5f), "Terrain"),
			new CollLayer(9, isEnabled: false, new Color(1f, 1f, 1f, 0.3f), "Player"),
			new CollLayer(10, isEnabled: false, new Color(0f, 1f, 1f, 0.6f), "Self_Collide"),
			new CollLayer(11, isEnabled: true, new Color(0f, 1f, 1f, 0.6f), "Enemies"),
			new CollLayer(12, isEnabled: false, new Color(0.1f, 0f, 1f, 0.6f), "Projectiles"),
			new CollLayer(13, isEnabled: false, new Color(0.2082f, 0.3725f, 0.4f, 0.94f), "Hero_Detector"),
			new CollLayer(14, isEnabled: true, new Color(0f, 1f, 1f, 0.5f), "Terrain_Detector"),
			new CollLayer(15, isEnabled: true, new Color(1f, 0.92f, 0.0156f, 0.3f), "Enemy_Detector"),
			new CollLayer(16, isEnabled: true, new Color(0.94f, 0.476f, 0.021f, 0.5f), "Tinker"),
			new CollLayer(17, isEnabled: false, new Color(1f, 0f, 0f, 0.5f), "Attack"),
			new CollLayer(18, isEnabled: true, new Color(1f, 1f, 1f, 0.3f), "Particle"),
			new CollLayer(19, isEnabled: true, new Color(0.94f, 0.476f, 0.021f, 0.5f), "Interactive_Object"),
			new CollLayer(20, isEnabled: true, new Color(1f, 0.92f, 0.0156f, 0.3f), "Hero_Box"),
			new CollLayer(21, isEnabled: false, defColor, "Grass"),
			new CollLayer(22, isEnabled: true, new Color(0.97f, 0f, 1f, 0.6f), "Enemy_Attack"),
			new CollLayer(23, isEnabled: false, defColor, "Water_Surface"),
			new CollLayer(24, isEnabled: true, new Color(0.1f, 0f, 1f, 0.6f), "Bouncer"),
			new CollLayer(25, isEnabled: true, defColor, "Soft_Terrain"),
			new CollLayer(26, isEnabled: false, new Color(1f, 0.921f, 0.0156f, 0.3f), "Corpse"),
			new CollLayer(27, isEnabled: false, new Color(0f, 1f, 0f, 0.5f), "Physical_Pusher"),
			new CollLayer(28, isEnabled: true, new Color(1f, 0.92f, 0.0156f, 0.3f), "Hero_Only"),
			new CollLayer(29, isEnabled: true, defColor, "ActiveRegion"),
			new CollLayer(30, isEnabled: false, defColor, "Physical_Push_React"),
			new CollLayer(31, isEnabled: false, defColor, "Attack_Detector")
		};
	}
	internal sealed class CollLayer
	{
		public readonly int layer;

		public bool isEnabled;

		public readonly string name = "NULL";

		public Color color = new Color(1f, 1f, 1f, 0.5f);

		public CollLayer(int layer, bool isEnabled, Color color, string name)
		{
			//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_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			this.layer = layer;
			this.isEnabled = isEnabled;
			this.color = color;
			this.name = name;
		}
	}
	internal sealed class DebugInfo : PluginComponent
	{
		private readonly MutableString dInfo = new MutableString(450, true);

		private bool uiShowDebug = true;

		private Rect boxPos = new Rect(10f, 10f, 300f, 490f);

		private string gamever = string.Empty;

		private string dInfoStr = string.Empty;

		private string[] hStateLUT = new string[9] { "grounded", "idle", "running", "airborne", "wall_sliding", "hard_landing", "dash_landing", "no_input", "previous" };

		private string[] gStateLUT = new string[9] { "INACTIVE", "MAIN_MENU", "LOADING", "ENTERING_LEVEL", "PLAYING", "PAUSED", "EXITING_LEVEL", "CUTSCENE", "PRIMER" };

		private MovingAverage playerAvgVelocity = new MovingAverage(30);

		private Vector3 statsLastPos;

		private int lastHP;

		private int lastMaxHP;

		private int lastDamage;

		private int prevDamage;

		private bool isTool;

		private bool isCrit;

		private int totalCumm;

		private AttackTypes lastType;

		private int lastID;

		private string lastTypeStr = string.Empty;

		private string lastName = string.Empty;

		private DamageScalingConfig lastScaleConf;

		private int lastScaleLvl;

		private static FieldRef<HealthManager, int> initHp = AccessTools.FieldRefAccess<HealthManager, int>("initHp");

		private GameManager? GM => GameAPI.GameManager;

		private HeroController? GetHeroCtrl => GameAPI.HeroCtrl;

		public DebugInfo(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Expected O, but got Unknown


		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
			base.Manager.OnHMTakeDamage += OnTakeDamage;
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
			base.Manager.OnHMTakeDamage -= OnTakeDamage;
		}

		public sealed override void Update()
		{
			if (Input.GetKeyDown((KeyCode)282) && Input.GetKey((KeyCode)304))
			{
				uiShowDebug = !uiShowDebug;
				ClearAccumulatedStats();
			}
			SampleData();
		}

		public sealed override void OnGUI()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Invalid comparison between Unknown and I4
			//IL_001b: 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_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_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: 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_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			if ((int)Event.current.type == 7 && uiShowDebug)
			{
				Color contentColor = GUI.contentColor;
				bool wordWrap = GUI.skin.box.wordWrap;
				int fontSize = GUI.skin.label.fontSize;
				FontStyle fontStyle = GUI.skin.label.fontStyle;
				TextAnchor alignment = GUI.skin.label.alignment;
				GUI.contentColor = Color.white;
				GUI.skin.label.wordWrap = false;
				GUI.skin.label.fontSize = 20;
				GUI.skin.label.fontStyle = (FontStyle)1;
				GUI.skin.label.alignment = (TextAnchor)0;
				GUI.DrawTexture(boxPos, (Texture)(object)base.GCache.boxBG, (ScaleMode)0, false, 1f, new Color(0f, 0f, 0f, 0.9f), 0f, 0f);
				GUI.Label(boxPos, dInfoStr);
				GUI.skin.label.wordWrap = wordWrap;
				GUI.skin.label.fontSize = fontSize;
				GUI.skin.label.fontStyle = fontStyle;
				GUI.skin.label.alignment = alignment;
				GUI.contentColor = contentColor;
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void SampleData()
		{
			//IL_007c: 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_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Invalid comparison between Unknown and I4
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Invalid comparison between Unknown and I4
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0562: Unknown result type (might be due to invalid IL or missing references)
			dInfo.Append("[DEBUG] <size=16>(").Append("0.1.35").Append(" | ")
				.Append("1.0.28561")
				.Append(")</size>\n");
			if (uiShowDebug)
			{
				GameObject gameObject = ((Component)GetHeroCtrl).gameObject;
				HeroController heroCtrl = GameAPI.HeroCtrl;
				GameManager gameManager = GameAPI.GameManager;
				float num = SampleVelocity(gameObject.transform);
				playerAvgVelocity.Sample((long)num);
				Vector3 position = gameObject.transform.position;
				dInfo.Append("Scene: ").Append(base.Manager.SharedCache.activeScene).Append("\n");
				dInfo.Append("Comp%: ").Append(gameManager.playerData.completionPercentage).Append("\n");
				dInfo.Append("Stats: ").Append(GetHeroCtrl.playerData.silk, 2u, ' ').Append("/")
					.Append(GetHeroCtrl.playerData.CurrentSilkMax)
					.Append(" | ")
					.Append(GetHeroCtrl.playerData.health, 2u, ' ')
					.Append("/")
					.Append(GetHeroCtrl.playerData.maxHealth)
					.Append("\n");
				dInfo.Append("Speed: ").Append(num, 2u).Append(" (avg: ")
					.Append(playerAvgVelocity.GetAverageFloat, 2u)
					.Append(")")
					.Append("\n");
				dInfo.Append("Pos: ").Append("x: ").Append(position.x, 2u, 2u, ' ')
					.Append(" y: ")
					.Append(position.y, 2u, 2u, ' ')
					.Append("\n");
				dInfo.Append("Spawn: ").Append(gameManager.playerData.respawnScene).Append("\n");
				if ((int)heroCtrl.hero_state > -1 && (int)heroCtrl.hero_state < 9)
				{
					dInfo.Append("HStates: ").Append(hStateLUT[heroCtrl.hero_state]).Append(" | ");
				}
				ConfigEntry<bool> showCanJump = base.GConf.ShowCanJump;
				if (showCanJump != null && showCanJump.Value)
				{
					dInfo.Append(Convert.ToUInt32(heroCtrl.CanJump())).Append(" | ");
				}
				dInfo.Append(Convert.ToUInt32(heroCtrl.CanWallJump(true))).Append("\n");
				dInfo.Append("a j w  t w s b d a h f  i  r t  g").Append("\n");
				dInfo.Append(Convert.ToUInt32(heroCtrl.cState.attacking)).Append(" ").Append(Convert.ToUInt32(heroCtrl.cState.jumping))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.wallSliding))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.touchingWall))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.wallJumping))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.isSprinting))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.isBackScuttling))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.dashing))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.airDashing))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.isBinding))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.falling))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.Invulnerable))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.recoiling))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.transitioning))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.cState.onGround))
					.Append("\n");
				dInfo.Append("GState: ").Append(gStateLUT[gameManager.GameState]).Append("\n");
				dInfo.Append(Convert.ToUInt32(gameManager.IsInSceneTransition)).Append(" ").Append(Convert.ToUInt32(gameManager.RespawningHero))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.inputBlockers.Count))
					.Append(" ")
					.Append(Convert.ToUInt32(heroCtrl.controlReqlinquished))
					.Append(" ")
					.Append((sbyte)heroCtrl.HeroLockState)
					.Append(" | ")
					.Append(Convert.ToUInt32(heroCtrl.acceptingInput))
					.Append(" ")
					.Append((sbyte)heroCtrl.move_input)
					.Append(" ")
					.Append((sbyte)heroCtrl.vertical_input)
					.Append("\n");
				dInfo.Append("NLvl: ").Append(GameAPI.GameManager.playerData.nailUpgrades).Append(" TLvl: ")
					.Append(GameAPI.GameManager.playerData.ToolKitUpgrades)
					.Append(" NDmg: ")
					.Append(GameAPI.GameManager.playerData.nailDamage)
					.Append("\n");
				dInfo.Append("LastHP: ").Append(lastHP).Append("/")
					.Append(lastMaxHP)
					.Append("\n");
				dInfo.Append("LastDmg: ").Append(lastDamage).Append("\n");
				dInfo.Append("PrevDmg: ").Append(prevDamage).Append("\n");
				dInfo.Append("Cummul: ").Append(totalCumm).Append("\n");
				dInfo.Append("Type: ").Append(lastTypeStr).Append("\n");
				dInfo.Append("isTool/Crit: ").Append(isTool).Append(" | ")
					.Append(isCrit)
					.Append("\n");
				if (lastScaleConf != null)
				{
					dInfo.Append("Scaling: ").Append(lastScaleLvl).Append(" lvl")
						.Append("\n");
					dInfo.Append(lastScaleConf.Level1Mult).Append("|").Append(lastScaleConf.Level2Mult)
						.Append("|")
						.Append(lastScaleConf.Level3Mult)
						.Append("|")
						.Append(lastScaleConf.Level4Mult)
						.Append("|")
						.Append(lastScaleConf.Level5Mult)
						.Append("\n");
				}
			}
			dInfoStr = dInfo.Finalize();
		}

		private void OnTakeDamage(HealthManager hm, HitInstance hit)
		{
			//IL_001a: 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_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_0077: 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)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)((Component)hm).gameObject != (Object)(object)((Component)GameAPI.HeroCtrl).gameObject)
			{
				int num = Mathf.RoundToInt((float)hit.DamageDealt * hit.Multiplier);
				if (hm.damageOverride)
				{
					num = 1;
				}
				isTool = Object.op_Implicit((Object)(object)hit.RepresentingTool);
				isCrit = hit.CriticalHit;
				prevDamage = lastDamage;
				lastDamage = num;
				totalCumm += num;
				if (lastType != hit.AttackType || lastTypeStr == string.Empty)
				{
					lastType = hit.AttackType;
					lastTypeStr = ((object)(AttackTypes)(ref hit.AttackType)).ToString();
				}
				lastHP = hm.hp;
				lastMaxHP = initHp.Invoke(hm);
				if (((Object)((Component)hm).gameObject).GetInstanceID() != lastID)
				{
					lastName = ((Object)((Component)hm).gameObject).name;
					lastScaleConf = hm.damageScaling;
					lastScaleLvl = GameAPI.GetCurrentScaleLevel(ref hit);
				}
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private float SampleVelocity(Transform? target)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)target == (Object)null)
			{
				return 0f;
			}
			float result = Vector3.Distance(target.position, statsLastPos) / Time.deltaTime;
			statsLastPos = target.position;
			return result;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void ClearAccumulatedStats()
		{
			playerAvgVelocity.Clear();
			lastHP = (lastMaxHP = (lastDamage = (prevDamage = (totalCumm = (lastID = 0)))));
			lastTypeStr = (lastName = string.Empty);
			lastScaleConf = null;
			isTool = (isCrit = false);
		}
	}
	internal sealed class FreeCam : PluginComponent
	{
		private Vector3 lastFreeCamPos;

		private tk2dCamera tk2dCam;

		private CameraTarget origTarget;

		private CameraTarget proxyTarget;

		private static FieldRef<CameraTarget, Transform> heroTransform = AccessTools.FieldRefAccess<CameraTarget, Transform>("heroTransform");

		private bool isFreeCamEnabled
		{
			get
			{
				if ((Object)(object)GameAPI.CamCtrl != (Object)null)
				{
					return (Object)(object)GameAPI.CamCtrl.camTarget == (Object)(object)proxyTarget;
				}
				return false;
			}
		}

		public FreeCam(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
			base.Manager.ActiveSceneChanged += ActiveSceneChanged;
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
			base.Manager.ActiveSceneChanged -= ActiveSceneChanged;
		}

		public sealed override void Update()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Invalid comparison between Unknown and I4
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: 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)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: 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_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: 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)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)GameAPI.CamCtrl == (Object)null || (int)GameAPI.GameManager.GameState < 2)
			{
				return;
			}
			if (Input.GetKey((KeyCode)306) && Input.GetAxis("Mouse ScrollWheel") != 0f && (Object)(object)tk2dCam != (Object)null)
			{
				tk2dCamera obj = tk2dCam;
				obj.ZoomFactor -= Input.GetAxis("Mouse ScrollWheel") * (1f * tk2dCam.ZoomFactor);
			}
			if ((Input.GetKeyDown((KeyCode)8) || Input.GetKeyDown((KeyCode)325)) && (Object)(object)tk2dCam != (Object)null)
			{
				tk2dCam.ZoomFactor = 1f;
			}
			if (Input.GetKeyUp((KeyCode)291) && (Object)(object)GameAPI.GameCamera != (Object)null && !Input.GetKey((KeyCode)304) && !Input.GetKey((KeyCode)303))
			{
				if (Input.GetKey((KeyCode)306) && (Object)(object)GameAPI.HeroCtrl != (Object)null)
				{
					GameAPI.CamCtrl.PositionToHeroInstant(true);
				}
				else
				{
					ToggleFreeCam();
				}
			}
			if (Input.GetKey((KeyCode)308) && (Object)(object)GameAPI.CamCtrl.camTarget == (Object)(object)proxyTarget)
			{
				float num = Mathf.Abs(((Component)GameAPI.GameCamera).transform.position.z) + 1f;
				if (Input.GetKeyDown((KeyCode)323))
				{
					Vector3 mousePosition = Input.mousePosition;
					lastFreeCamPos = GameAPI.GameCamera.ScreenToWorldPoint(new Vector3(mousePosition.x, mousePosition.y, num));
				}
				if (Input.GetKey((KeyCode)323))
				{
					Vector3 mousePosition2 = Input.mousePosition;
					float num2 = (Input.GetKey((KeyCode)304) ? 30f : 15f);
					Vector3 val = (GameAPI.GameCamera.ScreenToWorldPoint(new Vector3(mousePosition2.x, mousePosition2.y, num)) - lastFreeCamPos) * -1f * Time.deltaTime * num2;
					((Component)GameAPI.GameCamera).transform.localPosition = ((Component)GameAPI.GameCamera).transform.localPosition + val;
				}
				if (Input.GetKeyUp((KeyCode)324))
				{
					SpawnAtCursor();
				}
			}
			if (Input.GetKey((KeyCode)306) && Input.GetKeyUp((KeyCode)323))
			{
				SpawnAtCursor();
			}
		}

		private void ToggleFreeCam()
		{
			if ((Object)(object)proxyTarget == (Object)null)
			{
				proxyTarget = ((Component)GameAPI.CamCtrl).gameObject.AddComponent<CameraTarget>();
				((Behaviour)proxyTarget).enabled = false;
			}
			if ((Object)(object)origTarget == (Object)null && (Object)(object)GameAPI.CamCtrl.camTarget != (Object)(object)proxyTarget)
			{
				origTarget = GameAPI.CamCtrl.camTarget;
			}
			GameAPI.CamCtrl.camTarget = (((Object)(object)GameAPI.CamCtrl.camTarget == (Object)(object)proxyTarget) ? origTarget : proxyTarget);
			if (!isFreeCamEnabled && (Object)(object)GameAPI.CamCtrl != (Object)null)
			{
				GameAPI.CamCtrl.PositionToHeroInstant(true);
			}
		}

		private void SpawnAtCursor()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: 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_0084: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)GameAPI.HeroCtrl == (Object)null)
			{
				return;
			}
			float num = Mathf.Abs(((Component)GameAPI.GameCamera).transform.position.z) - ((Component)GameAPI.HeroCtrl).transform.position.z;
			Vector3 val = GameAPI.GameCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, num));
			if (val != Vector3.zero)
			{
				((Component)GameAPI.HeroCtrl).gameObject.transform.position = new Vector3(val.x, val.y, ((Component)GameAPI.HeroCtrl).gameObject.transform.position.z);
				if (isFreeCamEnabled)
				{
					((Component)GameAPI.GameCamera).transform.position = new Vector3(val.x, val.y, ((Component)GameAPI.CamCtrl).transform.position.z);
				}
			}
		}

		private void ActiveSceneChanged(Scene from, Scene to)
		{
			if (base.Manager.MainContextValid() && !((Object)(object)GameAPI.CamCtrl == (Object)null) && (Object)(object)tk2dCam == (Object)null)
			{
				tk2dCam = ((Component)GameAPI.CamCtrl).gameObject.GetComponent<tk2dCamera>();
			}
		}
	}
	internal sealed class HPViewer : PluginComponent
	{
		private bool uiShowHP;

		private bool uiShowCocoon;

		private List<HealthManager> hmCache = new List<HealthManager>(20);

		private static FieldRef<HealthManager, int> initHp = AccessTools.FieldRefAccess<HealthManager, int>("initHp");

		public HPViewer(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
			base.Manager.ActiveSceneChanged += ActiveSceneChanged;
			base.Manager.OnHealthManagerEnable += OnHealthManagerEnable;
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
			base.Manager.ActiveSceneChanged -= ActiveSceneChanged;
			base.Manager.OnHealthManagerEnable -= OnHealthManagerEnable;
		}

		public sealed override void OnGUI()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Invalid comparison between Unknown and I4
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Invalid comparison between Unknown and I4
			if ((int)Event.current.type == 7 && (int)GameAPI.GameManager.GameState > 1 && !((Object)(object)GameAPI.GameCamera == (Object)null))
			{
				if (uiShowHP && hmCache.Count > 1)
				{
					DrawHP();
				}
				if (uiShowCocoon && HeroCorpseMarker._activeMarkers.Count > 0)
				{
					DrawCocoons();
				}
			}
		}

		public sealed override void Update()
		{
			if (!Input.GetKeyDown((KeyCode)290))
			{
				return;
			}
			if (Input.GetKey((KeyCode)303))
			{
				uiShowCocoon = !uiShowCocoon;
				return;
			}
			uiShowHP = !uiShowHP;
			if (uiShowHP)
			{
				FetchCache();
			}
		}

		private void ActiveSceneChanged(Scene from, Scene to)
		{
			FetchCache();
		}

		private void OnHealthManagerEnable(HealthManager hm)
		{
			if (uiShowHP && !hmCache.Contains(hm))
			{
				hmCache.Add(hm);
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void DrawHP()
		{
			//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_002a: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: 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)
			//IL_01c6: 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_00ed: 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_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: 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_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			int fontSize = GUI.skin.box.fontSize;
			FontStyle fontStyle = GUI.skin.box.fontStyle;
			TextAnchor alignment = GUI.skin.box.alignment;
			Color contentColor = GUI.contentColor;
			GUI.skin.box.fontSize = 24;
			GUI.skin.box.alignment = (TextAnchor)4;
			GUI.skin.label.fontStyle = (FontStyle)1;
			GUI.contentColor = Color.yellow;
			for (int i = 0; i < hmCache.Count; i++)
			{
				HealthManager val = hmCache[i];
				if ((Object)(object)val != (Object)null && ((Component)val).gameObject.activeSelf && ((Component)val).gameObject.activeInHierarchy)
				{
					string text = $"{val.hp}/{initHp.Invoke(val)}";
					Bounds bounds = ((Collider2D)val.boxCollider).bounds;
					int num = text.Length * 22;
					Vector3 val2 = GameAPI.GameCamera.WorldToScreenPoint(new Vector3(((Bounds)(ref bounds)).center.x, ((Bounds)(ref bounds)).center.y + ((Bounds)(ref bounds)).extents.y * 2f, ((Bounds)(ref bounds)).center.z));
					GUI.Box(new Rect(val2.x - (float)num * 0.5f, (float)Screen.height - val2.y, (float)(text.Length * 18), 30f), text);
				}
			}
			GUI.skin.box.fontSize = fontSize;
			GUI.skin.box.fontStyle = fontStyle;
			GUI.skin.box.alignment = alignment;
			GUI.contentColor = contentColor;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void DrawCocoons()
		{
			//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_002a: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: 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_009a: 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_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: 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)
			int fontSize = GUI.skin.box.fontSize;
			FontStyle fontStyle = GUI.skin.box.fontStyle;
			TextAnchor alignment = GUI.skin.box.alignment;
			Color contentColor = GUI.contentColor;
			GUI.skin.box.fontSize = 22;
			GUI.skin.box.alignment = (TextAnchor)3;
			GUI.skin.label.fontStyle = (FontStyle)1;
			GUI.contentColor = Color.white;
			for (int i = 0; i < HeroCorpseMarker._activeMarkers.Count; i++)
			{
				HeroCorpseMarker val = HeroCorpseMarker._activeMarkers[i];
				if ((Object)(object)val != (Object)null)
				{
					Vector3 val2 = GameAPI.GameCamera.WorldToScreenPoint(Vector2.op_Implicit(val.Position));
					GUI.Box(new Rect(val2.x, (float)Screen.height - val2.y, 100f, 30f), "Cocoon");
				}
			}
			GUI.skin.box.fontSize = fontSize;
			GUI.skin.box.fontStyle = fontStyle;
			GUI.skin.box.alignment = alignment;
			GUI.contentColor = contentColor;
		}

		private void FetchCache()
		{
			hmCache.Clear();
			hmCache.AddRange(Object.FindObjectsByType<HealthManager>((FindObjectsInactive)1, (FindObjectsSortMode)0));
		}
	}
	public abstract class PluginComponent : LocalComponent
	{
		protected SSDebugManager Manager { get; private set; }

		protected SharedCache GCache => Manager.SharedCache;

		protected GlobalConfig GConf => Manager.SharedConfig;

		protected PluginComponent(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base((ComponentManager)(object)manager, startEnabled, priority)
		{
			Manager = manager;
		}
	}
	internal sealed class SaveStates : PluginComponent
	{
		private const string EXT = ".sav";

		private static string saveDir = ReflectionHelper.GetAssemblyDir() + "\\SSDebugStates";

		private bool uiShowList;

		private bool uiShowInput;

		private Vector2 uiScroll;

		private string inputName = string.Empty;

		private List<string> stateList = new List<string>();

		private SState lastUsedSState;

		private GameObject respawnPoint;

		private static FieldRef<GameManager, float> sessionPlayTimer = AccessTools.FieldRefAccess<GameManager, float>("sessionPlayTimer");

		private static MethodInfo SetLoadedGameData = AccessTools.Method(typeof(GameManager), "SetLoadedGameData", new Type[2]
		{
			typeof(string),
			typeof(int)
		}, (Type[])null);

		private static MethodInfo PreparePlayerDataForSave = AccessTools.Method(typeof(GameManager), "PreparePlayerDataForSave", new Type[1] { typeof(int) }, (Type[])null);

		private static MethodInfo ResetSilkRegen = AccessTools.Method(typeof(HeroController), "ResetSilkRegen", (Type[])null, (Type[])null);

		public SaveStates(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
			base.Manager.OnHeroFinishedEnteringScene += OnHeroFinishedEnteringScene;
			SceneManager.sceneLoaded += SceneLoaded;
			UpdateList();
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
			base.Manager.OnHeroFinishedEnteringScene -= OnHeroFinishedEnteringScene;
			SceneManager.sceneLoaded -= SceneLoaded;
		}

		public sealed override void OnGUI()
		{
			//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_002a: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_0062: 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_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: 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_00dd: 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)
			int fontSize = GUI.skin.button.fontSize;
			FontStyle fontStyle = GUI.skin.button.fontStyle;
			TextAnchor alignment = GUI.skin.button.alignment;
			Color contentColor = GUI.contentColor;
			int fontSize2 = GUI.skin.textField.fontSize;
			FontStyle fontStyle2 = GUI.skin.textField.fontStyle;
			TextAnchor alignment2 = GUI.skin.textField.alignment;
			Color contentColor2 = GUI.contentColor;
			if (uiShowList)
			{
				DrawFileList();
			}
			else if (uiShowInput)
			{
				DrawInput();
			}
			GUI.skin.button.fontSize = fontSize;
			GUI.skin.button.fontStyle = fontStyle;
			GUI.skin.button.alignment = alignment;
			GUI.contentColor = contentColor;
			GUI.skin.textField.fontSize = fontSize2;
			GUI.skin.textField.fontStyle = fontStyle2;
			GUI.skin.textField.alignment = alignment2;
			GUI.contentColor = contentColor2;
		}

		public sealed override void Update()
		{
			if (Input.GetKeyDown((KeyCode)286))
			{
				if (Input.GetKey((KeyCode)306))
				{
					uiShowList = !uiShowList;
					uiShowInput = false;
				}
				else if (Input.GetKey((KeyCode)304))
				{
					uiShowInput = !uiShowInput;
					uiShowList = false;
				}
				else if (lastUsedSState != null)
				{
					uiShowList = (uiShowInput = false);
					ApplySaveState(lastUsedSState);
				}
				else
				{
					((LocalComponent)this).Logger.Warn((object)"No cached last savestate available");
				}
			}
		}

		private void SceneLoaded(Scene scene, LoadSceneMode mode)
		{
			//IL_00d6: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Expected O, but got Unknown
			//IL_00ad: Expected O, but got Unknown
			//IL_00ae: 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_00ba: Expected O, but got Unknown
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Expected O, but got Unknown
			((LocalComponent)this).Logger.Message((object)("SceneLoaded: " + ((Scene)(ref scene)).name));
			if (base.GCache.queuedLoadState && ((Scene)(ref scene)).name == lastUsedSState.scene)
			{
				if ((Object)(object)respawnPoint == (Object)null)
				{
					respawnPoint = new GameObject("SSDebugSStateRespawn", new Type[1] { typeof(RespawnMarker) })
					{
						hideFlags = (HideFlags)61
					};
					Object.DontDestroyOnLoad((Object)(object)respawnPoint);
					RespawnMarker component = respawnPoint.GetComponent<RespawnMarker>();
					OverrideFloat val = new OverrideFloat();
					((OverrideValue<float>)val).Value = 0f;
					component.customFadeDuration = val;
					OverrideMapZone val2 = new OverrideMapZone();
					((OverrideValue<MapZone>)val2).Value = (MapZone)0;
					component.overrideMapZone = val2;
					component.customWakeUp = true;
				}
				respawnPoint.transform.position = lastUsedSState.pos;
			}
		}

		private void OnHeroFinishedEnteringScene()
		{
			if (base.GCache.queuedLoadState)
			{
				((LocalComponent)this).Logger.Message((object)("Restoring hero from SState " + base.GCache.activeScene));
				GameManager.instance.playerData.tempRespawnMarker = string.Empty;
				GameManager.instance.playerData.tempRespawnScene = string.Empty;
				GameAPI.GameManager.playerData.tempRespawnType = -1;
				RestoreOtherHeroState(lastUsedSState);
				GameAPI.HeroCtrl.RegainControl();
				base.GCache.queuedLoadState = false;
			}
		}

		private void UpdateList()
		{
			stateList.Clear();
			if (!Directory.Exists(saveDir))
			{
				Directory.CreateDirectory(saveDir);
			}
			string[] files = Directory.GetFiles(saveDir, "*.sav");
			string[] array = files;
			foreach (string path in array)
			{
				stateList.Add(Path.GetFileNameWithoutExtension(path));
			}
			((LocalComponent)this).Logger.Message((object)$"Fetched {files.Length} savestates");
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void DrawInput()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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_00a6: 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)
			GUI.skin.button.fontSize = 22;
			GUI.skin.button.fontStyle = (FontStyle)1;
			GUI.skin.textField.fontSize = 22;
			GUI.skin.textField.fontStyle = (FontStyle)1;
			GUI.skin.textField.alignment = (TextAnchor)3;
			GUI.contentColor = Color.white;
			GUI.color = Color.white;
			inputName = GUI.TextField(new Rect(314f, 10f, 300f, 30f), inputName, 25);
			if (GUI.Button(new Rect(616f, 10f, 60f, 30f), "OK"))
			{
				if (!string.IsNullOrEmpty(inputName))
				{
					WriteSaveState(inputName, addToRuntimeList: true);
					uiShowInput = false;
				}
				else
				{
					inputName = "INVALID INPUT";
				}
			}
			if (GUI.Button(new Rect(678f, 10f, 60f, 30f), " X "))
			{
				uiShowInput = false;
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void DrawFileList()
		{
			//IL_0000: 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_0041: 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_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: 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_01b4: Unknown result type (might be due to invalid IL or missing references)
			GUI.contentColor = Color.white;
			GUI.color = Color.white;
			int count = stateList.Count;
			float num = 24f;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(314f, 10f, 300f, 600f);
			GUI.DrawTexture(val, (Texture)(object)base.GCache.boxBG, (ScaleMode)0, false, 1f, new Color(0f, 0f, 0f, 0.8f), 0f, 0f);
			if (count < 1)
			{
				int fontSize = GUI.skin.label.fontSize;
				GUI.skin.label.fontSize = 22;
				GUI.Label(new Rect(((Rect)(ref val)).x + 4f, ((Rect)(ref val)).y + 4f, 280f, 300f), "No states found!\nShift+F5 to add");
				GUI.skin.label.fontSize = fontSize;
				return;
			}
			GUI.skin.button.fontSize = (int)num - 4;
			uiScroll = GUI.BeginScrollView(new Rect(((Rect)(ref val)).x, ((Rect)(ref val)).y - 6f, ((Rect)(ref val)).width - 4f, ((Rect)(ref val)).height - 8f), uiScroll, new Rect(((Rect)(ref val)).x, ((Rect)(ref val)).y - 4f, ((Rect)(ref val)).width - 4f, (num - 4f) * (float)count), false, false, GUIStyle.none, GUI.skin.verticalScrollbar);
			for (int i = 0; i < stateList.Count; i++)
			{
				float num2 = ((Rect)(ref val)).y + (num + 2f) * (float)i;
				if (GUI.Button(new Rect(((Rect)(ref val)).x + 8f, num2, ((Rect)(ref val)).width - 8f, num), stateList[i]))
				{
					uiShowList = false;
					LoadStateByName(stateList[i]);
					break;
				}
			}
			GUI.EndScrollView(true);
		}

		private void RestoreOtherHeroState(SState state)
		{
			((LocalComponent)this).Logger.Message((object)"Restoring Hero State");
			PlayerData playerData = GameAPI.GameManager.playerData;
			HeroController heroCtrl = GameAPI.HeroCtrl;
			GameAPI.ForceEquipCrest(playerData.CurrentCrestID, playerData);
			if (state.ver >= 2)
			{
				heroCtrl.cState.facingRight = state.facingRight;
				if (state.silk != playerData.silkMax)
				{
					heroCtrl.RefreshSilk();
					playerData.silk = state.silk;
					GameCameras.instance.silkSpool.RefreshSilk((SilkAddSource)0, (SilkTakeSource)0);
					ResetSilkRegen.Invoke(heroCtrl, null);
				}
				if (state.health > 0 && state.health < playerData.maxHealth)
				{
					playerData.health = state.health;
				}
			}
			if (state.ver >= 3 && state.isMaggoted)
			{
				heroCtrl.SetIsMaggoted(true);
			}
			EventRegister.SendEvent(EventRegisterEvents.HealthUpdate, (GameObject)null);
		}

		private void WriteSaveState(string? name, bool addToRuntimeList)
		{
			SState sState = GenerateSState();
			name = name ?? sState.scene;
			string text = Path.Combine(saveDir, name + ".sav");
			string contents = SaveDataUtility.SerializeSaveData<SState>(sState);
			File.WriteAllText(text, contents);
			((LocalComponent)this).Logger.Message((object)("Writing savestate: " + text));
			UpdateList();
		}

		private void LoadStateByName(string name)
		{
			SState sState = LoadStateFromFile(name);
			if (sState == null || string.IsNullOrEmpty(sState.scene))
			{
				((LocalComponent)this).Logger.Error((object)"Loaded savestate is invalid");
			}
			else
			{
				ApplySaveState(sState);
			}
		}

		private SState? LoadStateFromFile(string name)
		{
			string text = Path.Combine(saveDir, name + ".sav");
			if (!File.Exists(text))
			{
				((LocalComponent)this).Logger.Error((object)("Unable to find/read: " + text));
				return null;
			}
			return SaveDataUtility.DeserializeSaveData<SState>(File.ReadAllText(text));
		}

		private SState GenerateSState()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_0097: 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)
			if (base.GCache.queuedLoadState)
			{
				((LocalComponent)this).Logger.Error((object)"Impossible state - we have savestate queued!");
			}
			GameManager gameManager = GameAPI.GameManager;
			gameManager.SaveLevelState();
			PreparePlayerDataForSave.Invoke(gameManager, new object[1] { gameManager.profileID });
			string data = SaveDataUtility.SerializeSaveData<SaveGameData>(new SaveGameData(gameManager.playerData, gameManager.sceneData));
			((LocalComponent)this).Logger.Message((object)("Save state generated: " + base.GCache.activeScene));
			return new SState
			{
				ver = 3,
				pos = ((Component)GameAPI.HeroCtrl).transform.position,
				scene = base.GCache.activeScene,
				data = data,
				health = GameAPI.HeroCtrl.playerData.health,
				silk = GameAPI.HeroCtrl.playerData.silk,
				facingRight = GameAPI.HeroCtrl.cState.facingRight
			};
		}

		private void ApplySaveState(SState state)
		{
			if (base.GCache.queuedLoadState)
			{
				((LocalComponent)this).Logger.Error((object)"Impossible state - we have savestate queued!");
			}
			lastUsedSState = state;
			SetLoadedGameData.Invoke(GameAPI.GameManager, new object[2]
			{
				state.data,
				GameAPI.GameManager.profileID
			});
			GameAPI.GameManager.ResetSemiPersistentItems();
			GameAPI.GameManager.RespawningHero = true;
			GameAPI.GameManager.playerData.tempRespawnMarker = "SSDebugSStateRespawn";
			GameAPI.GameManager.playerData.tempRespawnScene = state.scene;
			GameAPI.GameManager.playerData.tempRespawnType = 1;
			Extensions.AddIfNotPresent<string>(SceneTeleportMap.GetTeleportMap()[state.scene].RespawnPoints, "SSDebugSStateRespawn");
			base.GCache.queuedLoadState = true;
			GameAPI.GameManager.ReadyForRespawn(false);
			((LocalComponent)this).Logger.Message((object)("Loaded save state: " + base.GCache.activeScene));
		}
	}
	internal sealed class SceneSelector : PluginComponent
	{
		private bool tpInProgress;

		private string requestedGate;

		private string uiSelZone = string.Empty;

		private Vector2 uiScroll;

		private Vector2 uiScroll2;

		private Vector2 sceneScroll;

		private GlobalConfig.UIState uiState
		{
			get
			{
				return base.GConf.uiState;
			}
			set
			{
				base.GConf.uiState = value;
			}
		}

		private bool uiShowScenes => base.GConf.uiShowScenes;

		private bool uiShowFlag => base.GConf.uiShowFlag;

		public SceneSelector(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
			PopulateSceneList();
			base.Manager.OnHeroFinishedEnteringScene += HeroFinishedEnteringScene;
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
			base.Manager.OnHeroFinishedEnteringScene -= HeroFinishedEnteringScene;
		}

		private void ActiveSceneChanged(Scene from, Scene to)
		{
		}

		private void HeroFinishedEnteringScene()
		{
			//IL_00b4: 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_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_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Expected I4, but got Unknown
			//IL_00de: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: 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_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: 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_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: 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)
			if (!tpInProgress)
			{
				return;
			}
			tpInProgress = false;
			((LocalComponent)this).Logger.Message((object)("Restoring hero from Scene teleport " + base.GCache.activeScene));
			TransitionPoint val = TransitionPoint.TransitionPoints.Where(delegate(TransitionPoint x)
			{
				//IL_000f: 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)
				if ((Object)(object)x != (Object)null)
				{
					Scene scene2 = ((Component)x).gameObject.scene;
					if (((Scene)(ref scene2)).name == base.GCache.activeScene)
					{
						return ((Object)x).name.Equals(requestedGate, StringComparison.OrdinalIgnoreCase);
					}
				}
				return false;
			})?.FirstOrDefault();
			if ((Object)(object)val == (Object)null)
			{
				val = TransitionPoint.TransitionPoints.Where(delegate(TransitionPoint x)
				{
					//IL_000f: 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)
					if ((Object)(object)x != (Object)null)
					{
						Scene scene = ((Component)x).gameObject.scene;
						return ((Scene)(ref scene)).name == base.GCache.activeScene;
					}
					return false;
				})?.FirstOrDefault();
			}
			if ((Object)(object)val != (Object)null)
			{
				((LocalComponent)this).Logger.Message((object)("Found gate to work with " + ((Object)val).name + " (extected: " + requestedGate));
				GatePosition gatePosition = val.GetGatePosition();
				Vector3 val2 = ((Component)val).transform.position;
				switch ((int)gatePosition)
				{
				case 0:
					val2 += new Vector3(0f, -5f, 0f);
					break;
				case 1:
					val2 += new Vector3(-5f, 0f, 0f);
					break;
				case 2:
					val2 += new Vector3(5f, 0f, 0f);
					break;
				case 3:
					val2 += new Vector3(5f, 7f, 0f);
					break;
				}
				if (val2 != ((Component)val).transform.position)
				{
					((Component)GameAPI.HeroCtrl).transform.position = val2;
				}
			}
			GameAPI.CamCtrl.PositionToHeroInstant(true);
			GameAPI.ReEnableHeroInput();
			((Behaviour)GameAPI.HeroCtrl.heroBox).enabled = true;
		}

		public sealed override void OnGUI()
		{
			//IL_0044: 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_0054: 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_009a: 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_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: 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)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			if (!uiShowScenes || base.GCache.mapData.Count < 1 || base.GCache.zoneNames == null)
			{
				return;
			}
			int fontSize = GUI.skin.button.fontSize;
			FontStyle fontStyle = GUI.skin.button.fontStyle;
			TextAnchor alignment = GUI.skin.button.alignment;
			bool wordWrap = GUI.skin.button.wordWrap;
			GUI.skin.button.fontStyle = (FontStyle)1;
			GUI.skin.button.alignment = (TextAnchor)3;
			GUI.skin.button.wordWrap = false;
			Color color = GUI.color;
			int count = base.GCache.mapData.Count;
			float num = 24f;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(310f, 10f, 240f, num * (float)count + num);
			GUI.Box(val, string.Empty);
			for (int i = 0; i < base.GCache.zoneNames.Length; i++)
			{
				string text = base.GCache.zoneNames[i];
				GUI.color = ((text == uiSelZone) ? Color.yellow : Color.white);
				GUI.skin.button.fontSize = (int)num - 4;
				if (GUI.Button(new Rect(((Rect)(ref val)).x + 1f, num + num * (float)i, ((Rect)(ref val)).width - 10f, num), text))
				{
					uiSelZone = text;
				}
				GUI.color = Color.white;
			}
			if (uiSelZone != string.Empty && base.GCache.mapData.TryGetValue(uiSelZone, out MapEntry value))
			{
				GUI.skin.button.fontSize = 18;
				float num2 = (float)GUI.skin.button.fontSize + 6f;
				float num3 = num2 * (float)value.Scenes.Count;
				Rect val2 = default(Rect);
				((Rect)(ref val2))..ctor(((Rect)(ref val)).x + ((Rect)(ref val)).width + 2f, 10f, 240f, num3 + num2);
				GUI.Box(val2, string.Empty);
				for (int j = 0; j < value.Scenes.Count; j++)
				{
					string text2 = value.Scenes[j];
					if (GUI.Button(new Rect(((Rect)(ref val2)).x + 1f, num2 + num2 * (float)j, ((Rect)(ref val2)).width - 10f, num2), text2))
					{
						RequestSceneTeleport(text2);
					}
				}
			}
			GUI.skin.button.fontSize = fontSize;
			GUI.skin.button.fontStyle = fontStyle;
			GUI.skin.button.alignment = alignment;
			GUI.skin.button.wordWrap = wordWrap;
			GUI.color = color;
		}

		public sealed override void Update()
		{
			if (Input.GetKeyDown((KeyCode)283) && LegacyInputHelper.NoAnyModifiers)
			{
				uiState ^= GlobalConfig.UIState.SceneList;
				if (uiShowFlag && base.GCache.mapData.Count == 0)
				{
					PopulateSceneList();
				}
			}
		}

		private void RequestSceneTeleport(string scene)
		{
			string text = "";
			if (SceneTeleportMap.GetTeleportMap().TryGetValue(scene, out var value))
			{
				text = ((value.TransitionGates.Count > 0) ? value.TransitionGates[0] : "");
			}
			requestedGate = text;
			GameAPI.GameManager.ChangeToScene(scene, text, 0.5f);
			tpInProgress = true;
		}

		private void PopulateSceneList()
		{
			Dictionary<string, SceneInfo> teleportMap = SceneTeleportMap.GetTeleportMap();
			if (teleportMap == null || teleportMap.Count < 1 || base.GCache.mapData.Count > 0)
			{
				return;
			}
			Dictionary<string, MapEntry> dictionary = new Dictionary<string, MapEntry>();
			foreach (KeyValuePair<string, SceneInfo> item in teleportMap)
			{
				string key = item.Key;
				string text = ((object)(MapZone)(ref item.Value.MapZone)).ToString();
				if (dictionary.TryGetValue(text, out var value))
				{
					value.Scenes.Add(key);
					continue;
				}
				dictionary[text] = new MapEntry
				{
					ZoneName = text,
					Scenes = new List<string> { key }
				};
			}
			base.GCache.mapData = dictionary;
			base.GCache.zoneNames = dictionary.Keys.OrderBy((string x) => x).ToArray();
		}
	}
	internal struct SceneHeroState
	{
		public Vector3 pos;

		public string sceneName;

		public SceneHeroState(string name, Vector3 pos)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			this.pos = pos;
			sceneName = name;
		}
	}
	internal sealed class SpeedrunTools : PluginComponent
	{
		private float forcedTS = 1f;

		private Dictionary<string, Vector3> savedSceneTPs = new Dictionary<string, Vector3>();

		private static FieldRef<GameManager, float> sessionPlayTimer = AccessTools.FieldRefAccess<GameManager, float>("sessionPlayTimer");

		public SpeedrunTools(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
		}

		public override void Update()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Invalid comparison between Unknown and I4
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Invalid comparison between Unknown and I4
			if ((int)GameAPI.GameManager.GameState > 1 && (int)GameAPI.GameManager.GameState != 5)
			{
				ProcessInput();
			}
			TickLogic();
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void ProcessInput()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown((KeyCode)284))
			{
				if (Input.GetKey((KeyCode)304))
				{
					CheatManager.Invincibility = (InvincibilityStates)(((int)CheatManager.Invincibility == 0) ? 2 : 0);
				}
				else if (Input.GetKey((KeyCode)306))
				{
					base.GConf.PlayerAutoSilk = !base.GConf.PlayerAutoSilk;
				}
				else
				{
					base.GConf.PlayerAutoHeal = !base.GConf.PlayerAutoHeal;
				}
			}
			if (Input.GetKeyDown((KeyCode)285))
			{
				if (Input.GetKey((KeyCode)304))
				{
					GameAPI.HeroCtrl.AddShards(400);
				}
				else
				{
					GameAPI.HeroCtrl.AddGeo(500);
				}
			}
			if (Input.GetKeyDown((KeyCode)287))
			{
				((Renderer)GameAPI.HeroCtrl.vignette).enabled = !((Renderer)GameAPI.HeroCtrl.vignette).enabled;
				Transform val = ((Component)GameAPI.HeroCtrl).transform.Find("Vignette");
				if ((Object)(object)val != (Object)null)
				{
					((Component)val).gameObject.SetActive(!((Component)val).gameObject.activeSelf);
				}
			}
			if (Input.GetKeyDown((KeyCode)288))
			{
				if (Input.GetKey((KeyCode)306))
				{
					savedSceneTPs[base.GCache.activeScene] = ((Component)GameAPI.HeroCtrl).transform.position;
				}
				else if (savedSceneTPs.ContainsKey(base.GCache.activeScene))
				{
					((Component)GameAPI.HeroCtrl).transform.position = savedSceneTPs[base.GCache.activeScene];
				}
			}
			if (Input.GetKeyDown((KeyCode)45))
			{
				forcedTS = Mathf.Clamp01(Time.timeScale - 0.15f);
			}
			else if (Input.GetKeyDown((KeyCode)61))
			{
				forcedTS = Mathf.Clamp(Time.timeScale + 0.15f, 0f, 4f);
			}
			else if (Input.GetKeyDown((KeyCode)48))
			{
				Time.timeScale = (forcedTS = 1f);
			}
			if (Input.GetKeyDown((KeyCode)305) && !base.GCache.advanceFrameBusy)
			{
				Time.timeScale = 0f;
				((MonoBehaviour)base.Manager).StartCoroutine(base.Manager.CoRoutineAdvanceFrame());
			}
			if (Input.GetKeyDown((KeyCode)303))
			{
				Time.timeScale = base.GConf.SpeedupFactor?.Value ?? 2f;
			}
			else if (Input.GetKeyUp((KeyCode)303))
			{
				Time.timeScale = 1f;
			}
			if (Input.GetKeyDown((KeyCode)293))
			{
				GameAPI.ReEnableHeroInput();
				GameAPI.HeroCtrl.RegainControl(true);
				GameAPI.CamCtrl.PositionToHeroInstant(true);
			}
			if (Input.GetKeyDown((KeyCode)278))
			{
				ResetPlayerSceneBossData();
			}
			if (Input.GetKeyDown((KeyCode)281))
			{
				GameAPI.GameManager.SaveLevelState();
				File.WriteAllText("playerdata.json", SaveDataUtility.SerializeSaveData<PlayerData>(PlayerData.instance));
				File.WriteAllText("scenedata.json", SaveDataUtility.SerializeSaveData<SceneData>(GameAPI.GameManager.sceneData));
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void TickLogic()
		{
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Invalid comparison between Unknown and I4
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Invalid comparison between Unknown and I4
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Invalid comparison between Unknown and I4
			if (base.GConf.PlayerAutoSilk && GameAPI.HeroCtrl.playerData.silk != GameAPI.HeroCtrl.playerData.CurrentSilkMax)
			{
				GameAPI.HeroCtrl.RefillSilkToMaxSilent();
			}
			if (base.GConf.PlayerAutoHeal && GameAPI.HeroCtrl.playerData.health != GameAPI.HeroCtrl.playerData.CurrentMaxHealth)
			{
				GameAPI.HeroCtrl.RefillHealthToMax();
			}
			if (forcedTS != 1f && (int)GameAPI.GameManager.GameState != 5 && (int)GameAPI.GameManager.GameState != 1 && (int)GameAPI.GameManager.GameState != 8)
			{
				Time.timeScale = forcedTS;
			}
		}

		private void ResetPlayerSceneBossData()
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			if (PlayerData.instance != null)
			{
				FieldInfo[] fields = typeof(PlayerData).GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				foreach (FieldInfo fieldInfo in fields)
				{
					if (fieldInfo.Name.Contains("defeated", StringComparison.OrdinalIgnoreCase) && fieldInfo.FieldType == typeof(bool))
					{
						fieldInfo.SetValue(PlayerData.instance, false);
					}
				}
			}
			if (GameAPI.GameManager.sceneData != null)
			{
				GameAPI.GameManager.sceneData.persistentBools = new PersistentBoolCollection();
			}
			((LocalComponent)this).Logger.Message((object)"Player and scene data reset");
		}
	}
	internal sealed class SWCursor : PluginComponent
	{
		public SWCursor(SSDebugManager manager, bool startEnabled, int priority = 0)
			: base(manager, startEnabled, priority)
		{
		}

		public override void OnComponentEnable()
		{
			((LocalComponent)this).OnComponentEnable();
		}

		public override void OnComponentDisable()
		{
			((LocalComponent)this).OnComponentDisable();
		}

		public sealed override void OnGUI()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Invalid comparison between Unknown and I4
			if ((int)Event.current.type == 7 && base.GConf.ShowCursor)
			{
				DrawCursor();
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private void DrawCursor()
		{
			//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_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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: 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_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			int fontSize = GUI.skin.label.fontSize;
			FontStyle fontStyle = GUI.skin.label.fontStyle;
			Color contentColor = GUI.contentColor;
			TextAnchor alignment = GUI.skin.label.alignment;
			GUI.skin.label.fontSize = 24;
			GUI.skin.label.alignment = (TextAnchor)0;
			GUI.skin.label.fontStyle = (FontStyle)1;
			GUI.contentColor = Color.yellow;
			GUI.Label(new Rect(Input.mousePosition.x - 11f, (float)Screen.height - Input.mousePosition.y - 12f, 25f, 25f), "+");
			GUI.skin.label.fontSize = fontSize;
			GUI.skin.label.fontStyle = fontStyle;
			GUI.contentColor = contentColor;
			GUI.skin.label.alignment = alignment;
		}
	}
}