Decompiled source of CompanyIssuedProtogen v1.0.0

CompanyIssuedProtogen.dll

Decompiled 11 months 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 System.Threading.Tasks;
using BepInEx;
using BepInEx.Logging;
using CompanyIssuedProtogen.Protogen;
using CompanyIssuedProtogen.Tools;
using GameNetcodeStuff;
using HarmonyLib;
using Steamworks;
using Steamworks.Data;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("CompanyIssuedProtogen")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A ScottyFoxArt Lethal Company Mod : Company Issued Protogen! ")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CompanyIssuedProtogen")]
[assembly: AssemblyTitle("CompanyIssuedProtogen")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
public class WigglyBones : MonoBehaviour
{
	public float damping = 12f;

	private List<Transform> bones = new List<Transform>();

	private List<Quaternion> relativeRotations = new List<Quaternion>();

	private List<Quaternion> oldRotations = new List<Quaternion>();

	private void Start()
	{
		InitializeBones();
	}

	private void InitializeBones()
	{
		TraverseHierarchy(((Component)this).transform);
	}

	private void TraverseHierarchy(Transform root)
	{
		//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_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Expected O, but got Unknown
		Stack<Transform> stack = new Stack<Transform>();
		stack.Push(root);
		while (stack.Count > 0)
		{
			Transform val = stack.Pop();
			if ((Object)(object)val != (Object)(object)((Component)this).transform)
			{
				bones.Add(val);
				relativeRotations.Add(Quaternion.Inverse(val.parent.rotation) * val.rotation);
				oldRotations.Add(val.rotation);
			}
			foreach (Transform item2 in val)
			{
				Transform item = item2;
				stack.Push(item);
			}
		}
	}

	private void Update()
	{
		ApplyJiggleEffect();
	}

	private void ApplyJiggleEffect()
	{
		//IL_0015: 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_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_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_0051: 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)
		for (int i = 0; i < bones.Count; i++)
		{
			Quaternion val = bones[i].parent.rotation * relativeRotations[i];
			bones[i].rotation = Quaternion.Slerp(oldRotations[i], val, damping * Time.deltaTime);
			oldRotations[i] = bones[i].rotation;
		}
	}
}
namespace CompanyIssuedProtogen
{
	internal class BoneMimicHandler : MonoBehaviour
	{
		private struct BonePair
		{
			public Transform original;

			public Transform target;

			public bool rotation;

			public bool position;

			public Vector3 offset;

			public Vector3 rotation_offset;

			public BonePair(Transform original, Transform target, bool rotation = false, bool position = false)
			{
				//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_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002e: Unknown result type (might be due to invalid IL or missing references)
				this.original = target;
				this.target = target;
				this.rotation = rotation;
				this.position = position;
				offset = Vector3.zero;
				rotation_offset = Vector3.zero;
			}
		}

		private List<BonePair> bonePairs = new List<BonePair>();

		private Dictionary<string, Transform> original_reference;

		private Dictionary<string, Transform> target_reference;

		public void ClearReferences()
		{
			original_reference.Clear();
			target_reference.Clear();
		}

		public void BuildOriginalReference(Transform target)
		{
			original_reference = BuildReference(target);
		}

		public void BuildTargetReference(Transform target)
		{
			target_reference = BuildReference(target);
		}

		private Dictionary<string, Transform> BuildReference(Transform target)
		{
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform[] componentsInChildren = ((Component)target).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!dictionary.ContainsKey(((Object)val).name))
				{
					dictionary.Add(((Object)val).name, val);
				}
			}
			return dictionary;
		}

		public void ResetBonePairs()
		{
			bonePairs.Clear();
		}

		public Transform GetOriginalBone(string name)
		{
			Transform value = null;
			if (original_reference != null)
			{
				original_reference.TryGetValue(name, out value);
			}
			return value;
		}

		public Transform GetTargetBone(string name)
		{
			Transform value = null;
			if (target_reference != null)
			{
				target_reference.TryGetValue(name, out value);
			}
			return value;
		}

		public void PairBones(string original, string target, bool rotation = true, bool position = true)
		{
			if (rotation || position)
			{
				PairBones(GetOriginalBone(original), GetTargetBone(target), rotation, position);
			}
		}

		public void PairBones(string original, string target, Vector3 offset, Vector3 rotation_offset, bool rotation = true, bool position = true)
		{
			//IL_0018: 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)
			if (rotation || position)
			{
				PairBones(GetOriginalBone(original), GetTargetBone(target), offset, rotation_offset, rotation, position);
			}
		}

		public void PairBones(Transform original, string target, bool rotation = true, bool position = true)
		{
			if (rotation || position)
			{
				PairBones(original, GetTargetBone(target), rotation, position);
			}
		}

		public void PairBones(Transform original, string target, Vector3 offset, Vector3 rotation_offset, bool rotation = true, bool position = true)
		{
			//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)
			if (rotation || position)
			{
				PairBones(original, GetTargetBone(target), offset, rotation_offset, rotation, position);
			}
		}

		public void PairBones(string original, Transform target, bool rotation = true, bool position = true)
		{
			if (rotation || position)
			{
				PairBones(GetOriginalBone(original), target, rotation, position);
			}
		}

		public void PairBones(string original, Transform target, Vector3 offset, Vector3 rotation_offset, bool rotation = true, bool position = true)
		{
			//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)
			if (rotation || position)
			{
				PairBones(GetOriginalBone(original), target, offset, rotation_offset, rotation, position);
			}
		}

		public void PairBones(Transform original, Transform target, bool rotation = true, bool position = true)
		{
			if (Object.op_Implicit((Object)(object)original) && Object.op_Implicit((Object)(object)target) && (rotation || position))
			{
				bonePairs.Add(SetUpBonePair(original, target, rotation, position));
			}
		}

		public void PairBones(Transform original, Transform target, Vector3 offset, Vector3 rotation_offset, bool rotation = true, bool position = true)
		{
			//IL_0021: 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)
			if (Object.op_Implicit((Object)(object)original) && Object.op_Implicit((Object)(object)target) && (rotation || position))
			{
				bonePairs.Add(SetUpBonePair(original, target, offset, rotation_offset, rotation, position));
			}
		}

		private BonePair SetUpBonePair(Transform original, Transform target, bool rotation = true, bool position = true)
		{
			BonePair result = default(BonePair);
			result.original = original;
			result.target = target;
			result.rotation = rotation;
			result.position = position;
			return result;
		}

		private BonePair SetUpBonePair(Transform original, Transform target, Vector3 offset, Vector3 rotation_offset, bool rotation = true, bool position = true)
		{
			//IL_0030: 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_003d: 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)
			BonePair result = default(BonePair);
			result.original = original;
			result.target = target;
			result.rotation = rotation;
			result.position = position;
			if (rotation)
			{
				result.rotation_offset = rotation_offset;
			}
			if (position)
			{
				result.offset = offset;
			}
			return result;
		}

		private void SyncBones()
		{
			//IL_0044: 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_006d: 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_0078: Unknown result type (might be due to invalid IL or missing references)
			foreach (BonePair bonePair in bonePairs)
			{
				if (Object.op_Implicit((Object)(object)bonePair.original) && Object.op_Implicit((Object)(object)bonePair.target))
				{
					if (bonePair.rotation)
					{
						bonePair.original.eulerAngles = bonePair.target.eulerAngles + bonePair.rotation_offset;
					}
					if (bonePair.position)
					{
						bonePair.original.position = bonePair.target.position + bonePair.offset;
					}
				}
			}
		}

		private void LateUpdate()
		{
			SyncBones();
		}
	}
	internal class SimpleIKHandler : MonoBehaviour
	{
		private Transform lefthand;

		private Transform righthand;

		private Transform leftfoot;

		private Transform rightfoot;

		private Animator animator;

		private void Start()
		{
			animator = ((Component)this).GetComponent<Animator>();
		}

		public void SetLeftHand(Transform target)
		{
			lefthand = target;
		}

		public void SetRightHand(Transform target)
		{
			righthand = target;
		}

		public void SetLeftFoot(Transform target)
		{
			leftfoot = target;
		}

		public void SetRightFoot(Transform target)
		{
			rightfoot = target;
		}

		private void OnAnimatorIK(int layerIndex)
		{
			//IL_004a: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: 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_0161: 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 (Object.op_Implicit((Object)(object)animator))
			{
				if (Object.op_Implicit((Object)(object)leftfoot))
				{
					animator.SetIKPositionWeight((AvatarIKGoal)0, 1f);
					animator.SetIKRotationWeight((AvatarIKGoal)0, 1f);
					animator.SetIKPosition((AvatarIKGoal)0, leftfoot.position);
					animator.SetIKRotation((AvatarIKGoal)0, leftfoot.rotation);
				}
				if (Object.op_Implicit((Object)(object)rightfoot))
				{
					animator.SetIKPositionWeight((AvatarIKGoal)1, 1f);
					animator.SetIKRotationWeight((AvatarIKGoal)1, 1f);
					animator.SetIKPosition((AvatarIKGoal)1, rightfoot.position);
					animator.SetIKRotation((AvatarIKGoal)1, rightfoot.rotation);
				}
				if (Object.op_Implicit((Object)(object)lefthand))
				{
					animator.SetIKPositionWeight((AvatarIKGoal)2, 1f);
					animator.SetIKRotationWeight((AvatarIKGoal)2, 1f);
					animator.SetIKPosition((AvatarIKGoal)2, lefthand.position);
					animator.SetIKRotation((AvatarIKGoal)2, lefthand.rotation);
				}
				if (Object.op_Implicit((Object)(object)righthand))
				{
					animator.SetIKPositionWeight((AvatarIKGoal)3, 1f);
					animator.SetIKRotationWeight((AvatarIKGoal)3, 1f);
					animator.SetIKPosition((AvatarIKGoal)3, righthand.position);
					animator.SetIKRotation((AvatarIKGoal)3, righthand.rotation);
				}
			}
		}
	}
	[BepInPlugin("CompanyIssuedProtogen", "CompanyIssuedProtogen", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public static ManualLogSource Logger;

		private void Awake()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			Logger = ((BaseUnityPlugin)this).Logger;
			try
			{
				Logger.LogInfo((object)"Plugin CompanyIssuedProtogen");
				Logger.LogInfo((object)"Dressing Up Protogens");
				if (ProtogenPrefabs.Init())
				{
					Logger.LogInfo((object)"Teaching Protogens Emotions");
					ProtogenExpressions.BuildExpressions();
					Logger.LogInfo((object)"Spray Painting Protogens");
					Logger.LogInfo((object)"Patching Protogens In.");
					new Harmony("SFXArt.CompanyIssuedProtoGen").PatchAll(Assembly.GetExecutingAssembly());
					Logger.LogInfo((object)"Plugin CompanyIssuedProtogen is loaded!");
				}
				else
				{
					Logger.LogError((object)"Could not load assets...!");
				}
			}
			catch (Exception)
			{
				Logger.LogInfo((object)"Plugin CompanyIssuedProtogen failed to load...");
			}
		}
	}
	public static class TextureTools
	{
		public static void DominantColors(Texture2D texture, out bool isDark, out Color mainColor, out Color secondaryColor)
		{
			//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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: 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: 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_0127: 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_0136: 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_015f: 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_0067: 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_004d: 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_0059: 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_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: 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_0181: 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_007b: 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_0085: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: 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_00d5: 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_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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)
			Color[] pixels = texture.GetPixels();
			Dictionary<Color, int> dictionary = new Dictionary<Color, int>();
			Color val = Color.white;
			int num = 0;
			Color val2 = Color.black;
			float num2 = 0f;
			Color val3 = Color.black;
			Color[] array = pixels;
			float num3 = default(float);
			float num4 = default(float);
			float num5 = default(float);
			foreach (Color val4 in array)
			{
				if (dictionary.ContainsKey(val4))
				{
					dictionary[val4]++;
				}
				else
				{
					dictionary.Add(val4, 1);
				}
				if (dictionary[val4] > num)
				{
					num = dictionary[val4];
					val = val4;
				}
				Color.RGBToHSV(val4, ref num3, ref num4, ref num5);
				if ((double)num5 > 0.5 || val2 == Color.black)
				{
					if (num4 == num2)
					{
						val2 = Color.Lerp(val2, val4, 0.5f);
					}
					else if (num4 > num2)
					{
						val2 = val4;
						num2 = num4;
					}
				}
				val3 += val4;
			}
			val3 /= (float)pixels.Length;
			float num6 = default(float);
			float num7 = default(float);
			Color.RGBToHSV(val, ref num3, ref num6, ref num7);
			isDark = (double)num7 < 0.5;
			float num8 = default(float);
			float num9 = default(float);
			float num10 = default(float);
			Color.RGBToHSV(val3, ref num8, ref num9, ref num10);
			float num11 = default(float);
			float num12 = default(float);
			Color.RGBToHSV(val2, ref num6, ref num11, ref num12);
			mainColor = val;
			secondaryColor = Color.HSVToRGB(num8, Mathf.Lerp(num9, num11, 0.5f), Mathf.Lerp(num10, num12, 0.5f));
			if (mainColor == secondaryColor)
			{
				if (isDark)
				{
					secondaryColor = Color.white;
				}
				else
				{
					secondaryColor = Color.black;
				}
			}
		}

		public static Color[] FlatColor(int width, int height, Color color)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Color[] array = (Color[])(object)new Color[width * height];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = color;
			}
			return array;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "CompanyIssuedProtogen";

		public const string PLUGIN_NAME = "CompanyIssuedProtogen";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace CompanyIssuedProtogen.Tools
{
	internal class AssetHelper
	{
		private AssetBundle assetbundle;

		private Dictionary<string, Object> assets = new Dictionary<string, Object>();

		public void LoadAssetsStripped(string path, string prefix)
		{
			assetbundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), path));
			string[] allAssetNames = assetbundle.GetAllAssetNames();
			foreach (string text in allAssetNames)
			{
				if (text.StartsWith(prefix))
				{
					string text2 = text.Remove(0, prefix.Length);
					if (!assets.ContainsKey(text2))
					{
						assets.Add(text2, assetbundle.LoadAsset(text));
					}
					else
					{
						Debug.LogWarning((object)("StrippedAsset : " + text2 + " :  Already Exists."));
					}
				}
			}
			assetbundle.Unload(false);
		}

		public T Get<T>(string name) where T : Object
		{
			if (!assets.TryGetValue(name, out var value))
			{
				return default(T);
			}
			return (T)(object)value;
		}

		public bool Has<T>(string name, out T asset) where T : Object
		{
			asset = (assets.TryGetValue(name, out var value) ? ((T)(object)value) : default(T));
			return (Object)(object)asset != (Object)null;
		}
	}
	public static class PixelKit
	{
		public static void HSV(ref Color original, float H, float S, float V)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			original = Color.HSVToRGB(H, S, V);
		}

		public static void HV(ref Color original, float H, float V)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(original, ref num, ref num2, ref num3);
			original = Color.HSVToRGB(H, num2, V);
		}

		public static void HS(ref Color original, float H, float S)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(original, ref num, ref num2, ref num3);
			original = Color.HSVToRGB(H, S, num3);
		}

		public static void SV(ref Color original, float S, float V)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(original, ref num, ref num2, ref num3);
			original = Color.HSVToRGB(num, S, V);
		}

		public static void Hue(ref Color original, float amount)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(original, ref num, ref num2, ref num3);
			original = Color.HSVToRGB(amount, num2, num3);
		}

		public static void Saturate(ref Color original, float amount)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(original, ref num, ref num2, ref num3);
			original = Color.HSVToRGB(num, amount, num3);
		}

		public static void Value(ref Color original, float amount)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(original, ref num, ref num2, ref num3);
			original = Color.HSVToRGB(num, num2, amount);
		}

		public static void Multiply(ref Color original, Color color)
		{
			//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_0008: 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)
			original *= color;
		}

		public static void Invert(ref Color original)
		{
			//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_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)
			original -= Color.white;
		}

		public static Color Lerp_Mask(Color original, Color reference, Color color)
		{
			//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)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			return Color.Lerp(original, color, 1f - reference.r);
		}

		public static Color Lerp_Alpha(Color original, Color reference)
		{
			//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)
			//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)
			return Color.Lerp(original, reference, reference.a);
		}
	}
}
namespace CompanyIssuedProtogen.Protogen
{
	internal static class ProtogenBones
	{
		public static BoneMimicHandler AttachBones(ProtogenHandler protogen)
		{
			Transform target = ((Component)((Component)protogen.player).GetComponentInChildren<LODGroup>()).transform.Find("metarig");
			GameObject gameObject = ((Component)protogen).gameObject;
			gameObject.AddComponent<SimpleIKHandler>();
			BoneMimicHandler boneMimicHandler = gameObject.AddComponent<BoneMimicHandler>();
			AttachToTarget(boneMimicHandler, ((Component)protogen).transform, target);
			return boneMimicHandler;
		}

