Decompiled source of StatesPlugin v3.5.0

StatesPlugin.dll

Decompiled a year ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using Bounce.ManagedCollections;
using Bounce.Singletons;
using HarmonyLib;
using Newtonsoft.Json;
using RadialUI;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
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: AssemblyTitle("StatesPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StatesPlugin")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("StatesPlugin")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("3.5.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("3.5.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.states", "States Plug-In", "3.5.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class StatesPlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(CreatureManager), "DeleteCreature")]
	public static class PatchDeleteCreature
	{
		public static bool Prefix(CreatureGuid creatureId, UniqueCreatureGuid uniqueId, bool deleteUniqueFromBackend)
		{
			GameObject val = GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref creatureId)).ToString() + ".StatesBlock");
			if ((Object)(object)val != (Object)null)
			{
				Debug.Log((object)("States Plugin: DeleteCreature Patch: Destroying 'Effect:" + ((object)(CreatureGuid)(ref creatureId)).ToString() + ".StatesBlock'"));
				Object.Destroy((Object)(object)val);
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(CreatureManager), "DeleteCreatures")]
	public static class PatchDeleteCreatures
	{
		public static bool Prefix(CreatureGuid[] creatureIds, BList<UniqueCreatureGuid> uniqueIds, bool deleteUniqueFromBackend)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < creatureIds.Length; i++)
			{
				CreatureGuid val = creatureIds[i];
				GameObject val2 = GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref val)).ToString() + ".StatesBlock");
				if ((Object)(object)val2 != (Object)null)
				{
					Debug.Log((object)("States Plugin: DeleteCreature Patch: Destroying 'Effect:" + ((object)(CreatureGuid)(ref val)).ToString() + ".StatesBlock'"));
					Object.Destroy((Object)(object)val2);
				}
			}
			return true;
		}
	}

	public enum OffsetMethod
	{
		fixedOffset,
		baseScaleFixedOffet,
		headHookMultiplierOffset,
		boundsOffset
	}

	public const string Name = "States Plug-In";

	public const string Guid = "org.lordashes.plugins.states";

	public const string Version = "3.5.0.0";

	private Queue<Change> backlogChangeQueue = new Queue<Change>();

	private Dictionary<string, string> colorizations = new Dictionary<string, string>();

	private float baseSize = 16f;

	private OffsetMethod offsetMethod = OffsetMethod.boundsOffset;

	private float offsetValue = 1f;

	private ConfigEntry<KeyboardShortcut> triggerKey { get; set; }

	private ConfigEntry<Color> baseColor { get; set; }

	private void Awake()
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		Debug.Log((object)"States Plugin: Active.");
		new Harmony("org.lordashes.plugins.states").PatchAll();
		triggerKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "States Activation", new KeyboardShortcut((KeyCode)115, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), (ConfigDescription)null);
		baseColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Appearance", "Base Text Color", Color.black, (ConfigDescription)null);
		baseSize = ((BaseUnityPlugin)this).Config.Bind<float>("Appearance", "Base Text Size", 2f, (ConfigDescription)null).Value;
		offsetMethod = ((BaseUnityPlugin)this).Config.Bind<OffsetMethod>("Settings", "Height Offset Method", OffsetMethod.boundsOffset, (ConfigDescription)null).Value;
		offsetValue = ((BaseUnityPlugin)this).Config.Bind<float>("Settings", "Height Offset Value", 1f, (ConfigDescription)null).Value;
		if (File.Exists("ColorizedKeywords.json"))
		{
			string text = File.ReadAllText(File.Find("ColorizedKeywords.json", (CacheType)999)[0], (CacheType)999);
			colorizations = JsonConvert.DeserializeObject<Dictionary<string, string>>(text);
		}
		RadialSubmenu.EnsureMainMenuItem("org.hollofox.plugins.RadialUIPlugin.Info", (MenuType)1, "Info", Image.LoadSprite("Info.png", (CacheType)999));
		RadialSubmenu.CreateSubMenuItem("org.hollofox.plugins.RadialUIPlugin.Info", "States", Image.LoadSprite("States.png", (CacheType)999), (Action<CreatureGuid, string, MapMenuItem>)delegate(CreatureGuid cid, string menu, MapMenuItem mmi)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			SetRequest(cid);
		}, false, (Func<bool>)null);
		StatMessaging.Subscribe("org.lordashes.plugins.states", (Action<Change[]>)HandleRequest);
		Utility.Initialize(((object)this).GetType());
	}

	private void Update()
	{
		//IL_001c: 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_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_002f: 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_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: 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_0100: 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_0123: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: 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_0159: 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_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0203: Unknown result type (might be due to invalid IL or missing references)
		//IL_021f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Unknown result type (might be due to invalid IL or missing references)
		if (!isBoardLoaded())
		{
			return;
		}
		syncStealthMode();
		KeyboardShortcut value = triggerKey.Value;
		if (((KeyboardShortcut)(ref value)).IsUp())
		{
			SetRequest(LocalClient.SelectedCreatureId);
		}
		CreatureGuid val;
		foreach (CreatureBoardAsset item in (IEnumerable<CreatureBoardAsset>)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets())
		{
			try
			{
				val = item.CreatureId;
				GameObject val2 = GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref val)).ToString() + ".StatesBlock");
				if ((Object)(object)val2 != (Object)null)
				{
					val2.transform.rotation = Quaternion.LookRotation(val2.transform.position - ((Component)Camera.main).transform.position);
					TextMeshPro val3 = val2.GetComponent<TextMeshPro>();
					if ((Object)(object)val3 == (Object)null)
					{
						val3 = val2.AddComponent<TextMeshPro>();
					}
					val3.transform.rotation = val2.transform.rotation;
					val3.transform.position = new Vector3(Utility.GetBaseLoader(item.CreatureId).transform.position.x, calculateYPos(item) + ((TMP_Text)val3).preferredHeight, Utility.GetBaseLoader(item.CreatureId).transform.position.z);
				}
			}
			catch (Exception)
			{
			}
		}
		CreatureBoardAsset val5 = default(CreatureBoardAsset);
		while (backlogChangeQueue.Count > 0)
		{
			Change val4 = backlogChangeQueue.Peek();
			CreaturePresenter.TryGetAsset(val4.cid, ref val5);
			if ((Object)(object)val5 != (Object)null)
			{
				if ((Object)(object)Utility.GetAssetLoader(val5.CreatureId) == (Object)null)
				{
					break;
				}
				backlogChangeQueue.Dequeue();
				TextMeshPro creatureStateText = null;
				GameObject creatureBlock = null;
				string[] obj = new string[10] { "States Plugin: Processing Queued Request = Creature ID: ", null, null, null, null, null, null, null, null, null };
				val = val4.cid;
				obj[1] = ((object)(CreatureGuid)(ref val)).ToString();
				obj[2] = ", Action: ";
				ChangeType action = val4.action;
				obj[3] = ((object)(ChangeType)(ref action)).ToString();
				obj[4] = ", Key: ";
				obj[5] = val4.key;
				obj[6] = ", Previous Value: ";
				obj[7] = val4.previous;
				obj[8] = ", New Value: ";
				obj[9] = val4.value;
				Debug.Log((object)string.Concat(obj));
				createNewCreatureStateText(out creatureStateText, out creatureBlock, val5);
				populateCreatureStateText(creatureStateText, val4, val5);
			}
		}
	}

	public void HandleRequest(Change[] changes)
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: 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_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_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Invalid comparison between Unknown and I4
		//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_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Invalid comparison between Unknown and I4
		//IL_014b: 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_0176: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		CreatureBoardAsset val3 = default(CreatureBoardAsset);
		foreach (Change val in changes)
		{
			CreatureGuid val2;
			if (val == null)
			{
				Debug.Log((object)"States Plugin: ERROR: StatMessaging change was NULL;");
			}
			else
			{
				string[] obj = new string[10] { "States Plugin: Handle Request, Creature ID: ", null, null, null, null, null, null, null, null, null };
				val2 = val.cid;
				obj[1] = ((object)(CreatureGuid)(ref val2)).ToString();
				obj[2] = ", Action: ";
				ChangeType action = val.action;
				obj[3] = ((object)(ChangeType)(ref action)).ToString();
				obj[4] = ", Key: ";
				obj[5] = val.key;
				obj[6] = ", Previous Value: ";
				obj[7] = val.previous;
				obj[8] = ", New Value: ";
				obj[9] = val.value;
				Debug.Log((object)string.Concat(obj));
			}
			if (!(val.key == "org.lordashes.plugins.states"))
			{
				continue;
			}
			try
			{
				CreaturePresenter.TryGetAsset(val.cid, ref val3);
				if ((Object)(object)val3 != (Object)null)
				{
					ChangeType action2 = val.action;
					ChangeType val4 = action2;
					if (val4 - 1 > 1)
					{
						if ((int)val4 == 3)
						{
							val2 = val.cid;
							Debug.Log((object)("States Plugin: Removing States Block for creature '" + ((object)(CreatureGuid)(ref val2)).ToString() + "'"));
							val2 = val3.CreatureId;
							Object.Destroy((Object)(object)GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref val2)).ToString() + ".StatesBlock"));
						}
					}
					else
					{
						val2 = val.cid;
						Debug.Log((object)("States Plugin: Updating States Block for creature '" + ((object)(CreatureGuid)(ref val2)).ToString() + "'"));
						backlogChangeQueue.Enqueue(val);
					}
				}
				else
				{
					val2 = val.cid;
					Debug.Log((object)("States Plugin: Received States update for invalid asset (" + ((object)(CreatureGuid)(ref val2)).ToString() + ")"));
				}
			}
			catch (Exception ex)
			{
				Debug.Log((object)("Exception: " + ex));
			}
		}
	}

	private void createNewCreatureStateText(out TextMeshPro creatureStateText, out GameObject creatureBlock, CreatureBoardAsset asset)
	{
		//IL_0007: 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_008a: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Expected O, but got Unknown
		//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_00c8: 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_010c: 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_0123: 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_0137: 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_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
		CreatureGuid creatureId = asset.CreatureId;
		if ((Object)(object)GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref creatureId)).ToString() + ".StatesBlock") != (Object)null)
		{
			Debug.Log((object)"States Plugin: StatesText already exists.");
			creatureId = asset.CreatureId;
			creatureBlock = GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref creatureId)).ToString() + ".StatesBlock");
			creatureStateText = creatureBlock.GetComponentInChildren<TextMeshPro>();
			return;
		}
		Debug.Log((object)"States Plugin: Creating CreatureBlock GameObject");
		creatureId = asset.CreatureId;
		creatureBlock = new GameObject("Effect:" + ((object)(CreatureGuid)(ref creatureId)).ToString() + ".StatesBlock");
		Debug.Log((object)"States Plugin: Checking Source");
		if ((Object)(object)asset != (Object)null)
		{
			if ((Object)(object)Utility.GetBaseLoader(asset.CreatureId) != (Object)null)
			{
				if ((Object)(object)Utility.GetBaseLoader(asset.CreatureId).transform != (Object)null)
				{
					Debug.Log((object)"States Plugin: Creating Creature Block");
					Vector3 position = Utility.GetBaseLoader(asset.CreatureId).transform.position;
					Vector3 eulerAngles = Utility.GetBaseLoader(asset.CreatureId).transform.eulerAngles;
					if ((Object)(object)creatureBlock != (Object)null)
					{
						Debug.Log((object)"States Plugin: Applying Creature Block Position And Rotation");
						creatureBlock.transform.position = Vector3.zero;
						creatureBlock.transform.eulerAngles = Vector3.zero;
						Debug.Log((object)"States Plugin: Creating StatesText (TextMeshPro)");
						creatureStateText = creatureBlock.AddComponent<TextMeshPro>();
						Debug.Log((object)"States Plugin: Applying StatesText (TextMeshPro) Properties");
						creatureStateText.transform.position = Vector3.zero;
						creatureStateText.transform.eulerAngles = Vector3.zero;
						((TMP_Text)creatureStateText).textStyle = TMP_Style.NormalStyle;
						((TMP_Text)creatureStateText).enableWordWrapping = true;
						((TMP_Text)creatureStateText).alignment = (TextAlignmentOptions)514;
						((TMP_Text)creatureStateText).autoSizeTextContainer = true;
						((Graphic)creatureStateText).color = baseColor.Value;
						((TMP_Text)creatureStateText).fontSize = 1f;
						((TMP_Text)creatureStateText).fontWeight = (FontWeight)700;
						((TMP_Text)creatureStateText).isTextObjectScaleStatic = true;
					}
					else
					{
						Debug.Log((object)"States Plugin: Newly Create CreatureBlock Is Null");
						creatureStateText = null;
					}
				}
				else
				{
					Debug.Log((object)"States Plugin: Invalid Transform Provided");
					creatureStateText = null;
				}
			}
			else
			{
				Debug.Log((object)"States Plugin: Invalid Creature Root Provided");
				creatureStateText = null;
			}
		}
		else
		{
			Debug.Log((object)"States Plugin: Invalid Asset Provided");
			creatureStateText = null;
		}
	}

	private void populateCreatureStateText(TextMeshPro creatureStateText, Change change, CreatureBoardAsset asset)
	{
		//IL_00de: 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_0107: 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_0120: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)creatureStateText == (Object)null)
		{
			return;
		}
		Debug.Log((object)"States Plugin: Populating StatesText (TextMeshPro)");
		((TMP_Text)creatureStateText).autoSizeTextContainer = false;
		string text = change.value.Replace(",", "\r\n");
		if (colorizations.ContainsKey("<Default>"))
		{
			text = "<Default>" + text;
		}
		((TMP_Text)creatureStateText).richText = true;
		((TMP_Text)creatureStateText).fontSize = baseSize;
		((TMP_Text)creatureStateText).alignment = (TextAlignmentOptions)1026;
		foreach (KeyValuePair<string, string> colorization in colorizations)
		{
			text = text.Replace(colorization.Key, colorization.Value);
		}
		((TMP_Text)creatureStateText).text = text;
		((TMP_Text)creatureStateText).autoSizeTextContainer = true;
		creatureStateText.transform.position = new Vector3(Utility.GetBaseLoader(asset.CreatureId).transform.position.x, calculateYPos(asset) + ((TMP_Text)creatureStateText).preferredHeight, Utility.GetBaseLoader(asset.CreatureId).transform.position.z);
	}

	private float calculateYPos(CreatureBoardAsset asset, bool diagnostic = false)
	{
		//IL_0069: 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_03a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ad: 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_00c3: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: 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_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: 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_0160: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_0412: Unknown result type (might be due to invalid IL or missing references)
		//IL_0417: Unknown result type (might be due to invalid IL or missing references)
		//IL_0420: Unknown result type (might be due to invalid IL or missing references)
		//IL_0433: 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_01d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0484: Unknown result type (might be due to invalid IL or missing references)
		//IL_0489: Unknown result type (might be due to invalid IL or missing references)
		//IL_048d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0492: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_04bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: 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_0237: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: 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_025c: 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_0265: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_032a: Unknown result type (might be due to invalid IL or missing references)
		//IL_032f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0333: Unknown result type (might be due to invalid IL or missing references)
		//IL_0338: Unknown result type (might be due to invalid IL or missing references)
		//IL_0353: Unknown result type (might be due to invalid IL or missing references)
		//IL_0358: Unknown result type (might be due to invalid IL or missing references)
		//IL_035c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0361: Unknown result type (might be due to invalid IL or missing references)
		float val = 1000f;
		float num = 0f;
		try
		{
			switch (offsetMethod)
			{
			case OffsetMethod.fixedOffset:
				val = 0f;
				num = 1f;
				break;
			case OffsetMethod.baseScaleFixedOffet:
				val = 0f;
				num = 1f * ((MovableBoardAsset)asset).Scale;
				break;
			case OffsetMethod.headHookMultiplierOffset:
				val = 0f;
				num = asset.HookHead.position.y;
				break;
			case OffsetMethod.boundsOffset:
			{
				Bounds bounds2;
				if ((Object)(object)Utility.GetAssetLoader(asset.CreatureId).GetComponentInChildren<MeshFilter>() != (Object)null)
				{
					MeshFilter[] componentsInChildren = Utility.GetAssetLoader(asset.CreatureId).GetComponentsInChildren<MeshFilter>();
					foreach (MeshFilter val2 in componentsInChildren)
					{
						Bounds bounds = val2.mesh.bounds;
						bool flag = true;
						val = Math.Min(val, ((Bounds)(ref bounds)).min.y);
						num = Math.Max(num, ((Bounds)(ref bounds)).max.y);
						if (diagnostic)
						{
							string[] obj = new string[8]
							{
								"Mesh ",
								((Object)val2.mesh).name,
								": Bounds ",
								null,
								null,
								null,
								null,
								null
							};
							bounds2 = val2.mesh.bounds;
							obj[3] = ((Bounds)(ref bounds2)).min.y.ToString();
							obj[4] = "->";
							bounds2 = val2.mesh.bounds;
							obj[5] = ((Bounds)(ref bounds2)).max.y.ToString();
							obj[6] = " | Max: ";
							obj[7] = num.ToString();
							Debug.Log((object)string.Concat(obj));
						}
					}
					MeshRenderer[] componentsInChildren2 = Utility.GetAssetLoader(asset.CreatureId).GetComponentsInChildren<MeshRenderer>();
					foreach (MeshRenderer val3 in componentsInChildren2)
					{
						Bounds bounds3 = ((Renderer)val3).bounds;
						bool flag2 = true;
						val = Math.Min(val, ((Bounds)(ref bounds3)).min.y);
						num = Math.Max(num, ((Bounds)(ref bounds3)).max.y);
						if (diagnostic)
						{
							string[] obj2 = new string[8]
							{
								"Mesh ",
								((Object)val3).name,
								": Bounds ",
								null,
								null,
								null,
								null,
								null
							};
							bounds2 = ((Renderer)val3).bounds;
							obj2[3] = ((Bounds)(ref bounds2)).min.y.ToString();
							obj2[4] = "->";
							bounds2 = ((Renderer)val3).bounds;
							obj2[5] = ((Bounds)(ref bounds2)).max.y.ToString();
							obj2[6] = " | Max: ";
							obj2[7] = num.ToString();
							Debug.Log((object)string.Concat(obj2));
						}
					}
					SkinnedMeshRenderer[] componentsInChildren3 = Utility.GetAssetLoader(asset.CreatureId).GetComponentsInChildren<SkinnedMeshRenderer>();
					foreach (SkinnedMeshRenderer val4 in componentsInChildren3)
					{
						Bounds bounds4 = ((Renderer)val4).bounds;
						bool flag3 = true;
						val = Math.Min(val, ((Bounds)(ref bounds4)).min.y);
						num = Math.Max(num, ((Bounds)(ref bounds4)).max.y);
						if (diagnostic)
						{
							string[] obj3 = new string[8]
							{
								"Mesh ",
								((Object)val4).name,
								": Bounds ",
								null,
								null,
								null,
								null,
								null
							};
							bounds2 = ((Renderer)val4).bounds;
							obj3[3] = ((Bounds)(ref bounds2)).min.y.ToString();
							obj3[4] = "->";
							bounds2 = ((Renderer)val4).bounds;
							obj3[5] = ((Bounds)(ref bounds2)).max.y.ToString();
							obj3[6] = " | Max: ";
							obj3[7] = num.ToString();
							Debug.Log((object)string.Concat(obj3));
						}
					}
				}
				CreatureGuid creatureId = asset.CreatureId;
				GameObject val5 = GameObject.Find("CustomContent:" + ((object)(CreatureGuid)(ref creatureId)).ToString());
				if (!((Object)(object)val5 != (Object)null) || !((Object)(object)val5.GetComponentInChildren<MeshFilter>() != (Object)null))
				{
					break;
				}
				MeshFilter[] componentsInChildren4 = val5.GetComponentsInChildren<MeshFilter>();
				foreach (MeshFilter val6 in componentsInChildren4)
				{
					Bounds bounds5 = val5.GetComponentInChildren<MeshFilter>().mesh.bounds;
					bool flag4 = true;
					val = Math.Min(val, ((Bounds)(ref bounds5)).min.y);
					num = Math.Max(num, ((Bounds)(ref bounds5)).max.y);
					if (diagnostic)
					{
						string[] obj4 = new string[8]
						{
							"Mesh ",
							((Object)val5.GetComponentInChildren<MeshFilter>().mesh).name,
							": Bounds ",
							null,
							null,
							null,
							null,
							null
						};
						bounds2 = val5.GetComponentInChildren<MeshFilter>().mesh.bounds;
						obj4[3] = ((Bounds)(ref bounds2)).min.y.ToString();
						obj4[4] = "->";
						bounds2 = val5.GetComponentInChildren<MeshFilter>().mesh.bounds;
						obj4[5] = ((Bounds)(ref bounds2)).max.y.ToString();
						obj4[6] = " | Max: ";
						obj4[7] = num.ToString();
						Debug.Log((object)string.Concat(obj4));
					}
				}
				break;
			}
			}
		}
		catch (Exception ex)
		{
			Debug.Log((object)"States Plugin: Exception");
			Debug.LogException(ex);
			val = 0f;
			num = 1f;
		}
		return num * offsetValue;
	}

	public void SetRequest(CreatureGuid cid)
	{
		//IL_0007: 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)
		CreatureBoardAsset asset = default(CreatureBoardAsset);
		CreaturePresenter.TryGetAsset(cid, ref asset);
		if ((Object)(object)asset != (Object)null)
		{
			string text = StatMessaging.ReadInfo(asset.CreatureId, "org.lordashes.plugins.states");
			SystemMessage.AskForTextInput("State", "Enter Creature State(s):", "OK", (Action<string>)delegate(string newStates)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				StatMessaging.SetInfo(asset.CreatureId, "org.lordashes.plugins.states", newStates);
			}, (Action)null, "Clear", (Action)delegate
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				StatMessaging.ClearInfo(asset.CreatureId, "org.lordashes.plugins.states");
			}, text);
		}
	}

	public void syncStealthMode()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: 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)
		foreach (CreatureBoardAsset item in (IEnumerable<CreatureBoardAsset>)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets())
		{
			try
			{
				CreatureGuid creatureId = item.CreatureId;
				GameObject val = GameObject.Find("Effect:" + ((object)(CreatureGuid)(ref creatureId)).ToString() + ".StatesBlock");
				if ((Object)(object)val != (Object)null)
				{
					if (item.IsExplicitlyHidden && ((Behaviour)val.GetComponent<TextMeshPro>()).enabled)
					{
						((Behaviour)val.GetComponent<TextMeshPro>()).enabled = false;
					}
					else if (!item.IsExplicitlyHidden && !((Behaviour)val.GetComponent<TextMeshPro>()).enabled)
					{
						((Behaviour)val.GetComponent<TextMeshPro>()).enabled = true;
					}
				}
			}
			catch (Exception)
			{
			}
		}
	}

	public bool isBoardLoaded()
	{
		return SimpleSingletonBehaviour<CameraController>.HasInstance && SingletonStateMBehaviour<BoardSessionManager, State<BoardSessionManager>>.HasInstance && !BoardSessionManager.IsLoading;
	}
}
public static class Utility
{
	public static void Initialize(MemberInfo plugin)
	{
		SceneManager.sceneLoaded += delegate(Scene scene, LoadSceneMode mode)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			try
			{
				if (((Scene)(ref scene)).name == "UI")
				{
					TextMeshProUGUI uITextByName = GetUITextByName("BETA");
					if (Object.op_Implicit((Object)(object)uITextByName))
					{
						((TMP_Text)uITextByName).text = "INJECTED BUILD - unstable mods";
					}
				}
				else
				{
					TextMeshProUGUI uITextByName2 = GetUITextByName("TextMeshPro Text");
					if (Object.op_Implicit((Object)(object)uITextByName2))
					{
						BepInPlugin val = (BepInPlugin)Attribute.GetCustomAttribute(plugin, typeof(BepInPlugin));
						if (((TMP_Text)uITextByName2).text.EndsWith("</size>"))
						{
							((TMP_Text)uITextByName2).text = ((TMP_Text)uITextByName2).text + "\n\nMods Currently Installed:\n";
						}
						TextMeshProUGUI val2 = uITextByName2;
						((TMP_Text)val2).text = ((TMP_Text)val2).text + "\nLord Ashes' " + val.Name + " - " + val.Version;
					}
				}
			}
			catch (Exception ex)
			{
				Debug.Log((object)ex);
			}
		};
	}

	public static TextMeshProUGUI GetUITextByName(string name)
	{
		TextMeshProUGUI[] array = Object.FindObjectsOfType<TextMeshProUGUI>();
		for (int i = 0; i < array.Length; i++)
		{
			if (((Object)array[i]).name == name)
			{
				return array[i];
			}
		}
		return null;
	}

	public static GameObject GetBaseLoader(CreatureGuid cid)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			CreatureBoardAsset val = null;
			CreaturePresenter.TryGetAsset(cid, ref val);
			if ((Object)(object)val != (Object)null)
			{
				CreatureBase match = null;
				StartWith(val, "_base", ref match);
				Transform match2 = null;
				Traverse(((Component)match).transform, "BaseLoader", ref match2);
				if ((Object)(object)match2 != (Object)null)
				{
					return ((Component)match2.GetChild(0)).gameObject;
				}
				return null;
			}
			return null;
		}
		catch
		{
			return null;
		}
	}

	public static GameObject GetAssetLoader(CreatureGuid cid)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			CreatureBoardAsset val = null;
			CreaturePresenter.TryGetAsset(cid, ref val);
			if ((Object)(object)val != (Object)null)
			{
				Transform match = null;
				StartWith(val, "_creatureRoot", ref match);
				Transform match2 = null;
				Traverse(match, "AssetLoader", ref match2);
				if ((Object)(object)match2 != (Object)null)
				{
					if (match2.childCount > 0)
					{
						return ((Component)match2.GetChild(0)).gameObject;
					}
					return null;
				}
				return null;
			}
			return null;
		}
		catch
		{
			return null;
		}
	}

	public static void StartWith<T>(CreatureBoardAsset asset, string seek, ref T match)
	{
		try
		{
			Type typeFromHandle = typeof(CreatureBoardAsset);
			match = default(T);
			foreach (FieldInfo runtimeField in typeFromHandle.GetRuntimeFields())
			{
				if (runtimeField.Name == seek)
				{
					match = (T)runtimeField.GetValue(asset);
					break;
				}
			}
		}
		catch
		{
			match = default(T);
		}
	}

	public static void Traverse(Transform root, string seek, ref Transform match)
	{
		try
		{
			if ((Object)(object)match != (Object)null)
			{
				return;
			}
			if (((Object)root).name == seek)
			{
				match = root;
				return;
			}
			foreach (Transform item in ExtensionMethods.Children(root))
			{
				Traverse(item, seek, ref match);
			}
		}
		catch
		{
		}
	}
}