Decompiled source of StatMessagingPlugin v3.2.1

StatMessaging.dll

Decompiled 7 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using Bounce.Singletons;
using Newtonsoft.Json;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("StatMessaging")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StatMessaging")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("StatMessaging")]
[assembly: ComVisible(false)]
[assembly: Guid("74902334-ecd0-4125-91a6-485549cfd810")]
[assembly: AssemblyFileVersion("3.2.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("3.2.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.statmessaging", "Stat Messaging Plug-In", "3.2.0.0")]
public class StatMessaging : BaseUnityPlugin
{
	public class Subscription
	{
		public string key { get; set; }

		public Action<Change[]> callback { get; set; }
	}

	public enum ChangeType
	{
		added = 1,
		modified,
		removed
	}

	public class Change : IEquatable<Change>
	{
		public CreatureGuid cid { get; set; }

		public ChangeType action { get; set; }

		public string key { get; set; }

		public string previous { get; set; }

		public string value { get; set; }

		public bool Equals(Change otherChange)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			if (cid == otherChange.cid && action == otherChange.action && key == otherChange.key && value == otherChange.value)
			{
				return true;
			}
			return false;
		}
	}

	public class ReflectionChange
	{
		public string cid { get; set; }

		public string action { get; set; }

		public string key { get; set; }

		public string previous { get; set; }

		public string value { get; set; }

		public ReflectionChange()
		{
		}

		public ReflectionChange(Change content)
		{
			//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)
			CreatureGuid val = content.cid;
			cid = ((object)(CreatureGuid)(ref val)).ToString();
			action = content.action.ToString();
			key = content.key;
			previous = content.previous;
			value = content.value;
		}
	}

	public static class Utility
	{
		public static bool isBoardLoaded()
		{
			return SimpleSingletonBehaviour<CameraController>.HasInstance && SingletonStateMBehaviour<BoardSessionManager, State<BoardSessionManager>>.HasInstance && !BoardSessionManager.IsLoading;
		}

		public static string GetCreatureName(string nameBlock)
		{
			if (nameBlock == null)
			{
				return "(Unknown)";
			}
			if (!nameBlock.Contains("<size=0>"))
			{
				return nameBlock;
			}
			return nameBlock.Substring(0, nameBlock.IndexOf("<size=0>")).Trim();
		}

		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)
				{
					Transform match = null;
					Traverse(((Component)val).transform, "BaseLoader", 0, 10, ref match);
					if ((Object)(object)match != (Object)null)
					{
						Debug.Log((object)("Stat Messaging Plug-In: Base Loader '" + ((Object)match.GetChild(0)).name + "' Found"));
						return ((Component)match.GetChild(0)).gameObject;
					}
					Debug.LogWarning((object)"Stat Messaging Plug-In: Could Not Find Base Loader");
					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;
					Traverse(((Component)val).transform, "AssetLoader", 0, 10, ref match);
					if ((Object)(object)match != (Object)null)
					{
						Debug.Log((object)("Stat Messaging Plug-In: Asset Loader '" + ((Object)match.GetChild(0)).name + "' Found"));
						return ((Component)match.GetChild(0)).gameObject;
					}
					Debug.LogWarning((object)"Stat Messaging Plug-In: Could Not Find Asset Loader");
					return null;
				}
				return null;
			}
			catch
			{
				return null;
			}
		}

		public static void Traverse(Transform root, string seek, int depth, int depthMax, 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))
				{
					if (depth < depthMax)
					{
						Traverse(item, seek, depth + 1, depthMax, ref match);
					}
				}
			}
			catch
			{
			}
		}

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

	public const string Name = "Stat Messaging Plug-In";

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

	public const string Version = "3.2.0.0";

	private static object exclusionLock = new object();

	private static Dictionary<CreatureGuid, string> data = new Dictionary<CreatureGuid, string>();

	private static Dictionary<Guid, Subscription> subscriptions = new Dictionary<Guid, Subscription>();

	private static bool diagnosticMode = false;

	private ConfigEntry<KeyboardShortcut> triggerDebugMode;

	private ConfigEntry<KeyboardShortcut> triggerDebugDump;

	private ConfigEntry<KeyboardShortcut> triggerReset;

	private static Type caller = null;

	private static MethodInfo callback = null;

	private static bool checkInProgress = false;

	private static bool ready = false;

	private static Queue<Change> operationQueue = new Queue<Change>();

	private void Awake()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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)
		Debug.Log((object)("Stat Messaging Plugin: " + ((object)this).GetType().AssemblyQualifiedName + " is active."));
		triggerDebugMode = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Toggle Diagnostic Mode", new KeyboardShortcut((KeyCode)46, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), (ConfigDescription)null);
		triggerDebugDump = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Dump Selected Mini Message Values", new KeyboardShortcut((KeyCode)44, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), (ConfigDescription)null);
		triggerReset = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Reset Mini Messages", new KeyboardShortcut((KeyCode)114, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), (ConfigDescription)null);
		diagnosticMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Additional Disgnostic Information In Logs", false, (ConfigDescription)null).Value;
	}

	private void Update()
	{
		//IL_0080: 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_0368: Unknown result type (might be due to invalid IL or missing references)
		//IL_036d: Unknown result type (might be due to invalid IL or missing references)
		//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_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_00c3: 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_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_044a: Unknown result type (might be due to invalid IL or missing references)
		//IL_044f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_052a: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e8: 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_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0167: 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_017f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0201: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Unknown result type (might be due to invalid IL or missing references)
		string text = "";
		try
		{
			text = "Board State Sync";
			if (Utility.isBoardLoaded() != ready)
			{
				ready = Utility.isBoardLoaded();
				if (ready)
				{
					Debug.Log((object)"Stat Messaging Plugin: Started looking for messages.");
				}
				else
				{
					data.Clear();
					Debug.Log((object)"Stat Messaging Plugin: Stopped looking for messages.");
				}
			}
			text = "Message Check";
			if (ready)
			{
				StatMessagingCheck();
			}
			text = "Keyboard Requests";
			KeyboardShortcut value = triggerDebugMode.Value;
			CreatureGuid val2;
			if (((KeyboardShortcut)(ref value)).IsUp())
			{
				diagnosticMode = !diagnosticMode;
			}
			else
			{
				value = triggerDebugDump.Value;
				if (((KeyboardShortcut)(ref value)).IsUp())
				{
					CreatureBoardAsset val = default(CreatureBoardAsset);
					CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref val);
					val2 = val.CreatureId;
					Debug.Log((object)("Stat Messaging Plugin: Stat Message Dump For Creature " + ((object)(CreatureGuid)(ref val2)).ToString()));
					Debug.Log((object)("Stat Messaging Plugin: " + val.Name));
				}
				else
				{
					value = triggerReset.Value;
					if (((KeyboardShortcut)(ref value)).IsUp())
					{
						_ = LocalClient.SelectedCreatureId;
						if (true)
						{
							CreatureBoardAsset val3 = default(CreatureBoardAsset);
							CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref val3);
							CreatureManager.SetCreatureName(val3.CreatureId, GetCreatureName(val3));
							if (data.ContainsKey(val3.CreatureId))
							{
								data.Remove(val3.CreatureId);
							}
							SystemMessage.DisplayInfoText("Stat Messages For Creature '" + GetCreatureName(val3) + "' Reset", 2.5f);
						}
						else
						{
							SystemMessage.DisplayInfoText("Stat Messages For All Creatures Reset", 2.5f);
							foreach (CreatureBoardAsset item in (IEnumerable<CreatureBoardAsset>)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets())
							{
								CreatureManager.SetCreatureName(item.CreatureId, GetCreatureName(item));
								if (data.ContainsKey(item.CreatureId))
								{
									data.Remove(item.CreatureId);
								}
							}
						}
					}
				}
			}
			text = "Process Queue";
			if (operationQueue.Count <= 0)
			{
				return;
			}
			if (diagnosticMode)
			{
				Debug.Log((object)("Stat Messaging Plugin: Operation Queue Count: " + operationQueue.Count));
			}
			text = "Process Queue: Dequeue";
			Change change = operationQueue.Dequeue();
			text = "Process Queue: Try Get Asset";
			CreatureBoardAsset val4 = default(CreatureBoardAsset);
			CreaturePresenter.TryGetAsset(change.cid, ref val4);
			text = "Process Queue: Get Stat Block";
			Dictionary<string, string> dictionary = null;
			if (!((Object)(object)val4 != (Object)null))
			{
				return;
			}
			string text2 = val4.Name.Substring(val4.Name.IndexOf("<size=0>") + "<size=0>".Length);
			try
			{
				dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(text2);
			}
			catch (Exception)
			{
				Debug.Log((object)"Stat Messaging Plugin: Corrupt Stat Block Detected. Resetting Mini's JSON Block.");
				dictionary = new Dictionary<string, string>();
			}
			text = "Process Queue: Switch";
			switch (change.action)
			{
			case ChangeType.added:
			case ChangeType.modified:
				if (diagnosticMode)
				{
					string[] obj2 = new string[10] { "Stat Messaging Plugin: Queue Processing: On '", null, null, null, null, null, null, null, null, null };
					val2 = change.cid;
					obj2[1] = ((object)(CreatureGuid)(ref val2)).ToString();
					obj2[2] = "' process '";
					obj2[3] = change.action.ToString();
					obj2[4] = "' request for key ";
					obj2[5] = change.key;
					obj2[6] = " to ";
					obj2[7] = change.value;
					obj2[8] = " from ";
					obj2[9] = change.previous;
					Debug.Log((object)string.Concat(obj2));
				}
				if (dictionary.ContainsKey(change.key))
				{
					dictionary[change.key] = change.value;
				}
				else
				{
					dictionary.Add(change.key, change.value);
				}
				break;
			case ChangeType.removed:
				if (diagnosticMode)
				{
					string[] obj = new string[6] { "Stat Messaging Plugin: Queue Processing: On '", null, null, null, null, null };
					val2 = change.cid;
					obj[1] = ((object)(CreatureGuid)(ref val2)).ToString();
					obj[2] = "' process '";
					obj[3] = change.action.ToString();
					obj[4] = "' request for key ";
					obj[5] = change.key;
					Debug.Log((object)string.Concat(obj));
				}
				if (dictionary.ContainsKey(change.key))
				{
					dictionary.Remove(change.key);
				}
				break;
			}
			if (diagnosticMode)
			{
				string[] obj3 = new string[6] { "Stat Messaging Plugin: Queue Processing: Setting Creature '", null, null, null, null, null };
				val2 = change.cid;
				obj3[1] = ((object)(CreatureGuid)(ref val2)).ToString();
				obj3[2] = "' name to: ";
				obj3[3] = GetCreatureName(val4);
				obj3[4] = "<size=0>";
				obj3[5] = JsonConvert.SerializeObject((object)dictionary);
				Debug.Log((object)string.Concat(obj3));
			}
			CreatureManager.SetCreatureName(change.cid, GetCreatureName(val4) + "<size=0>" + JsonConvert.SerializeObject((object)dictionary));
		}
		catch (Exception ex2)
		{
			Debug.Log((object)("Stat Messaging Plugin: Exception In Update Sequence At Phase = " + text));
			Debug.LogException(ex2);
		}
	}

	private void OnGUI()
	{
		//IL_000b: 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_0032: Expected O, but got Unknown
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		if (diagnosticMode)
		{
			CreatureBoardAsset val = default(CreatureBoardAsset);
			CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref val);
			if ((Object)(object)val != (Object)null)
			{
				GUIStyle val2 = new GUIStyle
				{
					wordWrap = true
				};
				GUI.Label(new Rect(10f, 30f, 1900f, 80f), "Debug: " + val.Name, val2);
			}
		}
	}

	[Obsolete]
	public static void Check(Action<Change[]> dataChangeCallback)
	{
		foreach (Subscription value in subscriptions.Values)
		{
			if (value.callback == dataChangeCallback)
			{
				return;
			}
		}
		Debug.LogWarning((object)"Stat Messaging Plugin: Check(callback) is obsolete. Use the Subscribe() method instead.");
		Subscribe("*", dataChangeCallback);
	}

	public static Guid Subscribe(string key, Action<Change[]> dataChangeCallback)
	{
		try
		{
			Guid guid = System.Guid.NewGuid();
			subscriptions.Add(guid, new Subscription
			{
				key = key,
				callback = dataChangeCallback
			});
			return guid;
		}
		catch (Exception)
		{
			return System.Guid.Empty;
		}
	}

	public static void Unsubscribe(Guid subscriptionId)
	{
		if (subscriptions.ContainsKey(subscriptionId))
		{
			string[] obj = new string[5]
			{
				"Stat Messaging Plugin: Removing Subscription ",
				subscriptions[subscriptionId].key,
				" (",
				null,
				null
			};
			Guid guid = subscriptionId;
			obj[3] = guid.ToString();
			obj[4] = ")";
			Debug.Log((object)string.Concat(obj));
			subscriptions.Remove(subscriptionId);
		}
	}

	public static void SetInfo(CreatureGuid cid, string key, string value)
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		lock (exclusionLock)
		{
			Change item = new Change
			{
				cid = cid,
				key = key,
				value = value,
				action = ChangeType.modified,
				previous = null
			};
			if (!operationQueue.Contains(item))
			{
				operationQueue.Enqueue(item);
			}
		}
	}

	public static void ClearInfo(CreatureGuid cid, string key)
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		operationQueue.Enqueue(new Change
		{
			cid = cid,
			key = key,
			value = null,
			action = ChangeType.removed,
			previous = null
		});
	}

	public static string ReadInfo(CreatureGuid cid, string key)
	{
		//IL_0018: 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)
		lock (exclusionLock)
		{
			if (data.ContainsKey(cid))
			{
				string text = data[cid];
				text = text.Substring(text.IndexOf("<size=0>") + "<size=0>".Length);
				Dictionary<string, string> dictionary = null;
				try
				{
					dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(text);
				}
				catch (Exception)
				{
					dictionary = new Dictionary<string, string>();
				}
				if (dictionary.ContainsKey(key))
				{
					return dictionary[key];
				}
			}
			else
			{
				Debug.LogWarning((object)("Stat Messaging Plugin: Creature '" + ((object)(CreatureGuid)(ref cid)).ToString() + "' not defined in data dictionary"));
			}
			return "";
		}
	}

	[Obsolete]
	public static void Reset()
	{
		Debug.Log((object)"Stat Messaging Plugin: Data dictionary reset is obsolete. Use Reset(key) instead.");
		data.Clear();
	}

	public static void Reset(string key)
	{
		//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_003d: 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_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: 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_0072: 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_009c: Unknown result type (might be due to invalid IL or missing references)
		Debug.Log((object)("Stat Messaging Plugin: Removing key '" + key + "' from all assets"));
		CreatureGuid[] array = data.Keys.ToArray();
		CreatureGuid[] array2 = array;
		for (int i = 0; i < array2.Length; i++)
		{
			CreatureGuid val = array2[i];
			CreatureBoardAsset val2 = null;
			CreaturePresenter.TryGetAsset(val, ref val2);
			if ((Object)(object)val2 != (Object)null)
			{
				if (data.ContainsKey(val))
				{
					if (data[val].Contains("<size=0>"))
					{
						string text = data[val].Substring(data[val].IndexOf("<size=0>") + "<size=0>".Length);
						Dictionary<string, string> dictionary = null;
						try
						{
							dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(text);
						}
						catch (Exception)
						{
							dictionary = new Dictionary<string, string>();
						}
						if (dictionary.ContainsKey(key))
						{
							dictionary.Remove(key);
						}
						data[val] = GetCreatureName(val2) + "<size=0>" + JsonConvert.SerializeObject((object)dictionary);
						Debug.Log((object)("Stat Messaging Plugin: Creature " + ((object)(CreatureGuid)(ref val)).ToString() + " StatBlock is " + data[val]));
					}
					else
					{
						Debug.Log((object)("Stat Messaging Plugin: Creature " + ((object)(CreatureGuid)(ref val)).ToString() + " Had No StatBlock..."));
					}
				}
				else
				{
					Debug.Log((object)("Stat Messaging Plugin: Creature " + ((object)(CreatureGuid)(ref val)).ToString() + " Had Data But Doesn't Anymore..."));
				}
			}
			else
			{
				Debug.Log((object)("Stat Messaging Plugin: Creature " + ((object)(CreatureGuid)(ref val)).ToString() + " Had Data But Does Not Exist. Removing Data..."));
				data.Remove(val);
			}
		}
	}

	public static string GetCreatureName(CreatureBoardAsset asset)
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		string text = asset.Name;
		if (text == null)
		{
			text = ((Object)asset).name;
		}
		if (text == null)
		{
			text = ((Object)Utility.GetAssetLoader(asset.CreatureId).GetComponent<MeshFilter>()).name;
		}
		if (text.Contains("<size=0>"))
		{
			text = text.Substring(0, text.IndexOf("<size=0>")).Trim();
		}
		return text;
	}

	private static void StatMessagingCheck()
	{
		//IL_0342: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: 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_03c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0438: Unknown result type (might be due to invalid IL or missing references)
		//IL_0250: 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_028e: 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_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_0223: 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_011c: 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_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a4: 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_006f: 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_02bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_053f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0544: Unknown result type (might be due to invalid IL or missing references)
		if (checkInProgress)
		{
			return;
		}
		checkInProgress = true;
		try
		{
			foreach (CreatureBoardAsset item in (IEnumerable<CreatureBoardAsset>)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets())
			{
				string text = item.Name;
				if (text == null)
				{
					if (text == null)
					{
						text = ((Object)item).name;
					}
					if (text == null)
					{
						text = ((Object)Utility.GetAssetLoader(item.CreatureId).GetComponent<MeshFilter>()).name;
					}
				}
				CreatureGuid val;
				if (!text.Contains("<size=0>"))
				{
					Debug.Log((object)("Stat Messaging Plugin: CreatureName is " + text));
					if (data.ContainsKey(item.CreatureId))
					{
						string[] obj = new string[5]
						{
							"Stat Messaging Plugin: Restoring previous data for Creature '",
							GetCreatureName(item),
							"' (",
							null,
							null
						};
						val = item.CreatureId;
						obj[3] = ((object)(CreatureGuid)(ref val)).ToString();
						obj[4] = "). Probably lost due to a character rename.";
						Debug.Log((object)string.Concat(obj));
						data[item.CreatureId] = GetCreatureName(item) + data[item.CreatureId].Substring(data[item.CreatureId].IndexOf("<size=0>"));
						CreatureManager.SetCreatureName(item.CreatureId, data[item.CreatureId]);
						Debug.Log((object)("Stat Messaging Plugin: Creature '" + GetCreatureName(item) + "' is now '" + data[item.CreatureId] + "'"));
						text = data[item.CreatureId];
					}
					else
					{
						string[] obj2 = new string[5]
						{
							"Stat Messaging Plugin: Creating new data block for Creature '",
							GetCreatureName(item),
							"' (",
							null,
							null
						};
						val = item.CreatureId;
						obj2[3] = ((object)(CreatureGuid)(ref val)).ToString();
						obj2[4] = "). This is probably a new asset.";
						Debug.Log((object)string.Concat(obj2));
						CreatureManager.SetCreatureName(item.CreatureId, text + " <size=0>{}");
						text += " <size=0>{}";
					}
				}
				if (!data.ContainsKey(item.CreatureId))
				{
					data.Add(item.CreatureId, GetCreatureName(item) + "<size=0>{}");
				}
				if (!(text != data[item.CreatureId]))
				{
					continue;
				}
				string text2 = data[item.CreatureId].Substring(data[item.CreatureId].IndexOf("<size=0>") + "<size=0>".Length);
				string text3 = text.Substring(text.IndexOf("<size=0>") + "<size=0>".Length);
				Dictionary<string, string> dictionary = null;
				Dictionary<string, string> dictionary2 = null;
				try
				{
					dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(text2);
				}
				catch (Exception)
				{
					dictionary = new Dictionary<string, string>();
				}
				try
				{
					dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, string>>(text3);
				}
				catch (Exception)
				{
					dictionary2 = new Dictionary<string, string>();
				}
				data[item.CreatureId] = text;
				List<Change> list = new List<Change>();
				foreach (KeyValuePair<string, string> item2 in dictionary)
				{
					if (!dictionary2.ContainsKey(item2.Key))
					{
						list.Add(new Change
						{
							action = ChangeType.removed,
							key = item2.Key,
							previous = item2.Value,
							value = "",
							cid = item.CreatureId
						});
					}
					else if (item2.Value != dictionary2[item2.Key])
					{
						list.Add(new Change
						{
							action = ChangeType.modified,
							key = item2.Key,
							previous = item2.Value,
							value = dictionary2[item2.Key],
							cid = item.CreatureId
						});
					}
				}
				foreach (KeyValuePair<string, string> item3 in dictionary2)
				{
					if (!dictionary.ContainsKey(item3.Key))
					{
						list.Add(new Change
						{
							action = ChangeType.added,
							key = item3.Key,
							previous = "",
							value = item3.Value,
							cid = item.CreatureId
						});
					}
				}
				if (list.Count <= 0)
				{
					continue;
				}
				foreach (Change item4 in list)
				{
					string[] obj3 = new string[10] { "Stat Messaging Plugin: Cid: ", null, null, null, null, null, null, null, null, null };
					val = item4.cid;
					obj3[1] = ((object)(CreatureGuid)(ref val)).ToString();
					obj3[2] = ", Type: ";
					obj3[3] = item4.action.ToString();
					obj3[4] = ", Key: ";
					obj3[5] = item4.key;
					obj3[6] = ", Previous: ";
					obj3[7] = item4.previous;
					obj3[8] = ", Current: ";
					obj3[9] = item4.value;
					Debug.Log((object)string.Concat(obj3));
					foreach (Subscription value in subscriptions.Values)
					{
						if (diagnosticMode)
						{
							Debug.Log((object)("Stat Messaging Plugin: Subscription: " + value.key + ", Change: " + item4.key + ", Match: " + (value.key == item4.key)));
						}
						if (value.key == item4.key)
						{
							value.callback(new Change[1] { item4 });
						}
					}
				}
				foreach (Subscription value2 in subscriptions.Values)
				{
					if (value2.key == "*")
					{
						if (diagnosticMode)
						{
							Debug.Log((object)"Stat Messaging Plugin: Subscription: *");
						}
						value2.callback(list.ToArray());
					}
				}
				if (!(caller != null) || !(callback != null) || list == null)
				{
					continue;
				}
				if (diagnosticMode)
				{
					Debug.Log((object)"Stat Messaging Plugin: Reflection Subscription: *");
				}
				List<ReflectionChange> list2 = new List<ReflectionChange>();
				foreach (Change item5 in list)
				{
					list2.Add(new ReflectionChange(item5));
				}
				string text4 = JsonConvert.SerializeObject((object)list2);
				callback.Invoke(null, new object[1] { text4 });
			}
		}
		catch (Exception ex3)
		{
			Debug.Log((object)"Stat Messaging Plugin: Exception");
			Debug.LogException(ex3);
		}
		checkInProgress = false;
	}

	public static Dictionary<Guid, Subscription> Subscriptions()
	{
		if (diagnosticMode)
		{
			Debug.Log((object)"Stat Messaging Plugin: Obtaining subscriptions");
		}
		Dictionary<Guid, Subscription> dictionary = new Dictionary<Guid, Subscription>();
		foreach (KeyValuePair<Guid, Subscription> subscription in subscriptions)
		{
			dictionary.Add(subscription.Key, subscription.Value);
		}
		return dictionary;
	}

	public static void ReflectionSubscription(string callerName, string callbackName)
	{
		if (diagnosticMode)
		{
			Debug.Log((object)("Stat Messaging Plugin: Setting Reflection Subscription (" + callerName + ", " + callbackName));
		}
		try
		{
			caller = Type.GetType(callerName);
			if (caller == null)
			{
				throw new Exception("Reflection subscribe type is invalid");
			}
			callback = caller.GetMethod(callbackName);
			if (callback == null)
			{
				throw new Exception("Reflection callback is invalid");
			}
		}
		catch (Exception ex)
		{
			Debug.Log((object)"Stat Messaging Plugin: Unable To Set Reflection Subscription");
			Debug.LogException(ex);
		}
	}
}