		public static BoneMimicHandler AttachTempBones(ProtogenHandler protogen, Transform target)
		{
			BoneMimicHandler boneMimicHandler = ((Component)protogen).gameObject.AddComponent<BoneMimicHandler>();
			AttachToTarget(boneMimicHandler, ((Component)protogen).transform, target);
			return boneMimicHandler;
		}

		private static void AttachToTarget(BoneMimicHandler bones, Transform original, Transform target)
		{
			bones.ResetBonePairs();
			bones.BuildOriginalReference(original);
			bones.BuildTargetReference(target);
			bones.PairBones(original, target);
			if (!Object.op_Implicit((Object)(object)bones.GetTargetBone("spine")))
			{
				bones.PairBones("Spine", "spine.001");
			}
			else
			{
				bones.PairBones("Spine", "spine");
			}
			bones.PairBones("Chest", "spine.003", rotation: true, position: false);
			bones.PairBones("Neck", "spine.004", rotation: true, position: false);
			bones.PairBones("Head", "spine.004_end", rotation: true, position: false);
			bones.PairBones("shoulder.L", "shoulder.L", rotation: true, position: false);
			bones.PairBones("upper_arm.L", "arm.L_upper", rotation: true, position: false);
			bones.PairBones("forearm.L", "arm.L_lower", rotation: true, position: false);
			bones.PairBones("hand.L", "hand.L", rotation: true, position: false);
			bones.PairBones("Index01.L", "finger2.L", rotation: true, position: false);
			bones.PairBones("Middle01.L", "finger3.L", rotation: true, position: false);
			bones.PairBones("Middle01.L.001", "finger3.L.001", rotation: true, position: false);
			bones.PairBones("Thumb01.L", "finger1.L", rotation: true, position: false);
			bones.PairBones("shoulder.R", "shoulder.R", rotation: true, position: false);
			bones.PairBones("upper_arm.R", "arm.R_upper", rotation: true, position: false);
			bones.PairBones("forearm.R", "arm.R_lower", rotation: true, position: false);
			bones.PairBones("hand.R", "hand.R", rotation: true, position: false);
			bones.PairBones("Index01.R", "finger2.R", rotation: true, position: false);
			bones.PairBones("Middle01.R", "finger3.R", rotation: true, position: false);
			bones.PairBones("Middle01.R.001", "finger3.R.001", rotation: true, position: false);
			bones.PairBones("Thumb01.R", "finger1.R", rotation: true, position: false);
			bones.PairBones("thigh.L", "thigh.L");
			bones.PairBones("shin.L", "shin.L", rotation: true, position: false);
			bones.PairBones("foot.L", "foot.L");
			bones.PairBones("toe.L", "toe.L", rotation: true, position: false);
			bones.PairBones("thigh.R", "thigh.R");
			bones.PairBones("shin.R", "shin.R", rotation: true, position: false);
			bones.PairBones("foot.R", "foot.R");
			bones.PairBones("toe.R", "toe.R", rotation: true, position: false);
		}

