Decompiled source of FSMSeer v1.1.2

FSMSeer/FSMSeer.dll

Decompiled 4 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("FSMSeer")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.1.2.0")]
[assembly: AssemblyInformationalVersion("1.1.2")]
[assembly: AssemblyProduct("FSMSeer")]
[assembly: AssemblyTitle("FSMSeer")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[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;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace FSMSeer
{
	[BepInPlugin("me.cometcake575.fsmseer", "FSMSeer", "1.1.2")]
	public class FSMSeerPlugin : BaseUnityPlugin
	{
		private class FSMSeen : MonoBehaviour
		{
			public int scanned;
		}

		private class FSMSeer : MonoBehaviour
		{
			public PlayMakerFSM? fsm;

			public int offset;

			private Text? _text;

			private void Start()
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				Label label = MakeLabel(((Component)this).gameObject, _canvasObj, Vector2.zero, Centre, Centre);
				_text = label.textComponent;
				((Graphic)_text).raycastTarget = false;
			}

			private void Update()
			{
				//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_0083: Unknown result type (might be due to invalid IL or missing references)
				//IL_0088: Unknown result type (might be due to invalid IL or missing references)
				if (!Object.op_Implicit((Object)(object)fsm))
				{
					Object.Destroy((Object)(object)((Component)this).gameObject);
				}
				else if (Object.op_Implicit((Object)(object)GameCameras.instance) && Object.op_Implicit((Object)(object)GameCameras.instance.mainCamera))
				{
					((Component)this).transform.position = GameCameras.instance.mainCamera.WorldToScreenPoint(((Component)fsm).transform.position) + new Vector3(0f, (float)(offset * 50));
					if (!((Behaviour)fsm).enabled || fsm.ActiveStateName == "" || !_show)
					{
						_text.text = "";
					}
					else
					{
						_text.text = fsm.FsmName + " – " + fsm.ActiveStateName;
					}
				}
			}
		}

		public class Label : MonoBehaviour
		{
			public string font = "Perpetua";

			public Text? textComponent;

			private void Start()
			{
				textComponent.font = GetFont(font);
			}
		}

		private static bool _show;

		private static GameObject? _canvasObj;

		private static readonly Vector2 Centre = new Vector2(0.5f, 0.5f);

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

		public const string Id = "me.cometcake575.fsmseer";

		public static string Name => "FSMSeer";

		public static string Version => "1.1.2";

		private void Awake()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin " + Name + " (me.cometcake575.fsmseer) has loaded!"));
			new Hook((MethodBase)typeof(PlayMakerFSM).GetMethod("Start", BindingFlags.Instance | BindingFlags.NonPublic), (Delegate)new Action<Action<PlayMakerFSM>, PlayMakerFSM>(StartDebug));
			Settings.Init(((BaseUnityPlugin)this).Config);
		}

		private void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown(Settings.ToggleKey.Value))
			{
				_show = !_show;
			}
		}

		private static void StartDebug(Action<PlayMakerFSM> orig, PlayMakerFSM self)
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			orig(self);
			SetupCanvas();
			FSMSeen fSMSeen = ((Component)self).GetComponentInParent<FSMSeen>();
			if (!Object.op_Implicit((Object)(object)fSMSeen))
			{
				fSMSeen = ((Component)self).GetComponentInChildren<FSMSeen>();
			}
			if (!Object.op_Implicit((Object)(object)fSMSeen))
			{
				fSMSeen = ((Component)self).gameObject.AddComponent<FSMSeen>();
			}
			fSMSeen.scanned++;
			GameObject val = new GameObject("[FSMSeer] " + self.FsmName + " Debug");
			val.transform.parent = _canvasObj.transform;
			FSMSeer fSMSeer = val.AddComponent<FSMSeer>();
			fSMSeer.fsm = self;
			fSMSeer.offset = fSMSeen.scanned;
		}

		private static void SetupCanvas()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)_canvasObj))
			{
				_canvasObj = new GameObject("[FSMSeer] FSM Visualiser Canvas");
				Object.DontDestroyOnLoad((Object)(object)_canvasObj);
				_canvasObj.AddComponent<Canvas>().renderMode = (RenderMode)0;
				_canvasObj.AddComponent<CanvasScaler>().uiScaleMode = (ScaleMode)1;
				_canvasObj.AddComponent<GraphicRaycaster>();
			}
		}

		public static Label MakeLabel(GameObject gameObject, GameObject parent, Vector2 pos, Vector2 anchorMin, Vector2 anchorMax)
		{
			//IL_0049: 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_0072: 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)
			RectTransform val = gameObject.AddComponent<RectTransform>();
			Label label = gameObject.AddComponent<Label>();
			label.textComponent = gameObject.AddComponent<Text>();
			label.textComponent.supportRichText = false;
			label.textComponent.horizontalOverflow = (HorizontalWrapMode)1;
			label.textComponent.fontSize = 10;
			((Component)label).transform.localScale = Vector3.one;
			((Transform)val).SetParent(parent.transform, false);
			((Transform)val).SetAsFirstSibling();
			val.anchorMin = anchorMin;
			val.anchorMax = anchorMax;
			val.anchoredPosition = pos;
			return label;
		}

		public static Font GetFont(string fontName)
		{
			if (Fonts.TryGetValue(fontName, out Font value))
			{
				return value;
			}
			Font[] array = Resources.FindObjectsOfTypeAll<Font>();
			foreach (Font val in array)
			{
				if (((Object)val).name == fontName)
				{
					Fonts[fontName] = val;
					return val;
				}
			}
			return Fonts.GetValueOrDefault(fontName);
		}
	}
	public static class Settings
	{
		public static ConfigEntry<KeyCode>? ToggleKey;

		public static void Init(ConfigFile config)
		{
			ToggleKey = config.Bind<KeyCode>("States", "ToggleKey", (KeyCode)284, "The keybind used to toggle the FSM info.");
		}
	}
}