		public static void AttachWigglyBones(Transform original)
		{
			if (!Object.op_Implicit((Object)(object)((Component)original).GetComponent<WigglyBones>()))
			{
				((Component)original).gameObject.AddComponent<WigglyBones>();
			}
		}

		public static void UpdateIKTargets(Transform original, BoneMimicHandler bones)
		{
			SimpleIKHandler component = ((Component)original).GetComponent<SimpleIKHandler>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)bones))
			{
				component.SetLeftHand(bones.GetTargetBone("hand.L"));
				component.SetRightHand(bones.GetTargetBone("hand.R"));
				component.SetLeftFoot(bones.GetTargetBone("foot.L"));
				component.SetRightFoot(bones.GetTargetBone("foot.R"));
			}
		}
	}
	public enum FacialExpression
	{
		None,
		Default,
		Dance,
		Point,
		Paranoid,
		Crash
	}
	internal static class ProtogenExpressions
	{
		private static Material[] expressions;

		public static void BuildExpressions()
		{
			if (expressions == null)
			{
				expressions = (Material[])(object)new Material[6];
				expressions[0] = CreateUnLitExpressionMaterial(ProtogenPrefabs.face_none);
				expressions[1] = CreateLitExpressionMaterial(ProtogenPrefabs.face_default);
				expressions[2] = CreateLitExpressionMaterial(ProtogenPrefabs.face_dance);
				expressions[3] = CreateLitExpressionMaterial(ProtogenPrefabs.face_point);
				expressions[4] = CreateLitExpressionMaterial(ProtogenPrefabs.face_paranoid);
				expressions[5] = CreateLitExpressionMaterial(ProtogenPrefabs.face_crash);
			}
		}

		private static Material CreateUnLitExpressionMaterial(Texture2D texture)
		{
			//IL_0005: 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_0017: Expected O, but got Unknown
			Material val = new Material(ProtogenPrefabs.face_unlit);
			val.SetTexture("_BaseColorMap", (Texture)(object)texture);
			return val;
		}

		private static Material CreateLitExpressionMaterial(Texture2D texture)
		{
			//IL_0005: 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_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			Material val = new Material(ProtogenPrefabs.face_lit);
			val.SetTexture("_BaseColorMap", (Texture)(object)texture);
			val.SetTexture("_EmissiveColorMap", (Texture)(object)texture);
			return val;
		}

		public static Material GetFacialMaterial(FacialExpression expression)
		{
			return expressions[(int)expression];
		}
	}
	internal class ProtogenHandler : MonoBehaviour
	{
		public bool isAttached;

		private bool isInitialized;

		public bool validDeadbody;

		public PlayerControllerB player;

		public Transform body;

		public Renderer bodyRenderer;

		public Transform ears;

		public Renderer earsRenderer;

		public Transform tail;

		public Renderer tailRenderer;

		public Transform tank;

		public Renderer tankRenderer;

		public BoneMimicHandler bones;

		public BoneMimicHandler temp_bones;

		private FacialExpression expression;

		private Material[] body_materials;

		public void UpdateCosmetics()
		{
			ProtogenTextureKit textureKit = ProtogenManager.GetTextureKit(ProtogenUtil.GetPlayerID(player));
			ProtogenTextures.ApplyTextures(this, textureKit);
			ProtogenTextures.UpdateSuit(this);
			body_materials = bodyRenderer.materials;
		}

		public void UpdateExpression()
		{
			FacialExpression facialExpression = expression;
			facialExpression = ((!player.isPlayerDead) ? (player.performingEmote ? ((player.playerBodyAnimator.GetInteger("emoteNumber") <= 1) ? FacialExpression.Dance : FacialExpression.Point) : ((player.playersManager.fearLevel >= 0.9f && player.insanityLevel > player.maxInsanityLevel / 2f) ? FacialExpression.Crash : ((!(player.playersManager.fearLevel >= 0.9f) && !(player.insanityLevel > player.maxInsanityLevel / 2f)) ? ((!(player.playersManager.fearLevel >= 0.4f) && !(player.insanityLevel > 0f)) ? FacialExpression.Default : FacialExpression.Point) : FacialExpression.Paranoid))) : FacialExpression.None);
			if (facialExpression != expression)
			{
				expression = facialExpression;
				body_materials[3] = ProtogenExpressions.GetFacialMaterial(expression);
				bodyRenderer.materials = body_materials;
			}
		}

		public void Initialize()
		{
			if (!isInitialized)
			{
				body = ((Component)this).transform.Find("ProtoBody");
				bodyRenderer = (Renderer)(object)((Component)body).GetComponent<SkinnedMeshRenderer>();
				((Component)this).gameObject.AddComponent<SimpleIKHandler>();
				ears = Object.Instantiate<GameObject>(ProtogenPrefabs.prefab_ears).transform;
				earsRenderer = (Renderer)(object)((Component)ears).GetComponent<SkinnedMeshRenderer>();
				tail = Object.Instantiate<GameObject>(ProtogenPrefabs.prefab_tail).transform;
				tailRenderer = (Renderer)(object)((Component)tail).GetComponent<SkinnedMeshRenderer>();
				tank = Object.Instantiate<GameObject>(ProtogenPrefabs.prefab_tank).transform;
				tankRenderer = (Renderer)(object)((Component)tank).GetComponent<MeshRenderer>();
				((Component)ears).gameObject.AddComponent<WigglyBones>();
				((Component)tail).gameObject.AddComponent<WigglyBones>();
				body_materials = bodyRenderer.materials;
				isInitialized = true;
			}
		}

		public void AttachToPlayer(PlayerControllerB player)
		{
			this.player = player;
			bones = ProtogenBones.AttachBones(this);
			ears.SetParent(bones.GetOriginalBone("Head"), false);
			tail.SetParent(bones.GetOriginalBone("Spine"), false);
			tank.SetParent(bones.GetOriginalBone("Chest"), false);
			ProtogenBones.UpdateIKTargets(((Component)this).transform, bones);
			isAttached = true;
			IsVisible(visible: true);
			((Component)this).transform.SetParent(((Component)player).transform, false);
		}

		public void RemoveFromPlayer()
		{
			IsVisible(visible: false);
			RemoveFromDeadBody();
			Object.DestroyImmediate((Object)(object)bones);
			bones = null;
			isAttached = false;
			validDeadbody = false;
			player = null;
			((Component)this).transform.SetParent((Transform)null, false);
		}

		public void AttachToDeadBody()
		{
			if (HasDeadBody())
			{
				temp_bones = ProtogenBones.AttachTempBones(this, ((Component)player.deadBody).transform);
			}
		}

		public void RemoveFromDeadBody()
		{
			Object.DestroyImmediate((Object)(object)temp_bones);
			temp_bones = null;
			validDeadbody = false;
		}

		public bool HasDeadBody()
		{
			if (player.isPlayerDead)
			{
				if (!((Object)(object)player.deadBody == (Object)null))
				{
					return ((Component)player.deadBody).gameObject.activeSelf;
				}
				return false;
			}
			return false;
		}

		public void UpdateVisuals()
		{
			bool visible = ((isAttached && (HasDeadBody() || !player.isPlayerDead) && (HasDeadBody() || !ProtogenUtil.IsLocal(player))) ? true : false);
			if (player.isPlayerDead)
			{
				if (Object.op_Implicit((Object)(object)temp_bones) && !validDeadbody)
				{
					RemoveFromDeadBody();
				}
				else if (!Object.op_Implicit((Object)(object)temp_bones) && validDeadbody)
				{
					AttachToDeadBody();
				}
			}
			else if (Object.op_Implicit((Object)(object)temp_bones))
			{
				RemoveFromDeadBody();
			}
			IsVisible(visible);
		}

		public void IsVisible(bool visible)
		{
			bodyRenderer.enabled = visible;
			earsRenderer.enabled = visible;
			tailRenderer.enabled = visible;
			tankRenderer.enabled = visible;
			IsTracking(visible);
			FollowBody(visible);
		}

		public void IsTracking(bool tracking)
		{
			if (Object.op_Implicit((Object)(object)bones) && !Object.op_Implicit((Object)(object)temp_bones))
			{
				((Behaviour)bones).enabled = tracking;
			}
			else
			{
				((Behaviour)bones).enabled = false;
			}
			if (Object.op_Implicit((Object)(object)temp_bones))
			{
				((Behaviour)temp_bones).enabled = tracking;
			}
		}

		public void FollowBody(bool follow)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			if (follow)
			{
				if (Object.op_Implicit((Object)(object)temp_bones))
				{
					((Component)this).transform.position = ((Component)player.deadBody).transform.position;
				}
				else
				{
					((Component)this).transform.position = ((Component)player).transform.position;
				}
			}
		}

		private void Awake()
		{
		}

		private void Start()
		{
		}

		private void Update()
		{
		}

		private void LateUpdate()
		{
			UpdateVisuals();
			UpdateExpression();
		}

		private void OnEnable()
		{
		}

		private void OnDisable()
		{
			IsVisible(visible: false);
		}

		private void OnDestroy()
		{
			Plugin.Logger.LogError((object)"UH OH THAT WASN'T SUPPOSED TO HAPPEN...!");
			Plugin.Logger.LogError((object)"A PROTOGEN WAS DESTROYED! PANIC...!");
			Plugin.Logger.LogError((object)"REMOVING PROTOGEN TO PREVENT ERROR...!");
			ProtogenManager.RemoveProtogen(player);
		}
	}
	internal static class ProtogenManager
	{
		private static Dictionary<PlayerControllerB, ProtogenHandler> PlayerProtogens = new Dictionary<PlayerControllerB, ProtogenHandler>();

		private static Dictionary<ulong, ProtogenTextureKit> TextureKits = new Dictionary<ulong, ProtogenTextureKit>();

		private static Stack<ProtogenHandler> ProtogenPool = new Stack<ProtogenHandler>();

		public static bool HasProtogen(PlayerControllerB player, out ProtogenHandler protogen)
		{
			protogen = null;
			if (PlayerProtogens != null)
			{
				PlayerProtogens.TryGetValue(player, out protogen);
			}
			return (Object)(object)protogen != (Object)null;
		}

		public static ProtogenHandler GetProtogen(PlayerControllerB player)
		{
			ProtogenHandler value = null;
			if (!PlayerProtogens.TryGetValue(player, out value))
			{
				value = CreateProtogen();
				PlayerProtogens.Add(player, value);
				value.AttachToPlayer(player);
				value.UpdateCosmetics();
			}
			return value;
		}

		public static void RemoveProtogen(PlayerControllerB player)
		{
			if (PlayerProtogens.TryGetValue(player, out var value))
			{
				value.RemoveFromPlayer();
				Object.Destroy((Object)(object)value);
			}
			PlayerProtogens.Remove(player);
		}

		public static ProtogenTextureKit GetTextureKit(ulong playerID)
		{
			if (!TextureKits.TryGetValue(playerID, out var value))
			{
				value = ProtogenTextures.BuildTextures(playerID);
				TextureKits.Add(playerID, value);
			}
			return value;
		}

		private static ProtogenHandler CreateProtogen()
		{
			ProtogenHandler protogenHandler = Object.Instantiate<GameObject>(ProtogenPrefabs.prefab_body).AddComponent<ProtogenHandler>();
			protogenHandler.Initialize();
			return protogenHandler;
		}
	}
	internal static class ProtogenPrefabs
	{
		private const string ASSETBUNDLE = "companyprotogen";

		private const string VERSIONFILE = "Assets/Protogen/version.txt";

		private const string VERSION = "RELEASE_1";

		private const string BODY_SUIT = "Assets/Protogen/FurPatterns/Body/Suit.png";

		private const string BODY_PAWS_DETAIL = "Assets/Protogen/FurPatterns/Body/PawDetail.png";

		private const string BODY_PAWS = "Assets/Protogen/FurPatterns/Body/Paws.png";

		private const string BODY_REGAL = "Assets/Protogen/FurPatterns/Body/Regal.png";

		private const string BODY_SHADE = "Assets/Protogen/FurPatterns/Body/Shade.png";

		private const string BODY_SPOTTY = "Assets/Protogen/FurPatterns/Body/Spotty.png";

		private const string BODY_STRIPED = "Assets/Protogen/FurPatterns/Body/Striped.png";

		private const string EARS_INNER = "Assets/Protogen/FurPatterns/Ears/Inner.png";

		private const string EARS_STRIPED = "Assets/Protogen/FurPatterns/Ears/Striped.png";

		private const string EARS_TIPPED = "Assets/Protogen/FurPatterns/Ears/Tipped.png";

		private const string TAIL_REGAL = "Assets/Protogen/FurPatterns/Tail/Regal.png";

		private const string TAIL_SHAPES = "Assets/Protogen/FurPatterns/Tail/Shapes.png";

		private const string TAIL_SPOTTY = "Assets/Protogen/FurPatterns/Tail/Spotty.png";

		private const string TAIL_STRIPED = "Assets/Protogen/FurPatterns/Tail/Striped.png";

		private const string PREFAB_PROTO = "Assets/Protogen/Prefabs/ProtoPrefab.prefab";

		private const string PREFAB_EARS = "Assets/Protogen/Prefabs/ProtoEarsPrefab.prefab";

		private const string PREFAB_TAIL = "Assets/Protogen/Prefabs/ProtoTailLongPrefab.prefab";

		private const string PREFAB_TANK = "Assets/Protogen/Prefabs/ProtoTankPrefab.prefab";

		private const string TEXTURES_ICON = "Assets/Protogen/Textures/defaulticon.png";

		private const string TEXTURES_BODY = "Assets/Protogen/Textures/BodyTex.png";

		private const string TEXTURES_EARS = "Assets/Protogen/Textures/EarsTex.png";

		private const string TEXTURES_TAIL = "Assets/Protogen/Textures/TailTex.png";

		private const string FACES_MAT_UNLIT = "Assets/Protogen/Faces/ProtoUnLitScreenMat.mat";

		private const string FACES_MAT_LIT = "Assets/Protogen/Faces/ProtoScreenMat.mat";

		private const string FACES_NONE = "Assets/Protogen/Faces/ScreenPlaceholder.png";

		private const string FACES_DEFAULT = "Assets/Protogen/Faces/DefaultFace.png";

		private const string FACES_DANCE = "Assets/Protogen/Faces/DanceFace.png";

		private const string FACES_POINT = "Assets/Protogen/Faces/PointFace.png";

		private const string FACES_PARANOID = "Assets/Protogen/Faces/ParanoidFace.png";

		private const string FACES_CRASH = "Assets/Protogen/Faces/CrashFace.png";

		public static AssetBundle assetbundle;

		public static GameObject prefab_body;

		public static GameObject prefab_ears;

		public static GameObject prefab_tail;

		public static GameObject prefab_tank;

		public static Texture2D fur_body_suit;

		public static Texture2D fur_body_paws_detail;

		public static Texture2D fur_body_paws;

		public static Texture2D fur_body_regal;

		public static Texture2D fur_body_shade;

		public static Texture2D fur_body_spotty;

		public static Texture2D fur_body_striped;

		public static Texture2D fur_ears_inner;

		public static Texture2D fur_ears_striped;

		public static Texture2D fur_ears_tipped;

		public static Texture2D fur_tail_regal;

		public static Texture2D fur_tail_shapes;

		public static Texture2D fur_tail_spotty;

		public static Texture2D fur_tail_striped;

		public static Texture2D icon_default;

		public static Texture2D body_default;

		public static Texture2D ears_default;

		public static Texture2D tail_default;

		public static Material face_unlit;

		public static Material face_lit;

		public static Texture2D face_none;

		public static Texture2D face_default;

		public static Texture2D face_dance;

		public static Texture2D face_point;

		public static Texture2D face_paranoid;

		public static Texture2D face_crash;

		public static bool Init()
		{
			assetbundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "companyprotogen"));
			if (assetbundle.LoadAsset<TextAsset>("Assets/Protogen/version.txt").text != "RELEASE_1")
			{
				Plugin.Logger.LogError((object)"Assetbundle is outdated/incompatible!");
				return false;
			}
			prefab_body = assetbundle.LoadAsset<GameObject>("Assets/Protogen/Prefabs/ProtoPrefab.prefab");
			prefab_ears = assetbundle.LoadAsset<GameObject>("Assets/Protogen/Prefabs/ProtoEarsPrefab.prefab");
			prefab_tail = assetbundle.LoadAsset<GameObject>("Assets/Protogen/Prefabs/ProtoTailLongPrefab.prefab");
			prefab_tank = assetbundle.LoadAsset<GameObject>("Assets/Protogen/Prefabs/ProtoTankPrefab.prefab");
			fur_body_suit = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/Suit.png");
			fur_body_paws_detail = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/PawDetail.png");
			fur_body_paws = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/Paws.png");
			fur_body_regal = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/Regal.png");
			fur_body_shade = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/Shade.png");
			fur_body_spotty = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/Spotty.png");
			fur_body_striped = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Body/Striped.png");
			fur_ears_inner = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Ears/Inner.png");
			fur_ears_striped = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Ears/Striped.png");
			fur_ears_tipped = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Ears/Tipped.png");
			fur_tail_regal = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Tail/Regal.png");
			fur_tail_shapes = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Tail/Shapes.png");
			fur_tail_spotty = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Tail/Spotty.png");
			fur_tail_striped = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/FurPatterns/Tail/Striped.png");
			icon_default = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Textures/defaulticon.png");
			body_default = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Textures/BodyTex.png");
			ears_default = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Textures/EarsTex.png");
			tail_default = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Textures/TailTex.png");
			face_unlit = assetbundle.LoadAsset<Material>("Assets/Protogen/Faces/ProtoUnLitScreenMat.mat");
			face_lit = assetbundle.LoadAsset<Material>("Assets/Protogen/Faces/ProtoScreenMat.mat");
			face_none = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Faces/ScreenPlaceholder.png");
			face_default = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Faces/DefaultFace.png");
			face_dance = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Faces/DanceFace.png");
			face_point = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Faces/PointFace.png");
			face_paranoid = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Faces/ParanoidFace.png");
			face_crash = assetbundle.LoadAsset<Texture2D>("Assets/Protogen/Faces/CrashFace.png");
			return true;
		}
	}
	internal class ProtogenTextureKit
	{
		public bool isDark;

		public Color mainColor;

		public Color secondaryColor;

		public Texture2D icon;

		public Texture2D body;

		public Texture2D ears;

		public Texture2D tail;

		public MaterialPropertyBlock iconProp;

		public MaterialPropertyBlock bodyProp;

		public MaterialPropertyBlock earsProp;

		public MaterialPropertyBlock tailProp;
	}
	internal class ProtogenTextures
	{
		public static void ApplyTextures(ProtogenHandler protogen, ProtogenTextureKit texKit)
		{
			protogen.bodyRenderer.SetPropertyBlock(texKit.iconProp, 2);
			protogen.bodyRenderer.SetPropertyBlock(texKit.bodyProp, 0);
			protogen.earsRenderer.SetPropertyBlock(texKit.earsProp);
			protogen.tailRenderer.SetPropertyBlock(texKit.tailProp);
		}

		public static void UpdateSuit(ProtogenHandler protogen)
		{
			MaterialPropertyBlock val = CreateProperty(StartOfRound.Instance.unlockablesList.unlockables[protogen.player.currentSuitID].suitMaterial.mainTexture);
			protogen.bodyRenderer.SetPropertyBlock(val, 1);
			protogen.tankRenderer.SetPropertyBlock(val);
		}

		public static ProtogenTextureKit BuildTextures(ulong playerID)
		{
			ProtogenTextureKit kit = new ProtogenTextureKit();
			kit.icon = ProtogenUtil.GetPlayerIcon(playerID);
			TextureTools.DominantColors(kit.icon, out kit.isDark, out kit.mainColor, out kit.secondaryColor);
			RandomizeTextures(playerID, ref kit);
			kit.iconProp = CreateEmissiveProperty((Texture)(object)kit.icon);
			kit.bodyProp = CreateProperty((Texture)(object)kit.body);
			kit.tailProp = CreateProperty((Texture)(object)kit.tail);
			kit.earsProp = CreateProperty((Texture)(object)kit.ears);
			return kit;
		}

		private static void RandomizeTextures(ulong seed, ref ProtogenTextureKit kit)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			Color[] array = RandomizeBody(seed, kit);
			Color[] array2 = RandomizeEars(seed, kit);
			Color[] array3 = RandomizeTail(seed, kit);
			kit.body = new Texture2D(1024, 1024, (TextureFormat)3, true);
			kit.ears = new Texture2D(512, 512, (TextureFormat)3, true);
			kit.tail = new Texture2D(512, 512, (TextureFormat)3, true);
			kit.body.SetPixels(0, 0, 1024, 1024, array);
			kit.ears.SetPixels(0, 0, 512, 512, array2);
			kit.tail.SetPixels(0, 0, 512, 512, array3);
			kit.body.Apply();
			kit.ears.Apply();
			kit.tail.Apply();
		}

		public static Color[] RandomizeBody(ulong seed, ProtogenTextureKit kit)
		{
			//IL_0007: 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_009b: 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_00dc: 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_00fa: 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_00ff: 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_0104: 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_0113: 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_0122: 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_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: 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_016d: 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_017f: 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_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: 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_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: 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_013c: 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_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			int magic = 45634;
			Color mainColor = kit.mainColor;
			List<int> list = DeckShuffle(seed, 4);
			int num = (int)(GenerateRandomNumber(mainColor, magic, seed) % list.Count());
			Color[] array = null;
			switch ((num < list.Count) ? list[num] : (-1))
			{
			case 0:
				array = ProtogenPrefabs.fur_body_striped.GetPixels();
				break;
			case 1:
				array = ProtogenPrefabs.fur_body_spotty.GetPixels();
				break;
			case 2:
				array = ProtogenPrefabs.fur_body_shade.GetPixels();
				break;
			case 3:
				array = ProtogenPrefabs.fur_body_regal.GetPixels();
				break;
			}
			Color[] array2 = TextureTools.FlatColor(1024, 1024, kit.isDark ? kit.mainColor : kit.secondaryColor);
			Color[] pixels = ProtogenPrefabs.fur_body_suit.GetPixels();
			Color[] pixels2 = ProtogenPrefabs.fur_body_paws.GetPixels();
			Color[] pixels3 = ProtogenPrefabs.fur_body_paws_detail.GetPixels();
			Color color = (kit.isDark ? kit.secondaryColor : kit.mainColor);
			Color val = (kit.isDark ? Color.white : Color.black);
			Color val2 = Color.Lerp(val, kit.mainColor, 0.5f);
			val2 = Color.Lerp(val2, kit.secondaryColor, 0.25f);
			for (int i = 0; i < array2.Length; i++)
			{
				if (array != null)
				{
					array2[i] = PixelKit.Lerp_Mask(array2[i], array[i], color);
				}
				array2[i] = PixelKit.Lerp_Mask(array2[i], pixels2[i], val2);
				array2[i] = PixelKit.Lerp_Mask(array2[i], pixels3[i], val);
				array2[i] = PixelKit.Lerp_Alpha(array2[i], pixels[i]);
			}
			return array2;
		}

		public static Color[] RandomizeEars(ulong seed, ProtogenTextureKit kit)
		{
			//IL_0007: 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_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)
			//IL_009c: 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_00dc: 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_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: 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_00ca: 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)
			int magic = 185139221;
			Color mainColor = kit.mainColor;
			List<int> list = DeckShuffle(seed, 2);
			int num = (int)(GenerateRandomNumber(mainColor, magic, seed) % list.Count());
			Color[] array = null;
			switch ((num < list.Count) ? list[num] : (-1))
			{
			case 0:
				array = ProtogenPrefabs.fur_ears_striped.GetPixels();
				break;
			case 1:
				array = ProtogenPrefabs.fur_ears_tipped.GetPixels();
				break;
			}
			Color[] array2 = TextureTools.FlatColor(512, 512, kit.isDark ? kit.mainColor : kit.secondaryColor);
			Color[] pixels = ProtogenPrefabs.fur_ears_inner.GetPixels();
			Color color = (kit.isDark ? kit.secondaryColor : kit.mainColor);
			for (int i = 0; i < array2.Length; i++)
			{
				if (array != null)
				{
					array2[i] = PixelKit.Lerp_Mask(array2[i], array[i], color);
				}
				array2[i] = PixelKit.Lerp_Mask(array2[i], pixels[i], color);
			}
			return array2;
		}

		public static Color[] RandomizeTail(ulong seed, ProtogenTextureKit kit)
		{
			//IL_0007: 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_009b: 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_00b8: 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_00d7: 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)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			int magic = 9472735;
			Color mainColor = kit.mainColor;
			List<int> list = DeckShuffle(seed, 4);
			int num = (int)(GenerateRandomNumber(mainColor, magic, seed) % list.Count());
			Color[] array = null;
			switch ((num < list.Count) ? list[num] : (-1))
			{
			case 0:
				array = ProtogenPrefabs.fur_tail_striped.GetPixels();
				break;
			case 1:
				array = ProtogenPrefabs.fur_tail_spotty.GetPixels();
				break;
			case 2:
				array = ProtogenPrefabs.fur_tail_shapes.GetPixels();
				break;
			case 3:
				array = ProtogenPrefabs.fur_tail_regal.GetPixels();
				break;
			}
			Color[] array2 = TextureTools.FlatColor(512, 512, kit.isDark ? kit.mainColor : kit.secondaryColor);
			Color color = (kit.isDark ? kit.secondaryColor : kit.mainColor);
			for (int i = 0; i < array2.Length; i++)
			{
				if (array != null)
				{
					array2[i] = PixelKit.Lerp_Mask(array2[i], array[i], color);
				}
			}
			return array2;
		}

		public static MaterialPropertyBlock CreateProperty(Texture texture)
		{
			//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_0012: Expected O, but got Unknown
			MaterialPropertyBlock val = new MaterialPropertyBlock();
			val.SetTexture("_BaseColorMap", texture);
			return val;
		}

		public static MaterialPropertyBlock CreateEmissiveProperty(Texture texture)
		{
			//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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			MaterialPropertyBlock val = new MaterialPropertyBlock();
			val.SetTexture("_BaseColorMap", texture);
			val.SetTexture("_EmissiveColorMap", texture);
			return val;
		}

		public static List<int> DeckShuffle(ulong seed, int size)
		{
			List<int> list = new List<int>();
			for (int i = 0; i < size; i++)
			{
				if (seed << list.Count % 2 == 0L)
				{
					list.Insert(0, i);
				}
				else
				{
					list.Add(i);
				}
			}
			return list;
		}

		public static uint GenerateRandomNumber(Color salt, int magic, ulong seed)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			Random random = new Random((int)((ulong)((salt.r + salt.g + salt.b) * (float)magic) ^ seed));
			byte[] array = new byte[4];
			random.NextBytes(array);
			return BitConverter.ToUInt32(array, 0);
		}
	}
	internal class ProtogenUtil
	{
		public static bool IsLocal(PlayerControllerB player)
		{
			return (Object)(object)player == (Object)(object)GameNetworkManager.Instance.localPlayerController;
		}

		public static ulong GetPlayerID(PlayerControllerB player)
		{
			if (GameNetworkManager.Instance.disableSteam)
			{
				return player.actualClientId;
			}
			return player.playerSteamId;
		}

		public static Texture2D GetPlayerIcon(ulong steamID)
		{
			Texture2D val = null;
			if (!GameNetworkManager.Instance.disableSteam)
			{
				Image? avatarSynchronously = GetAvatarSynchronously(steamID);
				if (avatarSynchronously.HasValue)
				{
					val = HUDManager.GetTextureFromImage(avatarSynchronously);
				}
			}
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = Object.Instantiate<Texture2D>(ProtogenPrefabs.icon_default);
			}
			return val;
		}

		private static Image? GetAvatarSynchronously(ulong steamID)
		{
			Task<Image?> task = Task.Run(async delegate
			{
				try
				{
					return await SteamFriends.GetLargeAvatarAsync(SteamId.op_Implicit(steamID));
				}
				catch (Exception ex)
				{
					Debug.Log((object)ex);
					return null;
				}
			});
			task.Wait();
			return task.Result;
		}
	}
}
namespace CompanyIssuedProtogen.Patches
{
	[HarmonyPatch]
	internal static class DeadBodyPatch
	{
		public static void ApplyValidBodyMesh(ref DeadBodyInfo __instance)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (ProtogenManager.HasProtogen(__instance.playerScript, out var protogen))
			{
				SkinnedMeshRenderer componentInChildren = ((Component)__instance).GetComponentInChildren<SkinnedMeshRenderer>();
				if ((int)__instance.causeOfDeath != 0)
				{
					protogen.validDeadbody = true;
					((Renderer)componentInChildren).enabled = false;
				}
				else
				{
					protogen.validDeadbody = false;
					((Renderer)componentInChildren).enabled = true;
				}
			}
		}

		[HarmonyPatch(typeof(DeadBodyInfo), "Start")]
		[HarmonyPostfix]
		private static void DeadBodyPatch_Start_Postfix_Patch(ref DeadBodyInfo __instance)
		{
			ApplyValidBodyMesh(ref __instance);
		}

		[HarmonyPatch(typeof(DeadBodyInfo), "ChangeMesh")]
		[HarmonyPostfix]
		private static void DeadBodyPatch_ChangeMesh_Postfix_Patch(ref DeadBodyInfo __instance)
		{
			ApplyValidBodyMesh(ref __instance);
		}

		[HarmonyPatch(typeof(DeadBodyInfo), "OnDestroy")]
		[HarmonyPostfix]
		private static void DeadBodyPatch_OnDestroy_Postfix_Patch(ref DeadBodyInfo __instance)
		{
			ApplyValidBodyMesh(ref __instance);
			PlayerPatch.PatchAllPlayer();
		}
	}
	[HarmonyPatch]
	internal static class HUDManagerPatch
	{
		[HarmonyPatch(typeof(HUDManager), "SetLevelOfPlayer")]
		[HarmonyPostfix]
		public static void HUDManagerPatch_SetLevelOfPlayer_Postfix_Patch(ref HUDManager __instance, PlayerControllerB playerScript, int playerLevelIndex, bool hasBeta)
		{
		}
	}
	[HarmonyPatch]
	internal static class PlayerPatch
	{
		public static void AutoPatchVisuals(PlayerControllerB player)
		{
			LODGroup componentInChildren = ((Component)player).GetComponentInChildren<LODGroup>();
			((Renderer)((Component)((Component)componentInChildren).transform.Find("LOD1")).GetComponent<SkinnedMeshRenderer>()).enabled = false;
			((Renderer)((Component)((Component)componentInChildren).transform.Find("LOD2")).GetComponent<SkinnedMeshRenderer>()).enabled = false;
			((Renderer)((Component)((Component)componentInChildren).transform.Find("LOD3")).GetComponent<SkinnedMeshRenderer>()).enabled = false;
			componentInChildren.enabled = false;
			ProtogenManager.GetProtogen(player);
		}

		public static void PatchAllPlayer()
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			for (int i = 0; i < allPlayerScripts.Length; i++)
			{
				AutoPatchVisuals(allPlayerScripts[i]);
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Start")]
		[HarmonyPostfix]
		private static void PlayerControllerB_Start_Postfix_Patch(PlayerControllerB __instance)
		{
			PatchAllPlayer();
		}

		[HarmonyPatch(typeof(PlayerControllerB), "DisablePlayerModel")]
		[HarmonyPostfix]
		public static void PlayerControllerB_DisablePlayerModel_Postfix_Patch(PlayerControllerB __instance)
		{
			PatchAllPlayer();
		}

		[HarmonyPatch(typeof(PlayerControllerB), "SpawnPlayerAnimation")]
		[HarmonyPostfix]
		public static void PlayerControllerB_SpawnPlayerAnimation_Postfix_Patch(PlayerControllerB __instance)
		{
			PatchAllPlayer();
		}

		[HarmonyPatch(typeof(PlayerControllerB), "SpawnDeadBody")]
		[HarmonyPrefix]
		public static void PlayerControllerB_SpawnDeadBody_Prefix_Patch(PlayerControllerB __instance)
		{
			PatchAllPlayer();
			if (ProtogenManager.HasProtogen(__instance, out var protogen))
			{
				protogen.validDeadbody = true;
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "OnDestroy")]
		[HarmonyPostfix]
		private static void PlayerControllerB_OnDestroy_Postfix_Patch(ref PlayerControllerB __instance)
		{
			ProtogenManager.RemoveProtogen(__instance);
		}
	}
	[HarmonyPatch]
	internal static class QuickMenuManagerPatch
	{
		[HarmonyPatch(typeof(QuickMenuManager), "AddUserToPlayerList")]
		[HarmonyPostfix]
		public static void AddUserToPlayerList_Postfix_Patch(QuickMenuManager __instance)
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			for (int i = 0; i < allPlayerScripts.Length; i++)
			{
				if (ProtogenManager.HasProtogen(allPlayerScripts[i], out var protogen))
				{
					protogen.UpdateCosmetics();
				}
			}
		}

		[HarmonyPatch(typeof(QuickMenuManager), "RemoveUserFromPlayerList")]
		[HarmonyPostfix]
		public static void RemoveUserFromPlayerList_Postfix_Patch(QuickMenuManager __instance)
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			for (int i = 0; i < allPlayerScripts.Length; i++)
			{
				if (ProtogenManager.HasProtogen(allPlayerScripts[i], out var protogen))
				{
					protogen.UpdateCosmetics();
				}
			}
		}
	}
	[HarmonyPatch]
	internal class UnlockableSuitPatch
	{
		[HarmonyPatch(typeof(UnlockableSuit), "SwitchSuitForPlayer")]
		[HarmonyPostfix]
		public static void UnlockableSuitPatch_SwitchSuitForPlayer_Postfix_Patch(UnlockableSuit __instance, PlayerControllerB player, int suitID, bool playAudio)
		{
			if (ProtogenManager.HasProtogen(player, out var protogen))
			{
				protogen.UpdateCosmetics();
			}
		}
	}
}